{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "name": "基于TFF的FedAvg算法的实现.ipynb", "provenance": [], "collapsed_sections": [], "authorship_tag": "ABX9TyOnxiKBGZiv8ZclkgA0zwGT", "include_colab_link": true }, "kernelspec": { "name": "python3", "display_name": "Python 3" } }, "cells": [ { "cell_type": "markdown", "metadata": { "id": "view-in-github", "colab_type": "text" }, "source": [ "\"Open" ] }, { "cell_type": "markdown", "metadata": { "id": "2nAkjeXzR-Xt" }, "source": [ "本实验根据[TensorFlow Federated(TFF)官方教程](https://www.tensorflow.org/federated/tutorials/custom_federated_algorithms_2)以及提出了FederatedAveragin(FedAvg)算法的论文《Communication-Efficient Learning of Deep Networks from Decentralized Data》模拟实现了FedAvg算法。" ] }, { "cell_type": "markdown", "metadata": { "id": "jQGR_xwoGs75" }, "source": [ "## 配置环境" ] }, { "cell_type": "code", "metadata": { "id": "ENJDKJZY_tP1", "outputId": "f3be7b7e-9206-4142-a22a-107aee7b211e", "colab": { "base_uri": "https://localhost:8080/", "height": 105 } }, "source": [ "!pip install --quiet --upgrade tensorflow_federated\n", "%load_ext tensorboard" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "\u001b[K |████████████████████████████████| 460kB 3.5MB/s \n", "\u001b[K |████████████████████████████████| 174kB 11.0MB/s \n", "\u001b[K |████████████████████████████████| 296kB 16.3MB/s \n", "\u001b[K |████████████████████████████████| 92kB 8.4MB/s \n", "\u001b[K |████████████████████████████████| 1.0MB 17.8MB/s \n", "\u001b[?25h" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "9nF1JbrsGnlI" }, "source": [ "import collections\n", "\n", "import numpy as np\n", "import tensorflow as tf\n", "import tensorflow_federated as tff\n", "\n", "tf.compat.v1.enable_v2_behavior()\n", "\n", "# TODO(b/148678573,b/148685415): must use the ReferenceExecutor because it\n", "# supports unbounded references and tff.sequence_* intrinsics.\n", "tff.framework.set_default_executor(tff.test.ReferenceExecutor())" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "lkzfRbGdGp8d", "outputId": "91ba0057-8072-480b-d708-26a7eec406c9", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "@tff.federated_computation\n", "def hello_world():\n", " return 'Hello, World!'\n", "\n", "hello_world()" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "'Hello, World!'" ] }, "metadata": { "tags": [] }, "execution_count": 3 } ] }, { "cell_type": "markdown", "metadata": { "id": "PZQVhV4RGxUz" }, "source": [ "## 准备联邦数据集" ] }, { "cell_type": "markdown", "metadata": { "id": "eD-BVAgFWbNS" }, "source": [ "说明:\n", "`@tff.tf_computation(MODEL_TYPE, BATCH_TYPE)`标注的代码包含了服务器端和客户端的操作,是一种抽象。在实际开发中应自己实现\n", "\n", "\n", "![image.png](data:image/png;base64,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futpmjrq7xygwMK5E0On/ItNQbHk3MttFcoOKM9EQAREQAQecoEHJ6DVuKC0qOIucfpkCBdupJBXpKty3FVByu+cPXWOqNQ7FN29JISugNSocM5ExJBWci9PXU4KKTn6pS5qfFK18gV1WjQXTh7ll5BrpBjvN1pE1s1wjh09Rlh0OgUVLuzeTqUg5Rphp88RlVJQ0cawCzVp0RGcOn6C05fiUN11b9Lqj6KjIF/Nn7o/0eYlc/18CMFnr5JQja1WFc/lM8GEnI8iqZrtqj/uXZ/qsomNTUV9131G79oKtCrir5wlOOQ8UUk5aO6XClDhROUNERABERCBB13gHxzQHvSikfMXAREQAREQARF4WAUkoD2sJS/XLQIiIAIiIAIicN8KSEC7b4tGTkwEREAEREAEROBhFZCA9rCWvFy3CIiACIiACIjAfSsgAe2+LRo5MREQAREQAREQgYdVQALaw1ryct0iIAIiIAIiIAL3rYAEtPu2aOTEREAEREAEREAEHlYBCWgPa8nLdYuACIiACIiACNy3AhLQ7tuikRMTAREQAREQARF4WAX+toDm7+/P3LlzmT17tvyJgdQBqQNSB6QOSB2QOiB1oKQO7Nixg4yMjBplzb8toG3duhU/Pz+WLVsmf2IgdUDqgNQBqQNSB6QOSB0oqQOHDh0iOzv7/yeg1eiosrEIiIAIiIAIiIAIiECVAn9bC1qVR5APREAEREAEREAEREAEaiQgAa1GXLKxCIiACIiACIiACNS+gAS02jeWI4iACIiACIiACIhAjQQkoNWISzYWAREQAREQAREQgdoXkIBW+8ZyBBEQAREQAREQARGokYAEtBpxycYiIAIiIAIiIAIiUPsCEtBq31iOIAIiIAIiIAIiIAI1EpCAViMu2VgEREAEREAEREAEal9AAlrtG8sRREAEREAEREAERKBGAhLQasQlG4uACIiACIiACIhA7QtIQKt9YzmCCIiACIiACIiACNRIQAJajbhkYxEQAREQAREQARGofYH/A5q5o8jUVRVEAAAAAElFTkSuQmCC)" ] }, { "cell_type": "code", "metadata": { "id": "OT8CPaPYG9gd", "outputId": "b761a310-110a-4f54-cbb7-6205f3a81572", "colab": { "base_uri": "https://localhost:8080/", "height": 70 } }, "source": [ "#下载mnist数据集\n", "mnist_train, mnist_test = tf.keras.datasets.mnist.load_data()\n", "[(x.dtype, x.shape) for x in mnist_train]" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz\n", "11493376/11490434 [==============================] - 0s 0us/step\n" ], "name": "stdout" }, { "output_type": "execute_result", "data": { "text/plain": [ "[(dtype('uint8'), (60000, 28, 28)), (dtype('uint8'), (60000,))]" ] }, "metadata": { "tags": [] }, "execution_count": 4 } ] }, { "cell_type": "markdown", "metadata": { "id": "UzBs5ANHwwU-" }, "source": [ "对于每个用户的样本,根据BATCH_SIZE将其分割为大小固定的批次。BATCH_SIZE*批数=样本总数。\n", "\n", "- BATCH_SIZE=1即在线学习\n", "- BATCH_SIZE很小,那么每批训练得到的梯度各不相同,各自为政,导致最终很难收敛\n", "- BATCH_SIZE适中,即批梯度下降法(Mini-batches Learning)。因为如果数据集足够充分,那么用一半(甚至少得多)的数据训练算出来的梯度与用全部数据训练出来的梯度是几乎一样的。本实验BATCH_SIZE=200\n", "- BATCH_SIZE很大,虽然充分利用了内存,但每次训练对参数的修正很慢,方向几乎固定\n", "- BATCH_SIZE最大不能大于内存\n", "\n", "另外,**为了模拟non-IID,用minst数据集中每个数字对应的图片(如标签为5的所有手写图片)模拟了一个设备中的本地数据**。" ] }, { "cell_type": "code", "metadata": { "id": "EB5RKOx9H0Ui" }, "source": [ "NUM_EXAMPLES_PER_USER = 1000\n", "BATCH_SIZE = 200\n", "#BATCHES不为整数时如何处理?\n", "BATCHES = int(NUM_EXAMPLES_PER_USER/BATCH_SIZE)\n", "#NUM_EXAMPLES_PER_USER/BATCH_SIZE=5,即每个设备有5批数据\n", "#该函数实现了选出source中标签=digit的全部图片并处理\n", "#【FedAVG@C】split 设备总样本 into batches of size BATCH_SIZE\n", "def get_data_for_digit(source, digit):\n", " output_sequence = []\n", " #记录标签列表中,等于指定digit的元素对应的序号\n", " #例如标签列表是[4,5,6,5,1],指定digit=5,那么all_sample=[1,3]\n", " all_samples = [i for i, d in enumerate(source[1]) if d == digit]\n", " #以下for循环实现了对all_sample数组中所有指针指向的图片的处理\n", " for i in range(0, min(len(all_samples), NUM_EXAMPLES_PER_USER), BATCH_SIZE):\n", " #每次按顺序选取BATCH_SIZE张\n", " batch_samples = all_samples[i:i + BATCH_SIZE]\n", " output_sequence.append({\n", " 'x':\n", " #归一化\n", " np.array([source[0][i].flatten() / 255.0 for i in batch_samples],\n", " dtype=np.float32),\n", " 'y':\n", " np.array([source[1][i] for i in batch_samples], dtype=np.int32)\n", " })\n", " #output_sequence是用户数据的列表,而用户数据又是批数据的列表\n", " return output_sequence\n", "\n", "#根据手写数字1~10的标签来分割为10个数据集,代表了10个设备中的non-IID的数据\n", "federated_train_data = [get_data_for_digit(mnist_train, d) for d in range(10)]\n", "federated_test_data = [get_data_for_digit(mnist_test, d) for d in range(10)]" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "dHnrBvtiTf5w" }, "source": [ "\n", "为了验证上述预处理是否正确,可以查看标签为5(也就是第5个设备)的数据集中的倒数第一批数据,它的x是像素图片,y是标签" ] }, { "cell_type": "code", "metadata": { "id": "KPjeqek3O3Bi", "outputId": "97de94f0-7e55-43ca-807e-1e63f90fe7b2", "colab": { "base_uri": "https://localhost:8080/", "height": 370 } }, "source": [ "print(federated_train_data[5][-1]['y'])\n", "\n", "from matplotlib import pyplot as plt\n", "plt.imshow(federated_train_data[5][-1]['x'][-1].reshape(28, 28), cmap='gray')\n", "plt.grid(False)\n", "plt.show()" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "[5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5\n", " 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5\n", " 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5\n", " 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5\n", " 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5\n", " 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5]\n" ], "name": "stdout" }, { "output_type": "display_data", "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "tags": [], "needs_background": "light" } } ] }, { "cell_type": "markdown", "metadata": { "id": "ePf4099UT8kL" }, "source": [ "## 定义一个损失函数" ] }, { "cell_type": "markdown", "metadata": { "id": "5yQnyByXUoDC" }, "source": [ "TFF是强类型的,参数必须定义好类型。由于最后一批数据的大小不一定是BATCH_SIZE,我们将每批的容量设置为`None`" ] }, { "cell_type": "code", "metadata": { "id": "gwV0SNZoTsIW", "outputId": "96e3d8d5-b68b-4e18-9fa4-c1079349316e", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "#定义一个抽象的TFF类型规范\n", "BATCH_SPEC = collections.OrderedDict(\n", " x=tf.TensorSpec(shape=[None, 784], dtype=tf.float32),\n", " y=tf.TensorSpec(shape=[None], dtype=tf.int32))\n", "BATCH_TYPE = tff.to_type(BATCH_SPEC)\n", "\n", "str(BATCH_TYPE)\n", "\n", "MODEL_SPEC = collections.OrderedDict(\n", " weights=tf.TensorSpec(shape=[784, 10], dtype=tf.float32),\n", " bias=tf.TensorSpec(shape=[10], dtype=tf.float32))\n", "MODEL_TYPE = tff.to_type(MODEL_SPEC)\n", "\n", "str(MODEL_TYPE)" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "''" ] }, "metadata": { "tags": [] }, "execution_count": 8 } ] }, { "cell_type": "markdown", "metadata": { "id": "yne49oRsbANS" }, "source": [ "下面我们开始定义前向传播函数" ] }, { "cell_type": "code", "metadata": { "id": "UuCNd5UzV-rX" }, "source": [ "# NOTE: `forward_pass` is defined separately from `batch_loss` so that it can \n", "# be later called from within another tf.function. Necessary because a\n", "# @tf.function decorated method cannot invoke a @tff.tf_computation.\n", "\n", "@tf.function\n", "def forward_pass(model, batch):\n", " #定义一个两层的神经网络(2NN)\n", " predicted_y = tf.nn.softmax(\n", " tf.matmul(batch['x'], model['weights']) + model['bias'])\n", " predictions = tf.cast(tf.argmax(predicted_y, 1), tf.int32)\n", " #print(predictions)=[0,...,0]\n", " flat_labels = tf.reshape(batch['y'], [-1])\n", " #print(batch['y'])=[5,...,5]\n", " loss = -tf.reduce_mean(\n", " tf.reduce_sum(\n", " tf.one_hot(batch['y'], 10) * tf.math.log(predicted_y), axis=[1]))\n", " accuracy = tf.reduce_mean(\n", " tf.cast(tf.equal(predictions, batch['y']), tf.float32))\n", " #print(accuracy)\n", " return loss, accuracy\n", " '''\n", " return -tf.reduce_mean(\n", " tf.reduce_sum(\n", " tf.one_hot(batch['y'], 10) * tf.math.log(predicted_y), axis=[1]))\n", " '''\n", "@tff.tf_computation(MODEL_TYPE, BATCH_TYPE)\n", "def batch_loss(model, batch):\n", " return forward_pass(model, batch)\n", "\n" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "n8mx91HnWUB-" }, "source": [ "现在将权重w和偏置值b都设置为0,简单测试下上述代码是否正确,同时初始化initial_model作为后续联邦训练的输入。" ] }, { "cell_type": "code", "metadata": { "id": "ytRgGuR20ZGi", "outputId": "340d8140-c236-4350-940a-692a7a6483e0", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "#【FedAVG@S】initialize w\n", "initial_model = collections.OrderedDict(\n", " weights=np.zeros([784, 10], dtype=np.float32),\n", " bias=np.zeros([10], dtype=np.float32))\n", "#选取标签为5的所有图片作为样例\n", "sample_batch = federated_train_data[5][-1]\n", "batch_loss(initial_model, sample_batch)" ], "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "(2.3025854, 0.0)" ] }, "metadata": { "tags": [] }, "execution_count": 10 } ] }, { "cell_type": "markdown", "metadata": { "id": "BCqsLNis1Rc1" }, "source": [ "分析:batch_loss函数也就是forward_pass函数接收了两个参数:模型和样本,模型的w和b在函数内被接收,再加上样本的x,计算出y和损失函数的值`2.3025854`。\n", "\n", "损失函数是模型(w和b)的函数,为了求w和b为何值时损失函数最小:$$w^*=argmin L(w,b)$$可以使用梯度下降算法。" ] }, { "cell_type": "markdown", "metadata": { "id": "uP5UDNox2XXY" }, "source": [ "## 在单批数据上使用梯度下降" ] }, { "cell_type": "code", "metadata": { "id": "MPgwqyuX2oqH", "outputId": "584dfb49-ae33-4a49-8661-3b85c0b24c50", "colab": { "base_uri": "https://localhost:8080/", "height": 90 } }, "source": [ "@tff.tf_computation(MODEL_TYPE, BATCH_TYPE, tf.float32)\n", "def batch_train(initial_model, batch, learning_rate):\n", " # Define a group of model variables and set them to `initial_model`. Must\n", " # be defined outside the @tf.function.\n", " model_vars = collections.OrderedDict([\n", " (name, tf.Variable(name=name, initial_value=value))\n", " for name, value in initial_model.items()\n", " ])\n", " optimizer = tf.keras.optimizers.SGD(learning_rate)\n", "\n", " @tf.function\n", " def _train_on_batch(model_vars, batch):\n", " # Perform one step of gradient descent using loss from `batch_loss`.\n", " with tf.GradientTape() as tape:\n", " loss = forward_pass(model_vars, batch)\n", " #求出梯度\n", " grads = tape.gradient(loss, model_vars)\n", " #反向传播: model_vars=model_vars-learning_rate*grads\n", " optimizer.apply_gradients(\n", " zip(tf.nest.flatten(grads), tf.nest.flatten(model_vars)))\n", " #返回新的梯度到batch_train,再到batch_fn,再到local_train,\n", " #再到locally_trained_model,再到local_eval中结合数据来计算损失函数\n", " return model_vars\n", "\n", " return _train_on_batch(model_vars, batch)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/tensorflow/python/ops/resource_variable_ops.py:1666: calling BaseResourceVariable.__init__ (from tensorflow.python.ops.resource_variable_ops) with constraint is deprecated and will be removed in a future version.\n", "Instructions for updating:\n", "If using Keras pass *_constraint arguments to layers.\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "OxBaOKMn8Ky4", "outputId": "1d3651ca-1bef-4b46-df53-d82858fbdb01", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "#训练5次来测试上述代码\n", "model = initial_model\n", "losses = []\n", "for _ in range(5):\n", " model = batch_train(model, sample_batch, 0.1)\n", " losses.append(batch_loss(model, sample_batch))\n", "print(losses)" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "[(0.21017574, 1.0), (0.13879976, 1.0), (0.105693415, 1.0), (0.085996725, 1.0), (0.07277652, 1.0)]\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "qM4wgWlPTexP" }, "source": [ "以上输出说明在单批数据上,多次梯度下降是有效果的。接下来需要在若干批数据也就是设备中的全部本地数据使用梯度下降。" ] }, { "cell_type": "markdown", "metadata": { "id": "aKGeH1tC9Qib" }, "source": [ "## 在所有本地数据上(若干批)使用梯度下降" ] }, { "cell_type": "code", "metadata": { "id": "X6ezYXUP9n0B", "outputId": "5826a93e-5a34-4eff-f4eb-f38dbd6648cd", "colab": { "base_uri": "https://localhost:8080/", "height": 34 } }, "source": [ "EPOCH = 10\n", "#将对设备所有数据的训练分割为 对设备中每批数据的训练\n", "LOCAL_DATA_TYPE = tff.SequenceType(BATCH_TYPE)\n", "print(LOCAL_DATA_TYPE)\n", "@tff.federated_computation(MODEL_TYPE, tf.float32, LOCAL_DATA_TYPE)\n", "#对每批样本,依次使用batch_train更新参数,直到覆盖所有样本\n", "def local_train(initial_model, learning_rate, all_batches):\n", " @tff.federated_computation(MODEL_TYPE, BATCH_TYPE)\n", " def batch_fn(model, batch):\n", " return batch_train(model, batch, learning_rate)\n", " \n", " model = tff.sequence_reduce(all_batches, initial_model, batch_fn)\n", " #【FedAVG@C】for each local epoch i from 1 to EPOCH do\n", " for _ in range(EPOCH-1):\n", " #【FedAVG@C】for batch b∈B do w <- w-learning_rate*g\n", " model = tff.sequence_reduce(all_batches, model, batch_fn)\n", " #【FedAVG@C】return w to server\n", " return model" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "*\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "Ksx11MJQCjc2" }, "source": [ "接下来进行本地训练\n" ] }, { "cell_type": "code", "metadata": { "id": "0cwNwe4wAGN0" }, "source": [ "locally_trained_model = local_train(initial_model, 0.1, federated_train_data[5])" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "SH_8yd_XAYNy" }, "source": [ "## 本地评估" ] }, { "cell_type": "markdown", "metadata": { "id": "q3eSpY2HMIvV" }, "source": [ "本地评估的方法是:对所有批次数据,每批执行batch_loss计算损失值、准确率,将其**加在一起(不是取平均值)**得到本地损失值与准确率。这里TODO注释的意思应该是TFF官方还没有写出来tff.sequence_average()方法,所以只能用sum。那么我后面将accuracy除以批数即可得平均值。" ] }, { "cell_type": "code", "metadata": { "id": "GY-_kkM_AXoo" }, "source": [ "\n", "@tff.federated_computation(MODEL_TYPE, LOCAL_DATA_TYPE)\n", "def local_eval(model, all_batches):\n", " #all_batches指标签为5的所有图片,最多1000张,每批BATCH_SIZE张,BATCHES批\n", " # TODO(b/120157713): Replace with `tff.sequence_average()` once implemented.\n", " return tff.sequence_sum(\n", " #对每批数据求损失以及准确率,再连加\n", " tff.sequence_map(\n", " tff.federated_computation(lambda b: batch_loss(model, b), BATCH_TYPE),\n", " all_batches))" ], "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { "id": "-u4SgWcYCJFh", "outputId": "96b7987c-3063-45bd-aeed-9b7a410ff080", "colab": { "base_uri": "https://localhost:8080/", "height": 52 } }, "source": [ "initial_model_loss,initial_model_accuracy=local_eval(initial_model,federated_train_data[5])\n", "\n", "local_model_loss,local_model_accuracy=local_eval(locally_trained_model, federated_train_data[5])\n", "\n", "print('initial_model loss ={} ,accuracy={}'.format(\n", " initial_model_loss,initial_model_accuracy/BATCHES))\n", "print('locally_trained_model loss ={},accuracy={}'.format(\n", " local_model_loss,local_model_accuracy/BATCHES))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "initial_model loss =11.512927055358887 ,accuracy=0.0\n", "locally_trained_model loss =0.05232632905244827,accuracy=1.0\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "wZNaBC6JK6qL" }, "source": [ "分析结果:\n", "1. 使用本设备的数据集federated_train_data[5]来评估时的数据:\n", " - Epoch=1 loss=0.3815,accuracy=1.0\n", " - Epoch=5 loss=0.0973,accuracy=1.0\n", " - Epoch=10 loss=0.0523,accuracy=1.0\n", "\n", " 说明本地训练的轮次越多,效果越好" ] }, { "cell_type": "markdown", "metadata": { "id": "Qlr5mAhfCbN7" }, "source": [ "2. 使用别的设备的数据集`federated_train_data[6]`来评估时,可以发现准确率很低,这是因为:\n", "\n", " 最开始我们为了模拟数据的non-IID,假设10个用户每人手写1~10这10个不同的数字。然后我们用第5个用户的数据训练模型,成功识别出了数字5,然而面对数字6则无法识别。所以应在全局视角下使用联邦评估,评估整个系统的模型的损失和准确率。" ] }, { "cell_type": "markdown", "metadata": { "id": "66zbQgTxD-bt" }, "source": [ "## 联邦评估" ] }, { "cell_type": "code", "metadata": { "id": "WRE92uLWEOAx" }, "source": [ "#定义联邦类型\n", "#MODEL_TYPE: \n", "SERVER_MODEL_TYPE = tff.FederatedType(MODEL_TYPE, tff.SERVER)\n", "#LOCAL_DATA_TYPE: *\n", "CLIENT_DATA_TYPE = tff.FederatedType(LOCAL_DATA_TYPE, tff.CLIENTS)" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "IfJXSNINE2xw" }, "source": [ "\n", "联邦评估的步骤是:将模型分发给各个设备,让每个设备计算自己所有批数据的损失函数,并回传,再取平均值" ] }, { "cell_type": "code", "metadata": { "id": "L9dr3zOJFBID" }, "source": [ "@tff.federated_computation(SERVER_MODEL_TYPE, CLIENT_DATA_TYPE)\n", "def federated_eval(model, data):\n", " return tff.federated_mean(\n", " #让每个客户端执行local_eval方法\n", " tff.federated_map(local_eval, [tff.federated_broadcast(model), data]))" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "fULZY7ivGVJq" }, "source": [ "\n", "`tff.federated_broadcast(model)`指将模型参数分发给参与训练的设备,在本实验中是一种抽象的表示,所以在实际的分布式系统中需要自己实现这个方法。" ] }, { "cell_type": "code", "metadata": { "id": "9zuYbYbFGhqK", "outputId": "055f0c25-b8ea-4f43-c30f-16e79884eff0", "colab": { "base_uri": "https://localhost:8080/", "height": 52 } }, "source": [ "print('initial_model loss =', federated_eval(initial_model,\n", " federated_train_data))\n", "print('locally_trained_model loss =',\n", " federated_eval(locally_trained_model, federated_train_data))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "initial_model loss = <11.512926,0.5>\n", "locally_trained_model loss = <35.812584,0.5>\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "4ZaIBGYEGt6Q" }, "source": [ "可以看出使用**一个设备**训练出的模型来评估系统中所有设备中的数据,准确率也不高。接下来我们需要使用联邦训练,让**所有设备开始训练**。\n", "## 【核心】联邦训练" ] }, { "cell_type": "markdown", "metadata": { "id": "bIcHw3iXLoco" }, "source": [ "联邦训练的步骤是,使用`federated_map()`方法,服务器将参数和学习率广播到每个参与者的设备上,每个参与者使用`local_train()`开始本地训练。本地训练完毕后,会返回训练完的模型(w和b)给服务器,服务器使用`federated_mean()`方法取加权平均值,得到了本轮系统训练结束后的模型。" ] }, { "cell_type": "code", "metadata": { "id": "kkIZOoXAG9Nq" }, "source": [ "SERVER_FLOAT_TYPE = tff.FederatedType(tf.float32, tff.SERVER)\n", "\n", "@tff.federated_computation(SERVER_MODEL_TYPE, SERVER_FLOAT_TYPE, CLIENT_DATA_TYPE)\n", "def federated_train(model, learning_rate, data):\n", " return tff.federated_mean(\n", " tff.federated_map(local_train, [\n", " tff.federated_broadcast(model),\n", " tff.federated_broadcast(learning_rate), data\n", " ]))" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "LhncKwqjHa93" }, "source": [ "回顾下本次实验参数的设定值\n", "- 模型参数(w、b)初始值:0\n", "- 本地学习率:\n", "初始0.1之后每轮*0.9\n", "- 系统轮次:\n", "100\n", "- 本地轮次(EPOCH、E):\n", "5\n", "- 设备总数:\n", "10\n", "- 每轮选择设备数:\n", "10(全部,C=1)\n", "- BATCH_SIZE(B):\n", "200\n", "- 每个设备拥有的样本数(nk):\n", "1000\n", "- 数据分布:\n", "non-IID\n", "\n", "开始进行100轮的联邦训练:" ] }, { "cell_type": "code", "metadata": { "id": "y0WOQakgHcTB", "outputId": "df707f0a-bb96-4a1a-d1eb-8e92331770b9", "colab": { "base_uri": "https://localhost:8080/", "height": 897 } }, "source": [ "logdir = \"/tmp/logs/scalars/training/\"\n", "summary_writer = tf.summary.create_file_writer(logdir)\n", "\n", "#最初模型的w和b都是0\n", "model = initial_model\n", "learning_rate = 0.1\n", "with summary_writer.as_default():\n", " for round_num in range(50):\n", " model = federated_train(model, learning_rate, federated_train_data)\n", " learning_rate = learning_rate * 0.9\n", " loss,accuracy = federated_eval(model, federated_train_data)\n", " print('round {}, loss={},accuarcy={}'.format(round_num, loss,accuracy/BATCHES))\n", " tf.summary.scalar('loss', loss, step=round_num)\n", " tf.summary.scalar('accuracy', accuracy/BATCHES, step=round_num) " ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "round 0, loss=10.643875122070312,accuarcy=0.6812000274658203\n", "round 1, loss=9.886220932006836,accuarcy=0.7333000183105469\n", "round 2, loss=9.223746299743652,accuarcy=0.7595000267028809\n", "round 3, loss=8.645051956176758,accuarcy=0.7732000827789307\n", "round 4, loss=8.139508247375488,accuarcy=0.7823999881744385\n", "round 5, loss=7.697207450866699,accuarcy=0.7903000831604003\n", "round 6, loss=7.309234619140625,accuarcy=0.79660005569458\n", "round 7, loss=6.967775821685791,accuarcy=0.8027999877929688\n", "round 8, loss=6.666112422943115,accuarcy=0.8083000183105469\n", "round 9, loss=6.398534297943115,accuarcy=0.8115999221801757\n", "round 10, loss=6.160220146179199,accuarcy=0.8152999877929688\n", "round 11, loss=5.947114944458008,accuarcy=0.8187000274658203\n", "round 12, loss=5.755807876586914,accuarcy=0.8229000091552734\n", "round 13, loss=5.583432197570801,accuarcy=0.8253999710083008\n", "round 14, loss=5.427569389343262,accuarcy=0.828700065612793\n", "round 15, loss=5.286177635192871,accuarcy=0.8323999404907226\n", "round 16, loss=5.157526969909668,accuarcy=0.8357000350952148\n", "round 17, loss=5.040145397186279,accuarcy=0.8386999130249023\n", "round 18, loss=4.93277645111084,accuarcy=0.8414999961853027\n", "round 19, loss=4.834345817565918,accuarcy=0.8426000595092773\n", "round 20, loss=4.743927001953125,accuarcy=0.8446001052856446\n", "round 21, loss=4.660722732543945,accuarcy=0.8460999488830566\n", "round 22, loss=4.584041118621826,accuarcy=0.8483999252319336\n", "round 23, loss=4.513279438018799,accuarcy=0.850200080871582\n", "round 24, loss=4.447912693023682,accuarcy=0.851400089263916\n", "round 25, loss=4.387477397918701,accuarcy=0.8524999618530273\n", "round 26, loss=4.331568717956543,accuarcy=0.8539999008178711\n", "round 27, loss=4.279825687408447,accuarcy=0.8550000190734863\n", "round 28, loss=4.231926918029785,accuarcy=0.8563999176025391\n", "round 29, loss=4.187587261199951,accuarcy=0.857699966430664\n", "round 30, loss=4.146548271179199,accuarcy=0.8585999488830567\n", "round 31, loss=4.108576774597168,accuarcy=0.8592000961303711\n", "round 32, loss=4.073460102081299,accuarcy=0.8602999687194824\n", "round 33, loss=4.041004657745361,accuarcy=0.8604000091552735\n", "round 34, loss=4.011031150817871,accuarcy=0.8612000465393066\n", "round 35, loss=3.9833743572235107,accuarcy=0.8616999626159668\n", "round 36, loss=3.9578800201416016,accuarcy=0.8621000289916992\n", "round 37, loss=3.934403896331787,accuarcy=0.862600040435791\n", "round 38, loss=3.9128100872039795,accuarcy=0.8628999710083007\n", "round 39, loss=3.8929710388183594,accuarcy=0.8627999305725098\n", "round 40, loss=3.8747658729553223,accuarcy=0.8628000259399414\n", "round 41, loss=3.858079433441162,accuarcy=0.8625999450683594\n", "round 42, loss=3.8428051471710205,accuarcy=0.8630999565124512\n", "round 43, loss=3.828838348388672,accuarcy=0.8631000518798828\n", "round 44, loss=3.816082715988159,accuarcy=0.8632000923156739\n", "round 45, loss=3.8044466972351074,accuarcy=0.8634000778198242\n", "round 46, loss=3.793842315673828,accuarcy=0.8632000923156739\n", "round 47, loss=3.784188747406006,accuarcy=0.8635999679565429\n", "round 48, loss=3.77540922164917,accuarcy=0.8637999534606934\n", "round 49, loss=3.7674317359924316,accuarcy=0.8637999534606934\n" ], "name": "stdout" } ] }, { "cell_type": "code", "metadata": { "id": "WOlHFoVPGnkx", "outputId": "91616f1c-ff45-4bf4-af59-1411e4d1edd7", "colab": { "resources": { "https://localhost:46855/": { "data": "PCFkb2N0eXBlIGh0bWw+PCEtLQpAbGljZW5zZQpDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgpVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLT48aHRtbCBsYW5nPSJlbiI+PG1ldGEgY2hhcnNldD0idXRmLTgiPgogIDx0aXRsZT5UZW5zb3JCb2FyZDwvdGl0bGU+CiAgPGxpbmsgcmVsPSJzaG9ydGN1dCBpY29uIiBocmVmPSJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQU1RQUFBREVDQVlBQUFEQXBvNXJBQUFBQkhOQ1NWUUlDQWdJZkFoa2lBQUFBQWx3U0ZsekFBQmFiZ0FBV200QnhXc2pPQUFBQUJsMFJWaDBVMjltZEhkaGNtVUFkM2QzTG1sdWEzTmpZWEJsTG05eVo1dnVQQm9BQUJsMFNVUkJWSGljN1oxNWVGVFYzY2MvdjVzRkNWUnhxVnRwdFZXMlZseGY2MXF0aXEwTDlHbDlOWFVCRkVwRlJUSWhoQkFEQ1RkQU1BRWtDWXNLN3FCOStrRDcycWZCV2l2cVc3VmE2NzRpcmU5cmF4WDFiWlZXWlRITC9ONC81ZzRHU0dEdXpMMXo3NTA1bjM4NHpNdzU1OHZNL1hLMjN6a0hESUdqaXpoUEYzRmUwRG9NSUVFTHlHZDBQb093YUFBdWNWNWFoMFc1VlBCNmtMcnlHV09JQUZDYi92U2pFcWdHK3V6d0t3Z2R3QzEwVUNmVi9Ec1loZm1MTVVRV1VSdUxFa1lEOHhFTzJ2N0dqb1p3UHN4SFdNeGhJRXVsbEs1czZzeG5qQ0d5aEM3Z0pKUlc0Q1NnWnhQMG5INEppNWlVODdqZkdnM0dFTDZqVFF3RTVnR2prVzdmZCtxR1NMS1dJc3BrTW0vN0lOUGdZQXpoRTJwVFFoK3FzS2dDK2dMdVRiQnJlaXV3bUhZYVpEcWZlaXJZQUJoRGVJNHFRaU1YQXdzUUR2UEFCRDJsTnlMVXM0bmJ4U2FldVdwREVtTUlEOUViT1FGb1JUaHQrNHYrR0NMNTU3TkF1Y1I0S2kzQmhsMHdodkFBYmVBUUxHeGdBbUQ1YW9MdTZjU2ZpdkFMbEVxSjhZNUw2WWFkTUliSUFMVXBwb2hyRVdZajdMMzlqZXdhSXBuZWpMS1F2V21VY1d4TDZSOWcyQVZqaURUUnVZekNvZ1g0QnBBOUUzUlA5L3orMzRHWlVzYktYcVFiZG9NeGhFdTBnYU1SbWxITzl2QUIvNk9UT3RrRFF5VFN5aU1vNVJManRaNytIWWFlc1lJV0VCWFVaaitkU3l2d1BNclpIaFc3RVdFaW4zRWFVemtWb1JUNG15Y2xDK2RnOGJJdVphWGV3b0dlbEprSG1CWmlENmhOSVVXTVIya0FEdkNvVmRpS3NKajRydXNKdXB3U1BxTUtxRUtjOVl2ZXlrbTl6azFBRXdmU0xLVzBZK2dWWTRqZG9QV2NnMFVMd2xIYlg4emNFR3NSeW1UYTdsZWN0WW1CRkRrcjNPeXd4cDJPSVpMcERRaFQ1VG9lMkYzZCtZd3hSQS9vSEFaQnQ3QnNiMXFGRnltZ1hDcmR4U1RwSXM0RVdoQ08zYVhNOUxXc280Q1lYTU1iYnJUa0E4WVEzVkNiL2dpVnlFNWgyWmtaNGlPRU9SeWVmdFNxMmxnTVlEVEtmT0FnajNSMW9OeENJWFV5MFlTWkp6R0d3SG5nTE9lQjZ5a3NPNzBITC9IQWlYZjdHblFaL1dudndiRHBhd1NjTVBQOVRKZzVHRU9nczFNSXkzYi9zSzBqVGt4cS9PbVNhQ3VEVUJxUTdUdnR2T2pXdlloUUx0ZmtkNWg1M2hwQ2JSZGgyYWsvVkJ0UUtxU0czM2dxdGhlMGxYT0FGdUFvRDlkRTFsSkFtZncwUDhQTTg4NFFhbE1DenJSbXFtSFplMzZRTmlFMDhUbk5ZbWQzV2xOdEN0bVg4WWd6TGR5N1JqZnBSSmg1RVEzeWsvd0tNODhiUXlnSWRWeU14UUxVWlZoMjcrOTNvdHlKTUZOcStJZlhtdDJnaTlpUFFtWUIxeUVVYm44ak0zTzhoMUxEUkZhSm9KNEtEaWw1WVFpdDVRUWtnN0Rzbmw5N0ZJdHlxZVpWVDhWbWlDNWhLRW96NGh4cjQwMVg2bG1VbUZ6RDB4NUtEU1U1YlFpdDRSQ0tzTkVNdzdKM2ZPMHRsQnFaeVJxUDVYcUtMbVlVUWd2aUJCOUNwdVpRNEY0NnFKSkpmT0NwMkJDUms0WlFtMkk2UFF6TFR2eVpDSy9laHh1bGpNODlsdXdMYWxQTS9zNzNBSHQ3MUZwc1JsaElZVzZHbWVlY0lYU0c1MkhaY1lUN0VLYkpERDcwVm0xMjBPVWNRZ2MyNHJTVTRNWDM4aFpDalV3SWQwdnBscHd4aE43QVVBcG9Cczd6Y0FyeUdaU1kxUEdNaDFJRFEyOTJ0cmdxcDNuMkhWazhTcHdwOGxOZThWQnFZRVRlRUdxekh4M01RcmdPbk5tVnpIL3NkNEVaMU9iZTdJb3F3aTNPSVFod0dPREY5OVdKT0xOdDQ0T2RiY3VVeUJwQ2JRcnBZRHg0R3BhOUJWakFsMmlTQ3JaNktEZDA2SEpLNktRS1NTSE1QTlcweFNiaU5MRjNkTVBNSTJrSXJYRldhTDBMeTFiZ0Z4UXdUV1o2dEVFbkl1amlGTUxNM2FZVFllWVZNaTQ3Sy9aZUVpbEQ2RXdHRWZjOExQczVMTXFsamo5NHB6UjY2TTJjNlV4RzdCcG03amI5eFd2cktLUk14ckxlTzZYK0VnbERxTzFFZVNyVkNIMjJ2NUdaSVRZQzlXQU8rMHFpTmhZSE80Y3hkdzh6aDB6V2JSSlJ2eDNSQ0RNUHRTSFV4bUlybzdHY0h3aThhQlhhZ1ZzcFlhWTVEckpuZEJuOXNhakVjc0xNSVJOREpFbUVtZmNOZDVoNWFBMmhOM1FMeS9adUduVXRRa3hzL3RkRHFUbUwzc29neE9taVptNklaUG9GbEhJWnh4TmVhdldLMEJsQ3F4aUkxVzJRQjE2MENpK2hsTXNjZnUrcDJEeEJWekRDaVk5S1RHSmtab2hrZWkxeEpzczQvdXFsMWt3SmpTSFVwb1F0empRZzlQV29WVWhzMzF6UFVsa1QzbVk2Q3FoTklWOXhUaDhSSjh3Y01qRUVKS2E1bDlDWHVWTEtaOTRxVG8vQURhRWdUT05peEZrb2N2K2w5cFJPWEV2VlRwMDBoWDhnRnlYMGR2WkRtUVZNQWdveU5FUXkvUjVDRGFPRFh3Z04xQkE2bFJPd2VnbkxUdDhRNnhES1pZNjV1TkJQOURhR0FZdVFicmVuWnY3Yi9RbUxtSXplZnBKaDFnbkVFRnJ1aEdYdjdyUnM5MS9xQnVKTWxYbm16S0Zzb3JjekNweGdTbTlhZDBXY01QTngyUTh6ejZvaG5PN1JOSlJhaFA0OXFuRC9wWDRNMUZQRXpXTFQ2YTFpUXlyb1hleEZuQXJnQnFDL1IrTy9UN0NZUXhHTHN4a0drdlVXUWlzNHpqa043NHdlVmFSdWlFUllkaEdWWXZOL2ZtZzF1RU9YY3dpRlBvV1pYNUdkTVBQQXhoQmF5U2lFVnVEcnJnMmhQSW93UmVibFJzaHhycUYzY3dKZHp0alF1eldrUjFIS1piUy9XM2FESFZUYkZMT1pheEhtQUYvYVFWSFBYOHhiV05SSVEyNXRTc2xGVkJIdTlpSE1ITzZraUpsUzZrK1llZURUcmdCYXhhSEFMR0FDMG1OVG05aTJXRXlqMkxtM2JUR1gwZVdVVUp6aWFlYXBwemVoMUhNb3krUXNiOGVOb1RCRUVxM2lQNXh1MUttT3NzVEc5aTZxWkVIdWJtelBCL1EyQmxMTVBOVERNSE40RTRzS3VaUUh2ZElaS2tPQU14TTFuVEVJRjJOaHl6eGVDRnFUd1R2MExyN3JoSmtmcy8zRnpNMXhQM0VxNVlyTVk5UkNad2hEN3FNMkZvYzdZZWFTUVpqNWp1a09MRzZoZzFvWnpTZnBhak9HTUFTR3JxWS9XN3VkWmc2WnR4YkMreWcyRm5la0UyWnVER0VJSEwyUFFYU2xFV2ErdXpROGowVzVsUEtrR3kzR0VJYlFvUGR3UHNJaWhLRkFwb2FBeEtYMkUrVEgzSm1xQnRlM2tHbzVFN1NjSDdyTlp6RHNDYm1TQjluSzBjQkU0SjllRkFrYzZpYUQrMnQ1bFNOUjd0Y1k2L1I2eDhrR2cwZklSRHBrREN2b3d4QmdNV1IzSDBzNmhpaHlVdWRRd0NzYW8xV3Y2eGFvWnpCNGdKVHlzWXdtUnB6aHdHK3pWYTk3UTFqYkRRRlFCSlJSeEhxTk1kWXpWUWFEZzR4bHZZem1mSVFmZ1A5NzRUTnBJYm96RUxoSHkzallkS01NZmlDWDAwWVJ3NEJ5U0grZFlVKzROd1E5R2lLQk1JSUNYdFlwTktyTlh1bkxNaGgyUlVwcGx5dG9SUmdHL3B5bDVhMGhFaFNqVE9kZnZLNHhScVlqeW1EWUhYSVpHOEdmdmRkK0dDTEpOeERhZEFwdFdzblgwNmpIWU1nNlhvMGhkc2RJdW5oZEs3Qk5OOG9RZGpLZFpVcVZ2aWl6K0lUWHRKSUwwOGh2TUdTRmJMUVEzVG1DT0d1MWdqWXQ1L0FNeWpFWWZNSFBNY1R1R0VrQmIyaWw2VVlad2tWUWhvQmtOK3BUWHRWcFhPQlJtUVpEUmdScGlDUkhvanlnVTJuVGF0T05NZ1JMdHNjUXZTT01wSlBYdFFwYkozZTdGTVZneUNMdURTRStHU0pCQ2Nvcyt2Q2FUdXQyWnFqQmtDWEMwR1hhRmVGSTRFR3RvazJuT21mNkdBeFpJSnlHK0lMRWJKVHBSaG15Uk5nTkFWQUN6S0tFVjNVNjM4OXkzWVk4SXdxR1NESUkrSzFXMDZiVCtWcEFHZ3c1VHBRTWtVQVppYkJlcTdIVnBqaFFMWWFjSTNxR1NKRG9SbTNqVmEzbWUwR0xNZVFPVVRWRWtzRUlEK2tOdE9rTXZocTBHRVAwaWJvaGtvd2t6bnF0TWQwb1EyYmtpaUVBK2dHemFPY1ZyZUhjb01VWW9va3JRMmppNEtkQ243UjR4UkRnZHpyRGRLTU03bkhYUWx3ZGVqTjBaeVN3WG1lYWJsUmVFM2QzR0lIYkxsTll1MHU5MFE5bEZsMjhyRE1aRWJRWVExYlpqRkxQTmhhNXllVE9FUHRHemhBSmxLSEE3M1FtSzdXR2c0S1dZL0FWQlZiUndTQzVERnZHdWJ1Q3paMGhPaU5xaUFRQ2pLR0FEVHFUbU5xUjZ2NFpVa0g1RXhhbnlhV01sVEc4bjA0UjdnelJGV2xESk5rSG9ZVXVudE5hVGd0YWpNRVQza1c0a2tzNVdVcDVPcE9DM0JuQ3I4MUJ3WEFNd2hOYVo3cFJrVVhaQXRSVHdHQzVsSlVpbVI5ZTVzNFE4Wnd5QkNTN1VZVzhxWFhFOUJJS2doWmtTQkZoRlVVTWxzdXdwWlN0M2hYckFyMmVvUlN3M2xXcDBVcS9oREJKYko3Q2tKZTRheUdLY3E2RjJKbGpnU2ZWWnFYYUhCaTBHRVAyeWVjeFJNK28wNDJDRFZwUFRGZWJibFErWVF6Uk93TlFXbGpQc3pxYlU0SVdZOGdPdWI1UzdRWEhvZnhCNjFtcDgvaHkwR0lNL21KYWlOUklkS002MmFCelREY3FsM0ZuQ01uN0lMbDlVVnJZd0o5MExpY0hMY2JnUGFiTGxBN0s4U2hQNlJ6VGpjbzFUSmNwZlJMZHFDN1RqY29sVEF1Uk9mc2l0UEFYbnRIWm5CUzBHRU5tdURORWVyY0g1UWZLQ1ZnOHBYTlpxVFlIQkMzSGtCNm1oZkFXQzJFTVJXelFCbUpxcDdWblBWUm9Nd09DMXBBSnVwcUQzWHplN1ErMjV6MEVycUtqY3BiOWdCYUtlVkliT1Nab01lbWdTemhVbDdLY1l1WUVyU1VkZEJWRDlHYzhRQWRUM2VSek82aDJOKzFxekhFS1NsblFJdHlnTnNXNmhCZ1dieUpjVFhvbnN3U0czc2UrZWgrTldMd0M3bSttY3JkclRDbEsreUhmTWQ5bTRER2dqUzZlb0lqSDBCemRreENuUFdnSnFhTExHSVhTQ3RHN1YxeHRMSTVnTkxBQTBnL01kTHVOTXBNeHhOc29Ed05yMlllSHhQN2lRZEZLS29EN01pZzd2QWdkUVV2WUU3cU1ZNG5UZ25KbTBGclNRZS9qTE9LMElCeWRhVm51REdGUjVHSlBVaGVKL1FWckVkcmtKcDd2N1lPeWtKOXBKWmRERHQ1aExlRnRJWFFwK3dOMXhKa0UwVnRIMFpWOERZdTVLR084NnA2Nzd6THRuczJJMHhVcTVOZXlnQTljS0xtZUxyNUw0Z1MrM0VIRDEwTG9jb3BvNXpyaTFDUHNFN1FldCtoSytpRk1BNmFqN09YbFdOV0xMdFBiQ0E4anUzYUYzQ0NOL0ZXcmFFQ1psM2doblZKQ1NNZ01vWXNad2VlMEFOOEtXb3RiVkJIdVpReEtFN2liVGsyVmRBenhSVmNvVHBzczdyMHI1Sm9TRnJDWlVoSTcxM0lES3h5RzBLVU1wb3RGS0JkRzhUOGJ2WXNUV1VVcitMczN4WjBodXJpYkl1WkxNeC83SVVac09yV1M2eENlcFB0MFgyLzdvS05Cb0dNSWJXWUFRalZkVElIb1JTdnJQWHdGdUJFWVRSWitmVmVHa0tXODZaZVE3WFVzNUdtZHhuTGdXci9yeWdvQmRablV4bUpBNXRPUVFhR3I2Y3RXeW9BWndKZXlWVzg0RjEyMlVZM3czaDQvRjRYV0lvQlpKcjJKczlpSEY0QjdpS0laN21JVVczZ0RwWkVzbWdGQ2FnaFp3aWRBaGJ0TS9takptQ3kyRUhvVFg5Vm1WbUx4S0VRdlpFVHY1SGk5aThjUmZnMGNIb1NHMEo1dktrMnMxbW1NUmhqbFByTVBndElsQzRiUUJmVERZaHJDZEdBdnYrdnpHcjJIL2VtaURnbCtQU1MwaGdEQTRucVVzNEQrYVpjUnZEbDg2ektwSWl6aVlvU0ZFTDJyaW5VNVJSUnpIVjNoV1E4SlpaY3BpVFR4RGtLOWR3VjZWbExxK0RUdHFnczVrVVU4Q2F3bWltYTRreEVVOFJKS0M0VERESkJsUTZoTm9icDlMUHZTQXJ6b3VaanNtR01UeXF0ZUZxaE5IS29MV1k3d1IrQlVMOHZPQm5vSFEvUjJIbkRpMnI0WnRKNmQ4ZDBRT3BrK09vVVJXa0Vybi9BdVU3aktUWDZ4NlVTNW1zU0NvRC80WVE3bEF5ek9raHJlOEt6SWhWeEVBWCtHNklWbEEranRqQWRlUTl5SFpXY0xYNzVVblVKZm5jSW9uY0pLQ3ZrUWVCZ29BdzVDYU5ZcUJyb3BUK2J6SEhDekgxcDNyY3lUVXQ2bWdPOUlOUzk3VXRvWEhFTzBZNzJHRWZKeHEyZml0SndCS09jaWpFTDVFZEMvbDRkckg3cTRCVnpPSGlrekVINEU3c3lVRWVtWjR6VUsrYjVNWjZQSGFneFpJS01XUWlleHY4WVlxekhhVUQ0a01jQWJ3NTVuaFVacUJUOTJVNWZNNTFNazlMdlBIcWVBMDQwWm9vdHJRK2hrQm1vWlYydU1OZ3A1bjhScTZFamN4c2tJUzdYUzNTcXFOSEkveXE5YzFlTVZlMjR0MWxMQ2VWTE52N09neHVBVDdpNXVMK2NpTE41QldFN0NCSm5zb0R1QU9NMnVjeW1USU9DSGJtZHpLUGZ5WlM2U0N1OXVzakVFZzlzcnRmcmg1WnlNY0xsTzVZZXVzc3huSThvc3p6Umtpc1VTdXJoU0pvWWp6TnVRR2NGUDNRazNhelg3dXNyVGx5WEFILzBSbERJSzFNc015c1FtSHJBV2cwY0Vid2c0aEU2YTNHUVFtemdXRXlHdy81VzdVSzZSV3V5QTZqZjRSQmdNQVRCQnAvRTlOeGxrSHE4QVMzelNzenZhRVM2VE9sWUVVTGZCWjhKaUNDSE9jclZkQnZIMW9SWjQyeDlKUGJJWllaVE1aRTBXNnpSa2tiQVlBb1REMmN4Y1YxbHN0amdodzluZ1l5eEdTQzIveTFKOWhnQUlqeUVTVE5icG5PNG1nOHpqUWVBWFB1bEo4ZzdDcVRJejhJRzh3V2ZDWmdpTE9MZXI3WEtUU3llVGdYLzVJNG4xRkhDNjFMTEJwL0lOSVNKc2hnQVl3bVpxM1dSd0RrU2I2WU9XNXlqaVRKbkozOU10UUJzNHlrdEJCbjhKb3lFQXFyU2FFMXpsS09ZVzRDa1BOVHpHWHB3dE5md2ozUUwwUnFZalZIcW95ZUF6WVRWRUlYSHUwS3RURHcwUm16Z0ZYSU0zYXhPL0FpNlE2WHlhYmdIYXdHem4xQWhEaEFpcklRQ09ZUUJWYmpMSUhGNUYwb2lQMnBHN2dVdkVabHM2bVZVUmJhQUZjZGZ0TTRTRE1Cc0NvRmFudXp5RGRBczI4RDlwMVNZMGljMDRzZWxNSjd1dXBvQjUzQTdFMHFyZkVEaGhOMFFmNEE2OUpQV2pTYVNaclU1RWJPb0lpbElwTnRWdUJTYlIxUlR3Wis0Q3hxZGJoaUY0d200SVVFN2k2MHgyazBYbThSREN6MVA4ZUJjd1FXWnprM3R4Q2RTbW1EK3pCbUZNdW1VWXdrSDREUUVnTkdnMVI3cktFNmNjMkxTSFQzMU9Zcnh3WjdyUzFLYUVRdHFBSDZWYmhpRThSTU1RVUlKeW01c2piR1FlSDhKdXUwRC93bUtFek9iK2RFWHBBdm81Wm5BVm1HZ0lMMUV4Qk1CM3FlYW5ybkkwY0J2d1pBL3ZKSTZJc1h0OEx5WFVaZ0RiV0FlY25XNFpodkFSSlVPQXNrQm44TlZVUHk2SlRUd1RTSFNOa2lTT2lMRjVLVzBaTmdkU3dIOERKNmRiaGlHY1JNc1FzRGRkM09vbWc4eGxBN0RRK2V2cnhQbU8yTHlWcmdDMU9aZ0NIaUdDcDJzYjlrelVEQUZ3Z1Zaemhhc2NoY3hGdVpzQ1RwZUdGTzZkNkFXZHkyRllQQUVtUGlsWENmVXBhcnVoVld0WTV3eWM5NGl6Nmp3dWt3clZaakJ4MWtIcVhUWkQ5SWhpQ3dHd1A4cmliRldtY3hpR3hXTVlNK1E4VVRVRUtLVjZBeGY1WG8zTjhjUjVIRGpVNzdvTXdSTmRReVJZcGpiNytWVzR6dVpFaEllQkEveXF3eEF1b202SWc5bVdmc2pGN3REWm5JbnlDUGhuT0VQNGlMb2hRTGhLcXpuUHl5SzFudk9KOHlCWnZnSFRFRHpSTndTQXNGeXJ2SGw0MWVZSEtQY0RmYjBvenhBdGNzTVE4RFVLdVRIVFFyU095NEJma2dnN04rUWh1V0lJZ0d0MUJtZWttMWx0cmthNGwraXV6Umc4SUpjTVlhSGNwbFBjZDNXMGprbkFyZVRXOTJGSWcxeDdBQVpUNHU0QVlxMWpPc0pTTkFRM1doc0NKOWNNQWNwVXJlWEVsRDQ2aTNvd0oyUGtNRytnL05KTkJuZUc2T0p4SlBSbm14WVE1dzYxZTcvaVMwRjBGcTBvZGRrVVpzZ2FtNEJxQ2psT1JyczdmdFRWQUZLVzhUZmcrenFGRWNScEFaY25ZbVNQNGJSekExQy84eHRxWTlISkNwU2ZCS0RMNEM5eDRENkttQ3FsNlIwd2wxYVhTWnBaeDFhT1F5a242UHZlZWtPbzBWcUdkMzlKTDZHQVR1NUVqQmx5RHVGUkxJNlRLeGlicmhrZ2d6R0VyS0JERnROS0owY0FpMG1jWGhFbWlvbHpqOXFKVmxCdGlobkthb1FyZ3habThKUzNFRXJsQ3M2Unkza2wwOEl5SGxUTE1qNlNWbUlJdzRHSE1pM1BZNDZqZzNLZFRCODZXUVArUjhjYXNzWm1vSjVPaHNzVjNsMWc0OWtpbExTd0hqaFBZMXlDTUI4NDNLdXlNMEtZelQ1Y0JKd1N0QlNESnlod0w1MVV5VGcrOExwd3o2ZGRwWlUxREdBSVFqbndpZGZscDBGZmpCbHloV2RSVHBPeGpQWERET0RUT29UWXRFc3pyUlF4REZnQjV0cGFRMGE4aDNJbFl6aEpydVJwUHl2eWRXRk81ck5SbXBrSW5BVDh3Yys2RERuSlZxQ0p2Z3lWcTFncGd2cGRZVllDMmFTWjV4UytRd1VYQXd1QXc3SlJyeUhTckVXWkxGZngxMnhXbXJYUURRR1ZSYXpoTTc2SlVFL0MvUWJEenJ5QWNvWmN4U2dabDEwelFBQ3hUTEtDTGJJUW13SUdBNnZBLzJiUUVBaytBc3JweDdkbEhFOEVKU0t3NEQ2Wno3dHlFMk9CVXhCejNXMGUwd0VzcHAwalpCeXRVaHJzQW0vZzBhNnlrR2ZveDJuT0NuSktCNDhaY29aMXdMRXlucGhNREVjSVVPQ0dnTVNGaWJLQWxTaEhPT09Mei9lWXlSQmxObUJ4b1l6blhCblBHMEdMNlU0b0RKRkVGckpaNW1OVHdGR0lkOHZ4aHREd01jcGsvczVSTW83ZkJDMm1KMEs1ZjFnYWVRc28xV3JPZHNMTWgrOHBqeUg4eUlUTUQ0THdtMUMxRURzampUeEtDY2NqVElUMFEzb05obFFKdFNFQXhLWlRHbG1CTUFTbENXZ1BXcE1oZHdtOUlaSklJNXRrUHRYRU9SckMyZjgwUkovSUdDS0p6R2VETkhJaGNDNkVhNGJDRUgwaVo0Z2swc2c2UHVKWUo4dzhGSFBZaHVnVFdVT0FzNDExSHEzQUVjNEZLbUhieG1xSUdKRTJSQks1a1kva1JtTEVPUkY0UEdnOWh1aVNFNFpJSW8yOEtQTTRFL2dCOEhiUWVnelJJNmNNa1VRYWFHTUwzMEtwQmo0TldvOGhPdVNrSVFDa21hMHlqeVlLR1lxYWJheUcxTWhaUXlRUm00M1N3RVNVa3hDZUNscFB4UGd2NHRzdnZjOExjdDRRU2FTQjU1ak42UWlsd0R0QjZ3azVid0xueXlUK1V5Ym4xMWdzYnd3QnpqYlcyYXloZ0dFa3puM2RGclNta1BFeFNqbi9aTGhNNHJkQml3bUN2REpFRXJIWklyT3hzUmdFckNJTHB6bUVuRTVnQlVVTWtjbTBpazFuMElLQ0lpOE5rVVJzM3BYWmpLV0xzNENYZ3RZVENNb2p4RGxPSmpOUkp2TFBvT1VFVFY0Yklvbk00ZmNJSitUWk50YS9JSlJLR1NNa3htdEJpd2tMeGhBT1loTVhtNVhBa1pEVDIxZy9RNmtIaHN0a3N5dHhaNHdoZGtKc1BoTWJtd0tHUTA0OU1IRmdGY3FSRXNPV3NwdzFmRWFFY2d0cEdKQmEvZ0tVYWozbkFNMUVleHZyTXlneEtlZVpvSVdFSGROQzdBR1p4U01veDBNa3Q3RytDMXhKakZPTUdWTERHQ0lGeEtaVDZsaEJuS0VrYmtzSys3VGtGcUNlT0lPbFBEdUhCT2NLeGhBdUVKdVBwWTRZQlF4SGVUQm9QVDJnd0JxNitLWk13WllLYzM2dVc4d1lJZzJraGplQkMzUU9JMGkwR01NQ2xnVEM4MEJNcHBockJ6TEJ0QkFaSUxXczQ4c2NFL0J0ck84alRPVGZmTnVZSVhPTUlUSkVKdElodGJSaWNRU1MxVzJzN2NCaWloZ3FVMWdodGdsdjl3SmpDSStRR2o2U0dtTEF0OEgzNDl6WFlqRk1waEtUc2xEYzQ1Y3ptREdFeDhnTVhnRE8wTG1Nd3FMVjQrTGZSRGhicHZLWXgrVWFEUDZqTmlYYXlCbEI2ekNrenY4RFFkN1FyTWJMUjFBQUFBQUFTVVZPUks1Q1lJST0iPgogIDxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FZQUFBREFwbzVyQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUJhYmdBQVdtNEJ4V3NqT0FBQUFCbDBSVmgwVTI5bWRIZGhjbVVBZDNkM0xtbHVhM05qWVhCbExtOXlaNXZ1UEJvQUFCbDBTVVJCVkhpYzdaMTVlRlRWM2NjL3Y1c0ZDVlJ4cVZ0cHRWVzJWbHhmNjFxdGlxMEw5R2w5TlhVQkZFcEZSVEloaEJBRENUZEFNQUVrQ1lzSzdxQjkra0Q3MnFmQldpdnFXN1ZhNjc0aXJlOXJheFgxYlpWV1pUSEwvTjQvNWc0R1NHRHV6TDF6NzUwNW4zODR6TXc1NTh2TS9YSzIzemtIRElHaml6aFBGM0ZlMERvTUlFRUx5R2QwUG9Pd2FBQXVjVjVhaDBXNVZQQjZrTHJ5R1dPSUFGQ2IvdlNqRXFnRyt1endLd2dkd0MxMFVDZlYvRHNZaGZtTE1VUVdVUnVMRWtZRDh4RU8ydjdHam9ad1BzeEhXTXhoSUV1bGxLNXM2c3huakNHeWhDN2dKSlJXNENTZ1p4UDBuSDRKaTVpVTg3amZHZzNHRUw2alRRd0U1Z0dqa1c3ZmQrcUdTTEtXSXNwa01tLzdJTlBnWUF6aEUycFRRaCtxc0tnQytnTHVUYkJyZWl1d21IWWFaRHFmZWlyWUFCaERlSTRxUWlNWEF3c1FEdlBBQkQybE55TFVzNG5ieFNhZXVXcERFbU1JRDlFYk9RRm9SVGh0KzR2K0dDTDU1N05BdWNSNEtpM0JobDB3aHZBQWJlQVFMR3hnQW1ENWFvTHU2Y1NmaXZBTGxFcUo4WTVMNllhZE1JYklBTFVwcG9ockVXWWo3TDM5amV3YUlwbmVqTEtRdldtVWNXeEw2UjlnMkFWamlEVFJ1WXpDb2dYNEJwQTlFM1JQOS96KzM0R1pVc2JLWHFRYmRvTXhoRXUwZ2FNUm1sSE85dkFCLzZPVE90a0RReVRTeWlNbzVSTGp0WjcrSFlhZXNZSVdFQlhVWmorZFN5dndQTXJaSGhXN0VXRWluM0VhVXprVm9SVDRteWNsQytkZzhiSXVaYVhld29HZWxKa0htQlppRDZoTklVV01SMmtBRHZDb1ZkaUtzSmo0cnVzSnVwd1NQcU1LcUVLYzlZdmV5a205emsxQUV3ZlNMS1cwWStnVlk0amRvUFdjZzBVTHdsSGJYOHpjRUdzUnltVGE3bGVjdFltQkZEa3IzT3l3eHAyT0laTHBEUWhUNVRvZTJGM2QrWXd4UkEvb0hBWkJ0N0JzYjFxRkZ5bWdYQ3JkeFNUcElzNEVXaENPM2FYTTlMV3NvNENZWE1NYmJyVGtBOFlRM1ZDYi9naVZ5RTVoMlprWjRpT0VPUnllZnRTcTJsZ01ZRFRLZk9BZ2ozUjFvTnhDSVhVeTBZU1pKekdHd0huZ0xPZUI2eWtzTzcwSEwvSEFpWGY3R25RWi9XbnZ3YkRwYXdTY01QUDlUSmc1R0VPZ3MxTUl5M2Ivc0swalRreHEvT21TYUN1RFVCcVE3VHZ0dk9qV3ZZaFFMdGZrZDVoNTNocENiUmRoMmFrL1ZCdFFLcVNHMzNncXRoZTBsWE9BRnVBb0Q5ZEUxbEpBbWZ3MFA4UE04ODRRYWxNQ3pyUm1xbUhaZTM2UU5pRTA4VG5OWW1kM1dsTnRDdG1YOFlnekxkeTdSamZwUkpoNUVRM3lrL3dLTTg4YlF5Z0lkVnlNeFFMVVpWaDI3Kzkzb3R5Sk1GTnErSWZYbXQyZ2k5aVBRbVlCMXlFVWJuOGpNM084aDFMRFJGYUpvSjRLRGlsNVlRaXQ1UVFrZzdEc25sOTdGSXR5cWVaVlQ4Vm1pQzVoS0VvejRoeHI0MDFYNmxtVW1GekQweDVLRFNVNWJRaXQ0UkNLc05FTXc3SjNmTzB0bEJxWnlScVA1WHFLTG1ZVVFndmlCQjlDcHVaUTRGNDZxSkpKZk9DcDJCQ1JrNFpRbTJJNlBRekxUdnlaQ0svZWh4dWxqTTg5bHV3TGFsUE0vczczQUh0NzFGcHNSbGhJWVc2R21lZWNJWFNHNTJIWmNZVDdFS2JKREQ3MFZtMTIwT1VjUWdjMjRyU1U0TVgzOGhaQ2pVd0lkMHZwbHB3eGhON0FVQXBvQnM3emNBcnlHWlNZMVBHTWgxSURRMjkydHJncXAzbjJIVms4U3B3cDhsTmU4VkJxWUVUZUVHcXpIeDNNUXJnT25ObVZ6SC9zZDRFWjFPYmU3SW9xd2kzT0lRaHdHT0RGOTlXSk9MTnQ0NE9kYmN1VXlCcENiUXJwWUR4NEdwYTlCVmpBbDJpU0NyWjZLRGQwNkhKSzZLUUtTU0hNUE5XMHhTYmlOTEYzZE1QTUkya0lyWEZXYUwwTHkxYmdGeFF3VFdaNnRFRW5JdWppRk1MTTNhWVRZZVlWTWk0N0svWmVFaWxENkV3R0VmYzhMUHM1TE1xbGpqOTRwelI2Nk0yYzZVeEc3QnBtN2piOXhXdnJLS1JNeHJMZU82WCtFZ2xEcU8xRWVTclZDSDIydjVHWklUWUM5V0FPKzBxaU5oWUhPNGN4ZHc4emgweldiUkpSdngzUkNETVB0U0hVeG1Jcm83R2NId2k4YUJYYWdWc3BZYVk1RHJKbmRCbjlzYWpFY3NMTUlSTkRKRW1FbWZjTmQ1aDVhQTJoTjNRTHkvWnVHblV0UWt4cy90ZERxVG1MM3NvZ3hPbWlabTZJWlBvRmxISVp4eE5lYXZXSzBCbENxeGlJMVcyUUIxNjBDaStobE1zY2Z1K3AyRHhCVnpEQ2lZOUtUR0prWm9oa2VpMXhKc3M0L3VxbDFrd0pqU0hVcG9RdHpqUWc5UFdvVlVoczMxelBVbGtUM21ZNkNxaE5JVjl4VGg4Uko4d2NNakVFSkthNWw5Q1h1VkxLWjk0cVRvL0FEYUVnVE9OaXhGa29jditsOXBST1hFdlZUcDAwaFg4Z0Z5WDBkdlpEbVFWTUFnb3lORVF5L1I1Q0RhT0RYd2dOMUJBNmxST3dlZ25MVHQ4UTZ4REtaWTY1dU5CUDlEYUdBWXVRYnJlblp2N2IvUW1MbUl6ZWZwSmgxZ25FRUZydWhHWHY3clJzOTEvcUJ1Sk1sWG5tektGc29yY3pDcHhnU205YWQwV2NNUE54MlE4eno2b2huTzdSTkpSYWhQNDlxbkQvcFg0TTFGUEV6V0xUNmExaVF5cm9YZXhGbkFyZ0JxQy9SK08vVDdDWVF4R0xzeGtHa3ZVV1FpczR6amtONzR3ZVZhUnVpRVJZZGhHVll2Ti9mbWcxdUVPWGN3aUZQb1daWDVHZE1QUEF4aEJheVNpRVZ1RHJyZzJoUElvd1JlYmxSc2h4cnFGM2N3SmR6dGpRdXpXa1IxSEtaYlMvVzNhREhWVGJGTE9aYXhIbUFGL2FRVkhQWDh4YldOUklRMjV0U3NsRlZCSHU5aUhNSE82a2lKbFM2aytZZWVEVHJnQmF4YUhBTEdBQzBtTlRtOWkyV0V5ajJMbTNiVEdYMGVXVVVKemlhZWFwcHplaDFITW95K1FzYjhlTm9UQkVFcTNpUDV4dTFLbU9zc1RHOWk2cVpFSHVibXpQQi9RMkJsTE1QTlRETUhONEU0c0t1WlFIdmRJWktrT0FNeE0xblRFSUYyTmh5enhlQ0ZxVHdUdjBMcjdyaEprZnMvM0Z6TTF4UDNFcTVZck1ZOVJDWndoRDdxTTJGb2M3WWVhU1FaajVqdWtPTEc2aGcxb1p6U2ZwYWpPR01BU0dycVkvVzd1ZFpnNlp0eGJDK3lnMkZuZWtFMlp1REdFSUhMMlBRWFNsRVdhK3V6UThqMFc1bFBLa0d5M0dFSWJRb1Bkd1BzSWloS0ZBcG9hQXhLWDJFK1RIM0ptcUJ0ZTNrR281RTdTY0g3ck5aekRzQ2JtU0I5bkswY0JFNEo5ZUZBa2M2aWFEKzJ0NWxTTlI3dGNZNi9SNng4a0dnMGZJUkRwa0RDdm93eEJnTVdSM0gwczZoaWh5VXVkUXdDc2FvMVd2Nnhhb1p6QjRnSlR5c1l3bVJwemh3Ryt6VmE5N1ExamJEUUZRQkpSUnhIcU5NZFl6VlFhRGc0eGx2WXptZklRZmdQOTc0VE5wSWJvekVMaEh5M2pZZEtNTWZpQ1gwMFlSdzRCeVNIK2RZVSs0TndROUdpS0JNSUlDWHRZcE5Lck5YdW5MTWhoMlJVcHBseXRvUlJnRy9weWw1YTBoRWhTalRPZGZ2SzR4UnFZanltRFlIWElaRzhHZnZkZCtHQ0xKTnhEYWRBcHRXc25YMDZqSFlNZzZYbzBoZHNkSXVuaGRLN0JOTjhvUWRqS2RaVXFWdmlpeitJVFh0SklMMDhodk1HU0ZiTFFRM1RtQ09HdTFnall0NS9BTXlqRVlmTUhQTWNUdUdFa0JiMmlsNlVZWndrVlFob0JrTitwVFh0VnBYT0JSbVFaRFJnUnBpQ1JIb2p5Z1UyblRhdE9OTWdSTHRzY1F2U09NcEpQWHRRcGJKM2U3Rk1WZ3lDTHVEU0UrR1NKQkNjb3MrdkNhVHV0MlpxakJrQ1hDMEdYYUZlRkk0RUd0b2sybk9tZjZHQXhaSUp5RytJTEViSlRwUmhteVJOZ05BVkFDektLRVYzVTYzODl5M1lZOEl3cUdTRElJK0sxVzA2YlQrVnBBR2d3NVRwUU1rVUFaaWJCZXE3SFZwamhRTFlhY0kzcUdTSkRvUm0zalZhM21lMEdMTWVRT1VUVkVrc0VJRCtrTnRPa012aHEwR0VQMGlib2hrb3drem5xdE1kMG9RMmJraWlFQStnR3phT2NWcmVIY29NVVlvb2tyUTJqaTRLZENuN1I0eFJEZ2R6ckRkS01NN25IWFFsd2Rlak4wWnlTd1htZWFibFJlRTNkM0dJSGJMbE5ZdTB1OTBROWxGbDI4ckRNWkViUVlRMWJaakZMUE5oYTV5ZVRPRVB0R3poQUpsS0hBNzNRbUs3V0dnNEtXWS9BVkJWYlJ3U0M1REZ2R3VidUN6WjBoT2lOcWlBUUNqS0dBRFRxVG1OcVI2djRaVWtINUV4YW55YVdNbFRHOG4wNFI3Z3pSRldsREpOa0hvWVV1bnROYVRndGFqTUVUM2tXNGtrczVXVXA1T3BPQzNCbkNyODFCd1hBTXdoTmFaN3BSa1VYWkF0UlR3R0M1bEpVaW1SOWU1czRROFp3eUJDUzdVWVc4cVhYRTlCSUtnaFprU0JGaEZVVU1sc3V3cFpTdDNoWHJBcjJlb1JTdzNsV3AwVXEvaERCSmJKN0NrSmU0YXlHS2NxNkYySmxqZ1NmVlpxWGFIQmkwR0VQMnllY3hSTStvMDQyQ0RWcFBURmViYmxRK1lRelJPd05RV2xqUHN6cWJVNElXWThnT3ViNVM3UVhIb2Z4QjYxbXA4L2h5MEdJTS9tSmFpTlJJZEtNNjJhQnpURGNxbDNGbkNNbjdJTGw5VVZyWXdKOTBMaWNITGNiZ1BhYkxsQTdLOFNoUDZSelRqY28xVEpjcGZSTGRxQzdUamNvbFRBdVJPZnNpdFBBWG50SFpuQlMwR0VObXVETkVlcmNINVFmS0NWZzhwWE5acVRZSEJDM0hrQjZtaGZBV0MyRU1SV3pRQm1KcXA3Vm5QVlJvTXdPQzFwQUp1cHFEM1h6ZTdRKzI1ejBFcnFLamNwYjlnQmFLZVZJYk9TWm9NZW1nU3poVWw3S2NZdVlFclNVZGRCVkQ5R2M4UUFkVDNlUnpPNmgyTisxcXpIRUtTbG5RSXR5Z05zVzZoQmdXYnlKY1RYb25zd1NHM3NlK2VoK05XTHdDN20rbWNyZHJUQ2xLK3lIZk1kOW00REdnalM2ZW9JakgwQnpka3hDblBXZ0pxYUxMR0lYU0N0RzdWMXh0TEk1Z05MQUEwZy9NZEx1Tk1wTXh4TnNvRHdOcjJZZUh4UDdpUWRGS0tvRDdNaWc3dkFnZFFVdllFN3FNWTRuVGduSm0wRnJTUWUvakxPSzBJQnlkYVZudURHRlI1R0pQVWhlSi9RVnJFZHJrSnA3djdZT3lrSjlwSlpkRER0NWhMZUZ0SVhRcCt3TjF4SmtFMFZ0SDBaVjhEWXU1S0dPODZwNjc3ekx0bnMySTB4VXE1TmV5Z0E5Y0tMbWVMcjVMNGdTKzNFSEQxMExvY29wbzV6cmkxQ1BzRTdRZXQraEsraUZNQTZhajdPWGxXTldMTHRQYkNBOGp1M2FGM0NDTi9GV3JhRUNabDNnaG5WSkNTTWdNb1lzWndlZTBBTjhLV290YlZCSHVaUXhLRTdpYlRrMlZkQXp4UlZjb1Rwc3M3cjByNUpvU0ZyQ1pVaEk3MTNJREt4eUcwS1VNcG90RktCZEc4VDhidllzVFdVVXIrTHMzeFowaHVyaWJJdVpMTXgvN0lVWnNPcldTNnhDZXBQdDBYMi83b0tOQm9HTUliV1lBUWpWZFRJSG9SU3ZyUFh3RnVCRVlUUlorZlZlR2tLVzg2WmVRN1hVczVHbWR4bkxnV3Ivcnlnb0JkWm5VeG1KQTV0T1FRYUdyNmN0V3lvQVp3SmV5Vlc4NEYxMjJVWTN3M2g0L0Y0WFdJb0JaSnIySnM5aUhGNEI3aUtJWjdtSVVXM2dEcFpFc21nRkNhZ2had2lkQWhidE0vbWpKbUN5MkVIb1RYOVZtVm1MeEtFUXZaRVR2NUhpOWk4Y1JmZzBjSG9TRzBKNXZLazJzMW1tTVJoamxQck1QZ3RJbEM0YlFCZlREWWhyQ2RHQXZ2K3Z6R3IySC9lbWlEZ2wrUFNTMGhnREE0bnFVczREK2FaY1J2RGw4NnpLcElpemlZb1NGRUwycmluVTVSUlJ6SFYzaFdROEpaWmNwaVRUeERrSzlkd1Y2VmxMcStEVHRxZ3M1a1VVOENhd21pbWE0a3hFVThSSktDNFREREpCbFE2aE5vYnA5TFB2U0Fyem91WmpzbUdNVHlxdGVGcWhOSEtvTFdZN3dSK0JVTDh2T0Jub0hRL1IySG5EaTJyNFp0SjZkOGQwUU9waytPb1VSV2tFcm4vQXVVN2pLVFg2eDZVUzVtc1NDb0QvNFlRN2xBeXpPa2hyZThLekloVnhFQVgrRzZJVmxBK2p0akFkZVE5eUhaV2NMWDc1VW5VSmZuY0lvbmNKS0N2a1FlQmdvQXc1Q2FOWXFCcm9wVCtiekhIQ3pIMXAzcmN5VFV0Nm1nTzlJTlM5N1V0b1hIRU8wWTcyR0VmSnhxMmZpdEp3QktPY2lqRUw1RWRDL2w0ZHJIN3E0QlZ6T0hpa3pFSDRFN3N5VUVlbVo0elVLK2I1TVo2UEhhZ3haSUtNV1FpZXh2OFlZcXpIYVVENGtNY0FidzU1bmhVWnFCVDkyVTVmTTUxTWs5THZQSHFlQTA0MFpvb3RyUStoa0Jtb1pWMnVNTmdwNW44UnE2RWpjeHNrSVM3WFMzU3FxTkhJL3lxOWMxZU1WZTI0dDFsTENlVkxOdjdPZ3h1QVQ3aTV1TCtjaUxONUJXRTdDQkpuc29EdUFPTTJ1Y3ltVElPQ0hibWR6S1BmeVpTNlNDdTl1c2pFRWc5c3J0ZnJoNVp5TWNMbE81WWV1c3N4bkk4b3N6elJraXNVU3VyaFNKb1lqek51UUdjRlAzUWszYXpYN3VzclRseVhBSC8wUmxESUsxTXNNeXNRbUhyQVdnMGNFYndnNGhFNmEzR1FRbXpnV0V5R3cvNVc3VUs2Uld1eUE2amY0UkJnTUFUQkJwL0U5Tnhsa0hxOEFTM3pTc3p2YUVTNlRPbFlFVUxmQlo4SmlDQ0hPY3JWZEJ2SDFvUlo0Mng5SlBiSVpZWlRNWkUwVzZ6UmtrYkFZQW9URDJjeGNWMWxzdGpnaHc5bmdZeXhHU0MyL3kxSjloZ0FJanlFU1ROYnBuTzRtZzh6alFlQVhQdWxKOGc3Q3FUSXo4SUc4d1dmQ1pnaUxPTGVyN1hLVFN5ZVRnWC81STRuMUZIQzYxTExCcC9JTklTSnNoZ0FZd21acTNXUndEa1NiNllPVzV5amlUSm5KMzlNdFFCczR5a3RCQm44Sm95RUFxclNhRTF6bEtPWVc0Q2tQTlR6R1hwd3ROZndqM1FMMFJxWWpWSHFveWVBellUVkVJWEh1MEt0VER3MFJtemdGWElNM2F4Ty9BaTZRNlh5YWJnSGF3R3puMUFoRGhBaXJJUUNPWVFCVmJqTElIRjVGMG9pUDJwRzdnVXZFWmxzNm1WVVJiYUFGY2RmdE00U0RNQnNDb0ZhbnV6eURkQXMyOEQ5cDFTWTBpYzA0c2VsTUo3dXVwb0I1M0E3RTBxcmZFRGhoTjBRZjRBNjlKUFdqU2FTWnJVNUViT29JaWxJcE50VnVCU2JSMVJUd1orNEN4cWRiaGlGNHdtNElVRTdpNjB4MmswWG04UkRDejFQOGVCY3dRV1p6azN0eENkU21tRCt6Qm1GTXVtVVl3a0g0RFFFZ05HZzFSN3JLRTZjYzJMU0hUMzFPWXJ4d1o3clMxS2FFUXRxQUg2VmJoaUU4Uk1NUVVJSnltNXNqYkdRZUg4SnV1MEQvd21LRXpPYitkRVhwQXZvNVpuQVZtR2dJTDFFeEJNQjNxZWFucm5JMGNCdndaQS92Skk2SXNYdDhMeVhVWmdEYldBZWNuVzRaaHZBUkpVT0Fza0JuOE5WVVB5NkpUVHdUU0hTTmtpU09pTEY1S1cwWk5nZFN3SDhESjZkYmhpR2NSTXNRc0RkZDNPb21nOHhsQTdEUStldnJ4UG1PMkx5VnJnQzFPWmdDSGlHQ3Ayc2I5a3pVREFGd2dWWnpoYXNjaGN4RnVac0NUcGVHRk82ZDZBV2R5MkZZUEFFbVBpbFhDZlVwYXJ1aFZXdFk1d3ljOTRpejZqd3Vrd3JWWmpCeDFrSHFYVFpEOUloaUN3R3dQOHJpYkZXbWN4aUd4V01ZTStROFVUVUVLS1Y2QXhmNVhvM044Y1I1SERqVTc3b013Uk5kUXlSWXBqYjcrVlc0enVaRWhJZUJBL3lxd3hBdW9tNklnOW1XZnNqRjd0RFpuSW55Q1Bobk9FUDRpTG9oUUxoS3F6blB5eUsxbnZPSjh5Qlp2Z0hURUR6Uk53U0FzRnlydkhsNDFlWUhLUGNEZmIwb3p4QXRjc01ROERVS3VUSFRRclNPeTRCZmtnZzdOK1FodVdJSWdHdDFCbWVrbTFsdHJrYTRsK2l1elJnOElKY01ZYUhjcGxQY2QzVzBqa25BcmVUVzkyRklnMXg3QUFaVDR1NEFZcTFqT3NKU05BUTNXaHNDSjljTUFjcFVyZVhFbEQ0Nmkzb3dKMlBrTUcrZy9OSk5CbmVHNk9KeEpQUm5teFlRNXc2MWU3L2lTMEYwRnEwb2Rka1Vac2dhbTRCcUNqbE9ScnM3ZnRUVkFGS1c4VGZnK3pxRkVjUnBBWmNuWW1TUDRiUnpBMUMvOHh0cVk5SEpDcFNmQktETDRDOXg0RDZLbUNxbDZSMHdsMWFYU1pwWngxYU9ReWtuNlB2ZWVrT28wVnFHZDM5Skw2R0FUdTVFakJseUR1RlJMSTZUS3hpYnJoa2dnekdFcktCREZ0TktKMGNBaTBtY1hoRW1pb2x6ajlxSlZsQnRpaG5LYW9Rcmd4Wm04SlMzRUVybENzNlJ5M2tsMDhJeUhsVExNajZTVm1JSXc0R0hNaTNQWTQ2amczS2RUQjg2V1FQK1I4Y2Fzc1ptb0o1T2hzc1YzbDFnNDlraWxMU3dIamhQWTF5Q01CODQzS3V5TTBLWXpUNWNCSndTdEJTREp5aHdMNTFVeVRnKzhMcHd6NmRkcFpVMURHQUlRam53aWRmbHAwRmZqQmx5aFdkUlRwT3hqUFhERE9EVE9vVFl0RXN6clJReERGZ0I1dHBhUTBhOGgzSWxZemhKcnVScFB5dnlkV0ZPNXJOUm1wa0luQVQ4d2MrNkREbkpWcUNKdmd5VnExZ3BndnBkWVZZQzJhU1o1eFMrUXdVWEF3dUF3N0pScnlIU3JFV1pMRmZ4MTJ4V21yWFFEUUdWUmF6aE03NkpVRS9DL1FiRHpyeUFjb1pjeFNnWmwxMHpRQUN4VExLQ0xiSVFtd0lHQTZ2QS8yYlFFQWsrQXNycHg3ZGxIRThFSlNLdzRENlp6N3R5RTJPQlV4QnozVzBlMHdFc3BwMGpaQnl0VWhyc0FtL2cwYTZ5a0dmb3gybk9DbkpLQjQ4WmNvWjF3TEV5bnBoTURFY0lVT0NHZ01TRmliS0FsU2hIT09PTHovZVl5UkJsTm1CeG9Zem5YQm5QRzBHTDZVNG9ESkZFRnJKWjVtTlR3RkdJZDh2eGh0RHdNY3BrL3M1Uk1vN2ZCQzJtSjBLNWYxZ2FlUXNvMVdyT2RzTE1oKzhwanlIOHlJVE1ENEx3bTFDMUVEc2pqVHhLQ2NjalRJVDBRM29OaGxRSnRTRUF4S1pUR2xtQk1BU2xDV2dQV3BNaGR3bTlJWkpJSTV0a1B0WEVPUnJDMmY4MFJKL0lHQ0tKekdlRE5ISWhjQzZFYTRiQ0VIMGlaNGdrMHNnNlB1SllKOHc4RkhQWWh1Z1RXVU9BczQxMUhxM0FFYzRGS21IYnhtcUlHSkUyUkJLNWtZL2tSbUxFT1JGNFBHZzlodWlTRTRaSUlvMjhLUE00RS9nQjhIYlFlZ3pSSTZjTWtVUWFhR01MMzBLcEJqNE5XbzhoT3VTa0lRQ2ttYTB5anlZS0dZcWFiYXlHMU1oWlF5UVJtNDNTd0VTVWt4Q2VDbHBQeFBndjR0c3Z2YzhMY3Q0UVNhU0I1NWpONlFpbHdEdEI2d2s1YndMbnl5VCtVeWJuMTFnc2J3d0J6amJXMmF5aGdHRWt6bjNkRnJTbWtQRXhTam4vWkxoTTRyZEJpd21DdkRKRUVySFpJck94c1JnRXJDSUxwem1FbkU1Z0JVVU1rY20waWsxbjBJS0NJaThOa1VSczNwWFpqS1dMczRDWGd0WVRDTW9qeERsT0pqTlJKdkxQb09VRVRWNGJJb25NNGZjSUorVFpOdGEvSUpSS0dTTWt4bXRCaXdrTHhoQU9ZaE1YbTVYQWtaRFQyMWcvUTZrSGhzdGtzeXR4WjR3aGRrSnNQaE1ibXdLR1EwNDlNSEZnRmNxUkVzT1dzcHcxZkVhRWNndHBHSkJhL2dLVWFqM25BTTFFZXh2ck15Z3hLZWVab0lXRUhkTkM3QUdaeFNNb3gwTWt0N0crQzF4SmpGT01HVkxER0NJRnhLWlQ2bGhCbktFa2Jrc0srN1RrRnFDZU9JT2xQRHVIQk9jS3hoQXVFSnVQcFk0WUJReEhlVEJvUFQyZ3dCcTYrS1pNd1pZS2MzNnVXOHdZSWcya2hqZUJDM1FPSTBpMEdNTUNsZ1RDODBCTXBwaHJCekxCdEJBWklMV3M0OHNjRS9CdHJPOGpUT1RmZk51WUlYT01JVEpFSnRJaHRiUmljUVNTMVcyczdjQmlpaGdxVTFnaHRnbHY5d0pqQ0krUUdqNlNHbUxBdDhIMzQ5elhZakZNcGhLVHNsRGM0NWN6bURHRXg4Z01YZ0RPMExtTXdxTFY0K0xmUkRoYnB2S1l4K1VhRFA2ak5pWGF5QmxCNnpDa3p2OERRZDdRck1iTFIxQUFBQUFBU1VWT1JLNUNZSUk9Ij4KCiAgCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8c3R5bGU+CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vdVlFQ01Lb0hjTzl4MXdkbWJ5SEltMy1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL3NUZGFBNmowUHNiOTIwVmp2LW1yekgtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9fVllGeC1zODI0a1hxX1VsMkJIcVlILV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by90bmo0U0I2RE5iZGFRbnNNOENGcUJYLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9vTU1nZlpNUXRoT3J5UW85bjIyZGN1dnZEaW4xcEs4YUt0ZUxwZVo1YzBBLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9Lc19jVnhpQ2l3VVdWc0ZXRkEzQmpuLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL05KNHZ4bGdXd1diRXN2MThkQWhxbm4tX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vaXNaLXdiQ1hOS0FibmpvNl9Ud0hUb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vNzdGWEZqUmJHek40YUNyU0ZobGgzb1gwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8valNOMkNHVkRiY1Z5Q25mSmZqU2RmSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9VWDZpNEp4UURtM2ZWVGMxQ1B1d3FvWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL2QtNklZcGxPRm9jQ2FjS3p4d1hTT0pCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vOTd1YWh4aXFaUm9uY0JhQ0VJM2FXNFgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL1B3WmMtWWJJTDQxNHdCOXJCMUlBUFlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0NfWnJhUjJUZzh3Mmx6bTdrTE5MMC13LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDd3RfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDMUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDNGdwOVE4Z2JZcmhxR2xSYXZfSVhmay53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDNkU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0M5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PcFhVcVRvMFVnUVFoR2pfU0ZkTFdCa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vV3hyWEphMEMzS2R0QzdsTWFmRzRkUmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL2NES2hSYVhuUVRPVmJhb3h3ZE9yOXhrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzFoWmYwMlBPQU5oMzJrMlZrZ0VvVUJrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3ZQY3luU0wwcUhxXzZkWDdsS1ZCeVhZaGpiU3B2YzQ3ZWU2eFJfODBIbncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3ZTenVsZktTSzBMTGpqZmVheGNSRWhrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vSzIzY3hXVlRySUZENkRKc0VWaTA3UmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0ZsNHkwUWRPeHl5VEhFR01YWDhrY1lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vMGVDNmZsMDZsdVhFWVdwQlNKdlhDSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9JM1Mxd3NnU2c5WUN1clY2UFVrVE9ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vLUwxNEprMDZtNnBVSEItNW1YUVFuWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0hnbzEzay10ZlNwbjBxaTFTRmRVZlpCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9QcnUzM3FqU2hwWlNtRzN6NlZZd25ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by9OWURXQmRENGdJcTI2RzVYWWJIc0ZJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdF9acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdHd0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0MUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQ5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9vSGkzMGt3UVd2cENXcUFoekhjQ1NJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vWkxxS2VlbFliQVRHNjBFcFpCU0R5NFgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL214OVVjazZ1QjYzVklLRlluRU1YcllYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL3JHdkhkSm5yMmw3NXFiMFlORDlOeUlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL1J4WkpkbnplbzNSNXpTZXhnZThVVVpCdzF4VTFyS3B0SmpfMGphbnM5MjAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL29PZUZ3Wk5sclRlZnpMWW1sVlYxVUlYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vbWJtaHByTUg2OVppNmVFUEJZVkZoWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFY0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwZlpyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBRdF9SbTY5MUxUZWJLZlkyWmtLU21JLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwVkJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFlncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBhRThrTTR4V1IxXzFiWVVSUm9qUkdjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBkRGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTE0c1lZZEpnNWRVMnF6SkVWU3V0YTAud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWV9acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWXd0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZMUJXMjZReHBTai1fWkttX3hUNGhXdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTZFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFk5RGlOc1I1YS05T2VfSXZwdThYV2xZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6MXgtTTFJMXc1T01pcW5WRjh4QkxoVS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5Rnp3WGFBWHVwNW1abGZLNnhSTHJoc2NvLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGenduNldxeG8teHd4aWxEWFBVOGNoVlUud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5RnoxVDdhSkxLNm5LcG4zNklNd1RjTU1jLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6Xzc5X1p1VXhDaWdNMkRlc3BUbkZhdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejRnZDlPRVBVQ04zQWRZVzBlOHRhdDQud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejhiSVFTWVpuV0xhV0M5UU5DcFRLX1Uud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQo8L3N0eWxlPgoKCjxzdHlsZT4KICBodG1sLAogIGJvZHkgewogICAgbWFyZ2luOiAwOwogICAgcGFkZGluZzogMDsKICAgIGhlaWdodDogMTAwJTsKICAgIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7CiAgfQo8L3N0eWxlPgoKCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIFtoaWRkZW5dIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC0tbGF5b3V0OiB7CiAgICAgICAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH07CgogICAgICAtLWxheW91dC1pbmxpbmU6IHsKICAgICAgICBkaXNwbGF5OiAtbXMtaW5saW5lLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1pbmxpbmUtZmxleDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWhvcml6b250YWw6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaG9yaXpvbnRhbC1yZXZlcnNlOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsLXJldmVyc2U6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcDogewogICAgICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcC1yZXZlcnNlOiB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LWF1dG86IHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtbm9uZTogewogICAgICAgIC1tcy1mbGV4OiBub25lOwogICAgICAgIC13ZWJraXQtZmxleDogbm9uZTsKICAgICAgICBmbGV4OiBub25lOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleDogewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMjogewogICAgICAgIC1tcy1mbGV4OiAyOwogICAgICAgIC13ZWJraXQtZmxleDogMjsKICAgICAgICBmbGV4OiAyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0zOiB7CiAgICAgICAgLW1zLWZsZXg6IDM7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAzOwogICAgICAgIGZsZXg6IDM7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTQ6IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtNTogewogICAgICAgIC1tcy1mbGV4OiA1OwogICAgICAgIC13ZWJraXQtZmxleDogNTsKICAgICAgICBmbGV4OiA1OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC02OiB7CiAgICAgICAgLW1zLWZsZXg6IDY7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA2OwogICAgICAgIGZsZXg6IDY7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTc6IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtODogewogICAgICAgIC1tcy1mbGV4OiA4OwogICAgICAgIC13ZWJraXQtZmxleDogODsKICAgICAgICBmbGV4OiA4OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC05OiB7CiAgICAgICAgLW1zLWZsZXg6IDk7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA5OwogICAgICAgIGZsZXg6IDk7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEwOiB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTExOiB7CiAgICAgICAgLW1zLWZsZXg6IDExOwogICAgICAgIC13ZWJraXQtZmxleDogMTE7CiAgICAgICAgZmxleDogMTE7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEyOiB7CiAgICAgICAgLW1zLWZsZXg6IDEyOwogICAgICAgIC13ZWJraXQtZmxleDogMTI7CiAgICAgICAgZmxleDogMTI7CiAgICAgIH07CgogICAgICAvKiBhbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcyAqLwoKICAgICAgLS1sYXlvdXQtc3RhcnQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlcjogewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1lbmQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWJhc2VsaW5lOiB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgfTsKCiAgICAgIC8qIGFsaWdubWVudCBpbiBtYWluIGF4aXMgKi8KCiAgICAgIC0tbGF5b3V0LXN0YXJ0LWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1hcm91bmQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZGlzdHJpYnV0ZTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazoganVzdGlmeTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItY2VudGVyOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfTsKCiAgICAgIC8qIHNlbGYgYWxpZ25tZW50ICovCgogICAgICAtLWxheW91dC1zZWxmLXN0YXJ0OiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zZWxmLWNlbnRlcjogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1lbmQ6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNlbGYtc3RyZXRjaDogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1iYXNlbGluZTogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9OwoKICAgICAgLyogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzICovCgogICAgICAtLWxheW91dC1zdGFydC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBzdGFydDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBlbmQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogY2VudGVyOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYmV0d2Vlbi1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBqdXN0aWZ5OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYXJvdW5kLWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGRpc3RyaWJ1dGU7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH07CgogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgT3RoZXIgTGF5b3V0CiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAtLWxheW91dC1ibG9jazogewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaW52aXNpYmxlOiB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1yZWxhdGl2ZTogewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZpdDogewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zY3JvbGw6IHsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH07CgogICAgICAtLWxheW91dC1mdWxsYmxlZWQ6IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfTsKCiAgICAgIC8qIGZpeGVkIHBvc2l0aW9uICovCgogICAgICAtLWxheW91dC1maXhlZC10b3A6IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1maXhlZC1yaWdodDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtYm90dG9tOiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtbGVmdDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItcmlwcGxlIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CgogICAgICAgIC8qIFNlZSBQb2x5bWVyRWxlbWVudHMvcGFwZXItYmVoYXZpb3JzL2lzc3Vlcy8zNC4gT24gbm9uLUNocm9tZSBicm93c2VycywKICAgICAgICAgKiBjcmVhdGluZyBhIG5vZGUgKHdpdGggYSBwb3NpdGlvbjphYnNvbHV0ZSkgaW4gdGhlIG1pZGRsZSBvZiBhbiBldmVudAogICAgICAgICAqIGhhbmRsZXIgImludGVycnVwdHMiIHRoYXQgZXZlbnQgaGFuZGxlciAod2hpY2ggaGFwcGVucyB3aGVuIHRoZQogICAgICAgICAqIHJpcHBsZSBpcyBjcmVhdGVkIG9uIGRlbWFuZCkgKi8KICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGluZ10pIHsKICAgICAgICAvKiBUaGlzIHJlc29sdmVzIGEgcmVuZGVyaW5nIGlzc3VlIGluIENocm9tZSAoYXMgb2YgNDApIHdoZXJlIHRoZQogICAgICAgICAgIHJpcHBsZSBpcyBub3QgcHJvcGVybHkgY2xpcHBlZCBieSBpdHMgcGFyZW50ICh3aGljaCBtYXkgaGF2ZQogICAgICAgICAgIHJvdW5kZWQgY29ybmVycykuIFNlZTogaHR0cDovL2pzYmluLmNvbS90ZW1leGEvNAoKICAgICAgICAgICBOb3RlOiBXZSBvbmx5IGFwcGx5IHRoaXMgc3R5bGUgY29uZGl0aW9uYWxseS4gT3RoZXJ3aXNlLCB0aGUgYnJvd3NlcgogICAgICAgICAgIHdpbGwgY3JlYXRlIGEgbmV3IGNvbXBvc2l0aW5nIGxheWVyIGZvciBldmVyeSByaXBwbGUgZWxlbWVudCBvbiB0aGUKICAgICAgICAgICBwYWdlLCBhbmQgdGhhdCB3b3VsZCBiZSBiYWQuICovCiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgwLCAwKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKDAsIDAsIDApOwogICAgICB9CgogICAgICAjYmFja2dyb3VuZCwKICAgICAgI3dhdmVzLAogICAgICAud2F2ZS1jb250YWluZXIsCiAgICAgIC53YXZlIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAjYmFja2dyb3VuZCwKICAgICAgLndhdmUgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgICN3YXZlcywKICAgICAgLndhdmUgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC53YXZlLWNvbnRhaW5lciwKICAgICAgLndhdmUgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNpcmNsZSkgI2JhY2tncm91bmQsCiAgICAgIDpob3N0KC5jaXJjbGUpICN3YXZlcyB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICA6aG9zdCguY2lyY2xlKSAud2F2ZS1jb250YWluZXIgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iYmFja2dyb3VuZCI+PC9kaXY+CiAgICA8ZGl2IGlkPSJ3YXZlcyI+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAtLXNoYWRvdy10cmFuc2l0aW9uOiB7CiAgICAgICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjI4cyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctbm9uZTogewogICAgICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICAgIH07CgogICAgICAvKiBmcm9tIGh0dHA6Ly9jb2RlcGVuLmlvL3NoeW5kbWFuL3Blbi9jNTM5NGRkZjJlOGIyYTVjOTE4NTkwNGI1NzQyMWNkYiAqLwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAxcHggNXB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tM2RwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAzcHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCA4cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi00ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDEwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi02ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDZweCAxMHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCAxOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0xMmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAxMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCA0cHggMjJweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgIDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgIDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTI0ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCwgaHRtbCB7CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbDogewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0xOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNGRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi00OiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLThkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgICB9OwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbCksIC5wYXBlci1tYXRlcmlhbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWw7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CiAgICAgIDpob3N0KC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSksIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdKSwgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0pLCAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1idXR0b24iPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgICAgIC8qIE5lZWQgdG8gc3BlY2lmeSB0aGUgc2FtZSBzcGVjaWZpY2l0eSBhcyB0aGUgc3R5bGVzIGltcG9ydGVkIGZyb20gcGFwZXItbWF0ZXJpYWwuICovCiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG1pbi13aWR0aDogNS4xNGVtOwogICAgICAgIG1hcmdpbjogMCAwLjI5ZW07CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIG91dGxpbmUtd2lkdGg6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgcGFkZGluZzogMC43ZW0gMC41N2VtOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMSJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTE7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjIiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIzIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iNCJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjUiXSkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMpIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1idXR0b24tcmFpc2VkLWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtyYWlzZWRdKS5rZXlib2FyZC1mb2N1cykgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1mbGF0LWtleWJvYXJkLWZvY3VzOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgYmFja2dyb3VuZDogI2VhZWFlYTsKICAgICAgICBjb2xvcjogI2E4YThhODsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CgogICAgICBwYXBlci1yaXBwbGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1idXR0b24taW5rLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZm9yIEdvb2dsZSBwcm9kdWN0cyAqLwoKICAgICAgLS1nb29nbGUtcmVkLTEwMDogI2Y0YzdjMzsKICAgICAgLS1nb29nbGUtcmVkLTMwMDogI2U2N2M3MzsKICAgICAgLS1nb29nbGUtcmVkLTUwMDogI2RiNDQzNzsKICAgICAgLS1nb29nbGUtcmVkLTcwMDogI2M1MzkyOTsKCiAgICAgIC0tZ29vZ2xlLWJsdWUtMTAwOiAjYzZkYWZjOwogICAgICAtLWdvb2dsZS1ibHVlLTMwMDogIzdiYWFmNzsKICAgICAgLS1nb29nbGUtYmx1ZS01MDA6ICM0Mjg1ZjQ7CiAgICAgIC0tZ29vZ2xlLWJsdWUtNzAwOiAjMzM2N2Q2OwoKICAgICAgLS1nb29nbGUtZ3JlZW4tMTAwOiAjYjdlMWNkOwogICAgICAtLWdvb2dsZS1ncmVlbi0zMDA6ICM1N2JiOGE7CiAgICAgIC0tZ29vZ2xlLWdyZWVuLTUwMDogIzBmOWQ1ODsKICAgICAgLS1nb29nbGUtZ3JlZW4tNzAwOiAjMGI4MDQzOwoKICAgICAgLS1nb29nbGUteWVsbG93LTEwMDogI2ZjZThiMjsKICAgICAgLS1nb29nbGUteWVsbG93LTMwMDogI2Y3Y2I0ZDsKICAgICAgLS1nb29nbGUteWVsbG93LTUwMDogI2Y0YjQwMDsKICAgICAgLS1nb29nbGUteWVsbG93LTcwMDogI2YwOTMwMDsKCiAgICAgIC0tZ29vZ2xlLWdyZXktMTAwOiAjZjVmNWY1OwogICAgICAtLWdvb2dsZS1ncmV5LTMwMDogI2UwZTBlMDsKICAgICAgLS1nb29nbGUtZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tZ29vZ2xlLWdyZXktNzAwOiAjNjE2MTYxOwoKICAgICAgLyogTWF0ZXJpYWwgRGVzaWduIGNvbG9yIHBhbGV0dGUgZnJvbSBvbmxpbmUgc3BlYyBkb2N1bWVudCAqLwoKICAgICAgLS1wYXBlci1yZWQtNTA6ICNmZmViZWU7CiAgICAgIC0tcGFwZXItcmVkLTEwMDogI2ZmY2RkMjsKICAgICAgLS1wYXBlci1yZWQtMjAwOiAjZWY5YTlhOwogICAgICAtLXBhcGVyLXJlZC0zMDA6ICNlNTczNzM7CiAgICAgIC0tcGFwZXItcmVkLTQwMDogI2VmNTM1MDsKICAgICAgLS1wYXBlci1yZWQtNTAwOiAjZjQ0MzM2OwogICAgICAtLXBhcGVyLXJlZC02MDA6ICNlNTM5MzU7CiAgICAgIC0tcGFwZXItcmVkLTcwMDogI2QzMmYyZjsKICAgICAgLS1wYXBlci1yZWQtODAwOiAjYzYyODI4OwogICAgICAtLXBhcGVyLXJlZC05MDA6ICNiNzFjMWM7CiAgICAgIC0tcGFwZXItcmVkLWExMDA6ICNmZjhhODA7CiAgICAgIC0tcGFwZXItcmVkLWEyMDA6ICNmZjUyNTI7CiAgICAgIC0tcGFwZXItcmVkLWE0MDA6ICNmZjE3NDQ7CiAgICAgIC0tcGFwZXItcmVkLWE3MDA6ICNkNTAwMDA7CgogICAgICAtLXBhcGVyLXBpbmstNTA6ICNmY2U0ZWM7CiAgICAgIC0tcGFwZXItcGluay0xMDA6ICNmOGJiZDA7CiAgICAgIC0tcGFwZXItcGluay0yMDA6ICNmNDhmYjE7CiAgICAgIC0tcGFwZXItcGluay0zMDA6ICNmMDYyOTI7CiAgICAgIC0tcGFwZXItcGluay00MDA6ICNlYzQwN2E7CiAgICAgIC0tcGFwZXItcGluay01MDA6ICNlOTFlNjM7CiAgICAgIC0tcGFwZXItcGluay02MDA6ICNkODFiNjA7CiAgICAgIC0tcGFwZXItcGluay03MDA6ICNjMjE4NWI7CiAgICAgIC0tcGFwZXItcGluay04MDA6ICNhZDE0NTc7CiAgICAgIC0tcGFwZXItcGluay05MDA6ICM4ODBlNGY7CiAgICAgIC0tcGFwZXItcGluay1hMTAwOiAjZmY4MGFiOwogICAgICAtLXBhcGVyLXBpbmstYTIwMDogI2ZmNDA4MTsKICAgICAgLS1wYXBlci1waW5rLWE0MDA6ICNmNTAwNTc7CiAgICAgIC0tcGFwZXItcGluay1hNzAwOiAjYzUxMTYyOwoKICAgICAgLS1wYXBlci1wdXJwbGUtNTA6ICNmM2U1ZjU7CiAgICAgIC0tcGFwZXItcHVycGxlLTEwMDogI2UxYmVlNzsKICAgICAgLS1wYXBlci1wdXJwbGUtMjAwOiAjY2U5M2Q4OwogICAgICAtLXBhcGVyLXB1cnBsZS0zMDA6ICNiYTY4Yzg7CiAgICAgIC0tcGFwZXItcHVycGxlLTQwMDogI2FiNDdiYzsKICAgICAgLS1wYXBlci1wdXJwbGUtNTAwOiAjOWMyN2IwOwogICAgICAtLXBhcGVyLXB1cnBsZS02MDA6ICM4ZTI0YWE7CiAgICAgIC0tcGFwZXItcHVycGxlLTcwMDogIzdiMWZhMjsKICAgICAgLS1wYXBlci1wdXJwbGUtODAwOiAjNmExYjlhOwogICAgICAtLXBhcGVyLXB1cnBsZS05MDA6ICM0YTE0OGM7CiAgICAgIC0tcGFwZXItcHVycGxlLWExMDA6ICNlYTgwZmM7CiAgICAgIC0tcGFwZXItcHVycGxlLWEyMDA6ICNlMDQwZmI7CiAgICAgIC0tcGFwZXItcHVycGxlLWE0MDA6ICNkNTAwZjk7CiAgICAgIC0tcGFwZXItcHVycGxlLWE3MDA6ICNhYTAwZmY7CgogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTUwOiAjZWRlN2Y2OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTEwMDogI2QxYzRlOTsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS0yMDA6ICNiMzlkZGI7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtMzAwOiAjOTU3NWNkOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTQwMDogIzdlNTdjMjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS01MDA6ICM2NzNhYjc7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNjAwOiAjNWUzNWIxOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTcwMDogIzUxMmRhODsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS04MDA6ICM0NTI3YTA7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtOTAwOiAjMzExYjkyOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWExMDA6ICNiMzg4ZmY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTIwMDogIzdjNGRmZjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS1hNDAwOiAjNjUxZmZmOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWE3MDA6ICM2MjAwZWE7CgogICAgICAtLXBhcGVyLWluZGlnby01MDogI2U4ZWFmNjsKICAgICAgLS1wYXBlci1pbmRpZ28tMTAwOiAjYzVjYWU5OwogICAgICAtLXBhcGVyLWluZGlnby0yMDA6ICM5ZmE4ZGE7CiAgICAgIC0tcGFwZXItaW5kaWdvLTMwMDogIzc5ODZjYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNDAwOiAjNWM2YmMwOwogICAgICAtLXBhcGVyLWluZGlnby01MDA6ICMzZjUxYjU7CiAgICAgIC0tcGFwZXItaW5kaWdvLTYwMDogIzM5NDlhYjsKICAgICAgLS1wYXBlci1pbmRpZ28tNzAwOiAjMzAzZjlmOwogICAgICAtLXBhcGVyLWluZGlnby04MDA6ICMyODM1OTM7CiAgICAgIC0tcGFwZXItaW5kaWdvLTkwMDogIzFhMjM3ZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTEwMDogIzhjOWVmZjsKICAgICAgLS1wYXBlci1pbmRpZ28tYTIwMDogIzUzNmRmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTQwMDogIzNkNWFmZTsKICAgICAgLS1wYXBlci1pbmRpZ28tYTcwMDogIzMwNGZmZTsKCiAgICAgIC0tcGFwZXItYmx1ZS01MDogI2UzZjJmZDsKICAgICAgLS1wYXBlci1ibHVlLTEwMDogI2JiZGVmYjsKICAgICAgLS1wYXBlci1ibHVlLTIwMDogIzkwY2FmOTsKICAgICAgLS1wYXBlci1ibHVlLTMwMDogIzY0YjVmNjsKICAgICAgLS1wYXBlci1ibHVlLTQwMDogIzQyYTVmNTsKICAgICAgLS1wYXBlci1ibHVlLTUwMDogIzIxOTZmMzsKICAgICAgLS1wYXBlci1ibHVlLTYwMDogIzFlODhlNTsKICAgICAgLS1wYXBlci1ibHVlLTcwMDogIzE5NzZkMjsKICAgICAgLS1wYXBlci1ibHVlLTgwMDogIzE1NjVjMDsKICAgICAgLS1wYXBlci1ibHVlLTkwMDogIzBkNDdhMTsKICAgICAgLS1wYXBlci1ibHVlLWExMDA6ICM4MmIxZmY7CiAgICAgIC0tcGFwZXItYmx1ZS1hMjAwOiAjNDQ4YWZmOwogICAgICAtLXBhcGVyLWJsdWUtYTQwMDogIzI5NzlmZjsKICAgICAgLS1wYXBlci1ibHVlLWE3MDA6ICMyOTYyZmY7CgogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNTA6ICNlMWY1ZmU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0xMDA6ICNiM2U1ZmM7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0yMDA6ICM4MWQ0ZmE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS0zMDA6ICM0ZmMzZjc7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS00MDA6ICMyOWI2ZjY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS01MDA6ICMwM2E5ZjQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS02MDA6ICMwMzliZTU7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS03MDA6ICMwMjg4ZDE7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS04MDA6ICMwMjc3YmQ7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS05MDA6ICMwMTU3OWI7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hMTAwOiAjODBkOGZmOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtYTIwMDogIzQwYzRmZjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWE0MDA6ICMwMGIwZmY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hNzAwOiAjMDA5MWVhOwoKICAgICAgLS1wYXBlci1jeWFuLTUwOiAjZTBmN2ZhOwogICAgICAtLXBhcGVyLWN5YW4tMTAwOiAjYjJlYmYyOwogICAgICAtLXBhcGVyLWN5YW4tMjAwOiAjODBkZWVhOwogICAgICAtLXBhcGVyLWN5YW4tMzAwOiAjNGRkMGUxOwogICAgICAtLXBhcGVyLWN5YW4tNDAwOiAjMjZjNmRhOwogICAgICAtLXBhcGVyLWN5YW4tNTAwOiAjMDBiY2Q0OwogICAgICAtLXBhcGVyLWN5YW4tNjAwOiAjMDBhY2MxOwogICAgICAtLXBhcGVyLWN5YW4tNzAwOiAjMDA5N2E3OwogICAgICAtLXBhcGVyLWN5YW4tODAwOiAjMDA4MzhmOwogICAgICAtLXBhcGVyLWN5YW4tOTAwOiAjMDA2MDY0OwogICAgICAtLXBhcGVyLWN5YW4tYTEwMDogIzg0ZmZmZjsKICAgICAgLS1wYXBlci1jeWFuLWEyMDA6ICMxOGZmZmY7CiAgICAgIC0tcGFwZXItY3lhbi1hNDAwOiAjMDBlNWZmOwogICAgICAtLXBhcGVyLWN5YW4tYTcwMDogIzAwYjhkNDsKCiAgICAgIC0tcGFwZXItdGVhbC01MDogI2UwZjJmMTsKICAgICAgLS1wYXBlci10ZWFsLTEwMDogI2IyZGZkYjsKICAgICAgLS1wYXBlci10ZWFsLTIwMDogIzgwY2JjNDsKICAgICAgLS1wYXBlci10ZWFsLTMwMDogIzRkYjZhYzsKICAgICAgLS1wYXBlci10ZWFsLTQwMDogIzI2YTY5YTsKICAgICAgLS1wYXBlci10ZWFsLTUwMDogIzAwOTY4ODsKICAgICAgLS1wYXBlci10ZWFsLTYwMDogIzAwODk3YjsKICAgICAgLS1wYXBlci10ZWFsLTcwMDogIzAwNzk2YjsKICAgICAgLS1wYXBlci10ZWFsLTgwMDogIzAwNjk1YzsKICAgICAgLS1wYXBlci10ZWFsLTkwMDogIzAwNGQ0MDsKICAgICAgLS1wYXBlci10ZWFsLWExMDA6ICNhN2ZmZWI7CiAgICAgIC0tcGFwZXItdGVhbC1hMjAwOiAjNjRmZmRhOwogICAgICAtLXBhcGVyLXRlYWwtYTQwMDogIzFkZTliNjsKICAgICAgLS1wYXBlci10ZWFsLWE3MDA6ICMwMGJmYTU7CgogICAgICAtLXBhcGVyLWdyZWVuLTUwOiAjZThmNWU5OwogICAgICAtLXBhcGVyLWdyZWVuLTEwMDogI2M4ZTZjOTsKICAgICAgLS1wYXBlci1ncmVlbi0yMDA6ICNhNWQ2YTc7CiAgICAgIC0tcGFwZXItZ3JlZW4tMzAwOiAjODFjNzg0OwogICAgICAtLXBhcGVyLWdyZWVuLTQwMDogIzY2YmI2YTsKICAgICAgLS1wYXBlci1ncmVlbi01MDA6ICM0Y2FmNTA7CiAgICAgIC0tcGFwZXItZ3JlZW4tNjAwOiAjNDNhMDQ3OwogICAgICAtLXBhcGVyLWdyZWVuLTcwMDogIzM4OGUzYzsKICAgICAgLS1wYXBlci1ncmVlbi04MDA6ICMyZTdkMzI7CiAgICAgIC0tcGFwZXItZ3JlZW4tOTAwOiAjMWI1ZTIwOwogICAgICAtLXBhcGVyLWdyZWVuLWExMDA6ICNiOWY2Y2E7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTIwMDogIzY5ZjBhZTsKICAgICAgLS1wYXBlci1ncmVlbi1hNDAwOiAjMDBlNjc2OwogICAgICAtLXBhcGVyLWdyZWVuLWE3MDA6ICMwMGM4NTM7CgogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTUwOiAjZjFmOGU5OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTEwMDogI2RjZWRjODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi0yMDA6ICNjNWUxYTU7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tMzAwOiAjYWVkNTgxOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTQwMDogIzljY2M2NTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi01MDA6ICM4YmMzNGE7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNjAwOiAjN2NiMzQyOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTcwMDogIzY4OWYzODsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi04MDA6ICM1NThiMmY7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tOTAwOiAjMzM2OTFlOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWExMDA6ICNjY2ZmOTA7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTIwMDogI2IyZmY1OTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi1hNDAwOiAjNzZmZjAzOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWE3MDA6ICM2NGRkMTc7CgogICAgICAtLXBhcGVyLWxpbWUtNTA6ICNmOWZiZTc7CiAgICAgIC0tcGFwZXItbGltZS0xMDA6ICNmMGY0YzM7CiAgICAgIC0tcGFwZXItbGltZS0yMDA6ICNlNmVlOWM7CiAgICAgIC0tcGFwZXItbGltZS0zMDA6ICNkY2U3NzU7CiAgICAgIC0tcGFwZXItbGltZS00MDA6ICNkNGUxNTc7CiAgICAgIC0tcGFwZXItbGltZS01MDA6ICNjZGRjMzk7CiAgICAgIC0tcGFwZXItbGltZS02MDA6ICNjMGNhMzM7CiAgICAgIC0tcGFwZXItbGltZS03MDA6ICNhZmI0MmI7CiAgICAgIC0tcGFwZXItbGltZS04MDA6ICM5ZTlkMjQ7CiAgICAgIC0tcGFwZXItbGltZS05MDA6ICM4Mjc3MTc7CiAgICAgIC0tcGFwZXItbGltZS1hMTAwOiAjZjRmZjgxOwogICAgICAtLXBhcGVyLWxpbWUtYTIwMDogI2VlZmY0MTsKICAgICAgLS1wYXBlci1saW1lLWE0MDA6ICNjNmZmMDA7CiAgICAgIC0tcGFwZXItbGltZS1hNzAwOiAjYWVlYTAwOwoKICAgICAgLS1wYXBlci15ZWxsb3ctNTA6ICNmZmZkZTc7CiAgICAgIC0tcGFwZXIteWVsbG93LTEwMDogI2ZmZjljNDsKICAgICAgLS1wYXBlci15ZWxsb3ctMjAwOiAjZmZmNTlkOwogICAgICAtLXBhcGVyLXllbGxvdy0zMDA6ICNmZmYxNzY7CiAgICAgIC0tcGFwZXIteWVsbG93LTQwMDogI2ZmZWU1ODsKICAgICAgLS1wYXBlci15ZWxsb3ctNTAwOiAjZmZlYjNiOwogICAgICAtLXBhcGVyLXllbGxvdy02MDA6ICNmZGQ4MzU7CiAgICAgIC0tcGFwZXIteWVsbG93LTcwMDogI2ZiYzAyZDsKICAgICAgLS1wYXBlci15ZWxsb3ctODAwOiAjZjlhODI1OwogICAgICAtLXBhcGVyLXllbGxvdy05MDA6ICNmNTdmMTc7CiAgICAgIC0tcGFwZXIteWVsbG93LWExMDA6ICNmZmZmOGQ7CiAgICAgIC0tcGFwZXIteWVsbG93LWEyMDA6ICNmZmZmMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE0MDA6ICNmZmVhMDA7CiAgICAgIC0tcGFwZXIteWVsbG93LWE3MDA6ICNmZmQ2MDA7CgogICAgICAtLXBhcGVyLWFtYmVyLTUwOiAjZmZmOGUxOwogICAgICAtLXBhcGVyLWFtYmVyLTEwMDogI2ZmZWNiMzsKICAgICAgLS1wYXBlci1hbWJlci0yMDA6ICNmZmUwODI7CiAgICAgIC0tcGFwZXItYW1iZXItMzAwOiAjZmZkNTRmOwogICAgICAtLXBhcGVyLWFtYmVyLTQwMDogI2ZmY2EyODsKICAgICAgLS1wYXBlci1hbWJlci01MDA6ICNmZmMxMDc7CiAgICAgIC0tcGFwZXItYW1iZXItNjAwOiAjZmZiMzAwOwogICAgICAtLXBhcGVyLWFtYmVyLTcwMDogI2ZmYTAwMDsKICAgICAgLS1wYXBlci1hbWJlci04MDA6ICNmZjhmMDA7CiAgICAgIC0tcGFwZXItYW1iZXItOTAwOiAjZmY2ZjAwOwogICAgICAtLXBhcGVyLWFtYmVyLWExMDA6ICNmZmU1N2Y7CiAgICAgIC0tcGFwZXItYW1iZXItYTIwMDogI2ZmZDc0MDsKICAgICAgLS1wYXBlci1hbWJlci1hNDAwOiAjZmZjNDAwOwogICAgICAtLXBhcGVyLWFtYmVyLWE3MDA6ICNmZmFiMDA7CgogICAgICAtLXBhcGVyLW9yYW5nZS01MDogI2ZmZjNlMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtMTAwOiAjZmZlMGIyOwogICAgICAtLXBhcGVyLW9yYW5nZS0yMDA6ICNmZmNjODA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTMwMDogI2ZmYjc0ZDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNDAwOiAjZmZhNzI2OwogICAgICAtLXBhcGVyLW9yYW5nZS01MDA6ICNmZjk4MDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTYwMDogI2ZiOGMwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtNzAwOiAjZjU3YzAwOwogICAgICAtLXBhcGVyLW9yYW5nZS04MDA6ICNlZjZjMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTkwMDogI2U2NTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTEwMDogI2ZmZDE4MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTIwMDogI2ZmYWI0MDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTQwMDogI2ZmOTEwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtYTcwMDogI2ZmNjUwMDsKCiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNTA6ICNmYmU5ZTc7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtMTAwOiAjZmZjY2JjOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTIwMDogI2ZmYWI5MTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS0zMDA6ICNmZjhhNjU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNDAwOiAjZmY3MDQzOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTUwMDogI2ZmNTcyMjsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS02MDA6ICNmNDUxMWU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNzAwOiAjZTY0YTE5OwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTgwMDogI2Q4NDMxNTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS05MDA6ICNiZjM2MGM7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTEwMDogI2ZmOWU4MDsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hMjAwOiAjZmY2ZTQwOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLWE0MDA6ICNmZjNkMDA7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMDogI2RkMmMwMDsKCiAgICAgIC0tcGFwZXItYnJvd24tNTA6ICNlZmViZTk7CiAgICAgIC0tcGFwZXItYnJvd24tMTAwOiAjZDdjY2M4OwogICAgICAtLXBhcGVyLWJyb3duLTIwMDogI2JjYWFhNDsKICAgICAgLS1wYXBlci1icm93bi0zMDA6ICNhMTg4N2Y7CiAgICAgIC0tcGFwZXItYnJvd24tNDAwOiAjOGQ2ZTYzOwogICAgICAtLXBhcGVyLWJyb3duLTUwMDogIzc5NTU0ODsKICAgICAgLS1wYXBlci1icm93bi02MDA6ICM2ZDRjNDE7CiAgICAgIC0tcGFwZXItYnJvd24tNzAwOiAjNWQ0MDM3OwogICAgICAtLXBhcGVyLWJyb3duLTgwMDogIzRlMzQyZTsKICAgICAgLS1wYXBlci1icm93bi05MDA6ICMzZTI3MjM7CgogICAgICAtLXBhcGVyLWdyZXktNTA6ICNmYWZhZmE7CiAgICAgIC0tcGFwZXItZ3JleS0xMDA6ICNmNWY1ZjU7CiAgICAgIC0tcGFwZXItZ3JleS0yMDA6ICNlZWVlZWU7CiAgICAgIC0tcGFwZXItZ3JleS0zMDA6ICNlMGUwZTA7CiAgICAgIC0tcGFwZXItZ3JleS00MDA6ICNiZGJkYmQ7CiAgICAgIC0tcGFwZXItZ3JleS01MDA6ICM5ZTllOWU7CiAgICAgIC0tcGFwZXItZ3JleS02MDA6ICM3NTc1NzU7CiAgICAgIC0tcGFwZXItZ3JleS03MDA6ICM2MTYxNjE7CiAgICAgIC0tcGFwZXItZ3JleS04MDA6ICM0MjQyNDI7CiAgICAgIC0tcGFwZXItZ3JleS05MDA6ICMyMTIxMjE7CgogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDogI2VjZWZmMTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktMTAwOiAjY2ZkOGRjOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS0yMDA6ICNiMGJlYzU7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTMwMDogIzkwYTRhZTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNDAwOiAjNzg5MDljOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS01MDA6ICM2MDdkOGI7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTYwMDogIzU0NmU3YTsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNzAwOiAjNDU1YTY0OwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS04MDA6ICMzNzQ3NGY7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTkwMDogIzI2MzIzODsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGRhcmsgdGV4dCBvbiBhIGxpZ2h0IGJhY2tncm91bmQgKi8KICAgICAgLS1kYXJrLWRpdmlkZXItb3BhY2l0eTogMC4xMjsKICAgICAgLS1kYXJrLWRpc2FibGVkLW9wYWNpdHk6IDAuMzg7IC8qIG9yIGhpbnQgdGV4dCBvciBpY29uICovCiAgICAgIC0tZGFyay1zZWNvbmRhcnktb3BhY2l0eTogMC41NDsKICAgICAgLS1kYXJrLXByaW1hcnktb3BhY2l0eTogMC44NzsKCiAgICAgIC8qIG9wYWNpdHkgZm9yIGxpZ2h0IHRleHQgb24gYSBkYXJrIGJhY2tncm91bmQgKi8KICAgICAgLS1saWdodC1kaXZpZGVyLW9wYWNpdHk6IDAuMTI7CiAgICAgIC0tbGlnaHQtZGlzYWJsZWQtb3BhY2l0eTogMC4zOyAvKiBvciBoaW50IHRleHQgb3IgaWNvbiAqLwogICAgICAtLWxpZ2h0LXNlY29uZGFyeS1vcGFjaXR5OiAwLjc7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1vcGFjaXR5OiAxLjA7CgogICAgfQoKICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCgoKCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CiAgICAgIC8qCiAgICAgICAqIFlvdSBjYW4gdXNlIHRoZXNlIGdlbmVyaWMgdmFyaWFibGVzIGluIHlvdXIgZWxlbWVudHMgZm9yIGVhc3kgdGhlbWluZy4KICAgICAgICogRm9yIGV4YW1wbGUsIGlmIGFsbCB5b3VyIGVsZW1lbnRzIHVzZSBgLS1wcmltYXJ5LXRleHQtY29sb3JgIGFzIGl0cyBtYWluCiAgICAgICAqIGNvbG9yLCB0aGVuIHN3aXRjaGluZyBmcm9tIGEgbGlnaHQgdG8gYSBkYXJrIHRoZW1lIGlzIGp1c3QgYSBtYXR0ZXIgb2YKICAgICAgICogY2hhbmdpbmcgdGhlIHZhbHVlIG9mIGAtLXByaW1hcnktdGV4dC1jb2xvcmAgaW4geW91ciBhcHBsaWNhdGlvbi4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS10ZXh0LWNvbG9yKTsKICAgICAgLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWJhY2tncm91bmQtY29sb3IpOwogICAgICAtLXNlY29uZGFyeS10ZXh0LWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1zZWNvbmRhcnktY29sb3IpOwogICAgICAtLWRpc2FibGVkLXRleHQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWRpc2FibGVkLWNvbG9yKTsKICAgICAgLS1kaXZpZGVyLWNvbG9yOiB2YXIoLS1saWdodC10aGVtZS1kaXZpZGVyLWNvbG9yKTsKICAgICAgLS1lcnJvci1jb2xvcjogdmFyKC0tcGFwZXItZGVlcC1vcmFuZ2UtYTcwMCk7CgogICAgICAvKgogICAgICAgKiBQcmltYXJ5IGFuZCBhY2NlbnQgY29sb3JzLiBBbHNvIHNlZSBjb2xvci5odG1sIGZvciBtb3JlIGNvbG9ycy4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTEwMCk7CiAgICAgIC0tZGFyay1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNzAwKTsKCiAgICAgIC0tYWNjZW50LWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLWEyMDApOwogICAgICAtLWxpZ2h0LWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hMTAwKTsKICAgICAgLS1kYXJrLWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hNDAwKTsKCgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gTGlnaHQgYmFja2dyb3VuZCB0aGVtZQogICAgICAgKi8KICAgICAgLS1saWdodC10aGVtZS1iYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwogICAgICAtLWxpZ2h0LXRoZW1lLWJhc2UtY29sb3I6ICMwMDAwMDA7CiAgICAgIC0tbGlnaHQtdGhlbWUtdGV4dC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWxpZ2h0LXRoZW1lLXNlY29uZGFyeS1jb2xvcjogIzczNzM3MzsgIC8qIGZvciBzZWNvbmRhcnkgdGV4dCBhbmQgaWNvbnMgKi8KICAgICAgLS1saWdodC10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzliOWI5YjsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWxpZ2h0LXRoZW1lLWRpdmlkZXItY29sb3I6ICNkYmRiZGI7CgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gRGFyayBiYWNrZ3JvdW5kIHRoZW1lCiAgICAgICAqLwogICAgICAtLWRhcmstdGhlbWUtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWRhcmstdGhlbWUtYmFzZS1jb2xvcjogI2ZmZmZmZjsKICAgICAgLS1kYXJrLXRoZW1lLXRleHQtY29sb3I6ICNmZmZmZmY7CiAgICAgIC0tZGFyay10aGVtZS1zZWNvbmRhcnktY29sb3I6ICNiY2JjYmM7ICAvKiBmb3Igc2Vjb25kYXJ5IHRleHQgYW5kIGljb25zICovCiAgICAgIC0tZGFyay10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzY0NjQ2NDsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWRhcmstdGhlbWUtZGl2aWRlci1jb2xvcjogIzNjM2MzYzsKCiAgICAgIC8qCiAgICAgICAqIERlcHJlY2F0ZWQgdmFsdWVzIGJlY2F1c2Ugb2YgdGhlaXIgY29uZnVzaW5nIG5hbWVzLgogICAgICAgKi8KICAgICAgLS10ZXh0LXByaW1hcnktY29sb3I6IHZhcigtLWRhcmstdGhlbWUtdGV4dC1jb2xvcik7CiAgICAgIC0tZGVmYXVsdC1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItY2hlY2tib3giPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplOiB2YXIoLS1wYXBlci1jaGVja2JveC1zaXplLCAxOHB4KTsKICAgICAgICAvKiAtMXB4IGlzIGEgc2VudGluZWwgZm9yIHRoZSBkZWZhdWx0IGFuZCBpcyByZXBsYWNlZCBpbiBgYXR0YWNoZWRgLiAqLwogICAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZTogdmFyKC0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUsIC0xcHgpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5oaWRkZW4gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgICNjaGVja2JveENvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICAgICAgbWluLXdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpOwogICAgICAgIG1hcmdpbjogdmFyKC0tcGFwZXItY2hlY2tib3gtbWFyZ2luLCBpbml0aWFsKTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdmFyKC0tcGFwZXItY2hlY2tib3gtdmVydGljYWwtYWxpZ24sIG1pZGRsZSk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWJhY2tncm91bmQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgfQoKICAgICAgI2luayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwoKICAgICAgICAvKiBDZW50ZXIgdGhlIHJpcHBsZSBpbiB0aGUgY2hlY2tib3ggYnkgbmVnYXRpdmUgb2Zmc2V0dGluZyBpdCBieQogICAgICAgICAqIChpbmtXaWR0aCAtIHJpcHBsZVdpZHRoKSAvIDIgKi8KICAgICAgICB0b3A6IGNhbGMoMHB4IC0gKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpIC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSkgLyAyKTsKICAgICAgICBsZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKSAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpIC8gMik7CiAgICAgICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgI2luazpkaXIocnRsKSB7CiAgICAgICAgcmlnaHQ6IGNhbGMoMHB4IC0gKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpIC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSkgLyAyKTsKICAgICAgICBsZWZ0OiBhdXRvOwogICAgICB9CgogICAgICAjaW5rW2NoZWNrZWRdIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQoKICAgICAgI2NoZWNrYm94IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYm9yZGVyOiBzb2xpZCAycHg7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTQwbXMsIGJvcmRlci1jb2xvciAxNDBtczsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIDE0MG1zLCBib3JkZXItY29sb3IgMTQwbXM7CiAgICAgIH0KCiAgICAgIC8qIGNoZWNrYm94IGNoZWNrZWQgYW5pbWF0aW9ucyAqLwogICAgICAjY2hlY2tib3guY2hlY2tlZCAjY2hlY2ttYXJrIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogY2hlY2ttYXJrLWV4cGFuZCAxNDBtcyBlYXNlLW91dCBmb3J3YXJkczsKICAgICAgICBhbmltYXRpb246IGNoZWNrbWFyay1leHBhbmQgMTQwbXMgZWFzZS1vdXQgZm9yd2FyZHM7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBjaGVja21hcmstZXhwYW5kIHsKICAgICAgICAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCwgMCkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgY2hlY2ttYXJrLWV4cGFuZCB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLCAwKSByb3RhdGUoNDVkZWcpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNjaGVja2JveC5jaGVja2VkIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgICNjaGVja21hcmsgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMzYlOwogICAgICAgIGhlaWdodDogNzAlOwogICAgICAgIGJvcmRlci1zdHlsZTogc29saWQ7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgICBib3JkZXItbGVmdDogbm9uZTsKICAgICAgICBib3JkZXItcmlnaHQtd2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgICAgIGJvcmRlci1ib3R0b20td2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2ttYXJrLWNvbG9yLCB3aGl0ZSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA5NyUgODYlOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDk3JSA4NiU7CiAgICAgICAgYm94LXNpemluZzogY29udGVudC1ib3g7IC8qIHByb3RlY3QgYWdhaW5zdCBwYWdlLWxldmVsIGJveC1zaXppbmcgKi8KICAgICAgfQoKICAgICAgI2NoZWNrbWFyazpkaXIocnRsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTQlOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDUwJSAxNCU7CiAgICAgIH0KCiAgICAgIC8qIGxhYmVsICovCiAgICAgICNjaGVja2JveExhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1zcGFjaW5nLCA4cHgpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWNoZWNrYm94LWxhYmVsOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNjaGVja2JveExhYmVsIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY2hlY2tlZC1jb2xvciwgdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1jaGVja2JveC1sYWJlbC1jaGVja2VkOwogICAgICB9CgogICAgICAjY2hlY2tib3hMYWJlbDpkaXIocnRsKSB7CiAgICAgICAgcGFkZGluZy1yaWdodDogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtc3BhY2luZywgOHB4KTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgICAgIH0KCiAgICAgICNjaGVja2JveExhYmVsW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIGRpc2FibGVkIHN0YXRlICovCgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjY2hlY2tib3ggewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF1bY2hlY2tlZF0pICNjaGVja2JveCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNjaGVja2JveExhYmVsICB7CiAgICAgICAgb3BhY2l0eTogMC42NTsKICAgICAgfQoKICAgICAgLyogaW52YWxpZCBzdGF0ZSAqLwogICAgICAjY2hlY2tib3guaW52YWxpZDpub3QoLmNoZWNrZWQpIHsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWVycm9yLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9ImNoZWNrYm94Q29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0iY2hlY2tib3giIGNsYXNzJD0iW1tfY29tcHV0ZUNoZWNrYm94Q2xhc3MoY2hlY2tlZCwgaW52YWxpZCldXSI+CiAgICAgICAgPGRpdiBpZD0iY2hlY2ttYXJrIiBjbGFzcyQ9IltbX2NvbXB1dGVDaGVja21hcmtDbGFzcyhjaGVja2VkKV1dIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjaGVja2JveExhYmVsIj48c2xvdD48L3Nsb3Q+PC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24taWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CgogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIGZpbGw6IHZhcigtLWlyb24taWNvbi1maWxsLWNvbG9yLCBjdXJyZW50Y29sb3IpOwogICAgICAgIHN0cm9rZTogdmFyKC0taXJvbi1pY29uLXN0cm9rZS1jb2xvciwgbm9uZSk7CgogICAgICAgIHdpZHRoOiB2YXIoLS1pcm9uLWljb24td2lkdGgsIDI0cHgpOwogICAgICAgIGhlaWdodDogdmFyKC0taXJvbi1pY29uLWhlaWdodCwgMjRweCk7CiAgICAgICAgQGFwcGx5IC0taXJvbi1pY29uOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWExMXktYW5ub3VuY2VyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIGNsaXA6IHJlY3QoMHB4LDBweCwwcHgsMHB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgYXJpYS1saXZlJD0iW1ttb2RlXV0iPltbX3RleHRdXTwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24taW5wdXQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJjb250ZW50Ij48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewoKICAgICAgLyogU2hhcmVkIFN0eWxlcyAqLwogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U6IHsKICAgICAgICBmb250LWZhbWlseTogJ1JvYm90bycsICdOb3RvJywgc2Fucy1zZXJpZjsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tY29kZTogewogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCAnQ29uc29sYXMnLCAnTWVubG8nLCBtb25vc3BhY2U7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWV4cGVuc2l2ZS1rZXJuaW5nOiB7CiAgICAgICAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOiB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9OwoKICAgICAgLyogTWF0ZXJpYWwgRm9udCBTdHlsZXMgKi8KCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5NDogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDExMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDQ0ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDEyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkzOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogNTZweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAyNmVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA2MHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiA0NXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDE4ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDQ4cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDM0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA0MHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWhlYWRsaW5lOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAyNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDEyZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDMycHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtdGl0bGU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI4cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtc3ViaGVhZDogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMTZweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWJvZHkyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYm9keTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jYXB0aW9uOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxMWVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LW1lbnU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYnV0dG9uOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAxOGVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29kZTI6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1jb2RlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb2RlMTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWNvZGU7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgIH0KCiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWlucHV0LWNoYXItY291bnRlciI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZsb2F0OiByaWdodDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNoYXItY291bnRlcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpkaXIocnRsKSkgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzcGFuPltbX2NoYXJDb3VudGVyU3RyXV08L3NwYW4+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItc2hhcmVkLWlucHV0LXN0eWxlOiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiB0byBtYWtlIGEgc3RhY2tpbmcgY29udGV4dCAqLwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgfTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dC1jb250YWluZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2lubGluZV0pIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBvcGFjaXR5OiAwLjMzOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICB9CgogICAgICAudW5kZXJsaW5lIHsKICAgICAgICBoZWlnaHQ6IDJweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLDEsMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAsMSwxKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1mb2N1czsKICAgICAgfQoKICAgICAgLnVuZGVybGluZS5pcy1oaWdobGlnaHRlZCAuZm9jdXNlZC1saW5lIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5kZXJsaW5lLmlzLWludmFsaWQgLmZvY3VzZWQtbGluZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW52YWxpZC1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQ7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgLmlucHV0LXdyYXBwZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMjVzLCB3aWR0aCAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXMsIHdpZHRoIDAuMjVzOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgLyogRml4IGZvciBzYWZhcmkgbm90IGZvY3VzaW5nIDAtaGVpZ2h0IGRhdGUvdGltZSBpbnB1dHMgd2l0aCAtd2Via2l0LWFwcGVyYW5jZTogbm9uZTsgKi8KICAgICAgICBtaW4taGVpZ2h0OiAxcHg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTc1JSkgc2NhbGUoMC43NSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03NSUpIHNjYWxlKDAuNzUpOwoKICAgICAgICAvKiBTaW5jZSB3ZSBzY2FsZSB0byA3NS8xMDAgb2YgdGhlIHNpemUsIHdlIGFjdHVhbGx5IGhhdmUgMTAwLzc1IG9mIHRoZQogICAgICAgIG9yaWdpbmFsIHNwYWNlIG5vdyBhdmFpbGFibGUgKi8KICAgICAgICB3aWR0aDogMTMzJTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWZsb2F0aW5nOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWZsb2F0aW5nIDo6c2xvdHRlZChsYWJlbCksCiAgICAgIDpob3N0KDpkaXIocnRsKSkgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtZmxvYXRpbmcgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGxlZnQ6IGF1dG87CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWRkZW4gOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtaGlkZGVuIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpcm9uLWlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWlucHV0KSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZTsKICAgICAgICAvKiBUaGUgYXBwbHkgc2hpbSBkb2Vzbid0IGFwcGx5IHRoZSBuZXN0ZWQgY29sb3IgY3VzdG9tIHByb3BlcnR5LAogICAgICAgICAgc28gd2UgaGF2ZSB0byByZS1hcHBseSBpdCBoZXJlLiAqLwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24taW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCh0ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtaW5wdXQpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZm9jdXM7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1pbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1pbnB1dCkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1pbnZhbGlkOwogICAgICB9CgogICAgICAucHJlZml4IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1ub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LXByZWZpeDsKICAgICAgfQoKICAgICAgLnN1ZmZpeCA6OnNsb3R0ZWQoKikgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtbm9uZTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtc3VmZml4OwogICAgICB9CgogICAgICAvKiBGaXJlZm94IHNldHMgYSBtaW4td2lkdGggb24gdGhlIGlucHV0LCB3aGljaCBjYW4gY2F1c2UgbGF5b3V0IGlzc3VlcyAqLwogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaW5wdXQpIHsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCh0ZXh0YXJlYSkgewogICAgICAgIHJlc2l6ZTogbm9uZTsKICAgICAgfQoKICAgICAgLmFkZC1vbi1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5hZGQtb24tY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnZhbGlkLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICAuYWRkLW9uLWNvbnRlbnQuaXMtaGlnaGxpZ2h0ZWQgOjpzbG90dGVkKCopIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0iZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciIgYXJpYS1oaWRkZW49InRydWUiIGhpZGRlbj0iW1tub0xhYmVsRmxvYXRdXSI+Jm5ic3A7PC9kaXY+CgogICAgPGRpdiBjbGFzcz0iaW5wdXQtd3JhcHBlciI+CiAgICAgIDxzcGFuIGNsYXNzPSJwcmVmaXgiPjxzbG90IG5hbWU9InByZWZpeCI+PC9zbG90Pjwvc3Bhbj4KCiAgICAgIDxkaXYgY2xhc3MkPSJbW19jb21wdXRlSW5wdXRDb250ZW50Q2xhc3Mobm9MYWJlbEZsb2F0LGFsd2F5c0Zsb2F0TGFiZWwsZm9jdXNlZCxpbnZhbGlkLF9pbnB1dEhhc0NvbnRlbnQpXV0iIGlkPSJsYWJlbEFuZElucHV0Q29udGFpbmVyIj4KICAgICAgICA8c2xvdCBuYW1lPSJsYWJlbCI+PC9zbG90PgogICAgICAgIDxzbG90IG5hbWU9ImlucHV0Ij48L3Nsb3Q+CiAgICAgIDwvZGl2PgoKICAgICAgPHNwYW4gY2xhc3M9InN1ZmZpeCI+PHNsb3QgbmFtZT0ic3VmZml4Ij48L3Nsb3Q+PC9zcGFuPgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcyQ9IltbX2NvbXB1dGVVbmRlcmxpbmVDbGFzcyhmb2N1c2VkLGludmFsaWQpXV0iPgogICAgICA8ZGl2IGNsYXNzPSJ1bmZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImZvY3VzZWQtbGluZSI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzJD0iW1tfY29tcHV0ZUFkZE9uQ29udGVudENsYXNzKGZvY3VzZWQsaW52YWxpZCldXSI+CiAgICAgIDxzbG90IG5hbWU9ImFkZC1vbiI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWlucHV0LWVycm9yIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWludmFsaWQtY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY2FwdGlvbjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1lcnJvcjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDowOwogICAgICAgIHJpZ2h0OjA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgewogICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICAgIH07CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtmb2N1c2VkXSkgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBpbnB1dCB7CiAgICAgICAgLyogRmlyZWZveCBzZXRzIGEgbWluLXdpZHRoIG9uIHRoZSBpbnB1dCwgd2hpY2ggY2FuIGNhdXNlIGxheW91dCBpc3N1ZXMgKi8KICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhlIDxpbnB1dD4gaXMgZGlzdHJpYnV0ZWQgdG8gcGFwZXItaW5wdXQtY29udGFpbmVyLCB3aGljaCBzdHlsZXMgaXQuCiAgICAgIEluIDIueCB0aGUgPGlyb24taW5wdXQ+IGlzIGRpc3RyaWJ1dGVkIHRvIHBhcGVyLWlucHV0LWNvbnRhaW5lciwgd2hpY2ggc3R5bGVzCiAgICAgIGl0LCBidXQgaW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yayBjb3JyZWN0bHksIHdlIG5lZWQgdG8gcmVzZXQgc29tZQogICAgICBvZiB0aGUgbmF0aXZlIGlucHV0J3MgcHJvcGVydGllcyB0byBpbmhlcml0IChmcm9tIHRoZSBpcm9uLWlucHV0KSAqLwogICAgICBpcm9uLWlucHV0ID4gaW5wdXQgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1zaGFyZWQtaW5wdXQtc3R5bGU7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgZm9udC1zaXplOiBpbmhlcml0OwogICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0OwogICAgICAgIHdvcmQtc3BhY2luZzogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXNoYWRvdzogaW5oZXJpdDsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBjdXJzb3I6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIGlucHV0OmRpc2FibGVkIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLAogICAgICBpbnB1dDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICBpbnB1dDo6LXdlYmtpdC1jbGVhci1idXR0b24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3IgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvcjsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0Oi1tb3otcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICBpbnB1dDo6LW1zLWNsZWFyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbXMtcmV2ZWFsIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtcmV2ZWFsOwogICAgICB9CgogICAgICBpbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGxhYmVsIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQtY29udGFpbmVyIGlkPSJjb250YWluZXIiIG5vLWxhYmVsLWZsb2F0PSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPHNsb3QgbmFtZT0icHJlZml4IiBzbG90PSJwcmVmaXgiPjwvc2xvdD4KCiAgICAgIDxsYWJlbCBoaWRkZW4kPSJbWyFsYWJlbF1dIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9yJD0iW1tfaW5wdXRJZF1dIiBzbG90PSJsYWJlbCI+W1tsYWJlbF1dPC9sYWJlbD4KCiAgICAgIDxzcGFuIGlkPSJ0ZW1wbGF0ZS1wbGFjZWhvbGRlciI+PC9zcGFuPgoKICAgICAgPHNsb3QgbmFtZT0ic3VmZml4IiBzbG90PSJzdWZmaXgiPjwvc2xvdD4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICA8L3RlbXBsYXRlPgoKICAKICA8dGVtcGxhdGUgaWQ9InYwIj4KICAgIDxpbnB1dCBpcz0iaXJvbi1pbnB1dCIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgaW52YWxpZD0ie3tpbnZhbGlkfX0iIHByZXZlbnQtaW52YWxpZC1pbnB1dD0iW1twcmV2ZW50SW52YWxpZElucHV0XV0iIGFsbG93ZWQtcGF0dGVybj0iW1thbGxvd2VkUGF0dGVybl1dIiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgPC90ZW1wbGF0ZT4KCiAgPHRlbXBsYXRlIGlkPSJ2MSI+CiAgICAKICAgIDxpcm9uLWlucHV0IGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgc2xvdD0iaW5wdXQiIGNsYXNzPSJpbnB1dC1lbGVtZW50IiBpZCQ9IltbX2lucHV0SWRdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYWxsb3dlZC1wYXR0ZXJuPSJbW2FsbG93ZWRQYXR0ZXJuXV0iIGludmFsaWQ9Int7aW52YWxpZH19IiB2YWxpZGF0b3I9IltbdmFsaWRhdG9yXV0iPgogICAgICA8aW5wdXQgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSI+CiAgICA8L2lyb24taW5wdXQ+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1vdmVybGF5LWJhY2tkcm9wIj4KCiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1pcm9uLW92ZXJsYXktYmFja2Ryb3AtYmFja2dyb3VuZC1jb2xvciwgIzAwMCk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wOwogICAgICB9CgogICAgICA6aG9zdCgub3BlbmVkKSB7CiAgICAgICAgb3BhY2l0eTogdmFyKC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wYWNpdHksIDAuNik7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICAgICAgQGFwcGx5IC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLW9wZW5lZDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1kcm9wZG93biI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICAjY29udGVudFdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI2NvbnRlbnRXcmFwcGVyLmFuaW1hdGluZyA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iY29udGVudFdyYXBwZXIiPgogICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbWVudS1idXR0b24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICAgIGNvbG9yOiB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWVudS1idXR0b24tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlyb24tZHJvcGRvd24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWRyb3Bkb3duOwogICAgICB9CgogICAgICAuZHJvcGRvd24tY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CgogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItbWVudS1idXR0b24tZHJvcGRvd24tYmFja2dyb3VuZCwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbC1hbGlnbj0idG9wIl0pIC5kcm9wZG93bi1jb250ZW50IHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IC0xMHB4OwogICAgICAgIHRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsLWFsaWduPSJib3R0b20iXSkgLmRyb3Bkb3duLWNvbnRlbnQgewogICAgICAgIGJvdHRvbTogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTBweDsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB9CgogICAgICAjdHJpZ2dlciB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRyaWdnZXIiIG9uLXRhcD0idG9nZ2xlIj4KICAgICAgPHNsb3QgbmFtZT0iZHJvcGRvd24tdHJpZ2dlciI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGlyb24tZHJvcGRvd24gaWQ9ImRyb3Bkb3duIiBvcGVuZWQ9Int7b3BlbmVkfX0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIHZlcnRpY2FsLWFsaWduPSJbW3ZlcnRpY2FsQWxpZ25dXSIgZHluYW1pYy1hbGlnbj0iW1tkeW5hbWljQWxpZ25dXSIgaG9yaXpvbnRhbC1vZmZzZXQ9IltbaG9yaXpvbnRhbE9mZnNldF1dIiB2ZXJ0aWNhbC1vZmZzZXQ9IltbdmVydGljYWxPZmZzZXRdXSIgbm8tb3ZlcmxhcD0iW1tub092ZXJsYXBdXSIgb3Blbi1hbmltYXRpb24tY29uZmlnPSJbW29wZW5BbmltYXRpb25Db25maWddXSIgY2xvc2UtYW5pbWF0aW9uLWNvbmZpZz0iW1tjbG9zZUFuaW1hdGlvbkNvbmZpZ11dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBmb2N1cy10YXJnZXQ9IltbX2Ryb3Bkb3duQ29udGVudF1dIiBhbGxvdy1vdXRzaWRlLXNjcm9sbD0iW1thbGxvd091dHNpZGVTY3JvbGxdXSIgcmVzdG9yZS1mb2N1cy1vbi1jbG9zZT0iW1tyZXN0b3JlRm9jdXNPbkNsb3NlXV0iIG9uLWlyb24tb3ZlcmxheS1jYW5jZWxlZD0iX19vbklyb25PdmVybGF5Q2FuY2VsZWQiPgogICAgICA8ZGl2IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIGNsYXNzPSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvaXJvbi1kcm9wZG93bj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItZHJvcGRvd24tbWVudSIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duIj48cGF0aCBkPSJNNyAxMGw1IDUgNS01eiI+PC9wYXRoPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1kcm9wZG93bi1tZW51LXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKCiAgICAgICAgLyogTk9URShjZGF0YSk6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlCiAgICAgICAgICogdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4KICAgICAgICAgKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH07CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LWRpc2FibGVkOwogICAgICB9CgogICAgICA6aG9zdChbbm9pbmtdKSBwYXBlci1yaXBwbGUgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtuby1sYWJlbC1mbG9hdF0pIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiA4cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgdG9wOiAxMnB4OwogICAgICAgIGxlZnQ6IDBweDsKICAgICAgICBib3R0b206IDhweDsKICAgICAgICByaWdodDogMHB4OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LXJpcHBsZTsKICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDA7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDsKICAgICAgfQoKICAgICAgaXJvbi1pY29uIHsKICAgICAgICBjb2xvcjogdmFyKC0tZGlzYWJsZWQtdGV4dC1jb2xvcik7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaWNvbjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZHJvcGRvd24tbWVudSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRyb3Bkb3duLW1lbnUtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAKICAgIDxzcGFuIHJvbGU9ImJ1dHRvbiI+PC9zcGFuPgogICAgPHBhcGVyLW1lbnUtYnV0dG9uIGlkPSJtZW51QnV0dG9uIiB2ZXJ0aWNhbC1hbGlnbj0iW1t2ZXJ0aWNhbEFsaWduXV0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIGR5bmFtaWMtYWxpZ249IltbZHluYW1pY0FsaWduXV0iIHZlcnRpY2FsLW9mZnNldD0iW1tfY29tcHV0ZU1lbnVWZXJ0aWNhbE9mZnNldChub0xhYmVsRmxvYXQsIHZlcnRpY2FsT2Zmc2V0KV1dIiBkaXNhYmxlZD0iW1tkaXNhYmxlZF1dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBvbi1pcm9uLXNlbGVjdD0iX29uSXJvblNlbGVjdCIgb24taXJvbi1kZXNlbGVjdD0iX29uSXJvbkRlc2VsZWN0IiBvcGVuZWQ9Int7b3BlbmVkfX0iIGNsb3NlLW9uLWFjdGl2YXRlIGFsbG93LW91dHNpZGUtc2Nyb2xsPSJbW2FsbG93T3V0c2lkZVNjcm9sbF1dIiByZXN0b3JlLWZvY3VzLW9uLWNsb3NlPSJbW3Jlc3RvcmVGb2N1c09uQ2xvc2VdXSI+CiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi10cmlnZ2VyIiBzbG90PSJkcm9wZG93bi10cmlnZ2VyIj4KICAgICAgICA8cGFwZXItcmlwcGxlPjwvcGFwZXItcmlwcGxlPgogICAgICAgIAogICAgICAgIDxwYXBlci1pbnB1dCB0eXBlPSJ0ZXh0IiBpbnZhbGlkPSJbW2ludmFsaWRdXSIgcmVhZG9ubHkgZGlzYWJsZWQ9IltbZGlzYWJsZWRdXSIgdmFsdWU9IltbdmFsdWVdXSIgcGxhY2Vob2xkZXI9IltbcGxhY2Vob2xkZXJdXSIgZXJyb3ItbWVzc2FnZT0iW1tlcnJvck1lc3NhZ2VdXSIgYWx3YXlzLWZsb2F0LWxhYmVsPSJbW2Fsd2F5c0Zsb2F0TGFiZWxdXSIgbm8tbGFiZWwtZmxvYXQ9Iltbbm9MYWJlbEZsb2F0XV0iIGxhYmVsPSJbW2xhYmVsXV0iPgogICAgICAgICAgCiAgICAgICAgICA8aXJvbi1pY29uIGljb249InBhcGVyLWRyb3Bkb3duLW1lbnU6YXJyb3ctZHJvcC1kb3duIiBzdWZmaXggc2xvdD0ic3VmZml4Ij48L2lyb24taWNvbj4KICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8L2Rpdj4KICAgICAgPHNsb3QgaWQ9ImNvbnRlbnQiIG5hbWU9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPjwvc2xvdD4KICAgIDwvcGFwZXItbWVudS1idXR0b24+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbGlzdGJveCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogOHB4IDA7CgogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLWxpc3Rib3gtYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWxpc3Rib3gtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1saXN0Ym94OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtLXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QsIC5wYXBlci1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1taW4taGVpZ2h0LCA0OHB4KTsKICAgICAgICBwYWRkaW5nOiAwcHggMTZweDsKICAgICAgfQoKICAgICAgLnBhcGVyLWl0ZW0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBib3JkZXI6bm9uZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSwgLnBhcGVyLWl0ZW1baGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCguaXJvbi1zZWxlY3RlZCksIC5wYXBlci1pdGVtLmlyb24tc2VsZWN0ZWQgewogICAgICAgIGZvbnQtd2VpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLXNlbGVjdGVkLXdlaWdodCwgYm9sZCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tc2VsZWN0ZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pLCAucGFwZXItaXRlbVtkaXNhYmxlZF0gewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pdGVtLWRpc2FibGVkLWNvbG9yLCB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cyksIC5wYXBlci1pdGVtOmZvY3VzIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogMDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1mb2N1c2VkOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpOmJlZm9yZSwgLnBhcGVyLWl0ZW06Zm9jdXM6YmVmb3JlIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwoKICAgICAgICBiYWNrZ3JvdW5kOiBjdXJyZW50Q29sb3I7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tZGFyay1kaXZpZGVyLW9wYWNpdHkpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWZvY3VzZWQtYmVmb3JlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pdGVtIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItaXRlbS1zaGFyZWQtc3R5bGVzIj4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1zdWJoZWFkOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1iYWNrZW5kIj4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zdG9yYWdlIj4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGFnLWZpbHRlcmVyIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaW5wdXQgbm8tbGFiZWwtZmxvYXQgbGFiZWw9IkZpbHRlciB0YWdzIChyZWd1bGFyIGV4cHJlc3Npb25zIHN1cHBvcnRlZCkiIHZhbHVlPSJ7e190YWdGaWx0ZXJ9fSIgY2xhc3M9InNlYXJjaC1pbnB1dCI+CiAgICAgIDxpcm9uLWljb24gcHJlZml4IGljb249InNlYXJjaCIgc2xvdD0icHJlZml4Ij48L2lyb24taWNvbj4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDEwcHggMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmxheW91dC5ob3Jpem9udGFsLAogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5pbmxpbmUgewogICAgICAgIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICB9CgogICAgICAubGF5b3V0Lmhvcml6b250YWwgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLmxheW91dC53cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5uby13cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiBub3dyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXIsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAuZmxleCB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSAwLjAwMDAwMDAwMXB4OwogICAgICAgIC13ZWJraXQtZmxleDogMTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIC13ZWJraXQtZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgICBmbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICB9CgogICAgICAuZmxleC1hdXRvIHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfQoKICAgICAgLmZsZXgtbm9uZSB7CiAgICAgICAgLW1zLWZsZXg6IG5vbmU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiBub25lOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtcmV2ZXJzZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAubGF5b3V0Lmhvcml6b250YWwtcmV2ZXJzZSwKICAgICAgLmxheW91dC52ZXJ0aWNhbC1yZXZlcnNlIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5ob3Jpem9udGFsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LndyYXAtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtYWxpZ25tZW50Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC8qKgogICAgICAgKiBBbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcy4KICAgICAgICovCiAgICAgIC5sYXlvdXQuc3RhcnQgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBzdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlciwKICAgICAgLmxheW91dC5jZW50ZXItY2VudGVyIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmVuZCB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYmFzZWxpbmUgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBbGlnbm1lbnQgaW4gbWFpbiBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmVuZC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGVuZDsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5hcm91bmQtanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBkaXN0cmlidXRlOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGYgYWxpZ25tZW50LgogICAgICAgKi8KICAgICAgLnNlbGYtc3RhcnQgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAuc2VsZi1jZW50ZXIgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9CgogICAgICAuc2VsZi1lbmQgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAuc2VsZi1zdHJldGNoIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgfQoKICAgICAgLnNlbGYtYmFzZWxpbmUgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9CgogICAgICAvKioKICAgICAgICogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IHN0YXJ0OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmVuZC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGVuZDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBjZW50ZXI7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYmV0d2Vlbi1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGp1c3RpZnk7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYXJvdW5kLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogZGlzdHJpYnV0ZTsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1mbGV4LWZhY3RvcnMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmZsZXgsCiAgICAgIC5mbGV4LTEgewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfQoKICAgICAgLmZsZXgtMiB7CiAgICAgICAgLW1zLWZsZXg6IDI7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAyOwogICAgICAgIGZsZXg6IDI7CiAgICAgIH0KCiAgICAgIC5mbGV4LTMgewogICAgICAgIC1tcy1mbGV4OiAzOwogICAgICAgIC13ZWJraXQtZmxleDogMzsKICAgICAgICBmbGV4OiAzOwogICAgICB9CgogICAgICAuZmxleC00IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfQoKICAgICAgLmZsZXgtNSB7CiAgICAgICAgLW1zLWZsZXg6IDU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA1OwogICAgICAgIGZsZXg6IDU7CiAgICAgIH0KCiAgICAgIC5mbGV4LTYgewogICAgICAgIC1tcy1mbGV4OiA2OwogICAgICAgIC13ZWJraXQtZmxleDogNjsKICAgICAgICBmbGV4OiA2OwogICAgICB9CgogICAgICAuZmxleC03IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfQoKICAgICAgLmZsZXgtOCB7CiAgICAgICAgLW1zLWZsZXg6IDg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA4OwogICAgICAgIGZsZXg6IDg7CiAgICAgIH0KCiAgICAgIC5mbGV4LTkgewogICAgICAgIC1tcy1mbGV4OiA5OwogICAgICAgIC13ZWJraXQtZmxleDogOTsKICAgICAgICBmbGV4OiA5OwogICAgICB9CgogICAgICAuZmxleC0xMCB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH0KCiAgICAgIC5mbGV4LTExIHsKICAgICAgICAtbXMtZmxleDogMTE7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMTsKICAgICAgICBmbGV4OiAxMTsKICAgICAgfQoKICAgICAgLmZsZXgtMTIgewogICAgICAgIC1tcy1mbGV4OiAxMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDEyOwogICAgICAgIGZsZXg6IDEyOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1wb3NpdGlvbmluZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuYmxvY2sgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaW52aXNpYmxlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnJlbGF0aXZlIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIGJvZHkuZnVsbGJsZWVkIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfQoKICAgICAgLnNjcm9sbCB7CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAvKiBmaXhlZCBwb3NpdGlvbiAqLwogICAgICAuZml4ZWQtYm90dG9tLAogICAgICAuZml4ZWQtbGVmdCwKICAgICAgLmZpeGVkLXJpZ2h0LAogICAgICAuZml4ZWQtdG9wIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KCiAgICAgIC5maXhlZC10b3AgewogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtcmlnaHQgewogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC5maXhlZC1ib3R0b20gewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtbGVmdCB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogIDpyb290IHsKICAgIC0tdGItb3JhbmdlLXdlYWs6ICNmZmE3MjY7CiAgICAtLXRiLW9yYW5nZS1zdHJvbmc6ICNmNTdjMDA7CiAgICAtLXRiLW9yYW5nZS1kYXJrOiAjZGM3MzIwOwogICAgLS10Yi1ncmV5LWRhcmtlcjogI2UyZTJlMjsKICAgIC0tdGItZ3JleS1saWdodGVyOiAjZjNmM2YzOwogICAgLS10Yi11aS1kYXJrLWFjY2VudDogIzc1NzU3NTsKICAgIC0tdGItdWktbGlnaHQtYWNjZW50OiAjZTBlMGUwOwogICAgLS10Yi1ncmFwaC1mYWRlZDogI2UwZDRiMzsKICB9Cjwvc3R5bGU+CgoKPGRvbS1tb2R1bGUgaWQ9ImRhc2hib2FyZC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nOiAxNXB4OwogICAgICAgIC0tc2lkZWJhci1sZWZ0LXBhZGRpbmc6IDMwcHg7CiAgICAgIH0KCiAgICAgIFtzbG90PSdzaWRlYmFyJ10gewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIHBhZGRpbmc6IDVweCAwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICB9CgogICAgICB0Zi1ydW5zLXNlbGVjdG9yIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgbGVmdDogdmFyKC0tc2lkZWJhci1sZWZ0LXBhZGRpbmcpOwogICAgICAgIG1heC1oZWlnaHQ6IGNhbGMoMTAwJSAtIHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgKiAyKTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgfQoKICAgICAgLnNlYXJjaC1pbnB1dCB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDVweCAwIDEwcHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gewogICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpOwogICAgICAgIHBhZGRpbmc6IHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgMAogICAgICAgICAgdmFyKC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nKSB2YXIoLS1zaWRlYmFyLWxlZnQtcGFkZGluZyk7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbjpsYXN0LW9mLXR5cGUgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmxhc3Qtb2YtdHlwZSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgcGFkZGluZy10b3A6IDA7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiBoMyB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJzY3JvbGxiYXItc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXItdHJhY2sgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIgewogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICB9CgogICAgICAuc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhci10aHVtYiB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTBweDsKICAgICAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCAycHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICB9CiAgICAgIC5zY3JvbGxiYXIgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRhc2hib2FyZC1sYXlvdXQiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9InNpZGViYXIiPgogICAgICA8c2xvdCBuYW1lPSJzaWRlYmFyIj48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJjZW50ZXIiPgogICAgICA8c2xvdCBuYW1lPSJjZW50ZXIiIGNsYXNzPSJzY29sbGJhciI+PC9zbG90PgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0ic2Nyb2xsYmFyLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI3NpZGViYXIgewogICAgICAgIGZsZXg6IDAgMCB2YXIoLS10Zi1kYXNoYm9hcmQtbGF5b3V0LXNpZGViYXItYmFzaXMsIDI1JSk7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG1heC13aWR0aDogdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aCwgMzUwcHgpOwogICAgICAgIG1pbi13aWR0aDogdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1pbi13aWR0aCwgMjcwcHgpOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgICNjZW50ZXIgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKFtzbG90PSdjZW50ZXInXSkgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAudGYtZ3JhcGgtZGFzaGJvYXJkICNjZW50ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcHRpb24tc2VsZWN0b3IiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9IndyYXAiPgogICAgICA8aDM+W1tuYW1lXV08L2gzPgogICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LXdyYXBwZXIiPjxzbG90Pjwvc2xvdD48L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCguc2VsZWN0ZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIGgzIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIG1hcmdpbjogMCAwIDVweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJpcm9uLWNvbGxhcHNlIj4KCiAgPHRlbXBsYXRlPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLWlyb24tY29sbGFwc2UtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMzAwbXMpOwogICAgICAgIC8qIFNhZmFyaSAxMCBuZWVkcyB0aGlzIHByb3BlcnR5IHByZWZpeGVkIHRvIGNvcnJlY3RseSBhcHBseSB0aGUgY3VzdG9tIHByb3BlcnR5ICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1pcm9uLWNvbGxhcHNlLXRyYW5zaXRpb24tZHVyYXRpb24sIDMwMG1zKTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmlyb24tY29sbGFwc2UtY2xvc2VkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdCguaXJvbi1jb2xsYXBzZS1vcGVuZWQpKSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CgogIDwvdGVtcGxhdGU+Cgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcGFuZVJlbmRlcmVkXV0iIGlkPSJpZlJlbmRlcmVkIj4KICAgICAgPGJ1dHRvbiBjbGFzcz0iaGVhZGluZyIgb24tdGFwPSJfdG9nZ2xlUGFuZSIgb3Blbi1idXR0b24kPSJbW29wZW5lZF1dIj4KICAgICAgICA8c3BhbiBjbGFzcz0ibmFtZSI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0NvbXBvc2l0ZVNlYXJjaChjYXRlZ29yeSldXSI+CiAgICAgICAgICAgICAgPHNwYW4+VGFncyBtYXRjaGluZyBtdWx0aXBsZSBleHBlcmltZW50czwvc3Bhbj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzSW52YWxpZFNlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4mbmJzcDs8c3Ryb25nPihtYWxmb3JtZWQgcmVndWxhciBleHByZXNzaW9uKTwvc3Ryb25nPjwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc0NvbXBvc2l0ZVNlYXJjaChjYXRlZ29yeSldXSI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxpZ2h0Ij5UYWdzIG1hdGNoaW5nIC88L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LW5hbWUiIHRpdGxlJD0iW1tjYXRlZ29yeS5uYW1lXV0iPltbY2F0ZWdvcnkubmFtZV1dPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsaWdodCI+Lzwvc3Bhbj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVW5pdmVyc2FsU2VhcmNoUXVlcnldXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4gKGFsbCB0YWdzKTwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNJbnZhbGlkU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgICAgIDxzcGFuPiA8c3Ryb25nPihtYWxmb3JtZWQgcmVndWxhciBleHByZXNzaW9uKTwvc3Ryb25nPjwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LW5hbWUiIHRpdGxlJD0iW1tjYXRlZ29yeS5uYW1lXV0iPltbY2F0ZWdvcnkubmFtZV1dPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNvdW50Ij4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVdXSI+CiAgICAgICAgICAgIDxzcGFuPltbX2NvdW50XV08L3NwYW4+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJleHBhbmQtbW9yZSIgY2xhc3M9ImV4cGFuZC1hcnJvdyI+PC9pcm9uLWljb24+CiAgICAgICAgPC9zcGFuPgogICAgICA8L2J1dHRvbj4KICAgICAgCiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tvcGVuZWRdXSIgbm8tYW5pbWF0aW9uPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRlbnQiPgogICAgICAgICAgPHNwYW4gaWQ9InRvcC1vZi1jb250YWluZXIiPjwvc3Bhbj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbXVsdGlwbGVQYWdlc0V4aXN0XV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJiaWctcGFnZS1idXR0b25zIiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogMTBweDsiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJfcGVyZm9ybVByZXZpb3VzUGFnZSIgZGlzYWJsZWQkPSJbWyFfaGFzUHJldmlvdXNQYWdlXV0iPlByZXZpb3VzIHBhZ2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIG9uLXRhcD0iX3BlcmZvcm1OZXh0UGFnZSIgZGlzYWJsZWQkPSJbWyFfaGFzTmV4dFBhZ2VdXSI+TmV4dCBwYWdlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8ZGl2IGlkPSJpdGVtcyI+CiAgICAgICAgICAgIDxzbG90IG5hbWU9Iml0ZW1zIj48L3Nsb3Q+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbXVsdGlwbGVQYWdlc0V4aXN0XV0iPgogICAgICAgICAgICA8ZGl2IGlkPSJjb250cm9scy1jb250YWluZXIiPgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZzogMCA1cHgiPgogICAgICAgICAgICAgICAgUGFnZQogICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJwYWdlLWlucHV0IiB0eXBlPSJudW1iZXIiIG5vLWxhYmVsLWZsb2F0IG1pbj0iMSIgbWF4PSJbW19wYWdlQ291bnRdXSIgdmFsdWU9IltbX3BhZ2VJbnB1dFZhbHVlXV0iIG9uLWlucHV0PSJfaGFuZGxlUGFnZUlucHV0RXZlbnQiIG9uLWNoYW5nZT0iX2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCIgb24tZm9jdXM9Il9oYW5kbGVQYWdlRm9jdXNFdmVudCIgb24tYmx1cj0iX2hhbmRsZVBhZ2VCbHVyRXZlbnQiPjwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICBvZiBbW19wYWdlQ291bnRdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJpZy1wYWdlLWJ1dHRvbnMiIHN0eWxlPSJtYXJnaW4tdG9wOiAxMHB4OyI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBvbi10YXA9Il9wZXJmb3JtUHJldmlvdXNQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNQcmV2aW91c1BhZ2VdXSI+UHJldmlvdXMgcGFnZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gb24tdGFwPSJfcGVyZm9ybU5leHRQYWdlIiBkaXNhYmxlZCQ9IltbIV9oYXNOZXh0UGFnZV1dIj5OZXh0IHBhZ2U8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tY29sbGFwc2U+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luOiAwIDVweCAxcHggMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZpcnN0LW9mLXR5cGUpIHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICA6aG9zdCg6bGFzdC1vZi10eXBlKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLmhlYWRpbmcgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZm9udC1zaXplOiAxNXB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBwYWRkaW5nOiAxMHB4IDE1cHg7CiAgICAgIH0KCiAgICAgIFtvcGVuLWJ1dHRvbl0gewogICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDAgIWltcG9ydGFudDsKICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbb3Blbi1idXR0b25dIC5leHBhbmQtYXJyb3cgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlWigxODBkZWcpOwogICAgICB9CgogICAgICAubmFtZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmxpZ2h0IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS01MDApOwogICAgICB9CgogICAgICAuY2F0ZWdvcnktbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHBhZGRpbmc6IDJweCAwOwogICAgICB9CgogICAgICAuY291bnQgewogICAgICAgIG1hcmdpbjogMCA1cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBwYWRkaW5nOiAxMHB4IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMnB4OwogICAgICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAycHg7CiAgICAgICAgYm9yZGVyLXRvcDogbm9uZTsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGVkZWRlOwogICAgICAgIHBhZGRpbmc6IDE1cHg7CiAgICAgIH0KCiAgICAgIC5saWdodCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgfQoKICAgICAgI2NvbnRyb2xzLWNvbnRhaW5lciB7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2NvbnRyb2xzLWNvbnRhaW5lciBwYXBlci1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmJpZy1wYWdlLWJ1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbGV4LWJhc2lzOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHBhcGVyLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgIH0KCiAgICAgIHNsb3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgICNwYWdlLWlucHV0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IHZhcigtLXRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3LXBhZ2UtaW5wdXQtd2lkdGgsIDEwMCUpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItZGlhbG9nLXNoYXJlZC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbjogMjRweCA0MHB4OwoKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1kaWFsb2ctYmFja2dyb3VuZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWRpYWxvZy1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtYm9keTE7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0xNmRwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZzsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIG1hcmdpbi10b3A6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMCAyNHB4OwogICAgICB9CgogICAgICA6aG9zdCA+IDo6c2xvdHRlZCgubm8tcGFkZGluZykgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIAogICAgICA6aG9zdCA+IDo6c2xvdHRlZCgqOmZpcnN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLXRvcDogMjRweDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKjpsYXN0LWNoaWxkKSB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjRweDsKICAgICAgfQoKICAgICAgLyogSW4gMS54LCB0aGlzIHNlbGVjdG9yIHdhcyBgOmhvc3QgPiA6OmNvbnRlbnQgaDJgLiBJbiAyLnggPHNsb3Q+IGFsbG93cwogICAgICB0byBzZWxlY3QgZGlyZWN0IGNoaWxkcmVuIG9ubHksIHdoaWNoIGluY3JlYXNlcyB0aGUgd2VpZ2h0IG9mIHRoaXMKICAgICAgc2VsZWN0b3IsIHNvIHdlIGhhdmUgdG8gcmUtZGVmaW5lIGZpcnN0LWNoaWxkL2xhc3QtY2hpbGQgbWFyZ2lucyBiZWxvdy4gKi8KICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoaDIpIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luOiAwOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXRpdGxlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTsKICAgICAgfQoKICAgICAgLyogQXBwbHkgbWl4aW4gYWdhaW4sIGluIGNhc2UgaXQgc2V0cyBtYXJnaW4tdG9wLiAqLwogICAgICA6aG9zdCA+IDo6c2xvdHRlZChoMjpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXRpdGxlOwogICAgICB9CgogICAgICAvKiBBcHBseSBtaXhpbiBhZ2FpbiwgaW4gY2FzZSBpdCBzZXRzIG1hcmdpbi1ib3R0b20uICovCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKGgyOmxhc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLnBhcGVyLWRpYWxvZy1idXR0b25zKSwKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLmJ1dHRvbnMpIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4IDhweCA4cHggMjRweDsKICAgICAgICBtYXJnaW46IDA7CgogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1kaWFsb2ctYnV0dG9uLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj48L3N0eWxlPgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY29sb3Itc2NhbGUiPgogIAogIAo8L2RvbS1tb2R1bGU+CgoKCgo8aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJpY29ucyIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iM2Qtcm90YXRpb24iPjxwYXRoIGQ9Ik03LjUyIDIxLjQ4QzQuMjUgMTkuOTQgMS45MSAxNi43NiAxLjU1IDEzSC4wNUMuNTYgMTkuMTYgNS43MSAyNCAxMiAyNGwuNjYtLjAzLTMuODEtMy44MS0xLjMzIDEuMzJ6bS44OS02LjUyYy0uMTkgMC0uMzctLjAzLS41Mi0uMDgtLjE2LS4wNi0uMjktLjEzLS40LS4yNC0uMTEtLjEtLjItLjIyLS4yNi0uMzctLjA2LS4xNC0uMDktLjMtLjA5LS40N2gtMS4zYzAgLjM2LjA3LjY4LjIxLjk1LjE0LjI3LjMzLjUuNTYuNjkuMjQuMTguNTEuMzIuODIuNDEuMy4xLjYyLjE1Ljk2LjE1LjM3IDAgLjcyLS4wNSAxLjAzLS4xNS4zMi0uMS42LS4yNS44My0uNDRzLjQyLS40My41NS0uNzJjLjEzLS4yOS4yLS42MS4yLS45NyAwLS4xOS0uMDItLjM4LS4wNy0uNTYtLjA1LS4xOC0uMTItLjM1LS4yMy0uNTEtLjEtLjE2LS4yNC0uMy0uNC0uNDMtLjE3LS4xMy0uMzctLjIzLS42MS0uMzEuMi0uMDkuMzctLjIuNTItLjMzLjE1LS4xMy4yNy0uMjcuMzctLjQyLjEtLjE1LjE3LS4zLjIyLS40Ni4wNS0uMTYuMDctLjMyLjA3LS40OCAwLS4zNi0uMDYtLjY4LS4xOC0uOTYtLjEyLS4yOC0uMjktLjUxLS41MS0uNjktLjItLjE5LS40Ny0uMzMtLjc3LS40M0M5LjEgOC4wNSA4Ljc2IDggOC4zOSA4Yy0uMzYgMC0uNjkuMDUtMSAuMTYtLjMuMTEtLjU3LjI2LS43OS40NS0uMjEuMTktLjM4LjQxLS41MS42Ny0uMTIuMjYtLjE4LjU0LS4xOC44NWgxLjNjMC0uMTcuMDMtLjMyLjA5LS40NXMuMTQtLjI1LjI1LS4zNGMuMTEtLjA5LjIzLS4xNy4zOC0uMjIuMTUtLjA1LjMtLjA4LjQ4LS4wOC40IDAgLjcuMS44OS4zMS4xOS4yLjI5LjQ5LjI5Ljg2IDAgLjE4LS4wMy4zNC0uMDguNDktLjA1LjE1LS4xNC4yNy0uMjUuMzctLjExLjEtLjI1LjE4LS40MS4yNC0uMTYuMDYtLjM2LjA5LS41OC4wOUg3LjV2MS4wM2guNzdjLjIyIDAgLjQyLjAyLjYuMDdzLjMzLjEzLjQ1LjIzYy4xMi4xMS4yMi4yNC4yOS40LjA3LjE2LjEuMzUuMS41NyAwIC40MS0uMTIuNzItLjM1LjkzLS4yMy4yMy0uNTUuMzMtLjk1LjMzem04LjU1LTUuOTJjLS4zMi0uMzMtLjctLjU5LTEuMTQtLjc3LS40My0uMTgtLjkyLS4yNy0xLjQ2LS4yN0gxMnY4aDIuM2MuNTUgMCAxLjA2LS4wOSAxLjUxLS4yNy40NS0uMTguODQtLjQzIDEuMTYtLjc2LjMyLS4zMy41Ny0uNzMuNzQtMS4xOS4xNy0uNDcuMjYtLjk5LjI2LTEuNTd2LS40YzAtLjU4LS4wOS0xLjEtLjI2LTEuNTctLjE4LS40Ny0uNDMtLjg3LS43NS0xLjJ6bS0uMzkgMy4xNmMwIC40Mi0uMDUuNzktLjE0IDEuMTMtLjEuMzMtLjI0LjYyLS40My44NS0uMTkuMjMtLjQzLjQxLS43MS41My0uMjkuMTItLjYyLjE4LS45OS4xOGgtLjkxVjkuMTJoLjk3Yy43MiAwIDEuMjcuMjMgMS42NC42OS4zOC40Ni41NyAxLjEyLjU3IDEuOTl2LjR6TTEyIDBsLS42Ni4wMyAzLjgxIDMuODEgMS4zMy0xLjMzYzMuMjcgMS41NSA1LjYxIDQuNzIgNS45NiA4LjQ4aDEuNUMyMy40NCA0Ljg0IDE4LjI5IDAgMTIgMHoiIC8+PC9nPgo8ZyBpZD0iYWNjZXNzaWJpbGl0eSI+PHBhdGggZD0iTTEyIDJjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyLTItLjktMi0yIC45LTIgMi0yem05IDdoLTZ2MTNoLTJ2LTZoLTJ2Nkg5VjlIM1Y3aDE4djJ6IiAvPjwvZz4KPGcgaWQ9ImFjY2Vzc2libGUiPjxjaXJjbGUgY3g9IjEyIiBjeT0iNCIgcj0iMiIgLz48cGF0aCBkPSJNMTkgMTN2LTJjLTEuNTQuMDItMy4wOS0uNzUtNC4wNy0xLjgzbC0xLjI5LTEuNDNjLS4xNy0uMTktLjM4LS4zNC0uNjEtLjQ1LS4wMSAwLS4wMS0uMDEtLjAyLS4wMUgxM2MtLjM1LS4yLS43NS0uMy0xLjE5LS4yNkMxMC43NiA3LjExIDEwIDguMDQgMTAgOS4wOVYxNWMwIDEuMS45IDIgMiAyaDV2NWgydi01LjVjMC0xLjEtLjktMi0yLTJoLTN2LTMuNDVjMS4yOSAxLjA3IDMuMjUgMS45NCA1IDEuOTV6bS02LjE3IDVjLS40MSAxLjE2LTEuNTIgMi0yLjgzIDItMS42NiAwLTMtMS4zNC0zLTMgMC0xLjMxLjg0LTIuNDEgMi0yLjgzVjEyLjFjLTIuMjguNDYtNCAyLjQ4LTQgNC45IDAgMi43NiAyLjI0IDUgNSA1IDIuNDIgMCA0LjQ0LTEuNzIgNC45LTRoLTIuMDd6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtYmFsYW5jZSI+PHBhdGggZD0iTTQgMTB2N2gzdi03SDR6bTYgMHY3aDN2LTdoLTN6TTIgMjJoMTl2LTNIMnYzem0xNC0xMnY3aDN2LTdoLTN6bS00LjUtOUwyIDZ2MmgxOVY2bC05LjUtNXoiIC8+PC9nPgo8ZyBpZD0iYWNjb3VudC1iYWxhbmNlLXdhbGxldCI+PHBhdGggZD0iTTIxIDE4djFjMCAxLjEtLjkgMi0yIDJINWMtMS4xMSAwLTItLjktMi0yVjVjMC0xLjEuODktMiAyLTJoMTRjMS4xIDAgMiAuOSAyIDJ2MWgtOWMtMS4xMSAwLTIgLjktMiAydjhjMCAxLjEuODkgMiAyIDJoOXptLTktMmgxMFY4SDEydjh6bTQtMi41Yy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0iYWNjb3VudC1ib3giPjxwYXRoIGQ9Ik0zIDV2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMkg1Yy0xLjExIDAtMiAuOS0yIDJ6bTEyIDRjMCAxLjY2LTEuMzQgMy0zIDNzLTMtMS4zNC0zLTMgMS4zNC0zIDMtMyAzIDEuMzQgMyAzem0tOSA4YzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMXYxSDZ2LTF6IiAvPjwvZz4KPGcgaWQ9ImFjY291bnQtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAzYzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptMCAxNC4yYy0yLjUgMC00LjcxLTEuMjgtNi0zLjIyLjAzLTEuOTkgNC0zLjA4IDYtMy4wOCAxLjk5IDAgNS45NyAxLjA5IDYgMy4wOC0xLjI5IDEuOTQtMy41IDMuMjItNiAzLjIyeiIgLz48L2c+CjxnIGlkPSJhZGQiPjxwYXRoIGQ9Ik0xOSAxM2gtNnY2aC0ydi02SDV2LTJoNlY1aDJ2Nmg2djJ6IiAvPjwvZz4KPGcgaWQ9ImFkZC1hbGVydCI+PHBhdGggZD0iTTEwLjAxIDIxLjAxYzAgMS4xLjg5IDEuOTkgMS45OSAxLjk5czEuOTktLjg5IDEuOTktMS45OWgtMy45OHptOC44Ny00LjE5VjExYzAtMy4yNS0yLjI1LTUuOTctNS4yOS02LjY5di0uNzJDMTMuNTkgMi43MSAxMi44OCAyIDEyIDJzLTEuNTkuNzEtMS41OSAxLjU5di43MkM3LjM3IDUuMDMgNS4xMiA3Ljc1IDUuMTIgMTF2NS44MkwzIDE4Ljk0VjIwaDE4di0xLjA2bC0yLjEyLTIuMTJ6TTE2IDEzLjAxaC0zdjNoLTJ2LTNIOFYxMWgzVjhoMnYzaDN2Mi4wMXoiIC8+PC9nPgo8ZyBpZD0iYWRkLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS0yIDEwaC00djRoLTJ2LTRIN3YtMmg0VjdoMnY0aDR2MnoiIC8+PC9nPgo8ZyBpZD0iYWRkLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTUgMTFoLTR2NGgtMnYtNEg3di0yaDRWN2gydjRoNHYyeiIgLz48L2c+CjxnIGlkPSJhZGQtY2lyY2xlLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMyA3aC0ydjRIN3YyaDR2NGgydi00aDR2LTJoLTRWN3ptLTEtNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImFkZC1zaG9wcGluZy1jYXJ0Ij48cGF0aCBkPSJNMTEgOWgyVjZoM1Y0aC0zVjFoLTJ2M0g4djJoM3Yzem0tNCA5Yy0xLjEgMC0xLjk5LjktMS45OSAyUzUuOSAyMiA3IDIyczItLjkgMi0yLS45LTItMi0yem0xMCAwYy0xLjEgMC0xLjk5LjktMS45OSAycy44OSAyIDEuOTkgMiAyLS45IDItMi0uOS0yLTItMnptLTkuODMtMy4yNWwuMDMtLjEyLjktMS42M2g3LjQ1Yy43NSAwIDEuNDEtLjQxIDEuNzUtMS4wM2wzLjg2LTcuMDFMMTkuNDIgNGgtLjAxbC0xLjEgMi0yLjc2IDVIOC41M2wtLjEzLS4yN0w2LjE2IDZsLS45NS0yLS45NC0ySDF2MmgybDMuNiA3LjU5LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmgxMnYtMkg3LjQyYy0uMTMgMC0uMjUtLjExLS4yNS0uMjV6IiAvPjwvZz4KPGcgaWQ9ImFsYXJtIj48cGF0aCBkPSJNMjIgNS43MmwtNC42LTMuODYtMS4yOSAxLjUzIDQuNiAzLjg2TDIyIDUuNzJ6TTcuODggMy4zOUw2LjYgMS44NiAyIDUuNzFsMS4yOSAxLjUzIDQuNTktMy44NXpNMTIuNSA4SDExdjZsNC43NSAyLjg1Ljc1LTEuMjMtNC0yLjM3Vjh6TTEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDljNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bTAgMTZjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3eiIgLz48L2c+CjxnIGlkPSJhbGFybS1hZGQiPjxwYXRoIGQ9Ik03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3ptMS0xMWgtMnYzSDh2MmgzdjNoMnYtM2gzdi0yaC0zVjl6IiAvPjwvZz4KPGcgaWQ9ImFsYXJtLW9mZiI+PHBhdGggZD0iTTEyIDZjMy44NyAwIDcgMy4xMyA3IDcgMCAuODQtLjE2IDEuNjUtLjQzIDIuNGwxLjUyIDEuNTJjLjU4LTEuMTkuOTEtMi41MS45MS0zLjkyIDAtNC45Ny00LjAzLTktOS05LTEuNDEgMC0yLjczLjMzLTMuOTIuOTFMOS42IDYuNDNDMTAuMzUgNi4xNiAxMS4xNiA2IDEyIDZ6bTEwLS4yOGwtNC42LTMuODYtMS4yOSAxLjUzIDQuNiAzLjg2TDIyIDUuNzJ6TTIuOTIgMi4yOUwxLjY1IDMuNTcgMi45OCA0LjlsLTEuMTEuOTMgMS40MiAxLjQyIDEuMTEtLjk0LjguOEMzLjgzIDguNjkgMyAxMC43NSAzIDEzYzAgNC45NyA0LjAyIDkgOSA5IDIuMjUgMCA0LjMxLS44MyA1Ljg5LTIuMmwyLjIgMi4yIDEuMjctMS4yN0wzLjg5IDMuMjdsLS45Ny0uOTh6bTEzLjU1IDE2LjFDMTUuMjYgMTkuMzkgMTMuNyAyMCAxMiAyMGMtMy44NyAwLTctMy4xMy03LTcgMC0xLjcuNjEtMy4yNiAxLjYxLTQuNDdsOS44NiA5Ljg2ek04LjAyIDMuMjhMNi42IDEuODZsLS44Ni43MSAxLjQyIDEuNDIuODYtLjcxeiIgLz48L2c+CjxnIGlkPSJhbGFybS1vbiI+PHBhdGggZD0iTTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDljNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bTAgMTZjLTMuODcgMC03LTMuMTMtNy03czMuMTMtNyA3LTcgNyAzLjEzIDcgNy0zLjEzIDctNyA3em0tMS40Ni01LjQ3TDguNDEgMTIuNGwtMS4wNiAxLjA2IDMuMTggMy4xOCA2LTYtMS4wNi0xLjA2LTQuOTMgNC45NXoiIC8+PC9nPgo8ZyBpZD0iYWxsLW91dCI+PHBhdGggZD0iTTE2LjIxIDQuMTZsNCA0di00em00IDEybC00IDRoNHptLTEyIDRsLTQtNHY0em0tNC0xMmw0LTRoLTR6bTEyLjk1LS45NWMtMi43My0yLjczLTcuMTctMi43My05LjkgMHMtMi43MyA3LjE3IDAgOS45IDcuMTcgMi43MyA5LjkgMCAyLjczLTcuMTYgMC05Ljl6bS0xLjEgOC44Yy0yLjEzIDIuMTMtNS41NyAyLjEzLTcuNyAwcy0yLjEzLTUuNTcgMC03LjcgNS41Ny0yLjEzIDcuNyAwIDIuMTMgNS41NyAwIDcuN3oiIC8+PC9nPgo8ZyBpZD0iYW5kcm9pZCI+PHBhdGggZD0iTTYgMThjMCAuNTUuNDUgMSAxIDFoMXYzLjVjMCAuODMuNjcgMS41IDEuNSAxLjVzMS41LS42NyAxLjUtMS41VjE5aDJ2My41YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNVYxOWgxYy41NSAwIDEtLjQ1IDEtMVY4SDZ2MTB6TTMuNSA4QzIuNjcgOCAyIDguNjcgMiA5LjV2N2MwIC44My42NyAxLjUgMS41IDEuNVM1IDE3LjMzIDUgMTYuNXYtN0M1IDguNjcgNC4zMyA4IDMuNSA4em0xNyAwYy0uODMgMC0xLjUuNjctMS41IDEuNXY3YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNXYtN2MwLS44My0uNjctMS41LTEuNS0xLjV6bS00Ljk3LTUuODRsMS4zLTEuM2MuMi0uMi4yLS41MSAwLS43MS0uMi0uMi0uNTEtLjItLjcxIDBsLTEuNDggMS40OEMxMy44NSAxLjIzIDEyLjk1IDEgMTIgMWMtLjk2IDAtMS44Ni4yMy0yLjY2LjYzTDcuODUuMTVjLS4yLS4yLS41MS0uMi0uNzEgMC0uMi4yLS4yLjUxIDAgLjcxbDEuMzEgMS4zMUM2Ljk3IDMuMjYgNiA1LjAxIDYgN2gxMmMwLTEuOTktLjk3LTMuNzUtMi40Ny00Ljg0ek0xMCA1SDlWNGgxdjF6bTUgMGgtMVY0aDF2MXoiIC8+PC9nPgo8ZyBpZD0iYW5ub3VuY2VtZW50Ij48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDloLTJWNWgydjZ6bTAgNGgtMnYtMmgydjJ6IiAvPjwvZz4KPGcgaWQ9ImFwcHMiPjxwYXRoIGQ9Ik00IDhoNFY0SDR2NHptNiAxMmg0di00aC00djR6bS02IDBoNHYtNEg0djR6bTAtNmg0di00SDR2NHptNiAwaDR2LTRoLTR2NHptNi0xMHY0aDRWNGgtNHptLTYgNGg0VjRoLTR2NHptNiA2aDR2LTRoLTR2NHptMCA2aDR2LTRoLTR2NHoiIC8+PC9nPgo8ZyBpZD0iYXJjaGl2ZSI+PHBhdGggZD0iTTIwLjU0IDUuMjNsLTEuMzktMS42OEMxOC44OCAzLjIxIDE4LjQ3IDMgMTggM0g2Yy0uNDcgMC0uODguMjEtMS4xNi41NUwzLjQ2IDUuMjNDMy4xNyA1LjU3IDMgNi4wMiAzIDYuNVYxOWMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjYuNWMwLS40OC0uMTctLjkzLS40Ni0xLjI3ek0xMiAxNy41TDYuNSAxMkgxMHYtMmg0djJoMy41TDEyIDE3LjV6TTUuMTIgNWwuODEtMWgxMmwuOTQgMUg1LjEyeiIgLz48L2c+CjxnIGlkPSJhcnJvdy1iYWNrIj48cGF0aCBkPSJNMjAgMTFINy44M2w1LjU5LTUuNTlMMTIgNGwtOCA4IDggOCAxLjQxLTEuNDFMNy44MyAxM0gyMHYtMnoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctZG93bndhcmQiPjxwYXRoIGQ9Ik0yMCAxMmwtMS40MS0xLjQxTDEzIDE2LjE3VjRoLTJ2MTIuMTdsLTUuNTgtNS41OUw0IDEybDggOCA4LTh6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtZG93biI+PHBhdGggZD0iTTcgMTBsNSA1IDUtNXoiIC8+PC9nPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMTJsLTQtNGg4bC00IDR6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtdXAiPjxwYXRoIGQ9Ik03IDE0bDUtNSA1IDV6IiAvPjwvZz4KPGcgaWQ9ImFycm93LWZvcndhcmQiPjxwYXRoIGQ9Ik0xMiA0bC0xLjQxIDEuNDFMMTYuMTcgMTFINHYyaDEyLjE3bC01LjU4IDUuNTlMMTIgMjBsOC04eiIgLz48L2c+CjxnIGlkPSJhcnJvdy11cHdhcmQiPjxwYXRoIGQ9Ik00IDEybDEuNDEgMS40MUwxMSA3LjgzVjIwaDJWNy44M2w1LjU4IDUuNTlMMjAgMTJsLTgtOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImFzcGVjdC1yYXRpbyI+PHBhdGggZD0iTTE5IDEyaC0ydjNoLTN2Mmg1di01ek03IDloM1Y3SDV2NWgyVjl6bTE0LTZIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OWgxOHYxNC4wMnoiIC8+PC9nPgo8ZyBpZD0iYXNzZXNzbWVudCI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50Ij48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTIgMTRIN3YtMmg3djJ6bTMtNEg3di0yaDEwdjJ6bTAtNEg3VjdoMTB2MnoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1pbmQiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMCA0YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptNiAxMkg2di0xLjRjMC0yIDQtMy4xIDYtMy4xczYgMS4xIDYgMy4xVjE5eiIgLz48L2c+CjxnIGlkPSJhc3NpZ25tZW50LWxhdGUiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS02IDE1aC0ydi0yaDJ2MnptMC00aC0yVjhoMnY2em0tMS05Yy0uNTUgMC0xLS40NS0xLTFzLjQ1LTEgMS0xIDEgLjQ1IDEgMS0uNDUgMS0xIDF6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtcmV0dXJuIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTQgMTJoLTR2M2wtNS01IDUtNXYzaDR2NHoiIC8+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1yZXR1cm5lZCI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0wIDE1bC01LTVoM1Y5aDR2NGgzbC01IDV6IiAvPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtdHVybmVkLWluIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bS0yIDE0bC00LTQgMS40MS0xLjQxTDEwIDE0LjE3bDYuNTktNi41OUwxOCA5bC04IDh6IiAvPjwvZz4KPGcgaWQ9ImF0dGFjaG1lbnQiPjxwYXRoIGQ9Ik0yIDEyLjVDMiA5LjQ2IDQuNDYgNyA3LjUgN0gxOGMyLjIxIDAgNCAxLjc5IDQgNHMtMS43OSA0LTQgNEg5LjVDOC4xMiAxNSA3IDEzLjg4IDcgMTIuNVM4LjEyIDEwIDkuNSAxMEgxN3YySDkuNDFjLS41NSAwLS41NSAxIDAgMUgxOGMxLjEgMCAyLS45IDItMnMtLjktMi0yLTJINy41QzUuNTcgOSA0IDEwLjU3IDQgMTIuNVM1LjU3IDE2IDcuNSAxNkgxN3YySDcuNUM0LjQ2IDE4IDIgMTUuNTQgMiAxMi41eiIgLz48L2c+CjxnIGlkPSJhdXRvcmVuZXciPjxwYXRoIGQ9Ik0xMiA2djNsNC00LTQtNHYzYy00LjQyIDAtOCAzLjU4LTggOCAwIDEuNTcuNDYgMy4wMyAxLjI0IDQuMjZMNi43IDE0LjhjLS40NS0uODMtLjctMS43OS0uNy0yLjggMC0zLjMxIDIuNjktNiA2LTZ6bTYuNzYgMS43NEwxNy4zIDkuMmMuNDQuODQuNyAxLjc5LjcgMi44IDAgMy4zMS0yLjY5IDYtNiA2di0zbC00IDQgNCA0di0zYzQuNDIgMCA4LTMuNTggOC04IDAtMS41Ny0uNDYtMy4wMy0xLjI0LTQuMjZ6IiAvPjwvZz4KPGcgaWQ9ImJhY2tzcGFjZSI+PHBhdGggZD0iTTIyIDNIN2MtLjY5IDAtMS4yMy4zNS0xLjU5Ljg4TDAgMTJsNS40MSA4LjExYy4zNi41My45Ljg5IDEuNTkuODloMTVjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTMgMTIuNTlMMTcuNTkgMTcgMTQgMTMuNDEgMTAuNDEgMTcgOSAxNS41OSAxMi41OSAxMiA5IDguNDEgMTAuNDEgNyAxNCAxMC41OSAxNy41OSA3IDE5IDguNDEgMTUuNDEgMTIgMTkgMTUuNTl6IiAvPjwvZz4KPGcgaWQ9ImJhY2t1cCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTQgMTN2NGgtNHYtNEg3bDUtNSA1IDVoLTN6IiAvPjwvZz4KPGcgaWQ9ImJsb2NrIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNNCAxMmMwLTQuNDIgMy41OC04IDgtOCAxLjg1IDAgMy41NS42MyA0LjkgMS42OUw1LjY5IDE2LjlDNC42MyAxNS41NSA0IDEzLjg1IDQgMTJ6bTggOGMtMS44NSAwLTMuNTUtLjYzLTQuOS0xLjY5TDE4LjMxIDcuMUMxOS4zNyA4LjQ1IDIwIDEwLjE1IDIwIDEyYzAgNC40Mi0zLjU4IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJib29rIj48cGF0aCBkPSJNMTggMkg2Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTYgNGg1djhsLTIuNS0xLjVMNiAxMlY0eiIgLz48L2c+CjxnIGlkPSJib29rbWFyayI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0iYm9va21hcmstYm9yZGVyIj48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yem0wIDE1bC01LTIuMThMNyAxOFY1aDEwdjEzeiIgLz48L2c+CjxnIGlkPSJidWctcmVwb3J0Ij48cGF0aCBkPSJNMjAgOGgtMi44MWMtLjQ1LS43OC0xLjA3LTEuNDUtMS44Mi0xLjk2TDE3IDQuNDEgMTUuNTkgM2wtMi4xNyAyLjE3QzEyLjk2IDUuMDYgMTIuNDkgNSAxMiA1Yy0uNDkgMC0uOTYuMDYtMS40MS4xN0w4LjQxIDMgNyA0LjQxbDEuNjIgMS42M0M3Ljg4IDYuNTUgNy4yNiA3LjIyIDYuODEgOEg0djJoMi4wOWMtLjA1LjMzLS4wOS42Ni0uMDkgMXYxSDR2MmgydjFjMCAuMzQuMDQuNjcuMDkgMUg0djJoMi44MWMxLjA0IDEuNzkgMi45NyAzIDUuMTkgM3M0LjE1LTEuMjEgNS4xOS0zSDIwdi0yaC0yLjA5Yy4wNS0uMzMuMDktLjY2LjA5LTF2LTFoMnYtMmgtMnYtMWMwLS4zNC0uMDQtLjY3LS4wOS0xSDIwVjh6bS02IDhoLTR2LTJoNHYyem0wLTRoLTR2LTJoNHYyeiIgLz48L2c+CjxnIGlkPSJidWlsZCI+PHBhdGggZD0iTTIyLjcgMTlsLTkuMS05LjFjLjktMi4zLjQtNS0xLjUtNi45LTItMi01LTIuNC03LjQtMS4zTDkgNiA2IDkgMS42IDQuN0MuNCA3LjEuOSAxMC4xIDIuOSAxMi4xYzEuOSAxLjkgNC42IDIuNCA2LjkgMS41bDkuMSA5LjFjLjQuNCAxIC40IDEuNCAwbDIuMy0yLjNjLjUtLjQuNS0xLjEuMS0xLjR6IiAvPjwvZz4KPGcgaWQ9ImNhY2hlZCI+PHBhdGggZD0iTTE5IDhsLTQgNGgzYzAgMy4zMS0yLjY5IDYtNiA2LTEuMDEgMC0xLjk3LS4yNS0yLjgtLjdsLTEuNDYgMS40NkM4Ljk3IDE5LjU0IDEwLjQzIDIwIDEyIDIwYzQuNDIgMCA4LTMuNTggOC04aDNsLTQtNHpNNiAxMmMwLTMuMzEgMi42OS02IDYtNiAxLjAxIDAgMS45Ny4yNSAyLjguN2wxLjQ2LTEuNDZDMTUuMDMgNC40NiAxMy41NyA0IDEyIDRjLTQuNDIgMC04IDMuNTgtOCA4SDFsNCA0IDQtNEg2eiIgLz48L2c+CjxnIGlkPSJjYW1lcmEtZW5oYW5jZSI+PHBhdGggZD0iTTkgM0w3LjE3IDVINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yaC0zLjE3TDE1IDNIOXptMyAxNWMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1LTIuMjQgNS01IDV6bTAtMWwxLjI1LTIuNzVMMTYgMTNsLTIuNzUtMS4yNUwxMiA5bC0xLjI1IDIuNzVMOCAxM2wyLjc1IDEuMjV6IiAvPjwvZz4KPGcgaWQ9ImNhbmNlbCI+PHBhdGggZD0iTTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTUgMTMuNTlMMTUuNTkgMTcgMTIgMTMuNDEgOC40MSAxNyA3IDE1LjU5IDEwLjU5IDEyIDcgOC40MSA4LjQxIDcgMTIgMTAuNTkgMTUuNTkgNyAxNyA4LjQxIDEzLjQxIDEyIDE3IDE1LjU5eiIgLz48L2c+CjxnIGlkPSJjYXJkLWdpZnRjYXJkIj48cGF0aCBkPSJNMjAgNmgtMi4xOGMuMTEtLjMxLjE4LS42NS4xOC0xIDAtMS42Ni0xLjM0LTMtMy0zLTEuMDUgMC0xLjk2LjU0LTIuNSAxLjM1bC0uNS42Ny0uNS0uNjhDMTAuOTYgMi41NCAxMC4wNSAyIDkgMiA3LjM0IDIgNiAzLjM0IDYgNWMwIC4zNS4wNy42OS4xOCAxSDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE5YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTUtMmMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xek05IDRjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDUuMDhMNyAxMC44MyA4LjYyIDEyIDExIDguNzZsMS0xLjM2IDEgMS4zNkwxNS4zOCAxMiAxNyAxMC44MyAxNC45MiA4SDIwdjZ6IiAvPjwvZz4KPGcgaWQ9ImNhcmQtbWVtYmVyc2hpcCI+PHBhdGggZD0iTTIwIDJINGMtMS4xMSAwLTIgLjg5LTIgMnYxMWMwIDEuMTEuODkgMiAyIDJoNHY1bDQtMiA0IDJ2LTVoNGMxLjExIDAgMi0uODkgMi0yVjRjMC0xLjExLS44OS0yLTItMnptMCAxM0g0di0yaDE2djJ6bTAtNUg0VjRoMTZ2NnoiIC8+PC9nPgo8ZyBpZD0iY2FyZC10cmF2ZWwiPjxwYXRoIGQ9Ik0yMCA2aC0zVjRjMC0xLjExLS44OS0yLTItMkg5Yy0xLjExIDAtMiAuODktMiAydjJINGMtMS4xMSAwLTIgLjg5LTIgMnYxMWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6TTkgNGg2djJIOVY0em0xMSAxNUg0di0yaDE2djJ6bTAtNUg0VjhoM3YyaDJWOGg2djJoMlY4aDN2NnoiIC8+PC9nPgo8ZyBpZD0iY2hhbmdlLWhpc3RvcnkiPjxwYXRoIGQ9Ik0xMiA3Ljc3TDE4LjM5IDE4SDUuNjFMMTIgNy43N00xMiA0TDIgMjBoMjBMMTIgNHoiIC8+PC9nPgo8ZyBpZD0iY2hlY2siPjxwYXRoIGQ9Ik05IDE2LjE3TDQuODMgMTJsLTEuNDIgMS40MUw5IDE5IDIxIDdsLTEuNDEtMS40MXoiIC8+PC9nPgo8ZyBpZD0iY2hlY2stYm94Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xMSAwIDItLjkgMi0yVjVjMC0xLjEtLjg5LTItMi0yem0tOSAxNGwtNS01IDEuNDEtMS40MUwxMCAxNC4xN2w3LjU5LTcuNTlMMTkgOGwtOSA5eiIgLz48L2c+CjxnIGlkPSJjaGVjay1ib3gtb3V0bGluZS1ibGFuayI+PHBhdGggZD0iTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImNoZWNrLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bS0yIDE1bC01LTUgMS40MS0xLjQxTDEwIDE0LjE3bDcuNTktNy41OUwxOSA4bC05IDl6IiAvPjwvZz4KPGcgaWQ9ImNoZXZyb24tbGVmdCI+PHBhdGggZD0iTTE1LjQxIDcuNDFMMTQgNmwtNiA2IDYgNiAxLjQxLTEuNDFMMTAuODMgMTJ6IiAvPjwvZz4KPGcgaWQ9ImNoZXZyb24tcmlnaHQiPjxwYXRoIGQ9Ik0xMCA2TDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnoiIC8+PC9nPgo8ZyBpZD0iY2hyb21lLXJlYWRlci1tb2RlIj48cGF0aCBkPSJNMTMgMTJoN3YxLjVoLTd6bTAtMi41aDdWMTFoLTd6bTAgNWg3VjE2aC03ek0yMSA0SDNjLTEuMSAwLTIgLjktMiAydjEzYzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCAxNWgtOVY2aDl2MTN6IiAvPjwvZz4KPGcgaWQ9ImNsYXNzIj48cGF0aCBkPSJNMTggMkg2Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTYgNGg1djhsLTIuNS0xLjVMNiAxMlY0eiIgLz48L2c+CjxnIGlkPSJjbGVhciI+PHBhdGggZD0iTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMnoiIC8+PC9nPgo8ZyBpZD0iY2xvc2UiPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2eiIgLz48L2c+CjxnIGlkPSJjbG91ZC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem00LjUgMTRIOGMtMS42NiAwLTMtMS4zNC0zLTNzMS4zNC0zIDMtM2wuMTQuMDFDOC41OCA4LjI4IDEwLjEzIDcgMTIgN2MyLjIxIDAgNCAxLjc5IDQgNGguNWMxLjM4IDAgMi41IDEuMTIgMi41IDIuNVMxNy44OCAxNiAxNi41IDE2eiIgLz48L2c+CjxnIGlkPSJjbG91ZC1kb25lIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xMCAxN2wtMy41LTMuNSAxLjQxLTEuNDFMMTAgMTQuMTcgMTUuMTggOWwxLjQxIDEuNDFMMTAgMTd6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLWRvd25sb2FkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xNyAxM2wtNSA1LTUtNWgzVjloNHY0aDN6IiAvPjwvZz4KPGcgaWQ9ImNsb3VkLW9mZiI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0Yy0xLjQ4IDAtMi44NS40My00LjAxIDEuMTdsMS40NiAxLjQ2QzEwLjIxIDYuMjMgMTEuMDggNiAxMiA2YzMuMDQgMCA1LjUgMi40NiA1LjUgNS41di41SDE5YzEuNjYgMCAzIDEuMzQgMyAzIDAgMS4xMy0uNjQgMi4xMS0xLjU2IDIuNjJsMS40NSAxLjQ1QzIzLjE2IDE4LjE2IDI0IDE2LjY4IDI0IDE1YzAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0zIDUuMjdsMi43NSAyLjc0QzIuNTYgOC4xNSAwIDEwLjc3IDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTEuNzNsMiAyTDIxIDIwLjczIDQuMjcgNCAzIDUuMjd6TTcuNzMgMTBsOCA4SDZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTRoMS43M3oiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtcXVldWUiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNCA5LjExIDQgNi42IDUuNjQgNS4zNSA4LjA0IDIuMzQgOC4zNiAwIDEwLjkxIDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTNjMi43NiAwIDUtMi4yNCA1LTUgMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTE5IDE4SDZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTRoLjcxQzcuMzcgNy42OSA5LjQ4IDYgMTIgNmMzLjA0IDAgNS41IDIuNDYgNS41IDUuNXYuNUgxOWMxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgM3oiIC8+PC9nPgo8ZyBpZD0iY2xvdWQtdXBsb2FkIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xNCAxM3Y0aC00di00SDdsNS01IDUgNWgtM3oiIC8+PC9nPgo8ZyBpZD0iY29kZSI+PHBhdGggZD0iTTkuNCAxNi42TDQuOCAxMmw0LjYtNC42TDggNmwtNiA2IDYgNiAxLjQtMS40em01LjIgMGw0LjYtNC42LTQuNi00LjZMMTYgNmw2IDYtNiA2LTEuNC0xLjR6IiAvPjwvZz4KPGcgaWQ9ImNvbXBhcmUtYXJyb3dzIj48cGF0aCBkPSJNOS4wMSAxNEgydjJoNy4wMXYzTDEzIDE1bC0zLjk5LTR2M3ptNS45OC0xdi0zSDIyVjhoLTcuMDFWNUwxMSA5bDMuOTkgNHoiIC8+PC9nPgo8ZyBpZD0iY29udGVudC1jb3B5Ij48cGF0aCBkPSJNMTYgMUg0Yy0xLjEgMC0yIC45LTIgMnYxNGgyVjNoMTJWMXptMyA0SDhjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTFjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptMCAxNkg4VjdoMTF2MTR6IiAvPjwvZz4KPGcgaWQ9ImNvbnRlbnQtY3V0Ij48cGF0aCBkPSJNOS42NCA3LjY0Yy4yMy0uNS4zNi0xLjA1LjM2LTEuNjQgMC0yLjIxLTEuNzktNC00LTRTMiAzLjc5IDIgNnMxLjc5IDQgNCA0Yy41OSAwIDEuMTQtLjEzIDEuNjQtLjM2TDEwIDEybC0yLjM2IDIuMzZDNy4xNCAxNC4xMyA2LjU5IDE0IDYgMTRjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNGMwLS41OS0uMTMtMS4xNC0uMzYtMS42NEwxMiAxNGw3IDdoM3YtMUw5LjY0IDcuNjR6TTYgOGMtMS4xIDAtMi0uODktMi0ycy45LTIgMi0yIDIgLjg5IDIgMi0uOSAyLTIgMnptMCAxMmMtMS4xIDAtMi0uODktMi0ycy45LTIgMi0yIDIgLjg5IDIgMi0uOSAyLTIgMnptNi03LjVjLS4yOCAwLS41LS4yMi0uNS0uNXMuMjItLjUuNS0uNS41LjIyLjUuNS0uMjIuNS0uNS41ek0xOSAzbC02IDYgMiAyIDctN1YzeiIgLz48L2c+CjxnIGlkPSJjb250ZW50LXBhc3RlIj48cGF0aCBkPSJNMTkgMmgtNC4xOEMxNC40Ljg0IDEzLjMgMCAxMiAwYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem03IDE4SDVWNGgydjNoMTBWNGgydjE2eiIgLz48L2c+CjxnIGlkPSJjb3B5cmlnaHQiPjxwYXRoIGQ9Ik0xMC4wOCAxMC44NmMuMDUtLjMzLjE2LS42Mi4zLS44N3MuMzQtLjQ2LjU5LS42MmMuMjQtLjE1LjU0LS4yMi45MS0uMjMuMjMuMDEuNDQuMDUuNjMuMTMuMi4wOS4zOC4yMS41Mi4zNnMuMjUuMzMuMzQuNTMuMTMuNDIuMTQuNjRoMS43OWMtLjAyLS40Ny0uMTEtLjktLjI4LTEuMjlzLS40LS43My0uNy0xLjAxLS42Ni0uNS0xLjA4LS42Ni0uODgtLjIzLTEuMzktLjIzYy0uNjUgMC0xLjIyLjExLTEuNy4zNHMtLjg4LjUzLTEuMi45Mi0uNTYuODQtLjcxIDEuMzZTOCAxMS4yOSA4IDExLjg3di4yN2MwIC41OC4wOCAxLjEyLjIzIDEuNjRzLjM5Ljk3LjcxIDEuMzUuNzIuNjkgMS4yLjkxIDEuMDUuMzQgMS43LjM0Yy40NyAwIC45MS0uMDggMS4zMi0uMjNzLjc3LS4zNiAxLjA4LS42My41Ni0uNTguNzQtLjk0LjI5LS43NC4zLTEuMTVoLTEuNzljLS4wMS4yMS0uMDYuNC0uMTUuNThzLS4yMS4zMy0uMzYuNDYtLjMyLjIzLS41Mi4zYy0uMTkuMDctLjM5LjA5LS42LjEtLjM2LS4wMS0uNjYtLjA4LS44OS0uMjMtLjI1LS4xNi0uNDUtLjM3LS41OS0uNjJzLS4yNS0uNTUtLjMtLjg4LS4wOC0uNjctLjA4LTF2LS4yN2MwLS4zNS4wMy0uNjguMDgtMS4wMXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImNyZWF0ZSI+PHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiIC8+PC9nPgo8ZyBpZD0iY3JlYXRlLW5ldy1mb2xkZXIiPjxwYXRoIGQ9Ik0yMCA2aC04bC0yLTJINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yem0tMSA4aC0zdjNoLTJ2LTNoLTN2LTJoM1Y5aDJ2M2gzdjJ6IiAvPjwvZz4KPGcgaWQ9ImNyZWRpdC1jYXJkIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6bTAgMTRINHYtNmgxNnY2em0wLTEwSDRWNmgxNnYyeiIgLz48L2c+CjxnIGlkPSJkYXNoYm9hcmQiPjxwYXRoIGQ9Ik0zIDEzaDhWM0gzdjEwem0wIDhoOHYtNkgzdjZ6bTEwIDBoOFYxMWgtOHYxMHptMC0xOHY2aDhWM2gtOHoiIC8+PC9nPgo8ZyBpZD0iZGF0ZS1yYW5nZSI+PHBhdGggZD0iTTkgMTFIN3YyaDJ2LTJ6bTQgMGgtMnYyaDJ2LTJ6bTQgMGgtMnYyaDJ2LTJ6bTItN2gtMVYyaC0ydjJIOFYySDZ2Mkg1Yy0xLjExIDAtMS45OS45LTEuOTkgMkwzIDIwYzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTZINVY5aDE0djExeiIgLz48L2c+CjxnIGlkPSJkZWxldGUiPjxwYXRoIGQ9Ik02IDE5YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlY3SDZ2MTJ6TTE5IDRoLTMuNWwtMS0xaC01bC0xIDFINXYyaDE0VjR6IiAvPjwvZz4KPGcgaWQ9ImRlbGV0ZS1mb3JldmVyIj48cGF0aCBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyem0yLjQ2LTcuMTJsMS40MS0xLjQxTDEyIDEyLjU5bDIuMTItMi4xMiAxLjQxIDEuNDFMMTMuNDEgMTRsMi4xMiAyLjEyLTEuNDEgMS40MUwxMiAxNS40MWwtMi4xMiAyLjEyLTEuNDEtMS40MUwxMC41OSAxNGwtMi4xMy0yLjEyek0xNS41IDRsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiIgLz48L2c+CjxnIGlkPSJkZWxldGUtc3dlZXAiPjxwYXRoIGQ9Ik0xNSAxNmg0djJoLTR6bTAtOGg3djJoLTd6bTAgNGg2djJoLTZ6TTMgMThjMCAxLjEuOSAyIDIgMmg2YzEuMSAwIDItLjkgMi0yVjhIM3YxMHpNMTQgNWgtM2wtMS0xSDZMNSA1SDJ2MmgxMnoiIC8+PC9nPgo8ZyBpZD0iZGVzY3JpcHRpb24iPjxwYXRoIGQ9Ik0xNCAySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMxLjEgMCAyLS45IDItMlY4bC02LTZ6bTIgMTZIOHYtMmg4djJ6bTAtNEg4di0yaDh2MnptLTMtNVYzLjVMMTguNSA5SDEzeiIgLz48L2c+CjxnIGlkPSJkbnMiPjxwYXRoIGQ9Ik0yMCAxM0g0Yy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxNmMuNTUgMCAxLS40NSAxLTF2LTZjMC0uNTUtLjQ1LTEtMS0xek03IDE5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpNMjAgM0g0Yy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxNmMuNTUgMCAxLS40NSAxLTFWNGMwLS41NS0uNDUtMS0xLTF6TTcgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6IiAvPjwvZz4KPGcgaWQ9ImRvbmUiPjxwYXRoIGQ9Ik05IDE2LjJMNC44IDEybC0xLjQgMS40TDkgMTkgMjEgN2wtMS40LTEuNEw5IDE2LjJ6IiAvPjwvZz4KPGcgaWQ9ImRvbmUtYWxsIj48cGF0aCBkPSJNMTggN2wtMS40MS0xLjQxLTYuMzQgNi4zNCAxLjQxIDEuNDFMMTggN3ptNC4yNC0xLjQxTDExLjY2IDE2LjE3IDcuNDggMTJsLTEuNDEgMS40MUwxMS42NiAxOWwxMi0xMi0xLjQyLTEuNDF6TS40MSAxMy40MUw2IDE5bDEuNDEtMS40MUwxLjgzIDEyIC40MSAxMy40MXoiIC8+PC9nPgo8ZyBpZD0iZG9udXQtbGFyZ2UiPjxwYXRoIGQ9Ik0xMSA1LjA4VjJjLTUgLjUtOSA0LjgxLTkgMTBzNCA5LjUgOSAxMHYtMy4wOGMtMy0uNDgtNi0zLjQtNi02LjkyczMtNi40NCA2LTYuOTJ6TTE4Ljk3IDExSDIyYy0uNDctNS00LTguNTMtOS05djMuMDhDMTYgNS41MSAxOC41NCA4IDE4Ljk3IDExek0xMyAxOC45MlYyMmM1LS40NyA4LjUzLTQgOS05aC0zLjAzYy0uNDMgMy0yLjk3IDUuNDktNS45NyA1LjkyeiIgLz48L2c+CjxnIGlkPSJkb251dC1zbWFsbCI+PHBhdGggZD0iTTExIDkuMTZWMmMtNSAuNS05IDQuNzktOSAxMHM0IDkuNSA5IDEwdi03LjE2Yy0xLS40MS0yLTEuNTItMi0yLjg0czEtMi40MyAyLTIuODR6TTE0Ljg2IDExSDIyYy0uNDgtNC43NS00LTguNTMtOS05djcuMTZjMSAuMyAxLjUyLjk4IDEuODYgMS44NHpNMTMgMTQuODRWMjJjNS0uNDcgOC41Mi00LjI1IDktOWgtNy4xNGMtLjM0Ljg2LS44NiAxLjU0LTEuODYgMS44NHoiIC8+PC9nPgo8ZyBpZD0iZHJhZnRzIj48cGF0aCBkPSJNMjEuOTkgOGMwLS43Mi0uMzctMS4zNS0uOTQtMS43TDEyIDEgMi45NSA2LjNDMi4zOCA2LjY1IDIgNy4yOCAyIDh2MTBjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMmwtLjAxLTEwek0xMiAxM0wzLjc0IDcuODQgMTIgM2w4LjI2IDQuODRMMTIgMTN6IiAvPjwvZz4KPGcgaWQ9ImVqZWN0Ij48cGF0aCBkPSJNNSAxN2gxNHYySDV6bTctMTJMNS4zMyAxNWgxMy4zNHoiIC8+PC9nPgo8ZyBpZD0iZXJyb3IiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi0yaDJ2MnptMC00aC0yVjdoMnY2eiIgLz48L2c+CjxnIGlkPSJlcnJvci1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMTVoMnYyaC0yem0wLThoMnY2aC0yem0uOTktNUM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJldXJvLXN5bWJvbCI+PHBhdGggZD0iTTE1IDE4LjVjLTIuNTEgMC00LjY4LTEuNDItNS43Ni0zLjVIMTV2LTJIOC41OGMtLjA1LS4zMy0uMDgtLjY2LS4wOC0xcy4wMy0uNjcuMDgtMUgxNVY5SDkuMjRDMTAuMzIgNi45MiAxMi41IDUuNSAxNSA1LjVjMS42MSAwIDMuMDkuNTkgNC4yMyAxLjU3TDIxIDUuM0MxOS40MSAzLjg3IDE3LjMgMyAxNSAzYy0zLjkyIDAtNy4yNCAyLjUxLTguNDggNkgzdjJoMy4wNmMtLjA0LjMzLS4wNi42Ni0uMDYgMSAwIC4zNC4wMi42Ny4wNiAxSDN2MmgzLjUyYzEuMjQgMy40OSA0LjU2IDYgOC40OCA2IDIuMzEgMCA0LjQxLS44NyA2LTIuM2wtMS43OC0xLjc3Yy0xLjEzLjk4LTIuNiAxLjU3LTQuMjIgMS41N3oiIC8+PC9nPgo8ZyBpZD0iZXZlbnQiPjxwYXRoIGQ9Ik0xNyAxMmgtNXY1aDV2LTV6TTE2IDF2Mkg4VjFINnYySDVjLTEuMTEgMC0xLjk5LjktMS45OSAyTDMgMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMmgtMVYxaC0yem0zIDE4SDVWOGgxNHYxMXoiIC8+PC9nPgo8ZyBpZD0iZXZlbnQtc2VhdCI+PHBhdGggZD0iTTQgMTh2M2gzdi0zaDEwdjNoM3YtNkg0em0xNS04aDN2M2gtM3pNMiAxMGgzdjNIMnptMTUgM0g3VjVjMC0xLjEuOS0yIDItMmg2YzEuMSAwIDIgLjkgMiAydjh6IiAvPjwvZz4KPGcgaWQ9ImV4aXQtdG8tYXBwIj48cGF0aCBkPSJNMTAuMDkgMTUuNTlMMTEuNSAxN2w1LTUtNS01LTEuNDEgMS40MUwxMi42NyAxMUgzdjJoOS42N2wtMi41OCAyLjU5ek0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnY0aDJWNWgxNHYxNEg1di00SDN2NGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJleHBhbmQtbGVzcyI+PHBhdGggZD0iTTEyIDhsLTYgNiAxLjQxIDEuNDFMMTIgMTAuODNsNC41OSA0LjU4TDE4IDE0eiIgLz48L2c+CjxnIGlkPSJleHBhbmQtbW9yZSI+PHBhdGggZD0iTTE2LjU5IDguNTlMMTIgMTMuMTcgNy40MSA4LjU5IDYgMTBsNiA2IDYtNnoiIC8+PC9nPgo8ZyBpZD0iZXhwbG9yZSI+PHBhdGggZD0iTTEyIDEwLjljLS42MSAwLTEuMS40OS0xLjEgMS4xcy40OSAxLjEgMS4xIDEuMWMuNjEgMCAxLjEtLjQ5IDEuMS0xLjFzLS40OS0xLjEtMS4xLTEuMXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMi4xOSAxMi4xOUw2IDE4bDMuODEtOC4xOUwxOCA2bC0zLjgxIDguMTl6IiAvPjwvZz4KPGcgaWQ9ImV4dGVuc2lvbiI+PHBhdGggZD0iTTIwLjUgMTFIMTlWN2MwLTEuMS0uOS0yLTItMmgtNFYzLjVDMTMgMi4xMiAxMS44OCAxIDEwLjUgMVM4IDIuMTIgOCAzLjVWNUg0Yy0xLjEgMC0xLjk5LjktMS45OSAydjMuOEgzLjVjMS40OSAwIDIuNyAxLjIxIDIuNyAyLjdzLTEuMjEgMi43LTIuNyAyLjdIMlYyMGMwIDEuMS45IDIgMiAyaDMuOHYtMS41YzAtMS40OSAxLjIxLTIuNyAyLjctMi43IDEuNDkgMCAyLjcgMS4yMSAyLjcgMi43VjIySDE3YzEuMSAwIDItLjkgMi0ydi00aDEuNWMxLjM4IDAgMi41LTEuMTIgMi41LTIuNVMyMS44OCAxMSAyMC41IDExeiIgLz48L2c+CjxnIGlkPSJmYWNlIj48cGF0aCBkPSJNOSAxMS43NWMtLjY5IDAtMS4yNS41Ni0xLjI1IDEuMjVzLjU2IDEuMjUgMS4yNSAxLjI1IDEuMjUtLjU2IDEuMjUtMS4yNS0uNTYtMS4yNS0xLjI1LTEuMjV6bTYgMGMtLjY5IDAtMS4yNS41Ni0xLjI1IDEuMjVzLjU2IDEuMjUgMS4yNSAxLjI1IDEuMjUtLjU2IDEuMjUtMS4yNS0uNTYtMS4yNS0xLjI1LTEuMjV6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04IDAtLjI5LjAyLS41OC4wNS0uODYgMi4zNi0xLjA1IDQuMjMtMi45OCA1LjIxLTUuMzdDMTEuMDcgOC4zMyAxNC4wNSAxMCAxNy40MiAxMGMuNzggMCAxLjUzLS4wOSAyLjI1LS4yNi4yMS43MS4zMyAxLjQ3LjMzIDIuMjYgMCA0LjQxLTMuNTkgOC04IDh6IiAvPjwvZz4KPGcgaWQ9ImZhdm9yaXRlIj48cGF0aCBkPSJNMTIgMjEuMzVsLTEuNDUtMS4zMkM1LjQgMTUuMzYgMiAxMi4yOCAyIDguNSAyIDUuNDIgNC40MiAzIDcuNSAzYzEuNzQgMCAzLjQxLjgxIDQuNSAyLjA5QzEzLjA5IDMuODEgMTQuNzYgMyAxNi41IDMgMTkuNTggMyAyMiA1LjQyIDIyIDguNWMwIDMuNzgtMy40IDYuODYtOC41NSAxMS41NEwxMiAyMS4zNXoiIC8+PC9nPgo8ZyBpZD0iZmF2b3JpdGUtYm9yZGVyIj48cGF0aCBkPSJNMTYuNSAzYy0xLjc0IDAtMy40MS44MS00LjUgMi4wOUMxMC45MSAzLjgxIDkuMjQgMyA3LjUgMyA0LjQyIDMgMiA1LjQyIDIgOC41YzAgMy43OCAzLjQgNi44NiA4LjU1IDExLjU0TDEyIDIxLjM1bDEuNDUtMS4zMkMxOC42IDE1LjM2IDIyIDEyLjI4IDIyIDguNSAyMiA1LjQyIDE5LjU4IDMgMTYuNSAzem0tNC40IDE1LjU1bC0uMS4xLS4xLS4xQzcuMTQgMTQuMjQgNCAxMS4zOSA0IDguNSA0IDYuNSA1LjUgNSA3LjUgNWMxLjU0IDAgMy4wNC45OSAzLjU3IDIuMzZoMS44N0MxMy40NiA1Ljk5IDE0Ljk2IDUgMTYuNSA1YzIgMCAzLjUgMS41IDMuNSAzLjUgMCAyLjg5LTMuMTQgNS43NC03LjkgMTAuMDV6IiAvPjwvZz4KPGcgaWQ9ImZlZWRiYWNrIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS03IDEyaC0ydi0yaDJ2MnptMC00aC0yVjZoMnY0eiIgLz48L2c+CjxnIGlkPSJmaWxlLWRvd25sb2FkIj48cGF0aCBkPSJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1eiIgLz48L2c+CjxnIGlkPSJmaWxlLXVwbG9hZCI+PHBhdGggZD0iTTkgMTZoNnYtNmg0bC03LTctNyA3aDR6bS00IDJoMTR2Mkg1eiIgLz48L2c+CjxnIGlkPSJmaWx0ZXItbGlzdCI+PHBhdGggZD0iTTEwIDE4aDR2LTJoLTR2MnpNMyA2djJoMThWNkgzem0zIDdoMTJ2LTJINnYyeiIgLz48L2c+CjxnIGlkPSJmaW5kLWluLXBhZ2UiPjxwYXRoIGQ9Ik0yMCAxOS41OVY4bC02LTZINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4Yy40NSAwIC44NS0uMTUgMS4xOS0uNGwtNC40My00LjQzYy0uOC41Mi0xLjc0LjgzLTIuNzYuODMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1YzAgMS4wMi0uMzEgMS45Ni0uODMgMi43NUwyMCAxOS41OXpNOSAxM2MwIDEuNjYgMS4zNCAzIDMgM3MzLTEuMzQgMy0zLTEuMzQtMy0zLTMtMyAxLjM0LTMgM3oiIC8+PC9nPgo8ZyBpZD0iZmluZC1yZXBsYWNlIj48cGF0aCBkPSJNMTEgNmMxLjM4IDAgMi42My41NiAzLjU0IDEuNDZMMTIgMTBoNlY0bC0yLjA1IDIuMDVDMTQuNjggNC43OCAxMi45MyA0IDExIDRjLTMuNTMgMC02LjQzIDIuNjEtNi45MiA2SDYuMWMuNDYtMi4yOCAyLjQ4LTQgNC45LTR6bTUuNjQgOS4xNGMuNjYtLjkgMS4xMi0xLjk3IDEuMjgtMy4xNEgxNS45Yy0uNDYgMi4yOC0yLjQ4IDQtNC45IDQtMS4zOCAwLTIuNjMtLjU2LTMuNTQtMS40NkwxMCAxMkg0djZsMi4wNS0yLjA1QzcuMzIgMTcuMjIgOS4wNyAxOCAxMSAxOGMxLjU1IDAgMi45OC0uNTEgNC4xNC0xLjM2TDIwIDIxLjQ5IDIxLjQ5IDIwbC00Ljg1LTQuODZ6IiAvPjwvZz4KPGcgaWQ9ImZpbmdlcnByaW50Ij48cGF0aCBkPSJNMTcuODEgNC40N2MtLjA4IDAtLjE2LS4wMi0uMjMtLjA2QzE1LjY2IDMuNDIgMTQgMyAxMi4wMSAzYy0xLjk4IDAtMy44Ni40Ny01LjU3IDEuNDEtLjI0LjEzLS41NC4wNC0uNjgtLjItLjEzLS4yNC0uMDQtLjU1LjItLjY4QzcuODIgMi41MiA5Ljg2IDIgMTIuMDEgMmMyLjEzIDAgMy45OS40NyA2LjAzIDEuNTIuMjUuMTMuMzQuNDMuMjEuNjctLjA5LjE4LS4yNi4yOC0uNDQuMjh6TTMuNSA5LjcyYy0uMSAwLS4yLS4wMy0uMjktLjA5LS4yMy0uMTYtLjI4LS40Ny0uMTItLjcuOTktMS40IDIuMjUtMi41IDMuNzUtMy4yN0M5Ljk4IDQuMDQgMTQgNC4wMyAxNy4xNSA1LjY1YzEuNS43NyAyLjc2IDEuODYgMy43NSAzLjI1LjE2LjIyLjExLjU0LS4xMi43LS4yMy4xNi0uNTQuMTEtLjctLjEyLS45LTEuMjYtMi4wNC0yLjI1LTMuMzktMi45NC0yLjg3LTEuNDctNi41NC0xLjQ3LTkuNC4wMS0xLjM2LjctMi41IDEuNy0zLjQgMi45Ni0uMDguMTQtLjIzLjIxLS4zOS4yMXptNi4yNSAxMi4wN2MtLjEzIDAtLjI2LS4wNS0uMzUtLjE1LS44Ny0uODctMS4zNC0xLjQzLTIuMDEtMi42NC0uNjktMS4yMy0xLjA1LTIuNzMtMS4wNS00LjM0IDAtMi45NyAyLjU0LTUuMzkgNS42Ni01LjM5czUuNjYgMi40MiA1LjY2IDUuMzljMCAuMjgtLjIyLjUtLjUuNXMtLjUtLjIyLS41LS41YzAtMi40Mi0yLjA5LTQuMzktNC42Ni00LjM5LTIuNTcgMC00LjY2IDEuOTctNC42NiA0LjM5IDAgMS40NC4zMiAyLjc3LjkzIDMuODUuNjQgMS4xNSAxLjA4IDEuNjQgMS44NSAyLjQyLjE5LjIuMTkuNTEgMCAuNzEtLjExLjEtLjI0LjE1LS4zNy4xNXptNy4xNy0xLjg1Yy0xLjE5IDAtMi4yNC0uMy0zLjEtLjg5LTEuNDktMS4wMS0yLjM4LTIuNjUtMi4zOC00LjM5IDAtLjI4LjIyLS41LjUtLjVzLjUuMjIuNS41YzAgMS40MS43MiAyLjc0IDEuOTQgMy41Ni43MS40OCAxLjU0LjcxIDIuNTQuNzEuMjQgMCAuNjQtLjAzIDEuMDQtLjEuMjctLjA1LjUzLjEzLjU4LjQxLjA1LjI3LS4xMy41My0uNDEuNTgtLjU3LjExLTEuMDcuMTItMS4yMS4xMnpNMTQuOTEgMjJjLS4wNCAwLS4wOS0uMDEtLjEzLS4wMi0xLjU5LS40NC0yLjYzLTEuMDMtMy43Mi0yLjEtMS40LTEuMzktMi4xNy0zLjI0LTIuMTctNS4yMiAwLTEuNjIgMS4zOC0yLjk0IDMuMDgtMi45NCAxLjcgMCAzLjA4IDEuMzIgMy4wOCAyLjk0IDAgMS4wNy45MyAxLjk0IDIuMDggMS45NHMyLjA4LS44NyAyLjA4LTEuOTRjMC0zLjc3LTMuMjUtNi44My03LjI1LTYuODMtMi44NCAwLTUuNDQgMS41OC02LjYxIDQuMDMtLjM5LjgxLS41OSAxLjc2LS41OSAyLjggMCAuNzguMDcgMi4wMS42NyAzLjYxLjEuMjYtLjAzLjU1LS4yOS42NC0uMjYuMS0uNTUtLjA0LS42NC0uMjktLjQ5LTEuMzEtLjczLTIuNjEtLjczLTMuOTYgMC0xLjIuMjMtMi4yOS42OC0zLjI0IDEuMzMtMi43OSA0LjI4LTQuNiA3LjUxLTQuNiA0LjU1IDAgOC4yNSAzLjUxIDguMjUgNy44MyAwIDEuNjItMS4zOCAyLjk0LTMuMDggMi45NHMtMy4wOC0xLjMyLTMuMDgtMi45NGMwLTEuMDctLjkzLTEuOTQtMi4wOC0xLjk0cy0yLjA4Ljg3LTIuMDggMS45NGMwIDEuNzEuNjYgMy4zMSAxLjg3IDQuNTEuOTUuOTQgMS44NiAxLjQ2IDMuMjcgMS44NS4yNy4wNy40Mi4zNS4zNS42MS0uMDUuMjMtLjI2LjM4LS40Ny4zOHoiIC8+PC9nPgo8ZyBpZD0iZmlyc3QtcGFnZSI+PHBhdGggZD0iTTE4LjQxIDE2LjU5TDEzLjgyIDEybDQuNTktNC41OUwxNyA2bC02IDYgNiA2ek02IDZoMnYxMkg2eiIgLz48L2c+CjxnIGlkPSJmbGFnIj48cGF0aCBkPSJNMTQuNCA2TDE0IDRINXYxN2gydi03aDUuNmwuNCAyaDdWNnoiIC8+PC9nPgo8ZyBpZD0iZmxpZ2h0LWxhbmQiPjxwYXRoIGQ9Ik0yLjUgMTloMTl2MmgtMTl6bTcuMTgtNS43M2w0LjM1IDEuMTYgNS4zMSAxLjQyYy44LjIxIDEuNjItLjI2IDEuODQtMS4wNi4yMS0uOC0uMjYtMS42Mi0xLjA2LTEuODRsLTUuMzEtMS40Mi0yLjc2LTkuMDJMMTAuMTIgMnY4LjI4TDUuMTUgOC45NWwtLjkzLTIuMzItMS40NS0uMzl2NS4xN2wxLjYuNDMgNS4zMSAxLjQzeiIgLz48L2c+CjxnIGlkPSJmbGlnaHQtdGFrZW9mZiI+PHBhdGggZD0iTTIuNSAxOWgxOXYyaC0xOXptMTkuNTctOS4zNmMtLjIxLS44LTEuMDQtMS4yOC0xLjg0LTEuMDZMMTQuOTIgMTBsLTYuOS02LjQzLTEuOTMuNTEgNC4xNCA3LjE3LTQuOTcgMS4zMy0xLjk3LTEuNTQtMS40NS4zOSAxLjgyIDMuMTYuNzcgMS4zMyAxLjYtLjQzIDUuMzEtMS40MiA0LjM1LTEuMTZMMjEgMTEuNDljLjgxLS4yMyAxLjI4LTEuMDUgMS4wNy0xLjg1eiIgLz48L2c+CjxnIGlkPSJmbGlwLXRvLWJhY2siPjxwYXRoIGQ9Ik05IDdIN3YyaDJWN3ptMCA0SDd2Mmgydi0yem0wLThjLTEuMTEgMC0yIC45LTIgMmgyVjN6bTQgMTJoLTJ2Mmgydi0yem02LTEydjJoMmMwLTEuMS0uOS0yLTItMnptLTYgMGgtMnYyaDJWM3pNOSAxN3YtMkg3YzAgMS4xLjg5IDIgMiAyem0xMC00aDJ2LTJoLTJ2MnptMC00aDJWN2gtMnYyem0wIDhjMS4xIDAgMi0uOSAyLTJoLTJ2MnpNNSA3SDN2MTJjMCAxLjEuODkgMiAyIDJoMTJ2LTJINVY3em0xMC0yaDJWM2gtMnYyem0wIDEyaDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0iZmxpcC10by1mcm9udCI+PHBhdGggZD0iTTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMiA0di0ySDNjMCAxLjEuODkgMiAyIDJ6TTMgOWgyVjdIM3Yyem0xMiAxMmgydi0yaC0ydjJ6bTQtMThIOWMtMS4xMSAwLTIgLjktMiAydjEwYzAgMS4xLjg5IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTJIOVY1aDEwdjEwem0tOCA2aDJ2LTJoLTJ2MnptLTQgMGgydi0ySDd2MnoiIC8+PC9nPgo8ZyBpZD0iZm9sZGVyIj48cGF0aCBkPSJNMTAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yaC04bC0yLTJ6IiAvPjwvZz4KPGcgaWQ9ImZvbGRlci1vcGVuIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bTAgMTJINFY4aDE2djEweiIgLz48L2c+CjxnIGlkPSJmb2xkZXItc2hhcmVkIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bS01IDNjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyLTItLjktMi0yIC45LTIgMi0yem00IDhoLTh2LTFjMC0xLjMzIDIuNjctMiA0LTJzNCAuNjcgNCAydjF6IiAvPjwvZz4KPGcgaWQ9ImZvbnQtZG93bmxvYWQiPjxwYXRoIGQ9Ik05LjkzIDEzLjVoNC4xNEwxMiA3Ljk4ek0yMCAySDRjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTQuMDUgMTYuNWwtMS4xNC0zSDkuMTdsLTEuMTIgM0g1Ljk2bDUuMTEtMTNoMS44Nmw1LjExIDEzaC0yLjA5eiIgLz48L2c+CjxnIGlkPSJmb3J3YXJkIj48cGF0aCBkPSJNMTIgOFY0bDggOC04IDh2LTRINFY4eiIgLz48L2c+CjxnIGlkPSJmdWxsc2NyZWVuIj48cGF0aCBkPSJNNyAxNEg1djVoNXYtMkg3di0zem0tMi00aDJWN2gzVjVINXY1em0xMiA3aC0zdjJoNXYtNWgtMnYzek0xNCA1djJoM3YzaDJWNWgtNXoiIC8+PC9nPgo8ZyBpZD0iZnVsbHNjcmVlbi1leGl0Ij48cGF0aCBkPSJNNSAxNmgzdjNoMnYtNUg1djJ6bTMtOEg1djJoNVY1SDh2M3ptNiAxMWgydi0zaDN2LTJoLTV2NXptMi0xMVY1aC0ydjVoNVY4aC0zeiIgLz48L2c+CjxnIGlkPSJnLXRyYW5zbGF0ZSI+PHBhdGggZD0iTTIwIDVoLTkuMTJMMTAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxM2MwIDEuMS45IDIgMiAyaDdsMSAzaDhjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnpNNy4xNyAxNC41OWMtMi4yNSAwLTQuMDktMS44My00LjA5LTQuMDlzMS44My00LjA5IDQuMDktNC4wOWMxLjA0IDAgMS45OS4zNyAyLjc0IDEuMDdsLjA3LjA2LTEuMjMgMS4xOC0uMDYtLjA1Yy0uMjktLjI3LS43OC0uNTktMS41Mi0uNTktMS4zMSAwLTIuMzggMS4wOS0yLjM4IDIuNDJzMS4wNyAyLjQyIDIuMzggMi40MmMxLjM3IDAgMS45Ni0uODcgMi4xMi0xLjQ2SDcuMDhWOS45MWgzLjk1bC4wMS4wN2MuMDQuMjEuMDUuNC4wNS42MSAwIDIuMzUtMS42MSA0LTMuOTIgNHptNi4wMy0xLjcxYy4zMy42Ljc0IDEuMTggMS4xOSAxLjdsLS41NC41My0uNjUtMi4yM3ptLjc3LS43NmgtLjk5bC0uMzEtMS4wNGgzLjk5cy0uMzQgMS4zMS0xLjU2IDIuNzRjLS41Mi0uNjItLjg5LTEuMjMtMS4xMy0xLjd6TTIxIDIwYzAgLjU1LS40NSAxLTEgMWgtN2wyLTItLjgxLTIuNzcuOTItLjkyTDE3Ljc5IDE4bC43My0uNzMtMi43MS0yLjY4Yy45LTEuMDMgMS42LTIuMjUgMS45Mi0zLjUxSDE5di0xLjA0aC0zLjY0VjloLTEuMDR2MS4wNGgtMS45NkwxMS4xOCA2SDIwYy41NSAwIDEgLjQ1IDEgMXYxM3oiIC8+PC9nPgo8ZyBpZD0iZ2F2ZWwiPjxwYXRoIGQ9Ik0xIDIxaDEydjJIMXpNNS4yNDUgOC4wN2wyLjgzLTIuODI3IDE0LjE0IDE0LjE0Mi0yLjgyOCAyLjgyOHpNMTIuMzE3IDFsNS42NTcgNS42NTYtMi44MyAyLjgzLTUuNjU0LTUuNjZ6TTMuODI1IDkuNDg1bDUuNjU3IDUuNjU3LTIuODI4IDIuODI4LTUuNjU3LTUuNjU3eiIgLz48L2c+CjxnIGlkPSJnZXN0dXJlIj48cGF0aCBkPSJNNC41OSA2Ljg5Yy43LS43MSAxLjQtMS4zNSAxLjcxLTEuMjIuNS4yIDAgMS4wMy0uMyAxLjUyLS4yNS40Mi0yLjg2IDMuODktMi44NiA2LjMxIDAgMS4yOC40OCAyLjM0IDEuMzQgMi45OC43NS41NiAxLjc0LjczIDIuNjQuNDYgMS4wNy0uMzEgMS45NS0xLjQgMy4wNi0yLjc3IDEuMjEtMS40OSAyLjgzLTMuNDQgNC4wOC0zLjQ0IDEuNjMgMCAxLjY1IDEuMDEgMS43NiAxLjc5LTMuNzguNjQtNS4zOCAzLjY3LTUuMzggNS4zNyAwIDEuNyAxLjQ0IDMuMDkgMy4yMSAzLjA5IDEuNjMgMCA0LjI5LTEuMzMgNC42OS02LjFIMjF2LTIuNWgtMi40N2MtLjE1LTEuNjUtMS4wOS00LjItNC4wMy00LjItMi4yNSAwLTQuMTggMS45MS00Ljk0IDIuODQtLjU4LjczLTIuMDYgMi40OC0yLjI5IDIuNzItLjI1LjMtLjY4Ljg0LTEuMTEuODQtLjQ1IDAtLjcyLS44My0uMzYtMS45Mi4zNS0xLjA5IDEuNC0yLjg2IDEuODUtMy41Mi43OC0xLjE0IDEuMy0xLjkyIDEuMy0zLjI4QzguOTUgMy42OSA3LjMxIDMgNi40NCAzIDUuMTIgMyAzLjk3IDQgMy43MiA0LjI1Yy0uMzYuMzYtLjY2LjY2LS44OC45M2wxLjc1IDEuNzF6bTkuMjkgMTEuNjZjLS4zMSAwLS43NC0uMjYtLjc0LS43MiAwLS42LjczLTIuMiAyLjg3LTIuNzYtLjMgMi42OS0xLjQzIDMuNDgtMi4xMyAzLjQ4eiIgLz48L2c+CjxnIGlkPSJnZXQtYXBwIj48cGF0aCBkPSJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1eiIgLz48L2c+CjxnIGlkPSJnaWYiPjxwYXRoIGQ9Ik0xMS41IDlIMTN2NmgtMS41ek05IDlINmMtLjYgMC0xIC41LTEgMXY0YzAgLjUuNCAxIDEgMWgzYy42IDAgMS0uNSAxLTF2LTJIOC41djEuNWgtMnYtM0gxMFYxMGMwLS41LS40LTEtMS0xem0xMCAxLjVWOWgtNC41djZIMTZ2LTJoMnYtMS41aC0ydi0xeiIgLz48L2c+CjxnIGlkPSJncmFkZSI+PHBhdGggZD0iTTEyIDE3LjI3TDE4LjE4IDIxbC0xLjY0LTcuMDNMMjIgOS4yNGwtNy4xOS0uNjFMMTIgMiA5LjE5IDguNjMgMiA5LjI0bDUuNDYgNC43M0w1LjgyIDIxeiIgLz48L2c+CjxnIGlkPSJncm91cC13b3JrIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNOCAxNy41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXpNOS41IDhjMC0xLjM4IDEuMTItMi41IDIuNS0yLjVzMi41IDEuMTIgMi41IDIuNS0xLjEyIDIuNS0yLjUgMi41UzkuNSA5LjM4IDkuNSA4em02LjUgOS41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXoiIC8+PC9nPgo8ZyBpZD0iaGVscCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTEgMTdoLTJ2LTJoMnYyem0yLjA3LTcuNzVsLS45LjkyQzEzLjQ1IDEyLjkgMTMgMTMuNSAxMyAxNWgtMnYtLjVjMC0xLjEuNDUtMi4xIDEuMTctMi44M2wxLjI0LTEuMjZjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJIOGMwLTIuMjEgMS43OS00IDQtNHM0IDEuNzkgNCA0YzAgLjg4LS4zNiAxLjY4LS45MyAyLjI1eiIgLz48L2c+CjxnIGlkPSJoZWxwLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMSAxOGgydi0yaC0ydjJ6bTEtMTZDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4em0wLTE0Yy0yLjIxIDAtNCAxLjc5LTQgNGgyYzAtMS4xLjktMiAyLTJzMiAuOSAyIDJjMCAyLTMgMS43NS0zIDVoMmMwLTIuMjUgMy0yLjUgMy01IDAtMi4yMS0xLjc5LTQtNC00eiIgLz48L2c+CjxnIGlkPSJoaWdobGlnaHQtb2ZmIj48cGF0aCBkPSJNMTQuNTkgOEwxMiAxMC41OSA5LjQxIDggOCA5LjQxIDEwLjU5IDEyIDggMTQuNTkgOS40MSAxNiAxMiAxMy40MSAxNC41OSAxNiAxNiAxNC41OSAxMy40MSAxMiAxNiA5LjQxIDE0LjU5IDh6TTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJoaXN0b3J5Ij48cGF0aCBkPSJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyeiIgLz48L2c+CjxnIGlkPSJob21lIj48cGF0aCBkPSJNMTAgMjB2LTZoNHY2aDV2LThoM0wxMiAzIDIgMTJoM3Y4eiIgLz48L2c+CjxnIGlkPSJob3VyZ2xhc3MtZW1wdHkiPjxwYXRoIGQ9Ik02IDJ2NmguMDFMNiA4LjAxIDEwIDEybC00IDQgLjAxLjAxSDZWMjJoMTJ2LTUuOTloLS4wMUwxOCAxNmwtNC00IDQtMy45OS0uMDEtLjAxSDE4VjJINnptMTAgMTQuNVYyMEg4di0zLjVsNC00IDQgNHptLTQtNWwtNC00VjRoOHYzLjVsLTQgNHoiIC8+PC9nPgo8ZyBpZD0iaG91cmdsYXNzLWZ1bGwiPjxwYXRoIGQ9Ik02IDJ2NmguMDFMNiA4LjAxIDEwIDEybC00IDQgLjAxLjAxSDZWMjJoMTJ2LTUuOTloLS4wMUwxOCAxNmwtNC00IDQtMy45OS0uMDEtLjAxSDE4VjJINnoiIC8+PC9nPgo8ZyBpZD0iaHR0cCI+PHBhdGggZD0iTTQuNSAxMWgtMlY5SDF2NmgxLjV2LTIuNWgyVjE1SDZWOUg0LjV2MnptMi41LS41aDEuNVYxNUgxMHYtNC41aDEuNVY5SDd2MS41em01LjUgMEgxNFYxNWgxLjV2LTQuNUgxN1Y5aC00LjV2MS41em05LTEuNUgxOHY2aDEuNXYtMmgyYy44IDAgMS41LS43IDEuNS0xLjV2LTFjMC0uOC0uNy0xLjUtMS41LTEuNXptMCAyLjVoLTJ2LTFoMnYxeiIgLz48L2c+CjxnIGlkPSJodHRwcyI+PHBhdGggZD0iTTE4IDhoLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnptLTYgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6bTMuMS05SDguOVY2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xIDEuNzEgMCAzLjEgMS4zOSAzLjEgMy4xdjJ6IiAvPjwvZz4KPGcgaWQ9ImltcG9ydGFudC1kZXZpY2VzIj48cGF0aCBkPSJNMjMgMTEuMDFMMTggMTFjLS41NSAwLTEgLjQ1LTEgMXY5YzAgLjU1LjQ1IDEgMSAxaDVjLjU1IDAgMS0uNDUgMS0xdi05YzAtLjU1LS40NS0uOTktMS0uOTl6TTIzIDIwaC01di03aDV2N3pNMjAgMkgyQy44OSAyIDAgMi44OSAwIDR2MTJjMCAxLjEuODkgMiAyIDJoN3YySDd2Mmg4di0yaC0ydi0yaDJ2LTJIMlY0aDE4djVoMlY0YzAtMS4xMS0uOS0yLTItMnptLTguMDMgN0wxMSA2bC0uOTcgM0g3bDIuNDcgMS43Ni0uOTQgMi45MSAyLjQ3LTEuOCAyLjQ3IDEuOC0uOTQtMi45MUwxNSA5aC0zLjAzeiIgLz48L2c+CjxnIGlkPSJpbmJveCI+PHBhdGggZD0iTTE5IDNINC45OWMtMS4xMSAwLTEuOTguODktMS45OCAyTDMgMTljMCAxLjEuODggMiAxLjk5IDJIMTljMS4xIDAgMi0uOSAyLTJWNWMwLTEuMTEtLjktMi0yLTJ6bTAgMTJoLTRjMCAxLjY2LTEuMzUgMy0zIDNzLTMtMS4zNC0zLTNINC45OVY1SDE5djEweiIgLz48L2c+CjxnIGlkPSJpbmRldGVybWluYXRlLWNoZWNrLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tMiAxMEg3di0yaDEwdjJ6IiAvPjwvZz4KPGcgaWQ9ImluZm8iPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi02aDJ2NnptMC04aC0yVjdoMnYyeiIgLz48L2c+CjxnIGlkPSJpbmZvLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMSAxN2gydi02aC0ydjZ6bTEtMTVDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4ek0xMSA5aDJWN2gtMnYyeiIgLz48L2c+CjxnIGlkPSJpbnB1dCI+PHBhdGggZD0iTTIxIDMuMDFIM2MtMS4xIDAtMiAuOS0yIDJWOWgyVjQuOTloMTh2MTQuMDNIM1YxNUgxdjQuMDFjMCAxLjEuOSAxLjk4IDIgMS45OGgxOGMxLjEgMCAyLS44OCAyLTEuOTh2LTE0YzAtMS4xMS0uOS0yLTItMnpNMTEgMTZsNC00LTQtNHYzSDF2MmgxMHYzeiIgLz48L2c+CjxnIGlkPSJpbnZlcnQtY29sb3JzIj48cGF0aCBkPSJNMTcuNjYgNy45M0wxMiAyLjI3IDYuMzQgNy45M2MtMy4xMiAzLjEyLTMuMTIgOC4xOSAwIDExLjMxQzcuOSAyMC44IDkuOTUgMjEuNTggMTIgMjEuNThjMi4wNSAwIDQuMS0uNzggNS42Ni0yLjM0IDMuMTItMy4xMiAzLjEyLTguMTkgMC0xMS4zMXpNMTIgMTkuNTljLTEuNiAwLTMuMTEtLjYyLTQuMjQtMS43NkM2LjYyIDE2LjY5IDYgMTUuMTkgNiAxMy41OXMuNjItMy4xMSAxLjc2LTQuMjRMMTIgNS4xdjE0LjQ5eiIgLz48L2c+CjxnIGlkPSJsYWJlbCI+PHBhdGggZD0iTTE3LjYzIDUuODRDMTcuMjcgNS4zMyAxNi42NyA1IDE2IDVMNSA1LjAxQzMuOSA1LjAxIDMgNS45IDMgN3YxMGMwIDEuMS45IDEuOTkgMiAxLjk5TDE2IDE5Yy42NyAwIDEuMjctLjMzIDEuNjMtLjg0TDIyIDEybC00LjM3LTYuMTZ6IiAvPjwvZz4KPGcgaWQ9ImxhYmVsLW91dGxpbmUiPjxwYXRoIGQ9Ik0xNy42MyA1Ljg0QzE3LjI3IDUuMzMgMTYuNjcgNSAxNiA1TDUgNS4wMUMzLjkgNS4wMSAzIDUuOSAzIDd2MTBjMCAxLjEuOSAxLjk5IDIgMS45OUwxNiAxOWMuNjcgMCAxLjI3LS4zMyAxLjYzLS44NEwyMiAxMmwtNC4zNy02LjE2ek0xNiAxN0g1VjdoMTFsMy41NSA1TDE2IDE3eiIgLz48L2c+CjxnIGlkPSJsYW5ndWFnZSI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6bTYuOTMgNmgtMi45NWMtLjMyLTEuMjUtLjc4LTIuNDUtMS4zOC0zLjU2IDEuODQuNjMgMy4zNyAxLjkxIDQuMzMgMy41NnpNMTIgNC4wNGMuODMgMS4yIDEuNDggMi41MyAxLjkxIDMuOTZoLTMuODJjLjQzLTEuNDMgMS4wOC0yLjc2IDEuOTEtMy45NnpNNC4yNiAxNEM0LjEgMTMuMzYgNCAxMi42OSA0IDEycy4xLTEuMzYuMjYtMmgzLjM4Yy0uMDguNjYtLjE0IDEuMzItLjE0IDIgMCAuNjguMDYgMS4zNC4xNCAySDQuMjZ6bS44MiAyaDIuOTVjLjMyIDEuMjUuNzggMi40NSAxLjM4IDMuNTYtMS44NC0uNjMtMy4zNy0xLjktNC4zMy0zLjU2em0yLjk1LThINS4wOGMuOTYtMS42NiAyLjQ5LTIuOTMgNC4zMy0zLjU2QzguODEgNS41NSA4LjM1IDYuNzUgOC4wMyA4ek0xMiAxOS45NmMtLjgzLTEuMi0xLjQ4LTIuNTMtMS45MS0zLjk2aDMuODJjLS40MyAxLjQzLTEuMDggMi43Ni0xLjkxIDMuOTZ6TTE0LjM0IDE0SDkuNjZjLS4wOS0uNjYtLjE2LTEuMzItLjE2LTIgMC0uNjguMDctMS4zNS4xNi0yaDQuNjhjLjA5LjY1LjE2IDEuMzIuMTYgMiAwIC42OC0uMDcgMS4zNC0uMTYgMnptLjI1IDUuNTZjLjYtMS4xMSAxLjA2LTIuMzEgMS4zOC0zLjU2aDIuOTVjLS45NiAxLjY1LTIuNDkgMi45My00LjMzIDMuNTZ6TTE2LjM2IDE0Yy4wOC0uNjYuMTQtMS4zMi4xNC0yIDAtLjY4LS4wNi0xLjM0LS4xNC0yaDMuMzhjLjE2LjY0LjI2IDEuMzEuMjYgMnMtLjEgMS4zNi0uMjYgMmgtMy4zOHoiIC8+PC9nPgo8ZyBpZD0ibGFzdC1wYWdlIj48cGF0aCBkPSJNNS41OSA3LjQxTDEwLjE4IDEybC00LjU5IDQuNTlMNyAxOGw2LTYtNi02ek0xNiA2aDJ2MTJoLTJ6IiAvPjwvZz4KPGcgaWQ9ImxhdW5jaCI+PHBhdGggZD0iTTE5IDE5SDVWNWg3VjNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi03aC0ydjd6TTE0IDN2MmgzLjU5bC05LjgzIDkuODMgMS40MSAxLjQxTDE5IDYuNDFWMTBoMlYzaC03eiIgLz48L2c+CjxnIGlkPSJsaWdodGJ1bGItb3V0bGluZSI+PHBhdGggZD0iTTkgMjFjMCAuNTUuNDUgMSAxIDFoNGMuNTUgMCAxLS40NSAxLTF2LTFIOXYxem0zLTE5QzguMTQgMiA1IDUuMTQgNSA5YzAgMi4zOCAxLjE5IDQuNDcgMyA1Ljc0VjE3YzAgLjU1LjQ1IDEgMSAxaDZjLjU1IDAgMS0uNDUgMS0xdi0yLjI2YzEuODEtMS4yNyAzLTMuMzYgMy01Ljc0IDAtMy44Ni0zLjE0LTctNy03em0yLjg1IDExLjFsLS44NS42VjE2aC00di0yLjNsLS44NS0uNkM3LjggMTIuMTYgNyAxMC42MyA3IDljMC0yLjc2IDIuMjQtNSA1LTVzNSAyLjI0IDUgNWMwIDEuNjMtLjggMy4xNi0yLjE1IDQuMXoiIC8+PC9nPgo8ZyBpZD0ibGluZS1zdHlsZSI+PHBhdGggZD0iTTMgMTZoNXYtMkgzdjJ6bTYuNSAwaDV2LTJoLTV2MnptNi41IDBoNXYtMmgtNXYyek0zIDIwaDJ2LTJIM3Yyem00IDBoMnYtMkg3djJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6TTMgMTJoOHYtMkgzdjJ6bTEwIDBoOHYtMmgtOHYyek0zIDR2NGgxOFY0SDN6IiAvPjwvZz4KPGcgaWQ9ImxpbmUtd2VpZ2h0Ij48cGF0aCBkPSJNMyAxN2gxOHYtMkgzdjJ6bTAgM2gxOHYtMUgzdjF6bTAtN2gxOHYtM0gzdjN6bTAtOXY0aDE4VjRIM3oiIC8+PC9nPgo8ZyBpZD0ibGluayI+PHBhdGggZD0iTTMuOSAxMmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMWg0VjdIN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNWg0di0xLjlIN2MtMS43MSAwLTMuMS0xLjM5LTMuMS0zLjF6TTggMTNoOHYtMkg4djJ6bTktNmgtNHYxLjloNGMxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXMtMS4zOSAzLjEtMy4xIDMuMWgtNFYxN2g0YzIuNzYgMCA1LTIuMjQgNS01cy0yLjI0LTUtNS01eiIgLz48L2c+CjxnIGlkPSJsaXN0Ij48cGF0aCBkPSJNMyAxM2gydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0wLThoMlY3SDN2MnptNCA0aDE0di0ySDd2MnptMCA0aDE0di0ySDd2MnpNNyA3djJoMTRWN0g3eiIgLz48L2c+CjxnIGlkPSJsb2NrIj48cGF0aCBkPSJNMTggOGgtMVY2YzAtMi43Ni0yLjI0LTUtNS01UzcgMy4yNCA3IDZ2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yem0tNiA5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnptMy4xLTlIOC45VjZjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjEgMS43MSAwIDMuMSAxLjM5IDMuMSAzLjF2MnoiIC8+PC9nPgo8ZyBpZD0ibG9jay1vcGVuIj48cGF0aCBkPSJNMTIgMTdjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem02LTloLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2aDEuOWMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMSAxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6bTAgMTJINlYxMGgxMnYxMHoiIC8+PC9nPgo8ZyBpZD0ibG9jay1vdXRsaW5lIj48cGF0aCBkPSJNMTIgMTdjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem02LTloLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnpNOC45IDZjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjFzMy4xIDEuMzkgMy4xIDMuMXYySDguOVY2ek0xOCAyMEg2VjEwaDEydjEweiIgLz48L2c+CjxnIGlkPSJsb3ctcHJpb3JpdHkiPjxwYXRoIGQ9Ik0xNCA1aDh2MmgtOHptMCA1LjVoOHYyaC04em0wIDUuNWg4djJoLTh6TTIgMTEuNUMyIDE1LjA4IDQuOTIgMTggOC41IDE4SDl2MmwzLTMtMy0zdjJoLS41QzYuMDIgMTYgNCAxMy45OCA0IDExLjVTNi4wMiA3IDguNSA3SDEyVjVIOC41QzQuOTIgNSAyIDcuOTIgMiAxMS41eiIgLz48L2c+CjxnIGlkPSJsb3lhbHR5Ij48cGF0aCBkPSJNMjEuNDEgMTEuNThsLTktOUMxMi4wNSAyLjIyIDExLjU1IDIgMTEgMkg0Yy0xLjEgMC0yIC45LTIgMnY3YzAgLjU1LjIyIDEuMDUuNTkgMS40Mmw5IDljLjM2LjM2Ljg2LjU4IDEuNDEuNTguNTUgMCAxLjA1LS4yMiAxLjQxLS41OWw3LTdjLjM3LS4zNi41OS0uODYuNTktMS40MSAwLS41NS0uMjMtMS4wNi0uNTktMS40MnpNNS41IDdDNC42NyA3IDQgNi4zMyA0IDUuNVM0LjY3IDQgNS41IDQgNyA0LjY3IDcgNS41IDYuMzMgNyA1LjUgN3ptMTEuNzcgOC4yN0wxMyAxOS41NGwtNC4yNy00LjI3QzguMjggMTQuODEgOCAxNC4xOSA4IDEzLjVjMC0xLjM4IDEuMTItMi41IDIuNS0yLjUuNjkgMCAxLjMyLjI4IDEuNzcuNzRsLjczLjcyLjczLS43M2MuNDUtLjQ1IDEuMDgtLjczIDEuNzctLjczIDEuMzggMCAyLjUgMS4xMiAyLjUgMi41IDAgLjY5LS4yOCAxLjMyLS43MyAxLjc3eiIgLz48L2c+CjxnIGlkPSJtYWlsIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDRsLTggNS04LTVWNmw4IDUgOC01djJ6IiAvPjwvZz4KPGcgaWQ9Im1hcmt1bnJlYWQiPjxwYXRoIGQ9Ik0yMCA0SDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgNGwtOCA1LTgtNVY2bDggNSA4LTV2MnoiIC8+PC9nPgo8ZyBpZD0ibWFya3VucmVhZC1tYWlsYm94Ij48cGF0aCBkPSJNMjAgNkgxMHY2SDhWNGg2VjBINnY2SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ibWVudSI+PHBhdGggZD0iTTMgMThoMTh2LTJIM3Yyem0wLTVoMTh2LTJIM3Yyem0wLTd2MmgxOFY2SDN6IiAvPjwvZz4KPGcgaWQ9Im1vcmUtaG9yaXoiPjxwYXRoIGQ9Ik02IDEwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMTIgMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bS02IDBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJtb3JlLXZlcnQiPjxwYXRoIGQ9Ik0xMiA4YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptMCAyYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMCA2Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ibW90b3JjeWNsZSI+PHBhdGggZD0iTTE5LjQ0IDkuMDNMMTUuNDEgNUgxMXYyaDMuNTlsMiAySDVjLTIuOCAwLTUgMi4yLTUgNXMyLjIgNSA1IDVjMi40NiAwIDQuNDUtMS42OSA0LjktNGgxLjY1bDIuNzctMi43N2MtLjIxLjU0LS4zMiAxLjE0LS4zMiAxLjc3IDAgMi44IDIuMiA1IDUgNXM1LTIuMiA1LTVjMC0yLjY1LTEuOTctNC43Ny00LjU2LTQuOTd6TTcuODIgMTVDNy40IDE2LjE1IDYuMjggMTcgNSAxN2MtMS42MyAwLTMtMS4zNy0zLTNzMS4zNy0zIDMtM2MxLjI4IDAgMi40Ljg1IDIuODIgMkg1djJoMi44MnpNMTkgMTdjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzeiIgLz48L2c+CjxnIGlkPSJtb3ZlLXRvLWluYm94Ij48cGF0aCBkPSJNMTkgM0g0Ljk5Yy0xLjExIDAtMS45OC45LTEuOTggMkwzIDE5YzAgMS4xLjg4IDIgMS45OSAySDE5YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTJoLTRjMCAxLjY2LTEuMzUgMy0zIDNzLTMtMS4zNC0zLTNINC45OVY1SDE5djEwem0tMy01aC0yVjdoLTR2M0g4bDQgNCA0LTR6IiAvPjwvZz4KPGcgaWQ9Im5leHQtd2VlayI+PHBhdGggZD0iTTIwIDdoLTRWNWMwLS41NS0uMjItMS4wNS0uNTktMS40MUMxNS4wNSAzLjIyIDE0LjU1IDMgMTQgM2gtNGMtMS4xIDAtMiAuOS0yIDJ2Mkg0Yy0xLjEgMC0yIC45LTIgMnYxMWMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjljMC0xLjEtLjktMi0yLTJ6TTEwIDVoNHYyaC00VjV6bTEgMTMuNWwtMS0xIDMtMy0zLTMgMS0xIDQgNC00IDR6IiAvPjwvZz4KPGcgaWQ9Im5vdGUtYWRkIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0yIDE0aC0zdjNoLTJ2LTNIOHYtMmgzdi0zaDJ2M2gzdjJ6bS0zLTdWMy41TDE4LjUgOUgxM3oiIC8+PC9nPgo8ZyBpZD0ib2ZmbGluZS1waW4iPjxwYXRoIGQ9Ik0xMiAyQzYuNSAyIDIgNi41IDIgMTJzNC41IDEwIDEwIDEwIDEwLTQuNSAxMC0xMFMxNy41IDIgMTIgMnptNSAxNkg3di0yaDEwdjJ6bS02LjctNEw3IDEwLjdsMS40LTEuNCAxLjkgMS45IDUuMy01LjNMMTcgNy4zIDEwLjMgMTR6IiAvPjwvZz4KPGcgaWQ9Im9wYWNpdHkiPjxwYXRoIGQ9Ik0xNy42NiA4TDEyIDIuMzUgNi4zNCA4QzQuNzggOS41NiA0IDExLjY0IDQgMTMuNjRzLjc4IDQuMTEgMi4zNCA1LjY3IDMuNjEgMi4zNSA1LjY2IDIuMzUgNC4xLS43OSA1LjY2LTIuMzVTMjAgMTUuNjQgMjAgMTMuNjQgMTkuMjIgOS41NiAxNy42NiA4ek02IDE0Yy4wMS0yIC42Mi0zLjI3IDEuNzYtNC40TDEyIDUuMjdsNC4yNCA0LjM4QzE3LjM4IDEwLjc3IDE3Ljk5IDEyIDE4IDE0SDZ6IiAvPjwvZz4KPGcgaWQ9Im9wZW4taW4tYnJvd3NlciI+PHBhdGggZD0iTTE5IDRINWMtMS4xMSAwLTIgLjktMiAydjEyYzAgMS4xLjg5IDIgMiAyaDR2LTJINVY4aDE0djEwaC00djJoNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS44OS0yLTItMnptLTcgNmwtNCA0aDN2Nmgydi02aDNsLTQtNHoiIC8+PC9nPgo8ZyBpZD0ib3Blbi1pbi1uZXciPjxwYXRoIGQ9Ik0xOSAxOUg1VjVoN1YzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiIC8+PC9nPgo8ZyBpZD0ib3Blbi13aXRoIj48cGF0aCBkPSJNMTAgOWg0VjZoM2wtNS01LTUgNWgzdjN6bS0xIDFINlY3bC01IDUgNSA1di0zaDN2LTR6bTE0IDJsLTUtNXYzaC0zdjRoM3YzbDUtNXptLTkgM2gtNHYzSDdsNSA1IDUtNWgtM3YtM3oiIC8+PC9nPgo8ZyBpZD0icGFnZXZpZXciPjxwYXRoIGQ9Ik0xMS41IDlDMTAuMTIgOSA5IDEwLjEyIDkgMTEuNXMxLjEyIDIuNSAyLjUgMi41IDIuNS0xLjEyIDIuNS0yLjVTMTIuODggOSAxMS41IDl6TTIwIDRINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tMy4yMSAxNC4yMWwtMi45MS0yLjkxYy0uNjkuNDQtMS41MS43LTIuMzkuN0M5LjAxIDE2IDcgMTMuOTkgNyAxMS41UzkuMDEgNyAxMS41IDcgMTYgOS4wMSAxNiAxMS41YzAgLjg4LS4yNiAxLjY5LS43IDIuMzlsMi45MSAyLjktMS40MiAxLjQyeiIgLz48L2c+CjxnIGlkPSJwYW4tdG9vbCI+PHBhdGggZD0iTTIzIDUuNVYyMGMwIDIuMi0xLjggNC00IDRoLTcuM2MtMS4wOCAwLTIuMS0uNDMtMi44NS0xLjE5TDEgMTQuODNzMS4yNi0xLjIzIDEuMy0xLjI1Yy4yMi0uMTkuNDktLjI5Ljc5LS4yOS4yMiAwIC40Mi4wNi42LjE2LjA0LjAxIDQuMzEgMi40NiA0LjMxIDIuNDZWNGMwLS44My42Ny0xLjUgMS41LTEuNVMxMSAzLjE3IDExIDR2N2gxVjEuNWMwLS44My42Ny0xLjUgMS41LTEuNVMxNSAuNjcgMTUgMS41VjExaDFWMi41YzAtLjgzLjY3LTEuNSAxLjUtMS41czEuNS42NyAxLjUgMS41VjExaDFWNS41YzAtLjgzLjY3LTEuNSAxLjUtMS41czEuNS42NyAxLjUgMS41eiIgLz48L2c+CjxnIGlkPSJwYXltZW50Ij48cGF0aCBkPSJNMjAgNEg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2YzAtMS4xMS0uODktMi0yLTJ6bTAgMTRINHYtNmgxNnY2em0wLTEwSDRWNmgxNnYyeiIgLz48L2c+CjxnIGlkPSJwZXJtLWNhbWVyYS1taWMiPjxwYXRoIGQ9Ik0yMCA1aC0zLjE3TDE1IDNIOUw3LjE3IDVINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg3di0yLjA5Yy0yLjgzLS40OC01LTIuOTQtNS01LjkxaDJjMCAyLjIxIDEuNzkgNCA0IDRzNC0xLjc5IDQtNGgyYzAgMi45Ny0yLjE3IDUuNDMtNSA1LjkxVjIxaDdjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptLTYgOGMwIDEuMS0uOSAyLTIgMnMtMi0uOS0yLTJWOWMwLTEuMS45LTIgMi0yczIgLjkgMiAydjR6IiAvPjwvZz4KPGcgaWQ9InBlcm0tY29udGFjdC1jYWxlbmRhciI+PHBhdGggZD0iTTE5IDNoLTFWMWgtMnYySDhWMUg2djJINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDNjMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDMtMy0xLjM0LTMtMyAxLjM0LTMgMy0zem02IDEySDZ2LTFjMC0yIDQtMy4xIDYtMy4xczYgMS4xIDYgMy4xdjF6IiAvPjwvZz4KPGcgaWQ9InBlcm0tZGF0YS1zZXR0aW5nIj48cGF0aCBkPSJNMTguOTkgMTEuNWMuMzQgMCAuNjcuMDMgMSAuMDdMMjAgMCAwIDIwaDExLjU2Yy0uMDQtLjMzLS4wNy0uNjYtLjA3LTEgMC00LjE0IDMuMzYtNy41IDcuNS03LjV6bTMuNzEgNy45OWMuMDItLjE2LjA0LS4zMi4wNC0uNDkgMC0uMTctLjAxLS4zMy0uMDQtLjQ5bDEuMDYtLjgzYy4wOS0uMDguMTItLjIxLjA2LS4zMmwtMS0xLjczYy0uMDYtLjExLS4xOS0uMTUtLjMxLS4xMWwtMS4yNC41Yy0uMjYtLjItLjU0LS4zNy0uODUtLjQ5bC0uMTktMS4zMmMtLjAxLS4xMi0uMTItLjIxLS4yNC0uMjFoLTJjLS4xMiAwLS4yMy4wOS0uMjUuMjFsLS4xOSAxLjMyYy0uMy4xMy0uNTkuMjktLjg1LjQ5bC0xLjI0LS41Yy0uMTEtLjA0LS4yNCAwLS4zMS4xMWwtMSAxLjczYy0uMDYuMTEtLjA0LjI0LjA2LjMybDEuMDYuODNjLS4wMi4xNi0uMDMuMzItLjAzLjQ5IDAgLjE3LjAxLjMzLjAzLjQ5bC0xLjA2LjgzYy0uMDkuMDgtLjEyLjIxLS4wNi4zMmwxIDEuNzNjLjA2LjExLjE5LjE1LjMxLjExbDEuMjQtLjVjLjI2LjIuNTQuMzcuODUuNDlsLjE5IDEuMzJjLjAyLjEyLjEyLjIxLjI1LjIxaDJjLjEyIDAgLjIzLS4wOS4yNS0uMjFsLjE5LTEuMzJjLjMtLjEzLjU5LS4yOS44NC0uNDlsMS4yNS41Yy4xMS4wNC4yNCAwIC4zMS0uMTFsMS0xLjczYy4wNi0uMTEuMDMtLjI0LS4wNi0uMzJsLTEuMDctLjgzem0tMy43MSAxLjAxYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVzLjY3LTEuNSAxLjUtMS41IDEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiIC8+PC9nPgo8ZyBpZD0icGVybS1kZXZpY2UtaW5mb3JtYXRpb24iPjxwYXRoIGQ9Ik0xMyA3aC0ydjJoMlY3em0wIDRoLTJ2Nmgydi02em00LTkuOTlMNyAxYy0xLjEgMC0yIC45LTIgMnYxOGMwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE3IDE5SDdWNWgxMHYxNHoiIC8+PC9nPgo8ZyBpZD0icGVybS1pZGVudGl0eSI+PHBhdGggZD0iTTEyIDUuOWMxLjE2IDAgMi4xLjk0IDIuMSAyLjFzLS45NCAyLjEtMi4xIDIuMVM5LjkgOS4xNiA5LjkgOHMuOTQtMi4xIDIuMS0yLjFtMCA5YzIuOTcgMCA2LjEgMS40NiA2LjEgMi4xdjEuMUg1LjlWMTdjMC0uNjQgMy4xMy0yLjEgNi4xLTIuMU0xMiA0QzkuNzkgNCA4IDUuNzkgOCA4czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00em0wIDljLTIuNjcgMC04IDEuMzQtOCA0djNoMTZ2LTNjMC0yLjY2LTUuMzMtNC04LTR6IiAvPjwvZz4KPGcgaWQ9InBlcm0tbWVkaWEiPjxwYXRoIGQ9Ik0yIDZIMHY1aC4wMUwwIDIwYzAgMS4xLjkgMiAyIDJoMTh2LTJIMlY2em0yMC0yaC04bC0yLTJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDE2YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnpNNyAxNWw0LjUtNiAzLjUgNC41MSAyLjUtMy4wMUwyMSAxNUg3eiIgLz48L2c+CjxnIGlkPSJwZXJtLXBob25lLW1zZyI+PHBhdGggZD0iTTIwIDE1LjVjLTEuMjUgMC0yLjQ1LS4yLTMuNTctLjU3LS4zNS0uMTEtLjc0LS4wMy0xLjAyLjI0bC0yLjIgMi4yYy0yLjgzLTEuNDQtNS4xNS0zLjc1LTYuNTktNi41OGwyLjItMi4yMWMuMjgtLjI3LjM2LS42Ni4yNS0xLjAxQzguNyA2LjQ1IDguNSA1LjI1IDguNSA0YzAtLjU1LS40NS0xLTEtMUg0Yy0uNTUgMC0xIC40NS0xIDEgMCA5LjM5IDcuNjEgMTcgMTcgMTcgLjU1IDAgMS0uNDUgMS0xdi0zLjVjMC0uNTUtLjQ1LTEtMS0xek0xMiAzdjEwbDMtM2g2VjNoLTl6IiAvPjwvZz4KPGcgaWQ9InBlcm0tc2Nhbi13aWZpIj48cGF0aCBkPSJNMTIgM0M2Ljk1IDMgMy4xNSA0Ljg1IDAgNy4yM0wxMiAyMiAyNCA3LjI1QzIwLjg1IDQuODcgMTcuMDUgMyAxMiAzem0xIDEzaC0ydi02aDJ2NnptLTItOFY2aDJ2MmgtMnoiIC8+PC9nPgo8ZyBpZD0icGV0cyI+PGNpcmNsZSBjeD0iNC41IiBjeT0iOS41IiByPSIyLjUiIC8+PGNpcmNsZSBjeD0iOSIgY3k9IjUuNSIgcj0iMi41IiAvPjxjaXJjbGUgY3g9IjE1IiBjeT0iNS41IiByPSIyLjUiIC8+PGNpcmNsZSBjeD0iMTkuNSIgY3k9IjkuNSIgcj0iMi41IiAvPjxwYXRoIGQ9Ik0xNy4zNCAxNC44NmMtLjg3LTEuMDItMS42LTEuODktMi40OC0yLjkxLS40Ni0uNTQtMS4wNS0xLjA4LTEuNzUtMS4zMi0uMTEtLjA0LS4yMi0uMDctLjMzLS4wOS0uMjUtLjA0LS41Mi0uMDQtLjc4LS4wNHMtLjUzIDAtLjc5LjA1Yy0uMTEuMDItLjIyLjA1LS4zMy4wOS0uNy4yNC0xLjI4Ljc4LTEuNzUgMS4zMi0uODcgMS4wMi0xLjYgMS44OS0yLjQ4IDIuOTEtMS4zMSAxLjMxLTIuOTIgMi43Ni0yLjYyIDQuNzkuMjkgMS4wMiAxLjAyIDIuMDMgMi4zMyAyLjMyLjczLjE1IDMuMDYtLjQ0IDUuNTQtLjQ0aC4xOGMyLjQ4IDAgNC44MS41OCA1LjU0LjQ0IDEuMzEtLjI5IDIuMDQtMS4zMSAyLjMzLTIuMzIuMzEtMi4wNC0xLjMtMy40OS0yLjYxLTQuOHoiIC8+PC9nPgo8ZyBpZD0icGljdHVyZS1pbi1waWN0dXJlIj48cGF0aCBkPSJNMTkgN2gtOHY2aDhWN3ptMi00SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMS45OCAyIDEuOThoMThjMS4xIDAgMi0uODggMi0xLjk4VjVjMC0xLjEtLjktMi0yLTJ6bTAgMTYuMDFIM1Y0Ljk4aDE4djE0LjAzeiIgLz48L2c+CjxnIGlkPSJwaWN0dXJlLWluLXBpY3R1cmUtYWx0Ij48cGF0aCBkPSJNMTkgMTFoLTh2Nmg4di02em00IDhWNC45OEMyMyAzLjg4IDIyLjEgMyAyMSAzSDNjLTEuMSAwLTIgLjg4LTIgMS45OFYxOWMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yem0tMiAuMDJIM1Y0Ljk3aDE4djE0LjA1eiIgLz48L2c+CjxnIGlkPSJwbGF5LWZvci13b3JrIj48cGF0aCBkPSJNMTEgNXY1LjU5SDcuNWw0LjUgNC41IDQuNS00LjVIMTNWNWgtMnptLTUgOWMwIDMuMzEgMi42OSA2IDYgNnM2LTIuNjkgNi02aC0yYzAgMi4yMS0xLjc5IDQtNCA0cy00LTEuNzktNC00SDZ6IiAvPjwvZz4KPGcgaWQ9InBvbHltZXIiPjxwYXRoIGQ9Ik0xOSA0aC00TDcuMTEgMTYuNjMgNC41IDEyIDkgNEg1TC41IDEyIDUgMjBoNGw3Ljg5LTEyLjYzTDE5LjUgMTIgMTUgMjBoNGw0LjUtOHoiIC8+PC9nPgo8ZyBpZD0icG93ZXItc2V0dGluZ3MtbmV3Ij48cGF0aCBkPSJNMTMgM2gtMnYxMGgyVjN6bTQuODMgMi4xN2wtMS40MiAxLjQyQzE3Ljk5IDcuODYgMTkgOS44MSAxOSAxMmMwIDMuODctMy4xMyA3LTcgN3MtNy0zLjEzLTctN2MwLTIuMTkgMS4wMS00LjE0IDIuNTgtNS40Mkw2LjE3IDUuMTdDNC4yMyA2LjgyIDMgOS4yNiAzIDEyYzAgNC45NyA0LjAzIDkgOSA5czktNC4wMyA5LTljMC0yLjc0LTEuMjMtNS4xOC0zLjE3LTYuODN6IiAvPjwvZz4KPGcgaWQ9InByZWduYW50LXdvbWFuIj48cGF0aCBkPSJNOSA0YzAtMS4xMS44OS0yIDItMnMyIC44OSAyIDItLjg5IDItMiAyLTItLjg5LTItMnptNyA5Yy0uMDEtMS4zNC0uODMtMi41MS0yLTMgMC0xLjY2LTEuMzQtMy0zLTNzLTMgMS4zNC0zIDN2N2gydjVoM3YtNWgzdi00eiIgLz48L2c+CjxnIGlkPSJwcmludCI+PHBhdGggZD0iTTE5IDhINWMtMS42NiAwLTMgMS4zNC0zIDN2Nmg0djRoMTJ2LTRoNHYtNmMwLTEuNjYtMS4zNC0zLTMtM3ptLTMgMTFIOHYtNWg4djV6bTMtN2MtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxem0tMS05SDZ2NGgxMlYzeiIgLz48L2c+CjxnIGlkPSJxdWVyeS1idWlsZGVyIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4em0uNS0xM0gxMXY2bDUuMjUgMy4xNS43NS0xLjIzLTQuNS0yLjY3eiIgLz48L2c+CjxnIGlkPSJxdWVzdGlvbi1hbnN3ZXIiPjxwYXRoIGQ9Ik0yMSA2aC0ydjlINnYyYzAgLjU1LjQ1IDEgMSAxaDExbDQgNFY3YzAtLjU1LS40NS0xLTEtMXptLTQgNlYzYzAtLjU1LS40NS0xLTEtMUgzYy0uNTUgMC0xIC40NS0xIDF2MTRsNC00aDEwYy41NSAwIDEtLjQ1IDEtMXoiIC8+PC9nPgo8ZyBpZD0icmFkaW8tYnV0dG9uLWNoZWNrZWQiPjxwYXRoIGQ9Ik0xMiA3Yy0yLjc2IDAtNSAyLjI0LTUgNXMyLjI0IDUgNSA1IDUtMi4yNCA1LTUtMi4yNC01LTUtNXptMC01QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiIC8+PC9nPgo8ZyBpZD0icmFkaW8tYnV0dG9uLXVuY2hlY2tlZCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJyZWNlaXB0Ij48cGF0aCBkPSJNMTggMTdINnYtMmgxMnYyem0wLTRINnYtMmgxMnYyem0wLTRINlY3aDEydjJ6TTMgMjJsMS41LTEuNUw2IDIybDEuNS0xLjVMOSAyMmwxLjUtMS41TDEyIDIybDEuNS0xLjVMMTUgMjJsMS41LTEuNUwxOCAyMmwxLjUtMS41TDIxIDIyVjJsLTEuNSAxLjVMMTggMmwtMS41IDEuNUwxNSAybC0xLjUgMS41TDEyIDJsLTEuNSAxLjVMOSAyIDcuNSAzLjUgNiAyIDQuNSAzLjUgMyAydjIweiIgLz48L2c+CjxnIGlkPSJyZWNvcmQtdm9pY2Utb3ZlciI+PGNpcmNsZSBjeD0iOSIgY3k9IjkiIHI9IjQiIC8+PHBhdGggZD0iTTkgMTVjLTIuNjcgMC04IDEuMzQtOCA0djJoMTZ2LTJjMC0yLjY2LTUuMzMtNC04LTR6bTcuNzYtOS42NGwtMS42OCAxLjY5Yy44NCAxLjE4Ljg0IDIuNzEgMCAzLjg5bDEuNjggMS42OWMyLjAyLTIuMDIgMi4wMi01LjA3IDAtNy4yN3pNMjAuMDcgMmwtMS42MyAxLjYzYzIuNzcgMy4wMiAyLjc3IDcuNTYgMCAxMC43NEwyMC4wNyAxNmMzLjktMy44OSAzLjkxLTkuOTUgMC0xNHoiIC8+PC9nPgo8ZyBpZD0icmVkZWVtIj48cGF0aCBkPSJNMjAgNmgtMi4xOGMuMTEtLjMxLjE4LS42NS4xOC0xIDAtMS42Ni0xLjM0LTMtMy0zLTEuMDUgMC0xLjk2LjU0LTIuNSAxLjM1bC0uNS42Ny0uNS0uNjhDMTAuOTYgMi41NCAxMC4wNSAyIDkgMiA3LjM0IDIgNiAzLjM0IDYgNWMwIC4zNS4wNy42OS4xOCAxSDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE5YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTUtMmMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xek05IDRjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDUuMDhMNyAxMC44MyA4LjYyIDEyIDExIDguNzZsMS0xLjM2IDEgMS4zNkwxNS4zOCAxMiAxNyAxMC44MyAxNC45MiA4SDIwdjZ6IiAvPjwvZz4KPGcgaWQ9InJlZG8iPjxwYXRoIGQ9Ik0xOC40IDEwLjZDMTYuNTUgOC45OSAxNC4xNSA4IDExLjUgOGMtNC42NSAwLTguNTggMy4wMy05Ljk2IDcuMjJMMy45IDE2YzEuMDUtMy4xOSA0LjA1LTUuNSA3LjYtNS41IDEuOTUgMCAzLjczLjcyIDUuMTIgMS44OEwxMyAxNmg5VjdsLTMuNiAzLjZ6IiAvPjwvZz4KPGcgaWQ9InJlZnJlc2giPjxwYXRoIGQ9Ik0xNy42NSA2LjM1QzE2LjIgNC45IDE0LjIxIDQgMTIgNGMtNC40MiAwLTcuOTkgMy41OC03Ljk5IDhzMy41NyA4IDcuOTkgOGMzLjczIDAgNi44NC0yLjU1IDcuNzMtNmgtMi4wOGMtLjgyIDIuMzMtMy4wNCA0LTUuNjUgNC0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02YzEuNjYgMCAzLjE0LjY5IDQuMjIgMS43OEwxMyAxMWg3VjRsLTIuMzUgMi4zNXoiIC8+PC9nPgo8ZyBpZD0icmVtb3ZlIj48cGF0aCBkPSJNMTkgMTNINXYtMmgxNHYyeiIgLz48L2c+CjxnIGlkPSJyZW1vdmUtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptNSAxMUg3di0yaDEwdjJ6IiAvPjwvZz4KPGcgaWQ9InJlbW92ZS1jaXJjbGUtb3V0bGluZSI+PHBhdGggZD0iTTcgMTF2MmgxMHYtMkg3em01LTlDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiIgLz48L2c+CjxnIGlkPSJyZW1vdmUtc2hvcHBpbmctY2FydCI+PHBhdGggZD0iTTIyLjczIDIyLjczTDIuNzcgMi43NyAyIDJsLS43My0uNzNMMCAyLjU0bDQuMzkgNC4zOSAyLjIxIDQuNjYtMS4zNSAyLjQ1Yy0uMTYuMjgtLjI1LjYxLS4yNS45NiAwIDEuMS45IDIgMiAyaDcuNDZsMS4zOCAxLjM4Yy0uNS4zNi0uODMuOTUtLjgzIDEuNjIgMCAxLjEuODkgMiAxLjk5IDIgLjY3IDAgMS4yNi0uMzMgMS42Mi0uODRMMjEuNDYgMjRsMS4yNy0xLjI3ek03LjQyIDE1Yy0uMTQgMC0uMjUtLjExLS4yNS0uMjVsLjAzLS4xMi45LTEuNjNoMi4zNmwyIDJINy40MnptOC4xMy0yYy43NSAwIDEuNDEtLjQxIDEuNzUtMS4wM2wzLjU4LTYuNDljLjA4LS4xNC4xMi0uMzEuMTItLjQ4IDAtLjU1LS40NS0xLTEtMUg2LjU0bDkuMDEgOXpNNyAxOGMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0icmVvcmRlciI+PHBhdGggZD0iTTMgMTVoMTh2LTJIM3Yyem0wIDRoMTh2LTJIM3Yyem0wLThoMThWOUgzdjJ6bTAtNnYyaDE4VjVIM3oiIC8+PC9nPgo8ZyBpZD0icmVwbHkiPjxwYXRoIGQ9Ik0xMCA5VjVsLTcgNyA3IDd2LTQuMWM1IDAgOC41IDEuNiAxMSA1LjEtMS01LTQtMTAtMTEtMTF6IiAvPjwvZz4KPGcgaWQ9InJlcGx5LWFsbCI+PHBhdGggZD0iTTcgOFY1bC03IDcgNyA3di0zbC00LTQgNC00em02IDFWNWwtNyA3IDcgN3YtNC4xYzUgMCA4LjUgMS42IDExIDUuMS0xLTUtNC0xMC0xMS0xMXoiIC8+PC9nPgo8ZyBpZD0icmVwb3J0Ij48cGF0aCBkPSJNMTUuNzMgM0g4LjI3TDMgOC4yN3Y3LjQ2TDguMjcgMjFoNy40NkwyMSAxNS43M1Y4LjI3TDE1LjczIDN6TTEyIDE3LjNjLS43MiAwLTEuMy0uNTgtMS4zLTEuMyAwLS43Mi41OC0xLjMgMS4zLTEuMy43MiAwIDEuMy41OCAxLjMgMS4zIDAgLjcyLS41OCAxLjMtMS4zIDEuM3ptMS00LjNoLTJWN2gydjZ6IiAvPjwvZz4KPGcgaWQ9InJlcG9ydC1wcm9ibGVtIj48cGF0aCBkPSJNMSAyMWgyMkwxMiAyIDEgMjF6bTEyLTNoLTJ2LTJoMnYyem0wLTRoLTJ2LTRoMnY0eiIgLz48L2c+CjxnIGlkPSJyZXN0b3JlIj48cGF0aCBkPSJNMTMgM2MtNC45NyAwLTkgNC4wMy05IDlIMWwzLjg5IDMuODkuMDcuMTRMOSAxMkg2YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS45MyAwLTMuNjgtLjc5LTQuOTQtMi4wNmwtMS40MiAxLjQyQzguMjcgMTkuOTkgMTAuNTEgMjEgMTMgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6bS0xIDV2NWw0LjI4IDIuNTQuNzItMS4yMS0zLjUtMi4wOFY4SDEyeiIgLz48L2c+CjxnIGlkPSJyZXN0b3JlLXBhZ2UiPjxwYXRoIGQ9Ik0xNCAySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMxLjEgMCAyLS45IDItMlY4bC02LTZ6bS0yIDE2Yy0yLjA1IDAtMy44MS0xLjI0LTQuNTgtM2gxLjcxYy42My45IDEuNjggMS41IDIuODcgMS41IDEuOTMgMCAzLjUtMS41NyAzLjUtMy41UzEzLjkzIDkuNSAxMiA5LjVjLTEuMzUgMC0yLjUyLjc4LTMuMSAxLjlsMS42IDEuNmgtNFY5bDEuMyAxLjNDOC42OSA4LjkyIDEwLjIzIDggMTIgOGMyLjc2IDAgNSAyLjI0IDUgNXMtMi4yNCA1LTUgNXoiIC8+PC9nPgo8ZyBpZD0icm9vbSI+PHBhdGggZD0iTTEyIDJDOC4xMyAyIDUgNS4xMyA1IDljMCA1LjI1IDcgMTMgNyAxM3M3LTcuNzUgNy0xM2MwLTMuODctMy4xMy03LTctN3ptMCA5LjVjLTEuMzggMC0yLjUtMS4xMi0yLjUtMi41czEuMTItMi41IDIuNS0yLjUgMi41IDEuMTIgMi41IDIuNS0xLjEyIDIuNS0yLjUgMi41eiIgLz48L2c+CjxnIGlkPSJyb3VuZGVkLWNvcm5lciI+PHBhdGggZD0iTTE5IDE5aDJ2MmgtMnYtMnptMC0yaDJ2LTJoLTJ2MnpNMyAxM2gydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0wLThoMlY3SDN2MnptMC00aDJWM0gzdjJ6bTQgMGgyVjNIN3Yyem04IDE2aDJ2LTJoLTJ2MnptLTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bS04IDBoMnYtMkg3djJ6bS00IDBoMnYtMkgzdjJ6TTIxIDhjMC0yLjc2LTIuMjQtNS01LTVoLTV2Mmg1YzEuNjUgMCAzIDEuMzUgMyAzdjVoMlY4eiIgLz48L2c+CjxnIGlkPSJyb3dpbmciPjxwYXRoIGQ9Ik04LjUgMTQuNUw0IDE5bDEuNSAxLjVMOSAxN2gybC0yLjUtMi41ek0xNSAxYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNiAyMC4wMUwxOCAyNGwtMi45OS0zLjAxVjE5LjVsLTcuMS03LjA5Yy0uMzEuMDUtLjYxLjA3LS45MS4wN3YtMi4xNmMxLjY2LjAzIDMuNjEtLjg3IDQuNjctMi4wNGwxLjQtMS41NWMuMTktLjIxLjQzLS4zOC42OS0uNS4yOS0uMTQuNjItLjIzLjk2LS4yM2guMDNDMTUuOTkgNi4wMSAxNyA3LjAyIDE3IDguMjZ2NS43NWMwIC44NC0uMzUgMS42MS0uOTIgMi4xNmwtMy41OC0zLjU4di0yLjI3Yy0uNjMuNTItMS40MyAxLjAyLTIuMjkgMS4zOUwxNi41IDE4SDE4bDMgMy4wMXoiIC8+PC9nPgo8ZyBpZD0ic2F2ZSI+PHBhdGggZD0iTTE3IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjdsLTQtNHptLTUgMTZjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzem0zLTEwSDVWNWgxMHY0eiIgLz48L2c+CjxnIGlkPSJzY2hlZHVsZSI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHptLjUtMTNIMTF2Nmw1LjI1IDMuMTUuNzUtMS4yMy00LjUtMi42N3oiIC8+PC9nPgo8ZyBpZD0ic2VhcmNoIj48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHoiIC8+PC9nPgo8ZyBpZD0ic2VsZWN0LWFsbCI+PHBhdGggZD0iTTMgNWgyVjNjLTEuMSAwLTIgLjktMiAyem0wIDhoMnYtMkgzdjJ6bTQgOGgydi0ySDd2MnpNMyA5aDJWN0gzdjJ6bTEwLTZoLTJ2MmgyVjN6bTYgMHYyaDJjMC0xLjEtLjktMi0yLTJ6TTUgMjF2LTJIM2MwIDEuMS45IDIgMiAyem0tMi00aDJ2LTJIM3Yyek05IDNIN3YyaDJWM3ptMiAxOGgydi0yaC0ydjJ6bTgtOGgydi0yaC0ydjJ6bTAgOGMxLjEgMCAyLS45IDItMmgtMnYyem0wLTEyaDJWN2gtMnYyem0wIDhoMnYtMmgtMnYyem0tNCA0aDJ2LTJoLTJ2MnptMC0xNmgyVjNoLTJ2MnpNNyAxN2gxMFY3SDd2MTB6bTItOGg2djZIOVY5eiIgLz48L2c+CjxnIGlkPSJzZW5kIj48cGF0aCBkPSJNMi4wMSAyMUwyMyAxMiAyLjAxIDMgMiAxMGwxNSAyLTE1IDJ6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzIj48cGF0aCBkPSJNMTkuNDMgMTIuOThjLjA0LS4zMi4wNy0uNjQuMDctLjk4cy0uMDMtLjY2LS4wNy0uOThsMi4xMS0xLjY1Yy4xOS0uMTUuMjQtLjQyLjEyLS42NGwtMi0zLjQ2Yy0uMTItLjIyLS4zOS0uMy0uNjEtLjIybC0yLjQ5IDFjLS41Mi0uNC0xLjA4LS43My0xLjY5LS45OGwtLjM4LTIuNjVDMTQuNDYgMi4xOCAxNC4yNSAyIDE0IDJoLTRjLS4yNSAwLS40Ni4xOC0uNDkuNDJsLS4zOCAyLjY1Yy0uNjEuMjUtMS4xNy41OS0xLjY5Ljk4bC0yLjQ5LTFjLS4yMy0uMDktLjQ5IDAtLjYxLjIybC0yIDMuNDZjLS4xMy4yMi0uMDcuNDkuMTIuNjRsMi4xMSAxLjY1Yy0uMDQuMzItLjA3LjY1LS4wNy45OHMuMDMuNjYuMDcuOThsLTIuMTEgMS42NWMtLjE5LjE1LS4yNC40Mi0uMTIuNjRsMiAzLjQ2Yy4xMi4yMi4zOS4zLjYxLjIybDIuNDktMWMuNTIuNCAxLjA4LjczIDEuNjkuOThsLjM4IDIuNjVjLjAzLjI0LjI0LjQyLjQ5LjQyaDRjLjI1IDAgLjQ2LS4xOC40OS0uNDJsLjM4LTIuNjVjLjYxLS4yNSAxLjE3LS41OSAxLjY5LS45OGwyLjQ5IDFjLjIzLjA5LjQ5IDAgLjYxLS4yMmwyLTMuNDZjLjEyLS4yMi4wNy0uNDktLjEyLS42NGwtMi4xMS0xLjY1ek0xMiAxNS41Yy0xLjkzIDAtMy41LTEuNTctMy41LTMuNXMxLjU3LTMuNSAzLjUtMy41IDMuNSAxLjU3IDMuNSAzLjUtMS41NyAzLjUtMy41IDMuNXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtYXBwbGljYXRpb25zIj48cGF0aCBkPSJNMTIgMTBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem03LTdINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS45IDItMlY1YzAtMS4xLS44OS0yLTItMnptLTEuNzUgOWMwIC4yMy0uMDIuNDYtLjA1LjY4bDEuNDggMS4xNmMuMTMuMTEuMTcuMy4wOC40NWwtMS40IDIuNDJjLS4wOS4xNS0uMjcuMjEtLjQzLjE1bC0xLjc0LS43Yy0uMzYuMjgtLjc2LjUxLTEuMTguNjlsLS4yNiAxLjg1Yy0uMDMuMTctLjE4LjMtLjM1LjNoLTIuOGMtLjE3IDAtLjMyLS4xMy0uMzUtLjI5bC0uMjYtMS44NWMtLjQzLS4xOC0uODItLjQxLTEuMTgtLjY5bC0xLjc0LjdjLS4xNi4wNi0uMzQgMC0uNDMtLjE1bC0xLjQtMi40MmMtLjA5LS4xNS0uMDUtLjM0LjA4LS40NWwxLjQ4LTEuMTZjLS4wMy0uMjMtLjA1LS40Ni0uMDUtLjY5IDAtLjIzLjAyLS40Ni4wNS0uNjhsLTEuNDgtMS4xNmMtLjEzLS4xMS0uMTctLjMtLjA4LS40NWwxLjQtMi40MmMuMDktLjE1LjI3LS4yMS40My0uMTVsMS43NC43Yy4zNi0uMjguNzYtLjUxIDEuMTgtLjY5bC4yNi0xLjg1Yy4wMy0uMTcuMTgtLjMuMzUtLjNoMi44Yy4xNyAwIC4zMi4xMy4zNS4yOWwuMjYgMS44NWMuNDMuMTguODIuNDEgMS4xOC42OWwxLjc0LS43Yy4xNi0uMDYuMzQgMCAuNDMuMTVsMS40IDIuNDJjLjA5LjE1LjA1LjM0LS4wOC40NWwtMS40OCAxLjE2Yy4wMy4yMy4wNS40Ni4wNS42OXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtYmFja3VwLXJlc3RvcmUiPjxwYXRoIGQ9Ik0xNCAxMmMwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDIgLjkgMiAyIDIgMi0uOSAyLTJ6bS0yLTljLTQuOTcgMC05IDQuMDMtOSA5SDBsNCA0IDQtNEg1YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS41MSAwLTIuOTEtLjQ5LTQuMDYtMS4zbC0xLjQyIDEuNDRDOC4wNCAyMC4zIDkuOTQgMjEgMTIgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJsdWV0b290aCI+PHBhdGggZD0iTTExIDI0aDJ2LTJoLTJ2MnptLTQgMGgydi0ySDd2MnptOCAwaDJ2LTJoLTJ2MnptMi43MS0xOC4yOUwxMiAwaC0xdjcuNTlMNi40MSAzIDUgNC40MSAxMC41OSAxMCA1IDE1LjU5IDYuNDEgMTcgMTEgMTIuNDFWMjBoMWw1LjcxLTUuNzEtNC4zLTQuMjkgNC4zLTQuMjl6TTEzIDMuODNsMS44OCAxLjg4TDEzIDcuNTlWMy44M3ptMS44OCAxMC40NkwxMyAxNi4xN3YtMy43NmwxLjg4IDEuODh6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJyaWdodG5lc3MiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6TTggMTZoMi41bDEuNSAxLjUgMS41LTEuNUgxNnYtMi41bDEuNS0xLjUtMS41LTEuNVY4aC0yLjVMMTIgNi41IDEwLjUgOEg4djIuNUw2LjUgMTIgOCAxMy41VjE2em00LTdjMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDNWOXoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtY2VsbCI+PHBhdGggZD0iTTcgMjRoMnYtMkg3djJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6TTE2IC4wMUw4IDBDNi45IDAgNiAuOSA2IDJ2MTZjMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjJjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE2IDE2SDhWNGg4djEyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1ldGhlcm5ldCI+PHBhdGggZD0iTTcuNzcgNi43Nkw2LjIzIDUuNDguODIgMTJsNS40MSA2LjUyIDEuNTQtMS4yOEwzLjQyIDEybDQuMzUtNS4yNHpNNyAxM2gydi0ySDd2MnptMTAtMmgtMnYyaDJ2LTJ6bS02IDJoMnYtMmgtMnYyem02Ljc3LTcuNTJsLTEuNTQgMS4yOEwyMC41OCAxMmwtNC4zNSA1LjI0IDEuNTQgMS4yOEwyMy4xOCAxMmwtNS40MS02LjUyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1hbnRlbm5hIj48cGF0aCBkPSJNMTIgNWMtMy44NyAwLTcgMy4xMy03IDdoMmMwLTIuNzYgMi4yNC01IDUtNXM1IDIuMjQgNSA1aDJjMC0zLjg3LTMuMTMtNy03LTd6bTEgOS4yOWMuODgtLjM5IDEuNS0xLjI2IDEuNS0yLjI5IDAtMS4zOC0xLjEyLTIuNS0yLjUtMi41UzkuNSAxMC42MiA5LjUgMTJjMCAxLjAyLjYyIDEuOSAxLjUgMi4yOXYzLjNMNy41OSAyMSA5IDIyLjQxbDMtMyAzIDNMMTYuNDEgMjEgMTMgMTcuNTl2LTMuM3pNMTIgMUM1LjkzIDEgMSA1LjkzIDEgMTJoMmMwLTQuOTcgNC4wMy05IDktOXM5IDQuMDMgOSA5aDJjMC02LjA3LTQuOTMtMTEtMTEtMTF6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LWNvbXBvbmVudCI+PHBhdGggZD0iTTUgMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDF2Nmg2VjZINVYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0ySDl2MnptLTggMGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThDNi4xNiAxOC40IDcgMTcuMyA3IDE2di0ySDF2MnpNMjEgNlYyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRoLTJ2Nmg2VjZoLTJ6bS04LTRjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEg5djZoNlY2aC0yVjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJoLTZ2MnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtY29tcG9zaXRlIj48cGF0aCBkPSJNNSAyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRIMXY2aDZWNkg1VjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJIOXYyem0tOCAwYzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOEM2LjE2IDE4LjQgNyAxNy4zIDcgMTZ2LTJIMXYyek0yMSA2VjJjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NGgtMnY2aDZWNmgtMnptLTgtNGMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDl2Nmg2VjZoLTJWMnptNCAxNGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThjMS4xNi0uNDEgMi0xLjUxIDItMi44MnYtMmgtNnYyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1oZG1pIj48cGF0aCBkPSJNMTggN1Y0YzAtMS4xLS45LTItMi0ySDhjLTEuMSAwLTIgLjktMiAydjNINXY2bDMgNnYzaDh2LTNsMy02VjdoLTF6TTggNGg4djNoLTJWNWgtMXYyaC0yVjVoLTF2Mkg4VjR6IiAvPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LXN2aWRlbyI+PHBhdGggZD0iTTggMTEuNWMwLS44My0uNjctMS41LTEuNS0xLjVTNSAxMC42NyA1IDExLjUgNS42NyAxMyA2LjUgMTMgOCAxMi4zMyA4IDExLjV6bTctNWMwLS44My0uNjctMS41LTEuNS0xLjVoLTNDOS42NyA1IDkgNS42NyA5IDYuNVM5LjY3IDggMTAuNSA4aDNjLjgzIDAgMS41LS42NyAxLjUtMS41ek04LjUgMTVjLS44MyAwLTEuNS42Ny0xLjUgMS41UzcuNjcgMTggOC41IDE4czEuNS0uNjcgMS41LTEuNVM5LjMzIDE1IDguNSAxNXpNMTIgMUM1LjkzIDEgMSA1LjkzIDEgMTJzNC45MyAxMSAxMSAxMSAxMS00LjkzIDExLTExUzE4LjA3IDEgMTIgMXptMCAyMGMtNC45NiAwLTktNC4wNC05LTlzNC4wNC05IDktOSA5IDQuMDQgOSA5LTQuMDQgOS05IDl6bTUuNS0xMWMtLjgzIDAtMS41LjY3LTEuNSAxLjVzLjY3IDEuNSAxLjUgMS41IDEuNS0uNjcgMS41LTEuNS0uNjctMS41LTEuNS0xLjV6bS0yIDVjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41eiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1vdmVyc2NhbiI+PHBhdGggZD0iTTEyLjAxIDUuNUwxMCA4aDRsLTEuOTktMi41ek0xOCAxMHY0bDIuNS0xLjk5TDE4IDEwek02IDEwbC0yLjUgMi4wMUw2IDE0di00em04IDZoLTRsMi4wMSAyLjVMMTQgMTZ6bTctMTNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OWgxOHYxNC4wMnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcGhvbmUiPjxwYXRoIGQ9Ik0xMyA5aC0ydjJoMlY5em00IDBoLTJ2MmgyVjl6bTMgNi41Yy0xLjI1IDAtMi40NS0uMi0zLjU3LS41Ny0uMzUtLjExLS43NC0uMDMtMS4wMi4yNGwtMi4yIDIuMmMtMi44My0xLjQ0LTUuMTUtMy43NS02LjU5LTYuNThsMi4yLTIuMjFjLjI4LS4yNy4zNi0uNjYuMjUtMS4wMUM4LjcgNi40NSA4LjUgNS4yNSA4LjUgNGMwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxIDAgOS4zOSA3LjYxIDE3IDE3IDE3IC41NSAwIDEtLjQ1IDEtMXYtMy41YzAtLjU1LS40NS0xLTEtMXpNMTkgOXYyaDJWOWgtMnoiIC8+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcG93ZXIiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem0yLTIyaC0ydjEwaDJWMnptMy41NiAyLjQ0bC0xLjQ1IDEuNDVDMTYuODQgNi45NCAxOCA4LjgzIDE4IDExYzAgMy4zMS0yLjY5IDYtNiA2cy02LTIuNjktNi02YzAtMi4xNyAxLjE2LTQuMDYgMi44OC01LjEyTDcuNDQgNC40NEM1LjM2IDUuODggNCA4LjI4IDQgMTFjMCA0LjQyIDMuNTggOCA4IDhzOC0zLjU4IDgtOGMwLTIuNzItMS4zNi01LjEyLTMuNDQtNi41NnpNMTUgMjRoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy1yZW1vdGUiPjxwYXRoIGQ9Ik0xNSA5SDljLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWg2Yy41NSAwIDEtLjQ1IDEtMVYxMGMwLS41NS0uNDUtMS0xLTF6bS0zIDZjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyek03LjA1IDYuMDVsMS40MSAxLjQxQzkuMzcgNi41NiAxMC42MiA2IDEyIDZzMi42My41NiAzLjU0IDEuNDZsMS40MS0xLjQxQzE1LjY4IDQuNzggMTMuOTMgNCAxMiA0cy0zLjY4Ljc4LTQuOTUgMi4wNXpNMTIgMEM4Ljk2IDAgNi4yMSAxLjIzIDQuMjIgMy4yMmwxLjQxIDEuNDFDNy4yNiAzLjAxIDkuNTEgMiAxMiAyczQuNzQgMS4wMSA2LjM2IDIuNjRsMS40MS0xLjQxQzE3Ljc5IDEuMjMgMTUuMDQgMCAxMiAweiIgLz48L2c+CjxnIGlkPSJzZXR0aW5ncy12b2ljZSI+PHBhdGggZD0iTTcgMjRoMnYtMkg3djJ6bTUtMTFjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNGMwLTEuNjYtMS4zNC0zLTMtM1M5IDIuMzQgOSA0djZjMCAxLjY2IDEuMzQgMyAzIDN6bS0xIDExaDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnptNC0xNGgtMS43YzAgMy0yLjU0IDUuMS01LjMgNS4xUzYuNyAxMyA2LjcgMTBINWMwIDMuNDEgMi43MiA2LjIzIDYgNi43MlYyMGgydi0zLjI4YzMuMjgtLjQ5IDYtMy4zMSA2LTYuNzJ6IiAvPjwvZz4KPGcgaWQ9InNob3AiPjxwYXRoIGQ9Ik0xNiA2VjRjMC0xLjExLS44OS0yLTItMmgtNGMtMS4xMSAwLTIgLjg5LTIgMnYySDJ2MTNjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmgtNnptLTYtMmg0djJoLTRWNHpNOSAxOFY5bDcuNSA0TDkgMTh6IiAvPjwvZz4KPGcgaWQ9InNob3AtdHdvIj48cGF0aCBkPSJNMyA5SDF2MTFjMCAxLjExLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS44OSAyLTJIM1Y5em0xNS00VjNjMC0xLjExLS44OS0yLTItMmgtNGMtMS4xMSAwLTIgLjg5LTIgMnYySDV2MTFjMCAxLjExLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS44OSAyLTJWNWgtNXptLTYtMmg0djJoLTRWM3ptMCAxMlY4bDUuNSAzLTUuNSA0eiIgLz48L2c+CjxnIGlkPSJzaG9wcGluZy1iYXNrZXQiPjxwYXRoIGQ9Ik0xNy4yMSA5bC00LjM4LTYuNTZjLS4xOS0uMjgtLjUxLS40Mi0uODMtLjQyLS4zMiAwLS42NC4xNC0uODMuNDNMNi43OSA5SDJjLS41NSAwLTEgLjQ1LTEgMSAwIC4wOS4wMS4xOC4wNC4yN2wyLjU0IDkuMjdjLjIzLjg0IDEgMS40NiAxLjkyIDEuNDZoMTNjLjkyIDAgMS42OS0uNjIgMS45My0xLjQ2bDIuNTQtOS4yN0wyMyAxMGMwLS41NS0uNDUtMS0xLTFoLTQuNzl6TTkgOWwzLTQuNEwxNSA5SDl6bTMgOGMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6IiAvPjwvZz4KPGcgaWQ9InNob3BwaW5nLWNhcnQiPjxwYXRoIGQ9Ik03IDE4Yy0xLjEgMC0xLjk5LjktMS45OSAyUzUuOSAyMiA3IDIyczItLjkgMi0yLS45LTItMi0yek0xIDJ2MmgybDMuNiA3LjU5LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmgxMnYtMkg3LjQyYy0uMTQgMC0uMjUtLjExLS4yNS0uMjVsLjAzLS4xMi45LTEuNjNoNy40NWMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy41OC02LjQ5Yy4wOC0uMTQuMTItLjMxLjEyLS40OCAwLS41NS0uNDUtMS0xLTFINS4yMWwtLjk0LTJIMXptMTYgMTZjLTEuMSAwLTEuOTkuOS0xLjk5IDJzLjg5IDIgMS45OSAyIDItLjkgMi0yLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJzb3J0Ij48cGF0aCBkPSJNMyAxOGg2di0ySDN2MnpNMyA2djJoMThWNkgzem0wIDdoMTJ2LTJIM3YyeiIgLz48L2c+CjxnIGlkPSJzcGVha2VyLW5vdGVzIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTggMTRINnYtMmgydjJ6bTAtM0g2VjloMnYyem0wLTNINlY2aDJ2MnptNyA2aC01di0yaDV2MnptMy0zaC04VjloOHYyem0wLTNoLThWNmg4djJ6IiAvPjwvZz4KPGcgaWQ9InNwZWFrZXItbm90ZXMtb2ZmIj48cGF0aCBkPSJNMTAuNTQgMTFsLS41NC0uNTRMNy41NCA4IDYgNi40NiAyLjM4IDIuODQgMS4yNyAxLjczIDAgM2wyLjAxIDIuMDFMMiAyMmw0LTRoOWw1LjczIDUuNzNMMjIgMjIuNDYgMTcuNTQgMThsLTctN3pNOCAxNEg2di0yaDJ2MnptLTItM1Y5bDIgMkg2em0xNC05SDQuMDhMMTAgNy45MlY2aDh2MmgtNy45MmwxIDFIMTh2MmgtNC45Mmw2Ljk5IDYuOTlDMjEuMTQgMTcuOTUgMjIgMTcuMDggMjIgMTZWNGMwLTEuMS0uOS0yLTItMnoiIC8+PC9nPgo8ZyBpZD0ic3BlbGxjaGVjayI+PHBhdGggZD0iTTEyLjQ1IDE2aDIuMDlMOS40MyAzSDcuNTdMMi40NiAxNmgyLjA5bDEuMTItM2g1LjY0bDEuMTQgM3ptLTYuMDItNUw4LjUgNS40OCAxMC41NyAxMUg2LjQzem0xNS4xNi41OWwtOC4wOSA4LjA5TDkuODMgMTZsLTEuNDEgMS40MSA1LjA5IDUuMDlMMjMgMTNsLTEuNDEtMS40MXoiIC8+PC9nPgo8ZyBpZD0ic3RhciI+PHBhdGggZD0iTTEyIDE3LjI3TDE4LjE4IDIxbC0xLjY0LTcuMDNMMjIgOS4yNGwtNy4xOS0uNjFMMTIgMiA5LjE5IDguNjMgMiA5LjI0bDUuNDYgNC43M0w1LjgyIDIxeiIgLz48L2c+CjxnIGlkPSJzdGFyLWJvcmRlciI+PHBhdGggZD0iTTIyIDkuMjRsLTcuMTktLjYyTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMSAxMiAxNy4yNyAxOC4xOCAyMWwtMS42My03LjAzTDIyIDkuMjR6TTEyIDE1LjRsLTMuNzYgMi4yNyAxLTQuMjgtMy4zMi0yLjg4IDQuMzgtLjM4TDEyIDYuMWwxLjcxIDQuMDQgNC4zOC4zOC0zLjMyIDIuODggMSA0LjI4TDEyIDE1LjR6IiAvPjwvZz4KPGcgaWQ9InN0YXItaGFsZiI+PHBhdGggZD0iTTIyIDkuMjRsLTcuMTktLjYyTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMSAxMiAxNy4yNyAxOC4xOCAyMWwtMS42My03LjAzTDIyIDkuMjR6TTEyIDE1LjRWNi4xbDEuNzEgNC4wNCA0LjM4LjM4LTMuMzIgMi44OCAxIDQuMjhMMTIgMTUuNHoiIC8+PC9nPgo8ZyBpZD0ic3RhcnMiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyem00LjI0IDE2TDEyIDE1LjQ1IDcuNzcgMThsMS4xMi00LjgxLTMuNzMtMy4yMyA0LjkyLS40MkwxMiA1bDEuOTIgNC41MyA0LjkyLjQyLTMuNzMgMy4yM0wxNi4yMyAxOHoiIC8+PC9nPgo8ZyBpZD0ic3RvcmUiPjxwYXRoIGQ9Ik0yMCA0SDR2MmgxNlY0em0xIDEwdi0ybC0xLTVINGwtMSA1djJoMXY2aDEwdi02aDR2Nmgydi02aDF6bS05IDRINnYtNGg2djR6IiAvPjwvZz4KPGcgaWQ9InN1YmRpcmVjdG9yeS1hcnJvdy1sZWZ0Ij48cGF0aCBkPSJNMTEgOWwxLjQyIDEuNDJMOC44MyAxNEgxOFY0aDJ2MTJIOC44M2wzLjU5IDMuNThMMTEgMjFsLTYtNiA2LTZ6IiAvPjwvZz4KPGcgaWQ9InN1YmRpcmVjdG9yeS1hcnJvdy1yaWdodCI+PHBhdGggZD0iTTE5IDE1bC02IDYtMS40Mi0xLjQyTDE1LjE3IDE2SDRWNGgydjEwaDkuMTdsLTMuNTktMy41OEwxMyA5bDYgNnoiIC8+PC9nPgo8ZyBpZD0ic3ViamVjdCI+PHBhdGggZD0iTTE0IDE3SDR2MmgxMHYtMnptNi04SDR2MmgxNlY5ek00IDE1aDE2di0ySDR2MnpNNCA1djJoMTZWNUg0eiIgLz48L2c+CjxnIGlkPSJzdXBlcnZpc29yLWFjY291bnQiPjxwYXRoIGQ9Ik0xNi41IDEyYzEuMzggMCAyLjQ5LTEuMTIgMi40OS0yLjVTMTcuODggNyAxNi41IDdDMTUuMTIgNyAxNCA4LjEyIDE0IDkuNXMxLjEyIDIuNSAyLjUgMi41ek05IDExYzEuNjYgMCAyLjk5LTEuMzQgMi45OS0zUzEwLjY2IDUgOSA1QzcuMzQgNSA2IDYuMzQgNiA4czEuMzQgMyAzIDN6bTcuNSAzYy0xLjgzIDAtNS41LjkyLTUuNSAyLjc1VjE5aDExdi0yLjI1YzAtMS44My0zLjY3LTIuNzUtNS41LTIuNzV6TTkgMTNjLTIuMzMgMC03IDEuMTctNyAzLjVWMTloN3YtMi4yNWMwLS44NS4zMy0yLjM0IDIuMzctMy40N0MxMC41IDEzLjEgOS42NiAxMyA5IDEzeiIgLz48L2c+CjxnIGlkPSJzd2FwLWhvcml6Ij48cGF0aCBkPSJNNi45OSAxMUwzIDE1bDMuOTkgNHYtM0gxNHYtMkg2Ljk5di0zek0yMSA5bC0zLjk5LTR2M0gxMHYyaDcuMDF2M0wyMSA5eiIgLz48L2c+CjxnIGlkPSJzd2FwLXZlcnQiPjxwYXRoIGQ9Ik0xNiAxNy4wMVYxMGgtMnY3LjAxaC0zTDE1IDIxbDQtMy45OWgtM3pNOSAzTDUgNi45OWgzVjE0aDJWNi45OWgzTDkgM3oiIC8+PC9nPgo8ZyBpZD0ic3dhcC12ZXJ0aWNhbC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyek02LjUgOUwxMCA1LjUgMTMuNSA5SDExdjRIOVY5SDYuNXptMTEgNkwxNCAxOC41IDEwLjUgMTVIMTN2LTRoMnY0aDIuNXoiIC8+PC9nPgo8ZyBpZD0ic3lzdGVtLXVwZGF0ZS1hbHQiPjxwYXRoIGQ9Ik0xMiAxNi41bDQtNGgtM3YtOWgtMnY5SDhsNCA0em05LTEzaC02djEuOTloNnYxNC4wM0gzVjUuNDloNlYzLjVIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMnYtMTRjMC0xLjEtLjktMi0yLTJ6IiAvPjwvZz4KPGcgaWQ9InRhYiI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDNWNWgxMHY0aDh2MTB6IiAvPjwvZz4KPGcgaWQ9InRhYi11bnNlbGVjdGVkIj48cGF0aCBkPSJNMSA5aDJWN0gxdjJ6bTAgNGgydi0ySDF2MnptMC04aDJWM2MtMS4xIDAtMiAuOS0yIDJ6bTggMTZoMnYtMkg5djJ6bS04LTRoMnYtMkgxdjJ6bTIgNHYtMkgxYzAgMS4xLjkgMiAyIDJ6TTIxIDNoLTh2NmgxMFY1YzAtMS4xLS45LTItMi0yem0wIDE0aDJ2LTJoLTJ2MnpNOSA1aDJWM0g5djJ6TTUgMjFoMnYtMkg1djJ6TTUgNWgyVjNINXYyem0xNiAxNmMxLjEgMCAyLS45IDItMmgtMnYyem0wLThoMnYtMmgtMnYyem0tOCA4aDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnoiIC8+PC9nPgo8ZyBpZD0idGV4dC1mb3JtYXQiPjxwYXRoIGQ9Ik01IDE3djJoMTR2LTJINXptNC41LTQuMmg1bC45IDIuMmgyLjFMMTIuNzUgNGgtMS41TDYuNSAxNWgyLjFsLjktMi4yek0xMiA1Ljk4TDEzLjg3IDExaC0zLjc0TDEyIDUuOTh6IiAvPjwvZz4KPGcgaWQ9InRoZWF0ZXJzIj48cGF0aCBkPSJNMTggM3YyaC0yVjNIOHYySDZWM0g0djE4aDJ2LTJoMnYyaDh2LTJoMnYyaDJWM2gtMnpNOCAxN0g2di0yaDJ2MnptMC00SDZ2LTJoMnYyem0wLTRINlY3aDJ2MnptMTAgOGgtMnYtMmgydjJ6bTAtNGgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2MnoiIC8+PC9nPgo8ZyBpZD0idGh1bWItZG93biI+PHBhdGggZD0iTTE1IDNINmMtLjgzIDAtMS41NC41LTEuODQgMS4yMmwtMy4wMiA3LjA1Yy0uMDkuMjMtLjE0LjQ3LS4xNC43M3YxLjkxbC4wMS4wMUwxIDE0YzAgMS4xLjkgMiAyIDJoNi4zMWwtLjk1IDQuNTctLjAzLjMyYzAgLjQxLjE3Ljc5LjQ0IDEuMDZMOS44MyAyM2w2LjU5LTYuNTljLjM2LS4zNi41OC0uODYuNTgtMS40MVY1YzAtMS4xLS45LTItMi0yem00IDB2MTJoNFYzaC00eiIgLz48L2c+CjxnIGlkPSJ0aHVtYi11cCI+PHBhdGggZD0iTTEgMjFoNFY5SDF2MTJ6bTIyLTExYzAtMS4xLS45LTItMi0yaC02LjMxbC45NS00LjU3LjAzLS4zMmMwLS40MS0uMTctLjc5LS40NC0xLjA2TDE0LjE3IDEgNy41OSA3LjU5QzcuMjIgNy45NSA3IDguNDUgNyA5djEwYzAgMS4xLjkgMiAyIDJoOWMuODMgMCAxLjU0LS41IDEuODQtMS4yMmwzLjAyLTcuMDVjLjA5LS4yMy4xNC0uNDcuMTQtLjczdi0xLjkxbC0uMDEtLjAxTDIzIDEweiIgLz48L2c+CjxnIGlkPSJ0aHVtYnMtdXAtZG93biI+PHBhdGggZD0iTTEyIDZjMC0uNTUtLjQ1LTEtMS0xSDUuODJsLjY2LTMuMTguMDItLjIzYzAtLjMxLS4xMy0uNTktLjMzLS44TDUuMzggMCAuNDQgNC45NEMuMTcgNS4yMSAwIDUuNTkgMCA2djYuNWMwIC44My42NyAxLjUgMS41IDEuNWg2Ljc1Yy42MiAwIDEuMTUtLjM4IDEuMzgtLjkxbDIuMjYtNS4yOWMuMDctLjE3LjExLS4zNi4xMS0uNTVWNnptMTAuNSA0aC02Ljc1Yy0uNjIgMC0xLjE1LjM4LTEuMzguOTFsLTIuMjYgNS4yOWMtLjA3LjE3LS4xMS4zNi0uMTEuNTVWMThjMCAuNTUuNDUgMSAxIDFoNS4xOGwtLjY2IDMuMTgtLjAyLjI0YzAgLjMxLjEzLjU5LjMzLjhsLjc5Ljc4IDQuOTQtNC45NGMuMjctLjI3LjQ0LS42NS40NC0xLjA2di02LjVjMC0uODMtLjY3LTEuNS0xLjUtMS41eiIgLz48L2c+CjxnIGlkPSJ0aW1lbGluZSI+PHBhdGggZD0iTTIzIDhjMCAxLjEtLjkgMi0yIDItLjE4IDAtLjM1LS4wMi0uNTEtLjA3bC0zLjU2IDMuNTVjLjA1LjE2LjA3LjM0LjA3LjUyIDAgMS4xLS45IDItMiAycy0yLS45LTItMmMwLS4xOC4wMi0uMzYuMDctLjUybC0yLjU1LTIuNTVjLS4xNi4wNS0uMzQuMDctLjUyLjA3cy0uMzYtLjAyLS41Mi0uMDdsLTQuNTUgNC41NmMuMDUuMTYuMDcuMzMuMDcuNTEgMCAxLjEtLjkgMi0yIDJzLTItLjktMi0yIC45LTIgMi0yYy4xOCAwIC4zNS4wMi41MS4wN2w0LjU2LTQuNTVDOC4wMiA5LjM2IDggOS4xOCA4IDljMC0xLjEuOS0yIDItMnMyIC45IDIgMmMwIC4xOC0uMDIuMzYtLjA3LjUybDIuNTUgMi41NWMuMTYtLjA1LjM0LS4wNy41Mi0uMDdzLjM2LjAyLjUyLjA3bDMuNTUtMy41NkMxOS4wMiA4LjM1IDE5IDguMTggMTkgOGMwLTEuMS45LTIgMi0yczIgLjkgMiAyeiIgLz48L2c+CjxnIGlkPSJ0b2MiPjxwYXRoIGQ9Ik0zIDloMTRWN0gzdjJ6bTAgNGgxNHYtMkgzdjJ6bTAgNGgxNHYtMkgzdjJ6bTE2IDBoMnYtMmgtMnYyem0wLTEwdjJoMlY3aC0yem0wIDZoMnYtMmgtMnYyeiIgLz48L2c+CjxnIGlkPSJ0b2RheSI+PHBhdGggZD0iTTE5IDNoLTFWMWgtMnYySDhWMUg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAxOWMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDVWOGgxNHYxMXpNNyAxMGg1djVIN3oiIC8+PC9nPgo8ZyBpZD0idG9sbCI+PHBhdGggZD0iTTE1IDRjLTQuNDIgMC04IDMuNTgtOCA4czMuNTggOCA4IDggOC0zLjU4IDgtOC0zLjU4LTgtOC04em0wIDE0Yy0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02IDYgMi42OSA2IDYtMi42OSA2LTYgNnpNMyAxMmMwLTIuNjEgMS42Ny00LjgzIDQtNS42NVY0LjI2QzMuNTUgNS4xNSAxIDguMjcgMSAxMnMyLjU1IDYuODUgNiA3Ljc0di0yLjA5Yy0yLjMzLS44Mi00LTMuMDQtNC01LjY1eiIgLz48L2c+CjxnIGlkPSJ0b3VjaC1hcHAiPjxwYXRoIGQ9Ik05IDExLjI0VjcuNUM5IDYuMTIgMTAuMTIgNSAxMS41IDVTMTQgNi4xMiAxNCA3LjV2My43NGMxLjIxLS44MSAyLTIuMTggMi0zLjc0QzE2IDUuMDEgMTMuOTkgMyAxMS41IDNTNyA1LjAxIDcgNy41YzAgMS41Ni43OSAyLjkzIDIgMy43NHptOS44NCA0LjYzbC00LjU0LTIuMjZjLS4xNy0uMDctLjM1LS4xMS0uNTQtLjExSDEzdi02YzAtLjgzLS42Ny0xLjUtMS41LTEuNVMxMCA2LjY3IDEwIDcuNXYxMC43NGwtMy40My0uNzJjLS4wOC0uMDEtLjE1LS4wMy0uMjQtLjAzLS4zMSAwLS41OS4xMy0uNzkuMzNsLS43OS44IDQuOTQgNC45NGMuMjcuMjcuNjUuNDQgMS4wNi40NGg2Ljc5Yy43NSAwIDEuMzMtLjU1IDEuNDQtMS4yOGwuNzUtNS4yN2MuMDEtLjA3LjAyLS4xNC4wMi0uMiAwLS42Mi0uMzgtMS4xNi0uOTEtMS4zOHoiIC8+PC9nPgo8ZyBpZD0idHJhY2stY2hhbmdlcyI+PHBhdGggZD0iTTE5LjA3IDQuOTNsLTEuNDEgMS40MUMxOS4xIDcuNzkgMjAgOS43OSAyMCAxMmMwIDQuNDItMy41OCA4LTggOHMtOC0zLjU4LTgtOGMwLTQuMDggMy4wNS03LjQ0IDctNy45M3YyLjAyQzguMTYgNi41NyA2IDkuMDMgNiAxMmMwIDMuMzEgMi42OSA2IDYgNnM2LTIuNjkgNi02YzAtMS42Ni0uNjctMy4xNi0xLjc2LTQuMjRsLTEuNDEgMS40MUMxNS41NSA5LjkgMTYgMTAuOSAxNiAxMmMwIDIuMjEtMS43OSA0LTQgNHMtNC0xLjc5LTQtNGMwLTEuODYgMS4yOC0zLjQxIDMtMy44NnYyLjE0Yy0uNi4zNS0xIC45OC0xIDEuNzIgMCAxLjEuOSAyIDIgMnMyLS45IDItMmMwLS43NC0uNC0xLjM4LTEtMS43MlYyaC0xQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBjMC0yLjc2LTEuMTItNS4yNi0yLjkzLTcuMDd6IiAvPjwvZz4KPGcgaWQ9InRyYW5zbGF0ZSI+PHBhdGggZD0iTTEyLjg3IDE1LjA3bC0yLjU0LTIuNTEuMDMtLjAzYzEuNzQtMS45NCAyLjk4LTQuMTcgMy43MS02LjUzSDE3VjRoLTdWMkg4djJIMXYxLjk5aDExLjE3QzExLjUgNy45MiAxMC40NCA5Ljc1IDkgMTEuMzUgOC4wNyAxMC4zMiA3LjMgOS4xOSA2LjY5IDhoLTJjLjczIDEuNjMgMS43MyAzLjE3IDIuOTggNC41NmwtNS4wOSA1LjAyTDQgMTlsNS01IDMuMTEgMy4xMS43Ni0yLjA0ek0xOC41IDEwaC0yTDEyIDIyaDJsMS4xMi0zaDQuNzVMMjEgMjJoMmwtNC41LTEyem0tMi42MiA3bDEuNjItNC4zM0wxOS4xMiAxN2gtMy4yNHoiIC8+PC9nPgo8ZyBpZD0idHJlbmRpbmctZG93biI+PHBhdGggZD0iTTE2IDE4bDIuMjktMi4yOS00Ljg4LTQuODgtNCA0TDIgNy40MSAzLjQxIDZsNiA2IDQtNCA2LjMgNi4yOUwyMiAxMnY2eiIgLz48L2c+CjxnIGlkPSJ0cmVuZGluZy1mbGF0Ij48cGF0aCBkPSJNMjIgMTJsLTQtNHYzSDN2MmgxNXYzeiIgLz48L2c+CjxnIGlkPSJ0cmVuZGluZy11cCI+PHBhdGggZD0iTTE2IDZsMi4yOSAyLjI5LTQuODggNC44OC00LTRMMiAxNi41OSAzLjQxIDE4bDYtNiA0IDQgNi4zLTYuMjlMMjIgMTJWNnoiIC8+PC9nPgo8ZyBpZD0idHVybmVkLWluIj48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJ0dXJuZWQtaW4tbm90Ij48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yem0wIDE1bC01LTIuMThMNyAxOFY1aDEwdjEzeiIgLz48L2c+CjxnIGlkPSJ1bmFyY2hpdmUiPjxwYXRoIGQ9Ik0yMC41NSA1LjIybC0xLjM5LTEuNjhDMTguODggMy4yMSAxOC40NyAzIDE4IDNINmMtLjQ3IDAtLjg4LjIxLTEuMTUuNTVMMy40NiA1LjIyQzMuMTcgNS41NyAzIDYuMDEgMyA2LjVWMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNi41YzAtLjQ5LS4xNy0uOTMtLjQ1LTEuMjh6TTEyIDkuNWw1LjUgNS41SDE0djJoLTR2LTJINi41TDEyIDkuNXpNNS4xMiA1bC44Mi0xaDEybC45MyAxSDUuMTJ6IiAvPjwvZz4KPGcgaWQ9InVuZG8iPjxwYXRoIGQ9Ik0xMi41IDhjLTIuNjUgMC01LjA1Ljk5LTYuOSAyLjZMMiA3djloOWwtMy42Mi0zLjYyYzEuMzktMS4xNiAzLjE2LTEuODggNS4xMi0xLjg4IDMuNTQgMCA2LjU1IDIuMzEgNy42IDUuNWwyLjM3LS43OEMyMS4wOCAxMS4wMyAxNy4xNSA4IDEyLjUgOHoiIC8+PC9nPgo8ZyBpZD0idW5mb2xkLWxlc3MiPjxwYXRoIGQ9Ik03LjQxIDE4LjU5TDguODMgMjAgMTIgMTYuODMgMTUuMTcgMjBsMS40MS0xLjQxTDEyIDE0bC00LjU5IDQuNTl6bTkuMTgtMTMuMThMMTUuMTcgNCAxMiA3LjE3IDguODMgNCA3LjQxIDUuNDEgMTIgMTBsNC41OS00LjU5eiIgLz48L2c+CjxnIGlkPSJ1bmZvbGQtbW9yZSI+PHBhdGggZD0iTTEyIDUuODNMMTUuMTcgOWwxLjQxLTEuNDFMMTIgMyA3LjQxIDcuNTkgOC44MyA5IDEyIDUuODN6bTAgMTIuMzRMOC44MyAxNWwtMS40MSAxLjQxTDEyIDIxbDQuNTktNC41OUwxNS4xNyAxNSAxMiAxOC4xN3oiIC8+PC9nPgo8ZyBpZD0idXBkYXRlIj48cGF0aCBkPSJNMjEgMTAuMTJoLTYuNzhsMi43NC0yLjgyYy0yLjczLTIuNy03LjE1LTIuOC05Ljg4LS4xLTIuNzMgMi43MS0yLjczIDcuMDggMCA5Ljc5IDIuNzMgMi43MSA3LjE1IDIuNzEgOS44OCAwQzE4LjMyIDE1LjY1IDE5IDE0LjA4IDE5IDEyLjFoMmMwIDEuOTgtLjg4IDQuNTUtMi42NCA2LjI5LTMuNTEgMy40OC05LjIxIDMuNDgtMTIuNzIgMC0zLjUtMy40Ny0zLjUzLTkuMTEtLjAyLTEyLjU4IDMuNTEtMy40NyA5LjE0LTMuNDcgMTIuNjUgMEwyMSAzdjcuMTJ6TTEyLjUgOHY0LjI1bDMuNSAyLjA4LS43MiAxLjIxTDExIDEzVjhoMS41eiIgLz48L2c+CjxnIGlkPSJ2ZXJpZmllZC11c2VyIj48cGF0aCBkPSJNMTIgMUwzIDV2NmMwIDUuNTUgMy44NCAxMC43NCA5IDEyIDUuMTYtMS4yNiA5LTYuNDUgOS0xMlY1bC05LTR6bS0yIDE2bC00LTQgMS40MS0xLjQxTDEwIDE0LjE3bDYuNTktNi41OUwxOCA5bC04IDh6IiAvPjwvZz4KPGcgaWQ9InZpZXctYWdlbmRhIj48cGF0aCBkPSJNMjAgMTNIM2MtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTdjLjU1IDAgMS0uNDUgMS0xdi02YzAtLjU1LS40NS0xLTEtMXptMC0xMEgzYy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxN2MuNTUgMCAxLS40NSAxLTFWNGMwLS41NS0uNDUtMS0xLTF6IiAvPjwvZz4KPGcgaWQ9InZpZXctYXJyYXkiPjxwYXRoIGQ9Ik00IDE4aDNWNUg0djEzek0xOCA1djEzaDNWNWgtM3pNOCAxOGg5VjVIOHYxM3oiIC8+PC9nPgo8ZyBpZD0idmlldy1jYXJvdXNlbCI+PHBhdGggZD0iTTcgMTloMTBWNEg3djE1em0tNS0yaDRWNkgydjExek0xOCA2djExaDRWNmgtNHoiIC8+PC9nPgo8ZyBpZD0idmlldy1jb2x1bW4iPjxwYXRoIGQ9Ik0xMCAxOGg1VjVoLTV2MTN6bS02IDBoNVY1SDR2MTN6TTE2IDV2MTNoNVY1aC01eiIgLz48L2c+CjxnIGlkPSJ2aWV3LWRheSI+PHBhdGggZD0iTTIgMjFoMTl2LTNIMnYzek0yMCA4SDNjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE3Yy41NSAwIDEtLjQ1IDEtMVY5YzAtLjU1LS40NS0xLTEtMXpNMiAzdjNoMTlWM0gyeiIgLz48L2c+CjxnIGlkPSJ2aWV3LWhlYWRsaW5lIj48cGF0aCBkPSJNNCAxNWgxNnYtMkg0djJ6bTAgNGgxNnYtMkg0djJ6bTAtOGgxNlY5SDR2MnptMC02djJoMTZWNUg0eiIgLz48L2c+CjxnIGlkPSJ2aWV3LWxpc3QiPjxwYXRoIGQ9Ik00IDE0aDR2LTRINHY0em0wIDVoNHYtNEg0djR6TTQgOWg0VjVINHY0em01IDVoMTJ2LTRIOXY0em0wIDVoMTJ2LTRIOXY0ek05IDV2NGgxMlY1SDl6IiAvPjwvZz4KPGcgaWQ9InZpZXctbW9kdWxlIj48cGF0aCBkPSJNNCAxMWg1VjVINHY2em0wIDdoNXYtNkg0djZ6bTYgMGg1di02aC01djZ6bTYgMGg1di02aC01djZ6bS02LTdoNVY1aC01djZ6bTYtNnY2aDVWNWgtNXoiIC8+PC9nPgo8ZyBpZD0idmlldy1xdWlsdCI+PHBhdGggZD0iTTEwIDE4aDV2LTZoLTV2NnptLTYgMGg1VjVINHYxM3ptMTIgMGg1di02aC01djZ6TTEwIDV2NmgxMVY1SDEweiIgLz48L2c+CjxnIGlkPSJ2aWV3LXN0cmVhbSI+PHBhdGggZD0iTTQgMThoMTd2LTZINHY2ek00IDV2NmgxN1Y1SDR6IiAvPjwvZz4KPGcgaWQ9InZpZXctd2VlayI+PHBhdGggZD0iTTYgNUgzYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoM2MuNTUgMCAxLS40NSAxLTFWNmMwLS41NS0uNDUtMS0xLTF6bTE0IDBoLTNjLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWgzYy41NSAwIDEtLjQ1IDEtMVY2YzAtLjU1LS40NS0xLTEtMXptLTcgMGgtM2MtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDNjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xeiIgLz48L2c+CjxnIGlkPSJ2aXNpYmlsaXR5Ij48cGF0aCBkPSJNMTIgNC41QzcgNC41IDIuNzMgNy42MSAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjVzOS4yNy0zLjExIDExLTcuNWMtMS43My00LjM5LTYtNy41LTExLTcuNXpNMTIgMTdjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLThjLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDMgMy0xLjM0IDMtMy0xLjM0LTMtMy0zeiIgLz48L2c+CjxnIGlkPSJ2aXNpYmlsaXR5LW9mZiI+PHBhdGggZD0iTTEyIDdjMi43NiAwIDUgMi4yNCA1IDUgMCAuNjUtLjEzIDEuMjYtLjM2IDEuODNsMi45MiAyLjkyYzEuNTEtMS4yNiAyLjctMi44OSAzLjQzLTQuNzUtMS43My00LjM5LTYtNy41LTExLTcuNS0xLjQgMC0yLjc0LjI1LTMuOTguN2wyLjE2IDIuMTZDMTAuNzQgNy4xMyAxMS4zNSA3IDEyIDd6TTIgNC4yN2wyLjI4IDIuMjguNDYuNDZDMy4wOCA4LjMgMS43OCAxMC4wMiAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjUgMS41NSAwIDMuMDMtLjMgNC4zOC0uODRsLjQyLjQyTDE5LjczIDIyIDIxIDIwLjczIDMuMjcgMyAyIDQuMjd6TTcuNTMgOS44bDEuNTUgMS41NWMtLjA1LjIxLS4wOC40My0uMDguNjUgMCAxLjY2IDEuMzQgMyAzIDMgLjIyIDAgLjQ0LS4wMy42NS0uMDhsMS41NSAxLjU1Yy0uNjcuMzMtMS40MS41My0yLjIuNTMtMi43NiAwLTUtMi4yNC01LTUgMC0uNzkuMi0xLjUzLjUzLTIuMnptNC4zMS0uNzhsMy4xNSAzLjE1LjAyLS4xNmMwLTEuNjYtMS4zNC0zLTMtM2wtLjE3LjAxeiIgLz48L2c+CjxnIGlkPSJ3YXJuaW5nIj48cGF0aCBkPSJNMSAyMWgyMkwxMiAyIDEgMjF6bTEyLTNoLTJ2LTJoMnYyem0wLTRoLTJ2LTRoMnY0eiIgLz48L2c+CjxnIGlkPSJ3YXRjaC1sYXRlciI+PHBhdGggZD0iTTEyIDJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyem00LjIgMTQuMkwxMSAxM1Y3aDEuNXY1LjJsNC41IDIuNy0uOCAxLjN6IiAvPjwvZz4KPGcgaWQ9IndlZWtlbmQiPjxwYXRoIGQ9Ik0yMSAxMGMtMS4xIDAtMiAuOS0yIDJ2M0g1di0zYzAtMS4xLS45LTItMi0ycy0yIC45LTIgMnY1YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ2LTVjMC0xLjEtLjktMi0yLTJ6bS0zLTVINmMtMS4xIDAtMiAuOS0yIDJ2Mi4xNWMxLjE2LjQxIDIgMS41MSAyIDIuODJWMTRoMTJ2LTIuMDNjMC0xLjMuODQtMi40IDItMi44MlY3YzAtMS4xLS45LTItMi0yeiIgLz48L2c+CjxnIGlkPSJ3b3JrIj48cGF0aCBkPSJNMjAgNmgtNFY0YzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2Mkg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS02IDBoLTRWNGg0djJ6IiAvPjwvZz4KPGcgaWQ9InlvdXR1YmUtc2VhcmNoZWQtZm9yIj48cGF0aCBkPSJNMTcuMDEgMTRoLS44bC0uMjctLjI3Yy45OC0xLjE0IDEuNTctMi42MSAxLjU3LTQuMjMgMC0zLjU5LTIuOTEtNi41LTYuNS02LjVzLTYuNSAzLTYuNSA2LjVIMmwzLjg0IDQgNC4xNi00SDYuNTFDNi41MSA3IDguNTMgNSAxMS4wMSA1czQuNSAyLjAxIDQuNSA0LjVjMCAyLjQ4LTIuMDIgNC41LTQuNSA0LjUtLjY1IDAtMS4yNi0uMTQtMS44Mi0uMzhMNy43MSAxNS4xYy45Ny41NyAyLjA5LjkgMy4zLjkgMS42MSAwIDMuMDgtLjU5IDQuMjItMS41N2wuMjcuMjd2Ljc5bDUuMDEgNC45OUwyMiAxOWwtNC45OS01eiIgLz48L2c+CjxnIGlkPSJ6b29tLWluIj48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHptMi41LTRoLTJ2Mkg5di0ySDdWOWgyVjdoMXYyaDJ2MXoiIC8+PC9nPgo8ZyBpZD0iem9vbS1vdXQiPjxwYXRoIGQ9Ik0xNS41IDE0aC0uNzlsLS4yOC0uMjdDMTUuNDEgMTIuNTkgMTYgMTEuMTEgMTYgOS41IDE2IDUuOTEgMTMuMDkgMyA5LjUgM1MzIDUuOTEgMyA5LjUgNS45MSAxNiA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0ek03IDloNXYxSDd6IiAvPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1pY29uLWJ1dHRvbiI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CgogICAgICAgIHdpZHRoOiA0MHB4OwogICAgICAgIGhlaWdodDogNDBweDsKCiAgICAgICAgLyogTk9URTogQm90aCB2YWx1ZXMgYXJlIG5lZWRlZCwgc2luY2Ugc29tZSBwaG9uZXMgcmVxdWlyZSB0aGUgdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4gKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLyogQmVjYXVzZSBvZiBwb2x5bWVyLzI1NTgsIHRoaXMgc3R5bGUgaGFzIGxvd2VyIHNwZWNpZmljaXR5IHRoYW4gKiAqLwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1idXR0b247CiAgICAgIH0KCiAgICAgIDpob3N0ICNpbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pY29uLWJ1dHRvbi1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pY29uLWJ1dHRvbi1kaXNhYmxlZC10ZXh0LCB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKSk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBhdXRvOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pY29uLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpob3ZlcikgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWljb24tYnV0dG9uLWhvdmVyOwogICAgICB9CgogICAgICBpcm9uLWljb24gewogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxMDAlOwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8aXJvbi1pY29uIGlkPSJpY29uIiBzcmM9Iltbc3JjXV0iIGljb249IltbaWNvbl1dIiBhbHQkPSJbW2FsdF1dIj48L2lyb24taWNvbj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJydW4tY29sb3Itc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2NvbG9yLWNsYXNzPSdsaWdodC1ibHVlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0ncmVkJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXJlZC05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdncmVlbiddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWdyZWVuLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdwdXJwbGUnXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtOTAwKTsKICAgICAgfQogICAgICBbY29sb3ItY2xhc3M9J3RlYWwnXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdwaW5rJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcGluay01MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcGluay05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcGluay05MDApOwogICAgICB9CiAgICAgIFtjb2xvci1jbGFzcz0nb3JhbmdlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS05MDApOwogICAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdicm93biddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTUwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tOTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWJyb3duLTkwMCk7CiAgICAgIH0KICAgICAgW2NvbG9yLWNsYXNzPSdpbmRpZ28nXSBwYXBlci1jaGVja2JveCB7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTkwMCk7CiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tOTAwKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbXVsdGktY2hlY2tib3giPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icnVuLWNvbG9yLXN0eWxlIj48L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dCBpZD0ibmFtZXMtcmVnZXgiIG5vLWxhYmVsLWZsb2F0IGxhYmVsPSJXcml0ZSBhIHJlZ2V4IHRvIGZpbHRlciBydW5zIiB2YWx1ZT0iW1tyZWdleF1dIiBvbi1iaW5kLXZhbHVlLWNoYW5nZWQ9Il9kZWJvdW5jZWRSZWdleENoYW5nZSI+PC9wYXBlci1pbnB1dD4KICAgIDxkaXYgaWQ9Im91dGVyLWNvbnRhaW5lciIgY2xhc3M9InNjcm9sbGJhciI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbmFtZXNNYXRjaGluZ1JlZ2V4XV0iIG9uLWRvbS1jaGFuZ2U9InN5bmNocm9uaXplQ29sb3JzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJuYW1lLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLWNvbnRhaW5lciBjaGVja2JveC1jb250YWluZXIgdmVydGljYWwtYWxpZ24tY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJjaGVja2JveCB2ZXJ0aWNhbC1hbGlnbi1jZW50ZXIiIGlkJD0iY2hlY2tib3gtW1tpdGVtXV0iIG5hbWU9IltbaXRlbV1dIiBjaGVja2VkJD0iW1tfaXNDaGVja2VkKGl0ZW0sIHNlbGVjdGlvblN0YXRlLiopXV0iIG9uLWNoYW5nZT0iX2NoZWNrYm94Q2hhbmdlIj48L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJpY29uLWNvbnRhaW5lciBpc29sYXRvci1jb250YWluZXIgdmVydGljYWwtYWxpZ24tY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InJhZGlvLWJ1dHRvbi11bmNoZWNrZWQiIGNsYXNzPSJpc29sYXRvciB2ZXJ0aWNhbC1hbGlnbi1jZW50ZXIiIG9uLXRhcD0iX2lzb2xhdGVOYW1lIiBuYW1lPSJbW2l0ZW1dXSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1sYWJlbC1jb250YWluZXIiPgogICAgICAgICAgICA8c3Bhbj5bW2l0ZW1dXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAjb3V0ZXItY29udGFpbmVyIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5uYW1lLXJvdyB7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOyAvKiBtYWtlcyB3cmFwcGluZyBvZiBoeXBlcnBhcmFtIHN0cmluZ3MgYmV0dGVyICovCiAgICAgIH0KICAgICAgLmljb24tY29udGFpbmVyIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgIH0KICAgICAgLmNoZWNrYm94IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgLmlzb2xhdG9yIHsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICB9CiAgICAgIC5pc29sYXRvci1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNnB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgfQogICAgICAuY2hlY2tib3gtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgfQogICAgICAuaXRlbS1sYWJlbC1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNXB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICB3aWR0aDogMHB4OyAvKiBoYWNrIHRvIGdldCB0aGUgZmxleC1ncm93IHRvIHdvcmsgcHJvcGVybHkgKi8KICAgICAgfQogICAgICAudG9vbHRpcC12YWx1ZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tY2VudGVyIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tdG9wIHsKICAgICAgICBhbGlnbi1zZWxmOiBzdGFydDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtd2JyLXN0cmluZyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19wYXJ0c11dIiBhcz0icGFydCI+W1twYXJ0XV08d2JyPjwvdGVtcGxhdGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtcnVucy1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyB3aXRoLWJhY2tkcm9wIGlkPSJkYXRhLWxvY2F0aW9uLWRpYWxvZyI+CiAgICAgIDxoMj5EYXRhIExvY2F0aW9uPC9oMj4KICAgICAgPHRmLXdici1zdHJpbmcgdmFsdWU9IltbZGF0YUxvY2F0aW9uXV0iIC8+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxkaXYgaWQ9InRvcC10ZXh0Ij4KICAgICAgPGgzIGlkPSJ0b29sdGlwLWhlbHAiIGNsYXNzPSJ0b29sdGlwLWNvbnRhaW5lciI+UnVuczwvaDM+CiAgICA8L2Rpdj4KICAgIDx0Zi1tdWx0aS1jaGVja2JveCBpZD0ibXVsdGlDaGVja2JveCIgbmFtZXM9IltbcnVuc11dIiBzZWxlY3Rpb24tc3RhdGU9Int7cnVuU2VsZWN0aW9uU3RhdGV9fSIgb3V0LXNlbGVjdGVkPSJ7e3NlbGVjdGVkUnVuc319IiByZWdleD0ie3tyZWdleElucHV0fX0iIGNvbG9yaW5nPSJbW2NvbG9yaW5nXV0iPjwvdGYtbXVsdGktY2hlY2tib3g+CiAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJ4LWJ1dHRvbiIgaWQ9InRvZ2dsZS1hbGwiIG9uLXRhcD0iX3RvZ2dsZUFsbCI+CiAgICAgIFRvZ2dsZSBBbGwgUnVucwogICAgPC9wYXBlci1idXR0b24+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZGF0YUxvY2F0aW9uXV0iPgogICAgICA8ZGl2IGlkPSJkYXRhLWxvY2F0aW9uIj4KICAgICAgICA8dGYtd2JyLXN0cmluZyB2YWx1ZT0iW1tfY2xpcHBlZERhdGFMb2NhdGlvbl1dIiAvPjx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2hvdWxkU2hvd0V4cGFuZERhdGFMb2NhdGlvbkJ1dHRvbihkYXRhTG9jYXRpb24sIF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoKV1dIj48YSBocmVmPSIiIG9uLWNsaWNrPSJfb3BlbkRhdGFMb2NhdGlvbkRpYWxvZyI+4oCmPC9hPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHBhZGRpbmctYm90dG9tOiAxMHB4OwogICAgICB9CiAgICAgICN0b3AtdGV4dCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICB9CiAgICAgIHRmLW11bHRpLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAjdG9vbHRpcC1oZWxwIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KICAgICAgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAjZGF0YS1sb2NhdGlvbiB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luOiA1cHggMCAwIDA7CiAgICAgICAgbWF4LXdpZHRoOiAyODhweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXNwaW5uZXItc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC8qCiAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKi8KICAgICAgLyogU1RZTEVTIEZPUiBUSEUgU1BJTk5FUiAqLwogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAvKgogICAgICAgKiBDb25zdGFudHM6CiAgICAgICAqICAgICAgQVJDU0laRSAgICAgPSAyNzAgZGVncmVlcyAoYW1vdW50IG9mIGNpcmNsZSB0aGUgYXJjIHRha2VzIHVwKQogICAgICAgKiAgICAgIEFSQ1RJTUUgICAgID0gMTMzM21zICh0aW1lIGl0IHRha2VzIHRvIGV4cGFuZCBhbmQgY29udHJhY3QgYXJjKQogICAgICAgKiAgICAgIEFSQ1NUQVJUUk9UID0gMjE2IGRlZ3JlZXMgKGhvdyBtdWNoIHRoZSBzdGFydCBsb2NhdGlvbiBvZiB0aGUgYXJjCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgcm90YXRlIGVhY2ggdGltZSwgMjE2IGdpdmVzIHVzIGEKICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgcG9pbnRlZCBzdGFyIHNoYXBlIChpdCdzIDM2MC81ICogMykuCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgYSA3IHBvaW50ZWQgc3Rhciwgd2UgbWlnaHQgZG8KICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2MC83ICogMyA9IDE1NC4yODYpCiAgICAgICAqICAgICAgU0hSSU5LX1RJTUUgPSA0MDBtcwogICAgICAgKi8KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAyOHB4OwogICAgICAgIGhlaWdodDogMjhweDsKCiAgICAgICAgLyogMzYwICogQVJDVElNRSAvIChBUkNTVEFSVFJPVCArICgzNjAtQVJDU0laRSkpICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbjogMTU2OG1zOwoKICAgICAgICAvKiBBUkNUSU1FICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWV4cGFuZC1jb250cmFjdC1kdXJhdGlvbjogMTMzM21zOwoKICAgICAgICAvKiA0ICogQVJDVElNRSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uOiA1MzMybXM7CgogICAgICAgIC8qIFNIUklOS19USU1FICovCiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uOiA0MDBtczsKICAgICAgfQoKICAgICAgI3NwaW5uZXJDb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKCiAgICAgICAgLyogVGhlIHNwaW5uZXIgZG9lcyBub3QgaGF2ZSBhbnkgY29udGVudHMgdGhhdCB3b3VsZCBoYXZlIHRvIGJlCiAgICAgICAgICogZmxpcHBlZCBpZiB0aGUgZGlyZWN0aW9uIGNoYW5nZXMuIEFsd2F5cyB1c2UgbHRyIHNvIHRoYXQgdGhlCiAgICAgICAgICogc3R5bGUgd29ya3Mgb3V0IGNvcnJlY3RseSBpbiBib3RoIGNhc2VzLiAqLwogICAgICAgIGRpcmVjdGlvbjogbHRyOwogICAgICB9CgogICAgICAjc3Bpbm5lckNvbnRhaW5lci5hY3RpdmUgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBjb250YWluZXItcm90YXRlIHsKICAgICAgICB0byB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgY29udGFpbmVyLXJvdGF0ZSB7CiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpIH0KICAgICAgfQoKICAgICAgLnNwaW5uZXItbGF5ZXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTEgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTEtY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTUwMCkpOwogICAgICB9CgogICAgICAubGF5ZXItMiB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNwaW5uZXItbGF5ZXItMi1jb2xvciwgdmFyKC0tZ29vZ2xlLXJlZC01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTMgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTMtY29sb3IsIHZhcigtLWdvb2dsZS15ZWxsb3ctNTAwKSk7CiAgICAgIH0KCiAgICAgIC5sYXllci00IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci00LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tNTAwKSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBJTVBPUlRBTlQgTk9URSBBQk9VVCBDU1MgQU5JTUFUSU9OIFBST1BFUlRJRVMgKGtlYW51bGVlKToKICAgICAgICoKICAgICAgICogaU9TIFNhZmFyaSAodGVzdGVkIG9uIGlPUyA4LjEpIGRvZXMgbm90IGhhbmRsZSBhbmltYXRpb24tZGVsYXkgdmVyeSB3ZWxsIC0gaXQgZG9lc24ndAogICAgICAgKiBndWFyYW50ZWUgdGhhdCB0aGUgYW5pbWF0aW9uIHdpbGwgc3RhcnQgX2V4YWN0bHlfIGFmdGVyIHRoYXQgdmFsdWUuIFNvIHdlIGF2b2lkIHVzaW5nCiAgICAgICAqIGFuaW1hdGlvbi1kZWxheSBhbmQgaW5zdGVhZCBzZXQgY3VzdG9tIGtleWZyYW1lcyBmb3IgZWFjaCBjb2xvciAoYXMgbGF5ZXItMnVuZGFudCBhcyBpdAogICAgICAgKiBzZWVtcykuCiAgICAgICAqLwogICAgICAuYWN0aXZlIC5zcGlubmVyLWxheWVyIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGU7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbik7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uKTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0xIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTEtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMS1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0yIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTItZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMi1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0zIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTMtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMy1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci00IHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTQtZmFkZS1pbi1vdXQ7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItNC1mYWRlLWluLW91dDsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7CiAgICAgICAgMTIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzNWRlZykgfSAvKiAwLjUgKiBBUkNTSVpFICovCiAgICAgICAgMjUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgfSAvKiAxICAgKiBBUkNTSVpFICovCiAgICAgICAgMzcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovCiAgICAgICAgNTAlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDU0MGRlZykgfSAvKiAyICAgKiBBUkNTSVpFICovCiAgICAgICAgNjIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDY3NWRlZykgfSAvKiAyLjUgKiBBUkNTSVpFICovCiAgICAgICAgNzUlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovCiAgICAgICAgODcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDk0NWRlZykgfSAvKiAzLjUgKiBBUkNTSVpFICovCiAgICAgICAgdG8gICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEwODBkZWcpIH0gLyogNCAgICogQVJDU0laRSAqLwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZpbGwtdW5maWxsLXJvdGF0ZSB7CiAgICAgICAgMTIuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpIH0gLyogMC41ICogQVJDU0laRSAqLwogICAgICAgIDI1JSAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKSB9IC8qIDEgICAqIEFSQ1NJWkUgKi8KICAgICAgICAzNy41JSB7IHRyYW5zZm9ybTogcm90YXRlKDQwNWRlZykgfSAvKiAxLjUgKiBBUkNTSVpFICovCiAgICAgICAgNTAlICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSg1NDBkZWcpIH0gLyogMiAgICogQVJDU0laRSAqLwogICAgICAgIDYyLjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoNjc1ZGVnKSB9IC8qIDIuNSAqIEFSQ1NJWkUgKi8KICAgICAgICA3NSUgICB7IHRyYW5zZm9ybTogcm90YXRlKDgxMGRlZykgfSAvKiAzICAgKiBBUkNTSVpFICovCiAgICAgICAgODcuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpIH0gLyogMy41ICogQVJDU0laRSAqLwogICAgICAgIHRvICAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMTA4MGRlZykgfSAvKiA0ICAgKiBBUkNTSVpFICovCiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci0xLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDI1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDI2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDg5JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItMS1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNiUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA4OSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDEgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItMi1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICAxNSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA1MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA1MSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxheWVyLTItZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMTUlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTElIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGxheWVyLTMtZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNzUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNzYlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBsYXllci0zLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDQwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci00LWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDY1JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItNC1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA2NSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICAuY2lyY2xlLWNsaXBwZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDUwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhdGNoIHRoZSBnYXAgdGhhdCBhcHBlYXIgYmV0d2VlbiB0aGUgdHdvIGFkamFjZW50IGRpdi5jaXJjbGUtY2xpcHBlciB3aGlsZSB0aGUKICAgICAgICogc3Bpbm5lciBpcyByb3RhdGluZyAoYXBwZWFycyBvbiBDaHJvbWUgNTAsIFNhZmFyaSA5LjEuMSwgYW5kIEVkZ2UpLgogICAgICAgKi8KICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyIHsKICAgICAgICBsZWZ0OiA0NSU7CiAgICAgICAgd2lkdGg6IDEwJTsKICAgICAgICBib3JkZXItdG9wLXN0eWxlOiBzb2xpZDsKICAgICAgfQoKICAgICAgLnNwaW5uZXItbGF5ZXI6OmFmdGVyLAogICAgICAuY2lyY2xlLWNsaXBwZXI6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm9yZGVyLXdpZHRoOiB2YXIoLS1wYXBlci1zcGlubmVyLXN0cm9rZS13aWR0aCwgM3B4KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlcjo6YWZ0ZXIgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMjAwJTsKICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5sZWZ0OjphZnRlciB7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBib3JkZXItcmlnaHQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMjlkZWcpOwogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDEyOWRlZyk7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5yaWdodDo6YWZ0ZXIgewogICAgICAgIGxlZnQ6IC0xMDAlOwogICAgICAgIGJvcmRlci1sZWZ0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLmdhcC1wYXRjaDo6YWZ0ZXIsCiAgICAgIC5hY3RpdmUgLmNpcmNsZS1jbGlwcGVyOjphZnRlciB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZXhwYW5kLWNvbnRyYWN0LWR1cmF0aW9uKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1leHBhbmQtY29udHJhY3QtZHVyYXRpb24pOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIubGVmdDo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGxlZnQtc3BpbjsKICAgICAgICBhbmltYXRpb24tbmFtZTogbGVmdC1zcGluOwogICAgICB9CgogICAgICAuYWN0aXZlIC5jaXJjbGUtY2xpcHBlci5yaWdodDo6YWZ0ZXIgewogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IHJpZ2h0LXNwaW47CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsZWZ0LXNwaW4gewogICAgICAgIDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgICA1MCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC01ZGVnKSB9CiAgICAgICAgdG8geyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzMGRlZykgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxlZnQtc3BpbiB7CiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgICA1MCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZykgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyByaWdodC1zcGluIHsKICAgICAgICAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICAgIDUwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNWRlZykgfQogICAgICAgIHRvIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcmlnaHQtc3BpbiB7CiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgICAgNTAlIHsgdHJhbnNmb3JtOiByb3RhdGUoNWRlZykgfQogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfQogICAgICB9CgogICAgICAjc3Bpbm5lckNvbnRhaW5lci5jb29sZG93biB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGNvbnRhaW5lci1yb3RhdGUgdmFyKC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb24pIGxpbmVhciBpbmZpbml0ZSwgZmFkZS1vdXQgdmFyKC0tcGFwZXItc3Bpbm5lci1jb29sZG93bi1kdXJhdGlvbikgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpOwogICAgICAgIGFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlLCBmYWRlLW91dCB2YXIoLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uKSBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBmYWRlLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXNwaW5uZXItbGl0ZSI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItc3Bpbm5lci1zdHlsZXMiPjwvc3R5bGU+CgogICAgPGRpdiBpZD0ic3Bpbm5lckNvbnRhaW5lciIgY2xhc3MtbmFtZT0iW1tfX2NvbXB1dGVDb250YWluZXJDbGFzc2VzKGFjdGl2ZSwgX19jb29saW5nRG93bildXSIgb24tYW5pbWF0aW9uZW5kPSJfX3Jlc2V0IiBvbi13ZWJraXQtYW5pbWF0aW9uLWVuZD0iX19yZXNldCI+CiAgICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIGxlZnQiPjwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIHJpZ2h0Ij48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxzdHlsZT4KLnBsb3R0YWJsZS1jb2xvcnMtMCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzUyNzljNzsgLyogSU5ESUdPICovCn0KCi5wbG90dGFibGUtY29sb3JzLTEgewogIGJhY2tncm91bmQtY29sb3I6ICNmZDM3M2U7IC8qIENPUkFMX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjNjMjYxOyAvKiBGRVJOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTMgewogIGJhY2tncm91bmQtY29sb3I6ICNmYWQ0MTk7IC8qIEJSSUdIVF9TVU4gKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzJjMmI2ZjsgLyogSkFDQVJUQSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy01IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY3OTM5OyAvKiBCVVJOSU5HX09SQU5HRSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy02IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGIyZTY1OyAvKiBDRVJJU0VfUkVEICovCn0KCi5wbG90dGFibGUtY29sb3JzLTcgewogIGJhY2tncm91bmQtY29sb3I6ICM5OWNlNTA7IC8qIENPTklGRVIgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzk2MjU2NTsgLyogUk9ZQUxfSEVBVEggKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOSB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzA2Y2NjYzsgLyogUk9CSU5TX0VHR19CTFVFICovCn0KCi8qKgogKiBVc2VyLXN1cHBsaWVkIHJlbmRlclRvIGVsZW1lbnQuCiAqLwoucGxvdHRhYmxlIHsKICBkaXNwbGF5OiBibG9jazsgLyogbXVzdCBiZSBibG9jayBlbGVtZW50cyBmb3Igd2lkdGgvaGVpZ2h0IGNhbGN1bGF0aW9ucyB0byB3b3JrIGluIEZpcmVmb3guICovCiAgcG9pbnRlci1ldmVudHM6IHZpc2libGVGaWxsOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAvKioKICAgKiBQcmUgMy4wLCB1c2VycyBjb3VsZCBzZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgcm9vdCBlbGVtZW50IGluIHR3byB3YXlzOiBlaXRoZXIgdXNpbmcgQ1NTCiAgICogKGlubGluZSBvciB0aHJvdWdoIGEgc3R5bGVzaGVldCksIG9yIHVzaW5nIHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMuIEJ5IGRlZmF1bHQsIHdlCiAgICogc2V0IHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMgdG8gMTAwJS4KICAgKgogICAqIFBvc3QgMy4wIHRoZSByb290IGVsZW1lbnQgaXMgYWx3YXlzIGEgbm9ybWFsIGRpdiBhbmQgdGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgZGltZW5zaW9ucyBpcwogICAqIHRvIHVzZSBDU1MuIFRvIHJlcGxpY2F0ZSB0aGUgIjEwMCUtYnktZGVmYXVsdCIgYmVoYXZpb3IsIHdlIGFwcGx5IHdpZHRoL2hlaWdodCAxMDAlLgogICAqLwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKfQoKLyoqCiAqIFRoZSBfZWxlbWVudCB0aGF0IHJvb3RzIGVhY2ggQ29tcG9uZW50J3MgRE9NLgogKi8KLnBsb3R0YWJsZSAuY29tcG9uZW50IHsKICAvKiBBbGxvdyBjb21wb25lbnRzIHRvIGJlIHBvc2l0aW9uZWQgd2l0aCBleHBsaWNpdCBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgc3R5bGVzICovCiAgcG9zaXRpb246IGFic29sdXRlOwp9CgoucGxvdHRhYmxlIC5iYWNrZ3JvdW5kLWNvbnRhaW5lciwKLnBsb3R0YWJsZSAuY29udGVudCwKLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBEb24ndCBhbGxvdyBzdmcgZWxlbWVudHMgYWJvdmUgdGhlIGNvbnRlbnQgdG8gc3RlYWwgZXZlbnRzCiAqLwoucGxvdHRhYmxlIC5mb3JlZ3JvdW5kLWNvbnRhaW5lciB7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4gewogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy12aXNpYmxlIHsKICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMtY29udGFpbmVyIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICAvKioKICAgKiBQbGF5IHdlbGwgd2l0aCBkZWZlcnJlZCByZW5kZXJpbmcuCiAgICovCiAgdHJhbnNmb3JtLW9yaWdpbjogMHB4IDBweCAwcHg7Cn0KCi5wbG90dGFibGUgdGV4dCB7CiAgdGV4dC1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjsKfQoKLnBsb3R0YWJsZSAubGFiZWwgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuYmFyLWxhYmVsLXRleHQtYXJlYSB0ZXh0IHsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7Cn0KCi5wbG90dGFibGUgLmxhYmVsLWFyZWEgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDE0cHg7Cn0KCi5wbG90dGFibGUgLmxpZ2h0LWxhYmVsIHRleHQgewogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5kYXJrLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLm9mZi1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuc3RhY2tlZC1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLXBsb3QgLm9mZi1iYXItbGFiZWwgewogIC8qIEhBQ0tIQUNLICMyNzk1OiBjb3JyZWN0IG9mZi1iYXIgbGFiZWwgbG9naWMgdG8gYmUgaW1wbGVtZW50ZWQgb24gU3RhY2tlZEJhciAqLwogIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50Owp9CgoucGxvdHRhYmxlIC5heGlzLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMTBweDsKICBmb250LXdlaWdodDogYm9sZDsKICBsZXR0ZXItc3BhY2luZzogMXB4OwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLnBsb3R0YWJsZSAudGl0bGUtbGFiZWwgdGV4dCB7CiAgZm9udC1zaXplOiAyMHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoucGxvdHRhYmxlIC5heGlzIGxpbmUuYmFzZWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLnRpY2stbWFyayB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiAyMDA7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1jaXJjbGUgewogIGZpbGw6IHdoaXRlOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHN0cm9rZTogI0NDQzsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1saW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tcmVjdCB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5iYXItcGxvdCAuYmFzZWxpbmUgewogIHN0cm9rZTogIzk5OTsKfQoKLnBsb3R0YWJsZSAuZ3JpZGxpbmVzIGxpbmUgewogIHN0cm9rZTogIzNDM0MzQzsgLyogaGFja2hhY2s6IGdyaWRsaW5lcyBzaG91bGQgYmUgc29saWQ7IHNlZSAjODIwICovCiAgb3BhY2l0eTogMC4yNTsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuc2VsZWN0aW9uLWJveC1sYXllciAuc2VsZWN0aW9uLWFyZWEgewogIGZpbGw6IGJsYWNrOwogIGZpbGwtb3BhY2l0eTogMC4wMzsKICBzdHJva2U6ICNDQ0M7Cn0KLyogRHJhZ0JveExheWVyICovCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlIC5kcmFnLWVkZ2UtbHIgewogIGN1cnNvcjogZXctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLnktcmVzaXphYmxlIC5kcmFnLWVkZ2UtdGIgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItdGwgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRyIHsKICBjdXJzb3I6IG5lc3ctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci1ibCB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYnIgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLm1vdmFibGUgLnNlbGVjdGlvbi1hcmVhIHsKICBjdXJzb3I6IG1vdmU7IC8qIElFIGZhbGxiYWNrICovCiAgY3Vyc29yOiAtbW96LWdyYWI7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgY3Vyc29yOiBncmFiOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYTphY3RpdmUgewogIGN1cnNvcjogLW1vei1ncmFiYmluZzsKICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgY3Vyc29yOiBncmFiYmluZzsKfQovKiAvRHJhZ0JveExheWVyICovCgoucGxvdHRhYmxlIC5ndWlkZS1saW5lLWxheWVyIGxpbmUuZ3VpZGUtbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC52ZXJ0aWNhbCBsaW5lLmRyYWctZWRnZSB7CiAgY3Vyc29yOiBldy1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctbGluZS1sYXllci5lbmFibGVkLmhvcml6b250YWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5sZWdlbmQgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCByZWN0LnN3YXRjaC1ib3VuZGluZy1ib3ggewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC53YXRlcmZhbGwtcGxvdCBsaW5lLmNvbm5lY3RvciB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5waWUtcGxvdCAuYXJjLm91dGxpbmUgewogIHN0cm9rZS1saW5lam9pbjogcm91bmQ7Cn0KPC9zdHlsZT4KCjxkb20tbW9kdWxlIGlkPSJwbG90dGFibGUtc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KLnBsb3R0YWJsZS1jb2xvcnMtMCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzUyNzljNzsgLyogSU5ESUdPICovCn0KCi5wbG90dGFibGUtY29sb3JzLTEgewogIGJhY2tncm91bmQtY29sb3I6ICNmZDM3M2U7IC8qIENPUkFMX1JFRCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy0yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNjNjMjYxOyAvKiBGRVJOICovCn0KCi5wbG90dGFibGUtY29sb3JzLTMgewogIGJhY2tncm91bmQtY29sb3I6ICNmYWQ0MTk7IC8qIEJSSUdIVF9TVU4gKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzJjMmI2ZjsgLyogSkFDQVJUQSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy01IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmY3OTM5OyAvKiBCVVJOSU5HX09SQU5HRSAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy02IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjZGIyZTY1OyAvKiBDRVJJU0VfUkVEICovCn0KCi5wbG90dGFibGUtY29sb3JzLTcgewogIGJhY2tncm91bmQtY29sb3I6ICM5OWNlNTA7IC8qIENPTklGRVIgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOCB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzk2MjU2NTsgLyogUk9ZQUxfSEVBVEggKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtOSB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzA2Y2NjYzsgLyogUk9CSU5TX0VHR19CTFVFICovCn0KCi8qKgogKiBVc2VyLXN1cHBsaWVkIHJlbmRlclRvIGVsZW1lbnQuCiAqLwoucGxvdHRhYmxlIHsKICBkaXNwbGF5OiBibG9jazsgLyogbXVzdCBiZSBibG9jayBlbGVtZW50cyBmb3Igd2lkdGgvaGVpZ2h0IGNhbGN1bGF0aW9ucyB0byB3b3JrIGluIEZpcmVmb3guICovCiAgcG9pbnRlci1ldmVudHM6IHZpc2libGVGaWxsOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAvKioKICAgKiBQcmUgMy4wLCB1c2VycyBjb3VsZCBzZXQgdGhlIGRpbWVuc2lvbiBvZiB0aGUgcm9vdCBlbGVtZW50IGluIHR3byB3YXlzOiBlaXRoZXIgdXNpbmcgQ1NTCiAgICogKGlubGluZSBvciB0aHJvdWdoIGEgc3R5bGVzaGVldCksIG9yIHVzaW5nIHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMuIEJ5IGRlZmF1bHQsIHdlCiAgICogc2V0IHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMgdG8gMTAwJS4KICAgKgogICAqIFBvc3QgMy4wIHRoZSByb290IGVsZW1lbnQgaXMgYWx3YXlzIGEgbm9ybWFsIGRpdiBhbmQgdGhlIG9ubHkgd2F5IHRvIHNldCB0aGUgZGltZW5zaW9ucyBpcwogICAqIHRvIHVzZSBDU1MuIFRvIHJlcGxpY2F0ZSB0aGUgIjEwMCUtYnktZGVmYXVsdCIgYmVoYXZpb3IsIHdlIGFwcGx5IHdpZHRoL2hlaWdodCAxMDAlLgogICAqLwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKfQoKLyoqCiAqIFRoZSBfZWxlbWVudCB0aGF0IHJvb3RzIGVhY2ggQ29tcG9uZW50J3MgRE9NLgogKi8KLnBsb3R0YWJsZSAuY29tcG9uZW50IHsKICAvKiBBbGxvdyBjb21wb25lbnRzIHRvIGJlIHBvc2l0aW9uZWQgd2l0aCBleHBsaWNpdCBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgc3R5bGVzICovCiAgcG9zaXRpb246IGFic29sdXRlOwp9CgoucGxvdHRhYmxlIC5iYWNrZ3JvdW5kLWNvbnRhaW5lciwKLnBsb3R0YWJsZSAuY29udGVudCwKLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7Cn0KCi8qKgogKiBEb24ndCBhbGxvdyBzdmcgZWxlbWVudHMgYWJvdmUgdGhlIGNvbnRlbnQgdG8gc3RlYWwgZXZlbnRzCiAqLwoucGxvdHRhYmxlIC5mb3JlZ3JvdW5kLWNvbnRhaW5lciB7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4gewogIG92ZXJmbG93OiBoaWRkZW47Cn0KCi5wbG90dGFibGUgLmNvbXBvbmVudC1vdmVyZmxvdy12aXNpYmxlIHsKICBvdmVyZmxvdzogdmlzaWJsZTsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMtY29udGFpbmVyIHsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDEwMCU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnBsb3R0YWJsZSAucGxvdC1jYW52YXMgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICAvKioKICAgKiBQbGF5IHdlbGwgd2l0aCBkZWZlcnJlZCByZW5kZXJpbmcuCiAgICovCiAgdHJhbnNmb3JtLW9yaWdpbjogMHB4IDBweCAwcHg7Cn0KCi5wbG90dGFibGUgdGV4dCB7CiAgdGV4dC1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjsKfQoKLnBsb3R0YWJsZSAubGFiZWwgdGV4dCB7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuYmFyLWxhYmVsLXRleHQtYXJlYSB0ZXh0IHsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7Cn0KCi5wbG90dGFibGUgLmxhYmVsLWFyZWEgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDE0cHg7Cn0KCi5wbG90dGFibGUgLmxpZ2h0LWxhYmVsIHRleHQgewogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5kYXJrLWxhYmVsIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7Cn0KCi5wbG90dGFibGUgLm9mZi1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAuc3RhY2tlZC1iYXItbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LXN0eWxlOiBub3JtYWw7Cn0KCi5wbG90dGFibGUgLnN0YWNrZWQtYmFyLXBsb3QgLm9mZi1iYXItbGFiZWwgewogIC8qIEhBQ0tIQUNLICMyNzk1OiBjb3JyZWN0IG9mZi1iYXIgbGFiZWwgbG9naWMgdG8gYmUgaW1wbGVtZW50ZWQgb24gU3RhY2tlZEJhciAqLwogIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50Owp9CgoucGxvdHRhYmxlIC5heGlzLWxhYmVsIHRleHQgewogIGZvbnQtc2l6ZTogMTBweDsKICBmb250LXdlaWdodDogYm9sZDsKICBsZXR0ZXItc3BhY2luZzogMXB4OwogIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKfQoKLnBsb3R0YWJsZSAudGl0bGUtbGFiZWwgdGV4dCB7CiAgZm9udC1zaXplOiAyMHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoucGxvdHRhYmxlIC5heGlzIGxpbmUuYmFzZWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyBsaW5lLnRpY2stbWFyayB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIHRleHQgewogIGZpbGw6ICMzMjMxM0Y7CiAgZm9udC1mYW1pbHk6ICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiAyMDA7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1jaXJjbGUgewogIGZpbGw6IHdoaXRlOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHN0cm9rZTogI0NDQzsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1saW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tcmVjdCB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIGZpbGw6IHdoaXRlOwp9CgoucGxvdHRhYmxlIC5iYXItcGxvdCAuYmFzZWxpbmUgewogIHN0cm9rZTogIzk5OTsKfQoKLnBsb3R0YWJsZSAuZ3JpZGxpbmVzIGxpbmUgewogIHN0cm9rZTogIzNDM0MzQzsgLyogaGFja2hhY2s6IGdyaWRsaW5lcyBzaG91bGQgYmUgc29saWQ7IHNlZSAjODIwICovCiAgb3BhY2l0eTogMC4yNTsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuc2VsZWN0aW9uLWJveC1sYXllciAuc2VsZWN0aW9uLWFyZWEgewogIGZpbGw6IGJsYWNrOwogIGZpbGwtb3BhY2l0eTogMC4wMzsKICBzdHJva2U6ICNDQ0M7Cn0KLyogRHJhZ0JveExheWVyICovCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlIC5kcmFnLWVkZ2UtbHIgewogIGN1cnNvcjogZXctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLnktcmVzaXphYmxlIC5kcmFnLWVkZ2UtdGIgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItdGwgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLXRyIHsKICBjdXJzb3I6IG5lc3ctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci1ibCB7CiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItYnIgewogIGN1cnNvcjogbndzZS1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLm1vdmFibGUgLnNlbGVjdGlvbi1hcmVhIHsKICBjdXJzb3I6IG1vdmU7IC8qIElFIGZhbGxiYWNrICovCiAgY3Vyc29yOiAtbW96LWdyYWI7CiAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgY3Vyc29yOiBncmFiOwp9CgoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci5tb3ZhYmxlIC5zZWxlY3Rpb24tYXJlYTphY3RpdmUgewogIGN1cnNvcjogLW1vei1ncmFiYmluZzsKICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgY3Vyc29yOiBncmFiYmluZzsKfQovKiAvRHJhZ0JveExheWVyICovCgoucGxvdHRhYmxlIC5ndWlkZS1saW5lLWxheWVyIGxpbmUuZ3VpZGUtbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5kcmFnLWxpbmUtbGF5ZXIuZW5hYmxlZC52ZXJ0aWNhbCBsaW5lLmRyYWctZWRnZSB7CiAgY3Vyc29yOiBldy1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctbGluZS1sYXllci5lbmFibGVkLmhvcml6b250YWwgbGluZS5kcmFnLWVkZ2UgewogIGN1cnNvcjogbnMtcmVzaXplOwp9CgoucGxvdHRhYmxlIC5sZWdlbmQgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LWZhbWlseTogIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjsKICBmb250LXNpemU6IDEycHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuaW50ZXJwb2xhdGVkLWNvbG9yLWxlZ2VuZCByZWN0LnN3YXRjaC1ib3VuZGluZy1ib3ggewogIGZpbGw6IG5vbmU7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4OwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9CgoucGxvdHRhYmxlIC53YXRlcmZhbGwtcGxvdCBsaW5lLmNvbm5lY3RvciB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5waWUtcGxvdCAuYXJjLm91dGxpbmUgewogIHN0cm9rZS1saW5lam9pbjogcm91bmQ7Cn0KPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotY2hhcnQtdG9vbHRpcCI+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idnotcGFuLXpvb20tc3R5bGUiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmhlbHAgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAxczsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IDFzOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmYWRlLW91dDsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDMwLCAzMCwgMzAsIDAuNik7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIHBhZGRpbmc6IDIwcHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLmhlbHAgPiBzcGFuIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHsKICAgICAgICAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIH0KCiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1saW5lLWNoYXJ0MiI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0iY2hhcnRkaXYiPjwvZGl2PgogICAgPHZ6LWNoYXJ0LXRvb2x0aXAgaWQ9InRvb2x0aXAiIHBvc2l0aW9uPSJbW3Rvb2x0aXBQb3NpdGlvbl1dIiBjb250ZW50LWNvbXBvbmVudC1uYW1lPSJ2ei1saW5lLWNoYXJ0LXRvb2x0aXAiPjwvdnotY2hhcnQtdG9vbHRpcD4KICAgIDxzdHlsZSBpbmNsdWRlPSJwbG90dGFibGUtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idnotcGFuLXpvb20tc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICAgIGRpdiB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IC5tYWluIHsKICAgICAgICBjdXJzb3I6IGNyb3NzaGFpcjsKICAgICAgfQoKICAgICAgOmhvc3QoLnBhbmtleSkgI2NoYXJ0ZGl2IDpub3QoLmRyYWctem9vbWluZykgLm1haW4gewogICAgICAgIGN1cnNvcjogLXdlYmtpdC1ncmFiOwogICAgICAgIGN1cnNvcjogZ3JhYjsKICAgICAgfQoKICAgICAgOmhvc3QoLm1vdXNlZG93bikgI2NoYXJ0ZGl2IC5wYW5uaW5nIC5tYWluIHsKICAgICAgICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7CiAgICAgICAgY3Vyc29yOiBncmFiYmluZzsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IGxpbmUuZ3VpZGUtbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5OwogICAgICAgIHN0cm9rZS13aWR0aDogMS41cHg7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2OmhvdmVyIHsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAogIAogIAogIAogIAo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idnotbGluZS1jaGFydC10b29sdGlwIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgPHRhYmxlPgogICAgICAgIDx0aGVhZD48L3RoZWFkPgogICAgICAgIDx0Ym9keT48L3Rib2R5PgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgdGFibGUgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBsaW5lLWhlaWdodDogMS40ZW07CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgIH0KCiAgICAgIHRoZWFkIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIHRib2R5IHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIxcHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgdGQgewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICB9CgogICAgICAuc3dhdGNoIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICB9CgogICAgICAuY2xvc2VzdCAuc3dhdGNoIHsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAycHggI2ZmZjsKICAgICAgfQoKICAgICAgdGggewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5kaXN0YW50IHRkOm5vdCguc3dhdGNoKSB7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjaGFydC1hbmQtc3Bpbm5lci1jb250YWluZXIiPgogICAgICA8dnotbGluZS1jaGFydDIgaWQ9ImNoYXJ0IiBkYXRhLWxvYWRpbmckPSJbW2RhdGFMb2FkaW5nXV0iIGNvbG9yLXNjYWxlPSJbW2NvbG9yU2NhbGVdXSIgZGVmYXVsdC14LXJhbmdlPSJbW2RlZmF1bHRYUmFuZ2VdXSIgZGVmYXVsdC15LXJhbmdlPSJbW2RlZmF1bHRZUmFuZ2VdXSIgZmlsbC1hcmVhPSJbW2ZpbGxBcmVhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBvbi1jaGFydC1hdHRhY2hlZD0iX29uQ2hhcnRBdHRhY2hlZCIgc21vb3RoaW5nLWVuYWJsZWQ9Iltbc21vb3RoaW5nRW5hYmxlZF1dIiBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIiBzeW1ib2wtZnVuY3Rpb249Iltbc3ltYm9sRnVuY3Rpb25dXSIgdG9vbHRpcC1jb2x1bW5zPSJbW3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtcG9zaXRpb249IltbdG9vbHRpcFBvc2l0aW9uXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1t4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIiB5LXZhbHVlLWFjY2Vzc29yPSJbW3lWYWx1ZUFjY2Vzc29yXV0iPjwvdnotbGluZS1jaGFydDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tkYXRhTG9hZGluZ11dIj4KICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nLXNwaW5uZXItY29udGFpbmVyIj4KICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlPjwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdChbX21heWJlLXJlbmRlcmVkLWluLWJhZC1zdGF0ZV0pIHZ6LWxpbmUtY2hhcnQgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2NoYXJ0LWFuZC1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjbG9hZGluZy1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDJbZGF0YS1sb2FkaW5nXSB7CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSI+CgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5pcy1zY3JvbGxlZDpub3QoOmZpcnN0LWNoaWxkKSk6OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRpdmlkZXItY29sb3IpOwogICAgICB9CgogICAgICA6aG9zdCguY2FuLXNjcm9sbDpub3QoLnNjcm9sbGVkLXRvLWJvdHRvbSk6bm90KDpsYXN0LWNoaWxkKSk6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvcik7CiAgICAgIH0KCiAgICAgIC5zY3JvbGxhYmxlIHsKICAgICAgICBwYWRkaW5nOiAwIDI0cHg7CgogICAgICAgIEBhcHBseSAtLWxheW91dC1zY3JvbGw7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXNjcm9sbGFibGU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0ic2Nyb2xsYWJsZSIgY2xhc3M9InNjcm9sbGFibGUiIG9uLXNjcm9sbD0idXBkYXRlU2Nyb2xsU3RhdGUiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLW1hcmtkb3duLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9Im1hcmtkb3duIiBpbm5lci1oLXQtbS1sPSJbW2h0bWxdXSI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIC8qCiAgICAgICAqIFJlZHVjZSB0b3Btb3N0IGFuZCBib3R0b21tb3N0IG1hcmdpbnMgZnJvbSAxNnB4IHRvIDAuM2VtIChyZW5kZXJzCiAgICAgICAqIGF0IGFib3V0IDQuOHB4KSB0byBrZWVwIHRoZSBsYXlvdXQgY29tcGFjdC4gVGhpcyBpbXByb3ZlcyB0aGUKICAgICAgICogYXBwZWFyYW5jZSB3aGVuIHRoZXJlIGlzIG9ubHkgb25lIGxpbmUgb2YgdGV4dDsgc3RhbmRhcmQgTWFya2Rvd24KICAgICAgICogcmVuZGVyZXJzIHdpbGwgc3RpbGwgaW5jbHVkZSBhIGA8cD5gIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEJ5IHRhcmdldGluZyBvbmx5IHRoZSB0b3AtbGV2ZWwsIGV4dHJlbWFsIGVsZW1lbnRzLCB3ZSBwcmVzZXJ2ZSBhbnkKICAgICAgICogYWN0dWFsIHBhcmFncmFwaCBicmVha3MgYW5kIG9ubHkgY2hhbmdlIHRoZSBwYWRkaW5nIGFnYWluc3QgdGhlCiAgICAgICAqIGNvbXBvbmVudCBlZGdlcy4KICAgICAgICovCiAgICAgICNtYXJrZG93biA+IHA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDAuM2VtOwogICAgICB9CiAgICAgICNtYXJrZG93biA+IHA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMC4zZW07CiAgICAgIH0KCiAgICAgIC8qIFBsZWFzYW50IHN0eWxlcyBmb3IgTWFya2Rvd24gdGFibGVzLiAqLwogICAgICAjbWFya2Rvd24gdGFibGUgewogICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICAgIH0KICAgICAgI21hcmtkb3duIHRhYmxlIHRoIHsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICB9CiAgICAgICNtYXJrZG93biB0YWJsZSB0aCwKICAgICAgI21hcmtkb3duIHRhYmxlIHRkIHsKICAgICAgICBwYWRkaW5nOiA2cHggMTNweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGZlMmU1OwogICAgICB9CiAgICAgICNtYXJrZG93biB0YWJsZSB0ciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2M2Y2JkMTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIGZpZ2NhcHRpb24gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAvKiogSG9yaXpvbnRhbCBsaW5lIG9mIGxhYmVscy4gKi8KICAgICAgLmhlYWRpbmctcm93IHsKICAgICAgICBtYXJnaW4tdG9wOiAtNHB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KCiAgICAgIC8qKiBQaWVjZSBvZiB0ZXh0IGluIHRoZSBmaWd1cmUgY2FwdGlvbi4gKi8KICAgICAgLmhlYWRpbmctbGFiZWwgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQoKICAgICAgLyoqIE1ha2VzIGxhYmVsIHNob3cgb24gdGhlIHJpZ2h0LiAqLwogICAgICAuaGVhZGluZy1yaWdodCB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY2FyZC1oZWFkaW5nIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8ZmlnY2FwdGlvbiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19uYW1lTGFiZWxdXSI+CiAgICAgICAgICAgIDxkaXYgaXRlbXByb3A9Im5hbWUiIGNsYXNzPSJoZWFkaW5nLWxhYmVsIG5hbWUiPgogICAgICAgICAgICAgIFtbX25hbWVMYWJlbF1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tydW5dXSI+CiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgPHNwYW4gaXRlbXByb3A9InJ1biIgaWQ9ImhlYWRpbmctcnVuIiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0IHJ1biI+W1tydW5dXTwvc3Bhbj4KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3RhZ0xhYmVsXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgICB0YWc6IDxzcGFuIGl0ZW1wcm9wPSJ0YWciPltbX3RhZ0xhYmVsXV08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgIDwvZmlnY2FwdGlvbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Rlc2NyaXB0aW9uXV0iPgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJpbmZvIiBvbi10YXA9Il90b2dnbGVEZXNjcmlwdGlvbkRpYWxvZyIgdGl0bGU9IlNob3cgc3VtbWFyeSBkZXNjcmlwdGlvbiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWRpYWxvZyBpZD0iZGVzY3JpcHRpb25EaWFsb2ciIG5vLW92ZXJsYXAgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIgdmVydGljYWwtYWxpZ249ImF1dG8iPgogICAgICAgIDxwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZT4KICAgICAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbZGVzY3JpcHRpb25dXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItZGlhbG9nLXNjcm9sbGFibGU+CiAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAuY29udGVudCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAubmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIC5ydW4gewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgcGFkZGluZzogMXB4IDRweCAycHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICBwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSB7CiAgICAgICAgbWF4LXdpZHRoOiA2NDBweDsKICAgICAgfQogICAgICAjaGVhZGluZy1ydW4gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRmLWNhcmQtaGVhZGluZy1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgICBjb2xvcjogdmFyKC0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1kb3dubG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9InJ1biB0byBkb3dubG9hZCIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfcnVufX0iPgogICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW3J1bnNdXSI+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19ydW5dXSI+CiAgICAgIDxhIGRvd25sb2FkPSJbW19jc3ZOYW1lKHRhZywgX3J1bildXSIgaHJlZj0iW1tfY3N2VXJsKHRhZywgX3J1biwgdXJsRm4pXV0iPkNTVjwvYT48YSBkb3dubG9hZD0iW1tfanNvbk5hbWUodGFnLCBfcnVuKV1dIiBocmVmPSJbW19qc29uVXJsKHRhZywgX3J1biwgdXJsRm4pXV0iPkpTT048L2E+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgfQogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICB3aWR0aDogMTAwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgYSB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbjogMCAwLjJlbTsKICAgICAgfQogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgZm9udC1zaXplOiAyMnB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNjYWxhci1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPGRpdiBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIiPgogICAgICA8dGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIGNvbG9yLXNjYWxlPSJbW19nZXRDb2xvclNjYWxlKGNvbG9yU2NhbGUpXV0iIGRhdGEtc2VyaWVzPSJbW19nZXREYXRhU2VyaWVzKGRhdGFUb0xvYWQuKildXSIgZGF0YS10by1sb2FkPSJbW2RhdGFUb0xvYWRdXSIgZ2V0LWRhdGEtbG9hZC1uYW1lPSJbW19nZXREYXRhTG9hZE5hbWVdXSIgZ2V0LWRhdGEtbG9hZC11cmw9IltbZ2V0RGF0YUxvYWRVcmxdXSIgcmVxdWVzdC1kYXRhPSJbW3JlcXVlc3REYXRhXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBsb2FkLWRhdGEtY2FsbGJhY2s9IltbX2xvYWREYXRhQ2FsbGJhY2tdXSIgbG9hZC1rZXk9IltbdGFnXV0iIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tyZXF1ZXN0TWFuYWdlcl1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9Iltbc21vb3RoaW5nV2VpZ2h0XV0iIHRhZy1tZXRhZGF0YT0iW1t0YWdNZXRhZGF0YV1dIiB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iIHRvb2x0aXAtcG9zaXRpb249ImF1dG8iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC10eXBlPSJbW3hUeXBlXV0iPgogICAgICA8L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImJ1dHRvbnMiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgaWNvbj0ibGluZS13ZWlnaHQiIG9uLXRhcD0iX3RvZ2dsZUxvZ1NjYWxlIiB0aXRsZT0iVG9nZ2xlIHktYXhpcyBsb2cgc2NhbGUiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIgb24tdGFwPSJfcmVzZXREb21haW4iIHRpdGxlPSJGaXQgZG9tYWluIHRvIGRhdGEiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8cGFwZXItbWVudS1idXR0b24gb24tcGFwZXItZHJvcGRvd24tb3Blbj0iX3VwZGF0ZURvd25sb2FkTGluayI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gY2xhc3M9ImRyb3Bkb3duLXRyaWdnZXIiIHNsb3Q9ImRyb3Bkb3duLXRyaWdnZXIiIGljb249ImZpbGUtZG93bmxvYWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtPgogICAgICAgICAgICAgIDxhIGlkPSJzdmdMaW5rIiBkb3dubG9hZD0iW1t0YWddXS5zdmciPgogICAgICAgICAgICAgICAgRG93bmxvYWQgQ3VycmVudCBDaGFydCBhcyBTVkcKICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLW1lbnUtYnV0dG9uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8c3BhbiBzdHlsZT0iZmxleC1ncm93OiAxIj48L3NwYW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkb3dubG9hZC1saW5rcyI+CiAgICAgICAgICA8dGYtZG93bmxvYWRlciBydW5zPSJbW19ydW5zRnJvbURhdGEoZGF0YVRvTG9hZCldXSIgdGFnPSJbW3RhZ11dIiB1cmwtZm49IltbX2Rvd25sb2FkVXJsRm5dXSI+PC90Zi1kb3dubG9hZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXJnaW46IDVweDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogNDAwcHg7CiAgICAgIH0KCiAgICAgICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgdGYtY2FyZC1oZWFkaW5nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICB9CgogICAgICAjYnV0dG9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICMyMTk2ZjM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyBhIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbjogMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgd2lkdGg6IDEwMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1tZW51LWJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQogICAgICBwYXBlci1pdGVtIGEgewogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItcHJvZ3Jlc3MiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAyMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pLCBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLXByb2dyZXNzLWNvbnRhaW5lcjsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzc0NvbnRhaW5lciwKICAgICAgLyogdGhlIHN0cmlwZSBmb3IgdGhlIGluZGV0ZXJtaW5hdGUgYW5pbWF0aW9uKi8KICAgICAgLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBoZWlnaHQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWhlaWdodCwgNHB4KTsKICAgICAgfQoKICAgICAgI3ByaW1hcnlQcm9ncmVzcywKICAgICAgI3NlY29uZGFyeVByb2dyZXNzLAogICAgICAuaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzc0NvbnRhaW5lciwKICAgICAgLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXItY29sb3IsIHZhcigtLWdvb2dsZS1ncmV5LTMwMCkpOwogICAgICB9CgogICAgICA6aG9zdCgudHJhbnNpdGluZykgI3ByaW1hcnlQcm9ncmVzcywKICAgICAgOmhvc3QoLnRyYW5zaXRpbmcpICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybTsKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm07CgogICAgICAgIC8qIER1cmF0aW9uICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWR1cmF0aW9uLCAwLjA4cyk7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMC4wOHMpOwoKICAgICAgICAvKiBUaW1pbmcgZnVuY3Rpb24gKi8KICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiwgZWFzZSk7CiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uLCBlYXNlKTsKCiAgICAgICAgLyogRGVsYXkgKi8KICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZGVsYXksIDBzKTsKICAgICAgICB0cmFuc2l0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWRlbGF5LCAwcyk7CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMCk7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgI3ByaW1hcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tNTAwKSk7CiAgICAgIH0KCiAgICAgICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3Mtc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JlZW4tMTAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNwcmltYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLWFjdGl2ZS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZXktNTAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNzZWNvbmRhcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JleS0zMDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZGlzYWJsZWRdKSkgI3ByaW1hcnlQcm9ncmVzcy5pbmRldGVybWluYXRlIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGluZGV0ZXJtaW5hdGUtYmFyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLWJhciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtkaXNhYmxlZF0pKSAjcHJpbWFyeVByb2dyZXNzLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKCiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb246IGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtYmFyIHsKICAgICAgICAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoLTEwMCUpOwogICAgICAgIH0KICAgICAgICA1MCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgICAgNzUlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllciguMjgsLjYyLC4zNywuOTEpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMCkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgaW5kZXRlcm1pbmF0ZS1zcGxpdHRlciB7CiAgICAgICAgMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgIH0KICAgICAgICAzMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjQyLDAsLjYsLjgpOwogICAgICAgIH0KICAgICAgICA5MCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtYmFyIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgICA3NSUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjI4LC42MiwuMzcsLjkxKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgwKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgaW5kZXRlcm1pbmF0ZS1zcGxpdHRlciB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICB9CiAgICAgICAgMzAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjQyLDAsLjYsLjgpOwogICAgICAgIH0KICAgICAgICA5MCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0icHJvZ3Jlc3NDb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJzZWNvbmRhcnlQcm9ncmVzcyIgaGlkZGVuJD0iW1tfaGlkZVNlY29uZGFyeVByb2dyZXNzKHNlY29uZGFyeVJhdGlvKV1dIj48L2Rpdj4KICAgICAgPGRpdiBpZD0icHJpbWFyeVByb2dyZXNzIj48L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1zbGlkZXIiPgogIDx0ZW1wbGF0ZSBzdHJpcC13aGl0ZXNwYWNlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwogICAgICAgIEBhcHBseSAtLWxheW91dC1qdXN0aWZpZWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICB3aWR0aDogMjAwcHg7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLXNlY29uZGFyeS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtMzAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1hY3RpdmUtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1hY3RpdmUtY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1zZWNvbmRhcnktY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1zZWNvbmRhcnktY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQ6IHZhcigtLXBhcGVyLXNsaWRlci1oZWlnaHQsIDJweCk7CiAgICAgIH0KCiAgICAgIC8qIGZvY3VzIHNob3dzIHRoZSByaXBwbGUgKi8KICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5PVEUoa2VhbnVsZWUpOiBUaG91Z2ggOmhvc3QtY29udGV4dCBpcyBub3QgdW5pdmVyc2FsbHkgc3VwcG9ydGVkLCBzb21lIHBhZ2VzCiAgICAgICAqIHN0aWxsIHJlbHkgb24gcGFwZXItc2xpZGVyIGJlaW5nIGZsaXBwZWQgd2hlbiBkaXI9InJ0bCIgaXMgc2V0IG9uIGJvZHkuIEZvciBmdWxsCiAgICAgICAqIGNvbXBhdGFiaWxpdHksIGRpcj0icnRsIiBtdXN0IGJlIGV4cGxpY2l0bHkgc2V0IG9uIHBhcGVyLXNsaWRlci4KICAgICAgICovCiAgICAgIDpkaXIocnRsKSAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOT1RFKGtlYW51bGVlKTogVGhpcyBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBydWxlIGFib3ZlIGJlY2F1c2UgOmhvc3QtY29udGV4dCBtYXkKICAgICAgICogbm90IGJlIHJlY29nbml6ZWQuCiAgICAgICAqLwogICAgICA6aG9zdChbZGlyPSJydGwiXSkgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTk9URShrZWFudWxlZSk6IE5lZWRlZCB0byBvdmVycmlkZSB0aGUgOmhvc3QtY29udGV4dCBydWxlICh3aGVyZSBzdXBwb3J0ZWQpCiAgICAgICAqIHRvIHN1cHBvcnQgTFRSIHNsaWRlcnMgaW4gUlRMIHBhZ2VzLgogICAgICAgKi8KICAgICAgOmhvc3QoW2Rpcj0ibHRyIl0pICNzbGlkZXJDb250YWluZXIgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSk7CiAgICAgIH0KCiAgICAgICNzbGlkZXJDb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGNhbGMoMzBweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkpOwogICAgICAgIG1hcmdpbi1sZWZ0OiBjYWxjKDE1cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgICAgIG1hcmdpbi1yaWdodDogY2FsYygxNXB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgfQoKICAgICAgI3NsaWRlckNvbnRhaW5lcjpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogMDsKICAgICAgfQoKICAgICAgI3NsaWRlckNvbnRhaW5lci5lZGl0YWJsZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTJweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgICB9CgogICAgICAuYmFyLWNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAucmluZyA+IC5iYXItY29udGFpbmVyIHsKICAgICAgICBsZWZ0OiBjYWxjKDVweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE4cyBlYXNlOwogICAgICB9CgogICAgICAucmluZy5leHBhbmQuZHJhZ2dpbmcgPiAuYmFyLWNvbnRhaW5lciB7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgLnJpbmcuZXhwYW5kOm5vdCgucGluKSA+IC5iYXItY29udGFpbmVyIHsKICAgICAgICBsZWZ0OiBjYWxjKDhweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgIH0KCiAgICAgICNzbGlkZXJCYXIgewogICAgICAgIHBhZGRpbmc6IDE1cHggMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItYmFyLWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXItY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1jb250YWluZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXItbWFya2VycyB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogY2FsYygxNHB4ICsgdmFyKC0tcGFwZXItc2xpZGVyLWhlaWdodCwycHgpLzIpOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KTsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAtMXB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgIH0KCiAgICAgIC5zbGlkZXItbWFya2VyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgfQogICAgICAuc2xpZGVyLW1hcmtlcnM6OmFmdGVyLAogICAgICAuc2xpZGVyLW1hcmtlcjo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4OwogICAgICAgIHdpZHRoOiAycHg7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvciwgIzAwMCk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIG1hcmdpbi1sZWZ0OiBjYWxjKC0xNXB4IC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgICB3aWR0aDogY2FsYygzMHB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KSk7CiAgICAgICAgaGVpZ2h0OiBjYWxjKDMwcHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpKTsKICAgICAgfQoKICAgICAgLnRyYW5zaXRpbmcgPiAuc2xpZGVyLWtub2IgewogICAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4wOHMgZWFzZTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iOmZvY3VzIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICAuc2xpZGVyLWtub2IuZHJhZ2dpbmcgewogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIC5zbmFwcyA+IC5zbGlkZXIta25vYi5kcmFnZ2luZyB7CiAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4wOHMgZWFzZTsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4wOHMgZWFzZTsKICAgICAgfQoKICAgICAgLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBtYXJnaW46IDEwcHg7CiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSAtIDIwcHgpOwogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gMjBweCk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CgogICAgICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwoKICAgICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybSwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyOwogICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMThzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgICB9CgogICAgICAuZXhwYW5kOm5vdCgucGluKSA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuNSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjUpOwogICAgICB9CgogICAgICAucmluZyA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItcGluLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgfQoKICAgICAgLnBpbiA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICBtYXJnaW4tbGVmdDogLTEzcHg7CiAgICAgICAgd2lkdGg6IDI2cHg7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJSA1MCUgNTAlIDA7CgogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgIH0KCiAgICAgIC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlLAogICAgICAuc2xpZGVyLWtub2ItaW5uZXI6OmFmdGVyIHsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAuMThzIGVhc2UsIGJhY2tncm91bmQtY29sb3IgLjE4cyBlYXNlOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAuMThzIGVhc2UsIGJhY2tncm91bmQtY29sb3IgLjE4cyBlYXNlOwogICAgICB9CgogICAgICAucGluLnJpbmcgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgfQoKICAgICAgLnBpbi5leHBhbmQgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpIHNjYWxlKDEpIHRyYW5zbGF0ZSgxN3B4LCAtMTdweCk7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgxKSB0cmFuc2xhdGUoMTdweCwgLTE3cHgpOwogICAgICB9CgogICAgICAucGluID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjphZnRlciB7CiAgICAgICAgY29udGVudDogYXR0cih2YWx1ZSk7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xNnB4OwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1mb250LWNvbG9yLCAjZmZmKTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CgogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgIH0KCiAgICAgIC5waW4uZXhwYW5kID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjphZnRlciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpIHRyYW5zbGF0ZSgwLCAtMTdweCk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGUoMCwgLTE3cHgpOwogICAgICB9CgogICAgICAvKiBwYXBlci1pbnB1dCAqLwogICAgICAuc2xpZGVyLWlucHV0IHsKICAgICAgICB3aWR0aDogNTBweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgICBAYXBwbHkgLS1wYXBlci1zbGlkZXItaW5wdXQtY29udGFpbmVyLWlucHV0OwogICAgICAgIH07CiAgICAgICAgQGFwcGx5IC0tcGFwZXItc2xpZGVyLWlucHV0OwogICAgICB9CgogICAgICAvKiBkaXNhYmxlZCBzdGF0ZSAqLwogICAgICAjc2xpZGVyQ29udGFpbmVyLmRpc2FibGVkIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmRpc2FibGVkID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQta25vYi1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQta25vYi1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLjc1LCAwLjc1LCAxKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlM2QoMC43NSwgMC43NSwgMSk7CiAgICAgIH0KCiAgICAgIC5kaXNhYmxlZC5yaW5nID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgfQoKICAgICAgcGFwZXItcmlwcGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InNsaWRlckNvbnRhaW5lciIgY2xhc3MkPSJbW19nZXRDbGFzc05hbWVzKGRpc2FibGVkLCBwaW4sIHNuYXBzLCBpbW1lZGlhdGVWYWx1ZSwgbWluLCBleHBhbmQsIGRyYWdnaW5nLCB0cmFuc2l0aW5nLCBlZGl0YWJsZSldXSI+CiAgICAgIDxkaXYgY2xhc3M9ImJhci1jb250YWluZXIiPgogICAgICAgIDxwYXBlci1wcm9ncmVzcyBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaWQ9InNsaWRlckJhciIgYXJpYS1oaWRkZW49InRydWUiIG1pbj0iW1ttaW5dXSIgbWF4PSJbW21heF1dIiBzdGVwPSJbW3N0ZXBdXSIgdmFsdWU9IltbaW1tZWRpYXRlVmFsdWVdXSIgc2Vjb25kYXJ5LXByb2dyZXNzPSJbW3NlY29uZGFyeVByb2dyZXNzXV0iIG9uLWRvd249Il9iYXJkb3duIiBvbi11cD0iX3Jlc2V0S25vYiIgb24tdHJhY2s9Il9iYXJ0cmFjayIgb24tdGFwPSJfYmFyY2xpY2siPgogICAgICAgIDwvcGFwZXItcHJvZ3Jlc3M+CiAgICAgIDwvZGl2PgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3NuYXBzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1tYXJrZXJzIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbWFya2Vyc11dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLW1hcmtlciI+PC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPGRpdiBpZD0ic2xpZGVyS25vYiIgY2xhc3M9InNsaWRlci1rbm9iIiBvbi1kb3duPSJfa25vYmRvd24iIG9uLXVwPSJfcmVzZXRLbm9iIiBvbi10cmFjaz0iX29uVHJhY2siIG9uLXRyYW5zaXRpb25lbmQ9Il9rbm9iVHJhbnNpdGlvbkVuZCI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXIta25vYi1pbm5lciIgdmFsdWUkPSJbW2ltbWVkaWF0ZVZhbHVlXV0iPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlZGl0YWJsZV1dIj4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJpbnB1dCIgdHlwZT0ibnVtYmVyIiBzdGVwPSJbW3N0ZXBdXSIgbWluPSJbW21pbl1dIiBtYXg9IltbbWF4XV0iIGNsYXNzPSJzbGlkZXItaW5wdXQiIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiB2YWx1ZT0iW1tpbW1lZGlhdGVWYWx1ZV1dIiBvbi1jaGFuZ2U9Il9jaGFuZ2VWYWx1ZSIgb24ta2V5ZG93bj0iX2lucHV0S2V5RG93biIgbm8tbGFiZWwtZmxvYXQ+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8L3RlbXBsYXRlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNtb290aGluZy1pbnB1dCI+CiAgPHRlbXBsYXRlPgogICAgPGgzIGNsYXNzPSJ0aXRsZSI+U21vb3RoaW5nPC9oMz4KICAgIDxkaXYgY2xhc3M9InNtb290aGluZy1ibG9jayI+CiAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InNsaWRlciIgaW1tZWRpYXRlLXZhbHVlPSJ7e19pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcn19IiBtYXg9IltbbWF4XV0iIG1pbj0iW1ttaW5dXSIgcGluIHN0ZXA9Iltbc3RlcF1dIiB0eXBlPSJudW1iZXIiIHZhbHVlPSJ7e3dlaWdodH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJpbnB1dCIgbGFiZWw9IndlaWdodCIgbm8tbGFiZWwtZmxvYXQgdmFsdWU9Int7X2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dH19IiB0eXBlPSJudW1iZXIiIHN0ZXA9Iltbc3RlcF1dIiBtaW49IltbbWluXV0iIG1heD0iW1ttYXhdXSI+PC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAudGl0bGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQoKICAgICAgLnNtb290aGluZy1ibG9jayB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgZmxleC1ncm93OiAyOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNjYWxhci1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGlkPSJzaG93LWRvd25sb2FkLWxpbmtzIiBjaGVja2VkPSJ7e19zaG93RG93bmxvYWRMaW5rc319Ij5TaG93IGRhdGEgZG93bmxvYWQgbGlua3M8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggaWQ9Imlnbm9yZS15LW91dGxpZXIiIGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319Ij5JZ25vcmUgb3V0bGllcnMgaW4gY2hhcnQgc2NhbGluZzwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgIDxkaXY+VG9vbHRpcCBzb3J0aW5nIG1ldGhvZDo8L2Rpdj4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfdG9vbHRpcFNvcnRpbmdNZXRob2R9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+YXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0IHdlaWdodD0ie3tfc21vb3RoaW5nV2VpZ2h0fX0iIHN0ZXA9IjAuMDAxIiBtaW49IjAiIG1heD0iMC45OTkiPjwvdGYtc21vb3RoaW5nLWlucHV0PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ4LXR5cGUtc2VsZWN0b3IiIG5hbWU9Ikhvcml6b250YWwgQXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHNjYWxhciBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBzY2FsYXIgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIiBnZXQtY2F0ZWdvcnktaXRlbS1rZXk9IltbX2dldENhdGVnb3J5SXRlbUtleV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtc2NhbGFyLWNhcmQgYWN0aXZlPSJbW2FjdGl2ZV1dIiBkYXRhLXRvLWxvYWQ9IltbaXRlbS5zZXJpZXNdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBtdWx0aS1leHBlcmltZW50cz0iW1tfZ2V0TXVsdGlFeHBlcmltZW50cyhkYXRhU2VsZWN0aW9uKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIHNob3ctZG93bmxvYWQtbGlua3M9IltbX3Nob3dEb3dubG9hZExpbmtzXV0iIHNtb290aGluZy1lbmFibGVkPSJbW19zbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9IltbX3Ntb290aGluZ1dlaWdodF1dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKGNhdGVnb3J5LCBfcnVuVG9UYWdJbmZvLCBpdGVtKV1dIiB0YWc9IltbaXRlbS50YWddXSIgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1tfdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgeC10eXBlPSJbW194VHlwZV1dIj48L3RmLXNjYWxhci1jYXJkPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgICN0b29sdGlwLXNvcnRpbmcgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKICAgICAgfQogICAgICAjdG9vbHRpcC1zb3J0aW5nIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICB3aWR0aDogMTA1cHg7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICAuY2VudGVyIHsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY3VzdG9tLXNjYWxhci1jYXJkLXN0eWxlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXJnaW46IDVweCAxMHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRleHQtdG9wOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICB9CgogICAgICBoMSB7CiAgICAgICAgZm9udC1zaXplOiAxOXB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2J1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgYSB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgZGlzcGxheS1uYW1lPSJbW190aXRsZURpc3BsYXlTdHJpbmddXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8ZGl2IGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciI+CiAgICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIGlkPSJsb2FkZXIiIGFjdGl2ZT0iW1thY3RpdmVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS1zZXJpZXM9IltbX3Nlcmllc05hbWVzXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGZpbGwtYXJlYT0iW1tfZmlsbEFyZWFdXSIgaWdub3JlLXktb3V0bGllcnM9IltbaWdub3JlWU91dGxpZXJzXV0iIGxvYWQta2V5PSJbW190YWdGaWx0ZXJdXSIgZGF0YS10by1sb2FkPSJbW3J1bnNdXSIgbG9nLXNjYWxlLWFjdGl2ZT0iW1tfbG9nU2NhbGVBY3RpdmVdXSIgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKG1hcmdpbkNoYXJ0U2VyaWVzKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIgc3ltYm9sLWZ1bmN0aW9uPSJbW19jcmVhdGVTeW1ib2xGdW5jdGlvbigpXV0iIHRvb2x0aXAtY29sdW1ucz0iW1tfdG9vbHRpcENvbHVtbnNdXSIgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIiB4LXR5cGU9IltbeFR5cGVdXSI+CiAgICAgIDwvdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlcj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iYnV0dG9ucyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iIGljb249ImZ1bGxzY3JlZW4iIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19sb2dTY2FsZUFjdGl2ZV1dIiBpY29uPSJsaW5lLXdlaWdodCIgb24tdGFwPSJfdG9nZ2xlTG9nU2NhbGUiIHRpdGxlPSJUb2dnbGUgeS1heGlzIGxvZyBzY2FsZSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzLW92ZXJzY2FuIiBvbi10YXA9Il9yZXNldERvbWFpbiIgdGl0bGU9IkZpdCBkb21haW4gdG8gZGF0YSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHNwYW4gc3R5bGU9ImZsZXgtZ3JvdzogMSI+PC9zcGFuPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZG93bmxvYWQtbGlua3MiPgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQ9InRydWUiIGxhYmVsPSJzZXJpZXMgdG8gZG93bmxvYWQiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZH19Ij4KICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iIGFzPSJkYXRhU2VyaWVzTmFtZSI+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+W1tkYXRhU2VyaWVzTmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDxhIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5jc3YiIGhyZWY9IltbX2NzdlVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSI+Q1NWPC9hPgogICAgICAgICAgPGEgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmpzb24iIGhyZWY9IltbX2pzb25VcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iPkpTT048L2E+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbWlzc2luZ1RhZ3MubGVuZ3RoXV0iPgogICAgICA8ZGl2IGNsYXNzPSJjb2xsYXBzaWJsZS1saXN0LXRpdGxlIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iW1tfZ2V0VG9nZ2xlQ29sbGFwc2libGVJY29uKF9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkKV1dIiBvbi1jbGljaz0iX3RvZ2dsZU1pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuIiBjbGFzcz0idG9nZ2xlLWNvbGxhcHNpYmxlLWJ1dHRvbiI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8c3BhbiBjbGFzcz0iY29sbGFwc2libGUtdGl0bGUtdGV4dCI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4gTWlzc2luZyBUYWdzCiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImVycm9yLWNvbnRlbnQiPgogICAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfbWlzc2luZ1RhZ3NdXSIgYXM9Im1pc3NpbmdFbnRyeSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1pc3NpbmctdGFncy1mb3ItcnVuLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgUnVuICJbW21pc3NpbmdFbnRyeS5ydW5dXSIgbGFja3MgZGF0YSBmb3IgdGFncwogICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbbWlzc2luZ0VudHJ5LnRhZ3NdXSIgYXM9InRhZyI+CiAgICAgICAgICAgICAgICAgIDxsaT5bW3RhZ11dPC9saT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC91bD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tY29sbGFwc2U+CiAgICA8L3RlbXBsYXRlPgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdGFnRmlsdGVySW52YWxpZF1dIj4KICAgICAgPGRpdiBjbGFzcz0iZXJyb3ItY29udGVudCI+CiAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgIFRoaXMgcmVndWxhciBleHByZXNpb24gaXMgaW52YWxpZDo8YnI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImludmFsaWQtcmVnZXgiPltbX3RhZ0ZpbHRlcl1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zdGVwc01pc21hdGNoXV0iPgogICAgICA8ZGl2IGNsYXNzPSJlcnJvci1jb250ZW50Ij4KICAgICAgICA8aXJvbi1pY29uIGNsYXNzPSJlcnJvci1pY29uIiBpY29uPSJpY29uczplcnJvciI+PC9pcm9uLWljb24+CiAgICAgICAgVGhlIHN0ZXBzIGZvciB2YWx1ZSwgbG93ZXIsIGFuZCB1cHBlciB0YWdzIGRvIG5vdCBtYXRjaDoKICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWctbmFtZSI+W1tfc3RlcHNNaXNtYXRjaC5zZXJpZXNPYmplY3QudmFsdWVdXTwvc3Bhbj46CiAgICAgICAgICAgIFtbX3NlcGFyYXRlV2l0aENvbW1hcyhfc3RlcHNNaXNtYXRjaC52YWx1ZVN0ZXBzKV1dCiAgICAgICAgICA8L2xpPgogICAgICAgICAgPGxpPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idGFnLW5hbWUiPltbX3N0ZXBzTWlzbWF0Y2guc2VyaWVzT2JqZWN0Lmxvd2VyXV08L3NwYW4+OgogICAgICAgICAgICBbW19zZXBhcmF0ZVdpdGhDb21tYXMoX3N0ZXBzTWlzbWF0Y2gubG93ZXJTdGVwcyldXQogICAgICAgICAgPC9saT4KICAgICAgICAgIDxsaT4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhZy1uYW1lIj5bW19zdGVwc01pc21hdGNoLnNlcmllc09iamVjdC51cHBlcl1dPC9zcGFuPjoKICAgICAgICAgICAgW1tfc2VwYXJhdGVXaXRoQ29tbWFzKF9zdGVwc01pc21hdGNoLnVwcGVyU3RlcHMpXV0KICAgICAgICAgIDwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDxkaXYgaWQ9Im1hdGNoZXMtY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0iY29sbGFwc2libGUtbGlzdC10aXRsZSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iW1tfZ2V0VG9nZ2xlQ29sbGFwc2libGVJY29uKF9tYXRjaGVzTGlzdE9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVNYXRjaGVzT3BlbiIgY2xhc3M9InRvZ2dsZS1tYXRjaGVzLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsYXBzaWJsZS10aXRsZS10ZXh0Ij4KICAgICAgICAgIE1hdGNoZXMgKFtbX3Nlcmllc05hbWVzLmxlbmd0aF1dKQogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbWF0Y2hlc0xpc3RPcGVuZWRdXSI+CiAgICAgICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIiBhcz0ic2VyaWVzTmFtZSIgaWQ9Im1hdGNoLWxpc3QtcmVwZWF0IiBvbi1kb20tY2hhbmdlPSJfbWF0Y2hMaXN0RW50cnlDb2xvclVwZGF0ZWQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1hdGNoLWxpc3QtZW50cnkiPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9Im1hdGNoLWVudHJ5LXN5bWJvbCI+CiAgICAgICAgICAgICAgICAgIFtbX2RldGVybWluZVN5bWJvbChfbmFtZVRvRGF0YVNlcmllcywgc2VyaWVzTmFtZSldXQogICAgICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgICAgICAgW1tzZXJpZXNOYW1lXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jdXN0b20tc2NhbGFyLWNhcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5lcnJvci1jb250ZW50IHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZjAwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDVweDsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBtYXJnaW46IDEwcHggMCAwIDA7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgfQoKICAgICAgLmVycm9yLWljb24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZpbGw6ICNmZmY7CiAgICAgICAgbWFyZ2luOiAwIGF1dG8gNXB4IGF1dG87CiAgICAgIH0KCiAgICAgIC5pbnZhbGlkLXJlZ2V4IHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQoKICAgICAgLmVycm9yLWNvbnRlbnQgdWwgewogICAgICAgIG1hcmdpbjogMXB4IDAgMCAwOwogICAgICAgIHBhZGRpbmc6IDAgMCAwIDE5cHg7CiAgICAgIH0KCiAgICAgIC50YWctbmFtZSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5jb2xsYXBzaWJsZS1saXN0LXRpdGxlIHsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHggMDsKICAgICAgfQoKICAgICAgLmNvbGxhcHNpYmxlLXRpdGxlLXRleHQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgICNtYXRjaGVzLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5tYXRjaC1saXN0LWVudHJ5IHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQoKICAgICAgLm1hdGNoLWVudHJ5LXN5bWJvbCB7CiAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLm1pc3NpbmctdGFncy1mb3ItcnVuLWNvbnRhaW5lciB7CiAgICAgICAgbWFyZ2luOiA4cHggMCAwIDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgZGlzcGxheS1uYW1lPSJbW190aXRsZURpc3BsYXlTdHJpbmddXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8ZGl2IGlkPSJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciI+CiAgICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIGlkPSJsb2FkZXIiIGFjdGl2ZT0iW1thY3RpdmVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS1zZXJpZXM9IltbX3Nlcmllc05hbWVzXV0iIGdldC1kYXRhLWxvYWQtdXJsPSJbW19kYXRhVXJsXV0iIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIiBsb2FkLWtleT0iW1tfdGFnRmlsdGVyXV0iIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tyZXF1ZXN0TWFuYWdlcl1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iIHNtb290aGluZy13ZWlnaHQ9Iltbc21vb3RoaW5nV2VpZ2h0XV0iIHN5bWJvbC1mdW5jdGlvbj0iW1tfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKV1dIiB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iIHgtdHlwZT0iW1t4VHlwZV1dIj4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIgaWNvbj0iZnVsbHNjcmVlbiIgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iIGljb249ImxpbmUtd2VpZ2h0IiBvbi10YXA9Il90b2dnbGVMb2dTY2FsZSIgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iIG9uLXRhcD0iX3Jlc2V0RG9tYWluIiB0aXRsZT0iRml0IGRvbWFpbiB0byBkYXRhIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8c3BhbiBzdHlsZT0iZmxleC1ncm93OiAxIj48L3NwYW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkb3dubG9hZC1saW5rcyI+CiAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9InNlcmllcyB0byBkb3dubG9hZCIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkfX0iPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIgYXM9ImRhdGFTZXJpZXNOYW1lIj4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2RhdGFTZXJpZXNOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgPGEgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmNzdiIgaHJlZj0iW1tfY3N2VXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkKV1dIj5DU1Y8L2E+CiAgICAgICAgICA8YSBkb3dubG9hZD0iW1tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkXV0uanNvbiIgaHJlZj0iW1tfanNvblVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSI+SlNPTjwvYT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0ibWF0Y2hlcy1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QtdGl0bGUiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249IltbX2dldFRvZ2dsZU1hdGNoZXNJY29uKF9tYXRjaGVzTGlzdE9wZW5lZCldXSIgb24tY2xpY2s9Il90b2dnbGVNYXRjaGVzT3BlbiIgY2xhc3M9InRvZ2dsZS1tYXRjaGVzLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaGVzLXRleHQiPgogICAgICAgICAgTWF0Y2hlcyAoW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0pCiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19tYXRjaGVzTGlzdE9wZW5lZF1dIj4KICAgICAgICAgIDxkaXYgaWQ9Im1hdGNoZXMtbGlzdCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iIGFzPSJzZXJpZXNOYW1lIiBpZD0ibWF0Y2gtbGlzdC1yZXBlYXQiIG9uLWRvbS1jaGFuZ2U9Il9tYXRjaExpc3RFbnRyeUNvbG9yVXBkYXRlZCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWF0Y2gtbGlzdC1lbnRyeSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWF0Y2gtZW50cnktc3ltYm9sIj4KICAgICAgICAgICAgICAgICAgW1tfZGV0ZXJtaW5lU3ltYm9sKF9uYW1lVG9EYXRhU2VyaWVzLCBzZXJpZXNOYW1lKV1dCiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICBbW3Nlcmllc05hbWVdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWN1c3RvbS1zY2FsYXItY2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgI21hdGNoZXMtbGlzdC10aXRsZSB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgNXB4IDA7CiAgICAgIH0KCiAgICAgICNtYXRjaGVzLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5tYXRjaC1saXN0LWVudHJ5IHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQoKICAgICAgLm1hdGNoLWVudHJ5LXN5bWJvbCB7CiAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLm1hdGNoZXMtdGV4dCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfc2hvd0Rvd25sb2FkTGlua3N9fSI+U2hvdyBkYXRhIGRvd25sb2FkIGxpbmtzPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X2lnbm9yZVlPdXRsaWVyc319Ij5JZ25vcmUgb3V0bGllcnMgaW4gY2hhcnQgc2NhbGluZzwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZyI+CiAgICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZy1sYWJlbCI+VG9vbHRpcCBzb3J0aW5nIG1ldGhvZDo8L2Rpdj4KICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbm8tbGFiZWwtZmxvYXQgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfdG9vbHRpcFNvcnRpbmdNZXRob2R9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmRlZmF1bHQ8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+YXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bmVhcmVzdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtc21vb3RoaW5nLWlucHV0IHdlaWdodD0ie3tfc21vb3RoaW5nV2VpZ2h0fX0iIHN0ZXA9IjAuMDAxIiBtaW49IjAiIG1heD0iMSI+PC90Zi1zbW9vdGhpbmctaW5wdXQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9IngtdHlwZS1zZWxlY3RvciIgbmFtZT0iSG9yaXpvbnRhbCBBeGlzIiBzZWxlY3RlZC1pZD0ie3tfeFR5cGV9fSI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbj48cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj48cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciIgaWQ9ImNhdGVnb3JpZXMtY29udGFpbmVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5UaGUgY3VzdG9tIHNjYWxhcnMgZGFzaGJvYXJkIGlzIGluYWN0aXZlLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPG9sPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW4ndCBsYWlkIG91dCB0aGUgZGFzaGJvYXJkLjwvbGk+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgc2NhbGFyIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L29sPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgVG8gbGF5IG91dCB0aGUgZGFzaGJvYXJkLCBwYXNzIGEgPGNvZGU+TGF5b3V0PC9jb2RlPiBwcm90b2J1ZmZlcgogICAgICAgICAgICAgIHRvIHRoZSA8Y29kZT5zZXRfbGF5b3V0PC9jb2RlPiBtZXRob2QuIEZvciBleGFtcGxlLAogICAgICAgICAgICAKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkIGltcG9ydCBzdW1tYXJ5CmZyb20gdGVuc29yYm9hcmQucGx1Z2lucy5jdXN0b21fc2NhbGFyIGltcG9ydCBsYXlvdXRfcGIyCi4uLgojIFRoaXMgYWN0aW9uIGRvZXMgbm90IGhhdmUgdG8gYmUgcGVyZm9ybWVkIGF0IGV2ZXJ5IHN0ZXAsIHNvIHRoZSBhY3Rpb24gaXMgbm90CiMgdGFrZW4gY2FyZSBvZiBieSBhbiBvcCBpbiB0aGUgZ3JhcGguIFdlIG9ubHkgbmVlZCB0byBzcGVjaWZ5IHRoZSBsYXlvdXQgb25jZQojIChpbnN0ZWFkIG9mIHBlciBzdGVwKS4KbGF5b3V0X3N1bW1hcnkgPSBzdW1tYXJ5X2xpYi5jdXN0b21fc2NhbGFyX3BiKGxheW91dF9wYjIuTGF5b3V0KAogIGNhdGVnb3J5PVsKICAgIGxheW91dF9wYjIuQ2F0ZWdvcnkoCiAgICAgIHRpdGxlPSdsb3NzZXMnLAogICAgICBjaGFydD1bCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSdsb3NzZXMnLAogICAgICAgICAgICAgIG11bHRpbGluZT1sYXlvdXRfcGIyLk11bHRpbGluZUNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHRhZz1bcidsb3NzLionXSwKICAgICAgICAgICAgICApKSwKICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J2JheicsCiAgICAgICAgICAgICAgbWFyZ2luPWxheW91dF9wYjIuTWFyZ2luQ2hhcnRDb250ZW50KAogICAgICAgICAgICAgICAgc2VyaWVzPVsKICAgICAgICAgICAgICAgICAgbGF5b3V0X3BiMi5NYXJnaW5DaGFydENvbnRlbnQuU2VyaWVzKAogICAgICAgICAgICAgICAgICAgIHZhbHVlPSdsb3NzL2Jhei9zY2FsYXJfc3VtbWFyeScsCiAgICAgICAgICAgICAgICAgICAgbG93ZXI9J2Jhel9sb3dlci9iYXovc2NhbGFyX3N1bW1hcnknLAogICAgICAgICAgICAgICAgICAgIHVwcGVyPSdiYXpfdXBwZXIvYmF6L3NjYWxhcl9zdW1tYXJ5JyksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICkpLAogICAgICBdKSwKICAgIGxheW91dF9wYjIuQ2F0ZWdvcnkoCiAgICAgIHRpdGxlPSd0cmlnIGZ1bmN0aW9ucycsCiAgICAgIGNoYXJ0PVsKICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J3dhdmUgdHJpZyBmdW5jdGlvbnMnLAogICAgICAgICAgICAgIG11bHRpbGluZT1sYXlvdXRfcGIyLk11bHRpbGluZUNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHRhZz1bcid0cmlnRnVuY3Rpb25zL2Nvc2luZScsIHIndHJpZ0Z1bmN0aW9ucy9zaW5lJ10sCiAgICAgICAgICAgICAgKSksCiAgICAgICAgICAjIFRoZSByYW5nZSBvZiB0YW5nZW50IGlzIGRpZmZlcmVudC4gTGV0J3MgZ2l2ZSBpdCBpdHMgb3duIGNoYXJ0LgogICAgICAgICAgbGF5b3V0X3BiMi5DaGFydCgKICAgICAgICAgICAgICB0aXRsZT0ndGFuJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3IndHJpZ0Z1bmN0aW9ucy90YW5nZW50J10sCiAgICAgICAgICAgICAgKSksCiAgICAgIF0sCiAgICAgICMgVGhpcyBjYXRlZ29yeSB3ZSBjYXJlIGxlc3MgYWJvdXQuIExldCdzIG1ha2UgaXQgaW5pdGlhbGx5IGNsb3NlZC4KICAgICAgY2xvc2VkPVRydWUpLAogIF0pKQp3cml0ZXIuYWRkX3N1bW1hcnkobGF5b3V0X3N1bW1hcnkpCjwvcHJlPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGFzPSJjaGFydCIgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgZGlzYWJsZS1wYWdpbmF0aW9uIGluaXRpYWwtb3BlbmVkPSJbW2NhdGVnb3J5Lm1ldGFkYXRhLm9wZW5lZF1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhcnQubXVsdGlsaW5lXV0iPgogICAgICAgICAgICAgICAgICAgIDx0Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZCBhY3RpdmU9IltbYWN0aXZlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgcnVucz0iW1tfc2VsZWN0ZWRSdW5zXV0iIHRpdGxlPSJbW2NoYXJ0LnRpdGxlXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIgc21vb3RoaW5nLXdlaWdodD0iW1tfc21vb3RoaW5nV2VpZ2h0XV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiB0YWctcmVnZXhlcz0iW1tjaGFydC5tdWx0aWxpbmUudGFnXV0iPjwvdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQ+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjaGFydC5tYXJnaW5dXSI+CiAgICAgICAgICAgICAgICAgICAgPHRmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQgYWN0aXZlPSJbW2FjdGl2ZV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIHJ1bnM9IltbX3NlbGVjdGVkUnVuc11dIiB0aXRsZT0iW1tjaGFydC50aXRsZV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIiBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIiBtYXJnaW4tY2hhcnQtc2VyaWVzPSJbW2NoYXJ0Lm1hcmdpbi5zZXJpZXNdXSI+PC90Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmcgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIHdpZHRoOiAxMDVweDsKICAgICAgfQogICAgICAubGluZS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgICB9CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWltYWdlLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVNhbXBsZXNdXSI+CiAgICAgICAgPGRpdj5zYW1wbGU6IFtbX3NhbXBsZVRleHRdXSBvZiBbW29mU2FtcGxlc11dPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHN0ZXAKICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj5bW190b0xvY2FsZVN0cmluZyhfc3RlcFZhbHVlKV1dPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIGhlYWRpbmctcmlnaHQgZGF0ZXRpbWUiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnRXYWxsVGltZV1dIj4KICAgICAgICAgICAgICBbW19jdXJyZW50V2FsbFRpbWVdXQogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCByaWdodCI+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIV9pc0ltYWdlTG9hZGluZ11dIj4KICAgICAgICAgICAgPC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJzdGVwcyIgaW1tZWRpYXRlLXZhbHVlPSJ7e19zdGVwSW5kZXh9fSIgbWF4PSJbW19tYXhTdGVwSW5kZXhdXSIgbWF4LW1hcmtlcnM9IltbX21heFN0ZXBJbmRleF1dIiBzbmFwcyBzdGVwPSIxIiB2YWx1ZT0ie3tfc3RlcEluZGV4fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC90Zi1jYXJkLWhlYWRpbmc+CgogICAgCiAgICA8YSBpZD0ibWFpbi1pbWFnZS1jb250YWluZXIiIHJvbGU9ImJ1dHRvbiIgYXJpYS1sYWJlbD0iVG9nZ2xlIGFjdHVhbCBzaXplIiBhcmlhLWV4cGFuZGVkJD0iW1tfZ2V0QXJpYUV4cGFuZGVkKGFjdHVhbFNpemUpXV0iIG9uLXRhcD0iX2hhbmRsZVRhcCI+PC9hPgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jYXJkLWhlYWRpbmctc3R5bGUiPgogICAgICAvKiogTWFrZSBidXR0b24gYSBkaXYuICovCiAgICAgIGJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLyoqIEZpcmVmb3g6IEdldCByaWQgb2YgZG90dGVkIGxpbmUgaW5zaWRlIGJ1dHRvbi4gKi8KICAgICAgYnV0dG9uOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLyoqIEZpcmVmb3g6IFNpbXVsYXRlIENocm9tZSdzIG91dGVyIGdsb3cgb24gYnV0dG9uIHdoZW4gZm9jdXNlZC4gKi8KICAgICAgYnV0dG9uOi1tb3otZm9jdXNyaW5nIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJveC1zaGFkb3c6IDBweCAwcHggMXB4IDJweCBIaWdobGlnaHQ7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtYXJnaW46IDAgMTVweCA0MHB4IDA7CiAgICAgICAgb3ZlcmZsb3cteDogYXV0bzsKICAgICAgfQoKICAgICAgLyoqIFdoZW4gYWN0dWFsIHNpemUgc2hvd24gaXMgb24sIHVzZSB0aGUgYWN0dWFsIGltYWdlIHdpZHRoLiAqLwogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSB7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSAjbWFpbi1pbWFnZS1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IG5vbmU7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFthY3R1YWwtc2l6ZV0pICNtYWluLWltYWdlLWNvbnRhaW5lciBpbWcgewogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1zcGlubmVyLWxpdGUgewogICAgICAgIHdpZHRoOiAxNHB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdGV4dC1ib3R0b207CiAgICAgICAgLS1wYXBlci1zcGlubmVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQoKICAgICAgI3N0ZXBzIHsKICAgICAgICBoZWlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAtMTVweDsKICAgICAgICAvKgogICAgICAgICAqIDMxIGNvbWVzIGZyb20gYWRkaW5nIGEgcGFkZGluZyBvZiAxNXB4IGZyb20gYm90aCBzaWRlcyBvZiB0aGUKICAgICAgICAgKiBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nIDFweCBzbyB0aGF0IHRoZSBzbGlkZXIgd2lkdGggYWxpZ25zCiAgICAgICAgICogd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwgYW5kCiAgICAgICAgICogYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZgogICAgICAgICAqIHRoZSBpbWFnZS4gMzAgLSAxICsgMi4KICAgICAgICAgKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICB9CgogICAgICAjbWFpbi1pbWFnZS1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDEwMjRweDsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI21haW4taW1hZ2UtY29udGFpbmVyIGltZyB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGltYWdlLXJlbmRlcmluZzogLW1vei1jcmlzcC1lZGdlczsKICAgICAgICBpbWFnZS1yZW5kZXJpbmc6IHBpeGVsYXRlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgIH0KCiAgICAgIHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWltYWdlLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfYWN0dWFsU2l6ZX19Ij5TaG93IGFjdHVhbCBpbWFnZSBzaXplPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8aDMgY2xhc3M9InRvb2x0aXAtY29udGFpbmVyIj5CcmlnaHRuZXNzIGFkanVzdG1lbnQ8L2gzPgogICAgICAgICAgPGRpdiBjbGFzcz0icmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLXNsaWRlciBtaW49IjAiIG1heD0iMiIgc25hcHMgcGluIHN0ZXA9IjAuMDEiIHZhbHVlPSJ7e19icmlnaHRuZXNzQWRqdXN0bWVudH19IiBpbW1lZGlhdGUtdmFsdWU9Int7X2JyaWdodG5lc3NBZGp1c3RtZW50fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJ4LWJ1dHRvbiIgb24tdGFwPSJfcmVzZXRCcmlnaHRuZXNzIiBkaXNhYmxlZD0iW1tfYnJpZ2h0bmVzc0lzRGVmYXVsdF1dIj5SZXNldDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxoMyBjbGFzcz0idG9vbHRpcC1jb250YWluZXIiPkNvbnRyYXN0IGFkanVzdG1lbnQ8L2gzPgogICAgICAgICAgPGRpdiBjbGFzcz0icmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIj4KICAgICAgICAgICAgPHBhcGVyLXNsaWRlciBtaW49IjAiIG1heD0iNTAwIiBzbmFwcyBwaW4gc3RlcD0iMSIgdmFsdWU9Int7X2NvbnRyYXN0UGVyY2VudGFnZX19IiBpbW1lZGlhdGUtdmFsdWU9Int7X2NvbnRyYXN0UGVyY2VudGFnZX19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIG9uLXRhcD0iX3Jlc2V0Q29udHJhc3QiIGRpc2FibGVkPSJbW19jb250cmFzdElzRGVmYXVsdF1dIj5SZXNldDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIGlkPSJydW5zLXNlbGVjdG9yIiBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+PC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGltYWdlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGltYWdlIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiPlJFQURNRTwvYT4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIj50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIiBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLWltYWdlLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgc2FtcGxlPSJbW2l0ZW0uc2FtcGxlXV0iIG9mLXNhbXBsZXM9IltbaXRlbS5vZlNhbXBsZXNdXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgYWN0dWFsLXNpemU9IltbX2FjdHVhbFNpemVdXSIgYnJpZ2h0bmVzcy1hZGp1c3RtZW50PSJbW19icmlnaHRuZXNzQWRqdXN0bWVudF1dIiBjb250cmFzdC1wZXJjZW50YWdlPSJbW19jb250cmFzdFBlcmNlbnRhZ2VdXSI+PC90Zi1pbWFnZS1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CiAgICAgIC5yZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIgcGFwZXItc2xpZGVyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciBwYXBlci1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHBhcGVyLWJ1dHRvbltkaXNhYmxlZF0gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHVuc2V0OwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWF1ZGlvLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyB0YWc9IltbdGFnXV0iIHJ1bj0iW1tydW5dXSIgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iIGNvbG9yPSJbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVNhbXBsZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHNhbXBsZTogW1tfc2FtcGxlVGV4dF1dIG9mIFtbdG90YWxTYW1wbGVzXV0KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0F0TGVhc3RPbmVTdGVwXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwIDxzdHJvbmc+W1tfY3VycmVudERhdHVtLnN0ZXBdXTwvc3Ryb25nPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnREYXR1bS53YWxsX3RpbWVdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCI+CiAgICAgICAgICAgICAgW1tfY3VycmVudERhdHVtLndhbGxfdGltZV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX21heFN0ZXBJbmRleF1dIiBtYXgtbWFya2Vycz0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e19zdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgIDxhdWRpbyBjb250cm9scyBzcmMkPSJbW19jdXJyZW50RGF0dW0udXJsXV0iIHR5cGUkPSJbW19jdXJyZW50RGF0dW0uY29udGVudFR5cGVdXSI+PC9hdWRpbz4KICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tfY3VycmVudERhdHVtLmxhYmVsXV0iPjwvdGYtbWFya2Rvd24tdmlldz4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtYWluLWF1ZGlvLWNvbnRhaW5lciI+PC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzUwcHg7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3I6ICM0MjQyNDI7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgICNzdGVwcyB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBwYWRkaW5nOiAwIDVweDsgLyogc28gdGhlIHNsaWRlciBrbm9iIGRvZXNuJ3QgYnV0dCBvdXQgKi8KICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWF1ZGlvLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBpZD0icnVucy1zZWxlY3RvciIgc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPjwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBhdWRpbyBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBhdWRpbyBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1hdWRpby1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBydW49IltbaXRlbS5ydW5dXSIgdGFnPSJbW2l0ZW0udGFnXV0iIHNhbXBsZT0iW1tpdGVtLnNhbXBsZV1dIiB0b3RhbC1zYW1wbGVzPSJbW2l0ZW0udG90YWxTYW1wbGVzXV0iIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoX3J1blRvVGFnSW5mbywgaXRlbS5ydW4sIGl0ZW0udGFnKV1dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iPjwvdGYtYXVkaW8tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tYXV0b2dyb3ctdGV4dGFyZWEiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkOwogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgICAtbW96LWFwcGVhcmFuY2U6IHRleHRhcmVhOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGFyZWE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLm1pcnJvci10ZXh0IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgcmVzaXplOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgLyogc2VlIGNvbW1lbnRzIGluIHRlbXBsYXRlICovCiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS1wbGFjZWhvbGRlcjsKICAgICAgfQoKICAgICAgdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIAogICAgCiAgICA8ZGl2IGlkPSJtaXJyb3IiIGNsYXNzPSJtaXJyb3ItdGV4dCIgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PgoKICAgIAogICAgPGRpdiBjbGFzcz0idGV4dGFyZWEtY29udGFpbmVyIGZpdCI+CiAgICAgIDx0ZXh0YXJlYSBpZD0idGV4dGFyZWEiIG5hbWUkPSJbW25hbWVdXSIgYXJpYS1sYWJlbCQ9IltbbGFiZWxdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSI+PC90ZXh0YXJlYT4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdGV4dGFyZWEiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgbGFiZWwgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dC1jb250YWluZXIgbm8tbGFiZWwtZmxvYXQkPSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPGxhYmVsIGhpZGRlbiQ9IltbIWxhYmVsXV0iIGFyaWEtaGlkZGVuPSJ0cnVlIiBmb3IkPSJbW19pbnB1dElkXV0iIHNsb3Q9ImxhYmVsIj5bW2xhYmVsXV08L2xhYmVsPgoKICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3M9InBhcGVyLWlucHV0LWlucHV0IiBzbG90PSJpbnB1dCIgaWQkPSJbW19pbnB1dElkXV0iIGFyaWEtbGFiZWxsZWRieSQ9IltbX2FyaWFMYWJlbGxlZEJ5XV0iIGFyaWEtZGVzY3JpYmVkYnkkPSJbW19hcmlhRGVzY3JpYmVkQnldXSIgYmluZC12YWx1ZT0ie3t2YWx1ZX19IiBpbnZhbGlkPSJ7e2ludmFsaWR9fSIgdmFsaWRhdG9yJD0iW1t2YWxpZGF0b3JdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIGF1dG9jb21wbGV0ZSQ9IltbYXV0b2NvbXBsZXRlXV0iIGF1dG9mb2N1cyQ9IltbYXV0b2ZvY3VzXV0iIGlucHV0bW9kZSQ9IltbaW5wdXRtb2RlXV0iIG5hbWUkPSJbW25hbWVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYXV0b2NhcGl0YWxpemUkPSJbW2F1dG9jYXBpdGFsaXplXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWF4LXJvd3MkPSJbW21heFJvd3NdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiPjwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdG9hc3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2FzdC1iYWNrZ3JvdW5kLWNvbG9yLCAjMzIzMjMyKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9hc3QtY29sb3IsICNmMWYxZjEpOwogICAgICAgIG1pbi1oZWlnaHQ6IDQ4cHg7CiAgICAgICAgbWluLXdpZHRoOiAyODhweDsKICAgICAgICBwYWRkaW5nOiAxNnB4IDI0cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3gtc2hhZG93OiAwIDJweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMjYpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBtYXJnaW46IDEycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuM3MsIG9wYWNpdHkgMC4zczsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4zcywgb3BhY2l0eSAwLjNzOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwcHgpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDBweCk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNhcHN1bGUpIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAyNHB4OwogICAgICB9CgogICAgICA6aG9zdCguZml0LWJvdHRvbSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgICBib3JkZXItcmFkaXVzOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQoKICAgICAgOmhvc3QoLnBhcGVyLXRvYXN0LW9wZW4pIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDBweCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNwYW4gaWQ9ImxhYmVsIj57e3RleHR9fTwvc3Bhbj4KICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10b2dnbGUtYnV0dG9uIj4KICA8dGVtcGxhdGUgc3RyaXAtd2hpdGVzcGFjZT4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgewogICAgICAgIG91dGxpbmU6bm9uZTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1iYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogOHB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDAuNDsKICAgICAgICB0cmFuc2l0aW9uOiBiYWNrZ3JvdW5kLWNvbG9yIGxpbmVhciAuMDhzOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhci1jb2xvciwgIzAwMDAwMCk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhcjsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IC0zcHg7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSBsaW5lYXIgLjA4cywgYmFja2dyb3VuZC1jb2xvciBsaW5lYXIgLjA4czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gbGluZWFyIC4wOHMsIGJhY2tncm91bmQtY29sb3IgbGluZWFyIC4wOHM7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1idXR0b24tY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNTApKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbi5kcmFnZ2luZyB7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiBub25lOwogICAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXTpub3QoW2Rpc2FibGVkXSkpIC50b2dnbGUtYmFyIHsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJhci1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKICAgICAgICBvcGFjaXR5OiAwLjEyOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKDE2cHgsIDApOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF06bm90KFtkaXNhYmxlZF0pKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJ1dHRvbi1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2JkYmRiZDsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAudG9nZ2xlLWluayB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogLTE0cHg7CiAgICAgICAgbGVmdDogLTE0cHg7CiAgICAgICAgcmlnaHQ6IGF1dG87CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAudG9nZ2xlLWluayB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWluazsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDM2cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIC8qIFRoZSB0b2dnbGUgYnV0dG9uIGhhcyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBvZiAtM3B4OyBUaGUgZXh0cmEgMXB4CiAgICAgICAgLyogYWNjb3VudHMgZm9yIHRoZSB0b2dnbGUgYnV0dG9uIHNoYWRvdyBib3guICovCiAgICAgICAgbWFyZ2luOiA0cHggMXB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWxhYmVsIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICAvKiBpbnZhbGlkIHN0YXRlICovCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1iYXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1iYXItY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1idXR0b24tY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgLnRvZ2dsZS1pbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWludmFsaWQtaW5rLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1jb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0b2dnbGVCYXIiIGNsYXNzPSJ0b2dnbGUtYmFyIj48L2Rpdj4KICAgICAgPGRpdiBpZD0idG9nZ2xlQnV0dG9uIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+PC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtbGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KCiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1taW5pbWFwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgbGluZWFyOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCguaGlkZGVuKSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgY2FudmFzIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OwogICAgICB9CgogICAgICByZWN0IHsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgICBzdHJva2U6ICMxMTExMTE7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwOwogICAgICAgIGZpbHRlcjogdXJsKCNtaW5pbWFwRHJvcFNoYWRvdyk7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzdmc+CiAgICAgIDxkZWZzPgogICAgICAgIDxmaWx0ZXIgaWQ9Im1pbmltYXBEcm9wU2hhZG93IiB4PSItMjAlIiB5PSItMjAlIiB3aWR0aD0iMTUwJSIgaGVpZ2h0PSIxNTAlIj4KICAgICAgICAgIDxmZW9mZnNldCByZXN1bHQ9Im9mZk91dCIgaW49IlNvdXJjZUdyYXBoaWMiIGR4PSIxIiBkeT0iMSI+PC9mZW9mZnNldD4KICAgICAgICAgIDxmZWNvbG9ybWF0cml4IHJlc3VsdD0ibWF0cml4T3V0IiBpbj0ib2ZmT3V0IiB0eXBlPSJtYXRyaXgiIHZhbHVlcz0iMC4xIDAgMCAwIDAgMCAwLjEgMCAwIDAgMCAwIDAuMSAwIDAgMCAwIDAgMC41IDAiPjwvZmVjb2xvcm1hdHJpeD4KICAgICAgICAgIDxmZWdhdXNzaWFuYmx1ciByZXN1bHQ9ImJsdXJPdXQiIGluPSJtYXRyaXhPdXQiIHN0ZGRldmlhdGlvbj0iMiI+PC9mZWdhdXNzaWFuYmx1cj4KICAgICAgICAgIDxmZWJsZW5kIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImJsdXJPdXQiIG1vZGU9Im5vcm1hbCI+PC9mZWJsZW5kPgogICAgICAgIDwvZmlsdGVyPgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0PjwvcmVjdD4KICAgIDwvc3ZnPgogICAgPGNhbnZhcyBjbGFzcz0iZmlyc3QiPjwvY2FudmFzPgogICAgCiAgICA8Y2FudmFzIGNsYXNzPSJzZWNvbmQiPjwvY2FudmFzPgogICAgPGNhbnZhcyBjbGFzcz0iZG93bmxvYWQiPjwvY2FudmFzPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLXNjZW5lIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzdmcgewogICAgICAgIGZsZXg6IDE7CiAgICAgICAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI2hpZGRlbiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHRvcDogMHB4OwogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLyogLS0tIE5vZGUgYW5kIGFubm90YXRpb24tbm9kZSBmb3IgTWV0YW5vZGUgLS0tICovCgogICAgICAubWV0YSA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YSA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogaHNsKDAsIDAlLCA3MCUpOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLmFubm90YXRpb24ubWV0YS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAuYW5ub3RhdGlvbi5tZXRhLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgfQogICAgICAubWV0YS5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubWV0YS5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICAgIHN0cm9rZTogcmVkOwogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbi5tZXRhLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CiAgICAgIC5ub2RlLm1ldGEuc2VsZWN0ZWQuZXhwYW5kZWQuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCwKICAgICAgLmZhZGVkIHJlY3QsCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgcGF0aCwKICAgICAgLmZhZGVkIHVzZSwKICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBwYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmFkZWQgcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBlbGxpcHNlLAogICAgICAuZmFkZWQgdXNlIHsKICAgICAgICBmaWxsOiB1cmwoI2VsbGlwc2VIYXRjaCkgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmZhZGVkIHRleHQgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgIH0KCiAgICAgIC8qIFJ1bGVzIHVzZWQgZm9yIGlucHV0LXRyYWNpbmcuICovCiAgICAgIC5pbnB1dC1oaWdobGlnaHQgPiAqID4gcmVjdCwKICAgICAgLmlucHV0LWhpZ2hsaWdodCA+ICogPiBlbGxpcHNlLAogICAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gKiA+IHVzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZmY5ODAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qICAtIEZhZGVkIG5vbi1pbnB1dCBzdHlsaW5nICovCiAgICAgIC5ub24taW5wdXQgPiAqID4gcmVjdCwKLm5vbi1pbnB1dCA+ICogPiBlbGxpcHNlLAoubm9uLWlucHV0ID4gKiA+IHVzZSwKLyogRm9yIENvbnN0IG5vZGVzLiAqLwoubm9uLWlucHV0ID4gKiA+IC5jb25zdGFudDpub3QoW2NsYXNzKj0iaW5wdXQtaGlnaGxpZ2h0Il0pID4KICAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiBpbmhlcml0OwogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgcGF0aCB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gLm5vZGVzaGFwZSA+IHJlY3QsCi5ub24taW5wdXQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5ub24taW5wdXQgZWxsaXBzZSwKICAgICAgLm5vbi1pbnB1dCB1c2UgewogICAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAubm9uLWlucHV0ID4gdGV4dCB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLm5vbi1pbnB1dCAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAubm9uLWlucHV0IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZS5yZWZsaW5lIHsKICAgICAgICBtYXJrZXItc3RhcnQ6IHVybCgjcmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLyogSW5wdXQgZWRnZXMuICovCiAgICAgIC5pbnB1dC1lZGdlLWhpZ2hsaWdodCA+IHRleHQgewogICAgICAgIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgLmlucHV0LWhpZ2hsaWdodCA+IC5pbi1hbm5vdGF0aW9ucyA+IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSwKICAgICAgLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZAogICAgICAgID4gLmluLWFubm90YXRpb25zCiAgICAgICAgPiAuYW5ub3RhdGlvbgogICAgICAgID4gLmFubm90YXRpb24tZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIE5vbi1pbnB1dCBlZGdlcy4gKi8KICAgICAgLm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCwKLm5vbi1pbnB1dCA+IGcgPiAuYW5ub3RhdGlvbiA+IHBhdGgsCi8qIEFubm90YXRpb24gc3R5bGVzIChsYWJlbCBhbmQgZWRnZXMgcmVzcGVjdGl2ZWx5KS4gKi8KLm5vbi1pbnB1dCA+IGcgPgouYW5ub3RhdGlvbjpub3QoLmlucHV0LWhpZ2hsaWdodCk6bm90KC5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQpID4KLmFubm90YXRpb24tbGFiZWwKLyouYW5ub3RhdGlvbi1lZGdlKi8KIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qIC0tLSBPcCBOb2RlIC0tLSAqLwoKICAgICAgLm9wID4gLm5vZGVzaGFwZSA+IC5ub2RlY29sb3J0YXJnZXQsCiAgICAgIC5vcCA+IC5hbm5vdGF0aW9uLW5vZGUgPiAubm9kZWNvbG9ydGFyZ2V0IHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KCiAgICAgIC5vcC5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiAubm9kZWNvbG9ydGFyZ2V0LAogICAgICAub3Auc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gLm5vZGVjb2xvcnRhcmdldCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAub3AuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gLm5vZGVjb2xvcnRhcmdldCwKICAgICAgLm9wLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IC5ub2RlY29sb3J0YXJnZXQgewogICAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgICAgfQoKICAgICAgLyogLS0tIFNlcmllcyBOb2RlIC0tLSAqLwoKICAgICAgLyogQnkgZGVmYXVsdCwgZG9uJ3Qgc2hvdyB0aGUgc2VyaWVzIGJhY2tncm91bmQgPHJlY3Q+LiAqLwogICAgICAuc2VyaWVzID4gLm5vZGVzaGFwZSA+IHJlY3QgewogICAgICAgIGZpbGw6IGhzbCgwLCAwJSwgNzAlKTsKICAgICAgICBmaWxsLW9wYWNpdHk6IDA7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogNSwgNTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC8qIE9uY2UgZXhwYW5kZWQsIHNob3cgdGhlIHNlcmllcyBiYWNrZ3JvdW5kIDxyZWN0PiBhbmQgaGlkZSB0aGUgPHVzZT4uICovCiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwLjE1OwogICAgICAgIHN0cm9rZTogaHNsKDAsIDAlLCA3MCUpOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAxOwogICAgICB9CiAgICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gdXNlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qKgogKiBUT0RPOiBTaW1wbGlmeSB0aGlzIGJ5IGFwcGx5aW5nIGEgc3RhYmxlIGNsYXNzIG5hbWUgdG8gYWxsIDxnPgogKiBlbGVtZW50cyB0aGF0IGN1cnJlbnRseSBoYXZlIGVpdGhlciB0aGUgbm9kZXNoYXBlIG9yIGFubm90YXRpb24tbm9kZSBjbGFzc2VzLgogKi8KICAgICAgLnNlcmllcyA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6ICNjY2M7CiAgICAgIH0KICAgICAgLnNlcmllcy5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KICAgICAgLnNlcmllcy5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgICBzdHJva2U6IHJlZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBCcmlkZ2UgTm9kZSAtLS0gKi8KICAgICAgLmJyaWRnZSA+IC5ub2Rlc2hhcGUgPiByZWN0IHsKICAgICAgICBzdHJva2U6ICNmMGY7CiAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTdHJ1Y3R1cmFsIEVsZW1lbnRzIC0tLSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUuc3RydWN0dXJhbCB7CiAgICAgICAgc3Ryb2tlOiAjZjBmOwogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBSZWZlcmVuY2UgRWRnZSAqLwogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUucmVmZXJlbmNlZWRnZSB7CiAgICAgICAgc3Ryb2tlOiAjZmZiNzRkOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBTZXJpZXMgTm9kZXMgLS0tICovCgogICAgICAvKiBIaWRlIHRoZSByZWN0IGZvciBhIHNlcmllcycgYW5ub3RhdGlvbi4gKi8KICAgICAgLnNlcmllcyA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiAtLS0gTm9kZSBsYWJlbCAtLS0gKi8KCiAgICAgIC5ub2RlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBmaWxsOiAjNDQ0OwogICAgICB9CgogICAgICAubWV0YS5leHBhbmRlZCA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDlweDsKICAgICAgfQoKICAgICAgLnNlcmllcyA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgICBmb250LXNpemU6IDhweDsKICAgICAgfQoKICAgICAgLm9wID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNnB4OwogICAgICB9CgogICAgICAuYnJpZGdlID4gdGV4dC5ub2RlbGFiZWwgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5ub2RlLm1ldGEuZXhwYW5kZWQgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgICAgY3Vyc29yOiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuaGlnaGxpZ2h0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM1MGEzZjc7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uLm1ldGEuc2VsZWN0ZWQgPiB0ZXh0LmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZpbGw6ICM0Mjg1ZjQ7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uIC0tLSAqLwoKICAgICAgLyogb25seSBhcHBsaWVkIGZvciBhbm5vdGF0aW9ucyB0aGF0IGFyZSBub3Qgc3VtbWFyeSBvciBjb25zdGFudC4KKC5zdW1tYXJ5LCAuY29uc3RhbnQgZ2V0cyBvdmVycmlkZGVuIGJlbG93KSAqLwogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLW5vZGUgPiAqIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAxLCAxOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbi5zdW1tYXJ5ID4gLmFubm90YXRpb24tbm9kZSA+ICosCiAgICAgIC5hbm5vdGF0aW9uLmNvbnN0YW50ID4gLmFubm90YXRpb24tbm9kZSA+ICogewogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiBub25lOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYWFhOwogICAgICAgIHN0cm9rZS13aWR0aDogMC41OwogICAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlIHsKICAgICAgICBtYXJrZXItZW5kOiB1cmwoI2Fubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgICAgfQoKICAgICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQpOwogICAgICB9CgogICAgICAuZmFkZWQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLnJlZmxpbmUgewogICAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgICB9CgogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMSwgMTsKICAgICAgfQoKICAgICAgI2Fubm90YXRpb24tYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjYWFhOwogICAgICB9CgogICAgICAjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNhYWE7CiAgICAgIH0KCiAgICAgICNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQgewogICAgICAgIGZpbGw6ICNlMGQ0YjM7CiAgICAgIH0KCiAgICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbGFiZWwgewogICAgICAgIGZvbnQtc2l6ZTogNXB4OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWxhYmVsLmFubm90YXRpb24tZWxsaXBzaXMgewogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLyogSGlkZSBhbm5vdGF0aW9ucyBvbiBleHBhbmRlZCBtZXRhIG5vZGVzIHNpbmNlIHRoZXkncmUgcmVkdW5kYW50LiAqLwogICAgICAuZXhwYW5kZWQgPiAuaW4tYW5ub3RhdGlvbnMsCiAgICAgIC5leHBhbmRlZCA+IC5vdXQtYW5ub3RhdGlvbnMgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBBbm5vdGF0aW9uOiBDb25zdGFudCAtLS0gKi8KCiAgICAgIC5jb25zdGFudCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjODQ4NDg0OwogICAgICB9CgogICAgICAuY29uc3RhbnQuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIH0KCiAgICAgIC5jb25zdGFudC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEFubm90YXRpb246IFN1bW1hcnkgLS0tICovCgogICAgICAuc3VtbWFyeSA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZmlsbDogI2RiNDQzNzsKICAgICAgICBzdHJva2U6ICNkYjQ0Mzc7CiAgICAgIH0KCiAgICAgIC5zdW1tYXJ5LnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICAgIGZpbGw6ICNhNTI3MTQ7CiAgICAgICAgc3Ryb2tlOiAjYTUyNzE0OwogICAgICB9CgogICAgICAuc3VtbWFyeS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgICAgfQoKICAgICAgLyogLS0tIEVkZ2UgLS0tICovCgogICAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjYmJiOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2Utd2lkdGg6IDAuNzU7CiAgICAgIH0KCiAgICAgIC5lZGdlIC5zZWxlY3RhYmxlZWRnZSB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAuc2VsZWN0ZWRlZGdlID4gcGF0aC5lZGdlbGluZSB7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAgIHN0cm9rZTogI2YwMDsKICAgICAgfQoKICAgICAgLmVkZ2Uuc2VsZWN0ZWRlZGdlIHRleHQgewogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgIH0KCiAgICAgIC8qIExhYmVscyBzaG93aW5nIHRlbnNvciBzaGFwZXMgb24gZWRnZXMgKi8KICAgICAgLmVkZ2UgPiB0ZXh0IHsKICAgICAgICBmb250LXNpemU6IDMuNXB4OwogICAgICAgIGZpbGw6ICM2NjY7CiAgICAgIH0KCiAgICAgIC5kYXRhZmxvdy1hcnJvd2hlYWQgewogICAgICAgIGZpbGw6ICNiYmI7CiAgICAgIH0KCiAgICAgIC5yZWZlcmVuY2UtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZmZiNzRkOwogICAgICB9CgogICAgICAuc2VsZWN0ZWQtYXJyb3doZWFkIHsKICAgICAgICBmaWxsOiAjZjAwOwogICAgICB9CgogICAgICAuZWRnZSAuY29udHJvbC1kZXAgewogICAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IDIsIDI7CiAgICAgIH0KCiAgICAgIC8qIC0tLSBHcm91cCBub2RlIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gLS0tICovCgogICAgICAvKiBIaWRlcyBleHBhbmQvY29sbGFwc2UgYnV0dG9ucyB3aGVuIGEgbm9kZSBpc24ndCBleHBhbmRlZCBvciBoaWdobGlnaHRlZC4gVXNpbmcKICAgaW5jcmVkaWJseSBzbWFsbCBvcGFjaXR5IHNvIHRoYXQgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgPGc+IHBhcmVudCBzdGlsbCB0YWtlcwogICB0aGlzIGNvbnRhaW5lciBpbnRvIGFjY291bnQgZXZlbiB3aGVuIGl0IGlzbid0IHZpc2libGUgKi8KICAgICAgLm5vZGU6bm90KC5oaWdobGlnaHRlZCk6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciB7CiAgICAgICAgb3BhY2l0eTogMC4wMTsKICAgICAgfQogICAgICAubm9kZS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgICAgLmJ1dHRvbmNpcmNsZSB7CiAgICAgICAgZmlsbDogI2U3ODExZDsKICAgICAgfQogICAgICAuYnV0dG9uY2lyY2xlOmhvdmVyIHsKICAgICAgICBmaWxsOiAjYjk2NzE3OwogICAgICB9CiAgICAgIC5leHBhbmRidXR0b24sCiAgICAgIC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgfQogICAgICAvKiBEbyBub3QgbGV0IHRoZSBwYXRoIGVsZW1lbnRzIGluIHRoZSBidXR0b24gdGFrZSBwb2ludGVyIGZvY3VzICovCiAgICAgIC5ub2RlID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgPiAuZXhwYW5kYnV0dG9uLAogICAgICAubm9kZSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyID4gLmNvbGxhcHNlYnV0dG9uIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgICAvKiBPbmx5IHNob3cgdGhlIGV4cGFuZCBidXR0b24gd2hlbiBhIG5vZGUgaXMgY29sbGFwc2VkIGFuZCBvbmx5IHNob3cgdGhlCiAgIGNvbGxhcHNlIGJ1dHRvbiB3aGVuIGEgbm9kZSBpcyBleHBhbmRlZC4gKi8KICAgICAgLm5vZGUuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5leHBhbmRidXR0b24gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLm5vZGU6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5jb2xsYXBzZWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLXN0YXRzIHsKICAgICAgICBmb250LXNpemU6IDRweDsKICAgICAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwgcmVjdCB7CiAgICAgICAgZmlsdGVyOiB1cmwoI2hlYWx0aC1waWxsLXNoYWRvdyk7CiAgICAgICAgcng6IDM7CiAgICAgICAgcnk6IDM7CiAgICAgIH0KCiAgICAgIC50aXRsZUNvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHRvcDogMjBweDsKICAgICAgfQoKICAgICAgLnRpdGxlLAogICAgICAuYXV4VGl0bGUsCiAgICAgIC5mdW5jdGlvbkxpYnJhcnlUaXRsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICAjbWluaW1hcCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAyMHB4OwogICAgICAgIGJvdHRvbTogMjBweDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCB7CiAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB1bCBsaSB7CiAgICAgICAgcGFkZGluZzogNHB4IDE2cHg7CiAgICAgIH0KCiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0idGl0bGVDb250YWluZXIiPgogICAgICA8ZGl2IGlkPSJ0aXRsZSIgY2xhc3M9InRpdGxlIj5NYWluIEdyYXBoPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImF1eFRpdGxlIiBjbGFzcz0iYXV4VGl0bGUiPkF1eGlsaWFyeSBOb2RlczwvZGl2PgogICAgICA8ZGl2IGlkPSJmdW5jdGlvbkxpYnJhcnlUaXRsZSIgY2xhc3M9ImZ1bmN0aW9uTGlicmFyeVRpdGxlIj4KICAgICAgICBGdW5jdGlvbnMKICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdmcgaWQ9InN2ZyI+CiAgICAgIDxkZWZzPgogICAgICAgIAogICAgICAgIDxwYXRoIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1zbWFsbCIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1tZWRpdW0iIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjEzIiBtYXJrZXJoZWlnaHQ9IjEzIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIiBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMTYiIG1hcmtlcmhlaWdodD0iMTYiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXhsYXJnZSIgdmlld2JveD0iMCAwIDEwIDEwIiBtYXJrZXJ3aWR0aD0iMjAiIG1hcmtlcmhlaWdodD0iMjAiIHJlZng9IjIiIHJlZnk9IjUiIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIiBtYXJrZXJ1bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8cGF0aCBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLXBhdGgiIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIgLz4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtc21hbGwiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbWVkaXVtIiB2aWV3Ym94PSIwIDAgMTAgMTAiIG1hcmtlcndpZHRoPSIxMyIgbWFya2VyaGVpZ2h0PSIxMyIgcmVmeD0iMiIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiIG1hcmtlcnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjE2IiBtYXJrZXJoZWlnaHQ9IjE2IiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIDxtYXJrZXIgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIgaWQ9ImRhdGFmbG93LWFycm93aGVhZC14bGFyZ2UiIHZpZXdib3g9IjAgMCAxMCAxMCIgbWFya2Vyd2lkdGg9IjIwIiBtYXJrZXJoZWlnaHQ9IjIwIiByZWZ4PSIyIiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIgbWFya2VydW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIiAvPgogICAgICAgIDwvbWFya2VyPgoKICAgICAgICAKICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJhbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCIgbWFya2Vyd2lkdGg9IjUiIG1hcmtlcmhlaWdodD0iNSIgcmVmeD0iNSIgcmVmeT0iMi41IiBvcmllbnQ9ImF1dG8iPgogICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCA1LDIuNSBMIDAsNSBMIDAsMCIgLz4KICAgICAgICA8L21hcmtlcj4KICAgICAgICA8bWFya2VyIGlkPSJyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQiIG1hcmtlcndpZHRoPSI1IiBtYXJrZXJoZWlnaHQ9IjUiIHJlZng9IjAiIHJlZnk9IjIuNSIgb3JpZW50PSJhdXRvIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0gNSwwIEwgMCwyLjUgTCA1LDUgTCA1LDAiIC8+CiAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgPG1hcmtlciBpZD0icmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkIiBtYXJrZXJ3aWR0aD0iNSIgbWFya2VyaGVpZ2h0PSI1IiByZWZ4PSIwIiByZWZ5PSIyLjUiIG9yaWVudD0iYXV0byI+CiAgICAgICAgICA8cGF0aCBkPSJNIDUsMCBMIDAsMi41IEwgNSw1IEwgNSwwIiAvPgogICAgICAgIDwvbWFya2VyPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLXN0YW1wIiByeD0iNy41IiByeT0iMyIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHJ4PSI1IiByeT0iMiIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIiAvPgogICAgICAgIDwvZz4KICAgICAgICAKICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjQiIC8+CiAgICAgICAgPC9nPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtYW5ub3RhdGlvbi1zdGFtcCI+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjkiIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjciIHk9IjIiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjUiIHk9IjIiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxzdmcgaWQ9InN1bW1hcnktaWNvbiIgZmlsbD0iIzg0ODQ4NCIgaGVpZ2h0PSIxMiIgdmlld2JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMTIiPgogICAgICAgICAgPHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIgLz4KICAgICAgICA8L3N2Zz4KCiAgICAgICAgCiAgICAgICAgPHBhdHRlcm4gaWQ9InJlY3RIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSI1IiBoZWlnaHQ9IjUiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjUiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIDxwYXR0ZXJuIGlkPSJlbGxpcHNlSGF0Y2giIHBhdHRlcm50cmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIiB3aWR0aD0iMiIgaGVpZ2h0PSIyIiBwYXR0ZXJudW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KICAgICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIyIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIiAvPgogICAgICAgIDwvcGF0dGVybj4KCiAgICAgICAgCiAgICAgICAgPGZpbHRlciBpZD0iaGVhbHRoLXBpbGwtc2hhZG93IiB4PSItNDAlIiB5PSItNDAlIiB3aWR0aD0iMTgwJSIgaGVpZ2h0PSIxODAlIj4KICAgICAgICAgIDxmZWdhdXNzaWFuYmx1ciBpbj0iU291cmNlQWxwaGEiIHN0ZERldmlhdGlvbj0iMC44IiAvPgogICAgICAgICAgPGZlb2Zmc2V0IGR4PSIwIiBkeT0iMCIgcmVzdWx0PSJvZmZzZXRibHVyIiAvPgogICAgICAgICAgPGZlZmxvb2QgZmxvb2QtY29sb3I9IiMwMDAwMDAiIC8+CiAgICAgICAgICA8ZmVjb21wb3NpdGUgaW4yPSJvZmZzZXRibHVyIiBvcGVyYXRvcj0iaW4iIC8+CiAgICAgICAgICA8ZmVtZXJnZT4KICAgICAgICAgICAgPGZlbWVyZ2Vub2RlIC8+CiAgICAgICAgICAgIDxmZW1lcmdlbm9kZSBpbj0iU291cmNlR3JhcGhpYyIgLz4KICAgICAgICAgIDwvZmVtZXJnZT4KICAgICAgICA8L2ZpbHRlcj4KICAgICAgPC9kZWZzPgogICAgICAKICAgICAgPHJlY3QgZmlsbD0id2hpdGUiIHdpZHRoPSIxMDAwMCIgaGVpZ2h0PSIxMDAwMCI+PC9yZWN0PgogICAgICA8ZyBpZD0icm9vdCI+PC9nPgogICAgPC9zdmc+CiAgICA8dGYtZ3JhcGgtbWluaW1hcCBpZD0ibWluaW1hcCI+PC90Zi1ncmFwaC1taW5pbWFwPgogICAgPGRpdiBpZD0iY29udGV4dE1lbnUiIGNsYXNzPSJjb250ZXh0LW1lbnUiPjwvZGl2PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH0KCiAgICAgIC52ZXJ0aWNhbCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIEBhcHBseSAtLWxheW91dC12ZXJ0aWNhbDsKICAgICAgfQoKICAgICAgLmF1dG8gewogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICBwYXBlci1idXR0b24gewogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgPGRpdiBjbGFzcz0idmVydGljYWwiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1t0aXRsZV1dIj4KICAgICAgICAgIDxoMj5bW3RpdGxlXV08L2gyPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRmLWdyYXBoLXNjZW5lIGlkPSJzY2VuZSIgY2xhc3M9ImF1dG8iIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iIGhpZ2hsaWdodGVkLW5vZGU9IltbX2dldFZpc2libGUoaGlnaGxpZ2h0ZWROb2RlKV1dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBzZWxlY3RlZC1lZGdlPSJ7e3NlbGVjdGVkRWRnZX19IiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHByb2dyZXNzPSJbW3Byb2dyZXNzXV0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW25vZGVDb250ZXh0TWVudUl0ZW1zXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iIGhhbmRsZS1lZGdlLXNlbGVjdGVkPSJbW2hhbmRsZUVkZ2VTZWxlY3RlZF1dIiB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSI+PC90Zi1ncmFwaC1zY2VuZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9jb250aW51ZUJ1dHRvbkNhbGxiYWNrIj4KICAgICAgPHNwYW4+W1tfY29udGludWVCdXR0b25UZXh0XV08L3NwYW4+CiAgICA8L3BhcGVyLWJ1dHRvbj4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0iY29udGludWVEaWFsb2ciPgogICAgICA8aDI+Q29udGludWUuLi48L2gyPgogICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250aW51ZS10by10eXBlLW5hbWUiPgogICAgICAgICAgT3ZlciBTZXNzaW9uIFJ1bnM6CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJjb250aW51ZU51bSIgY2xhc3M9ImlucHV0LWJveCIgbGFiZWw9Ik51bWJlciBvZiBTZXNzaW9uIFJ1bnMgKGluY2x1ZGluZyB0aGUgY3VycmVudCBvbmUpOiIgYWx3YXlzLWZsb2F0LWxhYmVsIHR5cGU9Im51bWJlciIgbWluPSIxIiBzdGVwPSIxIiB2YWx1ZT0ie3tjb250aW51ZU51bX19Ij48L3BhcGVyLWlucHV0PgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBjbGFzcz0iZ28tYnV0dG9uIiBpY29uPSJhcnJvdy1mb3J3YXJkIiB0aXRsZT0iU2Vzc2lvbiBSdW5zIEdvIiBvbi10YXA9Il9zZXNzaW9uUnVuR29CdXR0b25DYWxsYmFjayI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUiPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRpbnVlLXRvLXR5cGUtbmFtZSI+CiAgICAgICAgICBUaWxsIENvbmRpdGlvbiBNZXQgYnkgV2F0Y2hlZCBUZW5zb3IKICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0idGVuc29yQ29uZGl0aW9uRHJvcGRvd24iIGNsYXNzPSJpbnB1dC1ib3giIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iVGVuc29yIENvbmRpdGlvbiIgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfc2VsZWN0ZWRUZW5zb3JDb25kaXRpb259fSI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci1saXN0Ym94IGlkPSJ0ZW5zb3JDb25kaXRpb25NZW51IiBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Db250YWlucyArLy3iiJ4gb3IgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgKy8t4oiePC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+Q29udGFpbnMgTmFOPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWF4ICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1pbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWluICZsdDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5NYXggLSBNaW4gJmd0OzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiPk1heCAtIE1pbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmZ3Q7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+TWVhbiAmbHQ7PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+U3RhbmRhcmQgZGV2aWF0aW9uICZndDs8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5TdGFuZGFyZCBkZXZpYXRpb24gJmx0OzwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGNsYXNzPSJnby1idXR0b24iIGljb249ImFycm93LWZvcndhcmQiIHRpdGxlPSJUZW5zb3IgQ29uZGl0aW9uIEdvIiBvbi10YXA9Il90ZW5zb3JDb250aW51ZUdvQnV0dG9uQ2FsbGJhY2siPgogICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHBhcGVyLWlucHV0IGlkPSJyZWYtdmFsdWUiIGNsYXNzPSJpbnB1dC1ib3giIGxhYmVsPSJSZWZlcmVuY2UgdmFsdWUgdG8gY29tcGFyZSB0byIgdHlwZT0ibnVtYmVyIiB2YWx1ZT0ie3tfdGVuc29yQ29uZGl0aW9uUmVmVmFsdWV9fSIgaGlkZGVuPSJbW19pc1JlZlZhbHVlSW5wdXRIaWRkZW5dXSI+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWRpYWxvZz4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC5jb250aW51ZS10by10eXBlLW5hbWUgewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IHBhcGVyLWRpYWxvZyB7CiAgICAgICAgd2lkdGg6IDM2dnc7CiAgICAgIH0KICAgICAgOmhvc3QgLmlucHV0LWJveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogODAlOwogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgfQogICAgICA6aG9zdCAuZ28tYnV0dG9uIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDE1JTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWluaXRpYWwtZGlhbG9nIj4KICA8dGVtcGxhdGU+CiAgICAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfb3Blbl1dIj4KICAgICAgPGRpdiBpZD0iZGFzaGJvYXJkLWJhY2tkcm9wIj48L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJkaWFsb2ciIG5vLWNhbmNlbC1vbi1vdXRzaWRlLWNsaWNrIG5vLWNhbmNlbC1vbi1lc2Mta2V5IG9wZW5lZD0ie3tfb3Blbn19Ij4KICAgICAgPGgyIGlkPSJkaWFsb2ctdGl0bGUiPltbX3RpdGxlXV08L2gyPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0N1c3RvbU1lc3NhZ2VdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY3VzdG9tLW1lc3NhZ2UiPltbX2N1c3RvbU1lc3NhZ2VdXTwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXNDdXN0b21NZXNzYWdlXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2RlLWV4YW1wbGUtc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIj4KICAgICAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvU2Vzc2lvbiIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+dGYuU2Vzc2lvbjwvYT46CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8cHJlIGNsYXNzPSJjb2RlLXNuaXBwZXQiPmltcG9ydCB0ZW5zb3JmbG93IGFzIHRmCmZyb20gdGVuc29yZmxvdy5weXRob24gaW1wb3J0IGRlYnVnIGFzIHRmX2RlYnVnCgpzZXNzID0gdGYuU2Vzc2lvbigpCnNlc3MgPSB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnV3JhcHBlclNlc3Npb24oc2VzcywgIltbX2hvc3RdXTpbW19wb3J0XV0iKQpzZXNzLnJ1bihteV9mZXRjaGVzKQogICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24tdGl0bGUiPgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL3Byb2dyYW1tZXJzX2d1aWRlL2VzdGltYXRvcnMiIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPkVzdGltYXRvcjwvYT4KICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL3RyYWluL01vbml0b3JlZFNlc3Npb24iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPk1vbml0b3JlZFNlc3Npb248L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwoKaG9vayA9IHRmX2RlYnVnLlRlbnNvckJvYXJkRGVidWdIb29rKCJbW19ob3N0XV06W1tfcG9ydF1dIikKbXlfZXN0aW1hdG9yLmZpdCh4PXhfZGF0YSwgeT15X2RhdGEsIHN0ZXBzPTEwMDAsIG1vbml0b3JzPVtob29rXSkKICAgICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvZGUtZXhhbXBsZS1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29kZS1leGFtcGxlLXNlY3Rpb24tdGl0bGUiPgogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8va2VyYXMuaW8vbW9kZWxzL21vZGVsLyIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+S2VyYXMgTW9kZWw8L2E+OgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPHByZSBjbGFzcz0iY29kZS1zbmlwcGV0Ij5pbXBvcnQgdGVuc29yZmxvdyBhcyB0Zgpmcm9tIHRlbnNvcmZsb3cucHl0aG9uIGltcG9ydCBkZWJ1ZyBhcyB0Zl9kZWJ1ZwppbXBvcnQga2VyYXMKCmtlcmFzLmJhY2tlbmQuc2V0X3Nlc3Npb24oCiAgICB0Zl9kZWJ1Zy5UZW5zb3JCb2FyZERlYnVnV3JhcHBlclNlc3Npb24odGYuU2Vzc2lvbigpLCAiW1tfaG9zdF1dOltbX3BvcnRdXSIpKQojIERlZmluZSB5b3VyIGtlcmFzIG1vZGVsLCBjYWxsZWQgIm1vZGVsIi4KbW9kZWwuZml0KC4uLikKICAgICAgICAgICAgPC9wcmU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHN0eWxlPgogICAgICAvKiogV2UgcmVseSBvbiBhIHNlcGFyYXRlIGBfaGlkZGVuYCBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGRpcmVjdGx5IG1ha2luZyB1c2UKICAgICAgICAgIG9mIHRoZSBgX29wZW5gIGF0dHJpYnV0ZSBiZWNhdXNlIHRoaXMgQ1NTIHNwZWNpZmljYXRpb24gbWF5IHN0cmFuZ2VseQogICAgICAgICAgYWZmZWN0IG90aGVyIGVsZW1lbnRzIHRocm91Z2hvdXQgVGVuc29yQm9hcmQuIFNlZSAjODk5LiAqLwogICAgICA6aG9zdChbX2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIDpob3N0LAogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAjZGFzaGJvYXJkLWJhY2tkcm9wIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgIH0KCiAgICAgIC5jb2RlLWV4YW1wbGUgewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICB9CiAgICAgIC5jb2RlLWV4YW1wbGUtc2VjdGlvbiB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgLmNvZGUtZXhhbXBsZS1zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAuY29kZS1zbmlwcGV0IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDFlbTsKICAgICAgfQoKICAgICAgI2RpYWxvZy10aXRsZSB7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jdXN0b20tbWVzc2FnZSB7CiAgICAgICAgbWFyZ2luLXRvcDogMDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZGVidWdnZXItcmVzaXplciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0iYmFycyI+CiAgICAgIDxkaXYgY2xhc3M9ImJhcnMtcm90YXRvciI+CiAgICAgICAgPHNwYW4gY2xhc3M9ImJhcnMtdGV4dCI+fCB8PC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdChbX3Jlc2l6ZXItaWRlbnRpZmllcl0pIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYmFja2dyb3VuZDogI2NjYzsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2lzLWhvcml6b250YWxdKSB7CiAgICAgICAgY3Vyc29yOiByb3ctcmVzaXplOwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICA6aG9zdChbX2lzLXZlcnRpY2FsXSkgewogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICByaWdodDogLTE1cHg7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLmJhcnMgewogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDUwJTsKICAgICAgICBsZWZ0OiA1MCU7CiAgICAgICAgZm9udC1zaXplOiA1cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7CiAgICAgIH0KCiAgICAgIC8qKiBUaGlzIGJsb2NrIHByZXZlbnRzIHRoZSBiYXJzIHJvdGF0b3IgZnJvbSBoYXZpbmcgYSBoZWlnaHQgdGhhdCBpcwogICAgICAgICAgdGhlIGVudGlyZSB2aWV3cG9ydCwgdGh1cyBvY2NsdWRpbmcgaXQgYW5kIGdpdmluZyBpdCBhbiB1bmRlc2lyZWQgY3Vyc29yCiAgICAgICAgICB2YWx1ZS4gKi8KICAgICAgLmJhcnMtcm90YXRvciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaXMtaG9yaXpvbnRhbF0pIC5iYXJzLXJvdGF0b3IgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDkwZGVnKTsKICAgICAgfQoKICAgICAgLmJhcnMtdGV4dCB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVkoMTUpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1vcC1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPGRpdj4KICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgaWQ9ImZpbHRlci1tb2RlIiBuby1sYWJlbC1mbG9hdD0idHJ1ZSIgbGFiZWw9IkZpbHRlciBNb2RlIiBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19maWx0ZXJNb2RlfX0iPgogICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5Ob2RlIE5hbWU8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+T3AgVHlwZTwvcGFwZXItaXRlbT4KICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJmaWx0ZXItaW5wdXQiIGxhYmVsPSJGaWx0ZXIgUmVnZXgiIGFsd2F5cy1mbG9hdC1sYWJlbCB2YWx1ZT0ie3tfZmlsdGVySW5wdXR9fSI+PC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgY2xhc3M9InNwaW5uZXIiIGlkPSJsb2FkaW5nLXNwaW5uZXIiIGhpZGRlbj0iW1shX2lzTG9hZGluZ11dIj4KICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgPGRpdiBpZD0ic2VsZWN0b3ItaGllcmFyY2h5Ij48L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMjBweDsKICAgICAgfQoKICAgICAgLmxldmVsLWNvbnRhaW5lciBpcm9uLWNvbGxhcHNlIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICAgIGhlaWdodDogMThweDsKICAgICAgICBtYXJnaW46IDAgOHB4IDAgMDsKICAgICAgfQoKICAgICAgLm9wLXR5cGUgewogICAgICAgIHBhZGRpbmctcmlnaHQ6IDEwcHg7CiAgICAgICAgY29sb3I6ICM0NDQ7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5vcC10aXRsZS1sZWFmOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQoKICAgICAgLnBhcnRpYWwtY2hlY2tib3ggewogICAgICAgIGJhY2tncm91bmQ6ICNmNTdjMDA7CiAgICAgIH0KCiAgICAgIC5ub2RlLWV4cGFuZC1idXR0b24gewogICAgICAgIG1hcmdpbjogMCAwIDAgLTEzcHg7CiAgICAgIH0KCiAgICAgIC5sZXZlbC10aXRsZS10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IDgwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xcHg7CiAgICAgIH0KCiAgICAgIC5vcC1kZXNjcmlwdGlvbiB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDMwMDsKICAgICAgICBtYXJnaW46IDAgMCAwIDI3cHg7CiAgICAgICAgcGFkZGluZzogMTBweCAwOwogICAgICB9CgogICAgICAuc3Bpbm5lciB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgICNmaWx0ZXItbW9kZSB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2ZpbHRlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIC5oaWdobGlnaHRlZCA+IC5vcC10eXBlIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CgogICAgICAjc2VsZWN0b3ItaGllcmFyY2h5IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1zZXNzaW9uLXJ1bnMtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBjbGFzcz0ic2Vzc2lvbi1ydW5zLWRpdiI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlNlc3Npb24gUnVuczwvZGl2PgogICAgICA8dGFibGUgaWQ9InNlc3Npb24tcnVucy10YWJsZSIgYWxpZ249ImxlZnQiIGNsYXNzPSJzZXNzaW9uLXJ1bnMtdGFibGUiPgogICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICA8dGg+RmVlZHM8L3RoPgogICAgICAgICAgPHRoPkZldGNoZXM8L3RoPgogICAgICAgICAgPHRoPlRhcmdldHM8L3RoPgogICAgICAgICAgPHRoPiMoRGV2aWNlcyk8L3RoPgogICAgICAgICAgPHRoPkNvdW50PC90aD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiAyMHB4IDA7CiAgICAgIH0KCiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgOmhvc3QgLmluZGVudGVkLWxldmVsLWNvbnRhaW5lciAuY29udGVudC1jb250YWluZXIgewogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLyogVE9ETyhjYWlzKTogVGhpcyBuZWVkcyB3b3JrOiB0aGUgdGFibGUgc2hvdWxkbid0IGdldCB0b28gd2lkZSB3aGVuCiAgICAgICAgIHRoZXJlIGFyZSBtYW55IGZlZWRzL2ZldGNoZXMvdGFyZ3RlIG5hbWVzLiAqLwogICAgICAuc2Vzc2lvbi1ydW5zLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZCAxcHggYmxhY2s7CiAgICAgICAgdGFibGUtbGF5b3V0OiBmaXhlZDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgIC5hY3RpdmUtc2Vzc2lvbi1ydW4gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZTA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLnNvbGUtYWN0aXZlLXNlc3Npb24tcnVuIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMTcyLCAyMzIsIDE4OCk7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50IHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgIC5ub2RlLW9yLXRlbnNvci1lbGVtZW50OmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXNvdXJjZS1jb2RlLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImZ1bGxTdGFja0RpYWxvZyIgaGlkZGVuJD0iW1shX2Z1bGxTdGFja1Nob3duXV0iPgogICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLXRpdGxlIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iZmlsdGVyLWxpc3QiIGRpc2FibGVkPSJ0cnVlIj4KICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIEZ1bGwgU3RhY2sgVHJhY2Ugb2YgTm9kZToKICAgICAgICA8ZGl2IGlkPSJmdWxsLXN0YWNrLW5vZGUtbmFtZSI+IltbX2Z1bGxTdGFja05vZGVOYW1lXV0iPC9kaXY+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImNsb3NlIiBpZD0iY2xvc2UtZnVsbC1zdGFjay1idXR0b24iIHRpdGxlPSJDbG9zZSBGdWxsIFN0YWNrIiBvbi10YXA9Il9jbG9zZUZ1bGxTdGFja0RpYWxvZyI+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDx1bCBpZD0iZnVsbC1zdGFjay1jb250ZW50Ij48L3VsPgogICAgPC9kaXY+CiAgICA8cGFwZXItdGFicyBpZD0ic291cmNlLWZpbGVzLXRhYnMiIHNlbGVjdGVkPSJ7e19maWxlUGF0aFNlbGVjdGVkfX0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zaG9ydEZpbGVQYXRoc11dIj4KICAgICAgICA8cGFwZXItdGFiIGlkPSJbW2l0ZW0uaWRdXSI+W1tpdGVtLm5hbWVdXTwvcGFwZXItdGFiPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9wYXBlci10YWJzPgogICAgPGRpdiBpZD0ic291cmNlLWZpbGUtY29udGVudCIgY2xhc3M9InNvdXJjZS1jb250ZW50Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZmlsZUxpbmVzXV0iPgogICAgICAgIDxkaXYgY2xhc3MkPSJ7e2l0ZW0uc291cmNlQ2xhc3N9fSIgaWQ9InNvdXJjZS1saW5lLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtbnVtYmVyIiBpZD0ic291cmNlLWxpbmVuby1bW2l0ZW0ubGluZW5vXV0iPgogICAgICAgICAgICBbW2l0ZW0ubGluZW5vXV0KICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJzb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSIgaWQ9InNvdXJjZS1saW5lLW5vZGUtdG9nZ2xlLVtbaXRlbS5saW5lbm9dXSI+CiAgICAgICAgICAgIFtbaXRlbS5udW1Ob2Rlc11dCiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICA8c3BhbiBjbGFzcz0ic291cmNlLWxpbmUtdGV4dCIgaWQ9InNvdXJjZS1saW5lLXRleHQtW1tpdGVtLmxpbmVub11dIj4KICAgICAgICAgICAgW1tpdGVtLnRleHRdXQogICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPGRpdiBjbGFzcz0ic291cmNlLWxpbmUtbm9kZXMiIGlkPSJzb3VyY2UtbGluZS1ub2Rlcy1bW2l0ZW0ubGluZW5vXV0iPjwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzb3VyY2UtZmlsZXMtdGFicyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogOCU7CiAgICAgIH0KICAgICAgLnNvdXJjZS1jb250ZW50IHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiA5MCU7CiAgICAgICAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICBvdmVyZmxvdy14OiBzY3JvbGw7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CiAgICAgIC5zb3VyY2UtY29udGVudCA6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmMDA7CiAgICAgIH0KICAgICAgLmhpZ2hsaWdodGVkLXNvdXJjZS1saW5lIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1udW1iZXIgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBjb2xvcjogbGlnaHRibHVlOwogICAgICAgIHdpZHRoOiAyZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLXRvZ2dsZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGNvbG9yOiBibHVlOwogICAgICAgIHdpZHRoOiA1ZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAuc291cmNlLWxpbmUtbm9kZXMgewogICAgICAgIHBhZGRpbmctbGVmdDogNGVtOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICBtYXJnaW4tdG9wOiAwZW07CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMGVtOwogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICB9CiAgICAgIC5zb3VyY2UtbGluZS1ub2RlLWVudHJ5IHsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDFlbTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLW5vZGVzIHNwYW4gewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7CiAgICAgIH0KICAgICAgLnNvdXJjZS1saW5lLXRleHQgewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgI2Z1bGxTdGFja0RpYWxvZyB7CiAgICAgICAgei1pbmRleDogMTAwMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxMCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHdpZHRoOiA0NSU7CiAgICAgICAgaGVpZ2h0OiA4NSU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgZ3JheTsKICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2RkZDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDExMCU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlZWU7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgICNmdWxsLXN0YWNrLW5vZGUtbmFtZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgOmhvc3QgI2Z1bGwtc3RhY2stY29udGVudCB7CiAgICAgICAgcGFkZGluZy10b3A6IDFlbTsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAwLjVlbTsKICAgICAgICBtYXJnaW4tdG9wOiAwLjVlbTsKICAgICAgICBmb250LXNpemU6IDkwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KICAgICAgLnN0YWNrLWZyYW1lLWNsaWNrYWJsZSB7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC5zdGFjay1mcmFtZS1ub25jbGlja2FibGUgewogICAgICAgIGNvbG9yOiAjNTU1OwogICAgICB9CiAgICAgICNjbG9zZS1mdWxsLXN0YWNrLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGVuc29yLWRhdGEtc3VtbWFyeSI+CiAgPHRlbXBsYXRlPgogICAgPHNwYW4gY2xhc3M9InNlY3Rpb24tdGl0bGUiPlRlbnNvciBWYWx1ZSBPdmVydmlldzwvc3Bhbj4KICAgIDxkaXYgaWQ9InRlbnNvci1kYXRhLWRpdiIgY2xhc3M9InRlbnNvci1kYXRhLWRpdiI+CiAgICAgIDx0YWJsZSBpZD0idGVuc29yLWRhdGEtdGFibGUiIGFsaWduPSJsZWZ0IiBjbGFzcz0idGVuc29yLWRhdGEtdGFibGUiPgogICAgICAgIDx0aGVhZD4KICAgICAgICAgIDx0ciBhbGlnbj0ibGVmdCI+CiAgICAgICAgICAgIDx0aD5UZW5zb3I8L3RoPgogICAgICAgICAgICA8dGg+Q291bnQ8L3RoPgogICAgICAgICAgICA8dGg+RFR5cGU8L3RoPgogICAgICAgICAgICA8dGg+U2hhcGU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+VmFsdWU8L3RoPgogICAgICAgICAgICA8dGggd2lkdGg9IjI1JSI+CiAgICAgICAgICAgICAgSGVhbHRoIFBpbGwKICAgICAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBpZD0ic2hvdy1oZWFsdGgtcGlsbHMiIGNoZWNrZWQ9Int7X2hlYWx0aFBpbGxzRW5hYmxlZH19Ij4KICAgICAgICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLWNhcmQ+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFsdGgtcGlsbC1sZWdlbmQiIGlkPSJoZWFsdGgtcGlsbC1sZWdlbmQiPjwvZGl2PgogICAgICAgICAgICAgIDwvcGFwZXItY2FyZD4KICAgICAgICAgICAgPC90aD4KICAgICAgICAgICAgPHRoIHdpZHRoPSI1JSI+PC90aD4KICAgICAgICAgIDwvdHI+CiAgICAgICAgPC90aGVhZD4KICAgICAgICA8dGJvZHk+PC90Ym9keT4KICAgICAgPC90YWJsZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCAjdGVuc29yLWRhdGEtZGl2IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CiAgICAgIDpob3N0IC5pbmRlbnRlZC1sZXZlbC1jb250YWluZXIgLmNvbnRlbnQtY29udGFpbmVyIHsKICAgICAgICBtYXJnaW46IDAgMCAwIDEwcHg7CiAgICAgIH0KICAgICAgOmhvc3QgLnRlbnNvci1kYXRhLXRhYmxlIHsKICAgICAgICBhbGlnbi1jb250ZW50OiBsZWZ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBsZWZ0OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwYWRkaW5nLXRvcDogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgIH0KICAgICAgOmhvc3QgI3RlbnNvci1kYXRhLXRhYmxlIHRoIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CiAgICAgIDpob3N0IC5hY3RpdmUtdGVuc29yIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmUwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGJvcmRlcjogc29saWQgMXB4ICM4ODg7CiAgICAgIH0KICAgICAgOmhvc3QgLmhpZ2hsaWdodGVkIHsKICAgICAgICBjb2xvcjogcmVkOwogICAgICB9CiAgICAgIDpob3N0IC5oZWFsdGgtcGlsbC1sZWdlbmQgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIDpob3N0ICNzaG93LWhlYWx0aC1waWxscyB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC52YWx1ZS1leHBhbnNpb24tbGluayA6aG92ZXIgewogICAgICAgIGNvbG9yOiBibHVlOwogICAgICB9CiAgICAgIC5oZWFsdGgtcGlsbCA6aG92ZXIgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgewogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgICAudGVuc29yLW5hbWUgOmhvdmVyIHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxzdHlsZT4vKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CnlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCmRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCmxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKLnRlbnNvci13aWRnZXQgewogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgZm9udC1zaXplOiAxNHB4OwogIG92ZXJmbG93LXg6IGhpZGRlbjsKICBvdmVyZmxvdy15OiBoaWRkZW47CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgoudGVuc29yLXdpZGdldC1kaW0gewogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKICBtYXJnaW4tbGVmdDogMTVweDsKICBtYXJnaW4tcmlnaHQ6IDE1cHg7CiAgcGFkZGluZzogMnB4Owp9CgoudGVuc29yLXdpZGdldC1kaW0tY29tbWEgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDE0cHg7CiAgbGluZS1oZWlnaHQ6IDE0cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDEwMCwgMTgwLCAyNTUpOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1kaW0tYnJhY2tldHMgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0Owp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24gewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTUsIDI1NSwgMjU1KTsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTI4LCAxMjgsIDEyOCk7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgd2lkdGg6IDE4MHB4OwogIHotaW5kZXg6IDEwMDA7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0gewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTgwLCAxODAsIDE4MCk7CiAgZm9udC1zaXplOiAxMnB4OwogIHBhZGRpbmc6IDNweDsKICB1c2VyLXNlbGVjdDogbm9uZTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigxMDAsIDE4MCwgMjU1KTsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1kaXNhYmxlZCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUgewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDYwLCA2MCwgNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDhwdDsKICBoZWlnaHQ6IDQ4cHg7CiAgbGluZS1oZWlnaHQ6IDIycHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwYWRkaW5nLWxlZnQ6IDE0cHg7CiAgcGFkZGluZy1yaWdodDogMTBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtZHR5cGUtbGFiZWwgewogIGNvbG9yOiByZ2IoMTI4LCAxMjgsIDEyOCk7Cn0KCi50ZW5zb3Itd2lkZ2V0LWhlYWRlciB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MiwgMjUyLCAyNTIpOwogIGJveC1zaGFkb3c6IDJweCAycHggMnB4ICNiMGIwYjA7CiAgaGVpZ2h0OiA0MHB4OwogIGxpbmUtaGVpZ2h0OiA0MHB4OwogIG1heC1oZWlnaHQ6IDQwcHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDEwMCU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWluZm8gewogIGFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICBjb2xvcjogcmdiKDAsIDAsIDI1NSk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogMjJweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXJnaW4tbGVmdDogOHB4OwogIG1heC1oZWlnaHQ6IDIycHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWIgewogIGNvbG9yOiByZ2IoMzIsIDMzLCAzNik7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKICBmb250LXNpemU6IDE2cHg7CiAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1tZW51LXRodW1iOmhvdmVyIHsKICBjb2xvcjogcmdiKDIyNywgMTE2LCAwKTsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUgewogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIG1hcmdpbi1sZWZ0OiAxMnB4Owp9CgoudGVuc29yLXdpZGdldC1zaGFwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLXZhbHVlIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNsaWNpbmctZ3JvdXAgewogIGJhY2tncm91bmQtY29sb3I6IHJnYigyNTAsIDI1MCwgMjUwKTsKICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDE5MCwgMTkwLCAxOTApOwogIGRpc3BsYXk6IGJsb2NrOwogIGhlaWdodDogMThweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgcGFkZGluZy1ib3R0b206IDVweDsKICBwYWRkaW5nLXRvcDogNXB4Owp9CgoudGVuc29yLXdpZGdldC10ZW5zb3ItbmFtZSB7CiAgY29sb3I6IGJsYWNrOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtbGVmdC1ydWxlci10aWNrIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yKTsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci10b3A6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm94LXNoYWRvdzogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjb2xvcjogcmdiKDExMCwgMTEwLCAxMTApOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMjlweDsKICBsaW5lLWhlaWdodDogMjlweDsKICBtYXJnaW4tbGVmdDogMHB4OwogIG1heC13aWR0aDogNDVweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI0MCwgMjQwLCAyNDApOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICBib3gtc2hhZG93OiAxcHggMXB4IDFweCAjYjBiMGIwOwogIGRpc3BsYXk6IG5vbmU7CiAgZm9udC1zaXplOiAxM3B4OwogIHBhZGRpbmc6IDVweDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgd2lkdGg6IDI0MHB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWNvbG9yYmFyIHsKICBoZWlnaHQ6IDI0cHg7CiAgd2lkdGg6IDk1JTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC1pbmRpY2VzIHsKICBmb250LXdlaWdodDogYm9sZDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC12YWx1ZSB7CiAgbWFyZ2luLXRvcDogMjBweDsKfQoKLnRlbnNvci13aWRnZXQtdG9wLXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIHBhZGRpbmctcmlnaHQ6IDJweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2IHsKICBib3JkZXItYm90dG9tOiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGJvcmRlci1yaWdodDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogODAlOwogIGhlaWdodDogMjRweDsKICBsaW5lLWhlaWdodDogMjRweDsKICBtYXgtd2lkdGg6IDQ1cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IHJpZ2h0OwogIHVzZXItc2VsZWN0OiBub25lOwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgd2lkdGg6IDQ1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24gewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWJvdHRvbSB7CiAgYm9yZGVyLWJvdHRvbTogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0IHsKICBib3JkZXItbGVmdDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCB7CiAgYm9yZGVyLXJpZ2h0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCB7CiAgYm9yZGVyLXRvcDogMC41cHggc29saWQgYmx1ZTsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiB7CiAgLS1ib3JkZXItc3R5bGU6IDFweCBzb2xpZCByZ2IoMTQwLCAxNDAsIDE0MCk7CiAgLS1ydWxlci1iYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjEwLCAyMTAsIDIxMCk7CiAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLWtodG1sLXVzZXItc2VsZWN0OiBub25lOwogIC13ZWJraXQtdG91Y2gtY2FsbG91dDogbm9uZTsKICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1yb3cgewogIGhlaWdodDogMjVweDsKICBsaW5lLWhlaWdodDogMjVweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Cjwvc3R5bGU+Cgo8ZG9tLW1vZHVsZSBpZD0idGVuc29yLXdpZGdldC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPi8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuClNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgoudGVuc29yLXdpZGdldCB7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDE0cHg7CiAgb3ZlcmZsb3cteDogaGlkZGVuOwogIG92ZXJmbG93LXk6IGhpZGRlbjsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbSB7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAxNHB4OwogIGxpbmUtaGVpZ2h0OiAxNHB4OwogIG1hcmdpbi1sZWZ0OiAxNXB4OwogIG1hcmdpbi1yaWdodDogMTVweDsKICBwYWRkaW5nOiAycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1jb21tYSB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiAxMnB4OwogIGhlaWdodDogMTRweDsKICBsaW5lLWhlaWdodDogMTRweDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIHsKICBib3JkZXI6IDFweCBzb2xpZCByZ2IoMTAwLCAxODAsIDI1NSk7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93biB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1NSwgMjU1LCAyNTUpOwogIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxMjgsIDEyOCwgMTI4KTsKICBib3gtc2hhZG93OiAycHggMnB4IDJweCAjYjBiMGIwOwogIGN1cnNvcjogcG9pbnRlcjsKICB3aWR0aDogMTgwcHg7CiAgei1pbmRleDogMTAwMDsKfQoKLnRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJnYigxODAsIDE4MCwgMTgwKTsKICBmb250LXNpemU6IDEycHg7CiAgcGFkZGluZzogM3B4OwogIHVzZXItc2VsZWN0OiBub25lOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDEwMCwgMTgwLCAyNTUpOwp9CgoudGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWRpc2FibGVkIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZSB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoNjAsIDYwLCA2MCk7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogOHB0OwogIGhlaWdodDogNDhweDsKICBsaW5lLWhlaWdodDogMjJweDsKICBtYXgtaGVpZ2h0OiAyMnB4OwogIHBhZGRpbmctbGVmdDogMTRweDsKICBwYWRkaW5nLXJpZ2h0OiAxMHB4OwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwp9CgoudGVuc29yLXdpZGdldC1kdHlwZS1sYWJlbCB7CiAgY29sb3I6IHJnYigxMjgsIDEyOCwgMTI4KTsKfQoKLnRlbnNvci13aWRnZXQtaGVhZGVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjUyLCAyNTIsIDI1Mik7CiAgYm94LXNoYWRvdzogMnB4IDJweCAycHggI2IwYjBiMDsKICBoZWlnaHQ6IDQwcHg7CiAgbGluZS1oZWlnaHQ6IDQwcHg7CiAgbWF4LWhlaWdodDogNDBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogMTAwJTsKfQoKLnRlbnNvci13aWRnZXQtaW5mbyB7CiAgYWxpZ24tY29udGVudDogY2VudGVyOwogIGNvbG9yOiByZ2IoMCwgMCwgMjU1KTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4cHQ7CiAgaGVpZ2h0OiAyMnB4OwogIGxpbmUtaGVpZ2h0OiAyMnB4OwogIG1hcmdpbi1sZWZ0OiA4cHg7CiAgbWF4LWhlaWdodDogMjJweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKfQoKLnRlbnNvci13aWRnZXQtbWVudS10aHVtYiB7CiAgY29sb3I6IHJnYigzMiwgMzMsIDM2KTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGZvbnQtc2l6ZTogMTZweDsKICBtYXJnaW4tbGVmdDogMTBweDsKICBtYXJnaW4tcmlnaHQ6IDVweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LW1lbnUtdGh1bWI6aG92ZXIgewogIGNvbG9yOiByZ2IoMjI3LCAxMTYsIDApOwp9CgoudGVuc29yLXdpZGdldC1zaGFwZSB7CiAgY29sb3I6IHJnYig2MCwgNjAsIDYwKTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgbWFyZ2luLWxlZnQ6IDEycHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXNoYXBlLWxhYmVsIHsKICBjb2xvcjogcmdiKDEyOCwgMTI4LCAxMjgpOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2hhcGUtdmFsdWUgewogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKfQoKLnRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCB7CiAgYmFja2dyb3VuZC1jb2xvcjogcmdiKDI1MCwgMjUwLCAyNTApOwogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMTkwLCAxOTAsIDE5MCk7CiAgZGlzcGxheTogYmxvY2s7CiAgaGVpZ2h0OiAxOHB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICBwYWRkaW5nLWJvdHRvbTogNXB4OwogIHBhZGRpbmctdG9wOiA1cHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIHsKICBjb2xvcjogYmxhY2s7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC1sZWZ0LXJ1bGVyLXRpY2sgewogIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXJ1bGVyLWJhY2tncm91bmQtY29sb3IpOwogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXRvcDogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3gtc2hhZG93OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGNvbG9yOiByZ2IoMTEwLCAxMTAsIDExMCk7CiAgY3Vyc29yOiBwb2ludGVyOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBmb250LXNpemU6IDEycHg7CiAgaGVpZ2h0OiAyOXB4OwogIGxpbmUtaGVpZ2h0OiAyOXB4OwogIG1hcmdpbi1sZWZ0OiAwcHg7CiAgbWF4LXdpZHRoOiA0NXB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXIgewogIGhlaWdodDogMjRweDsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2IoMjQwLCAyNDAsIDI0MCk7CiAgYm9yZGVyOiAxcHggc29saWQgcmdiKDE2MCwgMTYwLCAxNjApOwogIGJveC1zaGFkb3c6IDFweCAxcHggMXB4ICNiMGIwYjA7CiAgZGlzcGxheTogbm9uZTsKICBmb250LXNpemU6IDEzcHg7CiAgcGFkZGluZzogNXB4OwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB3aWR0aDogMjQwcHg7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtY29sb3JiYXIgewogIGhlaWdodDogMjRweDsKICB3aWR0aDogOTUlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWluZGljZXMgewogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLXZhbHVlIHsKICBtYXJnaW4tdG9wOiAyMHB4Owp9CgoudGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayB7CiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcnVsZXItYmFja2dyb3VuZC1jb2xvcik7CiAgYm9yZGVyLWJvdHRvbTogdmFyKC0tYm9yZGVyLXN0eWxlKTsKICBib3JkZXItcmlnaHQ6IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgY29sb3I6IHJnYigxMTAsIDExMCwgMTEwKTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGZvbnQtc2l6ZTogMTJweDsKICBoZWlnaHQ6IDI0cHg7CiAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgcGFkZGluZy1yaWdodDogMnB4OwogIHRleHQtYWxpZ246IGNlbnRlcjsKICB1c2VyLXNlbGVjdDogbm9uZTsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHdpZHRoOiA0NXB4Owp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYgewogIGJvcmRlci1ib3R0b206IHZhcigtLWJvcmRlci1zdHlsZSk7CiAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1ib3JkZXItc3R5bGUpOwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgZm9udC1zaXplOiA4MCU7CiAgaGVpZ2h0OiAyNHB4OwogIGxpbmUtaGVpZ2h0OiAyNHB4OwogIG1heC13aWR0aDogNDVweDsKICBwYWRkaW5nLXJpZ2h0OiAycHg7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICB3aWR0aDogNDVweDsKfQoKLnRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbiB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tYm90dG9tIHsKICBib3JkZXItYm90dG9tOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLWxlZnQgewogIGJvcmRlci1sZWZ0OiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXJpZ2h0IHsKICBib3JkZXItcmlnaHQ6IDAuNXB4IHNvbGlkIGJsdWU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tdG9wIHsKICBib3JkZXItdG9wOiAwLjVweCBzb2xpZCBibHVlOwp9CgoudGVuc29yLXdpZGdldC12YWx1ZS1zZWN0aW9uIHsKICAtLWJvcmRlci1zdHlsZTogMXB4IHNvbGlkIHJnYigxNDAsIDE0MCwgMTQwKTsKICAtLXJ1bGVyLWJhY2tncm91bmQtY29sb3I6IHJnYigyMTAsIDIxMCwgMjEwKTsKICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAta2h0bWwtdXNlci1zZWxlY3Q6IG5vbmU7CiAgLXdlYmtpdC10b3VjaC1jYWxsb3V0OiBub25lOwogIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7Cn0KCi50ZW5zb3Itd2lkZ2V0LXZhbHVlLXJvdyB7CiAgaGVpZ2h0OiAyNXB4OwogIGxpbmUtaGVpZ2h0OiAyNXB4OwogIHdoaXRlLXNwYWNlOiBub3dyYXA7Cn0KPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWxpbmUtY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDx2ei1saW5lLWNoYXJ0MiB4LWNvbXBvbmVudHMtY3JlYXRpb24tbWV0aG9kPSJbW19saW5lQ2hhcnRYQ29tcG9uZW50c0NyZWF0aW9uTWV0aG9kXV0iIHktdmFsdWUtYWNjZXNzb3I9IltbX2xpbmVDaGFydFlWYWx1ZUFjY2Vzc29yXV0iIHRvb2x0aXAtY29sdW1ucz0iW1tfbGluZUNoYXJ0VG9vbHRpcENvbHVtbnNdXSIgc21vb3RoaW5nLWVuYWJsZWQ9IltbX2xpbmVDaGFydFNtb290aGluZ0VuYWJsZWRdXSI+PC92ei1saW5lLWNoYXJ0Mj4KICAgIDxzdHlsZT4KICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIGhlaWdodDogMzAwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi10ZW5zb3ItdmFsdWUtdmlldyI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0ZW5zb3JWYWx1ZVRvYXN0IiB0ZXh0PSIiIGFsd2F5cy1vbi10b3A+PC9wYXBlci10b2FzdD4KICAgIDx0YWJsZSBjbGFzcz0idGVuc29yLXZhbHVlLXZpZXctdGFibGUiPgogICAgICA8dHI+CiAgICAgICAgPHRkIGNvbHNwYW49IjIiPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gaWQ9InRlbnNvci1uYW1lIiBvbi10YXA9InRlbnNvck5hbWVDYWxsYmFjayI+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRlbnNvci1uYW1lLXRleHQiPltbdGVuc29yTmFtZV1dPC9zcGFuPgogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJjbG9zZSIgY2xhc3M9InZhbHVlLXZpZXctaWNvbi1idXR0b24iIGlkPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiB0aXRsZT0iQ2xvc2UiIG9uLXRhcD0iY2xvc2VCdXR0b25DYWxsYmFjayI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249ImZvcndhcmQiIGNsYXNzPSJ2YWx1ZS12aWV3LWljb24tYnV0dG9uIiBpZD0idmFsdWUtdmlldy1pY29uLWJ1dHRvbiIgdGl0bGU9IkNvbnRpbnVlIHRvIiBvbi10YXA9ImNvbnRpbnVlVG9CdXR0b25DYWxsYmFjayI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0ciBjbGFzcz0idGVuc29yLXZhbHVlLXZhbHVlLXRyIj4KICAgICAgICA8dGQ+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3VzZVRlbnNvcldpZGdldF1dIj4KICAgICAgICAgICAgPGRpdiBpZD0idGVuc29yLXdpZGdldCI+PC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX3VzZVRlbnNvcldpZGdldF1dIj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gaWQ9ImRlYnVnLW9wIj48L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbmxpbmUgdmFsdWUtY2FyZC1pbnB1dCIgbGFiZWw9IlNsaWNpbmciIGlkPSJzbGljaW5nIiB2YWx1ZT0ie3tzbGljaW5nfX0iIG9uLWNoYW5nZT0icmVmcmVzaCI+CiAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGNsYXNzPSJpbmxpbmUgdmFsdWUtY2FyZC1pbnB1dCIgbGFiZWw9IlRpbWUgSW5kaWNlcyIgaWQ9InRpbWUtaW5kaWNlcyIgdmFsdWU9Int7dGltZUluZGljZXN9fSIgb24tY2hhbmdlPSJyZWZyZXNoIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBpZD0idGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iIGNsYXNzPSJ0ZW5zb3ItdmFsdWUtYnV0dG9ucyIgb24tY2xpY2s9Il90aW1lSW5kaWNlc1RvZ2dsZUJ1dHRvbkNhbGxiYWNrIj5GdWxsIEhpc3Rvcnk8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICAgICAgPC9kaXY+PC90ZW1wbGF0ZT48L3RkPjx0ZCBjbGFzcz0idGVuc29yLXZhbHVlLXZpZXctdGQiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1ZhbHVlU2NhbGFyXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgY2xhc3M9ImlubGluZSIgbGFiZWw9IlNjYWxhciBWYWx1ZSIgaWQ9InZhbHVlLXNjYWxhciIgdmFsdWU9IltbX2RhdGFTY2FsYXJdXSI+CiAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1ZhbHVlTGluZUNoYXJ0XV0iPgogICAgICAgICAgICAgICAgICA8dGYtZGVidWdnZXItbGluZS1jaGFydCBkYXRhPSJbW19saW5lQ2hhcnREYXRhXV0iPjwvdGYtZGVidWdnZXItbGluZS1jaGFydD4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVmFsdWVJbWFnZV1dIj4KICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz0idmFsdWUtaW1hZ2UiIGhlaWdodD0iMjUwcHgiIHdpZHRoPSIyNTBweCIgc3JjJD0iW1tfZGF0YUltYWdlU3JjXV0iPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAKICAgICAgICAgIAogICAgICAgIAogICAgICA8L3RyPgogICAgPC90YWJsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGVuc29yLXdpZGdldC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnRlbnNvci12YWx1ZS1idXR0b25zIHsKICAgICAgICBoZWlnaHQ6IDc1JTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgIH0KICAgICAgLnRlbnNvci12YWx1ZS12aWV3LXRhYmxlIHsKICAgICAgICB3aWR0aDogNTAwcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLXRhYmxlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiA1cHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogM3B4OwogICAgICAgIHBhZGRpbmctbGVmdDogM3B4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjhmOGY4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggMXB4IDFweCAjZDhkOGQ4OwogICAgICB9CiAgICAgIC50ZW5zb3ItdmFsdWUtdmlldy10ZCB7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICB9CiAgICAgIC52YWx1ZS1jYXJkLWlucHV0IHsKICAgICAgICB3aWR0aDogMTUwcHg7CiAgICAgIH0KICAgICAgI3RlbnNvci1uYW1lIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICAgIC50ZW5zb3ItbmFtZS10ZXh0IHsKICAgICAgICBjb2xvcjogYmx1ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQogICAgICAjZGVidWctb3AgewogICAgICAgIGZvbnQtc2l6ZTogOTAlOwogICAgICB9CiAgICAgIC52YWx1ZS1pbWFnZSB7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgIH0KICAgICAgLnZhbHVlLXZpZXctaWNvbi1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgd2lkdGg6IDIwJTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZm9udC1zaXplOiA5MCU7CiAgICAgICAgY29sb3I6IGJsdWU7CiAgICAgIH0KICAgICAgI3RlbnNvci13aWRnZXQgewogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJnYigxNjAsIDE2MCwgMTYwKTsKICAgICAgICAvKiBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OwogICAgICAgIC13ZWJraXQtYm94LXNpemluZzogY29udGVudC1ib3g7ICovCiAgICAgICAgaGVpZ2h0OiAyODBweDsKICAgICAgICB3aWR0aDogNDg0cHg7CiAgICAgIH0KICAgICAgI3NsaWNpbmcsCiAgICAgICN0aW1lLWluZGljZXMgewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJtdWx0aVZpZXciPgogICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5UZW5zb3IgVmFsdWVzPC9kaXY+CiAgICAgIDxkaXYgaWQ9Im11bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciI+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAjbXVsdGlWaWV3IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOwogICAgICAgIHBhZGRpbmctdG9wOiAzcHg7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAzcHg7CiAgICAgICAgcGFkZGluZy1yaWdodDogM3B4OwogICAgICAgIGJveC1zaGFkb3c6IDNweCAzcHggI2VlZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRlYnVnZ2VyLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHBhcGVyLXRvYXN0IGlkPSJ0b2FzdCIgdGV4dD0iIiBhbHdheXMtb24tdG9wPjwvcGFwZXItdG9hc3Q+CiAgICA8dGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2cgaWQ9ImluaXRpYWxEaWFsb2ciPjwvdGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2c+CiAgICAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIiBpZD0ibGVmdC1wYW5lIj4KICAgICAgICA8ZGl2IGlkPSJub2RlLWVudHJpZXMiIGNsYXNzPSJub2RlLWVudHJpZXMiPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+UnVudGltZSBOb2RlIExpc3Q8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSI+CiAgICAgICAgICAgIFNob3cgQ29kZToKICAgICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2xhc3M9InRvZ2dsZS1zb3VyY2UtY29kZSIgaWQ9InNob3ctc291cmNlLWNvZGUiIGNoZWNrZWQ9Int7X3NvdXJjZUNvZGVTaG93bn19Ij48L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0Zi1vcC1zZWxlY3RvciBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZGVidWctd2F0Y2gtY2hhbmdlPSJbW19jcmVhdGVEZWJ1Z1dhdGNoQ2hhbmdlSGFuZGxlcigpXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZm9yY2UtZXhwYW5kLWFuZC1jaGVjay1ub2RlLW5hbWU9IltbX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZV1dIiBmb3JjZS1leHBhbmQtbm9kZS1uYW1lPSJbW19mb3JjZUV4cGFuZE5vZGVOYW1lXV0iPgogICAgICAgICAgPC90Zi1vcC1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSJzb3VyY2UtY29kZS12aWV3LWRpdiIgY2xhc3M9InNvdXJjZS1jb2RlLXZpZXctZGl2IiBoaWRkZW4kPSJ7eyFfc291cmNlQ29kZVNob3dufX0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iZGVidWdnZXItc2VjdGlvbi10aXRsZSI+U291cmNlIENvZGU8L2Rpdj4KICAgICAgICAgIDx0Zi1zb3VyY2UtY29kZS12aWV3IGlkPSJzb3VyY2VDb2RlVmlldyIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIiBkZWJ1Zy13YXRjaGVzPSJbW19kZWJ1Z1dhdGNoZXNdXSIgZm9jdXMtbm9kZS1uYW1lPSJbW19zb3VyY2VGb2N1c05vZGVOYW1lXV0iIG5vZGUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgY29udGludWUtdG8tbm9kZT0iW1tfY3JlYXRlQ29udGludWVUb05vZGVIYW5kbGVyKCldXSI+PC90Zi1zb3VyY2UtY29kZS12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDx0Zi1kZWJ1Z2dlci1yZXNpemVyIGN1cnJlbnQtbGVuZ3RoPSJ7e19sZWZ0UGFuZVdpZHRofX0iIG1pbi1sZW5ndGg9IltbX21pbmxlZnRQYW5lV2lkdGhdXSIgbWF4LWxlbmd0aD0iW1tfbWF4bGVmdFBhbmVXaWR0aF1dIj4KICAgICAgICA8L3RmLWRlYnVnZ2VyLXJlc2l6ZXI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDx0Zi1zZXNzaW9uLXJ1bnMtdmlldyBpZD0ic2Vzc2lvblJ1bnNWaWV3IiBsYXRlc3Qtc2Vzc2lvbi1ydW49IltbX2xhdGVzdFNlc3Npb25SdW5dXSIgc2Vzc2lvbi1ydW4ta2V5LXRvLWRldmljZS1uYW1lcz0iW1tfc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc11dIiBzb2xlLWFjdGl2ZT0iW1tfc2Vzc2lvblJ1blNvbGVBY3RpdmVdXSIgbm9kZS1vci10ZW5zb3ItY2xpY2tlZD0iW1tfY3JlYXRlRmVlZEZldGNoVGFyZ2V0Q2xpY2tlZEhhbmRsZXIoKV1dIj4KICAgICAgICAgIDwvdGYtc2Vzc2lvbi1ydW5zLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucy1jb250YWluZXIiPgogICAgICAgICAgPHBhcGVyLWJ1dHRvbiByYWlzZWQgY2xhc3M9ImNvbnRpbnVlLWJ1dHRvbiIgb24tY2xpY2s9Il9zdGVwIj4KICAgICAgICAgICAgPHNwYW4+W1tfc3RlcEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPHRmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZyBpZD0iY29udGludWVEaWFsb2ciIHNlc3Npb24tcnVuLWdvPSJbW19jcmVhdGVTZXNzaW9uUnVuR28oKV1dIiB0ZW5zb3ItY29uZGl0aW9uLWdvPSJbW19jcmVhdGVUZW5zb3JDb25kaXRpb25HbygpXV0iIGZvcmNlLWNvbnRpbnVhdGlvbi1zdG9wPSJbW19jcmVhdGVGb3JjZUNvbnRpbnVhdGlvblN0b3AoKV1dIj4KICAgICAgICAgIDwvdGYtZGVidWdnZXItY29udGludWUtZGlhbG9nPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICA8dGYtZ3JhcGgtbG9hZGVyIGlkPSJsb2FkZXIiIG91dC1ncmFwaC1oaWVyYXJjaHk9Int7Z3JhcGhIaWVyYXJjaHl9fSIgb3V0LWdyYXBoPSJ7e2dyYXBofX0iIG91dC1zdGF0cz0ie3tzdGF0c319IiBwcm9ncmVzcz0ie3tfZ3JhcGhQcm9ncmVzc319Ij48L3RmLWdyYXBoLWxvYWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIiBpZD0iY2VudGVyLWNvbnRlbnQiPgogICAgICAgIDxkaXYgaWQ9InRvcC1yaWdodC1xdWFkcmFudCI+CiAgICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfdG9wUmlnaHRTZWxlY3RlZH19Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdG9wUmlnaHRUYWJzXV0iPgogICAgICAgICAgICAgIDxwYXBlci10YWIgaWQ9IltbaXRlbS5pZF1dIj5bW2l0ZW0ubmFtZV1dPC9wYXBlci10YWI+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLXRhYnM+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJydW50aW1lLWdyYXBoLWRldmljZSI+CiAgICAgICAgICAgIDxzcGFuIGlkPSJydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIj4gPC9zcGFuPgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBpZD0iYWN0aXZlLXJ1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIiBsYWJlbD0iRGV2aWNlIG5hbWUiIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWV9fSI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXNdXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgY2xhc3M9InNwaW5uZXIiIGlkPSJ0b3AtcmlnaHQtc3Bpbm5lciIgaGlkZGVuPSJbWyFfYnVzeV1dIiBhY3RpdmU9IltbX2J1c3ldXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgaWQ9InRvcC1yaWdodC1wcm9ncmVzcy1iYXIiIHZhbHVlPSIwIj48L3BhcGVyLXByb2dyZXNzPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZV1dIj4KICAgICAgICAgICAgPGRpdiBpZD0iZ3JhcGgtY29udGFpbmVyIj4KICAgICAgICAgICAgICA8dGYtZ3JhcGggaWQ9ImdyYXBoIiBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgYmFzaWMtZ3JhcGg9IltbZ3JhcGhdXSIgc3RhdHM9Iltbc3RhdHNdXSIgcHJvZ3Jlc3M9Int7X2dyYXBoUHJvZ3Jlc3N9fSIgY29sb3ItYnk9InN0cnVjdHVyZSIgY29sb3ItYnktcGFyYW1zPSJ7e2NvbG9yQnlQYXJhbXN9fSIgcmVuZGVyLWhpZXJhcmNoeT0ie3tfcmVuZGVySGllcmFyY2h5fX0iIG5vZGUtY29udGV4dC1tZW51LWl0ZW1zPSJbW19jcmVhdGVOb2RlQ29udGV4dE1lbnVJdGVtcygpXV0iPjwvdGYtZ3JhcGg+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udGV4dC1tZW51Ij48L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1RvcFJpZ2h0VGVuc29yVmFsdWVzQWN0aXZlXV0iPgogICAgICAgICAgICA8dGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXcgaWQ9InRlbnNvclZhbHVlTXVsdGlWaWV3IiBjb250aW51ZS10by1jYWxsYmFjaz0iW1tfY3JlYXRlQ29udGludWVUb0NhbGxiYWNrKCldXSIgdGVuc29yLW5hbWUtY2xpY2tlZD0iW1tfY3JlYXRlTm9kZUNsaWNrZWRIYW5kbGVyKCldXSIgZ2V0LWhlYWx0aC1waWxsPSJbW19jcmVhdGVHZXRIZWFsdGhQaWxsKCldXSI+CiAgICAgICAgICAgIDwvdGYtdGVuc29yLXZhbHVlLW11bHRpLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8dGYtZGVidWdnZXItcmVzaXplciBpcy1ob3Jpem9udGFsPSJ0cnVlIiBjdXJyZW50LWxlbmd0aD0ie3tfdG9wUmlnaHRRdWFkcmFudEhlaWdodH19IiBtaW4tbGVuZ3RoPSJbW19taW5Ub3BSaWdodFF1YWRyYW50SGVpZ2h0XV0iIG1heC1sZW5ndGg9IltbX21heFRvcFJpZ2h0UXVhZHJhbnRIZWlnaHRdXSI+CiAgICAgICAgPC90Zi1kZWJ1Z2dlci1yZXNpemVyPgoKICAgICAgICA8ZGl2IGlkPSJ0ZW5zb3ItZGF0YSIgY2xhc3M9InRlbnNvci1kYXRhIj4KICAgICAgICAgIDx0Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5IGlkPSJ0ZW5zb3JEYXRhU3VtbWFyeSIgbGF0ZXN0LXRlbnNvci1kYXRhPSJbW19sYXRlc3RUZW5zb3JEYXRhXV0iIGV4cGFuZC1oYW5kbGVyPSJbW19jcmVhdGVUZW5zb3JEYXRhRXhwYW5kSGFuZGxlcigpXV0iIGNvbnRpbnVlLXRvLWNhbGxiYWNrPSJbW19jcmVhdGVDb250aW51ZVRvQ2FsbGJhY2soKV1dIiBoaWdobGlnaHRlZC1ub2RlLW5hbWU9IltbX2hpZ2hsaWdodE5vZGVOYW1lXV0iIHRlbnNvci1uYW1lLWNsaWNrZWQ9IltbX2NyZWF0ZU5vZGVDbGlja2VkSGFuZGxlcigpXV0iIGdldC1oZWFsdGgtcGlsbD0iW1tfY3JlYXRlR2V0SGVhbHRoUGlsbCgpXV0iPgogICAgICAgICAgPC90Zi10ZW5zb3ItZGF0YS1zdW1tYXJ5PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIHBhcGVyLXRvYXN0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMTAlOwogICAgICAgIHdpZHRoOiA0MHZ3OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzMHZ3OwogICAgICB9CiAgICAgIHRmLWRhc2hib2FyZC1sYXlvdXQgewogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLWJhc2lzOiBhdXRvOwogICAgICAgIC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aDogbm9uZTsKICAgICAgICAtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1taW4td2lkdGg6IG5vbmU7CiAgICAgIH0KICAgICAgLmRlYnVnZ2VyLXNlY3Rpb24tdGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTEwJTsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICBwYXBlci10YWJzIHsKICAgICAgICBjb2xvcjogIzU1NTsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIHBhcGVyLXRhYi5pcm9uLXNlbGVjdGVkIHsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgI2luaXRpYWxEaWFsb2cgewogICAgICAgIC8qKiBUaGlzIG1hdGNoZXMgdGhlIGRlZmF1bHQgei1pbmRleCBvZiBwYXBlci1kaWFsb2cgYmFja2Ryb3BzLiAqLwogICAgICAgIHotaW5kZXg6IDEwMjsKICAgICAgfQogICAgICAvKiogUmVzaXplIHRoZSByZWdpb24gZm9yIHRoZSBncmFwaCBhcyB0aGUgdXNlciByZXNpemVzIHRoZSByZWdpb24uICovCiAgICAgICNncmFwaC1jb250YWluZXIgewogICAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gMTIwcHgpOwogICAgICAgIC8qKiBDbGlwIHRoZSBtaW5pbWFwIGlmIHRoZSBoZWlnaHQgb2YgdGhlIGdyYXBoIGNvbnRhaW5lciBpcyBzbWFsbC4gKi8KICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICAjZ3JhcGggewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CiAgICAgICN0b29sdGlwLXNvcnRpbmctbGFiZWwgewogICAgICAgIG1hcmdpbi10b3A6IDEzcHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgICN4LXR5cGUtc2VsZWN0b3IgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW46IDVweCAzcHg7CiAgICAgIH0KICAgICAgLnJ1bnRpbWUtZ3JhcGgtZGV2aWNlIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgICNydW50aW1lLWdyYXBoLWRldmljZS1uYW1lIHsKICAgICAgICBmb250LXNpemU6IDg1JTsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay1hbGw7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICAgICNhY3RpdmUtcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSB7CiAgICAgICAgZm9udC1zaXplOiA4NSU7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgICAjdG9wLXJpZ2h0LXByb2dyZXNzLWJhciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgICAuc2lkZWJhciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXg6IHZpc2libGU7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgdGYtZGVidWdnZXItcmVzaXplciB7CiAgICAgICAgcmlnaHQ6IC0xMHB4OwogICAgICB9CiAgICAgICNjZW50ZXItY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CiAgICAgIC8qKiBUaGUgcmVzaXplciBzaG91bGQgaGF2ZSBubyBzcGFjZSB0byB0aGUgbGVmdCBvZiBpdC4gKi8KICAgICAgI2NlbnRlci1jb250ZW50IHRmLWRlYnVnZ2VyLXJlc2l6ZXJbaXMtaG9yaXpvbnRhbF0gewogICAgICAgIG1hcmdpbi1sZWZ0OiAtMjNweDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDRkNGQ0OwogICAgICB9CiAgICAgIC5zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgICAubm9kZS1lbnRyaWVzIHsKICAgICAgICBib3gtc2hhZG93OiAzcHggM3B4ICNkZGQ7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBoZWlnaHQ6IDgwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc291cmNlLWNvZGUtdmlldy1kaXYgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDQwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcGFkZGluZy10b3A6IDNweDsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDNweDsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAzcHg7CiAgICAgICAgYm94LXNoYWRvdzogM3B4IDNweCAjZGRkOwogICAgICB9CiAgICAgICNzZXNzaW9uUnVuc1ZpZXcgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiAyNXZoOwogICAgICB9CiAgICAgIC5idXR0b25zLWNvbnRhaW5lciB7CiAgICAgICAgcGFkZGluZzogMjBweCAwOwogICAgICB9CiAgICAgICN0ZW5zb3ItZGF0YSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDIwcHggMDsKICAgICAgICBtYXJnaW46IDAgMCAyMHB4IDA7CiAgICAgIH0KICAgICAgI3RlbnNvckRhdGFTdW1tYXJ5IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICB9CiAgICAgICN0b3AtcmlnaHQtcXVhZHJhbnQgewogICAgICAgIGhlaWdodDogNjYlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC50b2dnbGUtc291cmNlLWNvZGUgewogICAgICAgIG1hcmdpbi1yaWdodDogMWVtOwogICAgICAgIGZvbnQtc2l6ZTogODAlOwogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQogICAgICAuY29udGV4dC1tZW51IHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGkgewogICAgICAgIHBhZGRpbmc6IDRweCAxNnB4OwogICAgICB9CiAgICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICB9CiAgICAgIC5pbmxpbmUsCiAgICAgIHBhcGVyLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGlubGluZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydCB7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci1tYXRlcmlhbC1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjEiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIyIl0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMyJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjQiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSI1Il0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLW1hdGVyaWFsIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItbWF0ZXJpYWwtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy10cmFuc2l0aW9uOwogICAgICB9CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIHsKICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIGgyIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgewogICAgICAgIG1hcmdpbjogMTBweCAxMHB4IDEwcHggMDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC5jb2xvci1wcmV2aWV3IHsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtYXJnaW46IDAgMTBweCAwIDA7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAuY29sb3ItbGFiZWwsCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAudGVuc29yLWNvdW50IHsKICAgICAgICBjb2xvcjogIzc3NzsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMjJweDsKICAgICAgICBsaW5lLWhlaWdodDogMjZweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgLnRlbnNvci1jb3VudCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAjaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgLyogMzEgY29tZXMgZnJvbSBhZGRpbmcgYSBwYWRkaW5nIG9mIDE1cHggZnJvbSBib3RoIHNpZGVzIG9mIHRoZSBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nCiAgICogMXB4IHNvIHRoYXQgdGhlIHNsaWRlciB3aWR0aCBhbGlnbnMgd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwKICAgKiBhbmQgYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZiB0aGUgaW1hZ2UuIDMwIC0gMSArIDIuCiAgICogQXBwYXJlbnRseSwgdGhlIHBhcGVyLXNsaWRlciBsYWNrcyBhIG1peGluIGZvciB0aG9zZSBwYWRkaW5nIHZhbHVlcy4gKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgIH0KCiAgICAgICNoZWFsdGgtcGlsbHMtbG9hZGluZy1zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI2hlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNudW1lcmljLWFsZXJ0cy10YWJsZSB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlIHRkIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIHdpZHRoOiA4MHB4OwogICAgICB9CgogICAgICAudGVuc29yLWRldmljZS10ZCB7CiAgICAgICAgbWF4LXdpZHRoOiAxNDBweDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjMjY2MjM2OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGU6aG92ZXIgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5kZXZpY2Utc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCB7CiAgICAgICAgd2lkdGg6IDEzMHB4OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCA+IGRpdiB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQoKICAgICAgI2V2ZW50LWNvdW50cy10aCB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLm5lZ2F0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYigyNTUsIDE0MSwgMCk7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5wb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMCwgNjIsIDIxMik7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMjA0LCA0NywgNDQpOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICB9CgogICAgICAubmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiwKICAgICAgLnBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24sCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5uby1udW1lcmljLWFsZXJ0cy1ub3RpZmljYXRpb24gewogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJjYXJkIGhlYWx0aC1waWxsLWxlZ2VuZCI+CiAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICBFbmFibGUgYWxsIChub3QganVzdCBzYW1wbGVkKSBzdGVwcy4gUmVxdWlyZXMgc2xvdyBkaXNrIHJlYWQuCiAgICAgIDwvZGl2PgogICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBpZD0iZW5hYmxlQWxsU3RlcHNNb2RlVG9nZ2xlIiBjaGVja2VkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSI+CiAgICAgIDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgPGgyPgogICAgICAgIFN0ZXAgb2YgSGVhbHRoIFBpbGxzOgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgICAgPGlucHV0IHR5cGU9Im51bWJlciIgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IiBtaW49IjAiIG1heD0iW1tfYmlnZ2VzdFN0ZXBFdmVyU2Vlbl1dIiB2YWx1ZT0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOjppbnB1dH19Ij4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shYWxsU3RlcHNNb2RlRW5hYmxlZF1dIj4KICAgICAgICAgIFtbX2N1cnJlbnRTdGVwRGlzcGxheVZhbHVlXV0KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIWFyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBpZD0iaGVhbHRoLXBpbGxzLWxvYWRpbmctc3Bpbm5lciI+PC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgIDwvaDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1thbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtc2xpZGVyIiBpbW1lZGlhdGUtdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IiBtYXg9IltbX2JpZ2dlc3RTdGVwRXZlclNlZW5dXSIgc25hcHMgc3RlcD0iMSIgdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19Ij48L3BhcGVyLXNsaWRlcj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFhbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbWF4U3RlcEluZGV4XV0iPgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0iaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIiIGltbWVkaWF0ZS12YWx1ZT0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iIG1heD0iW1tfbWF4U3RlcEluZGV4XV0iIHNuYXBzIHN0ZXA9IjEiIHZhbHVlPSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSI+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGgyPgogICAgICAgIEhlYWx0aCBQaWxsCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGVdXSI+CiAgICAgICAgICBDb3VudHMgZm9yIFNlbGVjdGVkIE5vZGUKICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shaGVhbHRoUGlsbFZhbHVlc0ZvclNlbGVjdGVkTm9kZV1dIj4KICAgICAgICAgIExlZ2VuZAogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvaDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbaGVhbHRoUGlsbEVudHJpZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhbHRoLXBpbGwtZW50cnkiPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItcHJldmlldyIgc3R5bGU9ImJhY2tncm91bmQ6W1tpdGVtLmJhY2tncm91bmRfY29sb3JdXSI+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sYWJlbCI+W1tpdGVtLmxhYmVsXV08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRlbnNvci1jb3VudCI+CiAgICAgICAgICAgIFtbX2NvbXB1dGVUZW5zb3JDb3VudFN0cmluZyhoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlLAogICAgICAgICAgICBpbmRleCldXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgaGlkZGVuJD0iW1shX2hhc0RlYnVnZ2VyTnVtZXJpY0FsZXJ0cyhkZWJ1Z2dlck51bWVyaWNBbGVydHMpXV0iPgogICAgICAgIDxoMiBpZD0ibnVtZXJpYy1hbGVydHMtaGVhZGVyIj5OdW1lcmljIEFsZXJ0czwvaDI+CiAgICAgICAgPHA+CiAgICAgICAgICBBbGVydHMgYXJlIHNvcnRlZCBmcm9tIHRvcCB0byBib3R0b20gYnkgaW5jcmVhc2luZyB0aW1lc3RhbXAuCiAgICAgICAgCiAgICAgICAgPGRpdiBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUtY29udGFpbmVyIj4KICAgICAgICAgIDx0YWJsZSBpZD0ibnVtZXJpYy1hbGVydHMtdGFibGUiPgogICAgICAgICAgICA8dGhlYWQ+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRoPkZpcnN0IE9mZmVuc2U8L3RoPgogICAgICAgICAgICAgICAgPHRoPlRlbnNvciAoRGV2aWNlKTwvdGg+CiAgICAgICAgICAgICAgICA8dGggaWQ9ImV2ZW50LWNvdW50cy10aCI+RXZlbnQgQ291bnRzPC90aD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3RoZWFkPgogICAgICAgICAgICA8dGJvZHkgaWQ9Im51bWVyaWMtYWxlcnRzLWJvZHkiPjwvdGJvZHk+CiAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyldXSI+CiAgICAgICAgPHAgY2xhc3M9Im5vLW51bWVyaWMtYWxlcnRzLW5vdGlmaWNhdGlvbiI+CiAgICAgICAgICBObyBudW1lcmljIGFsZXJ0cyBzbyBmYXIuIFRoYXQgaXMgbGlrZWx5IGdvb2QuIEFsZXJ0cyBpbmRpY2F0ZSB0aGUKICAgICAgICAgIHByZXNlbmNlIG9mIE5hTiBvciAoKy8tKSBJbmZpbml0eSB2YWx1ZXMsIHdoaWNoIG1heSBiZSBjb25jZXJuaW5nLgogICAgICAgIAogICAgICAKICAgIAogIAogIAoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tbGlzdCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWF4LWRldmljZS1waXhlbC1yYXRpbzogMSkgewogICAgICAgIDpob3N0IHsKICAgICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgICAgfQogICAgICB9CgogICAgICAjaXRlbXMgewogICAgICAgIEBhcHBseSAtLWlyb24tbGlzdC1pdGVtcy1jb250YWluZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtncmlkXSkpICNpdGVtcyA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNpdGVtcyA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxhcnJheS1zZWxlY3RvciBpZD0ic2VsZWN0b3IiIGl0ZW1zPSJ7e2l0ZW1zfX0iIHNlbGVjdGVkPSJ7e3NlbGVjdGVkSXRlbXN9fSIgc2VsZWN0ZWQtaXRlbT0ie3tzZWxlY3RlZEl0ZW19fSI+PC9hcnJheS1zZWxlY3Rvcj4KCiAgICA8L3RlbXBsYXRlPjwvZG9tLW1vZHVsZT48ZGl2IGlkPSJpdGVtcyI+CiAgICAgIDxzbG90Pjwvc2xvdD4KICAgIDwvZGl2PgoKICA8L3RlbXBsYXRlPgo8L3BhcGVyLW1hdGVyaWFsPjwvdGVtcGxhdGU+PC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWl0ZW0tYm9keSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsgLyogbmVlZGVkIGZvciB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcyB0byB3b3JrIG9uIGZmICovCiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICB9CgogICAgICA6aG9zdChbdHdvLWxpbmVdKSB7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXR3by1saW5lLW1pbi1oZWlnaHQsIDcycHgpOwogICAgICB9CgogICAgICA6aG9zdChbdGhyZWUtbGluZV0pIHsKICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLWJvZHktdGhyZWUtbGluZS1taW4taGVpZ2h0LCA4OHB4KTsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoW3NlY29uZGFyeV0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeS1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtaWNvbiI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAwOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCB7CiAgICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtZWxsaXBzZSB7CiAgICAgICAgZmlsbDogdXJsKCNlbGxpcHNlSGF0Y2gpOwogICAgICB9CgogICAgICAuZmFkZWQtcmVjdCwKICAgICAgLmZhZGVkLWVsbGlwc2UsCiAgICAgIC5mYWRlZC1zZXJpZXMgewogICAgICAgIHN0cm9rZTogdmFyKC0tdGItZ3JhcGgtZmFkZWQpICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgICAgI3JlY3RIYXRjaCBsaW5lLAogICAgICAjZWxsaXBzZUhhdGNoIGxpbmUgewogICAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgICAgc3Ryb2tlOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICAKICAgIDxzdmcgaGVpZ2h0PSIwIiB3aWR0aD0iMCIgaWQ9InN2Z0RlZnMiPgogICAgICA8ZGVmcz4KICAgICAgICAKICAgICAgICA8cGF0dGVybiBpZD0icmVjdEhhdGNoIiBwYXR0ZXJudHJhbnNmb3JtPSJyb3RhdGUoNDUgMCAwKSIgd2lkdGg9IjUiIGhlaWdodD0iNSIgcGF0dGVybnVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CiAgICAgICAgICA8bGluZSB4MT0iMCIgeTE9IjAiIHgyPSIwIiB5Mj0iNSIgc3R5bGU9InN0cm9rZS13aWR0aDogMSIgLz4KICAgICAgICA8L3BhdHRlcm4+CiAgICAgICAgPHBhdHRlcm4gaWQ9ImVsbGlwc2VIYXRjaCIgcGF0dGVybnRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiIHdpZHRoPSIyIiBoZWlnaHQ9IjIiIHBhdHRlcm51bml0cz0idXNlclNwYWNlT25Vc2UiPgogICAgICAgICAgPGxpbmUgeDE9IjAiIHkxPSIwIiB4Mj0iMCIgeTI9IjIiIHN0eWxlPSJzdHJva2Utd2lkdGg6IDEiIC8+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLXN0YW1wIiByeD0iNy41IiByeT0iMyIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxlbGxpcHNlIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHJ4PSI1IiByeT0iMiIgc3Ryb2tlPSJpbmhlcml0IiBmaWxsPSJpbmhlcml0IiAvPgogICAgICAgIAogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjYiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIiAvPgogICAgICAgIDwvZz4KICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiIC8+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCIgLz4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjQiIC8+CiAgICAgICAgPC9nPgogICAgICAgIDxnIGlkPSJzdW1tYXJ5LWljb24iIGZpbGw9IiM4NDg0ODQiIGhlaWdodD0iMTIiIHZpZXdib3g9IjAgMCAyNCAyNCIgd2lkdGg9IjEyIj4KICAgICAgICAgIDxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiIC8+CiAgICAgICAgPC9nPgogICAgICA8L2RlZnM+CiAgICA8L3N2Zz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNUeXBlKHR5cGUsICdDT05TVCcpXV0iPgogICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxMCAxMCI+CiAgICAgICAgPGNpcmNsZSBjeD0iNSIgY3k9IjUiIHI9IjMiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnU1VNTUFSWScpXV0iPgogICAgICA8c3ZnIHdpZHRoJD0iW1toZWlnaHRdXSIgaGVpZ2h0JD0iW1toZWlnaHRdXSIgdmlld2JveD0iMCAwIDI0IDI0IiBmaWxsPSIjODQ4NDg0Ij4KICAgICAgICA8cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6IiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnT1AnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMTYgOCI+CiAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdlbGxpcHNlJyl9fSIgeD0iOCIgeT0iNCIgLz4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ01FVEEnKV1dIj4KICAgICAgPHN2ZyBoZWlnaHQkPSJbW2hlaWdodF1dIiBwcmVzZXJ2ZWFzcGVjdHJhdGlvPSJ4TWluWU1pZCBtZWV0IiB2aWV3Ym94PSIwIDAgMzcgMTYiPgogICAgICAgIDxyZWN0IHg9IjEiIHk9IjEiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdyZWN0Jyl9fSIgc3Ryb2tlLXdpZHRoPSIycHgiIGhlaWdodD0iMTQiIHdpZHRoPSIzNSIgcng9IjUiIHJ5PSI1IiAvPgogICAgICA8L3N2Zz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVHlwZSh0eXBlLCAnU0VSSUVTJyldXSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1t2ZXJ0aWNhbF1dIj4KICAgICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAxNiAxNSI+CiAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjb3Atc2VyaWVzLXZlcnRpY2FsLXN0YW1wIiBmaWxsJD0iW1tfZmlsbF1dIiBzdHJva2UkPSJbW19zdHJva2VdXSIgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnc2VyaWVzJyl9fSIgeD0iMCIgeT0iMiIgLz4KICAgICAgICA8L3N2Zz4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyF2ZXJ0aWNhbF1dIj4KICAgICAgICA8c3ZnIGhlaWdodCQ9IltbaGVpZ2h0XV0iIHByZXNlcnZlYXNwZWN0cmF0aW89InhNaW5ZTWlkIG1lZXQiIHZpZXdib3g9IjAgMCAyNCAxMCI+CiAgICAgICAgICA8dXNlIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB4bGluazpocmVmPSIjb3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiIGZpbGwkPSJbW19maWxsXV0iIHN0cm9rZSQ9IltbX3N0cm9rZV1dIiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdzZXJpZXMnKX19IiB4PSIwIiB5PSIxIiAvPgogICAgICAgIDwvc3ZnPgogICAgICA8L3RlbXBsYXRlPgogICAgPC90ZW1wbGF0ZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ub2RlLWljb24iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgLS10Yi1ncmFwaC1mYWRlZDogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRmLWdyYXBoLWljb24gaWQ9Imljb24iIHR5cGU9IltbX2dldFR5cGUobm9kZSwgc3VtbWFyeSwgY29uc3QsIHR5cGUpXV0iIGhlaWdodD0iW1toZWlnaHRdXSIgZmlsbC1vdmVycmlkZT0iW1tfZmlsbE92ZXJyaWRlXV0iIHN0cm9rZS1vdmVycmlkZT0iW1tfZ2V0U3Ryb2tlT3ZlcnJpZGUoX2ZpbGxPdmVycmlkZSldXSIgZmFkZWQ9IltbX2dldEZhZGVkKHJlbmRlckluZm8pXV0iIHZlcnRpY2FsPSJbW19pc1ZlcnRpY2FsKG5vZGUsIHZlcnRpY2FsKV1dIj48L3RmLWdyYXBoLWljb24+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAjbGlzdC1pdGVtIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAjbGlzdC1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1nb29nbGUteWVsbG93LTEwMCk7CiAgICAgIH0KCiAgICAgIC5jbGlja2FibGUgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuIHsKICAgICAgICBtYXJnaW4tbGVmdDogNDBweDsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbS5leGNsdWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuLmVkZ2UtbGFiZWwgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDNweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMXB4OwogICAgICAgIGxlZnQ6IDJweDsKICAgICAgfQoKICAgICAgLmZhZGVkIHNwYW4gewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1mYWRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0ibGlzdC1pdGVtIiBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIiBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciI+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uIGNsYXNzPSJub2RlLWljb24iIGhlaWdodD0iMTIiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgbm9kZT0iW1tpdGVtTm9kZV1dIiByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIiB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgIDwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXgtaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgLmluY29tcGF0aWJsZS1vcHMtbGlzdCB7CiAgICAgICAgaGVpZ2h0OiAzNTBweDsKICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDsKICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICBpcm9uLWxpc3QgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1pdGVtIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGJhY2tncm91bmQ6ICNlOWU5ZTk7CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0tYm9keVt0d28tbGluZV0gewogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHggNHB4OwogICAgICB9CgogICAgICAuZXhwYW5kZWRJbmZvIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLm5vZGUtbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5zdWJ0aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIGNvbG9yOiAjNWU1ZTVlOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5ub24tY29udHJvbC1saXN0LWl0ZW0gewogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC1kaXNwbGF5IHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgc3ZnLm9wLWNvbXBhdCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGhlaWdodDogMjVweDsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC12YWx1ZSB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6IGJsYWNrOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pdGVtPgogICAgICA8cGFwZXItaXRlbS1ib2R5IHR3by1saW5lPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfZXhwYW5kZWQpfX0iIG9uLWNsaWNrPSJfdG9nZ2xlRXhwYW5kZWQiIGNsYXNzPSJ0b2dnbGUtYnV0dG9uIj4KICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJub2RlLW5hbWUiIGlkPSJub2RldGl0bGUiPltbbm9kZVRpdGxlXV08L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ib3AtY29tcGF0LWRpc3BsYXkiPgogICAgICAgICAgICAgIDxzdmcgY2xhc3M9Im9wLWNvbXBhdCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDI1MCAyNSI+CiAgICAgICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICAgICAgPGxpbmVhcmdyYWRpZW50IGlkPSJvcC1jb21wYXQtZmlsbCI+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0PSIwIiBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIiBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIj48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3Agb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIiBzdG9wLWNvbG9yJD0iW1tfb3BJbmNvbXBhdENvbG9yXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3IkPSJbW19vcEluY29tcGF0Q29sb3IgXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgPC9saW5lYXJncmFkaWVudD4KICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgIDxyZWN0IGhlaWdodD0iMjUiIHdpZHRoPSIyNTAiIHJ4PSI1IiByeT0iNSIgc3R5bGU9ImZpbGw6IHVybCgnI29wLWNvbXBhdC1maWxsJyk7IiAvPgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wLWNvbXBhdC12YWx1ZSI+W1tfb3BDb21wYXRTY29yZUxhYmVsXV08L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9wYXBlci1pdGVtLWJvZHk+CiAgICA8L3BhcGVyLWl0ZW0+CgogICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19leHBhbmRlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19leHBhbmRlZH19IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmRlZEluZm8iPgogICAgICAgICAgSW5jb21wYXRpYmxlIE9wZXJhdGlvbnM6ICg8c3Bhbj5bW190b3RhbEluY29tcGF0T3BzXV08L3NwYW4+KQogICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0iaW5jb21wYXRpYmxlLW9wcy1saXN0IiBpZD0iaW5jb21wYXRpYmxlT3BzTGlzdCIgaXRlbXM9IltbX2luY29tcGF0aWJsZU9wTm9kZXNdXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbSBjbGFzcz0ibm9uLWNvbnRyb2wtbGlzdC1pdGVtIiBpdGVtLW5vZGU9IltbaXRlbV1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW19nZXRSZW5kZXJJbmZvKGl0ZW0ubmFtZSwgcmVuZGVySGllcmFyY2h5KV1dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIGl0ZW0tdHlwZT0iaW5jb21wYXRpYmxlLW9wcyI+CiAgICAgICAgICAgICAgPC90Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2lyb24tY29sbGFwc2U+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtbm9kZS1saXN0LWl0ZW0iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgI2xpc3QtaXRlbSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgY29sb3I6ICM1NjU2NTY7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAuY2xpY2thYmxlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3BhbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDQwcHg7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0uZXhjbHVkZWQgc3BhbiB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3Bhbi5lZGdlLWxhYmVsIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgIH0KCiAgICAgIC5ub2RlLWljb24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDFweDsKICAgICAgICBsZWZ0OiAycHg7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBpZD0ibGlzdC1pdGVtIiBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIiBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciI+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uIGNsYXNzPSJub2RlLWljb24iIGhlaWdodD0iMTIiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgbm9kZT0iW1tpdGVtTm9kZV1dIiByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIiB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iPjwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJlZGdlLWxhYmVsIj5bW2VkZ2VMYWJlbF1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLW5vZGUtaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuc3ViLWxpc3QtZ3JvdXAgewogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIHBhZGRpbmctYm90dG9tOiA4cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMzAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CgogICAgICAuYXR0ci1sZWZ0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICB3aWR0aDogMzAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQoKICAgICAgLmF0dHItcmlnaHQgewogICAgICAgIG1hcmdpbi1sZWZ0OiAzMCU7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogdGFibGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1yb3cgewogICAgICAgIGRpc3BsYXk6IHRhYmxlLXJvdzsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLXJvdyAuc3ViLWxpc3QtdGFibGUtY2VsbDpsYXN0LWNoaWxkIHsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgfQoKICAgICAgLnN1Yi1saXN0LXRhYmxlLWNlbGwgewogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbWF4LXdpZHRoOiAyMDBweDsKICAgICAgICBwYWRkaW5nOiAwIDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTllOWU5OwogICAgICB9CgogICAgICBwYXBlci1pdGVtLWJvZHlbdHdvLWxpbmVdIHsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4IDRweDsKICAgICAgfQoKICAgICAgLmV4cGFuZGVkSW5mbyB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sRGVwcyB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgOHB4OwogICAgICB9CgogICAgICAubm9kZS1uYW1lIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBmb250LXNpemU6IDE0cHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAuc3VidGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICBjb2xvcjogIzVlNWU1ZTsKICAgICAgfQoKICAgICAgLmNvbnRyb2xMaW5lIHsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuY29udHJvbC10b2dnbGUtYnV0dG9uIHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICBtYXgtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1heC13aWR0aDogMjBweDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGUtZ3JvdXAgewogICAgICAgIHBhZGRpbmctdG9wOiA0cHg7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5jbHVkZSB7CiAgICAgICAgbWFyZ2luOiA1cHggNnB4OwogICAgICAgIHRleHQtdHJhbnNmb3JtOiBub25lOwogICAgICAgIHBhZGRpbmc6IDRweCA2cHg7CiAgICAgICAgZm9udC1zaXplOiAxMHB0OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmYWZhZmE7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5jbHVkZTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAubm9uLWNvbnRyb2wtbGlzdC1pdGVtIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8cGFwZXItaXRlbT4KICAgICAgPHBhcGVyLWl0ZW0tYm9keSB0d28tbGluZT4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX2V4cGFuZGVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUV4cGFuZGVkIiBjbGFzcz0idG9nZ2xlLWJ1dHRvbiI+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm9kZS1uYW1lIiBpZD0ibm9kZXRpdGxlIj48L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDx0Zi1ub2RlLWljb24gY2xhc3M9Im5vZGUtaWNvbiIgbm9kZT0iW1tfbm9kZV1dIiByZW5kZXItaW5mbz0iW1tfZ2V0UmVuZGVySW5mbyhncmFwaE5vZGVOYW1lLCByZW5kZXJIaWVyYXJjaHkpXV0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+PC90Zi1ub2RlLWljb24+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGUub3B9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgICBPcGVyYXRpb246CiAgICAgICAgICAgICAgPHNwYW4+W1tfbm9kZS5vcF1dPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGUubWV0YWdyYXBofX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+CiAgICAgICAgICAgICAgU3ViZ3JhcGg6CiAgICAgICAgICAgICAgPHNwYW4+W1tfbm9kZS5jYXJkaW5hbGl0eV1dPC9zcGFuPiBub2RlcwogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvcGFwZXItaXRlbS1ib2R5PgogICAgPC9wYXBlci1pdGVtPgogICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19leHBhbmRlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19leHBhbmRlZH19IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmRlZEluZm8iPgogICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgYXR0cmlidXRlcyI+CiAgICAgICAgICAgIEF0dHJpYnV0ZXMgKDxzcGFuPltbX2F0dHJpYnV0ZXMubGVuZ3RoXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9ImF0dHJpYnV0ZXNMaXN0IiBpdGVtcz0iW1tfYXR0cmlidXRlc11dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPltbaXRlbS5rZXldXTwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLXJpZ2h0Ij5bW2l0ZW0udmFsdWVdXTwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2RldmljZX19Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgZGV2aWNlIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPkRldmljZTwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItcmlnaHQiPltbX2RldmljZV1dPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBwcmVkZWNlc3NvcnMiPgogICAgICAgICAgICBJbnB1dHMgKDxzcGFuPltbX3RvdGFsUHJlZGVjZXNzb3JzXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaWQ9ImlucHV0c0xpc3QiIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMucmVndWxhcl1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbm9kZS1saXN0LWl0ZW0gY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIgY2FyZC1ub2RlPSJbW19ub2RlXV0iIGl0ZW0tbm9kZT0iW1tpdGVtLm5vZGVdXSIgZWRnZS1sYWJlbD0iW1tpdGVtLmVkZ2VMYWJlbF1dIiBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9InByZWRlY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgIDwvdGYtbm9kZS1saXN0LWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcHJlZGVjZXNzb3JzLmNvbnRyb2wubGVuZ3RoXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xEZXBzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xMaW5lIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249Int7X2dldFRvZ2dsZUljb24oX29wZW5lZENvbnRyb2xQcmVkKX19IiBvbi1jbGljaz0iX3RvZ2dsZUNvbnRyb2xQcmVkIiBjbGFzcz0iY29udHJvbC10b2dnbGUtYnV0dG9uIj4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19vcGVuZWRDb250cm9sUHJlZH19IiBuby1hbmltYXRpb24+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfb3BlbmVkQ29udHJvbFByZWR9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0icHJlZGVjZXNzb3JzIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHN1Y2Nlc3NvcnMiPgogICAgICAgICAgICBPdXRwdXRzICg8c3Bhbj5bW190b3RhbFN1Y2Nlc3NvcnNdXTwvc3Bhbj4pCiAgICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9InN1Yi1saXN0IiBpZD0ib3V0cHV0c0xpc3QiIGl0ZW1zPSJbW19zdWNjZXNzb3JzLnJlZ3VsYXJdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGVkZ2UtbGFiZWw9IltbaXRlbS5lZGdlTGFiZWxdXSIgaXRlbS1yZW5kZXItaW5mbz0iW1tpdGVtLnJlbmRlckluZm9dXSIgbmFtZT0iW1tpdGVtLm5hbWVdXSIgaXRlbS10eXBlPSJzdWNjZXNzb3IiIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSI+CiAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N1Y2Nlc3NvcnMuY29udHJvbC5sZW5ndGhdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbERlcHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbExpbmUiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfb3BlbmVkQ29udHJvbFN1Y2MpfX0iIG9uLWNsaWNrPSJfdG9nZ2xlQ29udHJvbFN1Y2MiIGNsYXNzPSJjb250cm9sLXRvZ2dsZS1idXR0b24iPgogICAgICAgICAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICBDb250cm9sIGRlcGVuZGVuY2llcwogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Int7X29wZW5lZENvbnRyb2xTdWNjfX0iIG5vLWFuaW1hdGlvbj4KICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19vcGVuZWRDb250cm9sU3VjY319IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICAgICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaXRlbXM9IltbX3N1Y2Nlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iIG5hbWU9IltbaXRlbS5uYW1lXV0iIGl0ZW0tdHlwZT0ic3VjY2Vzc29ycyIgY29sb3ItYnk9IltbY29sb3JCeV1dIiB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIj4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaGFzRGlzcGxheWFibGVOb2RlU3RhdHN9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIG5vZGUtc3RhdHMiPgogICAgICAgICAgICAgIE5vZGUgU3RhdHMKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy50b3RhbEJ5dGVzfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPk1lbW9yeTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXNdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2dldFRvdGFsTWljcm9zKF9ub2RlU3RhdHMpfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPkNvbXB1dGUgVGltZTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWVdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy5vdXRwdXRTaXplfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPlRlbnNvciBPdXRwdXQgU2l6ZXM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7X25vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzfX0iPgogICAgICAgICAgICAgICAgICAgICAgICBbW2l0ZW1dXSA8YnI+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2Z1bmN0aW9uVXNhZ2VzLmxlbmd0aF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgcHJlZGVjZXNzb3JzIj4KICAgICAgICAgICAgICBVc2FnZXMgb2YgdGhlIEZ1bmN0aW9uICg8c3Bhbj5bW19mdW5jdGlvblVzYWdlcy5sZW5ndGhdXTwvc3Bhbj4pCiAgICAgICAgICAgICAgPGlyb24tbGlzdCBjbGFzcz0ic3ViLWxpc3QiIGlkPSJmdW5jdGlvblVzYWdlc0xpc3QiIGl0ZW1zPSJbW19mdW5jdGlvblVzYWdlc11dIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iIGNhcmQtbm9kZT0iW1tfbm9kZV1dIiBpdGVtLW5vZGU9IltbaXRlbV1dIiBuYW1lPSJbW2l0ZW0ubmFtZV1dIiBpdGVtLXR5cGU9ImZ1bmN0aW9uVXNhZ2VzIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iPgogICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzTGlicmFyeUZ1bmN0aW9uKF9ub2RlKV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9nZ2xlLWluY2x1ZGUtZ3JvdXAiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkIGNsYXNzPSJ0b2dnbGUtaW5jbHVkZSIgb24tY2xpY2s9Il90b2dnbGVJbmNsdWRlIj4KICAgICAgICAgICAgICAgIDxzcGFuPltbX2F1eEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaXNJblNlcmllcyhfbm9kZSl9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1pbmNsdWRlLWdyb3VwIj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBjbGFzcz0idG9nZ2xlLWluY2x1ZGUiIG9uLWNsaWNrPSJfdG9nZ2xlR3JvdXAiPgogICAgICAgICAgICAgICAgPHNwYW4+W1tfZ3JvdXBCdXR0b25UZXh0XV08L3NwYW4+CiAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvaXJvbi1jb2xsYXBzZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1pbmZvIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWF4LWhlaWdodDogNjUwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7c2VsZWN0ZWROb2RlfX0iPgogICAgICA8cGFwZXItbWF0ZXJpYWwgZWxldmF0aW9uPSIxIiBjbGFzcz0iY2FyZCI+CiAgICAgICAgPHRmLW5vZGUtaW5mbyBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZmxhdC1ncmFwaD0iW1tncmFwaF1dIiBncmFwaC1ub2RlLW5hbWU9Iltbc2VsZWN0ZWROb2RlXV0iIG5vZGUtaW5jbHVkZT0iW1tzZWxlY3RlZE5vZGVJbmNsdWRlXV0iIGhpZ2hsaWdodGVkLW5vZGU9Int7aGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSI+CiAgICAgICAgPC90Zi1ub2RlLWluZm8+CiAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ29wX2NvbXBhdGliaWxpdHknKV1dIj4KICAgICAgPHRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIiBjb2xvci1ieT0iW1tjb2xvckJ5XV0iIG5vZGUtdGl0bGU9IltbY29tcGF0Tm9kZVRpdGxlXV0iPgogICAgICA8L3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGVhbHRoUGlsbHNBdmFpbGFibGUoZGVidWdnZXJEYXRhRW5hYmxlZCwgbm9kZU5hbWVzVG9IZWFsdGhQaWxscyldXSI+CiAgICAgIDx0Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3toaWdobGlnaHRlZE5vZGV9fSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19Ij4KICAgICAgPC90Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQ+CiAgICA8L3RlbXBsYXRlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1ib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6Omhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAvZGVlcC8gLmNsb3NlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGxlZnQ6IDE1cHg7CiAgICAgICAgYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAuY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lci5sb2FkaW5nIHsKICAgICAgICBjdXJzb3I6IHByb2dyZXNzOwogICAgICAgIG9wYWNpdHk6IDAuMTsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lci5sb2FkaW5nLmVycm9yIHsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgIH0KCiAgICAgICNpbmZvIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDVweDsKICAgICAgICB0b3A6IDVweDsKICAgICAgICBwYWRkaW5nOiAwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAzODBweDsKICAgICAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgfQoKICAgICAgI21haW4gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzLWJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNDBweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzLW1zZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXByb2dyZXNzIHsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQ6IDZweDsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvcjogI2YzOTEzZTsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgewogICAgICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY29udGV4dC1tZW51IHVsIGxpIHsKICAgICAgICBwYWRkaW5nOiA0cHggMTZweDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc05vdENvbXBsZXRlKHByb2dyZXNzKV1dIj4KICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MtYmFyIj4KICAgICAgICA8ZGl2IGlkPSJwcm9ncmVzcy1tc2ciPltbcHJvZ3Jlc3MubXNnXV08L2Rpdj4KICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgdmFsdWU9IltbcHJvZ3Jlc3MudmFsdWVdXSI+PC9wYXBlci1wcm9ncmVzcz4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPGRpdiBjbGFzcyQ9IltbX2dldENvbnRhaW5lckNsYXNzKHByb2dyZXNzKV1dIj4KICAgICAgPGRpdiBpZD0ibWFpbiI+CiAgICAgICAgPHRmLWdyYXBoIGlkPSJncmFwaCIgZ3JhcGgtaGllcmFyY2h5PSJ7e2dyYXBoSGllcmFyY2h5fX0iIGJhc2ljLWdyYXBoPSJbW2dyYXBoXV0iIGhpZXJhcmNoeS1wYXJhbXM9IltbaGllcmFyY2h5UGFyYW1zXV0iIHJlbmRlci1oaWVyYXJjaHk9Int7cmVuZGVySGllcmFyY2h5fX0iIGRldmljZXMtZm9yLXN0YXRzPSJbW2RldmljZXNGb3JTdGF0c11dIiBzdGF0cz0iW1tzdGF0c11dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBoaWdobGlnaHRlZC1ub2RlPSJ7e19oaWdobGlnaHRlZE5vZGV9fSIgY29sb3ItYnk9IltbY29sb3JCeV1dIiBjb2xvci1ieS1wYXJhbXM9Int7Y29sb3JCeVBhcmFtc319IiBwcm9ncmVzcz0ie3twcm9ncmVzc319IiBlZGdlLWxhYmVsLWZ1bmN0aW9uPSJbW2VkZ2VMYWJlbEZ1bmN0aW9uXV0iIGVkZ2Utd2lkdGgtZnVuY3Rpb249IltbZWRnZVdpZHRoRnVuY3Rpb25dXSIgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJbW2hlYWx0aFBpbGxTdGVwSW5kZXhdXSIgaGFuZGxlLW5vZGUtc2VsZWN0ZWQ9IltbaGFuZGxlTm9kZVNlbGVjdGVkXV0iIGhhbmRsZS1lZGdlLXNlbGVjdGVkPSJbW2hhbmRsZUVkZ2VTZWxlY3RlZF1dIiB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSI+PC90Zi1ncmFwaD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImluZm8iPgogICAgICAgIDx0Zi1ncmFwaC1pbmZvIGlkPSJncmFwaC1pbmZvIiB0aXRsZT0ic2VsZWN0ZWQiIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIiBncmFwaD0iW1tncmFwaF1dIiBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiBzZWxlY3RlZC1ub2RlLWluY2x1ZGU9Int7X3NlbGVjdGVkTm9kZUluY2x1ZGV9fSIgaGlnaGxpZ2h0ZWQtbm9kZT0ie3tfaGlnaGxpZ2h0ZWROb2RlfX0iIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIgZGVidWdnZXItZGF0YS1lbmFibGVkPSJbW2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBkZWJ1Z2dlci1udW1lcmljLWFsZXJ0cz0iW1tkZWJ1Z2dlck51bWVyaWNBbGVydHNdXSIgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIiBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IiBjb21wYXQtbm9kZS10aXRsZT0iW1tjb21wYXROb2RlVGl0bGVdXSIgb24tbm9kZS10b2dnbGUtaW5jbHVzaW9uPSJfb25Ob2RlSW5jbHVzaW9uVG9nZ2xlZCIgb24tbm9kZS10b2dnbGUtc2VyaWVzZ3JvdXA9Il9vbk5vZGVTZXJpZXNHcm91cFRvZ2dsZWQiPjwvdGYtZ3JhcGgtaW5mbz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXJhZGlvLWJ1dHRvbiI+CiAgPHRlbXBsYXRlIHN0cmlwLXdoaXRlc3BhY2U+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemU6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplLCAxNnB4KTsKICAgICAgICAvKiAtMXB4IGlzIGEgc2VudGluZWwgZm9yIHRoZSBkZWZhdWx0IGFuZCBpcyByZXBsYWNlIGluIGBhdHRhY2hlZGAuICovCiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZTogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplLCAtMXB4KTsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgI3JhZGlvQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplKTsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1yYWRpby1idXR0b24tcmFkaW8tY29udGFpbmVyOwogICAgICB9CgogICAgICAjaW5rIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA1MCU7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIHdpZHRoOiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjY7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgfQoKICAgICAgI2lua1tjaGVja2VkXSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICB9CgogICAgICAjb2ZmUmFkaW8sICNvblJhZGlvIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICAjb2ZmUmFkaW8gewogICAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtYmFja2dyb3VuZC1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjI4czsKICAgICAgfQoKICAgICAgI29uUmFkaW8gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gZWFzZSAwLjI4czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gZWFzZSAwLjI4czsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNvZmZSYWRpbyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pICNvblJhZGlvIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMC41KTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNSk7CiAgICAgIH0KCiAgICAgICNyYWRpb0xhYmVsIHsKICAgICAgICBsaW5lLWhlaWdodDogbm9ybWFsOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBtYXJnaW4tbGVmdDogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsLXNwYWNpbmcsIDEwcHgpOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbDsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAjcmFkaW9MYWJlbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsLWNoZWNrZWQ7CiAgICAgIH0KCiAgICAgICNyYWRpb0xhYmVsOmRpcihydGwpIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1zcGFjaW5nLCAxMHB4KTsKICAgICAgfQoKICAgICAgI3JhZGlvTGFiZWxbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogZGlzYWJsZWQgc3RhdGUgKi8KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNvZmZSYWRpbyB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF1bY2hlY2tlZF0pICNvblJhZGlvIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBvcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pICNyYWRpb0xhYmVsIHsKICAgICAgICAvKiBzbGlnaHRseSBkYXJrZXIgdGhhbiB0aGUgYnV0dG9uLCBzbyB0aGF0IGl0J3MgcmVhZGFibGUgKi8KICAgICAgICBvcGFjaXR5OiAwLjY1OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InJhZGlvQ29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ib2ZmUmFkaW8iPjwvZGl2PgogICAgICA8ZGl2IGlkPSJvblJhZGlvIj48L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9InJhZGlvTGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLXJhZGlvLWdyb3VwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgcGFkZGluZzogdmFyKC0tcGFwZXItcmFkaW8tZ3JvdXAtaXRlbS1wYWRkaW5nLCAxMnB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0icGFwZXItdG9vbHRpcCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgei1pbmRleDogMTAwMjsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9vbHRpcC1iYWNrZ3JvdW5kLCAjNjE2MTYxKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9vbHRpcC10ZXh0LWNvbG9yLCB3aGl0ZSk7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2NhbGVVcCB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjApOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTY2FsZURvd24gewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS4wKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lRmFkZUluT3BhY2l0eSB7CiAgICAgICAgMCUgewogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lRmFkZU91dE9wYWNpdHkgewogICAgICAgIDAlIHsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNsaWRlRG93bkluIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIwMDBweCk7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgICAxMCUgewogICAgICAgICAgb3BhY2l0eTogMC4yOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTbGlkZURvd25PdXQgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICB9CiAgICAgICAgMTAlIHsKICAgICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIwMDBweCk7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLmZhZGUtaW4tYW5pbWF0aW9uIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZUZhZGVJbk9wYWNpdHk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1pbiwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuZmFkZS1vdXQtYW5pbWF0aW9uIHsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVGYWRlT3V0T3BhY2l0eTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2NhbGUtdXAtYW5pbWF0aW9uIHsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTY2FsZVVwOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24taW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNjYWxlLWRvd24tYW5pbWF0aW9uIHsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpOwogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2NhbGVEb3duOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zbGlkZS1kb3duLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNsaWRlRG93bkluOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMCwgMC4wLCAwLjIsIDEpOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNsaWRlLWRvd24tYW5pbWF0aW9uLW91dCB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICAgIG9wYWNpdHk6IHZhcigtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eSwgMC45KTsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2xpZGVEb3duT3V0OwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAxLCAxKTsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5jYW5jZWwtYW5pbWF0aW9uIHsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IC0zMHMgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLyogVGhhbmtzIElFIDEwLiAqLwoKICAgICAgLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRvb2x0aXAiIGNsYXNzPSJoaWRkZW4iPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWdyYXBoLW5vZGUtc2VhcmNoIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJzZWFyY2gtY29udGFpbmVyIj4KICAgICAgPHBhcGVyLWlucHV0IGlkPSJydW5zLXJlZ2V4IiBsYWJlbD0iU2VhcmNoIG5vZGVzLiBSZWdleGVzIHN1cHBvcnRlZC4iIHZhbHVlPSJ7e19yYXdSZWdleElucHV0fX0iPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8ZGl2IGlkPSJzZWFyY2gtcmVzdWx0cy1hbmNob3IiPgogICAgICAgIDxkaXYgaWQ9InNlYXJjaC1yZXN1bHRzIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3JlZ2V4TWF0Y2hlc11dIj4KICAgICAgICAgICAgPGRpdiBpZD0ic2VhcmNoLW1hdGNoIiBvbi1jbGljaz0iX21hdGNoQ2xpY2tlZCI+W1tpdGVtXV08L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzZWFyY2gtY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgI3J1bnMtcmVnZXggewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjc2VhcmNoLXJlc3VsdHMtYW5jaG9yIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtcmVzdWx0cyB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAjc2VhcmNoLW1hdGNoIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlyZWN0aW9uOiBydGw7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtbWF0Y2g6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLW9yYW5nZS13ZWFrKTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ncmFwaC1jb250cm9scyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWlucHV0OiB7CiAgICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgICAgfQogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxNXB4OwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTVweDsKICAgICAgICAtLXByaW1hcnktdGV4dC1jb2xvcjogZ3JheTsKICAgICAgICAtLXBhcGVyLWl0ZW0tbWluLWhlaWdodDogMzBweDsKICAgICAgfQoKICAgICAgcGFwZXItYnV0dG9uW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMgewogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5ydW4tZHJvcGRvd24gewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyOiB7CiAgICAgICAgICBwYWRkaW5nOiA4cHggMCA4cHggMTBweDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5jb2xvci1kcm9wZG93biB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXI6IHsKICAgICAgICAgIHBhZGRpbmc6IDlweCAwIDAgMTNweDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRhYmxlIHsKICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiAwOwogICAgICB9CgogICAgICB0YWJsZSB0ZCB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyB7CiAgICAgICAgcGFkZGluZzogMCAyMHB4IDIwcHg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5sZWdlbmQtaG9sZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTllOWU5OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgY29sb3I6ICM1NTU7CiAgICAgICAgcGFkZGluZzogMTVweCAyMHB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAudG9nZ2xlLWxlZ2VuZC1idXR0b24gewogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtbGVnZW5kLXRleHQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CiAgICAgIHN2Zy5pY29uLAogICAgICB0Zi1ncmFwaC1pY29uIHsKICAgICAgICB3aWR0aDogNjBweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgLmRvbWFpblZhbHVlcyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgICB3aWR0aDogMTY1cHg7CiAgICAgIH0KICAgICAgLmRvbWFpblN0YXJ0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAuZG9tYWluRW5kIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgLmNvbG9yQm94IHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgfQoKICAgICAgLmltYWdlLWljb24gewogICAgICAgIHdpZHRoOiAyNHB4OwogICAgICAgIGhlaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLmhlbHAtaWNvbiB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuZ3JheSB7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC50aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIG1hcmdpbjogOHB4IDVweCA4cHggMDsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgIH0KICAgICAgLnRpdGxlIHNtYWxsIHsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIC5kZXZpY2VMaXN0LAogICAgICAueGxhQ2x1c3Rlckxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNmaWxlIHsKICAgICAgICBwYWRkaW5nOiA4cHggMDsKICAgICAgfQoKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CgogICAgICAuY29sb3ItbGVnZW5kLXJvdyAubGFiZWwsCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IHN2ZywKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgZmxleDogMCAwIDQwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMHB4OwogICAgICB9CgogICAgICAuZGV2aWNlcy1jaGVja2JveCBpbnB1dCB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CgogICAgICAuY29udHJvbC1ob2xkZXIgLmljb24tYnV0dG9uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luOiAwIC01cHg7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CgogICAgICAuYnV0dG9uLXRleHQgewogICAgICAgIHBhZGRpbmctbGVmdDogMjBweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgfQoKICAgICAgLnVwbG9hZC1idXR0b24gewogICAgICAgIHdpZHRoOiAxNjVweDsKICAgICAgICBoZWlnaHQ6IDI1cHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICB9CgogICAgICAuYnV0dG9uLWljb24gewogICAgICAgIHdpZHRoOiAyNnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgIH0KCiAgICAgIC5oaWRkZW4taW5wdXQgewogICAgICAgIGhlaWdodDogMHB4OwogICAgICAgIHdpZHRoOiAwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC5jb250cm9sLWhvbGRlciB7CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyAuY29udHJvbC1ob2xkZXIgcGFwZXItcmFkaW8tZ3JvdXAgewogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQoKICAgICAgc3Bhbi5jb3VudGVyIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgIH0KCiAgICAgIC5ydW5zIHBhcGVyLWl0ZW0gewogICAgICAgIC0tcGFwZXItaXRlbTogewogICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRhYmxlLmNvbnRyb2wtaG9sZGVyIHsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgfQoKICAgICAgdGFibGUudGYtZ3JhcGgtY29udHJvbHMgdGQuaW5wdXQtZWxlbWVudC10YWJsZS1kYXRhIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICAuc3BhY2VyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KCiAgICAgIC5jb2xvci10ZXh0IHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAvKiogT3ZlcnJpZGUgaW5saW5lIHN0eWxlcyB0aGF0IHN1cHByZXNzIHBvaW50ZXIgZXZlbnRzIGZvciBkaXNhYmxlZCBidXR0b25zLiBPdGhlcndpc2UsIHRoZSAqLwogICAgICAvKiAgdG9vbHRpcHMgZG8gbm90IGFwcGVhci4gKi8KICAgICAgcGFwZXItcmFkaW8tZ3JvdXAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0byAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAubGVnZW5kLWNsYXJpZmllciB7CiAgICAgICAgY29sb3I6ICMyNjYyMzY7CiAgICAgICAgY3Vyc29yOiBoZWxwOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQoKICAgICAgLmxlZ2VuZC1jbGFyaWZpZXIgcGFwZXItdG9vbHRpcCB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICB9CgogICAgICAvKiogT3RoZXJ3aXNlLCBwb2x5bWVyIFVJIGNvbnRyb2xzIGFwcGVhciBhdG9wIG5vZGUgc2VhcmNoLiAqLwogICAgICB0Zi1ncmFwaC1ub2RlLXNlYXJjaCB7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9ImFsbGNvbnRyb2xzIj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDx0Zi1ncmFwaC1ub2RlLXNlYXJjaCBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IiByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIj48L3RmLWdyYXBoLW5vZGUtc2VhcmNoPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxwYXBlci1idXR0b24gY2xhc3M9Imljb24tYnV0dG9uIiBvbi10YXA9Il9maXQiIGFsdD0iRml0IHRvIHNjcmVlbiI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249ImFzcGVjdC1yYXRpbyIgY2xhc3M9ImJ1dHRvbi1pY29uIj48L2lyb24taWNvbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24tdGV4dCI+Rml0IHRvIFNjcmVlbjwvc3Bhbj4KICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8cGFwZXItYnV0dG9uIGNsYXNzPSJpY29uLWJ1dHRvbiIgb24tY2xpY2s9ImRvd25sb2FkIiBhbHQ9IkRvd25sb2FkIFBORyI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249ImZpbGUtZG93bmxvYWQiIGNsYXNzPSJidXR0b24taWNvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uLXRleHQiPkRvd25sb2FkIFBORzwvc3Bhbj4KICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICA8YSBocmVmPSIjIiBpZD0iZ3JhcGhkb3dubG9hZCIgY2xhc3M9InRpdGxlIiBkb3dubG9hZD0iZ3JhcGgucG5nIj48L2E+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciBydW5zIj4KICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+CiAgICAgICAgICBSdW4gPHNwYW4gY2xhc3M9ImNvdW50ZXIiPihbW2RhdGFzZXRzLmxlbmd0aF1dKTwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBuby1hbmltYXRpb25zIG5vaW5rIGhvcml6b250YWwtYWxpZ249ImxlZnQiIGNsYXNzPSJydW4tZHJvcGRvd24iPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zZWxlY3RlZFJ1bkluZGV4fX0iIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2RhdGFzZXRzXV0iPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbaXRlbS5uYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dTZXNzaW9uUnVuc0Ryb3Bkb3duXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgICAgVGFnCiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb3VudGVyIj4oW1tfbnVtVGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpXV0pPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBuby1sYWJlbC1mbG9hdCBuby1hbmltYXRpb25zIGhvcml6b250YWwtYWxpZ249ImxlZnQiIG5vaW5rIGNsYXNzPSJydW4tZHJvcGRvd24iPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkVGFnSW5kZXh9fSIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfZ2V0VGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpXV0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+W1tpdGVtLmRpc3BsYXlOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd1VwbG9hZEJ1dHRvbl1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+VXBsb2FkPC9kaXY+CiAgICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBjbGFzcz0idXBsb2FkLWJ1dHRvbiIgb24tY2xpY2s9Il9nZXRGaWxlIiB0aXRsZT0iVXBsb2FkIGEgZ3JhcGggcGJ0eHQgZmlsZSB0byB2aWV3IHRoZSBncmFwaCI+CiAgICAgICAgICAgIENob29zZSBGaWxlCiAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhpZGRlbi1pbnB1dCI+CiAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBpZD0iZmlsZSIgbmFtZT0iZmlsZSIgb24tY2hhbmdlPSJfdXBkYXRlRmlsZUlucHV0IiBhY2NlcHQ9Ii5wYnR4dCI+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRHcmFwaFR5cGV9fSI+CiAgICAgICAgICAKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0ib3BfZ3JhcGgiIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25PcEdyYXBoRGlzYWJsZWQoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4LCBfc2VsZWN0ZWRUYWdJbmRleCldXSI+R3JhcGg8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iY29uY2VwdHVhbF9ncmFwaCIgZGlzYWJsZWQ9IltbX2dldFNlbGVjdGlvbkNvbmNlcHR1YWxHcmFwaERpc2FibGVkKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgpXV0iPkNvbmNlcHR1YWwgR3JhcGg8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0icHJvZmlsZSIgZGlzYWJsZWQ9IltbX2dldFNlbGVjdGlvblByb2ZpbGVEaXNhYmxlZChkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4KV1dIj5Qcm9maWxlPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2hlY2tlZD0ie3t0cmFjZUlucHV0c319IiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgICBUcmFjZSBpbnB1dHMKICAgICAgICAgIDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWFsdGhQaWxsc0ZlYXR1cmVFbmFibGVkXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgIDxwYXBlci10b2dnbGUtYnV0dG9uIGNoZWNrZWQ9Int7aGVhbHRoUGlsbHNUb2dnbGVkT259fSIgY2xhc3M9InRpdGxlIj5TaG93IGhlYWx0aCBwaWxsczwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj5Db2xvcjwvZGl2PgogICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBzZWxlY3RlZD0ie3tjb2xvckJ5fX0iPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJzdHJ1Y3R1cmUiPlN0cnVjdHVyZTwvcGFwZXItcmFkaW8tYnV0dG9uPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iZGV2aWNlIj5EZXZpY2U8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJ4bGEtY2x1c3Rlci1yYWRpby1idXR0b24iIG5hbWU9InhsYV9jbHVzdGVyIiBkaXNhYmxlZD0iW1shX3hsYUNsdXN0ZXJzUHJvdmlkZWQocmVuZGVySGllcmFyY2h5KV1dIj4KICAgICAgICAgICAgWExBIENsdXN0ZXIKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9InhsYS1jbHVzdGVyLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICBDb2xvcmluZyBieSBYTEEgY2x1c3RlciBpcyBvbmx5IGVuYWJsZWQgaWYgYXQgbGVhc3QgMSBvcCBzcGVjaWZpZXMKICAgICAgICAgICAgYW4gWExBIGNsdXN0ZXIuCiAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0iY29tcHV0ZS10aW1lLXJhZGlvLWJ1dHRvbiIgbmFtZT0iY29tcHV0ZV90aW1lIiBkaXNhYmxlZD0iW1shc3RhdHNdXSI+CiAgICAgICAgICAgIENvbXB1dGUgdGltZQogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0iY29tcHV0ZS10aW1lLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICBDb2xvcmluZyBieSBjb21wdXRlIHRpbWUgaXMgb25seSBlbmFibGVkIGlmIHRoZSBSdW5NZXRhZGF0YSBwcm90byBpcwogICAgICAgICAgICBwYXNzZWQgdG8gdGhlIEZpbGVXcml0ZXIgd2hlbiBhIHNwZWNpZmljIHNlc3Npb24gaXMgcnVuLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im1lbW9yeS1yYWRpby1idXR0b24iIG5hbWU9Im1lbW9yeSIgZGlzYWJsZWQ9IltbIXN0YXRzXV0iPgogICAgICAgICAgICBNZW1vcnkKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBmb3I9Im1lbW9yeS1yYWRpby1idXR0b24iIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgbWVtb3J5IGlzIG9ubHkgZW5hYmxlZCBpZiB0aGUgUnVuTWV0YWRhdGEgcHJvdG8gaXMKICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBGaWxlV3JpdGVyIHdoZW4gYSBzcGVjaWZpYyBzZXNzaW9uIGlzIHJ1bi4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJ0cHUtY29tcGF0aWJpbGl0eS1yYWRpby1idXR0b24iIG5hbWU9Im9wX2NvbXBhdGliaWxpdHkiPgogICAgICAgICAgICBUUFUgQ29tcGF0aWJpbGl0eQogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0idHB1LWNvbXBhdGliaWxpdHktcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgIENvbG9yaW5nIGJ5IHdoZXRoZXIgYW4gb3BlcmF0aW9uIGlzIGNvbXBhdGlibGUgZm9yIHRoZSBUUFUgZGV2aWNlLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgPHNwYW4gY2xhc3M9InNwYWNlciI+PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzR3JhZGllbnRDb2xvcmluZyhzdGF0cywgY29sb3JCeSldXSI+CiAgICAgICAgICA8c3ZnIHdpZHRoPSIxNDAiIGhlaWdodD0iMjAiIHN0eWxlPSJtYXJnaW46IDAgNXB4IiBjbGFzcz0iY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkZWZzPgogICAgICAgICAgICAgIDxsaW5lYXJncmFkaWVudCBpZD0ibGluZWFyR3JhZGllbnQiIHgxPSIwJSIgeTE9IjAlIiB4Mj0iMTAwJSIgeTI9IjAlIj4KICAgICAgICAgICAgICAgIDxzdG9wIGNsYXNzPSJzdGFydCIgb2Zmc2V0PSIwJSIgc3RvcC1jb2xvciQ9IltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5zdGFydENvbG9yXV0iIC8+CiAgICAgICAgICAgICAgICA8c3RvcCBjbGFzcz0iZW5kIiBvZmZzZXQ9IjEwMCUiIHN0b3AtY29sb3IkPSJbW19jdXJyZW50R3JhZGllbnRQYXJhbXMuZW5kQ29sb3JdXSIgLz4KICAgICAgICAgICAgICA8L2xpbmVhcmdyYWRpZW50PgogICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgIDxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMzUiIGhlaWdodD0iMjAiIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQpIiBzdHJva2U9ImJsYWNrIiAvPgogICAgICAgICAgPC9zdmc+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJkb21haW5WYWx1ZXMgY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvbWFpblN0YXJ0Ij5bW19jdXJyZW50R3JhZGllbnRQYXJhbXMubWluVmFsdWVdXTwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb21haW5FbmQiPltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5tYXhWYWx1ZV1dPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxiciBzdHlsZT0iY2xlYXI6IGJvdGgiPgogICAgICAgICAgPGRpdj5EZXZpY2VzIGluY2x1ZGVkIGluIHN0YXRzOjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iZGV2aWNlTGlzdCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2N1cnJlbnREZXZpY2VzXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3cgZGV2aWNlcy1jaGVja2JveCI+CiAgICAgICAgICAgICAgICA8c3Bhbj48aW5wdXQgdHlwZT0iY2hlY2tib3giIHZhbHVlJD0iW1tpdGVtLmRldmljZV1dIiBjaGVja2VkJD0iW1tpdGVtLnVzZWRdXSIgb24tY2xpY2s9Il9kZXZpY2VDaGVja2JveENsaWNrZWQiPjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuPltbaXRlbS5zdWZmaXhdXTwvc3Bhbj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpdGVtLmlnbm9yZWRNc2ddXSI+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJoZWxwIiBjbGFzcz0iaGVscC1pY29uIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCIgYW5pbWF0aW9uLWRlbGF5PSIwIj5bW2l0ZW0uaWdub3JlZE1zZ11dPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ3N0cnVjdHVyZScpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItdGV4dCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsYWJlbCI+CiAgICAgICAgICAgICAgICBjb2xvcnMKICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+c2FtZSBzdWJzdHJ1Y3R1cmU8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZWVlIiBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bmlxdWUgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ2RldmljZScpXV0iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY3VycmVudERldmljZVBhcmFtc11dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik1FVEEiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IltbaXRlbS5jb2xvcl1dIiBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPltbaXRlbS5kZXZpY2VdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmlsbC1vdmVycmlkZT0iI2VlZSIgc3Ryb2tlLW92ZXJyaWRlPSIjYTZhNmE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW5rbm93biBkZXZpY2U8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAneGxhX2NsdXN0ZXInKV1dIj4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2N1cnJlbnRYbGFDbHVzdGVyUGFyYW1zXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgPHN2Zz4KICAgICAgICAgICAgICAgICAgPHVzZSB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeGxpbms6aHJlZj0iI3VuZmlsbGVkLXJlY3QiIHg9IjAiIHk9IjAiIHN0eWxlPSJmaWxsOltbaXRlbS5jb2xvcl1dIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5bW2l0ZW0ueGxhX2NsdXN0ZXJdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHN2Zz4KICAgICAgICAgICAgICAgIDx1c2UgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHhsaW5rOmhyZWY9IiNncmV5LXJlY3QiIHg9IjAiIHk9IjAiIC8+CiAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW5rbm93biBYTEEgY2x1c3Rlcjwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdvcF9jb21wYXRpYmlsaXR5JyldXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci10ZXh0Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iT1AiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IiMwZjlkNTgiIHN0cm9rZS1vdmVycmlkZT0iI2NjYyI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPlZhbGlkIE9wPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iT1AiIGhlaWdodD0iMTYiIGZpbGwtb3ZlcnJpZGU9IiNkYjQ0MzciIHN0cm9rZS1vdmVycmlkZT0iI2NjYyI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPkludmFsaWQgT3A8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N0YXRzTm90TnVsbChzdGF0cyldXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iTUVUQSIgaGVpZ2h0PSIxNiIgZmFkZWQ+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bnVzZWQgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1ob2xkZXIiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iW1tfZ2V0VG9nZ2xlTGVnZW5kSWNvbihfbGVnZW5kT3BlbmVkKV1dIiBvbi1jbGljaz0iX3RvZ2dsZUxlZ2VuZE9wZW4iIGNsYXNzPSJ0b2dnbGUtbGVnZW5kLWJ1dHRvbiI+CiAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxzcGFuIGNsYXNzPSJ0b2dnbGUtbGVnZW5kLXRleHQiPgogICAgICAgIFtbX2dldFRvZ2dsZVRleHQoX2xlZ2VuZE9wZW5lZCldXQogICAgICA8L3NwYW4+CiAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbGVnZW5kT3BlbmVkXV0iPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8dGFibGU+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+PGRpdiBjbGFzcz0idGl0bGUiPkdyYXBoPC9kaXY+PC90ZD4KICAgICAgICAgICAgICA8dGQ+KCogPSBleHBhbmRhYmxlKTwvdGQ+CiAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJNRVRBIiBoZWlnaHQ9IjE2IiBmaWxsLW92ZXJyaWRlPSIjZDlkOWQ5IiBzdHJva2Utb3ZlcnJpZGU9IiNjY2MiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIE5hbWVzcGFjZTxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVuY2Fwc3VsYXRlcyBhIHNldCBvZiBub2Rlcy4gTmFtZXNwYWNlIGlzIGhpZXJhcmNoaWNhbCBhbmQKICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiBzY29wZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik9QIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBPcE5vZGUKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgcGVyZm9ybXMgYW4gb3BlcmF0aW9uLiBUaGVzZSBub2RlcyBjYW5ub3QgZXhwYW5kLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iU0VSSUVTIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBVbmNvbm5lY3RlZCBzZXJpZXM8c3BhbiBjbGFzcz0iZ3JheSI+Kjwvc3Bhbj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBvZiBudW1iZXJlZCBub2RlcyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIHRvIGVhY2gKICAgICAgICAgICAgICAgICAgICBvdGhlci4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNFUklFUyIgaGVpZ2h0PSIxNiIgdmVydGljYWw+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgQ29ubmVjdGVkIHNlcmllczxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlIG9mIG51bWJlcmVkIG5vZGVzIHRoYXQgYXJlIGNvbm5lY3RlZCB0byBlYWNoIG90aGVyLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgPHN2ZyBjbGFzcz0iaWNvbiI+CiAgICAgICAgICAgICAgICAgIDxjaXJjbGUgZmlsbD0id2hpdGUiIHN0cm9rZT0iIzg0ODQ4NCIgY3g9IjEwIiBjeT0iMTAiIHI9IjUiIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIENvbnN0YW50CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgTm9kZSB0aGF0IG91dHB1dHMgYSBjb25zdGFudCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNVTU1BUlkiIGhlaWdodD0iMjAiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIFN1bW1hcnkKICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIHBvc2l0aW9uPSJyaWdodCIgb2Zmc2V0PSIwIj4KICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgY29sbGVjdHMgZGF0YSBmb3IgdmlzdWFsaXphdGlvbiB3aXRoaW4KICAgICAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZC4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgPG1hcmtlciBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLWxlZ2VuZCIgZmlsbD0iI2JiYiIgbWFya2Vyd2lkdGg9IjEwIiBtYXJrZXJoZWlnaHQ9IjEwIiByZWZ4PSI5IiByZWZ5PSI1IiBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSI+CiAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNIDAsMCBMIDEwLDUgTCAwLDEwIEMgMyw3IDMsMyAwLDAiIC8+CiAgICAgICAgICAgICAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgICAgPHBhdGggbWFya2VyLWVuZD0idXJsKCNkYXRhZmxvdy1hcnJvd2hlYWQtbGVnZW5kKSIgc3Ryb2tlPSIjYmJiIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBEYXRhZmxvdyBlZGdlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoZSBkYXRhIGZsb3cgYmV0d2VlbiBvcGVyYXRpb25zLiBFZGdlcyBmbG93CiAgICAgICAgICAgICAgICAgICAgdXB3YXJkcyB1bmxlc3MgYXJyb3doZWFkcyBzcGVjaWZ5IG90aGVyd2lzZS4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPHBhdGggc3Ryb2tlPSIjYmJiIiBkPSJNMiA5IGwgMjkgMCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIiBzdHJva2UtZGFzaGFycmF5PSIyLCAyIiAvPgogICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICBDb250cm9sIGRlcGVuZGVuY3kgZWRnZQogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgICAgIEVkZ2Ugc2hvd2luZyB0aGUgY29udHJvbCBkZXBlbmRlbmN5IGJldHdlZW4gb3BlcmF0aW9ucy4KICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iIGhlaWdodD0iMTVweCIgcHJlc2VydmVhc3BlY3RyYXRpbz0ieE1pbllNaWQgbWVldCIgdmlld2JveD0iMCAwIDE1IDE1Ij4KICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgPG1hcmtlciBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sZWdlbmQiIGZpbGw9IiNGRkI3NEQiIG1hcmtlcndpZHRoPSIxMCIgbWFya2VyaGVpZ2h0PSIxMCIgcmVmeD0iOSIgcmVmeT0iNSIgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiPgogICAgICAgICAgICAgICAgICAgICAgPHBhdGggZD0iTSAwLDAgTCAxMCw1IEwgMCwxMCBDIDMsNyAzLDMgMCwwIiAvPgogICAgICAgICAgICAgICAgICAgIDwvbWFya2VyPgogICAgICAgICAgICAgICAgICA8L2RlZnM+CiAgICAgICAgICAgICAgICAgIDxwYXRoIG1hcmtlci1lbmQ9InVybCgjcmVmZXJlbmNlLWFycm93aGVhZC1sZWdlbmQpIiBzdHJva2U9IiNGRkI3NEQiIGQ9Ik0yIDkgbCAyOSAwIiBzdHJva2UtbGluZWNhcD0icm91bmQiIC8+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgIFJlZmVyZW5jZSBlZGdlCiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgYW5pbWF0aW9uLWRlbGF5PSIwIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoYXQgdGhlIG91dGdvaW5nIG9wZXJhdGlvbiBub2RlIGNhbiBtdXRhdGUgdGhlCiAgICAgICAgICAgICAgICAgICAgaW5jb21pbmcgdGVuc29yLgogICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICA8L3RyPgogICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtZ3JhcGgtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItZGlhbG9nIGlkPSJlcnJvci1kaWFsb2ciIHdpdGgtYmFja2Ryb3A+PC9wYXBlci1kaWFsb2c+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFzZXRzU3RhdGUoX2RhdGFzZXRzRmV0Y2hlZCwgX2RhdGFzZXRzLCAnRU1QVFknKV1dIj4KICAgICAgPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiA1NDBweDsgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOyI+CiAgICAgICAgPGgzPk5vIGdyYXBoIGRlZmluaXRpb24gZmlsZXMgd2VyZSBmb3VuZC48L2gzPgogICAgICAgIDxwPgogICAgICAgICAgVG8gc3RvcmUgYSBncmFwaCwgY3JlYXRlIGEKICAgICAgICAgIDxjb2RlPnRmLnN1bW1hcnkuRmlsZVdyaXRlcjwvY29kZT4KICAgICAgICAgIGFuZCBwYXNzIHRoZSBncmFwaCBlaXRoZXIgdmlhIHRoZSBjb25zdHJ1Y3Rvciwgb3IgYnkgY2FsbGluZyBpdHMKICAgICAgICAgIDxjb2RlPmFkZF9ncmFwaCgpPC9jb2RlPiBtZXRob2QuIFlvdSBtYXkgd2FudCB0byBjaGVjayBvdXQgdGhlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9ncmFwaF92aXoiPmdyYXBoIHZpc3VhbGl6ZXIgdHV0b3JpYWw8L2E+LgogICAgICAgIAoKICAgICAgICA8cD4KICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvIGFkZAogICAgICAgICAgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIj5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYT4uCiAgICAgICAgCgogICAgICAgIDxwPgogICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAKICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhc2V0c1N0YXRlKF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgJ1BSRVNFTlQnKV1dIj4KICAgICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgICAgPHRmLWdyYXBoLWNvbnRyb2xzIGlkPSJjb250cm9scyIgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiIGRldmljZXMtZm9yLXN0YXRzPSJ7e19kZXZpY2VzRm9yU3RhdHN9fSIgY29sb3ItYnktcGFyYW1zPSJbW19jb2xvckJ5UGFyYW1zXV0iIHN0YXRzPSJbW19zdGF0c11dIiBjb2xvci1ieT0ie3tfY29sb3JCeX19IiBkYXRhc2V0cz0iW1tfZGF0YXNldHNdXSIgcmVuZGVyLWhpZXJhcmNoeT0iW1tfcmVuZGVySGllcmFyY2h5XV0iIHNlbGVjdGlvbj0ie3tfc2VsZWN0aW9ufX0iIHNlbGVjdGVkLWZpbGU9Int7X3NlbGVjdGVkRmlsZX19IiBzZWxlY3RlZC1ub2RlPSJ7e19zZWxlY3RlZE5vZGV9fSIgaGVhbHRoLXBpbGxzLWZlYXR1cmUtZW5hYmxlZD0iW1tfZGVidWdnZXJEYXRhRW5hYmxlZF1dIiBoZWFsdGgtcGlsbHMtdG9nZ2xlZC1vbj0ie3toZWFsdGhQaWxsc1RvZ2dsZWRPbn19IiBvbi1maXQtdGFwPSJfZml0IiB0cmFjZS1pbnB1dHM9Int7X3RyYWNlSW5wdXRzfX0iPjwvdGYtZ3JhcGgtY29udHJvbHM+CiAgICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgICAgPHRmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXIgaWQ9ImxvYWRlciIgZGF0YXNldHM9IltbX2RhdGFzZXRzXV0iIHNlbGVjdGlvbj0iW1tfc2VsZWN0aW9uXV0iIHNlbGVjdGVkLWZpbGU9IltbX3NlbGVjdGVkRmlsZV1dIiBvdXQtZ3JhcGgtaGllcmFyY2h5PSJ7e19ncmFwaEhpZXJhcmNoeX19IiBvdXQtZ3JhcGg9Int7X2dyYXBofX0iIG91dC1zdGF0cz0ie3tfc3RhdHN9fSIgcHJvZ3Jlc3M9Int7X3Byb2dyZXNzfX0iIGhpZXJhcmNoeS1wYXJhbXM9IltbX2hpZXJhcmNoeVBhcmFtc11dIiBjb21wYXRpYmlsaXR5LXByb3ZpZGVyPSJbW19jb21wYXRpYmlsaXR5UHJvdmlkZXJdXSI+PC90Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyPgogICAgICAgICAgPHRmLWdyYXBoLWJvYXJkIGlkPSJncmFwaGJvYXJkIiBkZXZpY2VzLWZvci1zdGF0cz0iW1tfZGV2aWNlc0ZvclN0YXRzXV0iIGNvbG9yLWJ5PSJbW19jb2xvckJ5XV0iIGNvbG9yLWJ5LXBhcmFtcz0ie3tfY29sb3JCeVBhcmFtc319IiBncmFwaC1oaWVyYXJjaHk9IltbX2dyYXBoSGllcmFyY2h5XV0iIGdyYXBoPSJbW19ncmFwaF1dIiBoaWVyYXJjaHktcGFyYW1zPSJbW19oaWVyYXJjaHlQYXJhbXNdXSIgcHJvZ3Jlc3M9IltbX3Byb2dyZXNzXV0iIGRlYnVnZ2VyLWRhdGEtZW5hYmxlZD0iW1tfZGVidWdnZXJEYXRhRW5hYmxlZF1dIiBhcmUtaGVhbHRoLXBpbGxzLWxvYWRpbmc9IltbX2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIiBkZWJ1Z2dlci1udW1lcmljLWFsZXJ0cz0iW1tfZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW19ub2RlTmFtZXNUb0hlYWx0aFBpbGxzXV0iIGFsbC1zdGVwcy1tb2RlLWVuYWJsZWQ9Int7YWxsU3RlcHNNb2RlRW5hYmxlZH19IiBzcGVjaWZpYy1oZWFsdGgtcGlsbC1zdGVwPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXB9fSIgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0iW1tfaGVhbHRoUGlsbFN0ZXBJbmRleF1dIiByZW5kZXItaGllcmFyY2h5PSJ7e19yZW5kZXJIaWVyYXJjaHl9fSIgc2VsZWN0ZWQtbm9kZT0ie3tfc2VsZWN0ZWROb2RlfX0iIHN0YXRzPSJbW19zdGF0c11dIiB0cmFjZS1pbnB1dHM9IltbX3RyYWNlSW5wdXRzXV0iPjwvdGYtZ3JhcGgtYm9hcmQ+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IC9kZWVwLyB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuc2lkZWJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5jZW50ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWRpYWxvZyB7CiAgICAgICAgcGFkZGluZzogMjBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1kaXN0cmlidXRpb24tY2hhcnQiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJwbG90dGFibGUtc3R5bGUiPjwvc3R5bGU+CiAgICA8ZGl2IGlkPSJjaGFydGRpdiI+PC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2IHsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgdGFnPSJbW3RhZ11dIiBydW49IltbcnVuXV0iIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIiBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIiBjb2xvcj0iW1tfcnVuQ29sb3JdXSI+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICAKICAgIDx2ei1kaXN0cmlidXRpb24tY2hhcnQgaWQ9ImNoYXJ0IiB4LXR5cGU9IltbeFR5cGVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSI+PC92ei1kaXN0cmlidXRpb24tY2hhcnQ+CiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogcm93OyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iIGljb249ImZ1bGxzY3JlZW4iIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICAgIGhlaWdodDogMjM1cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogNzAwcHg7CiAgICAgICAgaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgewogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IgaWQ9InhUeXBlU2VsZWN0b3IiIG5hbWU9Ikhvcml6b250YWwgYXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGRpc3RyaWJ1dGlvbiBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgICAoSGlzdG9ncmFtcyBhbmQgZGlzdHJpYnV0aW9ucyBib3RoIHVzZSB0aGUgaGlzdG9ncmFtIHN1bW1hcnkKICAgICAgICAgICAgICAgIG9wZXJhdGlvbi4pCiAgICAgICAgICAgICAgPC9saT4KCiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtZGlzdHJpYnV0aW9uLWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iIHgtdHlwZT0iW1tfeFR5cGVdXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLWRpc3RyaWJ1dGlvbi1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2ei1oaXN0b2dyYW0tdGltZXNlcmllcyI+CiAgPHRlbXBsYXRlPgogICAgPGRpdiBpZD0idG9vbHRpcCI+PHNwYW4+PC9zcGFuPjwvZGl2PgogICAgPHN2ZyBpZD0ic3ZnIj4KICAgICAgPGc+CiAgICAgICAgPGcgY2xhc3M9ImF4aXMgeCI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJheGlzIHkiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0iYXhpcyB5IHNsaWNlIj48L2c+CiAgICAgICAgPGcgY2xhc3M9InN0YWdlIj4KICAgICAgICAgIDxyZWN0IGNsYXNzPSJiYWNrZ3JvdW5kIj48L3JlY3Q+CiAgICAgICAgPC9nPgogICAgICAgIDxnIGNsYXNzPSJ4LWF4aXMtaG92ZXIiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0ieS1heGlzLWhvdmVyIj48L2c+CiAgICAgICAgPGcgY2xhc3M9Inktc2xpY2UtYXhpcy1ob3ZlciI+PC9nPgogICAgICA8L2c+CiAgICA8L3N2Zz4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgc3ZnIHsKICAgICAgICBmb250LWZhbWlseTogcm9ib3RvLCBzYW5zLXNlcmlmOwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgfQoKICAgICAgLmJhY2tncm91bmQgewogICAgICAgIGZpbGwtb3BhY2l0eTogMDsKICAgICAgICBmaWxsOiByZWQ7CiAgICAgIH0KCiAgICAgIC5oaXN0b2dyYW0gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAuaG92ZXIgewogICAgICAgIGZvbnQtc2l6ZTogOXB4OwogICAgICAgIGRvbWluYW50LWJhc2VsaW5lOiBtaWRkbGU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyIGNpcmNsZSB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICAgIHN0cm9rZS13aWR0aDogMXB4OwogICAgICB9CgogICAgICAuaG92ZXIgdGV4dCB7CiAgICAgICAgZmlsbDogYmxhY2s7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyLmhvdmVyLWNsb3Nlc3QgY2lyY2xlIHsKICAgICAgICBmaWxsOiBibGFjayAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaG92ZXIuaG92ZXItY2xvc2VzdCB0ZXh0IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAuYmFzZWxpbmUgewogICAgICAgIHN0cm9rZTogYmxhY2s7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuMTsKICAgICAgfQoKICAgICAgLm91dGxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAub3V0bGluZS5vdXRsaW5lLWhvdmVyIHsKICAgICAgICBzdHJva2U6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIsCiAgICAgIC55LWF4aXMtaG92ZXIsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIC5sYWJlbCwKICAgICAgLnktYXhpcy1ob3ZlciAubGFiZWwsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgLmxhYmVsIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB0ZXh0LWFuY2hvcjogZW5kOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIHRleHQgewogICAgICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC55LWF4aXMtaG92ZXIgdGV4dCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciB0ZXh0IHsKICAgICAgICB0ZXh0LWFuY2hvcjogc3RhcnQ7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgbGluZSwKICAgICAgLnktYXhpcy1ob3ZlciBsaW5lLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIGxpbmUgewogICAgICAgIHN0cm9rZTogYmxhY2s7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgcmVjdCwKICAgICAgLnktYXhpcy1ob3ZlciByZWN0LAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIHJlY3QgewogICAgICAgIGZpbGw6IHdoaXRlOwogICAgICB9CgogICAgICAuYXhpcyB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICB9CgogICAgICAuYXhpcyBwYXRoLmRvbWFpbiB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgfQoKICAgICAgLmF4aXMgLnRpY2sgbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjZGRkOwogICAgICB9CgogICAgICAuYXhpcy5zbGljZSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmF4aXMuc2xpY2UgLnRpY2sgbGluZSB7CiAgICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMjsKICAgICAgfQoKICAgICAgLnNtYWxsIC5heGlzIHRleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLnNtYWxsIC5heGlzIC50aWNrOmZpcnN0LW9mLXR5cGUgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnNtYWxsIC5heGlzIC50aWNrOmxhc3Qtb2YtdHlwZSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAubWVkaXVtIC5heGlzIHRleHQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgICAgLm1lZGl1bSAuYXhpcyAudGljazpudGgtY2hpbGQoMm4gKyAxKSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAubGFyZ2UgLmF4aXMgdGV4dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAubGFyZ2UgLmF4aXMgLnRpY2s6bnRoLWNoaWxkKDJuICsgMSkgdGV4dCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1oaXN0b2dyYW0tbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHRhZz0iW1t0YWddXSIgcnVuPSJbW3J1bl1dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIgY29sb3I9IltbX3J1bkNvbG9yXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgCiAgICA8dnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgaWQ9ImNoYXJ0IiB0aW1lLXByb3BlcnR5PSJbW3RpbWVQcm9wZXJ0eV1dIiBtb2RlPSJbW2hpc3RvZ3JhbU1vZGVdXSIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVGdW5jdGlvbl1dIj48L3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzPgogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHdpZHRoOiAzMzBweDsKICAgICAgICBoZWlnaHQ6IDIzNXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDcwMHB4OwogICAgICAgIGhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIHZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgd2lkdGg6IDkwJTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvciBpZD0iaGlzdG9ncmFtTW9kZVNlbGVjdG9yIiBuYW1lPSJIaXN0b2dyYW0gbW9kZSIgc2VsZWN0ZWQtaWQ9Int7X2hpc3RvZ3JhbU1vZGV9fSI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9Im92ZXJsYXkiPm92ZXJsYXk8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ib2Zmc2V0Ij5vZmZzZXQ8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ0aW1lUHJvcGVydHlTZWxlY3RvciIgbmFtZT0iT2Zmc2V0IHRpbWUgYXhpcyIgc2VsZWN0ZWQtaWQ9Int7X3RpbWVQcm9wZXJ0eX19Ij4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGhpc3RvZ3JhbSBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1oaXN0b2dyYW0tbG9hZGVyIHJ1bj0iW1tpdGVtLnJ1bl1dIiB0YWc9IltbaXRlbS50YWddXSIgYWN0aXZlPSJbW2FjdGl2ZV1dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIgdGltZS1wcm9wZXJ0eT0iW1tfdGltZVByb3BlcnR5XV0iIGhpc3RvZ3JhbS1tb2RlPSJbW19oaXN0b2dyYW1Nb2RlXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSI+PC90Zi1oaXN0b2dyYW0tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXRleHQtbG9hZGVyIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtY2FyZC1oZWFkaW5nIHJ1bj0iW1tydW5dXSIgdGFnPSJbW3RhZ11dIiBjb2xvcj0iW1tfcnVuQ29sb3JdXSI+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGlkPSJzdGVwcy1jb250YWluZXIiIGNsYXNzPSJjb250YWluZXIgc2Nyb2xsYmFyIiBzdHlsZT0iYm9yZGVyLWNvbG9yOiBbW19ydW5Db2xvcl1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdGV4dHNdXSI+CiAgICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9InN0ZXAtY29udGFpbmVyIj4KICAgICAgICAgIHN0ZXAgPHNwYW4gY2xhc3M9InN0ZXAtdmFsdWUiPltbX2Zvcm1hdFN0ZXAoaXRlbS5zdGVwKV1dPC9zcGFuPgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9InRleHQiPgogICAgICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tpdGVtLnRleHRdXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgPHN0eWxlIGluY2x1ZGU9InNjcm9sbGJhci1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgLnNjcm9sbGJhciB7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgICAjc3RlcHMtY29udGFpbmVyIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgLyogY29sb3IgY29tcHV0ZWQgYW5kIHNldCBhcyBpbmxpbmUgc3R5bGUgKi87CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWF4LWhlaWdodDogNTAwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgfQogICAgICAudGV4dCB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMCAzcHggM3B4IDNweDsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstd29yZDsKICAgICAgfQogICAgICAuc3RlcC1jb250YWluZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogbm9uZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHggM3B4IDAgMDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4OyAvKiB0byBjb3JyZWN0IGZvciBib3JkZXIgKi8KICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgIH0KICAgICAgLnN0ZXAtY29udGFpbmVyOm5vdCg6Zmlyc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tdG9wOiAxNXB4OwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGV4dC1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHRleHQgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgdGV4dCBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyI+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYT4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi10ZXh0LWxvYWRlciBhY3RpdmU9IltbYWN0aXZlXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiBydW49IltbaXRlbS5ydW5dXSIgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIj48L3RmLXRleHQtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXByLWN1cnZlLWNhcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1jYXJkLWhlYWRpbmcgdGFnPSJbW3RhZ11dIiBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSI+PC90Zi1jYXJkLWhlYWRpbmc+CgogICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1tfeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZF1dIiB5LXZhbHVlLWFjY2Vzc29yPSJbW195VmFsdWVBY2Nlc3Nvcl1dIiB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlRnVuY3Rpb25dXSIgZGVmYXVsdC14LXJhbmdlPSJbW19kZWZhdWx0WFJhbmdlXV0iIGRlZmF1bHQteS1yYW5nZT0iW1tfZGVmYXVsdFlSYW5nZV1dIiBzbW9vdGhpbmctZW5hYmxlZD0iW1tfc21vb3RoaW5nRW5hYmxlZF1dIiByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIgZGF0YS10by1sb2FkPSJbW3J1bnNdXSIgZGF0YS1zZXJpZXM9IltbcnVuc11dIiBsb2FkLWtleT0iW1t0YWddXSIgZ2V0LWRhdGEtbG9hZC11cmw9IltbX2RhdGFVcmxdXSIgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCldXSIgYWN0aXZlPSJbW2FjdGl2ZV1dIj48L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CgogICAgPGRpdiBpZD0iYnV0dG9ucy1yb3ciPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIiBpY29uPSJmdWxsc2NyZWVuIiBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIGljb249InNldHRpbmdzLW92ZXJzY2FuIiBvbi10YXA9Il9yZXNldERvbWFpbiIgdGl0bGU9IlJlc2V0IGF4ZXMgdG8gWzAsIDFdLiI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9InN0ZXAtbGVnZW5kIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcnVuc1dpdGhTdGVwQXZhaWxhYmxlXV0iIGFzPSJydW4iPgogICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItYm94IiBzdHlsZT0iYmFja2dyb3VuZDogW1tfY29tcHV0ZVJ1bkNvbG9yKHJ1bildXTsiPjwvZGl2PgogICAgICAgICAgW1tydW5dXSBpcyBhdAogICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZXAtbGFiZWwtdGV4dCI+CiAgICAgICAgICAgIHN0ZXAgW1tfY29tcHV0ZUN1cnJlbnRTdGVwRm9yUnVuKF9ydW5Ub1ByQ3VydmVFbnRyeSwgcnVuKV1dIDwvc3Bhbj48YnI+CiAgICAgICAgICA8c3BhbiBjbGFzcz0id2FsbC10aW1lLWxhYmVsLXRleHQiPgogICAgICAgICAgICAoW1tfY29tcHV0ZUN1cnJlbnRXYWxsVGltZUZvclJ1bihfcnVuVG9QckN1cnZlRW50cnksIHJ1bildXSkKICAgICAgICAgIDwvc3Bhbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogNTAwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDI1cHg7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICB0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIHsKICAgICAgICBoZWlnaHQ6IDMwMHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciB7CiAgICAgICAgaGVpZ2h0OiA2MDBweDsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICAjYnV0dG9ucy1yb3cgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CiAgICAgICNzdGVwLWxlZ2VuZCB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBmb250LXNpemU6IDAuOGVtOwogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAubGVnZW5kLXJvdyB7CiAgICAgICAgbWFyZ2luOiA1cHggMCA1cHggMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuY29sb3ItYm94IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMXB4OwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICAgIGhlaWdodDogMTBweDsKICAgICAgfQogICAgICAuc3RlcC1sYWJlbC10ZXh0IHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQogICAgICAud2FsbC10aW1lLWxhYmVsLXRleHQgewogICAgICAgIGNvbG9yOiAjODg4OwogICAgICAgIGZvbnQtc2l6ZTogMC44ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1wci1jdXJ2ZS1zdGVwcy1zZWxlY3RvciI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcnVuc1dpdGhTbGlkZXJzXV0iIGFzPSJydW4iPgogICAgICA8ZGl2IGNsYXNzPSJydW4td2lkZ2V0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJydW4tZGlzcGxheS1jb250YWluZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0icnVuLWNvbG9yLWJveCIgc3R5bGU9ImJhY2tncm91bmQ6W1tfY29tcHV0ZUNvbG9yRm9yUnVuKHJ1bildXTsiPjwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0icnVuLXRleHQiPgogICAgICAgICAgICBbW3J1bl1dCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzdGVwLWRpc3BsYXktY29udGFpbmVyIj4KICAgICAgICAgIFtbX2NvbXB1dGVUaW1lVGV4dEZvclJ1bihydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBfcnVuVG9TdGVwSW5kZXgsCiAgICAgICAgICBydW4sIHRpbWVEaXNwbGF5VHlwZSldXQogICAgICAgIDwvZGl2PgogICAgICAgIDxwYXBlci1zbGlkZXIgZGF0YS1ydW4kPSJbW3J1bl1dIiBzdGVwPSIxIiB0eXBlPSJudW1iZXIiIG1pbj0iMCIgbWF4PSJbW19jb21wdXRlTWF4U3RlcEluZGV4Rm9yUnVuKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMsIHJ1bildXSIgdmFsdWU9IltbX2dldFN0ZXAoX3J1blRvU3RlcEluZGV4LCBydW4pXV0iIG9uLWltbWVkaWF0ZS12YWx1ZS1jaGFuZ2VkPSJfc2xpZGVyVmFsdWVDaGFuZ2VkIj48L3BhcGVyLXNsaWRlcj4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAucnVuLXdpZGdldCB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMCAwOwogICAgICB9CiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgbWFyZ2luOiAtOHB4IDAgMCAtMTVweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc3RlcC1kaXNwbGF5LWNvbnRhaW5lciB7CiAgICAgICAgZm9udC1zaXplOiAwLjllbTsKICAgICAgICBtYXJnaW46IDAgMTVweCAwIDA7CiAgICAgIH0KICAgICAgLnJ1bi10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgLnJ1bi1jb2xvci1ib3ggewogICAgICAgIHdpZHRoOiAxMnB4OwogICAgICAgIGhlaWdodDogMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXByLWN1cnZlLWRhc2hib2FyZCI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yIGlkPSJ0aW1lLXR5cGUtc2VsZWN0b3IiIG5hbWU9IlRpbWUgRGlzcGxheSBUeXBlIiBzZWxlY3RlZC1pZD0ie3tfdGltZURpc3BsYXlUeXBlfX0iPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+PHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXNdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iIGlkPSJzdGVwcy1zZWxlY3Rvci1jb250YWluZXIiPgogICAgICAgICAgICA8dGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IgcnVucz0iW1tfcmVsZXZhbnRTZWxlY3RlZFJ1bnNdXSIgcnVuLXRvLXN0ZXA9Int7X3J1blRvU3RlcH19IiBydW4tdG8tYXZhaWxhYmxlLXRpbWUtZW50cmllcz0iW1tfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllc11dIiB0aW1lLWRpc3BsYXktdHlwZT0iW1tfdGltZURpc3BsYXlUeXBlXV0iPjwvdGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3I+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gcHJlY2lzaW9u4oCTcmVjYWxsIGN1cnZlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcHJlY2lzaW9u4oCTcmVjYWxsIGRhdGEgdG8geW91ciBldmVudAogICAgICAgICAgICAgICAgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIiBnZXQtY2F0ZWdvcnktaXRlbS1rZXk9IltbX2dldENhdGVnb3J5SXRlbUtleV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtcHItY3VydmUtY2FyZCBhY3RpdmU9IltbYWN0aXZlXV0iIHJ1bnM9IltbaXRlbS5ydW5zXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVucywgaXRlbS50YWcpXV0iIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIgcnVuLXRvLXN0ZXAtY2FwPSJbW19ydW5Ub1N0ZXBdXSI+PC90Zi1wci1jdXJ2ZS1jYXJkPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIC8qKiBEbyBub3QgbGV0IHRoZSBzdGVwcyBzZWxlY3RvciBvY2NsdWRlIHRoZSBydW4gc2VsZWN0b3IuICovCiAgICAgICNzdGVwcy1zZWxlY3Rvci1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDQwJTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLXByb2ZpbGUtcmVkaXJlY3QtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJtZXNzYWdlIj4KICAgICAgPGgzPlRoZSBwcm9maWxlIHBsdWdpbiBoYXMgbW92ZWQuPC9oMz4KICAgICAgPHA+CiAgICAgICAgUGxlYXNlIGluc3RhbGwgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSBwcm9maWxlIHBsdWdpbiBmcm9tIFB5UEkgYnkKICAgICAgICBydW5uaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBmcm9tIHRoZSBtYWNoaW5lIHJ1bm5pbmcgVGVuc29yQm9hcmQ6CiAgICAgIAogICAgICA8dGV4dGFyZWEgaWQ9ImNvbW1hbmRUZXh0YXJlYSIgcmVhZG9ubHkgcm93cz0iMSIgb24tYmx1cj0iX3JlbW92ZUNvcGllZE1lc3NhZ2UiPgpbW19pbnN0YWxsQ29tbWFuZF1dPC90ZXh0YXJlYT4KICAgICAgPGRpdiBpZD0iY29weUNvbnRhaW5lciI+CiAgICAgICAgPHNwYW4gaWQ9ImNvcGllZE1lc3NhZ2UiPjwvc3Bhbj4KICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZCBvbi10YXA9Il9jb3B5SW5zdGFsbENvbW1hbmQiPkNvcHkgdG8gY2xpcGJvYXJkPC9wYXBlci1idXR0b24+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICAubWVzc2FnZSB7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgIH0KICAgICAgI2NvbW1hbmRUZXh0YXJlYSB7CiAgICAgICAgbWFyZ2luLXRvcDogMWV4OwogICAgICAgIHBhZGRpbmc6IDFleCAxZW07CiAgICAgICAgcmVzaXplOiB2ZXJ0aWNhbDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAjY29weUNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAjY29waWVkTWVzc2FnZSB7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgcGFkZGluZy1yaWdodDogMWVtOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtcGx1Z2luLWRpYWxvZyI+CiAgPHRlbXBsYXRlPgogICAgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX29wZW5dXSI+CiAgICAgIDxkaXYgaWQ9ImRhc2hib2FyZC1iYWNrZHJvcCI+PC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHBhcGVyLWRpYWxvZyBpZD0iZGlhbG9nIiBtb2RhbCBvcGVuZWQ9Int7X29wZW59fSIgd2l0aC1iYWNrZHJvcD0iW1tfdXNlTmF0aXZlQmFja2Ryb3BdXSI+CiAgICAgIDxoMiBpZD0iZGlhbG9nLXRpdGxlIj5bW190aXRsZV1dPC9oMj4KICAgICAgPGRpdiBjbGFzcz0iY3VzdG9tLW1lc3NhZ2UiPltbX2N1c3RvbU1lc3NhZ2VdXTwvZGl2PgogICAgPC9wYXBlci1kaWFsb2c+CiAgICA8c3R5bGU+CiAgICAgIC8qKiBXZSByZWx5IG9uIGEgc2VwYXJhdGUgYF9oaWRkZW5gIHByb3BlcnR5IGluc3RlYWQgb2YgZGlyZWN0bHkgbWFraW5nIHVzZQogICAgICAgICAgb2YgdGhlIGBfb3BlbmAgYXR0cmlidXRlIGJlY2F1c2UgdGhpcyBDU1Mgc3BlY2lmaWNhdGlvbiBtYXkgc3RyYW5nZWx5CiAgICAgICAgICBhZmZlY3Qgb3RoZXIgZWxlbWVudHMgdGhyb3VnaG91dCBUZW5zb3JCb2FyZC4gU2VlICM4OTkuICovCiAgICAgICNkYXNoYm9hcmQtYmFja2Ryb3AgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC42KTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgICNkaWFsb2ctdGl0bGUgewogICAgICAgIHBhZGRpbmctYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAuY3VzdG9tLW1lc3NhZ2UgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWJlaG9sZGVyLXZpZGVvIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8aW1nIGlkPSJ2aWRlbyIgc3JjJD0iW1tfaW1hZ2VVUkxdXSI+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGU+CiAgICAgIGltZyB7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtYmVob2xkZXItaW5mbyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfaXRlbXNdXSI+CiAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24taW5mbyIgc3R5bGUkPSJoZWlnaHQ6IFtbaXRlbS5oZWlnaHRdXXB4Ij4KICAgICAgICA8dWw+CiAgICAgICAgICA8bGk+W1tpdGVtLm5hbWVdXTwvbGk+CiAgICAgICAgICA8bGk+c2hhcGU6IFtbaXRlbS5zaGFwZV1dPC9saT4KICAgICAgICAgIDxsaT5yYW5nZTogWyBbW2l0ZW0ubWluXV0sIFtbaXRlbS5tYXhdXSBdPC9saT4KICAgICAgICAgIDxsaT5tZWFuOiBbW2l0ZW0ubWVhbl1dPC9saT4KICAgICAgICA8L3VsPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICAuc2VjdGlvbi1pbmZvIHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQogICAgICAuc2VjdGlvbi1pbmZvIHVsIHsKICAgICAgICBsaXN0LXN0eWxlLXR5cGU6IG5vbmU7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDx0Zi1wbHVnaW4tZGlhbG9nIGlkPSJpbml0aWFsRGlhbG9nIj48L3RmLXBsdWdpbi1kaWFsb2c+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxwIGNsYXNzPSJjb250cm9scy1kaXNhYmxlZC1tZXNzYWdlIj4KICAgICAgICAgICAgICBDb250cm9scyBkaXNhYmxlZDogZGlyZWN0b3J5IGlzIG5vdCB3cml0ZWFibGUuCiAgICAgICAgICAgIAogICAgICAgICAgICA8cCBjbGFzcz0iZGlzY2xhaW1lciI+CiAgICAgICAgICAgICAgQmVob2xkZXIgcmVxdWlyZXMgd3JpdGUgYWNjZXNzIHRvIHRoZSBsb2cgZGlyZWN0b3J5IGluIG9yZGVyIHRvCiAgICAgICAgICAgICAgY29tbXVuaWNhdGUgdmlzdWFsaXphdGlvbiBjaGFuZ2VzIHRvIHRoZSA8Y29kZT5CZWhvbGRlcjwvY29kZT4KICAgICAgICAgICAgICBpbnN0YW5jZSBpbiB5b3VyIG1vZGVsLgogICAgICAgICAgICAKICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxoMz5WYWx1ZXM8L2gzPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJ2YWx1ZXNTZWxlY3RvciIgc2VsZWN0ZWQ9Int7X3ZhbHVlc319Ij4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJ0cmFpbmFibGVfdmFyaWFibGVzIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPHByZT50Zi50cmFpbmFibGVfdmFyaWFibGVzKCk8L3ByZT4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1hcnJheXMiIG5hbWU9ImFycmF5cyIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgIDxwcmU+Yi51cGRhdGUoYXJyYXlzPVtOUF9BUlJBWVNdKTwvcHJlPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ib3B0aW9uLWZyYW1lcyIgbmFtZT0iZnJhbWVzIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgPHByZT5iLnVwZGF0ZShmcmFtZT1OUF9BUlJBWSk8L3ByZT4KICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFsdWVzTm90RnJhbWUoX3ZhbHVlcyldXSI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e19zaG93QWxsfX0iIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj5TaG93IGFsbCBkYXRhIDxpPihjYW4gYmUgcmVzb3VyY2UgaW50ZW5zaXZlKTwvaT48L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW192YWx1ZXNOb3RGcmFtZShfdmFsdWVzKV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMz5Nb2RlPC9oMz4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJtb2RlU2VsZWN0b3IiIHNlbGVjdGVkPSJ7e19tb2RlfX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iY3VycmVudCIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgY3VycmVudCB2YWx1ZXMKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InZhcmlhbmNlIiBkaXNhYmxlZD0iW1tfY29udHJvbHNfZGlzYWJsZWRdXSI+CiAgICAgICAgICAgICAgICB2YXJpYW5jZSBvdmVyIHRyYWluIHN0ZXBzCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdmFyaWFuY2VTZWxlY3RlZChfbW9kZSldXSI+CiAgICAgICAgICAgICAgPGg0PlZhcmlhbmNlIHRpbWVzdGVwczoge3tfd2luZG93U2l6ZX19PC9oND4KICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyIGlkPSJ3aW5kb3dTbGlkZXIiIHZhbHVlPSJ7e193aW5kb3dTaXplfX0iIHR5cGU9Im51bWJlciIgc3RlcD0iMSIgbWluPSIyIiBtYXg9IjIwIiBwaW49InRydWUiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICA8L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMz5JbWFnZSBzY2FsaW5nPC9oMz4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJzY2FsaW5nU2VsZWN0b3IiIHNlbGVjdGVkPSJ7e19zY2FsaW5nfX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9Im9wdGlvbi1sYXllciIgbmFtZT0ibGF5ZXIiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIHBlciBzZWN0aW9uCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJvcHRpb24tbGF5ZXIiIHBvc2l0aW9uPSJyaWdodCI+CiAgICAgICAgICAgICAgICBCbGFjayBpcyB0aGUgbG93ZXN0IHZhbHVlIGluIHRoYXQgc2VjdGlvbiwgd2hpdGUgaXMgdGhhdCBsYXJnZXN0CiAgICAgICAgICAgICAgICB2YWx1ZSBpbiB0aGF0IHNlY3Rpb24uCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJvcHRpb24tbmV0d29yayIgbmFtZT0ibmV0d29yayIgZGlzYWJsZWQ9IltbX2NvbnRyb2xzX2Rpc2FibGVkXV0iPgogICAgICAgICAgICAgICAgYWxsIHNlY3Rpb25zCiAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJvcHRpb24tbmV0d29yayIgcG9zaXRpb249InJpZ2h0Ij4KICAgICAgICAgICAgICAgIEJsYWNrIGlzIHRoZSBzbWFsbGVzdCB2YWx1ZSBpbiBhbGwgc2VjdGlvbnMsIHdoaXRlIGlzIHRoZQogICAgICAgICAgICAgICAgbGFyZ2VzdCB2YWx1ZSBpbiBhbGwgc2VjdGlvbnMuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgoKICAgICAgICAgICAgPGRpdiBpZD0iY29sb3JtYXAtc2VsZWN0aW9uIj4KICAgICAgICAgICAgICA8ZGl2IGlkPSJjb2xvcm1hcC1zZWxlY3Rpb24tbGFiZWwiPkNvbG9ybWFwOjwvZGl2PgogICAgICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51IG5vLWxhYmVsLWZsb2F0IHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2NvbG9ybWFwfX0iIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSIwIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+bWFnbWE8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPmluZmVybm88L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPnBsYXNtYTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+dmlyaWRpczwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+Z3JheXNjYWxlPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGgzPlVwZGF0ZXMgcGVyIHNlY29uZDoge3tfRlBTfX08L2gzPgogICAgICAgICAgPHBhcGVyLXNsaWRlciBpZD0iRlBTU2xpZGVyIiB2YWx1ZT0ie3tfRlBTfX0iIHR5cGU9Im51bWJlciIgc3RlcD0iMSIgbWluPSIwIiBtYXg9IjMwIiBwaW49InRydWUiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgIDwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgoKICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIGlkPSJyZWNvcmRfYnV0dG9uIiBvbi10YXA9Il90b2dnbGVSZWNvcmQiIGRpc2FibGVkPSJbW19jb250cm9sc19kaXNhYmxlZF1dIj4KICAgICAgICAgICAgICBbW19yZWNvcmRUZXh0XV0KICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KCiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgIDxwIGNsYXNzPSJkaXNjbGFpbWVyIj4KICAgICAgICAgICAgTm90ZTogQmVob2xkZXIgY3VycmVudGx5IG9ubHkgd29ya3Mgd2VsbCBvbiBsb2NhbCBmaWxlIHN5c3RlbXMuCiAgICAgICAgICAKICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc19hY3RpdmVdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gQmVob2xkZXIgZGF0YSB3YXMgZm91bmQuPC9oMz4KCiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3VyIHNjcmlwdCBpc24ndCBydW5uaW5nLjwvbGk+CiAgICAgICAgICAgICAgPGxpPllvdSBhcmVuJ3QgY2FsbGluZyA8Y29kZT5iZWhvbGRlci51cGRhdGUoKTwvY29kZT4uPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIFRvIHVzZSBCZWhvbGRlciwgaW1wb3J0IGFuZCBpbnN0YW50aWF0ZSB0aGUKICAgICAgICAgICAgICA8Y29kZT5CZWhvbGRlcjwvY29kZT4gY2xhc3MsIGFuZCBjYWxsIGl0cwogICAgICAgICAgICAgIDxjb2RlPnVwZGF0ZTwvY29kZT4gbWV0aG9kIHdpdGggYSA8Y29kZT5TZXNzaW9uPC9jb2RlPiBhcmd1bWVudAogICAgICAgICAgICAgIGFmdGVyIGV2ZXJ5IHRyYWluIHN0ZXA6CiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuYmVob2xkZXIgaW1wb3J0IEJlaG9sZGVyCmJlaG9sZGVyID0gQmVob2xkZXIoTE9HX0RJUkVDVE9SWSkKCiMgaW5zaWRlIHRyYWluIGxvb3AKYmVob2xkZXIudXBkYXRlKAogIHNlc3Npb249c2VzcywKICBhcnJheXM9bGlzdF9vZl9ucF9hcnJheXMsICAjIG9wdGlvbmFsIGFyZ3VtZW50CiAgZnJhbWU9dHdvX2RpbWVuc2lvbmFsX25wX2FycmF5LCAgIyBvcHRpb25hbCBhcmd1bWVudAopPC9wcmU+CiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHVzaW5nIDxjb2RlPnRmLnRyYWluLk1vbml0b3JlZFNlc3Npb248L2NvZGU+LCB5b3UgY2FuIHVzZQogICAgICAgICAgICAgIDxjb2RlPkJlaG9sZGVySG9vazwvY29kZT46CiAgICAgICAgICAgIAoKICAgICAgICAgICAgPHByZT5mcm9tIHRlbnNvcmJvYXJkLnBsdWdpbnMuYmVob2xkZXIgaW1wb3J0IEJlaG9sZGVySG9vawpiZWhvbGRlcl9ob29rID0gQmVob2xkZXJIb29rKExPR19ESVJFQ1RPUlkpCndpdGggTW9uaXRvcmVkU2Vzc2lvbiguLi4sIGhvb2tzPVtiZWhvbGRlcl9ob29rXSkgYXMgc2VzczoKICBzZXNzLnJ1bih0cmFpbl9vcCk8L3ByZT4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBldmVyeXRoaW5nIGlzIHNldCB1cCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL3RlbnNvcmJvYXJkL3BsdWdpbnMvYmVob2xkZXIvUkVBRE1FLm1kIj50aGUgUkVBRE1FPC9hPgogICAgICAgICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICAKCiAgICAgICAgICAgIDxwIGNsYXNzPSJkaXNjbGFpbWVyIj4KICAgICAgICAgICAgICBOb3RlOiBCZWhvbGRlciBjdXJyZW50bHkgb25seSB3b3JrcyB3ZWxsIG9uIGxvY2FsIGZpbGUgc3lzdGVtcy4KICAgICAgICAgICAgCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzX2FjdGl2ZV1dIj4KICAgICAgICAgIDx0Zi1iZWhvbGRlci12aWRlbyBpZD0idmlkZW8iIGZwcz0iW1tfRlBTXV0iPjwvdGYtYmVob2xkZXItdmlkZW8+CgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW192YWx1ZXNOb3RGcmFtZShfdmFsdWVzKV1dIj4KICAgICAgICAgICAgPHRmLWJlaG9sZGVyLWluZm8gaWQ9ImluZm8iIGZwcz0iW1tfRlBTXV0iPiA8L3RmLWJlaG9sZGVyLWluZm8+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLmNlbnRlciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwOwogICAgICB9CgogICAgICBwYXBlci1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgcGFkZGluZzogNXB4OwoKICAgICAgICAtLXBhcGVyLXJhZGlvLWJ1dHRvbi1yYWRpby1jb250YWluZXI6IHsKICAgICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIH0KCiAgICAgICAgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHBhcGVyLXJhZGlvLWdyb3VwIHsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIGZsZXgtZ3JvdzogMjsKICAgICAgfQoKICAgICAgcHJlIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbiNyZWNvcmRfYnV0dG9uIHsKICAgICAgICBjb2xvcjogI2QzMmYyZjsKICAgICAgfQoKICAgICAgcGFwZXItYnV0dG9uI3JlY29yZF9idXR0b24uaXMtcmVjb3JkaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZDMyZjJmOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbi5iZWhvbGRlci1kYXNoYm9hcmQ6bGFzdC1jaGlsZCB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CgogICAgICAjY29sb3JtYXAtc2VsZWN0aW9uIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQoKICAgICAgI2NvbG9ybWFwLXNlbGVjdGlvbi1sYWJlbCB7CiAgICAgICAgbWFyZ2luLXRvcDogMTNweDsKICAgICAgfQoKICAgICAgI2NvbG9ybWFwLXNlbGVjdGlvbiBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CgogICAgICBoNCB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgbWFyZ2luOiA1cHggMDsKICAgICAgfQoKICAgICAgcC5kaXNjbGFpbWVyIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgIH0KCiAgICAgIHAuY29udHJvbHMtZGlzYWJsZWQtbWVzc2FnZSB7CiAgICAgICAgY29sb3I6ICNjMDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tc3BsaXQtbGF5b3V0Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pIHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoKikgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCA+ICNzcGxpdHRlciB7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBtaW4td2lkdGg6IDhweDsKICAgICAgICBtaW4taGVpZ2h0OiA4cHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvciwgI2NjYyk7CiAgICAgICAgZmlsbDogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yLCAjZmZmKTsKICAgICAgICBAYXBwbHkgLS12YWFkaW4tc3BsaXQtbGF5b3V0LXNwbGl0dGVyOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFt2ZXJ0aWNhbF0pKSA+ICNzcGxpdHRlciB7CiAgICAgICAgY3Vyc29yOiBldy1yZXNpemU7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbF0pID4gI3NwbGl0dGVyIHsKICAgICAgICBjdXJzb3I6IG5zLXJlc2l6ZTsKICAgICAgfQoKICAgICAgI2hhbmRsZSwKICAgICAgI3NwbGl0dGVyIDo6c2xvdHRlZChbc2xvdD1oYW5kbGVdKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIGxlZnQ6IDUwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsXSkgPiAjc3BsaXR0ZXIgI2hhbmRsZSB7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSkgcm90YXRlKDkwZGVnKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJwcmltYXJ5IiBuYW1lPSJwcmltYXJ5Ij48L3Nsb3Q+CiAgICA8ZGl2IGlkPSJzcGxpdHRlciIgb24tdHJhY2s9Il9vbkhhbmRsZVRyYWNrIiBvbi1kb3duPSJfcHJldmVudERlZmF1bHQiPgogICAgICA8c2xvdCBuYW1lPSJoYW5kbGUiPgogICAgICAgIDxzdmcgaWQ9ImhhbmRsZSIgd2lkdGg9IjQwIiBoZWlnaHQ9IjQwIj4KICAgICAgICAgIDxyZWN0IHg9IjE5IiB5PSI4IiB3aWR0aD0iMiIgaGVpZ2h0PSIyNCI+PC9yZWN0PgogICAgICAgIDwvc3ZnPgogICAgICA8L3Nsb3Q+CiAgICA8L2Rpdj4KICAgIDxzbG90IGlkPSJzZWNvbmRhcnkiIG5hbWU9InNlY29uZGFyeSI+PC9zbG90PgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1xdWVyeS1wYW5lIj4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWwgaWQ9Imh5cGVycGFyYW1ldGVycy1tZXRyaWNzLXN0YXR1c2VzIj4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsIGlkPSJoeXBlcnBhcmFtZXRlcnMtbWV0cmljcyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gaHlwZXJwYXJhbWV0ZXJzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5IeXBlcnBhcmFtZXRlcnM8L2Rpdj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e19ocGFyYW1zfX0iIGFzPSJocGFyYW0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaHBhcmFtIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7aHBhcmFtLmRpc3BsYXllZH19IiBjbGFzcz0iaHBhcmFtLWNoZWNrYm94Ij4KICAgICAgICAgICAgICAgICAgICBbW19ocGFyYW1OYW1lKGhwYXJhbS5pbmZvKV1dCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIuZG9tYWluRGlzY3JldGVdXSI+CiAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tocGFyYW0uZmlsdGVyLmRvbWFpbkRpc2NyZXRlXV0iPgogICAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7aXRlbS5jaGVja2VkfX0iIGNsYXNzPSJkaXNjcmV0ZS12YWx1ZS1jaGVja2JveCIgb24tY2hhbmdlPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgICAgICAgICBbW19wcmV0dHlQcmludChpdGVtLnZhbHVlKV1dCiAgICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaHBhcmFtLmZpbHRlci5pbnRlcnZhbF1dIj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1pbiIgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5pbnRlcnZhbC5taW4udmFsdWV9fSIgYWxsb3dlZF9wYXR0ZXJuPSJbMC05LmVcLV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0iW1tocGFyYW0uZmlsdGVyLmludGVydmFsLm1pbi5pbnZhbGlkXV0iIHBsYWNlaG9sZGVyPSItaW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0IGxhYmVsPSJNYXgiIHZhbHVlPSJ7e2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWF4LnZhbHVlfX0iIGFsbG93ZWRfcGF0dGVybj0iWzAtOS5lXC1dIiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbaHBhcmFtLmZpbHRlci5pbnRlcnZhbC5tYXguaW52YWxpZF1dIiBwbGFjZWhvbGRlcj0iK2luZmluaXR5Ij4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIucmVnZXhwXV0iPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iUmVndWxhciBleHByZXNzaW9uIiB2YWx1ZT0ie3tocGFyYW0uZmlsdGVyLnJlZ2V4cH19IiBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBtZXRyaWNzIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5NZXRyaWNzPC9kaXY+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tfbWV0cmljc319IiBhcz0ibWV0cmljIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1ldHJpYyI+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3ttZXRyaWMuZGlzcGxheWVkfX0iIGNsYXNzPSJtZXRyaWMtY2hlY2tib3giPgogICAgICAgICAgICAgICAgICAgIFtbX21ldHJpY05hbWUobWV0cmljLmluZm8pXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5saW5lLWVsZW1lbnQiPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iTWluIiB2YWx1ZT0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1pbi52YWx1ZX19IiBhbGxvd2VkLXBhdHRlcm49IlswLTkuZVwtXSIgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIiBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IiBpbnZhbGlkPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWluLmludmFsaWR9fSIgcGxhY2Vob2xkZXI9Ii1pbmZpbml0eSI+CiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50Ij4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1heCIgYWxsb3dlZC1wYXR0ZXJuPSJbMC05LmVcLV0iIHZhbHVlPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWF4LnZhbHVlfX0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1heC5pbnZhbGlkfX0iIHBsYWNlaG9sZGVyPSIraW5maW5pdHkiPgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uIHN0YXR1cyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlN0YXR1czwvZGl2PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zdGF0dXNlc11dIiBhcz0ic3RhdHVzIj4KICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tzdGF0dXMuYWxsb3dlZH19IiBvbi1jaGFuZ2U9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICBbW3N0YXR1cy5kaXNwbGF5TmFtZV1dCiAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbCBpZD0ic29ydGluZy1wYWdpbmciPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBzb3J0aW5nIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+U29ydGluZzwvZGl2PgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iU29ydCBieSIgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiIGhvcml6b250YWwtYWxpZ249ImxlZnQiPgogICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50IiBzZWxlY3RlZD0ie3tfc29ydEJ5SW5kZXh9fSIgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfaHBhcmFtc11dIiBhcz0iaHBhcmFtIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgW1tfaHBhcmFtTmFtZShocGFyYW0uaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfbWV0cmljc11dIiBhcz0ibWV0cmljIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgICAgW1tfbWV0cmljTmFtZShtZXRyaWMuaW5mbyldXQogICAgICAgICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudSBsYWJlbD0iRGlyZWN0aW9uIiBvbi1zZWxlY3RlZC1pdGVtLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e19zb3J0RGlyZWN0aW9ufX0iPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+QXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+RGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWwgaWQ9InBhZ2luZy1kb3dubG9hZCI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24gcGFnaW5nIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5QYWdpbmc8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgTnVtYmVyIG9mIG1hdGNoaW5nIHNlc3Npb24gZ3JvdXBzOgogICAgICAgICAgICAgICAgW1tfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHJdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50IHBhZ2UtbnVtYmVyLWlucHV0Ij4KICAgICAgICAgICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0iUGFnZSAjIiB2YWx1ZT0ie3tfcGFnZU51bWJlcklucHV0LnZhbHVlfX0iIGFsbG93ZWQtcGF0dGVybj0iWzAtOV0iIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiIGludmFsaWQ9IltbX3BhZ2VOdW1iZXJJbnB1dC5pbnZhbGlkXV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICAgIDxkaXYgc2xvdD0ic3VmZml4IiBjbGFzcz0icGFnZS1zdWZmaXgiPgogICAgICAgICAgICAgICAgICAgIC8gW1tfcGFnZUNvdW50U3RyXV0KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50IHBhZ2Utc2l6ZS1pbnB1dCI+CiAgICAgICAgICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9Ik1heCAjIG9mIHNlc3Npb24gZ3JvdXBzIHBlciBwYWdlOiIgdmFsdWU9Int7X3BhZ2VTaXplSW5wdXQudmFsdWV9fSIgYWxsb3dlZC1wYXR0ZXJuPSJbMC05XSIgZXJyb3ItbWVzc2FnZT0iSW52YWxpZCBpbnB1dCIgaW52YWxpZD0iW1tfcGFnZVNpemVJbnB1dC5pbnZhbGlkXV0iIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbiBkb3dubG9hZCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXNzaW9uR3JvdXBzUmVxdWVzdF1dIj4KICAgICAgICAgICAgICAgIERvd25sb2FkIGRhdGEgYXMKICAgICAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgICAgICA8YSBpZD0iY3N2TGluayIgZG93bmxvYWQ9ImhwYXJhbXNfdGFibGUuY3N2IiBocmVmPSJbW19jc3ZVcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIj5DU1Y8L2E+CiAgICAgICAgICAgICAgICAgIDxhIGlkPSJqc29uTGluayIgZG93bmxvYWQ9ImhwYXJhbXNfdGFibGUuanNvbiIgaHJlZj0iW1tfanNvblVybChfc2Vzc2lvbkdyb3Vwc1JlcXVlc3QsIGNvbmZpZ3VyYXRpb24pXV0iPkpTT048L2E+CiAgICAgICAgICAgICAgICAgIDxhIGlkPSJsYXRleExpbmsiIGRvd25sb2FkPSJocGFyYW1zX3RhYmxlLnRleCIgaHJlZj0iW1tfbGF0ZXhVcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIj5MYVRlWDwvYT4KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAucGFuZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuc2VjdGlvbiB7CiAgICAgICAgbWFyZ2luOiA1cHggMTBweCA1cHggMTBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBtYXJnaW4tYm90dG9tOiA3cHg7CiAgICAgIH0KICAgICAgI2h5cGVycGFyYW1ldGVycy1tZXRyaWNzLXN0YXR1c2VzIHsKICAgICAgICBmbGV4LWJhc2lzOiA3MCU7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgICNoeXBlcnBhcmFtZXRlcnMtbWV0cmljcyB7CiAgICAgICAgZmxleC1iYXNpczogOTAlOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAuaHlwZXJwYXJhbWV0ZXJzIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAubWV0cmljcyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KICAgICAgLnN0YXR1c2VzIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAjc29ydGluZy1wYWdpbmcgewogICAgICAgIGZsZXgtYmFzaXM6IDMwJTsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgI3BhZ2luZy1kb3dubG9hZCB7CiAgICAgICAgZmxleC1iYXNpczogOTAlOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAuc29ydGluZyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLnBhZ2luZyB7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLmRvd25sb2FkIHsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICAuZGlzY3JldGUtdmFsdWUtY2hlY2tib3gsCiAgICAgIC5tZXRyaWMtY2hlY2tib3gsCiAgICAgIC5ocGFyYW0tY2hlY2tib3ggewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5kaXNjcmV0ZS12YWx1ZS1jaGVja2JveCB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDIwcHg7CiAgICAgIH0KICAgICAgLmhwYXJhbSwKICAgICAgLm1ldHJpYyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmlubGluZS1lbGVtZW50IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IDQwJTsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgfQogICAgICAucGFnZS1udW1iZXItaW5wdXQgewogICAgICAgIHdpZHRoOiAyMCU7CiAgICAgIH0KICAgICAgLnBhZ2Utc2l6ZS1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDYwJTsKICAgICAgfQogICAgICB2YWFkaW4tc3BsaXQtbGF5b3V0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgcGFwZXItbGlzdGJveCB7CiAgICAgICAgbWF4LWhlaWdodDogMTVlbTsKICAgICAgfQogICAgICAucGFnZS1zdWZmaXggewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9Imlyb24tcGFnZXMiPgoKICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoOm5vdChzbG90KTpub3QoLmlyb24tc2VsZWN0ZWQpKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWhlYWRlci1wYW5lbCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsOwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgfQoKICAgICAgI21haW5QYW5lbCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1ib2R5OwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc2Nyb2xsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1zY3JvbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNjcm9sbC1jb250YWluZXI7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPXNjcm9sbF0pIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IGNvdmVyCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1jb3Zlcl0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtY292ZXItY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPWNvdmVyXSkgI21haW5QYW5lbCB7CiAgICAgICAgcG9zaXRpb246IHN0YXRpYzsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc3RhbmRhcmQKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXN0YW5kYXJkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zdGFuZGFyZC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHNlYW1lZAogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9c2VhbWVkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zZWFtZWQtY29udGFpbmVyOwogICAgICB9CgoKICAgICAgLyoKICAgICAgICogbW9kZTogd2F0ZXJmYWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXdhdGVyZmFsbC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHdhdGVyZmFsbC10YWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGwtdGFsbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtd2F0ZXJmYWxsLXRhbGwtY29udGFpbmVyOwogICAgICB9CgogICAgICAjZHJvcFNoYWRvdyB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjVzOwogICAgICAgIGhlaWdodDogNnB4OwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zaGFkb3c7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICNkcm9wU2hhZG93Lmhhcy1zaGFkb3cgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyID4gOjpzbG90dGVkKC5maXQpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CgogICAgPC9zdHlsZT4KCiAgICA8c2xvdCBpZD0iaGVhZGVyU2xvdCIgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CgogICAgPGRpdiBpZD0ibWFpblBhbmVsIj4KICAgICAgPGRpdiBpZD0ibWFpbkNvbnRhaW5lciIgY2xhc3MkPSJbW19jb21wdXRlTWFpbkNvbnRhaW5lckNsYXNzKG1vZGUpXV0iPgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImRyb3BTaGFkb3ciPjwvZGl2PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10YWIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dC1pbmxpbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwoKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogMCAxMnB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbbGlua10pIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudGFiLWNvbnRlbnQgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAxLCAxKTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYi1jb250ZW50OwogICAgICB9CgogICAgICA6aG9zdCg6bm90KC5pcm9uLXNlbGVjdGVkKSkgPiAudGFiLWNvbnRlbnQgewogICAgICAgIG9wYWNpdHk6IDAuODsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiLWNvbnRlbnQtdW5zZWxlY3RlZDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSAudGFiLWNvbnRlbnQgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKICAgICAgfQoKICAgICAgcGFwZXItcmlwcGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdGFiLWluaywgdmFyKC0tcGFwZXIteWVsbG93LWExMDApKTsKICAgICAgfQoKICAgICAgLnRhYi1jb250ZW50ID4gOjpzbG90dGVkKGEpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwoKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0idGFiLWNvbnRlbnQiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCgoKPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItdGFicyIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iY2hldnJvbi1sZWZ0Ij48cGF0aCBkPSJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnoiIC8+PC9nPgo8ZyBpZD0iY2hldnJvbi1yaWdodCI+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiIgLz48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10YWJzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKCiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKCiAgICAgICAgLyogTk9URTogQm90aCB2YWx1ZXMgYXJlIG5lZWRlZCwgc2luY2Ugc29tZSBwaG9uZXMgcmVxdWlyZSB0aGUgdmFsdWUgdG8gYmUgYHRyYW5zcGFyZW50YC4gKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiczsKICAgICAgfQoKICAgICAgOmhvc3QoOmRpcihydGwpKSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWwtcmV2ZXJzZTsKICAgICAgfQoKICAgICAgI3RhYnNDb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1jb250YWluZXI7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIC1tb3otZmxleC1iYXNpczogYXV0bzsKICAgICAgICAtbXMtZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYnMtY29udGVudDsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQ6bm90KC5zY3JvbGxhYmxlKSwKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudC5zY3JvbGxhYmxlLmZpdC1jb250YWluZXIgewogICAgICAgIG1pbi13aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgLyogSUUgLSBwcmV2ZW50IHRhYnMgZnJvbSBjb21wcmVzc2luZyB3aGVuIHRoZXkgc2hvdWxkIHNjcm9sbC4gKi8KICAgICAgICAtbXMtZmxleDogMSAwIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDAgYXV0bzsKICAgICAgICBmbGV4OiAxIDAgYXV0bzsKICAgICAgfQoKICAgICAgLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLm5vdC12aXNpYmxlIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIG1hcmdpbjogMCA0cHg7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvciwgdmFyKC0tcGFwZXIteWVsbG93LWExMDApKTsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmFsaWduLWJvdHRvbSB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogYXV0bzsKICAgICAgfQoKICAgICAgI3NlbGVjdGlvbkJhci5leHBhbmQgewogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMTVzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDEsIDEpOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmNvbnRyYWN0IHsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjE4czsKICAgICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMCwgMC4wLCAwLjIsIDEpOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQgPiA6OnNsb3R0ZWQoOm5vdCgjc2VsZWN0aW9uQmFyKSkgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0icGFwZXItdGFiczpjaGV2cm9uLWxlZnQiIGNsYXNzJD0iW1tfY29tcHV0ZVNjcm9sbEJ1dHRvbkNsYXNzKF9sZWZ0SGlkZGVuLCBzY3JvbGxhYmxlLCBoaWRlU2Nyb2xsQnV0dG9ucyldXSIgb24tdXA9Il9vblNjcm9sbEJ1dHRvblVwIiBvbi1kb3duPSJfb25MZWZ0U2Nyb2xsQnV0dG9uRG93biIgdGFiaW5kZXg9Ii0xIj48L3BhcGVyLWljb24tYnV0dG9uPgoKICAgIDxkaXYgaWQ9InRhYnNDb250YWluZXIiIG9uLXRyYWNrPSJfc2Nyb2xsIiBvbi1kb3duPSJfZG93biI+CiAgICAgIDxkaXYgaWQ9InRhYnNDb250ZW50IiBjbGFzcyQ9IltbX2NvbXB1dGVUYWJzQ29udGVudENsYXNzKHNjcm9sbGFibGUsIGZpdENvbnRhaW5lcildXSI+CiAgICAgICAgPGRpdiBpZD0ic2VsZWN0aW9uQmFyIiBjbGFzcyQ9IltbX2NvbXB1dGVTZWxlY3Rpb25CYXJDbGFzcyhub0JhciwgYWxpZ25Cb3R0b20pXV0iIG9uLXRyYW5zaXRpb25lbmQ9Il9vbkJhclRyYW5zaXRpb25FbmQiPjwvZGl2PgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0icGFwZXItdGFiczpjaGV2cm9uLXJpZ2h0IiBjbGFzcyQ9IltbX2NvbXB1dGVTY3JvbGxCdXR0b25DbGFzcyhfcmlnaHRIaWRkZW4sIHNjcm9sbGFibGUsIGhpZGVTY3JvbGxCdXR0b25zKV1dIiBvbi11cD0iX29uU2Nyb2xsQnV0dG9uVXAiIG9uLWRvd249Il9vblJpZ2h0U2Nyb2xsQnV0dG9uRG93biIgdGFiaW5kZXg9Ii0xIj48L3BhcGVyLWljb24tYnV0dG9uPgoKICA8L3RlbXBsYXRlPgoKICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJwYXBlci10b29sYmFyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQ6IHZhcigtLXBhcGVyLXRvb2xiYXItaGVpZ2h0LCA2NHB4KTsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQ6IHZhcigtLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0LCA1NnB4KTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci10b29sYmFyLWJhY2tncm91bmQsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9vbGJhci1jb2xvciwgdmFyKC0tZGFyay10aGVtZS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhcjsKICAgICAgfQoKICAgICAgOmhvc3QoLmFuaW1hdGUpIHsKICAgICAgICB0cmFuc2l0aW9uOiB2YXIoLS1wYXBlci10b29sYmFyLXRyYW5zaXRpb24sIGhlaWdodCAwLjE4cyBlYXNlLWluKTsKICAgICAgfQoKICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpICogMik7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci1tZWRpdW07CiAgICAgIH0KCiAgICAgIDpob3N0KC50YWxsKSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpICogMyk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10YWxsOwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCk7CiAgICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci1jb250ZW50OwogICAgICB9CgogICAgICAvKgogICAgICAgKiBUT0RPOiBXaGVyZSBzaG91bGQgbWVkaWEgcXVlcnkgYnJlYWtwb2ludHMgbGl2ZSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBlbGVtZW50cz8KICAgICAgICovCgogICAgICBAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpIHsKICAgICAgICA6aG9zdCB7CiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSB7CiAgICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCkgKiAyKTsKICAgICAgICB9CgogICAgICAgIDpob3N0KC50YWxsKSB7CiAgICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCkgKiAzKTsKICAgICAgICB9CgogICAgICAgIC50b29sYmFyLXRvb2xzIHsKICAgICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAjdG9wQmFyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC8qIG1pZGRsZSBiYXIgKi8KICAgICAgI21pZGRsZUJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICA6aG9zdCgudGFsbCkgI21pZGRsZUJhciwKICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSAjbWlkZGxlQmFyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDAlKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwJSk7CiAgICAgIH0KCiAgICAgIC8qIGJvdHRvbSBiYXIgKi8KICAgICAgI2JvdHRvbUJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtYWtlIGVsZW1lbnRzIChlLmcuIGJ1dHRvbnMpIHJlc3BvbmQgdG8gbW91c2UvdG91Y2ggZXZlbnRzCiAgICAgICAqCiAgICAgICAqIGAudG9vbGJhci10b29sc2AgZGlzYWJsZXMgdG91Y2ggZXZlbnRzIHNvIG11bHRpcGxlIHRvb2xiYXJzIGNhbiBzdGFjayBhbmQgbm90CiAgICAgICAqIGFic29yYiBldmVudHMuIEFsbCBjaGlsZHJlbiBtdXN0IGhhdmUgcG9pbnRlciBldmVudHMgcmUtZW5hYmxlZCB0byB3b3JrIGFzCiAgICAgICAqIGV4cGVjdGVkLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoKjpub3QoW2Rpc2FibGVkXSkpIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzID4gOjpzbG90dGVkKC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiA1NnB4OwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZChwYXBlci1pY29uLWJ1dHRvbiArIC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVGhlIC0tcGFwZXItdG9vbGJhci10aXRsZSBtaXhpbiBpcyBhcHBsaWVkIGhlcmUgaW5zdGVhZCBvZiBhYm92ZSB0bwogICAgICAgKiBmaXggdGhlIGlzc3VlIHdpdGggbWFyZ2luLWxlZnQgYmVpbmcgaWdub3JlZCBkdWUgdG8gY3NzIG9yZGVyaW5nLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10aXRsZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQocGFwZXItaWNvbi1idXR0b25baWNvbj1tZW51XSkgewogICAgICAgIG1hcmdpbi1yaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLmZpdCkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IGF1dG87CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAvKiBUT0RPKG5vbXMpOiBVbnRpbCB3ZSBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIGZvciBjbGFzc2VzIHRoYXQgZG9uJ3QgdXNlCiAgICAgICAqIC9kZWVwLyBjcmVhdGUgb3VyIG93bi4KICAgICAgICovCiAgICAgIC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1zdGFydC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5jZW50ZXItanVzdGlmaWVkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmVuZC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkOwogICAgICB9CgogICAgICAuYXJvdW5kLWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWFyb3VuZC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1qdXN0aWZpZWQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0idG9wQmFyIiBjbGFzcyQ9InRvb2xiYXItdG9vbHMgW1tfY29tcHV0ZUJhckV4dHJhQ2xhc3NlcyhqdXN0aWZ5KV1dIj4KICAgICAgPHNsb3QgbmFtZT0idG9wIj48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJtaWRkbGVCYXIiIGNsYXNzJD0idG9vbGJhci10b29scyBbW19jb21wdXRlQmFyRXh0cmFDbGFzc2VzKG1pZGRsZUp1c3RpZnkpXV0iPgogICAgICA8c2xvdCBuYW1lPSJtaWRkbGUiPjwvc2xvdD4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9ImJvdHRvbUJhciIgY2xhc3MkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMoYm90dG9tSnVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9ImJvdHRvbSI+PC9zbG90PgogICAgPC9kaXY+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtcGFuZWwiPgogICAgICAKICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IkNvbG9yIGJ5IiBpZD0iY29sb3JCeURyb3BEb3duTWVudSIgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCI+CiAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIHNlbGVjdGVkPSJ7e29wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4fX0iIGlkPSJjb2xvckJ5TGlzdEJveCI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW29wdGlvbnMuY29sdW1uc11dIiBhcz0iY29sdW1uIiBpZD0iY29sb3JCeUNvbHVtblRlbXBsYXRlIj4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0gZGlzYWJsZWQ9IltbIV9pc051bWVyaWNDb2x1bW4oY29sdW1uLmluZGV4KV1dIj4KICAgICAgICAgICAgICBbW2NvbHVtbi5uYW1lXV0KICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KCiAgICAgIAogICAgICA8ZGl2IGNsYXNzPSJjb2x1bW5zLWNvbnRhaW5lciI+CiAgICAgICAgCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvcHRpb25zLmNvbHVtbnN9fSIgYXM9ImNvbHVtbiI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2x1bW4iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbHVtbi10aXRsZSI+CiAgICAgICAgICAgICAgICBbW2NvbHVtbi5uYW1lXV0KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGNsYXNzPSJzY2FsZS1yYWRpby1ncm91cCIgc2VsZWN0ZWQ9Int7Y29sdW1uLnNjYWxlfX0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IkxJTkVBUiI+CiAgICAgICAgICAgICAgICAgICAgTGluZWFyCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ibG9nU2NhbGVCdXR0b25fW1tjb2x1bW4ubmFtZV1dIiBuYW1lPSJMT0ciIGRpc2FibGVkPSJbWyFfYWxsb3dMb2dTY2FsZShjb2x1bW4sIHNlc3Npb25Hcm91cHMuKildXSI+CiAgICAgICAgICAgICAgICAgICAgTG9nYXJpdGhtaWMKICAgICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iUVVBTlRJTEUiPgogICAgICAgICAgICAgICAgICAgIFF1YW50aWxlCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmNvbnRyb2wtcGFuZWwgewogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CiAgICAgIC5jb2x1bW4gewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgICBib3JkZXI6IHNvbGlkIDFweCBkYXJrZ3JheTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgIH0KICAgICAgLmNvbHVtbi10aXRsZSB7CiAgICAgICAgLyogRml0IGV2ZXJ5IHRpdGxlIGluIG9uZSBsaW5lIHNvIHRoZSByYWRpbyBib3hlcyBhbGlnbiB2ZXJ0aWNhbGx5LiAqLwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KICAgICAgLmNvbHVtbnMtY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KICAgICAgLnNjYWxlLXJhZGlvLWdyb3VwIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogMnB4OwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHBhcGVyLWxpc3Rib3ggewogICAgICAgIG1heC1oZWlnaHQ6IDE1ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWFjdGl2ZS1pdGVtLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSAudmFhZGluLWdyaWQtcm93W2FjdGl2ZV0gLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1hY3RpdmUtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS10YWJsZS1zY3JvbGwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgICN0YWJsZSB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgICB6LWluZGV4OiAtMjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbaW9zXSAjdGFibGUgewogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdICN0YWJsZSB7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1zY3JvbGwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIHsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IHsKICAgICAgICB6LWluZGV4OiAtMTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHsKICAgICAgICAvKiBBbnkgdmFsdWUgb3RoZXIgdGhhbiDigJhub25l4oCZIGZvciB0aGUgdHJhbnNmb3JtIHJlc3VsdHMgaW4gdGhlIGNyZWF0aW9uIG9mIGJvdGggYSBzdGFja2luZyBjb250ZXh0IGFuZAogICAgICAgIGEgY29udGFpbmluZyBibG9jay4gVGhlIG9iamVjdCBhY3RzIGFzIGEgY29udGFpbmluZyBibG9jayBmb3IgZml4ZWQgcG9zaXRpb25lZCBkZXNjZW5kYW50cy4gKi8KICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciwKICAgICAgdmFhZGluLWdyaWQtdGFibGVbZml4ZWQtc2VjdGlvbnNdIHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtmaXhlZC1zZWN0aW9uc10gdmFhZGluLWdyaWQtdGFibGUtYm9keSNpdGVtcyB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtY2VsbCI+PC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWNlbGwiPjwvZG9tLW1vZHVsZT4KPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1jZWxsIj48L2RvbS1tb2R1bGU+Cjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zaXplci1jZWxsIj48L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtc2l6ZXIiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAuY2VsbCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDA7CiAgICAgICAgZm9udC1zaXplOiAxcHg7CiAgICAgICAgbWFyZ2luLXRvcDogLTFlbTsKICAgICAgfQoKICAgICAgLmNlbGxbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jb2x1bW5zXV0iIGFzPSJjb2x1bW4iPgogICAgICA8dmFhZGluLWdyaWQtc2l6ZXItY2VsbCBjbGFzcz0iY2VsbCIgY29sdW1uPSJbW2NvbHVtbl1dIj4mbmJzcDs8L3ZhYWRpbi1ncmlkLXNpemVyLWNlbGw+CiAgICA8L3RlbXBsYXRlPgoKICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLW91dGVyLXNjcm9sbGVyIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbcGFzc3Rocm91Z2hdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpb3NdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGFsbDsKICAgICAgICB6LWluZGV4OiAtMzsKICAgICAgfQoKICAgICAgOmhvc3QoW2lvc11bc2Nyb2xsaW5nXSkgewogICAgICAgIHotaW5kZXg6IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgoKICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgOmhvc3QgewogICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgei1pbmRleDogLTM7CiAgICAgICBoZWlnaHQ6IDA7CiAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgIH0KCiAgICAgOmhvc3QoOmZvY3VzKSwKICAgICAucHJpbWFyeTpmb2N1cywKICAgICA6OnNsb3R0ZWQoLnByaW1hcnk6Zm9jdXMpLAogICAgIC5zZWNvbmRhcnk6Zm9jdXMsCiAgICAgOjpzbG90dGVkKC5zZWNvbmRhcnk6Zm9jdXMpIHsKICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgfQogICAgPC9zdHlsZT4KCiAgICAKICAgIDxkaXYgY2xhc3M9InByaW1hcnkiIHRhYmluZGV4PSIwIiByb2xlPSJncmlkY2VsbCIgb24tZm9jdXM9Il9vbkJhaXRGb2N1cyIgb24tYmx1cj0iX29uQmFpdEJsdXIiPjxkaXYgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PjwvZGl2PgogICAgPGRpdiBjbGFzcz0ic2Vjb25kYXJ5IiB0YWJpbmRleD0iLTEiIHJvbGU9ImdyaWRjZWxsIiBvbi1mb2N1cz0iX29uQmFpdEZvY3VzIiBvbi1ibHVyPSJfb25CYWl0Qmx1ciI+PGRpdiBhcmlhLWhpZGRlbj0idHJ1ZSI+Jm5ic3A7PC9kaXY+PC9kaXY+CgogICAgPHNsb3Q+PC9zbG90PgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXJvdyI+PC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyI+PC9kb20tbW9kdWxlPgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1yb3ctZGV0YWlscy1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW2RldGFpbHNjZWxsXSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAudmFhZGluLWdyaWQtY2VsbFtkZXRhaWxzY2VsbF0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctZGV0YWlscy1jZWxsKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idmFhZGluLWdyaWQtZGF0YS1wcm92aWRlci10aGVtYWJpbGl0eS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KCiAgICAgIC8qIEFuaW0gKi8KICAgICAgQGtleWZyYW1lcyB2YWFkaW4tZ3JpZC1zcGluLTM2MCB7CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgIH0KICAgICAgfQogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgdmFhZGluLWdyaWQtc3Bpbi0zNjAgewogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpOwogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNzcGlubmVyIHsKICAgICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wcmltYXJ5LWNvbG9yLCAjMDNBOUY0KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItdG9wLWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBoZWlnaHQ6IDE2cHg7CiAgICAgICAgbGVmdDogNTAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAtOHB4OwogICAgICAgIG1hcmdpbi10b3A6IC04cHg7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNTAlOwogICAgICAgIHdpZHRoOiAxNnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtbG9hZGluZy1zcGlubmVyKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2xvYWRpbmddKSAjc3Bpbm5lciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogdmFhZGluLWdyaWQtc3Bpbi0zNjAgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogdmFhZGluLWdyaWQtc3Bpbi0zNjAgNDAwbXMgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICA6aG9zdChbbG9hZGluZ10pICNpdGVtcyB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICB9CgogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3dbc2VsZWN0ZWRdIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS0xMDAsIHJnYigyNDMsIDI0MywgMjQzKSk7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtYm9keS1yb3ctc2VsZWN0ZWQtY2VsbCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLW5hdmlnYXRpb24tdGhlbWFiaWxpdHktc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0KDpmb2N1cyksCiAgICAgICN0YWJsZTpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW25hdmlnYXRpbmddOm5vdChbaW50ZXJhY3RpbmddKSkgW2ZvY3VzZWRdID4gLnZhYWRpbi1ncmlkLXJvd1tmb2N1c2VkXSA+IFtmb2N1c2VkXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDAgM3B4IHJnYmEoMCwgMCwgMCwgMC4zKTsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1mb2N1c2VkLWNlbGwpOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWNvbHVtbi1yZW9yZGVyaW5nLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tZ3JpZC10YWJsZVtyZW9yZGVyaW5nXSAudmFhZGluLWdyaWQtY2VsbCB7CiAgICAgICAgYmFja2dyb3VuZDogIzAwMDsKICAgICAgfQoKICAgICAgOmhvc3QoW3Jlb3JkZXJpbmddKSAudmFhZGluLWdyaWQtY2VsbFtyZW9yZGVyLXN0YXR1cz0iZHJhZ2dpbmciXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcHJpbWFyeS1jb2xvciwgIzAwMCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlW3Jlb3JkZXJpbmddIC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAzMDBtczsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CgogICAgICAjc2Nyb2xsZXIgLnZhYWRpbi1ncmlkLWNlbGxbcmVvcmRlci1zdGF0dXM9ImFsbG93ZWQiXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJkcmFnZ2luZyJdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWNvbG9yLCAjMDAwKTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIC52YWFkaW4tZ3JpZC1jZWxsW3Jlb3JkZXItc3RhdHVzPSJkcmFnZ2luZyJdIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBvcGFjaXR5OiAwLjk1OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgQGtleWZyYW1lcyBhcHBlYXIgewogICAgICAgIHRvIHsKICAgICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgfQogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGFuaW1hdGlvbjogMW1zIGFwcGVhcjsKICAgICAgfQoKICAgICAgQG1lZGlhIG9ubHkgc2NyZWVuIGFuZCAoLXdlYmtpdC1tYXgtZGV2aWNlLXBpeGVsLXJhdGlvOiAxKSB7CiAgICAgICAgOmhvc3QgewogICAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgICNpdGVtcyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjaXRlbXMgewogICAgICAgIGJvcmRlci10b3A6IDAgc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgI2l0ZW1zID4gLnZhYWRpbi1ncmlkLXJvdyB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB9CgogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIC52YWFkaW4tZ3JpZC1jZWxsLAogICAgICB2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXIgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGwgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgICB6LWluZGV4OiAxOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMzVweDsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoLTUwJSk7CiAgICAgIH0KCiAgICAgIFtsYXN0Y29sdW1uXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSwKICAgICAgW2xhc3QtZnJvemVuXSAudmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGU6OmJlZm9yZSB7CiAgICAgICAgd2lkdGg6IDE4cHg7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZF0gI2hlYWRlciwKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgICAgY3Vyc29yOiBjb2wtcmVzaXplOwogICAgICB9CgogICAgICAudmFhZGluLWdyaWQtcm93Om5vdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIFtmcm96ZW5dIHsKICAgICAgICB6LWluZGV4OiAyOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGVbbm8tY29udGVudC1wb2ludGVyLWV2ZW50c10gLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZS10YWJsZS1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoW2lvc11bY29sdW1uLXJlc2l6aW5nXSkgI291dGVyc2Nyb2xsZXIgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgICNmaXhlZHNpemVyLAogICAgICAjb3V0ZXJzaXplciB7CiAgICAgICAgYm9yZGVyLXRvcDogMCBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgICBib3JkZXItYm90dG9tOiAwIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICB9CgogICAgICAjdGFibGUgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAjdGFibGVbb3ZlcmZsb3ctaGlkZGVuXSwKICAgICAgI291dGVyc2Nyb2xsZXJbb3ZlcmZsb3ctaGlkZGVuXSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtc2l6ZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3NpemVyd3JhcHBlciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIHotaW5kZXg6IC0xMDA7CiAgICAgIH0KCiAgICAgICNyZW9yZGVyZ2hvc3QgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY29sdW1uKSwKICAgICAgOjpzbG90dGVkKHZhYWRpbi1ncmlkLXNlbGVjdGlvbi1jb2x1bW4pLAogICAgICA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY29sdW1uLWdyb3VwKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLXRhYmxlLXRoZW1hYmlsaXR5LXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgoKICAgICAgLyogRGVmYXVsdCBib3JkZXJzICovCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciAudmFhZGluLWdyaWQtcm93Omxhc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIC52YWFkaW4tZ3JpZC1yb3c6Zmlyc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUtYm9keSAudmFhZGluLWdyaWQtcm93Om5vdChbbGFzdHJvd10pIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgdmFyKC0tZGl2aWRlci1jb2xvciwgcmdiYSgwLCAwLCAwLCAwLjA4KSk7CiAgICAgIH0KCiAgICAgIFtsYXN0LWZyb3plbl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsIHJnYmEoMCwgMCwgMCwgMC4wOCkpOwogICAgICB9CgogICAgICAvKiBDb2x1bW4gcmVzaXplIGhhbmRsZSAqLwoKICAgICAgLnZhYWRpbi1ncmlkLWNvbHVtbi1yZXNpemUtaGFuZGxlIHsKICAgICAgICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1jb2x1bW4tcmVzaXplLWhhbmRsZSk7CiAgICAgIH0KCiAgICAgIC8qIENlbGxzICovCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1oZWFkZXItY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciAudmFhZGluLWdyaWQtcm93IC52YWFkaW4tZ3JpZC1jZWxsOm5vdChbZGV0YWlsc2NlbGxdKSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1mb290ZXItY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbDpub3QoW2RldGFpbHNjZWxsXSkgOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIEBhcHBseSgtLXZhYWRpbi1ncmlkLWJvZHktY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlLWJvZHkgW29kZF0gLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1vZGQtY2VsbCk7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlIC52YWFkaW4tZ3JpZC1yb3cgLnZhYWRpbi1ncmlkLWNlbGw6bm90KFtkZXRhaWxzY2VsbF0pW2xhc3QtZnJvemVuXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgICAgQGFwcGx5KC0tdmFhZGluLWdyaWQtY2VsbC1sYXN0LWZyb3plbik7CiAgICAgIH0KCiAgICAgIHZhYWRpbi1ncmlkLXRhYmxlOm5vdChbc2Nyb2xsaW5nXSkgdmFhZGluLWdyaWQtdGFibGUtYm9keSAudmFhZGluLWdyaWQtcm93OmhvdmVyIC52YWFkaW4tZ3JpZC1jZWxsIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBAYXBwbHkoLS12YWFkaW4tZ3JpZC1ib2R5LXJvdy1ob3Zlci1jZWxsKTsKICAgICAgfQoKICAgICAgdmFhZGluLWdyaWQtdGFibGUgLnZhYWRpbi1ncmlkLXJvdyAudmFhZGluLWdyaWQtY2VsbC52YWFkaW4tZ3JpZC1jZWxsW2xhc3Rjb2x1bW5dIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBib3JkZXItcmlnaHQ6IG5vbmU7CiAgICAgIH0KCiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KCjxkb20tbW9kdWxlIGlkPSJ2YWFkaW4tZ3JpZC10YWJsZSI+CiAgPHRlbXBsYXRlPgogICAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtdGFibGUtc2Nyb2xsLXN0eWxlcyI+PC9zdHlsZT4KICAgICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXRhYmxlLXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1kYXRhLXByb3ZpZGVyLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KCiAgICAgIDxkaXYgaWQ9InNwaW5uZXIiPjwvZGl2PgogICAgICA8ZGl2IGlkPSJ0YWJsZSIgdGFiaW5kZXg9Ii0xIiBvdmVyZmxvdy1oaWRkZW4kPSJbW19oaWRlVGFibGVPdmVyZmxvdyhzY3JvbGxiYXJXaWR0aCwgc2FmYXJpKV1dIj4KICAgICAgICA8ZGl2IGlkPSJzaXplcndyYXBwZXIiPgogICAgICAgICAgPHZhYWRpbi1ncmlkLXNpemVyIGlkPSJmaXhlZHNpemVyIiB0b3A9IltbX2VzdFNjcm9sbEhlaWdodF1dIiBjb2x1bW4tdHJlZT0iW1tjb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtc2l6ZXI+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHNsb3QgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CiAgICAgICAgPHNsb3QgbmFtZT0iaXRlbXMiPjwvc2xvdD4KICAgICAgICA8c2xvdCBuYW1lPSJmb290ZXIiPjwvc2xvdD4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGlkPSJyZW9yZGVyZ2hvc3QiPjwvZGl2PgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIgaWQ9Im91dGVyc2Nyb2xsZXIiIHNjcm9sbC10YXJnZXQ9Iltbc2Nyb2xsVGFyZ2V0XV0iIG92ZXJmbG93LWhpZGRlbiQ9IltbX2hpZGVPdXRlclNjcm9sbGVyKHNjcm9sbGJhcldpZHRoLCBzYWZhcmkpXV0iIGlvcyQ9IltbaW9zXV0iIHNjcm9sbGluZyQ9Iltbc2Nyb2xsaW5nXV0iPgogICAgICA8dmFhZGluLWdyaWQtc2l6ZXIgaWQ9Im91dGVyc2l6ZXIiIHRvcD0iW1tfZXN0U2Nyb2xsSGVpZ2h0XV0iIGNvbHVtbi10cmVlPSJbW2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC1zaXplcj4KICAgIDwvdmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXI+CiAgICA8c2xvdD48L3Nsb3Q+CiAgICA8c2xvdCBuYW1lPSJmb290ZXJGb2N1c1RyYXAiPjwvc2xvdD4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkLWNvbHVtbiI+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InZhYWRpbi1ncmlkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvciwgI2ZmZik7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCB2YXIoLS1kaXZpZGVyLWNvbG9yLCByZ2JhKDAsIDAsIDAsIDAuMDgpKTsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXNjcm9sbC1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtcm93LWRldGFpbHMtc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXRhYmxlLXN0eWxlcyI+PC9zdHlsZT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtdGFibGUtdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXNlbGVjdGlvbi10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtbmF2aWdhdGlvbi10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0idmFhZGluLWdyaWQtYWN0aXZlLWl0ZW0tdGhlbWFiaWxpdHktc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXJvdy1kZXRhaWxzLXRoZW1hYmlsaXR5LXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJ2YWFkaW4tZ3JpZC1jb2x1bW4tcmVvcmRlcmluZy10aGVtYWJpbGl0eS1zdHlsZXMiPjwvc3R5bGU+CgogICAgPHZhYWRpbi1ncmlkLXRhYmxlIGlkPSJzY3JvbGxlciIgbG9hZGluZyQ9IltbX2xvYWRpbmddXSIgYmluZC1kYXRhPSJbW19iaW5kRGF0YV1dIiBzaXplPSJbW3NpemVdXSIgY29sdW1uLXRyZWU9IltbX2NvbHVtblRyZWVdXSIgcm93LWRldGFpbHMtdGVtcGxhdGU9IltbX3Jvd0RldGFpbHNUZW1wbGF0ZV1dIiBjb2x1bW4tcmVvcmRlcmluZy1hbGxvd2VkPSJbW2NvbHVtblJlb3JkZXJpbmdBbGxvd2VkXV0iPgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtaGVhZGVyIGlkPSJoZWFkZXIiIHNsb3Q9ImhlYWRlciIgdGFyZ2V0PSJbW19nZXRDb250ZW50VGFyZ2V0KCldXSIgY29sdW1uLXRyZWU9IltbX2NvbHVtblRyZWVdXSI+PC92YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXI+CiAgICAgIDx2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IGlkPSJpdGVtcyIgc2xvdD0iaXRlbXMiPjwvdmFhZGluLWdyaWQtdGFibGUtYm9keT4KICAgICAgPHZhYWRpbi1ncmlkLXRhYmxlLWZvb3RlciBpZD0iZm9vdGVyIiBzbG90PSJmb290ZXIiIHRhcmdldD0iW1tfZ2V0Q29udGVudFRhcmdldCgpXV0iIGNvbHVtbi10cmVlPSJbW19jb2x1bW5UcmVlXV0iPjwvdmFhZGluLWdyaWQtdGFibGUtZm9vdGVyPgoKICAgICAgCiAgICAgIDxzbG90IG5hbWU9ImZvb3RlckZvY3VzVHJhcCI+PC9zbG90PgoKICAgICAgCiAgICAgIAogICAgICA8c2xvdD48L3Nsb3Q+CgogICAgICA8dmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcCBpZD0iZm9vdGVyRm9jdXNUcmFwIiBzbG90PSJmb290ZXJGb2N1c1RyYXAiIG9uLWZvY3VzLWdhaW5lZD0iX29uRm9vdGVyRm9jdXMiIG9uLWZvY3VzLWxvc3Q9Il9vbkZvY3Vzb3V0Ij4KICAgICAgPC92YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwPgogICAgPC92YWFkaW4tZ3JpZC10YWJsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgPHRlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFzZXNzaW9uR3JvdXBdXSI+CiAgICAgIDxkaXY+CiAgICAgICAgPGgzPk5vIHNlc3Npb24gZ3JvdXAgc2VsZWN0ZWQ8L2gzPgogICAgICAgIDxwPlBsZWFzZSBzZWxlY3QgYSBzZXNzaW9uIGdyb3VwIHRvIHNlZSBpdHMgbWV0cmljLWdyYXBocyBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9oYXZlTWV0cmljcyh2aXNpYmxlU2NoZW1hLiopXV0iPgogICAgICA8ZGl2PgogICAgICAgIDxoMz5ObyBtZXRyaWNzIGFyZSBlbmFibGVkPC9oMz4KICAgICAgICA8cD5QbGVhc2UgZW5hYmxlIHNvbWUgbWV0cmljcyB0byBzZWUgY29udGVudCBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJsYXlvdXQgaG9yaXpvbnRhbCB3cmFwIHNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGF2ZU1ldHJpY3NBbmRTZXNzaW9uR3JvdXAodmlzaWJsZVNjaGVtYS4qLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25Hcm91cCldXSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1t2aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zXV0iIGFzPSJtZXRyaWNJbmZvIj4KICAgICAgICAgIAogICAgICAgICAgPHRmLXNjYWxhci1jYXJkIGNsYXNzPSJzY2FsYXItY2FyZCIgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIgZGF0YS10by1sb2FkPSJbW19jb21wdXRlU2VyaWVzRm9yU2Vzc2lvbkdyb3VwTWV0cmljKHNlc3Npb25Hcm91cCwKICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNJbmZvKV1dIiB0YWc9IltbbWV0cmljSW5mby5uYW1lLnRhZ11dIiB0YWctbWV0YWRhdGE9IltbX2NvbXB1dGVUYWdNZXRhZGF0YShtZXRyaWNJbmZvKV1dIiB4LXR5cGU9IltbX3hUeXBlXV0iIG11bHRpLWV4cGVyaW1lbnRzPSJbW19ub011bHRpRXhwZXJpbWVudHNdXSIgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIiBhY3RpdmU+CiAgICAgICAgICA8L3RmLXNjYWxhci1jYXJkPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIAogICAgPHN0eWxlIGluY2x1ZGU9Imlyb24tZmxleCI+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgogIAo8L2RvbS1tb2R1bGU+CgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLXRhYmxlLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIDx2YWFkaW4tZ3JpZCBjbGFzcz0ic2Vzc2lvbi1ncm91cC10YWJsZSIgaWQ9InNlc3Npb25Hcm91cHNUYWJsZSIgY29sdW1uLXJlb3JkZXJpbmctYWxsb3dlZCBpdGVtcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMCIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT4KICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgdGFibGUtY2VsbCI+VHJpYWwgSUQ8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPltbaXRlbS5uYW1lXV08L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2VuYWJsZVNob3dNZXRyaWNzXV0iPgogICAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIwIiB3aWR0aD0iNWVtIiByZXNpemFibGU+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj5TaG93IE1ldHJpY3M8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjbGFzcz0idGFibGUtY2VsbCIgY2hlY2tlZD0ie3tleHBhbmRlZH19Ij4KICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbdmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvc11dIiBhcz0iaHBhcmFtSW5mbyIgaW5kZXgtYXM9ImhwYXJhbUluZGV4Ij4KICAgICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMiIgd2lkdGg9IjEwZW0iIHJlc2l6YWJsZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX2hwYXJhbU5hbWUoaHBhcmFtSW5mbyldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWNlbGwiPgogICAgICAgICAgICAgIFtbX3Nlc3Npb25Hcm91cEhQYXJhbShpdGVtLCBocGFyYW1JbmZvLm5hbWUpXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e3Zpc2libGVTY2hlbWEubWV0cmljSW5mb3N9fSIgYXM9Im1ldHJpY0luZm8iIGluZGV4LWFzPSJtZXRyaWNJbmRleCI+CiAgICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjIiIHdpZHRoPSIxMGVtIiByZXNpemFibGU+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19tZXRyaWNOYW1lKG1ldHJpY0luZm8pXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19zZXNzaW9uR3JvdXBNZXRyaWMoaXRlbSwgbWV0cmljSW5mby5uYW1lKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGNsYXNzPSJyb3ctZGV0YWlscyI+CiAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tpdGVtXV0iIHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIgY2xhc3M9InNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdmFhZGluLWdyaWQ+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLnRhYmxlLWNlbGwgewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAudGFibGUtaGVhZGVyIHsKICAgICAgICAvKiBsaW5lLWJyZWFrIG92ZXJmbG93aW5nIGNvbHVtbiBoZWFkZXJzICovCiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5zZXNzaW9uLWdyb3VwLXRhYmxlIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlc3Npb24tZ3JvdXAtZGV0YWlscyB7CiAgICAgICAgaGVpZ2h0OiAzNjBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMiPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkKHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCldXSI+CiAgICAgIAogICAgICA8dGYtaHBhcmFtcy10YWJsZS12aWV3IHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIgc2Vzc2lvbi1ncm91cHM9IltbX3NpbmdsZXRvblNlc3Npb25Hcm91cHMoc2Vzc2lvbkdyb3VwKV1dIj4KICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfcHJvcGVydGllc0FyZVBvcHVsYXRlZCh2aXNpYmxlU2NoZW1hLCBzZXNzaW9uR3JvdXApXV0iPgogICAgICA8ZGl2PgogICAgICAgIENsaWNrIG9yIGhvdmVyIG92ZXIgYSBzZXNzaW9uIGdyb3VwIHRvIGRpc3BsYXkgaXRzIHZhbHVlcyBoZXJlLgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKPC9kb20tbW9kdWxlPgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QiPgogIDx0ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9ImNvbnRhaW5lciI+CiAgICAgIDxzdmcgaWQ9InN2ZyI+PC9zdmc+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIHN2ZyB7CiAgICAgICAgZm9udDogMTBweCBzYW5zLXNlcmlmOwogICAgICB9CgogICAgICAuYmFja2dyb3VuZCBwYXRoIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICAgIHN0cm9rZTogI2RkZDsKICAgICAgICBzaGFwZS1yZW5kZXJpbmc6IGNyaXNwRWRnZXM7CiAgICAgIH0KCiAgICAgIC5mb3JlZ3JvdW5kIHBhdGggewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuNzsKICAgICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIH0KCiAgICAgIC8qIFdpbGwgYmUgc2V0IG9uIGZvcmVncm91bmQgcGF0aHMgdGhhdCBhcmUgbm90ICJjb250YWluZWQiIGluIHRoZSBjdXJyZW50CiAgICAgICAgIGF4ZXMgYnJ1c2hlcy4gSWYgbm8gYnJ1c2hlcyBhcmUgc2V0LCBubyBwYXRoIHdpbGwgaGF2ZSB0aGlzIGNsYXNzLiAqLwogICAgICAuZm9yZWdyb3VuZCAuaW52aXNpYmxlLXBhdGggewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC8qIFN0eWxlIGZvciB0aGUgcGF0aCBjbG9zZXN0IHRvIHRoZSBtb3VzZSBwb2ludGVyICh0eXBpY2FsbHkgd2lsbCBiZWNvbWUKICAgICAgdGhlIHNlbGVjdGVkIHBhdGggd2hlbiB0aGUgdXNlciBjbGlja3MpLiAqLwogICAgICAuZm9yZWdyb3VuZCAucGVha2VkLXBhdGggewogICAgICAgIHN0cm9rZS13aWR0aDogMzsKICAgICAgfQoKICAgICAgLyogVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBwYXRoIGNsYXNzLiBXZSB1c2UgIWltcG9ydGFudCB0byBvdmVycmlkZSB0aGUKICAgICAgICAgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBjb2xvciBvZiBhIHBhdGguICovCiAgICAgIC5mb3JlZ3JvdW5kIC5zZWxlY3RlZC1wYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDMgIWltcG9ydGFudDsKICAgICAgICBzdHJva2U6ICMwZjAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI2NvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmF4aXMgdGV4dCB7CiAgICAgICAgdGV4dC1zaGFkb3c6IDAgMXB4IDAgI2ZmZiwgMXB4IDAgMCAjZmZmLCAwIC0xcHggMCAjZmZmLCAtMXB4IDAgMCAjZmZmOwogICAgICAgIGZpbGw6ICMwMDA7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAogIAogIAogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXciPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPGRpdiBjbGFzcz0icGFuZSI+CiAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgIAogICAgICAgIDx0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scyBpZD0iY29udHJvbHMiIGNsYXNzPSJzZWN0aW9uIiBjb25maWd1cmF0aW9uPSJbW2NvbmZpZ3VyYXRpb25dXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBvcHRpb25zPSJ7e19vcHRpb25zfX0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHM+CiAgICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgICAKICAgICAgICAgIDx0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90IGlkPSJwbG90IiBjbGFzcz0ic2VjdGlvbiIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBzZWxlY3RlZC1zZXNzaW9uLWdyb3VwPSJ7e19zZWxlY3RlZEdyb3VwfX0iIGNsb3Nlc3Qtc2Vzc2lvbi1ncm91cD0ie3tfY2xvc2VzdEdyb3VwfX0iIG9wdGlvbnM9IltbX29wdGlvbnNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3Q+CiAgICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMgaWQ9InZhbHVlcyIgY2xhc3M9InNlY3Rpb24iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIiBzZXNzaW9uLWdyb3VwPSJbW19jbG9zZXN0T3JTZWxlY3RlZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzIGlkPSJkZXRhaWxzIiBjbGFzcz0ic2VjdGlvbiIgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBzZXNzaW9uLWdyb3VwPSJbW19zZWxlY3RlZEdyb3VwXV0iIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIj4KICAgICAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgc3ZnIHsKICAgICAgICBmb250OiAxMHB4IHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjbG9zZXN0IGRhdGEgcG9pbnQgbWFya2VyIHRvIHRoZSBtb3VzZSBwb2ludGVyLiBXZSB1c2UgIWltcG9ydGFudAogICAgICAgICB0byBvdmVycmlkZSB0aGUgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBzdHlsZSBvZiBhIG1hcmtlci4KICAgICAgKi8KICAgICAgLmNsb3Nlc3QtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0YSBwb2ludCBtYXJrZXIuIFdlIHVzZSAhaW1wb3J0YW50IHRvCiAgICAgICAgIG92ZXJyaWRlIHRoZSBpbmxpbmUgc3R5bGUgdGhhdCBzZXRzIHRoZSByZWd1bGFyIHN0eWxlIG9mIGEgbWFya2VyLiAqLwogICAgICAuc2VsZWN0ZWQtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogIzBmMCAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKPGRvbS1tb2R1bGUgaWQ9InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Ij4KICA8dGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJwYW5lIj4KICAgICAgPHZhYWRpbi1zcGxpdC1sYXlvdXQgdmVydGljYWw+CiAgICAgICAgCiAgICAgICAgPHRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIGNsYXNzPSJzZWN0aW9uIiBpZD0iY29udHJvbHMiIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iIG9wdGlvbnM9Int7X29wdGlvbnN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scz4KICAgICAgICA8dmFhZGluLXNwbGl0LWxheW91dCB2ZXJ0aWNhbD4KICAgICAgICAgIAogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90IGNsYXNzPSJzZWN0aW9uIiBpZD0icGxvdCIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIgc2VsZWN0ZWQtc2Vzc2lvbi1ncm91cD0ie3tfc2VsZWN0ZWRHcm91cH19IiBjbG9zZXN0LXNlc3Npb24tZ3JvdXA9Int7X2Nsb3Nlc3RHcm91cH19IiBvcHRpb25zPSJbW19vcHRpb25zXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtcGxvdD4KICAgICAgICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0IHZlcnRpY2FsPgogICAgICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcyBjbGFzcz0ic2VjdGlvbiIgaWQ9InZhbHVlcyIgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iIHNlc3Npb24tZ3JvdXA9IltbX2Nsb3Nlc3RPclNlbGVjdGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgICAgICAgCiAgICAgICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyBjbGFzcz0ic2VjdGlvbiIgaWQ9ImRldGFpbHMiIGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgc2Vzc2lvbi1ncm91cD0iW1tfc2VsZWN0ZWRHcm91cF1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSI+CiAgICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHM+CiAgICAgICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICAgICAgPC92YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8L3ZhYWRpbi1zcGxpdC1sYXlvdXQ+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnBhbmUgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnNlY3Rpb24gewogICAgICAgIG1hcmdpbjogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDk1cHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjZGV0YWlscyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lIj4KICA8dGVtcGxhdGU+CiAgICA8cGFwZXItaGVhZGVyLXBhbmVsPgogICAgICA8cGFwZXItdG9vbGJhciBzbG90PSJoZWFkZXIiIGNsYXNzPSJ0YWItYmFyIj4KICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRUYWJ9fSIgc2xvdD0idG9wIj4KICAgICAgICAgIAogICAgICAgICAgPHBhcGVyLXRhYiB2aWV3LWlkPSJ0YWJsZS12aWV3Ij4KICAgICAgICAgICAgVEFCTEUgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InBhcmFsbGVsLWNvb3Jkcy12aWV3Ij4KICAgICAgICAgICAgUEFSQUxMRUwgQ09PUkRJTkFURVMgVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldyI+CiAgICAgICAgICAgIFNDQVRURVIgUExPVCBNQVRSSVggVklFVwogICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWxwLWFuZC1mZWVkYmFjayI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tidWdSZXBvcnRVcmxdXSI+CiAgICAgICAgICAgICAgPGEgaHJlZiQ9IltbYnVnUmVwb3J0VXJsXV0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPgogICAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0iYnVnLXJlcG9ydCIgcmFpc2VkIHRpdGxlPSJTZW5kIGEgYnVnIHJlcG9ydCBvciBmZWF0dXJlIHJlcXVlc3QiPgogICAgICAgICAgICAgICAgICBCdWcgUmVwb3J0IC8gRmVhdHVyZSBSZXF1ZXN0CiAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWxwVXJsXV0iPgogICAgICAgICAgICAgIDxhIGhyZWYkPSJbW2hlbHBVcmxdXSIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+CiAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscC1vdXRsaW5lIiB0aXRsZT0iVmlldyBkb2N1bWVudGF0aW9uIj4KICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci10YWJzPgogICAgICA8L3BhcGVyLXRvb2xiYXI+CiAgICAgIDxpcm9uLXBhZ2VzIHNlbGVjdGVkPSJbW19zZWxlY3RlZFRhYl1dIiBjbGFzcz0iZml0IHRhYi12aWV3Ij4KICAgICAgICA8ZGl2IGlkPSIwIiBjbGFzcz0idGFiIj4KICAgICAgICAgIDx0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIiBlbmFibGUtc2hvdy1tZXRyaWNzPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBpZD0iMSIgY2xhc3M9InRhYiI+CiAgICAgICAgICA8dGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIiBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9IjIiIGNsYXNzPSJ0YWIiPgogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3IGJhY2tlbmQ9IltbYmFja2VuZF1dIiBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIgY29uZmlndXJhdGlvbj0iW1tjb25maWd1cmF0aW9uXV0iIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSI+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3PgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tcGFnZXM+CiAgICA8L3BhcGVyLWhlYWRlci1wYW5lbD4KCiAgICA8c3R5bGU+CiAgICAgIC50YWItdmlldyB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC50YWItYmFyIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgfQogICAgICAudGFiIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgcGFwZXItdGFicyB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci10YWJzLWNvbnRlbnQ6IHsKICAgICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIH0KICAgICAgfQogICAgICB0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuaGVscC1hbmQtZmVlZGJhY2sgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyAvKiBFbnN1cmUgdGhhdCBpY29ucyBzdGF5IGFsaWduZWQgKi8KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICAgICNidWctcmVwb3J0IHsKICAgICAgICBib3JkZXI6IHNvbGlkIGJsYWNrOwogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmRzOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBtYXgtd2lkdGg6IDE1MHB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KICAgICAgLmhlbHAtYW5kLWZlZWRiYWNrIGEgewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KCiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1ocGFyYW1zLW1haW4iPgogIDx0ZW1wbGF0ZT4KICAgIDx2YWFkaW4tc3BsaXQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8dGYtaHBhcmFtcy1xdWVyeS1wYW5lIGlkPSJxdWVyeS1wYW5lIiBiYWNrZW5kPSJbW2JhY2tlbmRdXSIgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iIGNvbmZpZ3VyYXRpb249Int7X2NvbmZpZ3VyYXRpb259fSIgc2Vzc2lvbi1ncm91cHM9Int7X3Nlc3Npb25Hcm91cHN9fSI+CiAgICAgICAgPC90Zi1ocGFyYW1zLXF1ZXJ5LXBhbmU+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSBpZD0ic2Vzc2lvbnMtcGFuZSIgYmFja2VuZD0iW1tiYWNrZW5kXV0iIGhlbHAtdXJsPSJbW2hlbHBVcmxdXSIgYnVnLXJlcG9ydC11cmw9IltbYnVnUmVwb3J0VXJsXV0iIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIiBjb25maWd1cmF0aW9uPSJbW19jb25maWd1cmF0aW9uXV0iIHNlc3Npb24tZ3JvdXBzPSJbW19zZXNzaW9uR3JvdXBzXV0iPgogICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lPgogICAgICA8L2Rpdj4KICAgIDwvdmFhZGluLXNwbGl0LWxheW91dD4KICAgIDx0Zi1ocGFyYW1zLWdvb2dsZS1hbmFseXRpY3MtdHJhY2tlciBpZD0idHJhY2tlciIgdHJhY2tpbmctaWQ9IltbdHJhY2tpbmdJZF1dIiBuYW1lPSJ0Zl9ocGFyYW1zIj4KICAgIDwvdGYtaHBhcmFtcy1nb29nbGUtYW5hbHl0aWNzLXRyYWNrZXI+CgogICAgPHN0eWxlPgogICAgICB2YWFkaW4tc3BsaXQtbGF5b3V0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnNpZGViYXIgewogICAgICAgIHdpZHRoOiAyMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBtaW4td2lkdGg6IDEwJTsKICAgICAgfQoKICAgICAgLmNlbnRlciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtaHBhcmFtcy1kYXNoYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIAogICAgPHRmLWhwYXJhbXMtbWFpbiBpZD0iaHBhcmFtcy1tYWluIiBiYWNrZW5kPSJbW19iYWNrZW5kXV0iIGV4cGVyaW1lbnQtbmFtZT0iIj4KICAgIDwvdGYtaHBhcmFtcy1tYWluPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCjxkb20tbW9kdWxlIGlkPSJ0Zi1tZXNoLWxvYWRlciI+CiAgPHRlbXBsYXRlPgogICAgPHRmLWNhcmQtaGVhZGluZyBjb2xvcj0iW1tfcnVuQ29sb3JdXSIgY2xhc3M9InRmLW1lc2gtbG9hZGVyLWhlYWRlciI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTYW1wbGVzKG9mU2FtcGxlcyldXSI+CiAgICAgICAgPGRpdj5zYW1wbGU6IFtbX2dldFNhbXBsZVRleHQoc2FtcGxlKV1dIG9mIFtbb2ZTYW1wbGVzXV08L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNBdExlYXN0T25lU3RlcChfc3RlcHMpXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwCiAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCI+W1t0b0xvY2FsZVN0cmluZ18oX3N0ZXBWYWx1ZSldXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0Ij4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19jdXJyZW50V2FsbFRpbWVdXSI+CiAgICAgICAgICAgICAgW1tfY3VycmVudFdhbGxUaW1lXV0KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwgcmlnaHQiPgogICAgICAgICAgICA8cGFwZXItc3Bpbm5lci1saXRlIGFjdGl2ZSBoaWRkZW4kPSJbWyFfaXNNZXNoTG9hZGluZ11dIj4KICAgICAgICAgICAgPC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVN0ZXBzKF9zdGVwcyldXSI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci1zbGlkZXIgaWQ9InN0ZXBzIiBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IiBtYXg9IltbX2dldE1heFN0ZXBJbmRleChfc3RlcHMpXV0iIG1heC1tYXJrZXJzPSJbW19nZXRNYXhTdGVwSW5kZXgoX3N0ZXBzKV1dIiBzbmFwcyBzdGVwPSIxIiB2YWx1ZT0ie3tfc3RlcEluZGV4fX0iPjwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDFweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDFweDsKICAgICAgfQogICAgICAudGYtbWVzaC1sb2FkZXItaGVhZGVyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwNXB4OwogICAgICB9CiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CiAgCjwvZG9tLW1vZHVsZT4KCgoKPGRvbS1tb2R1bGUgaWQ9Im1lc2gtZGFzaGJvYXJkIj4KICA8dGVtcGxhdGU+CiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBzbG90PSJzaWRlYmFyIiBjbGFzcz0iYWxsLWNvbnRyb2xzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gdmlldy1jb250cm9sIj4KICAgICAgICAgIDxoMyBjbGFzcz0idGl0bGUiPlBvaW50IG9mIHZpZXc8L2gzPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIGlkPSJ2aWV3LXJhZGlvLWdyb3VwIiBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRWaWV3fX0iPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9ImFsbC1yYWRpby1idXR0b24iIG5hbWU9ImFsbCI+CiAgICAgICAgICAgICAgICBEaXNwbGF5IGFsbCBwb2ludHMKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0iYWxsLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgWm9vbSBhbmQgY2VudGVyIGNhbWVyYSB0byBkaXNwbGF5IGFsbCBwb2ludHMgYXQgb25jZS4gTm90ZSwgdGhhdAogICAgICAgICAgICAgICAgc29tZSBwb2ludHMgY291bGQgYmUgdG9vIGZhciAoaS5lLiB0b28gc21hbGwpIHRvIGJlIHZpc2libGUuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9InVzZXItcmFkaW8tYnV0dG9uIiBuYW1lPSJ1c2VyIj4KICAgICAgICAgICAgICAgIEN1cnJlbnQgdmlldwogICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci10b29sdGlwIGFuaW1hdGlvbi1kZWxheT0iMCIgZm9yPSJ1c2VyLXJhZGlvLWJ1dHRvbiIgcG9zaXRpb249InJpZ2h0IiBvZmZzZXQ9IjAiPgogICAgICAgICAgICAgICAgS2VlcCBjdXJyZW50IGNhbWVyYSBwb3NpdGlvbiBhbmQgem9vbSBsZXZlbC4KICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0ic2hhcmUtcmFkaW8tYnV0dG9uIiBuYW1lPSJzaGFyZSI+CiAgICAgICAgICAgICAgICBTaGFyZSB2aWV3cG9pbnQKICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBhbmltYXRpb24tZGVsYXk9IjAiIGZvcj0ic2hhcmUtcmFkaW8tYnV0dG9uIiBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCI+CiAgICAgICAgICAgICAgICBTaGFyZSB2aWV3cG9pbnQgYW1vbmcgYWxsIGNhbWVyYXMuCiAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHBvaW50IGNsb3VkIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT4KICAgICAgICAgICAgICAgIFlvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgcG9pbnQgY2xvdWQgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCI+UkVBRE1FPC9hPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hPi4KICAgICAgICAgICAgCgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIAogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3IGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIj4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbWVzaC1sb2FkZXIgYWN0aXZlPSJbW2FjdGl2ZV1dIiBzZWxlY3RlZC12aWV3PSJbW19zZWxlY3RlZFZpZXddXSIgcnVuPSJbW2l0ZW0ucnVuXV0iIHRhZz0iW1tpdGVtLnRhZ11dIiBzYW1wbGU9IltbaXRlbS5zYW1wbGVdXSIgb2Ytc2FtcGxlcz0iW1tpdGVtLm9mU2FtcGxlc11dIiByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iIGNsYXNzPSJ0Zi1tZXNoLWxvYWRlci1jb250YWluZXIiIG9uLWNhbWVyYS1wb3NpdGlvbi1jaGFuZ2U9Il9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlZCI+CiAgICAgICAgICAgICAgICA8L3RmLW1lc2gtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gaDMudGl0bGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQoKICAgICAgLnJ1bnMtc2VsZWN0b3IgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQoKICAgICAgdGYtcnVucy1zZWxlY3RvciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLnZpZXctY29udHJvbCB7CiAgICAgICAgZGlzcGxheTogYmxvY2sgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnZpZXctY29udHJvbCBoMy50aXRsZSB7CiAgICAgICAgcGFkZGluZy10b3A6IDE2cHg7CiAgICAgICAgcGFkZGluZy1ib3R0b206IDE2cHg7CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyAudmlldy1jb250cm9sIHBhcGVyLXJhZGlvLWdyb3VwIHsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KICAgICAgLyogTGF5b3V0IG11c3QgYmUgaG9yaXpvbnRhbCwgaS5lLiBpdGVtcyBhcnJhbmdlZCBpbiBhIHJvdy4gSWYgaXRlbXMgY2Fubm90IGZpdCBpbiBhIHJvdywKICAgICAgICogdGhleSBzaG91bGQgYmUgbW92ZWQgdG8gbmV4dCBsaW5lLiBBbGwgaXRlbXMgbXVzdCBiZSBzcXVhcmUgYXQgYWxsIHRpbWVzLiBNaW5pbXVtIHNpemUgb2YKICAgICAgICogdGhlIGl0ZW0gaXMgNDgwcHguIFRoaXMgbWVhbnMgdGhhdCBtYXhpbXVtIHNpemUgb2YgdGhlIGl0ZW0gbXVzdCBiZSA0ODBweCArIDQ3OXB4ID0gOTU5cHguCiAgICAgICAqICovCiAgICAgIC5ob3Jpem9udGFsIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CiAgICAgIHRmLW1lc2gtbG9hZGVyIHsKICAgICAgICB3aWR0aDogNDgwcHg7CiAgICAgICAgZmxleC1iYXNpczogNDgwcHg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CgogIAo8L2RvbS1tb2R1bGU+CgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgo8ZG9tLW1vZHVsZSBpZD0idGYtdGVuc29yYm9hcmQiPgogIDx0ZW1wbGF0ZT4KICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcCBpZD0ic2V0dGluZ3MiPgogICAgICA8aDI+U2V0dGluZ3M8L2gyPgogICAgICA8cGFwZXItY2hlY2tib3ggaWQ9ImF1dG8tcmVsb2FkLWNoZWNrYm94IiBjaGVja2VkPSJ7e2F1dG9SZWxvYWRFbmFibGVkfX0iPgogICAgICAgIFJlbG9hZCBkYXRhIGV2ZXJ5IDxzcGFuPltbYXV0b1JlbG9hZEludGVydmFsU2Vjc11dPC9zcGFuPnMuCiAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgIDxwYXBlci1pbnB1dCBpZD0icGFnaW5hdGlvbkxpbWl0SW5wdXQiIGxhYmVsPSJQYWdpbmF0aW9uIGxpbWl0IiBhbHdheXMtZmxvYXQtbGFiZWwgdHlwZT0ibnVtYmVyIiBtaW49IjEiIHN0ZXA9IjEiIG9uLWNoYW5nZT0iX3BhZ2luYXRpb25MaW1pdENoYW5nZWQiIG9uLXZhbHVlLWNoYW5nZWQ9Il9wYWdpbmF0aW9uTGltaXRWYWxpZGF0ZSI+PC9wYXBlci1pbnB1dD4KICAgIDwvcGFwZXItZGlhbG9nPgogICAgPHBhcGVyLWhlYWRlci1wYW5lbD4KICAgICAgPHBhcGVyLXRvb2xiYXIgaWQ9InRvb2xiYXIiIHNsb3Q9ImhlYWRlciIgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgPGRpdiBpZD0idG9vbGJhci1jb250ZW50IiBzbG90PSJ0b3AiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaG9tZVBhdGhdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvb2xiYXItdGl0bGUiPltbYnJhbmRdXTwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaG9tZVBhdGhdXSI+CiAgICAgICAgICAgIDxhIGhyZWY9IltbX2hvbWVQYXRoXV0iIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciIgY2xhc3M9InRvb2xiYXItdGl0bGUiPltbYnJhbmRdXTwvYT4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2FjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWRdXSI+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0b29sYmFyLW1lc3NhZ2UiPgogICAgICAgICAgICAgIExvYWRpbmcgYWN0aXZlIGRhc2hib2FyZHPigKYKICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZF1dIj4KICAgICAgICAgICAgPHBhcGVyLXRhYnMgbm9pbmsgc2Nyb2xsYWJsZSBzZWxlY3RlZD0ie3tfc2VsZWN0ZWREYXNoYm9hcmR9fSIgYXR0ci1mb3Itc2VsZWN0ZWQ9ImRhdGEtZGFzaGJvYXJkIj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19kYXNoYm9hcmREYXRhXV0iIGFzPSJkYXNoYm9hcmREYXR1bSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzRGFzaGJvYXJkQWN0aXZlKGRpc2FibGVkRGFzaGJvYXJkcywgX2FjdGl2ZURhc2hib2FyZHMsIGRhc2hib2FyZERhdHVtKV1dIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXRhYiBkYXRhLWRhc2hib2FyZCQ9IltbZGFzaGJvYXJkRGF0dW0ucGx1Z2luXV0iIHRpdGxlPSJbW2Rhc2hib2FyZERhdHVtLnRhYk5hbWVdXSI+CiAgICAgICAgICAgICAgICAgICAgW1tkYXNoYm9hcmREYXR1bS50YWJOYW1lXV0KICAgICAgICAgICAgICAgICAgPC9wYXBlci10YWI+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItdGFicz4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pbmFjdGl2ZURhc2hib2FyZHNFeGlzdChfZGFzaGJvYXJkRGF0YSwgZGlzYWJsZWREYXNoYm9hcmRzLCBfYWN0aXZlRGFzaGJvYXJkcyldXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IklOQUNUSVZFIiBuby1sYWJlbC1mbG9hdCBub2luayBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEycHgiPgogICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggaWQ9ImluYWN0aXZlLWRhc2hib2FyZHMtbWVudSIgc2xvdD0iZHJvcGRvd24tY29udGVudCIgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkRGFzaGJvYXJkfX0iIGF0dHItZm9yLXNlbGVjdGVkPSJkYXRhLWRhc2hib2FyZCI+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2Rhc2hib2FyZERhdGFdXSIgYXM9ImRhc2hib2FyZERhdHVtIj4KICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzRGFzaGJvYXJkSW5hY3RpdmUoZGlzYWJsZWREYXNoYm9hcmRzLCBfYWN0aXZlRGFzaGJvYXJkcywgZGFzaGJvYXJkRGF0dW0pXV0iIHJlc3RhbXA+CiAgICAgICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBkYXRhLWRhc2hib2FyZCQ9IltbZGFzaGJvYXJkRGF0dW0ucGx1Z2luXV0iPltbZGFzaGJvYXJkRGF0dW0udGFiTmFtZV1dPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDxkaXYgY2xhc3M9Imdsb2JhbC1hY3Rpb25zIj4KICAgICAgICAgICAgPHNsb3QgbmFtZT0iaW5qZWN0ZWQtaGVhZGVyLWl0ZW1zIj48L3Nsb3Q+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpZD0icmVsb2FkLWJ1dHRvbiIgY2xhc3MkPSJbW19nZXREYXRhUmVmcmVzaGluZ0NsYXNzKF9yZWZyZXNoaW5nKV1dIiBkaXNhYmxlZCQ9IltbX2lzUmVsb2FkRGlzYWJsZWRdXSIgaWNvbj0icmVmcmVzaCIgb24tdGFwPSJyZWxvYWQiIHRpdGxlJD0iTGFzdCB1cGRhdGVkOiBbW19sYXN0UmVsb2FkVGltZVNob3J0XV0iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJzZXR0aW5ncyIgb24tdGFwPSJvcGVuU2V0dGluZ3MiIGlkPSJzZXR0aW5ncy1idXR0b24iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIgcmVsPSJub29wZW5lciBub3JlZmVycmVyIiB0YWJpbmRleD0iLTEiIHRhcmdldD0iX2JsYW5rIj4KICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iaGVscC1vdXRsaW5lIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICA8L2E+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9wYXBlci10b29sYmFyPgoKICAgICAgPGRpdiBpZD0iY29udGVudC1wYW5lIiBjbGFzcz0iZml0Ij4KICAgICAgICA8c2xvdCBuYW1lPSJpbmplY3RlZC1vdmVydmlldyI+PC9zbG90PgogICAgICAgIDxkaXYgaWQ9ImNvbnRlbnQiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19hY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nLW1lc3NhZ2UiPgogICAgICAgICAgICAgIDxoMz5GYWlsZWQgdG8gbG9hZCB0aGUgc2V0IG9mIGFjdGl2ZSBkYXNoYm9hcmRzLjwvaDM+CiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICBUaGlzIGNhbiBvY2N1ciBpZiB0aGUgVGVuc29yQm9hcmQgYmFja2VuZCBpcyBubyBsb25nZXIgcnVubmluZy4KICAgICAgICAgICAgICAgIFBlcmhhcHMgdGhpcyBwYWdlIGlzIGNhY2hlZD8KICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgdGhhdCB5b3XigJl2ZSBmaXhlZCB0aGUgcHJvYmxlbSwgY2xpY2sgdGhlIHJlbG9hZAogICAgICAgICAgICAgICAgYnV0dG9uIGluIHRoZSB0b3AtcmlnaHQuCiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbYXV0b1JlbG9hZEVuYWJsZWRdXSI+CiAgICAgICAgICAgICAgICAgIFdl4oCZbGwgdHJ5IHRvIHJlbG9hZCBldmVyeQogICAgICAgICAgICAgICAgICBbW2F1dG9SZWxvYWRJbnRlcnZhbFNlY3NdXSZuYnNwO3NlY29uZHMgYXMgd2VsbC4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgCgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgPGk+TGFzdCByZWxvYWQ6IFtbX2xhc3RSZWxvYWRUaW1lXV08L2k+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFMb2NhdGlvbl1dIj4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT48cD4KICAgICAgICAgICAgICAgICAgICA8aT5Mb2cgZGlyZWN0b3J5OgogICAgICAgICAgICAgICAgICAgICAgPHNwYW4gaWQ9ImRhdGFfbG9jYXRpb24iPltbX2RhdGFMb2NhdGlvbl1dPC9zcGFuPjwvaT4KICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zaG93Tm9EYXNoYm9hcmRzTWVzc2FnZV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0id2FybmluZy1tZXNzYWdlIj4KICAgICAgICAgICAgICA8aDM+Tm8gZGFzaGJvYXJkcyBhcmUgYWN0aXZlIGZvciB0aGUgY3VycmVudCBkYXRhIHNldC48L2gzPgogICAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczoKICAgICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj5SRUFETUU8L2E+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCI+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2E+LgogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2E+CiAgICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgICAKCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICA8aT5MYXN0IHJlbG9hZDogW1tfbGFzdFJlbG9hZFRpbWVdXTwvaT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvY2F0aW9uXV0iPgogICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPjxwPgogICAgICAgICAgICAgICAgICAgIDxpPkRhdGEgbG9jYXRpb246CiAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBpZD0iZGF0YV9sb2NhdGlvbiI+W1tfZGF0YUxvY2F0aW9uXV08L3NwYW4+PC9pPgogICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIDxwPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nob3dOb1N1Y2hEYXNoYm9hcmRNZXNzYWdlXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nLW1lc3NhZ2UiPgogICAgICAgICAgICAgIDxoMz4KICAgICAgICAgICAgICAgIFRoZXJl4oCZcyBubyBkYXNoYm9hcmQgYnkgdGhlIG5hbWUgb2YKICAgICAgICAgICAgICAgIOKAnDx0dD5bW19zZWxlY3RlZERhc2hib2FyZF1dPC90dD4u4oCdCiAgICAgICAgICAgICAgPC9oMz4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2FjdGl2ZURhc2hib2FyZHNMb2FkZWRdXSI+CiAgICAgICAgICAgICAgICA8cD5Zb3UgY2FuIHNlbGVjdCBhIGRhc2hib2FyZCBmcm9tIHRoZSBsaXN0IGFib3ZlLgoKICAgICAgICAgICAgICA8cD4KICAgICAgICAgICAgICAgIDxpPkxhc3QgcmVsb2FkOiBbW19sYXN0UmVsb2FkVGltZV1dPC9pPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTG9jYXRpb25dXSI+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+PHA+CiAgICAgICAgICAgICAgICAgICAgPGk+RGF0YSBsb2NhdGlvbjoKICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGlkPSJkYXRhX2xvY2F0aW9uIj5bW19kYXRhTG9jYXRpb25dXTwvc3Bhbj48L2k+CiAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+PC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpZD0iZGFzaGJvYXJkcy10ZW1wbGF0ZSIgaXRlbXM9IltbX2Rhc2hib2FyZERhdGFdXSIgYXM9ImRhc2hib2FyZERhdHVtIiBvbi1kb20tY2hhbmdlPSJfb25UZW1wbGF0ZUNoYW5nZWQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkYXNoYm9hcmQtY29udGFpbmVyIiBkYXRhLWRhc2hib2FyZCQ9IltbZGFzaGJvYXJkRGF0dW0ucGx1Z2luXV0iIGRhdGEtc2VsZWN0ZWQkPSJbW19zZWxlY3RlZFN0YXR1cyhfc2VsZWN0ZWREYXNoYm9hcmQsIGRhc2hib2FyZERhdHVtLnBsdWdpbildXSI+CiAgICAgICAgICAgICAgCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L3BhcGVyLWhlYWRlci1wYW5lbD4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS0xMDApOwogICAgICB9CgogICAgICAjdG9vbGJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKAogICAgICAgICAgLS10Yi10b29sYmFyLWJhY2tncm91bmQtY29sb3IsCiAgICAgICAgICB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKQogICAgICAgICk7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDZweDsKICAgICAgICAvKiBJbmNyZWFzZSBjbGlja2FibGUgYXJlYSBmb3IgY2FzZSB3aGVyZSB0aXRsZSBpcyBhbiBhbmNob3IuICovCiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICAgIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyNWVtOwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZGlzcGxheTogdmFyKC0tdGItdG9vbGJhci10aXRsZS1kaXNwbGF5LCBibG9jayk7CiAgICAgIH0KCiAgICAgIGEudG9vbGJhci10aXRsZSB7CiAgICAgICAgLyogT3ZlcnJpZGUgZGVmYXVsdCBhbmNob3IgY29sb3IuICovCiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgLyogT3ZlcnJpZGUgZGVmYXVsdCBhbmNob3IgdGV4dC1kZWNvcmF0aW9uLiAqLwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItbWVzc2FnZSB7CiAgICAgICAgb3BhY2l0eTogMC43OwogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICBwYXBlci10YWJzIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtLXBhcGVyLXRhYnMtY29udGVudDogewogICAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3I6IHdoaXRlOwogICAgICAgIC0tcGFwZXItZHJvcGRvd24tbWVudS1pY29uOiB7CiAgICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItZHJvcGRvd24tbWVudS1pbnB1dDogewogICAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSBwYXBlci1pdGVtIHsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICB9CgogICAgICAjaW5hY3RpdmUtZGFzaGJvYXJkcy1tZW51IHsKICAgICAgICAtLXBhcGVyLWxpc3Rib3gtYmFja2dyb3VuZC1jb2xvcjogdmFyKAogICAgICAgICAgLS10Yi10b29sYmFyLWJhY2tncm91bmQtY29sb3IsCiAgICAgICAgICB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKQogICAgICAgICk7CiAgICAgICAgLS1wYXBlci1saXN0Ym94LWNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmdsb2JhbC1hY3Rpb25zIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsgLyogRW5zdXJlIHRoYXQgaWNvbnMgc3RheSBhbGlnbmVkICovCiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgLmdsb2JhbC1hY3Rpb25zIGEgewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgfQoKICAgICAgI3Rvb2xiYXItY29udGVudCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgI2NvbnRlbnQtcGFuZSB7CiAgICAgICAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHN0cmV0Y2g7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNjb250ZW50IHsKICAgICAgICBmbGV4OiAxIDE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmRhc2hib2FyZC1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLyogSGlkZSB1bnNlbGVjdGVkIGRhc2hib2FyZHMuIFdlIHN0aWxsIGRpc3BsYXkgdGhlbSB3aXRoaW4gYSBjb250YWluZXIKICAgICAgICAgb2YgaGVpZ2h0IDAgc2luY2UgUGxvdHRhYmxlIHByb2R1Y2VzIGRlZ2VuZXJhdGUgY2hhcnRzIHdoZW4gY2hhcnRzIGFyZQogICAgICAgICByZWxvYWRlZCB3aGlsZSBub3QgZGlzcGxheWVkLiAqLwogICAgICAuZGFzaGJvYXJkLWNvbnRhaW5lcjpub3QoW2RhdGEtc2VsZWN0ZWRdKSB7CiAgICAgICAgbWF4LWhlaWdodDogMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICAvKiogV2UgZnVydGhlciBtYWtlIGNvbnRhaW5lcnMgaW52aXNpYmxlLiBTb21lIGVsZW1lbnRzIG1heSBhbmNob3IgdG8KICAgICAgICAgICAgdGhlIHZpZXdwb3J0IGluc3RlYWQgb2YgdGhlIGNvbnRhaW5lciwgaW4gd2hpY2ggY2FzZSBzZXR0aW5nIHRoZSBtYXgKICAgICAgICAgICAgaGVpZ2h0IGhlcmUgdG8gMCB3aWxsIG5vdCBoaWRlIHRoZW0uICovCiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAuZGFzaGJvYXJkLWNvbnRhaW5lciBpZnJhbWUgewogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC53YXJuaW5nLW1lc3NhZ2UgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CgogICAgICBbZGlzYWJsZWRdIHsKICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CgogICAgICAjcmVsb2FkLWJ1dHRvbi5yZWZyZXNoaW5nIHsKICAgICAgICBhbmltYXRpb246IHJvdGF0ZSAycyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgcm90YXRlIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KICAKICAKPC9kb20tbW9kdWxlPgoKCiAgPGJvZHk+CiAgICA8dGYtdGVuc29yYm9hcmQgdXNlLWhhc2ggYnJhbmQ9IlRlbnNvckJvYXJkIj48L3RmLXRlbnNvcmJvYXJkPgogIAoKPHNjcmlwdCBzcmM9ImluZGV4LmpzIj48L3NjcmlwdD4=", "ok": true, "headers": [ [ "content-type", "text/html; charset=utf-8" ] ], "status": 200, "status_text": "" }, "https://localhost:46855/font-roboto/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2": { "data": "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", "ok": true, "headers": [ [ "content-type", "font/woff2" ] ], "status": 200, "status_text": "" }, "https://localhost:46855/index.js": { "data": "dmFyIENMT1NVUkVfTk9fREVQUyA9IHRydWU7Ci8vIENvcHlyaWdodCAyMDA2IFRoZSBDbG9zdXJlIExpYnJhcnkgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLy8KLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci8vCi8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi8vCi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTLUlTIiBCQVNJUywKLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgovKioKICogQGZpbGVvdmVydmlldyBCb290c3RyYXAgZm9yIHRoZSBHb29nbGUgSlMgTGlicmFyeSAoQ2xvc3VyZSkuCiAqCiAqIEluIHVuY29tcGlsZWQgbW9kZSBiYXNlLmpzIHdpbGwgYXR0ZW1wdCB0byBsb2FkIENsb3N1cmUncyBkZXBzIGZpbGUsIHVubGVzcwogKiB0aGUgZ2xvYmFsIDxjb2RlPkNMT1NVUkVfTk9fREVQUzwvY29kZT4gaXMgc2V0IHRvIHRydWUuICBUaGlzIGFsbG93cyBwcm9qZWN0cwogKiB0byBpbmNsdWRlIHRoZWlyIG93biBkZXBzIGZpbGUocykgZnJvbSBkaWZmZXJlbnQgbG9jYXRpb25zLgogKgogKiBBdm9pZCBpbmNsdWRpbmcgYmFzZS5qcyBtb3JlIHRoYW4gb25jZS4gVGhpcyBpcyBzdHJpY3RseSBkaXNjb3VyYWdlZCBhbmQgbm90CiAqIHN1cHBvcnRlZC4gZ29vZy5yZXF1aXJlKC4uLikgd29uJ3Qgd29yayBwcm9wZXJseSBpbiB0aGF0IGNhc2UuCiAqCiAqIEBwcm92aWRlR29vZwogKi8KCgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gT3ZlcnJpZGRlbiB0byB0cnVlIGJ5IHRoZSBjb21waWxlci4KICovCnZhciBDT01QSUxFRCA9IGZhbHNlOwoKCi8qKgogKiBCYXNlIG5hbWVzcGFjZSBmb3IgdGhlIENsb3N1cmUgbGlicmFyeS4gIENoZWNrcyB0byBzZWUgZ29vZyBpcyBhbHJlYWR5CiAqIGRlZmluZWQgaW4gdGhlIGN1cnJlbnQgc2NvcGUgYmVmb3JlIGFzc2lnbmluZyB0byBwcmV2ZW50IGNsb2JiZXJpbmcgaWYKICogYmFzZS5qcyBpcyBsb2FkZWQgbW9yZSB0aGFuIG9uY2UuCiAqCiAqIEBjb25zdAogKi8KdmFyIGdvb2cgPSBnb29nIHx8IHt9OwoKLyoqCiAqIFJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4KICogaHR0cHM6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi85LjAvaW5kZXguaHRtbCNzZWMtZ2xvYmFsLW9iamVjdAogKgogKiBNb3JlIGluZm8gb24gdGhpcyBpbXBsZW1lbnRhdGlvbiBoZXJlOgogKiBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzFOQWVXNFdrN0k3RlYwWTJ0Y1VGdlFkR01jODlrMnZkZ1NYSW53OF9udkNJL2VkaXQKICoKICogQGNvbnN0CiAqIEBzdXBwcmVzcyB7dW5kZWZpbmVkVmFyc30gc2VsZiB3b24ndCBiZSByZWZlcmVuY2VkIHVubGVzcyBgdGhpc2AgaXMgZmFsc3kuCiAqIEB0eXBlIHshR2xvYmFsfQogKi8KZ29vZy5nbG9iYWwgPQogICAgLy8gQ2hlY2sgYHRoaXNgIGZpcnN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgIC8vIFZhbGlkIHVubGVzcyBydW5uaW5nIGFzIGFuIEVTIG1vZHVsZSBvciBpbiBhIGZ1bmN0aW9uIHdyYXBwZXIgY2FsbGVkCiAgICAvLyAgIHdpdGhvdXQgc2V0dGluZyBgdGhpc2AgcHJvcGVybHkuCiAgICAvLyBOb3RlIHRoYXQgYmFzZS5qcyBjYW4ndCB1c2VmdWxseSBiZSBpbXBvcnRlZCBhcyBhbiBFUyBtb2R1bGUsIGJ1dCBpdCBtYXkKICAgIC8vIGJlIGNvbXBpbGVkIGludG8gYnVuZGxlcyB0aGF0IGFyZSBsb2FkYWJsZSBhcyBFUyBtb2R1bGVzLgogICAgdGhpcyB8fAogICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9zZWxmCiAgICAvLyBGb3IgaW4tcGFnZSBicm93c2VyIGVudmlyb25tZW50cyBhbmQgd29ya2Vycy4KICAgIHNlbGY7CgoKLyoqCiAqIEEgaG9vayBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmaW5lIHZhbHVlcyBpbiB1bmNvbXBpbGVkIG1vZGUuCiAqCiAqIEluIHVuY29tcGlsZWQgbW9kZSwgYENMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTYCBtYXkgYmUgZGVmaW5lZCBiZWZvcmUKICogbG9hZGluZyBiYXNlLmpzLiAgSWYgYSBrZXkgaXMgZGVmaW5lZCBpbiBgQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVNgLAogKiBgZ29vZy5kZWZpbmVgIHdpbGwgdXNlIHRoZSB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHZhbHVlLiAgVGhpcwogKiBhbGxvd3MgZmxhZ3MgdG8gYmUgb3ZlcndyaXR0ZW4gd2l0aG91dCBjb21waWxhdGlvbiAodGhpcyBpcyBub3JtYWxseQogKiBhY2NvbXBsaXNoZWQgd2l0aCB0aGUgY29tcGlsZXIncyAiZGVmaW5lIiBmbGFnKS4KICoKICogRXhhbXBsZToKICogPHByZT4KICogICB2YXIgQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVMgPSB7J2dvb2cuREVCVUcnOiBmYWxzZX07CiAqIDwvcHJlPgogKgogKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgKHN0cmluZ3xudW1iZXJ8Ym9vbGVhbik+fHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTOwoKCi8qKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmluZSB2YWx1ZXMgaW4gdW5jb21waWxlZCBvciBjb21waWxlZCBtb2RlLAogKiBsaWtlIENMT1NVUkVfVU5DT01QSUxFRF9ERUZJTkVTIGJ1dCBlZmZlY3RpdmUgaW4gY29tcGlsZWQgY29kZS4gIEluCiAqIHVuY29tcGlsZWQgY29kZSBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyB0YWtlcyBwcmVjZWRlbmNlLgogKgogKiBBbHNvIHVubGlrZSBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyB0aGUgdmFsdWVzIG11c3QgYmUgbnVtYmVyLCBib29sZWFuIG9yCiAqIHN0cmluZyBsaXRlcmFscyBvciB0aGUgY29tcGlsZXIgd2lsbCBlbWl0IGFuIGVycm9yLgogKgogKiBXaGlsZSBhbnkgQGRlZmluZSB2YWx1ZSBtYXkgYmUgc2V0LCBvbmx5IHRob3NlIHNldCB3aXRoIGdvb2cuZGVmaW5lIHdpbGwgYmUKICogZWZmZWN0aXZlIGZvciB1bmNvbXBpbGVkIGNvZGUuCiAqCiAqIEV4YW1wbGU6CiAqIDxwcmU+CiAqICAgdmFyIENMT1NVUkVfREVGSU5FUyA9IHsnZ29vZy5ERUJVRyc6IGZhbHNlfSA7CiAqIDwvcHJlPgogKgogKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgKHN0cmluZ3xudW1iZXJ8Ym9vbGVhbik+fHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfREVGSU5FUzsKCgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgbm90IHVuZGVmaW5lZC4KICoKICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBkZWZpbmVkLgogKiBAZGVwcmVjYXRlZCBVc2UgYHZhbCAhPT0gdW5kZWZpbmVkYCBpbnN0ZWFkLgogKi8KZ29vZy5pc0RlZiA9IGZ1bmN0aW9uKHZhbCkgewogIC8vIHZvaWQgMCBhbHdheXMgZXZhbHVhdGVzIHRvIHVuZGVmaW5lZCBhbmQgaGVuY2Ugd2UgZG8gbm90IG5lZWQgdG8gZGVwZW5kIG9uCiAgLy8gdGhlIGRlZmluaXRpb24gb2YgdGhlIGdsb2JhbCB2YXJpYWJsZSBuYW1lZCAndW5kZWZpbmVkJy4KICByZXR1cm4gdmFsICE9PSB2b2lkIDA7Cn07CgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYSBzdHJpbmcuCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYSBzdHJpbmcuCiAqIEBkZXByZWNhdGVkIFVzZSBgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZydgIGluc3RlYWQuCiAqLwpnb29nLmlzU3RyaW5nID0gZnVuY3Rpb24odmFsKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gJ3N0cmluZyc7Cn07CgoKLyoqCiAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGEgYm9vbGVhbi4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBib29sZWFuLgogKiBAZGVwcmVjYXRlZCBVc2UgYHR5cGVvZiB2YWwgPT09ICdib29sZWFuJ2AgaW5zdGVhZC4KICovCmdvb2cuaXNCb29sZWFuID0gZnVuY3Rpb24odmFsKSB7CiAgcmV0dXJuIHR5cGVvZiB2YWwgPT0gJ2Jvb2xlYW4nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIG51bWJlci4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBhIG51bWJlci4KICogQGRlcHJlY2F0ZWQgVXNlIGB0eXBlb2YgdmFsID09PSAnbnVtYmVyJ2AgaW5zdGVhZC4KICovCmdvb2cuaXNOdW1iZXIgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gdHlwZW9mIHZhbCA9PSAnbnVtYmVyJzsKfTsKCgovKioKICogQnVpbGRzIGFuIG9iamVjdCBzdHJ1Y3R1cmUgZm9yIHRoZSBwcm92aWRlZCBuYW1lc3BhY2UgcGF0aCwgZW5zdXJpbmcgdGhhdAogKiBuYW1lcyB0aGF0IGFscmVhZHkgZXhpc3QgYXJlIG5vdCBvdmVyd3JpdHRlbi4gRm9yIGV4YW1wbGU6CiAqICJhLmIuYyIgLT4gYSA9IHt9O2EuYj17fTthLmIuYz17fTsKICogVXNlZCBieSBnb29nLnByb3ZpZGUgYW5kIGdvb2cuZXhwb3J0U3ltYm9sLgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBuYW1lIG9mIHRoZSBvYmplY3QgdGhhdCB0aGlzIGZpbGUgZGVmaW5lcy4KICogQHBhcmFtIHsqPX0gb3B0X29iamVjdCB0aGUgb2JqZWN0IHRvIGV4cG9zZSBhdCB0aGUgZW5kIG9mIHRoZSBwYXRoLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmplY3RUb0V4cG9ydFRvIFRoZSBvYmplY3QgdG8gYWRkIHRoZSBwYXRoIHRvOyBkZWZhdWx0CiAqICAgICBpcyBgZ29vZy5nbG9iYWxgLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5leHBvcnRQYXRoXyA9IGZ1bmN0aW9uKG5hbWUsIG9wdF9vYmplY3QsIG9wdF9vYmplY3RUb0V4cG9ydFRvKSB7CiAgdmFyIHBhcnRzID0gbmFtZS5zcGxpdCgnLicpOwogIHZhciBjdXIgPSBvcHRfb2JqZWN0VG9FeHBvcnRUbyB8fCBnb29nLmdsb2JhbDsKCiAgLy8gSW50ZXJuZXQgRXhwbG9yZXIgZXhoaWJpdHMgc3RyYW5nZSBiZWhhdmlvciB3aGVuIHRocm93aW5nIGVycm9ycyBmcm9tCiAgLy8gbWV0aG9kcyBleHRlcm5lZCBpbiB0aGlzIG1hbm5lci4gIFNlZSB0aGUgdGVzdEV4cG9ydFN5bWJvbEV4Y2VwdGlvbnMgaW4KICAvLyBiYXNlX3Rlc3QuaHRtbCBmb3IgYW4gZXhhbXBsZS4KICBpZiAoIShwYXJ0c1swXSBpbiBjdXIpICYmIHR5cGVvZiBjdXIuZXhlY1NjcmlwdCAhPSAndW5kZWZpbmVkJykgewogICAgY3VyLmV4ZWNTY3JpcHQoJ3ZhciAnICsgcGFydHNbMF0pOwogIH0KCiAgZm9yICh2YXIgcGFydDsgcGFydHMubGVuZ3RoICYmIChwYXJ0ID0gcGFydHMuc2hpZnQoKSk7KSB7CiAgICBpZiAoIXBhcnRzLmxlbmd0aCAmJiBvcHRfb2JqZWN0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgLy8gbGFzdCBwYXJ0IGFuZCB3ZSBoYXZlIGFuIG9iamVjdDsgdXNlIGl0CiAgICAgIGN1cltwYXJ0XSA9IG9wdF9vYmplY3Q7CiAgICB9IGVsc2UgaWYgKGN1cltwYXJ0XSAmJiBjdXJbcGFydF0gIT09IE9iamVjdC5wcm90b3R5cGVbcGFydF0pIHsKICAgICAgY3VyID0gY3VyW3BhcnRdOwogICAgfSBlbHNlIHsKICAgICAgY3VyID0gY3VyW3BhcnRdID0ge307CiAgICB9CiAgfQp9OwoKCi8qKgogKiBEZWZpbmVzIGEgbmFtZWQgdmFsdWUuIEluIHVuY29tcGlsZWQgbW9kZSwgdGhlIHZhbHVlIGlzIHJldHJpZXZlZCBmcm9tCiAqIENMT1NVUkVfREVGSU5FUyBvciBDTE9TVVJFX1VOQ09NUElMRURfREVGSU5FUyBpZiB0aGUgb2JqZWN0IGlzIGRlZmluZWQgYW5kCiAqIGhhcyB0aGUgcHJvcGVydHkgc3BlY2lmaWVkLCBhbmQgb3RoZXJ3aXNlIHVzZWQgdGhlIGRlZmluZWQgZGVmYXVsdFZhbHVlLgogKiBXaGVuIGNvbXBpbGVkIHRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIHVzaW5nIHRoZSBjb21waWxlciBvcHRpb25zIG9yIHRoZQogKiB2YWx1ZSBzZXQgaW4gdGhlIENMT1NVUkVfREVGSU5FUyBvYmplY3QuIFJldHVybnMgdGhlIGRlZmluZWQgdmFsdWUgc28gdGhhdCBpdAogKiBjYW4gYmUgdXNlZCBzYWZlbHkgaW4gbW9kdWxlcy4gTm90ZSB0aGF0IHRoZSB2YWx1ZSB0eXBlIE1VU1QgYmUgZWl0aGVyCiAqIGJvb2xlYW4sIG51bWJlciwgb3Igc3RyaW5nLgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZGlzdGluZ3Vpc2hlZCBuYW1lIHRvIHByb3ZpZGUuCiAqIEBwYXJhbSB7VH0gZGVmYXVsdFZhbHVlCiAqIEByZXR1cm4ge1R9IFRoZSBkZWZpbmVkIHZhbHVlLgogKiBAdGVtcGxhdGUgVAogKi8KZ29vZy5kZWZpbmUgPSBmdW5jdGlvbihuYW1lLCBkZWZhdWx0VmFsdWUpIHsKICB2YXIgdmFsdWUgPSBkZWZhdWx0VmFsdWU7CiAgaWYgKCFDT01QSUxFRCkgewogICAgdmFyIHVuY29tcGlsZWREZWZpbmVzID0gZ29vZy5nbG9iYWwuQ0xPU1VSRV9VTkNPTVBJTEVEX0RFRklORVM7CiAgICB2YXIgZGVmaW5lcyA9IGdvb2cuZ2xvYmFsLkNMT1NVUkVfREVGSU5FUzsKICAgIGlmICh1bmNvbXBpbGVkRGVmaW5lcyAmJgogICAgICAgIC8vIEFudGkgRE9NLWNsb2JiZXJpbmcgcnVudGltZSBjaGVjayAoYi8zNzczNjU3NikuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLyAodW5jb21waWxlZERlZmluZXMpLm5vZGVUeXBlID09PSB1bmRlZmluZWQgJiYKICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodW5jb21waWxlZERlZmluZXMsIG5hbWUpKSB7CiAgICAgIHZhbHVlID0gdW5jb21waWxlZERlZmluZXNbbmFtZV07CiAgICB9IGVsc2UgaWYgKAogICAgICAgIGRlZmluZXMgJiYKICAgICAgICAvLyBBbnRpIERPTS1jbG9iYmVyaW5nIHJ1bnRpbWUgY2hlY2sgKGIvMzc3MzY1NzYpLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8gKGRlZmluZXMpLm5vZGVUeXBlID09PSB1bmRlZmluZWQgJiYKICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZGVmaW5lcywgbmFtZSkpIHsKICAgICAgdmFsdWUgPSBkZWZpbmVzW25hbWVdOwogICAgfQogIH0KICByZXR1cm4gdmFsdWU7Cn07CgoKLyoqCiAqIEBkZWZpbmUge251bWJlcn0gSW50ZWdlciB5ZWFyIGluZGljYXRpbmcgdGhlIHNldCBvZiBicm93c2VyIGZlYXR1cmVzIHRoYXQgYXJlCiAqIGd1YXJhbnRlZWQgdG8gYmUgcHJlc2VudC4gIFRoaXMgaXMgZGVmaW5lZCB0byBpbmNsdWRlIGV4YWN0bHkgZmVhdHVyZXMgdGhhdAogKiB3b3JrIGNvcnJlY3RseSBvbiBhbGwgIm1vZGVybiIgYnJvd3NlcnMgdGhhdCBhcmUgc3RhYmxlIG9uIEphbnVhcnkgMSBvZiB0aGUKICogc3BlY2lmaWVkIHllYXIuICBGb3IgZXhhbXBsZSwKICogYGBganMKICogaWYgKGdvb2cuRkVBVFVSRVNFVF9ZRUFSID49IDIwMTkpIHsKICogICAvLyB1c2UgQVBJcyBrbm93biB0byBiZSBhdmFpbGFibGUgb24gYWxsIG1ham9yIHN0YWJsZSBicm93c2VycyBKYW4gMSwgMjAxOQogKiB9IGVsc2UgewogKiAgIC8vIHBvbHlmaWxsIGZvciBvbGRlciBicm93c2VycwogKiB9CiAqIGBgYAogKiBUaGlzIGlzIGludGVuZGVkIHRvIGJlIHRoZSBwcmltYXJ5IGRlZmluZSBmb3IgcmVtb3ZpbmcKICogdW5uZWNlc3NhcnkgYnJvd3NlciBjb21wYXRpYmlsaXR5IGNvZGUgKHN1Y2ggYXMgcG9ueWZpbGxzIGFuZCB3b3JrYXJvdW5kcyksCiAqIGFuZCBzaG91bGQgaW5mb3JtIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBtb3N0IG90aGVyIGRlZmluZXM6CiAqIGBgYGpzCiAqIGNvbnN0IEFTU1VNRV9OQVRJVkVfUFJPTUlTRSA9CiAqICAgICBnb29nLmRlZmluZSgnQVNTVU1FX05BVElWRV9QUk9NSVNFJywgZ29vZy5GRUFUVVJFU0VUX1lFQVIgPj0gMjAxNik7CiAqIGBgYAogKgogKiBUaGUgZGVmYXVsdCBhc3N1bXB0aW9uIGlzIHRoYXQgSUU5IGlzIHRoZSBsb3dlc3Qgc3VwcG9ydGVkIGJyb3dzZXIsIHdoaWNoIHdhcwogKiBmaXJzdCBhdmFpbGFibGUgSmFuIDEsIDIwMTIuCiAqCiAqIFRPRE8odXNlcik6IFJlZmVyZW5jZSBtb3JlIHRob3JvdWdoIGRvY3VtZW50YXRpb24gd2hlbiBpdCdzIGF2YWlsYWJsZS4KICovCmdvb2cuRkVBVFVSRVNFVF9ZRUFSID0gZ29vZy5kZWZpbmUoJ2dvb2cuRkVBVFVSRVNFVF9ZRUFSJywgMjAxMik7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IERFQlVHIGlzIHByb3ZpZGVkIGFzIGEgY29udmVuaWVuY2Ugc28gdGhhdCBkZWJ1Z2dpbmcgY29kZQogKiB0aGF0IHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gYSBwcm9kdWN0aW9uLiBJdCBjYW4gYmUgZWFzaWx5IHN0cmlwcGVkCiAqIGJ5IHNwZWNpZnlpbmcgLS1kZWZpbmUgZ29vZy5ERUJVRz1mYWxzZSB0byB0aGUgQ2xvc3VyZSBDb21waWxlciBha2EKICogSlNDb21waWxlci4gRm9yIGV4YW1wbGUsIG1vc3QgdG9TdHJpbmcoKSBtZXRob2RzIHNob3VsZCBiZSBkZWNsYXJlZCBpbnNpZGUgYW4KICogImlmIChnb29nLkRFQlVHKSIgY29uZGl0aW9uYWwgYmVjYXVzZSB0aGV5IGFyZSBnZW5lcmFsbHkgdXNlZCBmb3IgZGVidWdnaW5nCiAqIHB1cnBvc2VzIGFuZCBpdCBpcyBkaWZmaWN1bHQgZm9yIHRoZSBKU0NvbXBpbGVyIHRvIHN0YXRpY2FsbHkgZGV0ZXJtaW5lCiAqIHdoZXRoZXIgdGhleSBhcmUgdXNlZC4KICovCmdvb2cuREVCVUcgPSBnb29nLmRlZmluZSgnZ29vZy5ERUJVRycsIHRydWUpOwoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IExPQ0FMRSBkZWZpbmVzIHRoZSBsb2NhbGUgYmVpbmcgdXNlZCBmb3IgY29tcGlsYXRpb24uIEl0IGlzCiAqIHVzZWQgdG8gc2VsZWN0IGxvY2FsZSBzcGVjaWZpYyBkYXRhIHRvIGJlIGNvbXBpbGVkIGluIGpzIGJpbmFyeS4gQlVJTEQgcnVsZQogKiBjYW4gc3BlY2lmeSB0aGlzIHZhbHVlIGJ5ICItLWRlZmluZSBnb29nLkxPQ0FMRT08bG9jYWxlX25hbWU+IiBhcyBhIGNvbXBpbGVyCiAqIG9wdGlvbi4KICoKICogVGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGUgbG9jYWxlIGNvZGUgZm9ybWF0IGlzIGltcG9ydGFudC4gWW91IHNob3VsZCB1c2UKICogdGhlIGNhbm9uaWNhbCBVbmljb2RlIGZvcm1hdCB3aXRoIGh5cGhlbiBhcyBhIGRlbGltaXRlci4gTGFuZ3VhZ2UgbXVzdCBiZQogKiBsb3dlcmNhc2UsIExhbmd1YWdlIFNjcmlwdCAtIENhcGl0YWxpemVkLCBSZWdpb24gLSBVUFBFUkNBU0UuCiAqIFRoZXJlIGFyZSBmZXcgZXhhbXBsZXM6IHB0LUJSLCBlbiwgZW4tVVMsIHNyLUxhdGluLUJPLCB6aC1IYW5zLUNOLgogKgogKiBTZWUgbW9yZSBpbmZvIGFib3V0IGxvY2FsZSBjb2RlcyBoZXJlOgogKiBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3JlcG9ydHMvdHIzNS8jVW5pY29kZV9MYW5ndWFnZV9hbmRfTG9jYWxlX0lkZW50aWZpZXJzCiAqCiAqIEZvciBsYW5ndWFnZSBjb2RlcyB5b3Ugc2hvdWxkIHVzZSB2YWx1ZXMgZGVmaW5lZCBieSBJU08gNjkzLTEuIFNlZSBpdCBoZXJlCiAqIGh0dHA6Ly93d3cudzMub3JnL1dBSS9FUi9JRy9lcnQvaXNvNjM5Lmh0bS4gVGhlcmUgaXMgb25seSBvbmUgZXhjZXB0aW9uIGZyb20KICogdGhpcyBydWxlOiB0aGUgSGVicmV3IGxhbmd1YWdlLiBGb3IgbGVnYWN5IHJlYXNvbnMgdGhlIG9sZCBjb2RlIChpdykgc2hvdWxkCiAqIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgbmV3IGNvZGUgKGhlKS4KICoKICovCmdvb2cuTE9DQUxFID0gZ29vZy5kZWZpbmUoJ2dvb2cuTE9DQUxFJywgJ2VuJyk7ICAvLyBkZWZhdWx0IHRvIGVuCgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhpcyBjb2RlIGlzIHJ1bm5pbmcgb24gdHJ1c3RlZCBzaXRlcy4KICoKICogT24gdW50cnVzdGVkIHNpdGVzLCBzZXZlcmFsIG5hdGl2ZSBmdW5jdGlvbnMgY2FuIGJlIGRlZmluZWQgb3Igb3ZlcnJpZGRlbiBieQogKiBleHRlcm5hbCBsaWJyYXJpZXMgbGlrZSBQcm90b3R5cGUsIERhdGVqcywgYW5kIEpRdWVyeSBhbmQgc2V0dGluZyB0aGlzIGZsYWcKICogdG8gZmFsc2UgZm9yY2VzIGNsb3N1cmUgdG8gdXNlIGl0cyBvd24gaW1wbGVtZW50YXRpb25zIHdoZW4gcG9zc2libGUuCiAqCiAqIElmIHlvdXIgSmF2YVNjcmlwdCBjYW4gYmUgbG9hZGVkIGJ5IGEgdGhpcmQgcGFydHkgc2l0ZSBhbmQgeW91IGFyZSB3YXJ5IGFib3V0CiAqIHJlbHlpbmcgb24gbm9uLXN0YW5kYXJkIGltcGxlbWVudGF0aW9ucywgc3BlY2lmeQogKiAiLS1kZWZpbmUgZ29vZy5UUlVTVEVEX1NJVEU9ZmFsc2UiIHRvIHRoZSBjb21waWxlci4KICovCmdvb2cuVFJVU1RFRF9TSVRFID0gZ29vZy5kZWZpbmUoJ2dvb2cuVFJVU1RFRF9TSVRFJywgdHJ1ZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgYSBwcm9qZWN0IGlzIGV4cGVjdGVkIHRvIGJlIHJ1bm5pbmcgaW4gc3RyaWN0IG1vZGUuCiAqCiAqIFRoaXMgZGVmaW5lIGNhbiBiZSB1c2VkIHRvIHRyaWdnZXIgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucyBjb21wYXRpYmxlIHdpdGgKICogcnVubmluZyBpbiBFY21hU2NyaXB0IFN0cmljdCBtb2RlIG9yIHdhcm4gYWJvdXQgdW5hdmFpbGFibGUgZnVuY3Rpb25hbGl0eS4KICogQHNlZSBodHRwczovL2dvby5nbC9QdWRRNHkKICoKICovCmdvb2cuU1RSSUNUX01PREVfQ09NUEFUSUJMRSA9IGdvb2cuZGVmaW5lKCdnb29nLlNUUklDVF9NT0RFX0NPTVBBVElCTEUnLCBmYWxzZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgY29kZSB0aGF0IGNhbGxzIHtAbGluayBnb29nLnNldFRlc3RPbmx5fSBzaG91bGQKICogICAgIGJlIGRpc2FsbG93ZWQgaW4gdGhlIGNvbXBpbGF0aW9uIHVuaXQuCiAqLwpnb29nLkRJU0FMTE9XX1RFU1RfT05MWV9DT0RFID0KICAgIGdvb2cuZGVmaW5lKCdnb29nLkRJU0FMTE9XX1RFU1RfT05MWV9DT0RFJywgQ09NUElMRUQgJiYgIWdvb2cuREVCVUcpOwoKCi8qKgogKiBAZGVmaW5lIHtib29sZWFufSBXaGV0aGVyIHRvIHVzZSBhIENocm9tZSBhcHAgQ1NQLWNvbXBsaWFudCBtZXRob2QgZm9yCiAqICAgICBsb2FkaW5nIHNjcmlwdHMgdmlhIGdvb2cucmVxdWlyZS4gQHNlZSBhcHBlbmRTY3JpcHRTcmNOb2RlXy4KICovCmdvb2cuRU5BQkxFX0NIUk9NRV9BUFBfU0FGRV9TQ1JJUFRfTE9BRElORyA9CiAgICBnb29nLmRlZmluZSgnZ29vZy5FTkFCTEVfQ0hST01FX0FQUF9TQUZFX1NDUklQVF9MT0FESU5HJywgZmFsc2UpOwoKCi8qKgogKiBEZWZpbmVzIGEgbmFtZXNwYWNlIGluIENsb3N1cmUuCiAqCiAqIEEgbmFtZXNwYWNlIG1heSBvbmx5IGJlIGRlZmluZWQgb25jZSBpbiBhIGNvZGViYXNlLiBJdCBtYXkgYmUgZGVmaW5lZCB1c2luZwogKiBnb29nLnByb3ZpZGUoKSBvciBnb29nLm1vZHVsZSgpLgogKgogKiBUaGUgcHJlc2VuY2Ugb2Ygb25lIG9yIG1vcmUgZ29vZy5wcm92aWRlKCkgY2FsbHMgaW4gYSBmaWxlIGluZGljYXRlcwogKiB0aGF0IHRoZSBmaWxlIGRlZmluZXMgdGhlIGdpdmVuIG9iamVjdHMvbmFtZXNwYWNlcy4KICogUHJvdmlkZWQgc3ltYm9scyBtdXN0IG5vdCBiZSBudWxsIG9yIHVuZGVmaW5lZC4KICoKICogSW4gYWRkaXRpb24sIGdvb2cucHJvdmlkZSgpIGNyZWF0ZXMgdGhlIG9iamVjdCBzdHVicyBmb3IgYSBuYW1lc3BhY2UKICogKGZvciBleGFtcGxlLCBnb29nLnByb3ZpZGUoImdvb2cuZm9vLmJhciIpIHdpbGwgY3JlYXRlIHRoZSBvYmplY3QKICogZ29vZy5mb28uYmFyIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QpLgogKgogKiBCdWlsZCB0b29scyBhbHNvIHNjYW4gZm9yIHByb3ZpZGUvcmVxdWlyZS9tb2R1bGUgc3RhdGVtZW50cwogKiB0byBkaXNjZXJuIGRlcGVuZGVuY2llcywgYnVpbGQgZGVwZW5kZW5jeSBmaWxlcyAoc2VlIGRlcHMuanMpLCBldGMuCiAqCiAqIEBzZWUgZ29vZy5yZXF1aXJlCiAqIEBzZWUgZ29vZy5tb2R1bGUKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZXNwYWNlIHByb3ZpZGVkIGJ5IHRoaXMgZmlsZSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICovCmdvb2cucHJvdmlkZSA9IGZ1bmN0aW9uKG5hbWUpIHsKICBpZiAoZ29vZy5pc0luTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cucHJvdmlkZSBjYW5ub3QgYmUgdXNlZCB3aXRoaW4gYSBtb2R1bGUuJyk7CiAgfQogIGlmICghQ09NUElMRUQpIHsKICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBzYW1lIG5hbWVzcGFjZSBpc24ndCBwcm92aWRlZCB0d2ljZS4KICAgIC8vIEEgZ29vZy5tb2R1bGUvZ29vZy5wcm92aWRlIG1hcHMgYSBnb29nLnJlcXVpcmUgdG8gYSBzcGVjaWZpYyBmaWxlCiAgICBpZiAoZ29vZy5pc1Byb3ZpZGVkXyhuYW1lKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ05hbWVzcGFjZSAiJyArIG5hbWUgKyAnIiBhbHJlYWR5IGRlY2xhcmVkLicpOwogICAgfQogIH0KCiAgZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfKG5hbWUpOwp9OwoKCi8qKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lc3BhY2UgcHJvdmlkZWQgYnkgdGhpcyBmaWxlIGluIHRoZSBmb3JtCiAqICAgICAiZ29vZy5wYWNrYWdlLnBhcnQiLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmogVGhlIG9iamVjdCB0byBlbWJlZCBpbiB0aGUgbmFtZXNwYWNlLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfID0gZnVuY3Rpb24obmFtZSwgb3B0X29iaikgewogIGlmICghQ09NUElMRUQpIHsKICAgIGRlbGV0ZSBnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bbmFtZV07CgogICAgdmFyIG5hbWVzcGFjZSA9IG5hbWU7CiAgICB3aGlsZSAoKG5hbWVzcGFjZSA9IG5hbWVzcGFjZS5zdWJzdHJpbmcoMCwgbmFtZXNwYWNlLmxhc3RJbmRleE9mKCcuJykpKSkgewogICAgICBpZiAoZ29vZy5nZXRPYmplY3RCeU5hbWUobmFtZXNwYWNlKSkgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGdvb2cuaW1wbGljaXROYW1lc3BhY2VzX1tuYW1lc3BhY2VdID0gdHJ1ZTsKICAgIH0KICB9CgogIGdvb2cuZXhwb3J0UGF0aF8obmFtZSwgb3B0X29iaik7Cn07CgoKLyoqCiAqIFJldHVybnMgQ1NQIG5vbmNlLCBpZiBzZXQgZm9yIGFueSBzY3JpcHQgdGFnLgogKiBAcGFyYW0gez9XaW5kb3c9fSBvcHRfd2luZG93IFRoZSB3aW5kb3cgY29udGV4dCB1c2VkIHRvIHJldHJpZXZlIHRoZSBub25jZS4KICogICAgIERlZmF1bHRzIHRvIGdsb2JhbCBjb250ZXh0LgogKiBAcmV0dXJuIHtzdHJpbmd9IENTUCBub25jZSBvciBlbXB0eSBzdHJpbmcgaWYgbm8gbm9uY2UgaXMgcHJlc2VudC4KICovCmdvb2cuZ2V0U2NyaXB0Tm9uY2UgPSBmdW5jdGlvbihvcHRfd2luZG93KSB7CiAgaWYgKG9wdF93aW5kb3cgJiYgb3B0X3dpbmRvdyAhPSBnb29nLmdsb2JhbCkgewogICAgcmV0dXJuIGdvb2cuZ2V0U2NyaXB0Tm9uY2VfKG9wdF93aW5kb3cuZG9jdW1lbnQpOwogIH0KICBpZiAoZ29vZy5jc3BOb25jZV8gPT09IG51bGwpIHsKICAgIGdvb2cuY3NwTm9uY2VfID0gZ29vZy5nZXRTY3JpcHROb25jZV8oZ29vZy5nbG9iYWwuZG9jdW1lbnQpOwogIH0KICByZXR1cm4gZ29vZy5jc3BOb25jZV87Cn07CgoKLyoqCiAqIEFjY29yZGluZyB0byB0aGUgQ1NQMyBzcGVjIGEgbm9uY2UgbXVzdCBiZSBhIHZhbGlkIGJhc2U2NCBzdHJpbmcuCiAqIEBzZWUgaHR0cHM6Ly93d3cudzMub3JnL1RSL0NTUDMvI2dyYW1tYXJkZWYtYmFzZTY0LXZhbHVlCiAqIEBwcml2YXRlIEBjb25zdAogKi8KZ29vZy5OT05DRV9QQVRURVJOXyA9IC9eW1x3Ky9fLV0rWz1dezAsMn0kLzsKCgovKioKICogQHByaXZhdGUgez9zdHJpbmd9CiAqLwpnb29nLmNzcE5vbmNlXyA9IG51bGw7CgoKLyoqCiAqIFJldHVybnMgQ1NQIG5vbmNlLCBpZiBzZXQgZm9yIGFueSBzY3JpcHQgdGFnLgogKiBAcGFyYW0geyFEb2N1bWVudH0gZG9jCiAqIEByZXR1cm4ge3N0cmluZ30gQ1NQIG5vbmNlIG9yIGVtcHR5IHN0cmluZyBpZiBubyBub25jZSBpcyBwcmVzZW50LgogKiBAcHJpdmF0ZQogKi8KZ29vZy5nZXRTY3JpcHROb25jZV8gPSBmdW5jdGlvbihkb2MpIHsKICB2YXIgc2NyaXB0ID0gZG9jLnF1ZXJ5U2VsZWN0b3IgJiYgZG9jLnF1ZXJ5U2VsZWN0b3IoJ3NjcmlwdFtub25jZV0nKTsKICBpZiAoc2NyaXB0KSB7CiAgICAvLyBUcnkgdG8gZ2V0IHRoZSBub25jZSBmcm9tIHRoZSBJREwgcHJvcGVydHkgZmlyc3QsIGJlY2F1c2UgYnJvd3NlcnMgdGhhdAogICAgLy8gaW1wbGVtZW50IGFkZGl0aW9uYWwgbm9uY2UgcHJvdGVjdGlvbiBmZWF0dXJlcyAoY3VycmVudGx5IG9ubHkgQ2hyb21lKSB0bwogICAgLy8gcHJldmVudCBub25jZSBzdGVhbGluZyB2aWEgQ1NTIGRvIG5vdCBleHBvc2UgdGhlIG5vbmNlIHZpYSBhdHRyaWJ1dGVzLgogICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS93aGF0d2cvaHRtbC9pc3N1ZXMvMjM2OQogICAgdmFyIG5vbmNlID0gc2NyaXB0Wydub25jZSddIHx8IHNjcmlwdC5nZXRBdHRyaWJ1dGUoJ25vbmNlJyk7CiAgICBpZiAobm9uY2UgJiYgZ29vZy5OT05DRV9QQVRURVJOXy50ZXN0KG5vbmNlKSkgewogICAgICByZXR1cm4gbm9uY2U7CiAgICB9CiAgfQogIHJldHVybiAnJzsKfTsKCgovKioKICogTW9kdWxlIGlkZW50aWZpZXIgdmFsaWRhdGlvbiByZWdleHAuCiAqIE5vdGU6IFRoaXMgaXMgYSBjb25zZXJ2YXRpdmUgY2hlY2ssIGl0IGlzIHZlcnkgcG9zc2libGUgdG8gYmUgbW9yZSBsZW5pZW50LAogKiAgIHRoZSBwcmltYXJ5IGV4Y2x1c2lvbiBoZXJlIGlzICIvIiBhbmQgIlwiIGFuZCBhIGxlYWRpbmcgIi4iLCB0aGVzZQogKiAgIHJlc3RyaWN0aW9ucyBhcmUgaW50ZW5kZWQgdG8gbGVhdmUgdGhlIGRvb3Igb3BlbiBmb3IgdXNpbmcgZ29vZy5yZXF1aXJlCiAqICAgd2l0aCByZWxhdGl2ZSBmaWxlIHBhdGhzIHJhdGhlciB0aGFuIG1vZHVsZSBpZGVudGlmaWVycy4KICogQHByaXZhdGUKICovCmdvb2cuVkFMSURfTU9EVUxFX1JFXyA9IC9eW2EtekEtWl8kXVthLXpBLVowLTkuXyRdKiQvOwoKCi8qKgogKiBEZWZpbmVzIGEgbW9kdWxlIGluIENsb3N1cmUuCiAqCiAqIE1hcmtzIHRoYXQgdGhpcyBmaWxlIG11c3QgYmUgbG9hZGVkIGFzIGEgbW9kdWxlIGFuZCBjbGFpbXMgdGhlIG5hbWVzcGFjZS4KICoKICogQSBuYW1lc3BhY2UgbWF5IG9ubHkgYmUgZGVmaW5lZCBvbmNlIGluIGEgY29kZWJhc2UuIEl0IG1heSBiZSBkZWZpbmVkIHVzaW5nCiAqIGdvb2cucHJvdmlkZSgpIG9yIGdvb2cubW9kdWxlKCkuCiAqCiAqIGdvb2cubW9kdWxlKCkgaGFzIHRocmVlIHJlcXVpcmVtZW50czoKICogLSBnb29nLm1vZHVsZSBtYXkgbm90IGJlIHVzZWQgaW4gdGhlIHNhbWUgZmlsZSBhcyBnb29nLnByb3ZpZGUuCiAqIC0gZ29vZy5tb2R1bGUgbXVzdCBiZSB0aGUgZmlyc3Qgc3RhdGVtZW50IGluIHRoZSBmaWxlLgogKiAtIG9ubHkgb25lIGdvb2cubW9kdWxlIGlzIGFsbG93ZWQgcGVyIGZpbGUuCiAqCiAqIFdoZW4gYSBnb29nLm1vZHVsZSBhbm5vdGF0ZWQgZmlsZSBpcyBsb2FkZWQsIGl0IGlzIGVuY2xvc2VkIGluCiAqIGEgc3RyaWN0IGZ1bmN0aW9uIGNsb3N1cmUuIFRoaXMgbWVhbnMgdGhhdDoKICogLSBhbnkgdmFyaWFibGVzIGRlY2xhcmVkIGluIGEgZ29vZy5tb2R1bGUgZmlsZSBhcmUgcHJpdmF0ZSB0byB0aGUgZmlsZQogKiAobm90IGdsb2JhbCksIHRob3VnaCB0aGUgY29tcGlsZXIgaXMgZXhwZWN0ZWQgdG8gaW5saW5lIHRoZSBtb2R1bGUuCiAqIC0gVGhlIGNvZGUgbXVzdCBvYmV5IGFsbCB0aGUgcnVsZXMgb2YgInN0cmljdCIgSmF2YVNjcmlwdC4KICogLSB0aGUgZmlsZSB3aWxsIGJlIG1hcmtlZCBhcyAidXNlIHN0cmljdCIKICoKICogTk9URTogdW5saWtlIGdvb2cucHJvdmlkZSwgZ29vZy5tb2R1bGUgZG9lcyBub3QgZGVjbGFyZSBhbnkgc3ltYm9scyBieQogKiBpdHNlbGYuIElmIGRlY2xhcmVkIHN5bWJvbHMgYXJlIGRlc2lyZWQsIHVzZQogKiBnb29nLm1vZHVsZS5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlKCkuCiAqCiAqCiAqIFNlZSB0aGUgcHVibGljIGdvb2cubW9kdWxlIHByb3Bvc2FsOiBodHRwOi8vZ29vLmdsL1ZhMWhpbgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lc3BhY2UgcHJvdmlkZWQgYnkgdGhpcyBmaWxlIGluIHRoZSBmb3JtCiAqICAgICAiZ29vZy5wYWNrYWdlLnBhcnQiLCBpcyBleHBlY3RlZCBidXQgbm90IHJlcXVpcmVkLgogKiBAcmV0dXJuIHt2b2lkfQogKi8KZ29vZy5tb2R1bGUgPSBmdW5jdGlvbihuYW1lKSB7CiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJyB8fCAhbmFtZSB8fAogICAgICBuYW1lLnNlYXJjaChnb29nLlZBTElEX01PRFVMRV9SRV8pID09IC0xKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbW9kdWxlIGlkZW50aWZpZXInKTsKICB9CiAgaWYgKCFnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ01vZHVsZSAnICsgbmFtZSArICcgaGFzIGJlZW4gbG9hZGVkIGluY29ycmVjdGx5LiBOb3RlLCAnICsKICAgICAgICAnbW9kdWxlcyBjYW5ub3QgYmUgbG9hZGVkIGFzIG5vcm1hbCBzY3JpcHRzLiBUaGV5IHJlcXVpcmUgc29tZSBraW5kIG9mICcgKwogICAgICAgICdwcmUtcHJvY2Vzc2luZyBzdGVwLiBZb3VcJ3JlIGxpa2VseSB0cnlpbmcgdG8gbG9hZCBhIG1vZHVsZSB2aWEgYSAnICsKICAgICAgICAnc2NyaXB0IHRhZyBvciBhcyBhIHBhcnQgb2YgYSBjb25jYXRlbmF0ZWQgYnVuZGxlIHdpdGhvdXQgcmV3cml0aW5nIHRoZSAnICsKICAgICAgICAnbW9kdWxlLiBGb3IgbW9yZSBpbmZvIHNlZTogJyArCiAgICAgICAgJ2h0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1saWJyYXJ5L3dpa2kvZ29vZy5tb2R1bGU6LWFuLUVTNi1tb2R1bGUtbGlrZS1hbHRlcm5hdGl2ZS10by1nb29nLnByb3ZpZGUuJyk7CiAgfQogIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cubW9kdWxlIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBtb2R1bGUuJyk7CiAgfQoKICAvLyBTdG9yZSB0aGUgbW9kdWxlIG5hbWUgZm9yIHRoZSBsb2FkZXIuCiAgZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZSA9IG5hbWU7CiAgaWYgKCFDT01QSUxFRCkgewogICAgLy8gRW5zdXJlIHRoYXQgdGhlIHNhbWUgbmFtZXNwYWNlIGlzbid0IHByb3ZpZGVkIHR3aWNlLgogICAgLy8gQSBnb29nLm1vZHVsZS9nb29nLnByb3ZpZGUgbWFwcyBhIGdvb2cucmVxdWlyZSB0byBhIHNwZWNpZmljIGZpbGUKICAgIGlmIChnb29nLmlzUHJvdmlkZWRfKG5hbWUpKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignTmFtZXNwYWNlICInICsgbmFtZSArICciIGFscmVhZHkgZGVjbGFyZWQuJyk7CiAgICB9CiAgICBkZWxldGUgZ29vZy5pbXBsaWNpdE5hbWVzcGFjZXNfW25hbWVdOwogIH0KfTsKCgovKioKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG1vZHVsZSBpZGVudGlmaWVyLgogKiBAcmV0dXJuIHs/fSBUaGUgbW9kdWxlIGV4cG9ydHMgZm9yIGFuIGFscmVhZHkgbG9hZGVkIG1vZHVsZSBvciBudWxsLgogKgogKiBOb3RlOiBUaGlzIGlzIG5vdCBhbiBhbHRlcm5hdGl2ZSB0byBnb29nLnJlcXVpcmUsIGl0IGRvZXMgbm90CiAqIGluZGljYXRlIGEgaGFyZCBkZXBlbmRlbmN5LCBpbnN0ZWFkIGl0IGlzIHVzZWQgdG8gaW5kaWNhdGUKICogYW4gb3B0aW9uYWwgZGVwZW5kZW5jeSBvciB0byBhY2Nlc3MgdGhlIGV4cG9ydHMgb2YgYSBtb2R1bGUKICogdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4KICogQHN1cHByZXNzIHttaXNzaW5nUHJvdmlkZX0KICovCmdvb2cubW9kdWxlLmdldCA9IGZ1bmN0aW9uKG5hbWUpIHsKICByZXR1cm4gZ29vZy5tb2R1bGUuZ2V0SW50ZXJuYWxfKG5hbWUpOwp9OwoKCi8qKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbW9kdWxlIGlkZW50aWZpZXIuCiAqIEByZXR1cm4gez99IFRoZSBtb2R1bGUgZXhwb3J0cyBmb3IgYW4gYWxyZWFkeSBsb2FkZWQgbW9kdWxlIG9yIG51bGwuCiAqIEBwcml2YXRlCiAqLwpnb29nLm1vZHVsZS5nZXRJbnRlcm5hbF8gPSBmdW5jdGlvbihuYW1lKSB7CiAgaWYgKCFDT01QSUxFRCkgewogICAgaWYgKG5hbWUgaW4gZ29vZy5sb2FkZWRNb2R1bGVzXykgewogICAgICByZXR1cm4gZ29vZy5sb2FkZWRNb2R1bGVzX1tuYW1lXS5leHBvcnRzOwogICAgfSBlbHNlIGlmICghZ29vZy5pbXBsaWNpdE5hbWVzcGFjZXNfW25hbWVdKSB7CiAgICAgIHZhciBucyA9IGdvb2cuZ2V0T2JqZWN0QnlOYW1lKG5hbWUpOwogICAgICByZXR1cm4gbnMgIT0gbnVsbCA/IG5zIDogbnVsbDsKICAgIH0KICB9CiAgcmV0dXJuIG51bGw7Cn07CgoKLyoqCiAqIFR5cGVzIG9mIG1vZHVsZXMgdGhlIGRlYnVnIGxvYWRlciBjYW4gbG9hZC4KICogQGVudW0ge3N0cmluZ30KICovCmdvb2cuTW9kdWxlVHlwZSA9IHsKICBFUzY6ICdlczYnLAogIEdPT0c6ICdnb29nJwp9OwoKCi8qKgogKiBAcHJpdmF0ZSB7P3sKICogICBtb2R1bGVOYW1lOiAoc3RyaW5nfHVuZGVmaW5lZCksCiAqICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTpib29sZWFuLAogKiAgIHR5cGU6ID9nb29nLk1vZHVsZVR5cGUKICogfX0KICovCmdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gbnVsbDsKCgovKioKICogQHByaXZhdGUKICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBhIGdvb2cubW9kdWxlIG9yIGFuIGVzNiBtb2R1bGUgaXMgY3VycmVudGx5IGJlaW5nCiAqICAgICBpbml0aWFsaXplZC4KICovCmdvb2cuaXNJbk1vZHVsZUxvYWRlcl8gPSBmdW5jdGlvbigpIHsKICByZXR1cm4gZ29vZy5pc0luR29vZ01vZHVsZUxvYWRlcl8oKSB8fCBnb29nLmlzSW5FczZNb2R1bGVMb2FkZXJfKCk7Cn07CgoKLyoqCiAqIEBwcml2YXRlCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYSBnb29nLm1vZHVsZSBpcyBjdXJyZW50bHkgYmVpbmcgaW5pdGlhbGl6ZWQuCiAqLwpnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXyA9IGZ1bmN0aW9uKCkgewogIHJldHVybiAhIWdvb2cubW9kdWxlTG9hZGVyU3RhdGVfICYmCiAgICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLnR5cGUgPT0gZ29vZy5Nb2R1bGVUeXBlLkdPT0c7Cn07CgoKLyoqCiAqIEBwcml2YXRlCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgYW4gZXM2IG1vZHVsZSBpcyBjdXJyZW50bHkgYmVpbmcgaW5pdGlhbGl6ZWQuCiAqLwpnb29nLmlzSW5FczZNb2R1bGVMb2FkZXJfID0gZnVuY3Rpb24oKSB7CiAgdmFyIGluTG9hZGVyID0gISFnb29nLm1vZHVsZUxvYWRlclN0YXRlXyAmJgogICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy50eXBlID09IGdvb2cuTW9kdWxlVHlwZS5FUzY7CgogIGlmIChpbkxvYWRlcikgewogICAgcmV0dXJuIHRydWU7CiAgfQoKICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKCiAgaWYgKGpzY29tcCkgewogICAgLy8ganNjb21wIG1heSBub3QgaGF2ZSBnZXRDdXJyZW50TW9kdWxlUGF0aCBpZiB0aGlzIGlzIGEgY29tcGlsZWQgYnVuZGxlCiAgICAvLyB0aGF0IGhhcyBzb21lIG9mIHRoZSBydW50aW1lLCBidXQgbm90IGFsbCBvZiBpdC4gVGhpcyBjYW4gaGFwcGVuIGlmCiAgICAvLyBvcHRpbWl6YXRpb25zIGFyZSB0dXJuZWQgb24gc28gdGhlIHVudXNlZCBydW50aW1lIGlzIHJlbW92ZWQgYnV0IHJlbmFtaW5nCiAgICAvLyBhbmQgQ2xvc3VyZSBwYXNzIGFyZSBvZmYgKHNvICRqc2NvbXAgaXMgc3RpbGwgbmFtZWQgJGpzY29tcCBhbmQgdGhlCiAgICAvLyBnb29nLnByb3ZpZGUvcmVxdWlyZSBjYWxscyBzdGlsbCBleGlzdCkuCiAgICBpZiAodHlwZW9mIGpzY29tcC5nZXRDdXJyZW50TW9kdWxlUGF0aCAhPSAnZnVuY3Rpb24nKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBCdW5kbGVkIEVTNiBtb2R1bGUuCiAgICByZXR1cm4gISFqc2NvbXAuZ2V0Q3VycmVudE1vZHVsZVBhdGgoKTsKICB9CgogIHJldHVybiBmYWxzZTsKfTsKCgovKioKICogUHJvdmlkZSB0aGUgbW9kdWxlJ3MgZXhwb3J0cyBhcyBhIGdsb2JhbGx5IGFjY2Vzc2libGUgb2JqZWN0IHVuZGVyIHRoZQogKiBtb2R1bGUncyBkZWNsYXJlZCBuYW1lLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBlYXNlIG1pZ3JhdGlvbiB0byBnb29nLm1vZHVsZQogKiBmb3IgZmlsZXMgdGhhdCBoYXZlIGV4aXN0aW5nIHVzYWdlcy4KICogQHN1cHByZXNzIHttaXNzaW5nUHJvdmlkZX0KICovCmdvb2cubW9kdWxlLmRlY2xhcmVMZWdhY3lOYW1lc3BhY2UgPSBmdW5jdGlvbigpIHsKICBpZiAoIUNPTVBJTEVEICYmICFnb29nLmlzSW5Hb29nTW9kdWxlTG9hZGVyXygpKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ2dvb2cubW9kdWxlLmRlY2xhcmVMZWdhY3lOYW1lc3BhY2UgbXVzdCBiZSBjYWxsZWQgZnJvbSAnICsKICAgICAgICAnd2l0aGluIGEgZ29vZy5tb2R1bGUnKTsKICB9CiAgaWYgKCFDT01QSUxFRCAmJiAhZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZSkgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdnb29nLm1vZHVsZSBtdXN0IGJlIGNhbGxlZCBwcmlvciB0byAnICsKICAgICAgICAnZ29vZy5tb2R1bGUuZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZS4nKTsKICB9CiAgZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8uZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZSA9IHRydWU7Cn07CgoKLyoqCiAqIEFzc29jaWF0ZXMgYW4gRVM2IG1vZHVsZSB3aXRoIGEgQ2xvc3VyZSBtb2R1bGUgSUQgc28gdGhhdCBpcyBhdmFpbGFibGUgdmlhCiAqIGdvb2cucmVxdWlyZS4gVGhlIGFzc29jaWF0ZWQgSUQgIGFjdHMgbGlrZSBhIGdvb2cubW9kdWxlIElEIC0gaXQgZG9lcyBub3QKICogY3JlYXRlIGFueSBnbG9iYWwgbmFtZXMsIGl0IGlzIG1lcmVseSBhdmFpbGFibGUgdmlhIGdvb2cucmVxdWlyZSAvCiAqIGdvb2cubW9kdWxlLmdldCAvIGdvb2cuZm9yd2FyZERlY2xhcmUgLyBnb29nLnJlcXVpcmVUeXBlLiBnb29nLnJlcXVpcmUgYW5kCiAqIGdvb2cubW9kdWxlLmdldCB3aWxsIHJldHVybiB0aGUgZW50aXJlIG1vZHVsZSBhcyBpZiBpdCB3YXMgaW1wb3J0IConZC4gVGhpcwogKiBhbGxvd3MgQ2xvc3VyZSBmaWxlcyB0byByZWZlcmVuY2UgRVM2IG1vZHVsZXMgZm9yIHRoZSBzYWtlIG9mIG1pZ3JhdGlvbi4KICoKICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZQogKiBAc3VwcHJlc3Mge21pc3NpbmdQcm92aWRlfQogKi8KZ29vZy5kZWNsYXJlTW9kdWxlSWQgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICBpZiAoIUNPTVBJTEVEKSB7CiAgICBpZiAoIWdvb2cuaXNJbkVzNk1vZHVsZUxvYWRlcl8oKSkgewogICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAnZ29vZy5kZWNsYXJlTW9kdWxlSWQgbWF5IG9ubHkgYmUgY2FsbGVkIGZyb20gJyArCiAgICAgICAgICAnd2l0aGluIGFuIEVTNiBtb2R1bGUnKTsKICAgIH0KICAgIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXyAmJiBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdnb29nLmRlY2xhcmVNb2R1bGVJZCBtYXkgb25seSBiZSBjYWxsZWQgb25jZSBwZXIgbW9kdWxlLicpOwogICAgfQogICAgaWYgKG5hbWVzcGFjZSBpbiBnb29nLmxvYWRlZE1vZHVsZXNfKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdNb2R1bGUgd2l0aCBuYW1lc3BhY2UgIicgKyBuYW1lc3BhY2UgKyAnIiBhbHJlYWR5IGV4aXN0cy4nKTsKICAgIH0KICB9CiAgaWYgKGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfKSB7CiAgICAvLyBOb3QgYnVuZGxlZCAtIGRlYnVnIGxvYWRpbmcuCiAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lID0gbmFtZXNwYWNlOwogIH0gZWxzZSB7CiAgICAvLyBCdW5kbGVkIC0gbm90IGRlYnVnIGxvYWRpbmcsIG5vIG1vZHVsZSBsb2FkZXIgc3RhdGUuCiAgICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKICAgIGlmICghanNjb21wIHx8IHR5cGVvZiBqc2NvbXAuZ2V0Q3VycmVudE1vZHVsZVBhdGggIT0gJ2Z1bmN0aW9uJykgewogICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAnTW9kdWxlIHdpdGggbmFtZXNwYWNlICInICsgbmFtZXNwYWNlICsKICAgICAgICAgICciIGhhcyBiZWVuIGxvYWRlZCBpbmNvcnJlY3RseS4nKTsKICAgIH0KICAgIHZhciBleHBvcnRzID0ganNjb21wLnJlcXVpcmUoanNjb21wLmdldEN1cnJlbnRNb2R1bGVQYXRoKCkpOwogICAgZ29vZy5sb2FkZWRNb2R1bGVzX1tuYW1lc3BhY2VdID0gewogICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICB0eXBlOiBnb29nLk1vZHVsZVR5cGUuRVM2LAogICAgICBtb2R1bGVJZDogbmFtZXNwYWNlCiAgICB9OwogIH0KfTsKCgovKioKICogTWFya3MgdGhhdCB0aGUgY3VycmVudCBmaWxlIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHRlc3RpbmcsIGFuZCBuZXZlciBmb3IKICogbGl2ZSBjb2RlIGluIHByb2R1Y3Rpb24uCiAqCiAqIEluIHRoZSBjYXNlIG9mIHVuaXQgdGVzdHMsIHRoZSBtZXNzYWdlIG1heSBvcHRpb25hbGx5IGJlIGFuIGV4YWN0IG5hbWVzcGFjZQogKiBmb3IgdGhlIHRlc3QgKGUuZy4gJ2dvb2cuc3RyaW5nVGVzdCcpLiBUaGUgbGludGVyIHdpbGwgdGhlbiBpZ25vcmUgdGhlIGV4dHJhCiAqIHByb3ZpZGUgKGlmIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgaW4gdGhlIGNvZGUpLgogKgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9tZXNzYWdlIE9wdGlvbmFsIG1lc3NhZ2UgdG8gYWRkIHRvIHRoZSBlcnJvciB0aGF0J3MKICogICAgIHJhaXNlZCB3aGVuIHVzZWQgaW4gcHJvZHVjdGlvbiBjb2RlLgogKi8KZ29vZy5zZXRUZXN0T25seSA9IGZ1bmN0aW9uKG9wdF9tZXNzYWdlKSB7CiAgaWYgKGdvb2cuRElTQUxMT1dfVEVTVF9PTkxZX0NPREUpIHsKICAgIG9wdF9tZXNzYWdlID0gb3B0X21lc3NhZ2UgfHwgJyc7CiAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgJ0ltcG9ydGluZyB0ZXN0LW9ubHkgY29kZSBpbnRvIG5vbi1kZWJ1ZyBlbnZpcm9ubWVudCcgKwogICAgICAgIChvcHRfbWVzc2FnZSA/ICc6ICcgKyBvcHRfbWVzc2FnZSA6ICcuJykpOwogIH0KfTsKCgovKioKICogRm9yd2FyZCBkZWNsYXJlcyBhIHN5bWJvbC4gVGhpcyBpcyBhbiBpbmRpY2F0aW9uIHRvIHRoZSBjb21waWxlciB0aGF0IHRoZQogKiBzeW1ib2wgbWF5IGJlIHVzZWQgaW4gdGhlIHNvdXJjZSB5ZXQgaXMgbm90IHJlcXVpcmVkIGFuZCBtYXkgbm90IGJlIHByb3ZpZGVkCiAqIGluIGNvbXBpbGF0aW9uLgogKgogKiBUaGUgbW9zdCBjb21tb24gdXNhZ2Ugb2YgZm9yd2FyZCBkZWNsYXJhdGlvbiBpcyBjb2RlIHRoYXQgdGFrZXMgYSB0eXBlIGFzIGEKICogZnVuY3Rpb24gcGFyYW1ldGVyIGJ1dCBkb2VzIG5vdCBuZWVkIHRvIHJlcXVpcmUgaXQuIEJ5IGZvcndhcmQgZGVjbGFyaW5nCiAqIGluc3RlYWQgb2YgcmVxdWlyaW5nLCBubyBoYXJkIGRlcGVuZGVuY3kgaXMgbWFkZSwgYW5kIChpZiBub3QgcmVxdWlyZWQKICogZWxzZXdoZXJlKSB0aGUgbmFtZXNwYWNlIG1heSBuZXZlciBiZSByZXF1aXJlZCBhbmQgdGh1cywgbm90IGJlIHB1bGxlZAogKiBpbnRvIHRoZSBKYXZhU2NyaXB0IGJpbmFyeS4gSWYgaXQgaXMgcmVxdWlyZWQgZWxzZXdoZXJlLCBpdCB3aWxsIGJlIHR5cGUKICogY2hlY2tlZCBhcyBub3JtYWwuCiAqCiAqIEJlZm9yZSB1c2luZyBnb29nLmZvcndhcmREZWNsYXJlLCBwbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBhdAogKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvd2lraS9CYWQtVHlwZS1Bbm5vdGF0aW9uIHRvCiAqIHVuZGVyc3RhbmQgdGhlIG9wdGlvbnMgYW5kIHRyYWRlb2ZmcyB3aGVuIHdvcmtpbmcgd2l0aCBmb3J3YXJkIGRlY2xhcmF0aW9ucy4KICoKICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWVzcGFjZSB0byBmb3J3YXJkIGRlY2xhcmUgaW4gdGhlIGZvcm0gb2YKICogICAgICJnb29nLnBhY2thZ2UucGFydCIuCiAqLwpnb29nLmZvcndhcmREZWNsYXJlID0gZnVuY3Rpb24obmFtZSkge307CgoKLyoqCiAqIEZvcndhcmQgZGVjbGFyZSB0eXBlIGluZm9ybWF0aW9uLiBVc2VkIHRvIGFzc2lnbiB0eXBlcyB0byBnb29nLmdsb2JhbAogKiByZWZlcmVuY2VkIG9iamVjdCB0aGF0IHdvdWxkIG90aGVyd2lzZSByZXN1bHQgaW4gdW5rbm93biB0eXBlIHJlZmVyZW5jZXMKICogYW5kIHRodXMgYmxvY2sgcHJvcGVydHkgZGlzYW1iaWd1YXRpb24uCiAqLwpnb29nLmZvcndhcmREZWNsYXJlKCdEb2N1bWVudCcpOwpnb29nLmZvcndhcmREZWNsYXJlKCdIVE1MU2NyaXB0RWxlbWVudCcpOwpnb29nLmZvcndhcmREZWNsYXJlKCdYTUxIdHRwUmVxdWVzdCcpOwoKCmlmICghQ09NUElMRUQpIHsKICAvKioKICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gbmFtZSBoYXMgYmVlbiBnb29nLnByb3ZpZGVkLiBUaGlzIHdpbGwgcmV0dXJuIGZhbHNlIGZvcgogICAqIG5hbWVzIHRoYXQgYXJlIGF2YWlsYWJsZSBvbmx5IGFzIGltcGxpY2l0IG5hbWVzcGFjZXMuCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgbmFtZSBvZiB0aGUgb2JqZWN0IHRvIGxvb2sgZm9yLgogICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIG5hbWUgaGFzIGJlZW4gcHJvdmlkZWQuCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLmlzUHJvdmlkZWRfID0gZnVuY3Rpb24obmFtZSkgewogICAgcmV0dXJuIChuYW1lIGluIGdvb2cubG9hZGVkTW9kdWxlc18pIHx8CiAgICAgICAgKCFnb29nLmltcGxpY2l0TmFtZXNwYWNlc19bbmFtZV0gJiYgZ29vZy5nZXRPYmplY3RCeU5hbWUobmFtZSkgIT0gbnVsbCk7CiAgfTsKCiAgLyoqCiAgICogTmFtZXNwYWNlcyBpbXBsaWNpdGx5IGRlZmluZWQgYnkgZ29vZy5wcm92aWRlLiBGb3IgZXhhbXBsZSwKICAgKiBnb29nLnByb3ZpZGUoJ2dvb2cuZXZlbnRzLkV2ZW50JykgaW1wbGljaXRseSBkZWNsYXJlcyB0aGF0ICdnb29nJyBhbmQKICAgKiAnZ29vZy5ldmVudHMnIG11c3QgYmUgbmFtZXNwYWNlcy4KICAgKgogICAqIEB0eXBlIHshT2JqZWN0PHN0cmluZywgKGJvb2xlYW58dW5kZWZpbmVkKT59CiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLmltcGxpY2l0TmFtZXNwYWNlc18gPSB7J2dvb2cubW9kdWxlJzogdHJ1ZX07CgogIC8vIE5PVEU6IFdlIGFkZCBnb29nLm1vZHVsZSBhcyBhbiBpbXBsaWNpdCBuYW1lc3BhY2UgYXMgZ29vZy5tb2R1bGUgaXMgZGVmaW5lZAogIC8vIGhlcmUgYW5kIGJlY2F1c2UgdGhlIGV4aXN0aW5nIG1vZHVsZSBwYWNrYWdlIGhhcyBub3QgYmVlbiBtb3ZlZCB5ZXQgb3V0IG9mCiAgLy8gdGhlIGdvb2cubW9kdWxlIG5hbWVzcGFjZS4gVGhpcyBzYXRpc2lmaWVzIGJvdGggdGhlIGRlYnVnIGxvYWRlciBhbmQKICAvLyBhaGVhZC1vZi10aW1lIGRlcGVuZGVuY3kgbWFuYWdlbWVudC4KfQoKCi8qKgogKiBSZXR1cm5zIGFuIG9iamVjdCBiYXNlZCBvbiBpdHMgZnVsbHkgcXVhbGlmaWVkIGV4dGVybmFsIG5hbWUuICBUaGUgb2JqZWN0CiAqIGlzIG5vdCBmb3VuZCBpZiBudWxsIG9yIHVuZGVmaW5lZC4gIElmIHlvdSBhcmUgdXNpbmcgYSBjb21waWxhdGlvbiBwYXNzIHRoYXQKICogcmVuYW1lcyBwcm9wZXJ0eSBuYW1lcyBiZXdhcmUgdGhhdCB1c2luZyB0aGlzIGZ1bmN0aW9uIHdpbGwgbm90IGZpbmQgcmVuYW1lZAogKiBwcm9wZXJ0aWVzLgogKgogKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUuCiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0X29iaiBUaGUgb2JqZWN0IHdpdGhpbiB3aGljaCB0byBsb29rOyBkZWZhdWx0IGlzCiAqICAgICB8Z29vZy5nbG9iYWx8LgogKiBAcmV0dXJuIHs/fSBUaGUgdmFsdWUgKG9iamVjdCBvciBwcmltaXRpdmUpIG9yLCBpZiBub3QgZm91bmQsIG51bGwuCiAqLwpnb29nLmdldE9iamVjdEJ5TmFtZSA9IGZ1bmN0aW9uKG5hbWUsIG9wdF9vYmopIHsKICB2YXIgcGFydHMgPSBuYW1lLnNwbGl0KCcuJyk7CiAgdmFyIGN1ciA9IG9wdF9vYmogfHwgZ29vZy5nbG9iYWw7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgY3VyID0gY3VyW3BhcnRzW2ldXTsKICAgIGlmIChjdXIgPT0gbnVsbCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CiAgcmV0dXJuIGN1cjsKfTsKCgovKioKICogR2xvYmFsaXplcyBhIHdob2xlIG5hbWVzcGFjZSwgc3VjaCBhcyBnb29nIG9yIGdvb2cubGFuZy4KICoKICogQHBhcmFtIHshT2JqZWN0fSBvYmogVGhlIG5hbWVzcGFjZSB0byBnbG9iYWxpemUuCiAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0X2dsb2JhbCBUaGUgb2JqZWN0IHRvIGFkZCB0aGUgcHJvcGVydGllcyB0by4KICogQGRlcHJlY2F0ZWQgUHJvcGVydGllcyBtYXkgYmUgZXhwbGljaXRseSBleHBvcnRlZCB0byB0aGUgZ2xvYmFsIHNjb3BlLCBidXQKICogICAgIHRoaXMgc2hvdWxkIG5vIGxvbmdlciBiZSBkb25lIGluIGJ1bGsuCiAqLwpnb29nLmdsb2JhbGl6ZSA9IGZ1bmN0aW9uKG9iaiwgb3B0X2dsb2JhbCkgewogIHZhciBnbG9iYWwgPSBvcHRfZ2xvYmFsIHx8IGdvb2cuZ2xvYmFsOwogIGZvciAodmFyIHggaW4gb2JqKSB7CiAgICBnbG9iYWxbeF0gPSBvYmpbeF07CiAgfQp9OwoKCi8qKgogKiBBZGRzIGEgZGVwZW5kZW5jeSBmcm9tIGEgZmlsZSB0byB0aGUgZmlsZXMgaXQgcmVxdWlyZXMuCiAqIEBwYXJhbSB7c3RyaW5nfSByZWxQYXRoIFRoZSBwYXRoIHRvIHRoZSBqcyBmaWxlLgogKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBBbiBhcnJheSBvZiBzdHJpbmdzIHdpdGgKICogICAgIHRoZSBuYW1lcyBvZiB0aGUgb2JqZWN0cyB0aGlzIGZpbGUgcHJvdmlkZXMuCiAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIEFuIGFycmF5IG9mIHN0cmluZ3Mgd2l0aAogKiAgICAgdGhlIG5hbWVzIG9mIHRoZSBvYmplY3RzIHRoaXMgZmlsZSByZXF1aXJlcy4KICogQHBhcmFtIHtib29sZWFufCFPYmplY3Q8c3RyaW5nPj19IG9wdF9sb2FkRmxhZ3MgUGFyYW1ldGVycyBpbmRpY2F0aW5nCiAqICAgICBob3cgdGhlIGZpbGUgbXVzdCBiZSBsb2FkZWQuICBUaGUgYm9vbGVhbiAndHJ1ZScgaXMgZXF1aXZhbGVudAogKiAgICAgdG8geydtb2R1bGUnOiAnZ29vZyd9IGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4gIFZhbGlkIHByb3BlcnRpZXMKICogICAgIGFuZCB2YWx1ZXMgaW5jbHVkZSB7J21vZHVsZSc6ICdnb29nJ30gYW5kIHsnbGFuZyc6ICdlczYnfS4KICovCmdvb2cuYWRkRGVwZW5kZW5jeSA9IGZ1bmN0aW9uKHJlbFBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgb3B0X2xvYWRGbGFncykgewogIGlmICghQ09NUElMRUQgJiYgZ29vZy5ERVBFTkRFTkNJRVNfRU5BQkxFRCkgewogICAgZ29vZy5kZWJ1Z0xvYWRlcl8uYWRkRGVwZW5kZW5jeShyZWxQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIG9wdF9sb2FkRmxhZ3MpOwogIH0KfTsKCgoKCi8vIE5PVEUobm5hemUpOiBUaGUgZGVidWcgRE9NIGxvYWRlciB3YXMgaW5jbHVkZWQgaW4gYmFzZS5qcyBhcyBhbiBvcmlnaW5hbCB3YXkKLy8gdG8gZG8gImRlYnVnLW1vZGUiIGRldmVsb3BtZW50LiAgVGhlIGRlcGVuZGVuY3kgc3lzdGVtIGNhbiBzb21ldGltZXMgYmUKLy8gY29uZnVzaW5nLCBhcyBjYW4gdGhlIGRlYnVnIERPTSBsb2FkZXIncyBhc3luY2hyb25vdXMgbmF0dXJlLgovLwovLyBXaXRoIHRoZSBET00gbG9hZGVyLCBhIGNhbGwgdG8gZ29vZy5yZXF1aXJlKCkgaXMgbm90IGJsb2NraW5nIC0tIHRoZSBzY3JpcHQKLy8gd2lsbCBub3QgbG9hZCB1bnRpbCBzb21lIHBvaW50IGFmdGVyIHRoZSBjdXJyZW50IHNjcmlwdC4gIElmIGEgbmFtZXNwYWNlIGlzCi8vIG5lZWRlZCBhdCBydW50aW1lLCBpdCBuZWVkcyB0byBiZSBkZWZpbmVkIGluIGEgcHJldmlvdXMgc2NyaXB0LCBvciBsb2FkZWQgdmlhCi8vIHJlcXVpcmUoKSB3aXRoIGl0cyByZWdpc3RlcmVkIGRlcGVuZGVuY2llcy4KLy8KLy8gVXNlci1kZWZpbmVkIG5hbWVzcGFjZXMgbWF5IG5lZWQgdGhlaXIgb3duIGRlcHMgZmlsZS4gRm9yIGEgcmVmZXJlbmNlIG9uCi8vIGNyZWF0aW5nIGEgZGVwcyBmaWxlLCBzZWU6Ci8vIEV4dGVybmFsbHk6IGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2Nsb3N1cmUvbGlicmFyeS9kb2NzL2RlcHN3cml0ZXIKLy8KLy8gQmVjYXVzZSBvZiBsZWdhY3kgY2xpZW50cywgdGhlIERPTSBsb2FkZXIgY2FuJ3QgYmUgZWFzaWx5IHJlbW92ZWQgZnJvbQovLyBiYXNlLmpzLiAgV29yayB3YXMgZG9uZSB0byBtYWtlIGl0IGRpc2FibGVhYmxlIG9yIHJlcGxhY2VhYmxlIGZvcgovLyBkaWZmZXJlbnQgZW52aXJvbm1lbnRzIChET00tbGVzcyBKYXZhU2NyaXB0IGludGVycHJldGVycyBsaWtlIFJoaW5vIG9yIFY4LAovLyBmb3IgZXhhbXBsZSkuIFNlZSBib290c3RyYXAvIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKCi8qKgogKiBAZGVmaW5lIHtib29sZWFufSBXaGV0aGVyIHRvIGVuYWJsZSB0aGUgZGVidWcgbG9hZGVyLgogKgogKiBJZiBlbmFibGVkLCBhIGNhbGwgdG8gZ29vZy5yZXF1aXJlKCkgd2lsbCBhdHRlbXB0IHRvIGxvYWQgdGhlIG5hbWVzcGFjZSBieQogKiBhcHBlbmRpbmcgYSBzY3JpcHQgdGFnIHRvIHRoZSBET00gKGlmIHRoZSBuYW1lc3BhY2UgaGFzIGJlZW4gcmVnaXN0ZXJlZCkuCiAqCiAqIElmIGRpc2FibGVkLCBnb29nLnJlcXVpcmUoKSB3aWxsIHNpbXBseSBhc3NlcnQgdGhhdCB0aGUgbmFtZXNwYWNlIGhhcyBiZWVuCiAqIHByb3ZpZGVkIChhbmQgZGVwZW5kIG9uIHRoZSBmYWN0IHRoYXQgc29tZSBvdXRzaWRlIHRvb2wgY29ycmVjdGx5IG9yZGVyZWQKICogdGhlIHNjcmlwdCkuCiAqLwpnb29nLkVOQUJMRV9ERUJVR19MT0FERVIgPSBnb29nLmRlZmluZSgnZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSJywgdHJ1ZSk7CgoKLyoqCiAqIEBwYXJhbSB7c3RyaW5nfSBtc2cKICogQHByaXZhdGUKICovCmdvb2cubG9nVG9Db25zb2xlXyA9IGZ1bmN0aW9uKG1zZykgewogIGlmIChnb29nLmdsb2JhbC5jb25zb2xlKSB7CiAgICBnb29nLmdsb2JhbC5jb25zb2xlWydlcnJvciddKG1zZyk7CiAgfQp9OwoKCi8qKgogKiBJbXBsZW1lbnRzIGEgc3lzdGVtIGZvciB0aGUgZHluYW1pYyByZXNvbHV0aW9uIG9mIGRlcGVuZGVuY2llcyB0aGF0IHdvcmtzIGluCiAqIHBhcmFsbGVsIHdpdGggdGhlIEJVSUxEIHN5c3RlbS4KICoKICogTm90ZSB0aGF0IGFsbCBjYWxscyB0byBnb29nLnJlcXVpcmUgd2lsbCBiZSBzdHJpcHBlZCBieSB0aGUgY29tcGlsZXIuCiAqCiAqIEBzZWUgZ29vZy5wcm92aWRlCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgTmFtZXNwYWNlIChhcyB3YXMgZ2l2ZW4gaW4gZ29vZy5wcm92aWRlLAogKiAgICAgZ29vZy5tb2R1bGUsIG9yIGdvb2cuZGVjbGFyZU1vZHVsZUlkKSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICogQHJldHVybiB7P30gSWYgY2FsbGVkIHdpdGhpbiBhIGdvb2cubW9kdWxlIG9yIEVTNiBtb2R1bGUgZmlsZSwgdGhlIGFzc29jaWF0ZWQKICogICAgIG5hbWVzcGFjZSBvciBtb2R1bGUgb3RoZXJ3aXNlIG51bGwuCiAqLwpnb29nLnJlcXVpcmUgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICBpZiAoIUNPTVBJTEVEKSB7CiAgICAvLyBNaWdodCBuZWVkIHRvIGxhenkgbG9hZCBvbiBvbGQgSUUuCiAgICBpZiAoZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSKSB7CiAgICAgIGdvb2cuZGVidWdMb2FkZXJfLnJlcXVlc3RlZChuYW1lc3BhY2UpOwogICAgfQoKICAgIC8vIElmIHRoZSBvYmplY3QgYWxyZWFkeSBleGlzdHMgd2UgZG8gbm90IG5lZWQgdG8gZG8gYW55dGhpbmcuCiAgICBpZiAoZ29vZy5pc1Byb3ZpZGVkXyhuYW1lc3BhY2UpKSB7CiAgICAgIGlmIChnb29nLmlzSW5Nb2R1bGVMb2FkZXJfKCkpIHsKICAgICAgICByZXR1cm4gZ29vZy5tb2R1bGUuZ2V0SW50ZXJuYWxfKG5hbWVzcGFjZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSKSB7CiAgICAgIHZhciBtb2R1bGVMb2FkZXJTdGF0ZSA9IGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfOwogICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG51bGw7CiAgICAgIHRyeSB7CiAgICAgICAgZ29vZy5kZWJ1Z0xvYWRlcl8ubG9hZF8obmFtZXNwYWNlKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG1vZHVsZUxvYWRlclN0YXRlOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIG51bGw7CiAgfQp9OwoKCi8qKgogKiBSZXF1aXJlcyBhIHN5bWJvbCBmb3IgaXRzIHR5cGUgaW5mb3JtYXRpb24uIFRoaXMgaXMgYW4gaW5kaWNhdGlvbiB0byB0aGUKICogY29tcGlsZXIgdGhhdCB0aGUgc3ltYm9sIG1heSBhcHBlYXIgaW4gdHlwZSBhbm5vdGF0aW9ucywgeWV0IGl0IGlzIG5vdAogKiByZWZlcmVuY2VkIGF0IHJ1bnRpbWUuCiAqCiAqIFdoZW4gY2FsbGVkIHdpdGhpbiBhIGdvb2cubW9kdWxlIG9yIEVTNiBtb2R1bGUgZmlsZSwgdGhlIHJldHVybiB2YWx1ZSBtYXkgYmUKICogYXNzaWduZWQgdG8gb3IgZGVzdHJ1Y3R1cmVkIGludG8gYSB2YXJpYWJsZSwgYnV0IGl0IG1heSBub3QgYmUgb3RoZXJ3aXNlIHVzZWQKICogaW4gY29kZSBvdXRzaWRlIG9mIGEgdHlwZSBhbm5vdGF0aW9uLgogKgogKiBOb3RlIHRoYXQgYWxsIGNhbGxzIHRvIGdvb2cucmVxdWlyZVR5cGUgd2lsbCBiZSBzdHJpcHBlZCBieSB0aGUgY29tcGlsZXIuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lc3BhY2UgTmFtZXNwYWNlIChhcyB3YXMgZ2l2ZW4gaW4gZ29vZy5wcm92aWRlLAogKiAgICAgZ29vZy5tb2R1bGUsIG9yIGdvb2cuZGVjbGFyZU1vZHVsZUlkKSBpbiB0aGUgZm9ybQogKiAgICAgImdvb2cucGFja2FnZS5wYXJ0Ii4KICogQHJldHVybiB7P30KICovCmdvb2cucmVxdWlyZVR5cGUgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICAvLyBSZXR1cm4gYW4gZW1wdHkgb2JqZWN0IHNvIHRoYXQgc2luZ2xlLWxldmVsIGRlc3RydWN0dXJpbmcgb2YgdGhlIHJldHVybgogIC8vIHZhbHVlIGRvZXNuJ3QgY3Jhc2ggYXQgcnVudGltZSB3aGVuIHVzaW5nIHRoZSBkZWJ1ZyBsb2FkZXIuIE11bHRpLWxldmVsCiAgLy8gZGVzdHJ1Y3R1cmluZyBpc24ndCBzdXBwb3J0ZWQuCiAgcmV0dXJuIHt9Owp9OwoKCi8qKgogKiBQYXRoIGZvciBpbmNsdWRlZCBzY3JpcHRzLgogKiBAdHlwZSB7c3RyaW5nfQogKi8KZ29vZy5iYXNlUGF0aCA9ICcnOwoKCi8qKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIGJhc2UgcGF0aC4KICogQHR5cGUge3N0cmluZ3x1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0JBU0VfUEFUSDsKCgovKioKICogV2hldGhlciB0byBhdHRlbXB0IHRvIGxvYWQgQ2xvc3VyZSdzIGRlcHMgZmlsZS4gQnkgZGVmYXVsdCwgd2hlbiB1bmNvbXBpbGVkLAogKiBkZXBzIGZpbGVzIHdpbGwgYXR0ZW1wdCB0byBiZSBsb2FkZWQuCiAqIEB0eXBlIHtib29sZWFufHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfTk9fREVQUzsKCgovKioKICogQSBmdW5jdGlvbiB0byBpbXBvcnQgYSBzaW5nbGUgc2NyaXB0LiBUaGlzIGlzIG1lYW50IHRvIGJlIG92ZXJyaWRkZW4gd2hlbgogKiBDbG9zdXJlIGlzIGJlaW5nIHJ1biBpbiBub24tSFRNTCBjb250ZXh0cywgc3VjaCBhcyB3ZWIgd29ya2Vycy4gSXQncyBkZWZpbmVkCiAqIGluIHRoZSBnbG9iYWwgc2NvcGUgc28gdGhhdCBpdCBjYW4gYmUgc2V0IGJlZm9yZSBiYXNlLmpzIGlzIGxvYWRlZCwgd2hpY2gKICogYWxsb3dzIGRlcHMuanMgdG8gYmUgaW1wb3J0ZWQgcHJvcGVybHkuCiAqCiAqIFRoZSBmaXJzdCBwYXJhbWV0ZXIgdGhlIHNjcmlwdCBzb3VyY2UsIHdoaWNoIGlzIGEgcmVsYXRpdmUgVVJJLiBUaGUgc2Vjb25kLAogKiBvcHRpb25hbCBwYXJhbWV0ZXIgaXMgdGhlIHNjcmlwdCBjb250ZW50cywgaW4gdGhlIGV2ZW50IHRoZSBzY3JpcHQgbmVlZGVkCiAqIHRyYW5zZm9ybWF0aW9uLiBJdCBzaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlIHNjcmlwdCB3YXMgaW1wb3J0ZWQsIGZhbHNlCiAqIG90aGVyd2lzZS4KICogQHR5cGUgeyhmdW5jdGlvbihzdHJpbmcsIHN0cmluZz0pOiBib29sZWFuKXx1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0lNUE9SVF9TQ1JJUFQ7CgoKLyoqCiAqIE51bGwgZnVuY3Rpb24gdXNlZCBmb3IgZGVmYXVsdCB2YWx1ZXMgb2YgY2FsbGJhY2tzLCBldGMuCiAqIEByZXR1cm4ge3ZvaWR9IE5vdGhpbmcuCiAqLwpnb29nLm51bGxGdW5jdGlvbiA9IGZ1bmN0aW9uKCkge307CgoKLyoqCiAqIFdoZW4gZGVmaW5pbmcgYSBjbGFzcyBGb28gd2l0aCBhbiBhYnN0cmFjdCBtZXRob2QgYmFyKCksIHlvdSBjYW4gZG86CiAqIEZvby5wcm90b3R5cGUuYmFyID0gZ29vZy5hYnN0cmFjdE1ldGhvZAogKgogKiBOb3cgaWYgYSBzdWJjbGFzcyBvZiBGb28gZmFpbHMgdG8gb3ZlcnJpZGUgYmFyKCksIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duCiAqIHdoZW4gYmFyKCkgaXMgaW52b2tlZC4KICoKICogQHR5cGUgeyFGdW5jdGlvbn0KICogQHRocm93cyB7RXJyb3J9IHdoZW4gaW52b2tlZCB0byBpbmRpY2F0ZSB0aGUgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuLgogKiBAZGVwcmVjYXRlZCBVc2UgIkBhYnN0cmFjdCIgYW5ub3RhdGlvbiBpbnN0ZWFkIG9mIGdvb2cuYWJzdHJhY3RNZXRob2QgaW4gbmV3CiAqICAgICBjb2RlLiBTZWUKICogICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1jb21waWxlci93aWtpL0BhYnN0cmFjdC1jbGFzc2VzLWFuZC1tZXRob2RzCiAqLwpnb29nLmFic3RyYWN0TWV0aG9kID0gZnVuY3Rpb24oKSB7CiAgdGhyb3cgbmV3IEVycm9yKCd1bmltcGxlbWVudGVkIGFic3RyYWN0IG1ldGhvZCcpOwp9OwoKCi8qKgogKiBBZGRzIGEgYGdldEluc3RhbmNlYCBzdGF0aWMgbWV0aG9kIHRoYXQgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUKICogaW5zdGFuY2Ugb2JqZWN0LgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY3RvciBUaGUgY29uc3RydWN0b3IgZm9yIHRoZSBjbGFzcyB0byBhZGQgdGhlIHN0YXRpYwogKiAgICAgbWV0aG9kIHRvLgogKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSAnaW5zdGFuY2VfJyBpc24ndCBhIHByb3BlcnR5IG9uICdGdW5jdGlvbicKICogICAgIGJ1dCB3ZSBkb24ndCBoYXZlIGEgYmV0dGVyIHR5cGUgdG8gdXNlIGhlcmUuCiAqLwpnb29nLmFkZFNpbmdsZXRvbkdldHRlciA9IGZ1bmN0aW9uKGN0b3IpIHsKICAvLyBpbnN0YW5jZV8gaXMgaW1tZWRpYXRlbHkgc2V0IHRvIHByZXZlbnQgaXNzdWVzIHdpdGggc2VhbGVkIGNvbnN0cnVjdG9ycwogIC8vIHN1Y2ggYXMgYXJlIGVuY291bnRlcmVkIHdoZW4gYSBjb25zdHJ1Y3RvciBpcyByZXR1cm5lZCBhcyB0aGUgZXhwb3J0IG9iamVjdAogIC8vIG9mIGEgZ29vZy5tb2R1bGUgaW4gdW5vcHRpbWl6ZWQgY29kZS4KICAvLyBEZWxjYXJlIHR5cGUgdG8gYXZvaWQgY29uZm9ybWFuY2UgdmlvbGF0aW9ucyB0aGF0IGN0b3IuaW5zdGFuY2VfIGlzIHVua25vd24KICAvKiogQHR5cGUge3VuZGVmaW5lZHwhT2JqZWN0fSBAc3VwcHJlc3Mge3VuZGVyc2NvcmV9ICovCiAgY3Rvci5pbnN0YW5jZV8gPSB1bmRlZmluZWQ7CiAgY3Rvci5nZXRJbnN0YW5jZSA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGN0b3IuaW5zdGFuY2VfKSB7CiAgICAgIHJldHVybiBjdG9yLmluc3RhbmNlXzsKICAgIH0KICAgIGlmIChnb29nLkRFQlVHKSB7CiAgICAgIC8vIE5PVEU6IEpTQ29tcGlsZXIgY2FuJ3Qgb3B0aW1pemUgYXdheSBBcnJheSNwdXNoLgogICAgICBnb29nLmluc3RhbnRpYXRlZFNpbmdsZXRvbnNfW2dvb2cuaW5zdGFudGlhdGVkU2luZ2xldG9uc18ubGVuZ3RoXSA9IGN0b3I7CiAgICB9CiAgICAvLyBDYXN0IHRvIGF2b2lkIGNvbmZvcm1hbmNlIHZpb2xhdGlvbnMgdGhhdCBjdG9yLmluc3RhbmNlXyBpcyB1bmtub3duCiAgICByZXR1cm4gLyoqIEB0eXBlIHshT2JqZWN0fHVuZGVmaW5lZH0gKi8gKGN0b3IuaW5zdGFuY2VfKSA9IG5ldyBjdG9yOwogIH07Cn07CgoKLyoqCiAqIEFsbCBzaW5nbGV0b24gY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBpbnN0YW50aWF0ZWQsIGZvciB0ZXN0aW5nLiBEb24ndCByZWFkCiAqIGl0IGRpcmVjdGx5LCB1c2UgdGhlIGBnb29nLnRlc3Rpbmcuc2luZ2xldG9uYCBtb2R1bGUuIFRoZSBjb21waWxlcgogKiByZW1vdmVzIHRoaXMgdmFyaWFibGUgaWYgdW51c2VkLgogKiBAdHlwZSB7IUFycmF5PCFGdW5jdGlvbj59CiAqIEBwcml2YXRlCiAqLwpnb29nLmluc3RhbnRpYXRlZFNpbmdsZXRvbnNfID0gW107CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdG8gbG9hZCBnb29nLm1vZHVsZXMgdXNpbmcgYGV2YWxgIHdoZW4gdXNpbmcKICogdGhlIGRlYnVnIGxvYWRlci4gIFRoaXMgcHJvdmlkZXMgYSBiZXR0ZXIgZGVidWdnaW5nIGV4cGVyaWVuY2UgYXMgdGhlCiAqIHNvdXJjZSBpcyB1bm1vZGlmaWVkIGFuZCBjYW4gYmUgZWRpdGVkIHVzaW5nIENocm9tZSBXb3Jrc3BhY2VzIG9yIHNpbWlsYXIuCiAqIEhvd2V2ZXIgaW4gc29tZSBlbnZpcm9ubWVudHMgdGhlIHVzZSBvZiBgZXZhbGAgaXMgYmFubmVkCiAqIHNvIHdlIHByb3ZpZGUgYW4gYWx0ZXJuYXRpdmUuCiAqLwpnb29nLkxPQURfTU9EVUxFX1VTSU5HX0VWQUwgPSBnb29nLmRlZmluZSgnZ29vZy5MT0FEX01PRFVMRV9VU0lOR19FVkFMJywgdHJ1ZSk7CgoKLyoqCiAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGV4cG9ydHMgb2YgZ29vZy5tb2R1bGVzIHNob3VsZCBiZSBzZWFsZWQgd2hlbgogKiBwb3NzaWJsZS4KICovCmdvb2cuU0VBTF9NT0RVTEVfRVhQT1JUUyA9IGdvb2cuZGVmaW5lKCdnb29nLlNFQUxfTU9EVUxFX0VYUE9SVFMnLCBnb29nLkRFQlVHKTsKCgovKioKICogVGhlIHJlZ2lzdHJ5IG9mIGluaXRpYWxpemVkIG1vZHVsZXM6CiAqIFRoZSBtb2R1bGUgaWRlbnRpZmllciBvciBwYXRoIHRvIG1vZHVsZSBleHBvcnRzIG1hcC4KICogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywge2V4cG9ydHM6Pyx0eXBlOnN0cmluZyxtb2R1bGVJZDpzdHJpbmd9Pn0KICovCmdvb2cubG9hZGVkTW9kdWxlc18gPSB7fTsKCgovKioKICogVHJ1ZSBpZiB0aGUgZGVidWcgbG9hZGVyIGVuYWJsZWQgYW5kIHVzZWQuCiAqIEBjb25zdCB7Ym9vbGVhbn0KICovCmdvb2cuREVQRU5ERU5DSUVTX0VOQUJMRUQgPSAhQ09NUElMRUQgJiYgZ29vZy5FTkFCTEVfREVCVUdfTE9BREVSOwoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IEhvdyB0byBkZWNpZGUgd2hldGhlciB0byB0cmFuc3BpbGUuICBWYWxpZCB2YWx1ZXMKICogYXJlICdhbHdheXMnLCAnbmV2ZXInLCBhbmQgJ2RldGVjdCcuICBUaGUgZGVmYXVsdCAoJ2RldGVjdCcpIGlzIHRvCiAqIHVzZSBmZWF0dXJlIGRldGVjdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggbGFuZ3VhZ2UgbGV2ZWxzIG5lZWQKICogdHJhbnNwaWxhdGlvbi4KICovCi8vIE5PVEUoc2RoKTogd2UgY291bGQgZXhwYW5kIHRoaXMgdG8gYWNjZXB0IGEgbGFuZ3VhZ2UgbGV2ZWwgdG8gYnlwYXNzCi8vIGRldGVjdGlvbjogZS5nLiBnb29nLlRSQU5TUElMRSA9PSAnZXM1JyB3b3VsZCB0cmFuc3BpbGUgRVM2IGZpbGVzIGJ1dAovLyB3b3VsZCBsZWF2ZSBFUzMgYW5kIEVTNSBmaWxlcyBhbG9uZS4KZ29vZy5UUkFOU1BJTEUgPSBnb29nLmRlZmluZSgnZ29vZy5UUkFOU1BJTEUnLCAnZGV0ZWN0Jyk7CgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gSWYgdHJ1ZSBhc3N1bWUgdGhhdCBFUyBtb2R1bGVzIGhhdmUgYWxyZWFkeSBiZWVuCiAqIHRyYW5zcGlsZWQgYnkgdGhlIGpzY29tcGlsZXIgKGluIHRoZSBzYW1lIHdheSB0aGF0IHRyYW5zcGlsZS5qcyB3b3VsZAogKiB0cmFuc3BpbGUgdGhlbSAtIHRvIGpzY29tcCBtb2R1bGVzKS4gVXNlZnVsIG9ubHkgZm9yIHNlcnZlcnMgdGhhdCB3aXNoIHRvIHVzZQogKiB0aGUgZGVidWcgbG9hZGVyIGFuZCB0cmFuc3BpbGUgc2VydmVyIHNpZGUuIFRodXMgdGhpcyBpcyBvbmx5IHJlc3BlY3RlZCBpZgogKiBnb29nLlRSQU5TUElMRSBpcyAibmV2ZXIiLgogKi8KZ29vZy5BU1NVTUVfRVNfTU9EVUxFU19UUkFOU1BJTEVEID0KICAgIGdvb2cuZGVmaW5lKCdnb29nLkFTU1VNRV9FU19NT0RVTEVTX1RSQU5TUElMRUQnLCBmYWxzZSk7CgoKLyoqCiAqIEBkZWZpbmUge3N0cmluZ30gSWYgYSBmaWxlIG5lZWRzIHRvIGJlIHRyYW5zcGlsZWQgd2hhdCB0aGUgb3V0cHV0IGxhbmd1YWdlCiAqIHNob3VsZCBiZS4gQnkgZGVmYXVsdCB0aGlzIGlzIHRoZSBoaWdoZXN0IGxhbmd1YWdlIGxldmVsIHRoaXMgZmlsZSBkZXRlY3RzCiAqIHRoZSBjdXJyZW50IGVudmlyb25tZW50IHN1cHBvcnRzLiBHZW5lcmFsbHkgdGhpcyBmbGFnIHNob3VsZCBub3QgYmUgc2V0LCBidXQKICogaXQgY291bGQgYmUgdXNlZnVsIHRvIG92ZXJyaWRlLiBFeGFtcGxlOiBJZiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCBzdXBwb3J0cwogKiBFUzYgdGhlbiBieSBkZWZhdWx0IEVTNysgZmlsZXMgd2lsbCBiZSB0cmFuc3BpbGVkIHRvIEVTNiwgdW5sZXNzIHRoaXMgaXMKICogb3ZlcnJpZGRlbi4KICoKICogVmFsaWQgdmFsdWVzIGluY2x1ZGU6IGVzMywgZXM1LCBlczYsIGVzNywgYW5kIGVzOC4gQW55dGhpbmcgbm90IHJlY29nbml6ZWQKICogaXMgdHJlYXRlZCBhcyBlczMuCiAqCiAqIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgdmFsdWUgZG9lcyBub3QgZm9yY2UgdHJhbnNwaWxhdGlvbi4gSnVzdCBpZgogKiB0cmFuc3BpbGF0aW9uIG9jY3VycyB0aGlzIHdpbGwgYmUgdGhlIG91dHB1dC4gU28gdGhpcyBpcyBtb3N0IHVzZWZ1bCB3aGVuCiAqIGdvb2cuVFJBTlNQSUxFIGlzIHNldCB0byAnYWx3YXlzJyBhbmQgdGhlbiBmb3JjaW5nIHRoZSBsYW5ndWFnZSBsZXZlbCB0byBiZQogKiBzb21ldGhpbmcgbG93ZXIgdGhhbiB3aGF0IHRoZSBlbnZpcm9ubWVudCBkZXRlY3RzLgogKi8KZ29vZy5UUkFOU1BJTEVfVE9fTEFOR1VBR0UgPSBnb29nLmRlZmluZSgnZ29vZy5UUkFOU1BJTEVfVE9fTEFOR1VBR0UnLCAnJyk7CgoKLyoqCiAqIEBkZWZpbmUge3N0cmluZ30gUGF0aCB0byB0aGUgdHJhbnNwaWxlci4gIEV4ZWN1dGluZyB0aGUgc2NyaXB0IGF0IHRoaXMKICogcGF0aCAocmVsYXRpdmUgdG8gYmFzZS5qcykgc2hvdWxkIGRlZmluZSBhIGZ1bmN0aW9uICRqc2NvbXAudHJhbnNwaWxlLgogKi8KZ29vZy5UUkFOU1BJTEVSID0gZ29vZy5kZWZpbmUoJ2dvb2cuVFJBTlNQSUxFUicsICd0cmFuc3BpbGUuanMnKTsKCgovKioKICogQHBhY2thZ2Ugez9ib29sZWFufQogKiBWaXNpYmxlIGZvciB0ZXN0aW5nLgogKi8KZ29vZy5oYXNCYWRMZXRTY29waW5nID0gbnVsbDsKCgovKioKICogQHJldHVybiB7Ym9vbGVhbn0KICogQHBhY2thZ2UgVmlzaWJsZSBmb3IgdGVzdGluZy4KICovCmdvb2cudXNlU2FmYXJpMTBXb3JrYXJvdW5kID0gZnVuY3Rpb24oKSB7CiAgaWYgKGdvb2cuaGFzQmFkTGV0U2NvcGluZyA9PSBudWxsKSB7CiAgICB2YXIgaGFzQmFkTGV0U2NvcGluZzsKICAgIHRyeSB7CiAgICAgIGhhc0JhZExldFNjb3BpbmcgPSAhZXZhbCgKICAgICAgICAgICcidXNlIHN0cmljdCI7JyArCiAgICAgICAgICAnbGV0IHggPSAxOyBmdW5jdGlvbiBmKCkgeyByZXR1cm4gdHlwZW9mIHg7IH07JyArCiAgICAgICAgICAnZigpID09ICJudW1iZXIiOycpOwogICAgfSBjYXRjaCAoZSkgewogICAgICAvLyBBc3N1bWUgdGhhdCBFUzYgc3ludGF4IGlzbid0IHN1cHBvcnRlZC4KICAgICAgaGFzQmFkTGV0U2NvcGluZyA9IGZhbHNlOwogICAgfQogICAgZ29vZy5oYXNCYWRMZXRTY29waW5nID0gaGFzQmFkTGV0U2NvcGluZzsKICB9CiAgcmV0dXJuIGdvb2cuaGFzQmFkTGV0U2NvcGluZzsKfTsKCgovKioKICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZURlZgogKiBAcmV0dXJuIHtzdHJpbmd9CiAqIEBwYWNrYWdlIFZpc2libGUgZm9yIHRlc3RpbmcuCiAqLwpnb29nLndvcmthcm91bmRTYWZhcmkxMEV2YWxCdWcgPSBmdW5jdGlvbihtb2R1bGVEZWYpIHsKICByZXR1cm4gJyhmdW5jdGlvbigpeycgKyBtb2R1bGVEZWYgKwogICAgICAnXG4nICsgIC8vIFRlcm1pbmF0ZSBhbnkgdHJhaWxpbmcgc2luZ2xlIGxpbmUgY29tbWVudC4KICAgICAgJzsnICsgICAvLyBUZXJtaW5hdGUgYW55IHRyYWlsaW5nIGV4cHJlc3Npb24uCiAgICAgICd9KSgpO1xuJzsKfTsKCgovKioKICogQHBhcmFtIHtmdW5jdGlvbig/KTo/fHN0cmluZ30gbW9kdWxlRGVmIFRoZSBtb2R1bGUgZGVmaW5pdGlvbi4KICovCmdvb2cubG9hZE1vZHVsZSA9IGZ1bmN0aW9uKG1vZHVsZURlZikgewogIC8vIE5PVEU6IHdlIGFsbG93IGZ1bmN0aW9uIGRlZmluaXRpb25zIHRvIGJlIGVpdGhlciBpbiB0aGUgZnJvbQogIC8vIG9mIGEgc3RyaW5nIHRvIGV2YWwgKHdoaWNoIGtlZXBzIHRoZSBvcmlnaW5hbCBzb3VyY2UgaW50YWN0KSBvcgogIC8vIGluIGEgZXZhbCBmb3JiaWRkZW4gZW52aXJvbm1lbnQgKENTUCkgd2UgYWxsb3cgYSBmdW5jdGlvbiBkZWZpbml0aW9uCiAgLy8gd2hpY2ggaW4gaXRzIGJvZHkgbXVzdCBjYWxsIGBnb29nLm1vZHVsZWAsIGFuZCByZXR1cm4gdGhlIGV4cG9ydHMKICAvLyBvZiB0aGUgbW9kdWxlLgogIHZhciBwcmV2aW91c1N0YXRlID0gZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV87CiAgdHJ5IHsKICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gewogICAgICBtb2R1bGVOYW1lOiAnJywKICAgICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTogZmFsc2UsCiAgICAgIHR5cGU6IGdvb2cuTW9kdWxlVHlwZS5HT09HCiAgICB9OwogICAgdmFyIGV4cG9ydHM7CiAgICBpZiAoZ29vZy5pc0Z1bmN0aW9uKG1vZHVsZURlZikpIHsKICAgICAgZXhwb3J0cyA9IG1vZHVsZURlZi5jYWxsKHVuZGVmaW5lZCwge30pOwogICAgfSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlRGVmID09PSAnc3RyaW5nJykgewogICAgICBpZiAoZ29vZy51c2VTYWZhcmkxMFdvcmthcm91bmQoKSkgewogICAgICAgIG1vZHVsZURlZiA9IGdvb2cud29ya2Fyb3VuZFNhZmFyaTEwRXZhbEJ1Zyhtb2R1bGVEZWYpOwogICAgICB9CgogICAgICBleHBvcnRzID0gZ29vZy5sb2FkTW9kdWxlRnJvbVNvdXJjZV8uY2FsbCh1bmRlZmluZWQsIG1vZHVsZURlZik7CiAgICB9IGVsc2UgewogICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbW9kdWxlIGRlZmluaXRpb24nKTsKICAgIH0KCiAgICB2YXIgbW9kdWxlTmFtZSA9IGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWU7CiAgICBpZiAodHlwZW9mIG1vZHVsZU5hbWUgPT09ICdzdHJpbmcnICYmIG1vZHVsZU5hbWUpIHsKICAgICAgLy8gRG9uJ3Qgc2VhbCBsZWdhY3kgbmFtZXNwYWNlcyBhcyB0aGV5IG1heSBiZSB1c2VkIGFzIGEgcGFyZW50IG9mCiAgICAgIC8vIGFub3RoZXIgbmFtZXNwYWNlCiAgICAgIGlmIChnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5kZWNsYXJlTGVnYWN5TmFtZXNwYWNlKSB7CiAgICAgICAgZ29vZy5jb25zdHJ1Y3ROYW1lc3BhY2VfKG1vZHVsZU5hbWUsIGV4cG9ydHMpOwogICAgICB9IGVsc2UgaWYgKAogICAgICAgICAgZ29vZy5TRUFMX01PRFVMRV9FWFBPUlRTICYmIE9iamVjdC5zZWFsICYmCiAgICAgICAgICB0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiBleHBvcnRzICE9IG51bGwpIHsKICAgICAgICBPYmplY3Quc2VhbChleHBvcnRzKTsKICAgICAgfQoKICAgICAgdmFyIGRhdGEgPSB7CiAgICAgICAgZXhwb3J0czogZXhwb3J0cywKICAgICAgICB0eXBlOiBnb29nLk1vZHVsZVR5cGUuR09PRywKICAgICAgICBtb2R1bGVJZDogZ29vZy5tb2R1bGVMb2FkZXJTdGF0ZV8ubW9kdWxlTmFtZQogICAgICB9OwogICAgICBnb29nLmxvYWRlZE1vZHVsZXNfW21vZHVsZU5hbWVdID0gZGF0YTsKICAgIH0gZWxzZSB7CiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBtb2R1bGUgbmFtZSBcIicgKyBtb2R1bGVOYW1lICsgJ1wiJyk7CiAgICB9CiAgfSBmaW5hbGx5IHsKICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gcHJldmlvdXNTdGF0ZTsKICB9Cn07CgoKLyoqCiAqIEBwcml2YXRlIEBjb25zdAogKi8KZ29vZy5sb2FkTW9kdWxlRnJvbVNvdXJjZV8gPSAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZyk6P30gKi8gKGZ1bmN0aW9uKCkgewogIC8vIE5PVEU6IHdlIGF2b2lkIGRlY2xhcmluZyBwYXJhbWV0ZXJzIG9yIGxvY2FsIHZhcmlhYmxlcyBoZXJlIHRvIGF2b2lkCiAgLy8gbWFza2luZyBnbG9iYWxzIG9yIGxlYWtpbmcgdmFsdWVzIGludG8gdGhlIG1vZHVsZSBkZWZpbml0aW9uLgogICd1c2Ugc3RyaWN0JzsKICB2YXIgZXhwb3J0cyA9IHt9OwogIGV2YWwoYXJndW1lbnRzWzBdKTsKICByZXR1cm4gZXhwb3J0czsKfSk7CgoKLyoqCiAqIE5vcm1hbGl6ZSBhIGZpbGUgcGF0aCBieSByZW1vdmluZyByZWR1bmRhbnQgIi4uIiBhbmQgZXh0cmFuZW91cyAiLiIgZmlsZQogKiBwYXRoIGNvbXBvbmVudHMuCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoCiAqIEByZXR1cm4ge3N0cmluZ30KICogQHByaXZhdGUKICovCmdvb2cubm9ybWFsaXplUGF0aF8gPSBmdW5jdGlvbihwYXRoKSB7CiAgdmFyIGNvbXBvbmVudHMgPSBwYXRoLnNwbGl0KCcvJyk7CiAgdmFyIGkgPSAwOwogIHdoaWxlIChpIDwgY29tcG9uZW50cy5sZW5ndGgpIHsKICAgIGlmIChjb21wb25lbnRzW2ldID09ICcuJykgewogICAgICBjb21wb25lbnRzLnNwbGljZShpLCAxKTsKICAgIH0gZWxzZSBpZiAoCiAgICAgICAgaSAmJiBjb21wb25lbnRzW2ldID09ICcuLicgJiYgY29tcG9uZW50c1tpIC0gMV0gJiYKICAgICAgICBjb21wb25lbnRzW2kgLSAxXSAhPSAnLi4nKSB7CiAgICAgIGNvbXBvbmVudHMuc3BsaWNlKC0taSwgMik7CiAgICB9IGVsc2UgewogICAgICBpKys7CiAgICB9CiAgfQogIHJldHVybiBjb21wb25lbnRzLmpvaW4oJy8nKTsKfTsKCgovKioKICogUHJvdmlkZXMgYSBob29rIGZvciBsb2FkaW5nIGEgZmlsZSB3aGVuIHVzaW5nIENsb3N1cmUncyBnb29nLnJlcXVpcmUoKSBBUEkKICogd2l0aCBnb29nLm1vZHVsZXMuICBJbiBwYXJ0aWN1bGFyIHRoaXMgaG9vayBpcyBwcm92aWRlZCB0byBzdXBwb3J0IE5vZGUuanMuCiAqCiAqIEB0eXBlIHsoZnVuY3Rpb24oc3RyaW5nKTpzdHJpbmcpfHVuZGVmaW5lZH0KICovCmdvb2cuZ2xvYmFsLkNMT1NVUkVfTE9BRF9GSUxFX1NZTkM7CgoKLyoqCiAqIExvYWRzIGZpbGUgYnkgc3luY2hyb25vdXMgWEhSLiBTaG91bGQgbm90IGJlIHVzZWQgaW4gcHJvZHVjdGlvbiBlbnZpcm9ubWVudHMuCiAqIEBwYXJhbSB7c3RyaW5nfSBzcmMgU291cmNlIFVSTC4KICogQHJldHVybiB7P3N0cmluZ30gRmlsZSBjb250ZW50cywgb3IgbnVsbCBpZiBsb2FkIGZhaWxlZC4KICogQHByaXZhdGUKICovCmdvb2cubG9hZEZpbGVTeW5jXyA9IGZ1bmN0aW9uKHNyYykgewogIGlmIChnb29nLmdsb2JhbC5DTE9TVVJFX0xPQURfRklMRV9TWU5DKSB7CiAgICByZXR1cm4gZ29vZy5nbG9iYWwuQ0xPU1VSRV9MT0FEX0ZJTEVfU1lOQyhzcmMpOwogIH0gZWxzZSB7CiAgICB0cnkgewogICAgICAvKiogQHR5cGUge1hNTEh0dHBSZXF1ZXN0fSAqLwogICAgICB2YXIgeGhyID0gbmV3IGdvb2cuZ2xvYmFsWydYTUxIdHRwUmVxdWVzdCddKCk7CiAgICAgIHhoci5vcGVuKCdnZXQnLCBzcmMsIGZhbHNlKTsKICAgICAgeGhyLnNlbmQoKTsKICAgICAgLy8gTk9URTogU3VjY2Vzc2Z1bCBodHRwOiByZXF1ZXN0cyBoYXZlIGEgc3RhdHVzIG9mIDIwMCwgYnV0IHN1Y2Nlc3NmdWwKICAgICAgLy8gZmlsZTogcmVxdWVzdHMgbWF5IGhhdmUgYSBzdGF0dXMgb2YgemVyby4gIEFueSBvdGhlciBzdGF0dXMsIG9yIGEKICAgICAgLy8gdGhyb3duIGV4Y2VwdGlvbiAocGFydGljdWxhcmx5IGluIGNhc2Ugb2YgZmlsZTogcmVxdWVzdHMpIGluZGljYXRlcwogICAgICAvLyBzb21lIHNvcnQgb2YgZXJyb3IsIHdoaWNoIHdlIHRyZWF0IGFzIGEgbWlzc2luZyBvciB1bmF2YWlsYWJsZSBmaWxlLgogICAgICByZXR1cm4geGhyLnN0YXR1cyA9PSAwIHx8IHhoci5zdGF0dXMgPT0gMjAwID8geGhyLnJlc3BvbnNlVGV4dCA6IG51bGw7CiAgICB9IGNhdGNoIChlcnIpIHsKICAgICAgLy8gTm8gbmVlZCB0byByZXRocm93IG9yIGxvZywgc2luY2UgZXJyb3JzIHNob3VsZCBzaG93IHVwIG9uIHRoZWlyIG93bi4KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQp9OwoKCi8qKgogKiBMYXppbHkgcmV0cmlldmVzIHRoZSB0cmFuc3BpbGVyIGFuZCBhcHBsaWVzIGl0IHRvIHRoZSBzb3VyY2UuCiAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIEpTIGNvZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdG8gdGhlIGNvZGUuCiAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgTGFuZ3VhZ2UgbGV2ZWwgb3V0cHV0LgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0cmFuc3BpbGVkIGNvZGUuCiAqIEBwcml2YXRlCiAqLwpnb29nLnRyYW5zcGlsZV8gPSBmdW5jdGlvbihjb2RlLCBwYXRoLCB0YXJnZXQpIHsKICB2YXIganNjb21wID0gZ29vZy5nbG9iYWxbJyRqc2NvbXAnXTsKICBpZiAoIWpzY29tcCkgewogICAgZ29vZy5nbG9iYWxbJyRqc2NvbXAnXSA9IGpzY29tcCA9IHt9OwogIH0KICB2YXIgdHJhbnNwaWxlID0ganNjb21wLnRyYW5zcGlsZTsKICBpZiAoIXRyYW5zcGlsZSkgewogICAgdmFyIHRyYW5zcGlsZXJQYXRoID0gZ29vZy5iYXNlUGF0aCArIGdvb2cuVFJBTlNQSUxFUjsKICAgIHZhciB0cmFuc3BpbGVyQ29kZSA9IGdvb2cubG9hZEZpbGVTeW5jXyh0cmFuc3BpbGVyUGF0aCk7CiAgICBpZiAodHJhbnNwaWxlckNvZGUpIHsKICAgICAgLy8gVGhpcyBtdXN0IGJlIGV4ZWN1dGVkIHN5bmNocm9ub3VzbHksIHNpbmNlIGJ5IHRoZSB0aW1lIHdlIGtub3cgd2UKICAgICAgLy8gbmVlZCBpdCwgd2UncmUgYWJvdXQgdG8gbG9hZCBhbmQgd3JpdGUgdGhlIEVTNiBjb2RlIHN5bmNocm9ub3VzbHksCiAgICAgIC8vIHNvIGEgbm9ybWFsIHNjcmlwdC10YWcgbG9hZCB3aWxsIGJlIHRvbyBzbG93LiBXcmFwcGVkIGluIGEgZnVuY3Rpb24KICAgICAgLy8gc28gdGhhdCBjb2RlIGlzIGV2YWwnZCBpbiB0aGUgZ2xvYmFsIHNjb3BlLgogICAgICAoZnVuY3Rpb24oKSB7CiAgICAgICAgKDAsIGV2YWwpKHRyYW5zcGlsZXJDb2RlICsgJ1xuLy8jIHNvdXJjZVVSTD0nICsgdHJhbnNwaWxlclBhdGgpOwogICAgICB9KS5jYWxsKGdvb2cuZ2xvYmFsKTsKICAgICAgLy8gRXZlbiB0aG91Z2ggdGhlIHRyYW5zcGlsZXIgaXMgb3B0aW9uYWwsIGlmICRnd3RFeHBvcnQgaXMgZm91bmQsIGl0J3MKICAgICAgLy8gYSBzaWduIHRoZSB0cmFuc3BpbGVyIHdhcyBsb2FkZWQgYW5kIHRoZSAkanNjb21wLnRyYW5zcGlsZSAqc2hvdWxkKgogICAgICAvLyBiZSB0aGVyZS4KICAgICAgaWYgKGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J10gJiYgZ29vZy5nbG9iYWxbJyRnd3RFeHBvcnQnXVsnJGpzY29tcCddICYmCiAgICAgICAgICAhZ29vZy5nbG9iYWxbJyRnd3RFeHBvcnQnXVsnJGpzY29tcCddWyd0cmFuc3BpbGUnXSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgJ1RoZSB0cmFuc3BpbGVyIGRpZCBub3QgcHJvcGVybHkgZXhwb3J0IHRoZSAidHJhbnNwaWxlIiAnICsKICAgICAgICAgICAgJ21ldGhvZC4gJGd3dEV4cG9ydDogJyArIEpTT04uc3RyaW5naWZ5KGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J10pKTsKICAgICAgfQogICAgICAvLyB0cmFuc3BpbGUuanMgb25seSBleHBvcnRzIGEgc2luZ2xlICRqc2NvbXAgZnVuY3Rpb24sIHRyYW5zcGlsZS4gV2UKICAgICAgLy8gZ3JhYiBqdXN0IHRoYXQgYW5kIGFkZCBpdCB0byB0aGUgZXhpc3RpbmcgZGVmaW5pdGlvbiBvZiAkanNjb21wIHdoaWNoCiAgICAgIC8vIGNvbnRhaW5zIHRoZSBwb2x5ZmlsbHMuCiAgICAgIGdvb2cuZ2xvYmFsWyckanNjb21wJ10udHJhbnNwaWxlID0KICAgICAgICAgIGdvb2cuZ2xvYmFsWyckZ3d0RXhwb3J0J11bJyRqc2NvbXAnXVsndHJhbnNwaWxlJ107CiAgICAgIGpzY29tcCA9IGdvb2cuZ2xvYmFsWyckanNjb21wJ107CiAgICAgIHRyYW5zcGlsZSA9IGpzY29tcC50cmFuc3BpbGU7CiAgICB9CiAgfQogIGlmICghdHJhbnNwaWxlKSB7CiAgICAvLyBUaGUgdHJhbnNwaWxlciBpcyBhbiBvcHRpb25hbCBjb21wb25lbnQuICBJZiBpdCdzIG5vdCBhdmFpbGFibGUgdGhlbgogICAgLy8gcmVwbGFjZSBpdCB3aXRoIGEgcGFzcy10aHJvdWdoIGZ1bmN0aW9uIHRoYXQgc2ltcGx5IGxvZ3MuCiAgICB2YXIgc3VmZml4ID0gJyByZXF1aXJlcyB0cmFuc3BpbGF0aW9uIGJ1dCBubyB0cmFuc3BpbGVyIHdhcyBmb3VuZC4nOwogICAgdHJhbnNwaWxlID0ganNjb21wLnRyYW5zcGlsZSA9IGZ1bmN0aW9uKGNvZGUsIHBhdGgpIHsKICAgICAgLy8gVE9ETyhzZGgpOiBmaWd1cmUgb3V0IHNvbWUgd2F5IHRvIGdldCB0aGlzIGVycm9yIHRvIHNob3cgdXAKICAgICAgLy8gaW4gdGVzdCByZXN1bHRzLCBub3RpbmcgdGhhdCB0aGUgZmFpbHVyZSBtYXkgb2NjdXIgaW4gbWFueQogICAgICAvLyBkaWZmZXJlbnQgd2F5cywgaW5jbHVkaW5nIGluIGxvYWRNb2R1bGUoKSBiZWZvcmUgdGhlIHRlc3QKICAgICAgLy8gcnVubmVyIGV2ZW4gY29tZXMgdXAuCiAgICAgIGdvb2cubG9nVG9Db25zb2xlXyhwYXRoICsgc3VmZml4KTsKICAgICAgcmV0dXJuIGNvZGU7CiAgICB9OwogIH0KICAvLyBOb3RlOiBhbnkgdHJhbnNwaWxhdGlvbiBlcnJvcnMvd2FybmluZ3Mgd2lsbCBiZSBsb2dnZWQgdG8gdGhlIGNvbnNvbGUuCiAgcmV0dXJuIHRyYW5zcGlsZShjb2RlLCBwYXRoLCB0YXJnZXQpOwp9OwoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gTGFuZ3VhZ2UgRW5oYW5jZW1lbnRzCi8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgoKLyoqCiAqIFRoaXMgaXMgYSAiZml4ZWQiIHZlcnNpb24gb2YgdGhlIHR5cGVvZiBvcGVyYXRvci4gIEl0IGRpZmZlcnMgZnJvbSB0aGUgdHlwZW9mCiAqIG9wZXJhdG9yIGluIHN1Y2ggYSB3YXkgdGhhdCBudWxsIHJldHVybnMgJ251bGwnIGFuZCBhcnJheXMgcmV0dXJuICdhcnJheScuCiAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIHZhbHVlIHRvIGdldCB0aGUgdHlwZSBvZi4KICogQHJldHVybiB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgdHlwZS4KICovCmdvb2cudHlwZU9mID0gZnVuY3Rpb24odmFsdWUpIHsKICB2YXIgcyA9IHR5cGVvZiB2YWx1ZTsKICBpZiAocyA9PSAnb2JqZWN0JykgewogICAgaWYgKHZhbHVlKSB7CiAgICAgIC8vIENoZWNrIHRoZXNlIGZpcnN0LCBzbyB3ZSBjYW4gYXZvaWQgY2FsbGluZyBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nIGlmCiAgICAgIC8vIHBvc3NpYmxlLgogICAgICAvLwogICAgICAvLyBJRSBpbXByb3Blcmx5IG1hcnNoYWxzIHR5cGVvZiBhY3Jvc3MgZXhlY3V0aW9uIGNvbnRleHRzLCBidXQgYQogICAgICAvLyBjcm9zcy1jb250ZXh0IG9iamVjdCB3aWxsIHN0aWxsIHJldHVybiBmYWxzZSBmb3IgImluc3RhbmNlb2YgT2JqZWN0Ii4KICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICByZXR1cm4gJ2FycmF5JzsKICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCkgewogICAgICAgIHJldHVybiBzOwogICAgICB9CgogICAgICAvLyBIQUNLOiBJbiBvcmRlciB0byB1c2UgYW4gT2JqZWN0IHByb3RvdHlwZSBtZXRob2Qgb24gdGhlIGFyYml0cmFyeQogICAgICAvLyAgIHZhbHVlLCB0aGUgY29tcGlsZXIgcmVxdWlyZXMgdGhlIHZhbHVlIGJlIGNhc3QgdG8gdHlwZSBPYmplY3QsCiAgICAgIC8vICAgZXZlbiB0aG91Z2ggdGhlIEVDTUEgc3BlYyBleHBsaWNpdGx5IGFsbG93cyBpdC4KICAgICAgdmFyIGNsYXNzTmFtZSA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCgKICAgICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8gKHZhbHVlKSk7CiAgICAgIC8vIEluIEZpcmVmb3ggMy42LCBhdHRlbXB0aW5nIHRvIGFjY2VzcyBpZnJhbWUgd2luZG93IG9iamVjdHMnIGxlbmd0aAogICAgICAvLyBwcm9wZXJ0eSB0aHJvd3MgYW4gTlNfRVJST1JfRkFJTFVSRSwgc28gd2UgbmVlZCB0byBzcGVjaWFsLWNhc2UgaXQKICAgICAgLy8gaGVyZS4KICAgICAgaWYgKGNsYXNzTmFtZSA9PSAnW29iamVjdCBXaW5kb3ddJykgewogICAgICAgIHJldHVybiAnb2JqZWN0JzsKICAgICAgfQoKICAgICAgLy8gV2UgY2Fubm90IGFsd2F5cyB1c2UgY29uc3RydWN0b3IgPT0gQXJyYXkgb3IgaW5zdGFuY2VvZiBBcnJheSBiZWNhdXNlCiAgICAgIC8vIGRpZmZlcmVudCBmcmFtZXMgaGF2ZSBkaWZmZXJlbnQgQXJyYXkgb2JqZWN0cy4gSW4gSUU2LCBpZiB0aGUgaWZyYW1lCiAgICAgIC8vIHdoZXJlIHRoZSBhcnJheSB3YXMgY3JlYXRlZCBpcyBkZXN0cm95ZWQsIHRoZSBhcnJheSBsb3NlcyBpdHMKICAgICAgLy8gcHJvdG90eXBlLiBUaGVuIGRlcmVmZXJlbmNpbmcgdmFsLnNwbGljZSBoZXJlIHRocm93cyBhbiBleGNlcHRpb24sIHNvCiAgICAgIC8vIHdlIGNhbid0IHVzZSBnb29nLmlzRnVuY3Rpb24uIENhbGxpbmcgdHlwZW9mIGRpcmVjdGx5IHJldHVybnMgJ3Vua25vd24nCiAgICAgIC8vIHNvIHRoYXQgd2lsbCB3b3JrLiBJbiB0aGlzIGNhc2UsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UgYW5kCiAgICAgIC8vIG1vc3QgYXJyYXkgZnVuY3Rpb25zIHdpbGwgc3RpbGwgd29yayBiZWNhdXNlIHRoZSBhcnJheSBpcyBzdGlsbAogICAgICAvLyBhcnJheS1saWtlIChzdXBwb3J0cyBsZW5ndGggYW5kIFtdKSBldmVuIHRob3VnaCBpdCBoYXMgbG9zdCBpdHMKICAgICAgLy8gcHJvdG90eXBlLgogICAgICAvLyBNYXJrIE1pbGxlciBub3RpY2VkIHRoYXQgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZwogICAgICAvLyBhbGxvd3MgYWNjZXNzIHRvIHRoZSB1bmZvcmdlYWJsZSBbW0NsYXNzXV0gcHJvcGVydHkuCiAgICAgIC8vICAxNS4yLjQuMiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nICggKQogICAgICAvLyAgV2hlbiB0aGUgdG9TdHJpbmcgbWV0aG9kIGlzIGNhbGxlZCwgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgdGFrZW46CiAgICAgIC8vICAgICAgMS4gR2V0IHRoZSBbW0NsYXNzXV0gcHJvcGVydHkgb2YgdGhpcyBvYmplY3QuCiAgICAgIC8vICAgICAgMi4gQ29tcHV0ZSBhIHN0cmluZyB2YWx1ZSBieSBjb25jYXRlbmF0aW5nIHRoZSB0aHJlZSBzdHJpbmdzCiAgICAgIC8vICAgICAgICAgIltvYmplY3QgIiwgUmVzdWx0KDEpLCBhbmQgIl0iLgogICAgICAvLyAgICAgIDMuIFJldHVybiBSZXN1bHQoMikuCiAgICAgIC8vIGFuZCB0aGlzIGJlaGF2aW9yIHN1cnZpdmVzIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgZXhlY3V0aW9uIGNvbnRleHQuCiAgICAgIGlmICgoY2xhc3NOYW1lID09ICdbb2JqZWN0IEFycmF5XScgfHwKICAgICAgICAgICAvLyBJbiBJRSBhbGwgbm9uIHZhbHVlIHR5cGVzIGFyZSB3cmFwcGVkIGFzIG9iamVjdHMgYWNyb3NzIHdpbmRvdwogICAgICAgICAgIC8vIGJvdW5kYXJpZXMgKG5vdCBpZnJhbWUgdGhvdWdoKSBzbyB3ZSBoYXZlIHRvIGRvIG9iamVjdCBkZXRlY3Rpb24KICAgICAgICAgICAvLyBmb3IgdGhpcyBlZGdlIGNhc2UuCiAgICAgICAgICAgdHlwZW9mIHZhbHVlLmxlbmd0aCA9PSAnbnVtYmVyJyAmJgogICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUuc3BsaWNlICE9ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZS5wcm9wZXJ0eUlzRW51bWVyYWJsZSAhPSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICAhdmFsdWUucHJvcGVydHlJc0VudW1lcmFibGUoJ3NwbGljZScpCgogICAgICAgICAgICAgICApKSB7CiAgICAgICAgcmV0dXJuICdhcnJheSc7CiAgICAgIH0KICAgICAgLy8gSEFDSzogVGhlcmUgaXMgc3RpbGwgYW4gYXJyYXkgY2FzZSB0aGF0IGZhaWxzLgogICAgICAvLyAgICAgZnVuY3Rpb24gQXJyYXlJbXBvc3RvcigpIHt9CiAgICAgIC8vICAgICBBcnJheUltcG9zdG9yLnByb3RvdHlwZSA9IFtdOwogICAgICAvLyAgICAgdmFyIGltcG9zdG9yID0gbmV3IEFycmF5SW1wb3N0b3I7CiAgICAgIC8vIHRoaXMgY2FuIGJlIGZpeGVkIGJ5IGdldHRpbmcgcmlkIG9mIHRoZSBmYXN0IHBhdGgKICAgICAgLy8gKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIGFuZCBzb2xlbHkgcmVseWluZyBvbgogICAgICAvLyAodmFsdWUgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy52YWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgQXJyYXldJykKICAgICAgLy8gYnV0IHRoYXQgd291bGQgcmVxdWlyZSBtYW55IG1vcmUgZnVuY3Rpb24gY2FsbHMgYW5kIGlzIG5vdCB3YXJyYW50ZWQKICAgICAgLy8gdW5sZXNzIGNsb3N1cmUgY29kZSBpcyByZWNlaXZpbmcgb2JqZWN0cyBmcm9tIHVudHJ1c3RlZCBzb3VyY2VzLgoKICAgICAgLy8gSUUgaW4gY3Jvc3Mtd2luZG93IGNhbGxzIGRvZXMgbm90IGNvcnJlY3RseSBtYXJzaGFsIHRoZSBmdW5jdGlvbiB0eXBlCiAgICAgIC8vIChpdCBhcHBlYXJzIGp1c3QgYXMgYW4gb2JqZWN0KSBzbyB3ZSBjYW5ub3QgdXNlIGp1c3QgdHlwZW9mIHZhbCA9PQogICAgICAvLyAnZnVuY3Rpb24nLiBIb3dldmVyLCBpZiB0aGUgb2JqZWN0IGhhcyBhIGNhbGwgcHJvcGVydHksIGl0IGlzIGEKICAgICAgLy8gZnVuY3Rpb24uCiAgICAgIGlmICgoY2xhc3NOYW1lID09ICdbb2JqZWN0IEZ1bmN0aW9uXScgfHwKICAgICAgICAgICB0eXBlb2YgdmFsdWUuY2FsbCAhPSAndW5kZWZpbmVkJyAmJgogICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUucHJvcGVydHlJc0VudW1lcmFibGUgIT0gJ3VuZGVmaW5lZCcgJiYKICAgICAgICAgICAgICAgIXZhbHVlLnByb3BlcnR5SXNFbnVtZXJhYmxlKCdjYWxsJykpKSB7CiAgICAgICAgcmV0dXJuICdmdW5jdGlvbic7CiAgICAgIH0KCiAgICB9IGVsc2UgewogICAgICByZXR1cm4gJ251bGwnOwogICAgfQoKICB9IGVsc2UgaWYgKHMgPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUuY2FsbCA9PSAndW5kZWZpbmVkJykgewogICAgLy8gSW4gU2FmYXJpIHR5cGVvZiBub2RlTGlzdCByZXR1cm5zICdmdW5jdGlvbicsIGFuZCBvbiBGaXJlZm94IHR5cGVvZgogICAgLy8gYmVoYXZlcyBzaW1pbGFybHkgZm9yIEhUTUx7QXBwbGV0LEVtYmVkLE9iamVjdH0sIEVsZW1lbnRzIGFuZCBSZWdFeHBzLiBXZQogICAgLy8gd291bGQgbGlrZSB0byByZXR1cm4gb2JqZWN0IGZvciB0aG9zZSBhbmQgd2UgY2FuIGRldGVjdCBhbiBpbnZhbGlkCiAgICAvLyBmdW5jdGlvbiBieSBtYWtpbmcgc3VyZSB0aGF0IHRoZSBmdW5jdGlvbiBvYmplY3QgaGFzIGEgY2FsbCBtZXRob2QuCiAgICByZXR1cm4gJ29iamVjdCc7CiAgfQogIHJldHVybiBzOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBudWxsLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIG51bGwuCiAqIEBkZXByZWNhdGVkIFVzZSBgdmFsID09PSBudWxsYCBpbnN0ZWFkLgogKi8KZ29vZy5pc051bGwgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gdmFsID09PSBudWxsOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBkZWZpbmVkIGFuZCBub3QgbnVsbC4KICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBkZWZpbmVkIGFuZCBub3QgbnVsbC4KICogQGRlcHJlY2F0ZWQgVXNlIGB2YWwgIT0gbnVsbGAgaW5zdGVhZC4KICovCmdvb2cuaXNEZWZBbmROb3ROdWxsID0gZnVuY3Rpb24odmFsKSB7CiAgLy8gTm90ZSB0aGF0IHVuZGVmaW5lZCA9PSBudWxsLgogIHJldHVybiB2YWwgIT0gbnVsbDsKfTsKCgovKioKICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYW4gYXJyYXkuCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYW4gYXJyYXkuCiAqLwpnb29nLmlzQXJyYXkgPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gZ29vZy50eXBlT2YodmFsKSA9PSAnYXJyYXknOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBsb29rcyBsaWtlIGFuIGFycmF5LiBUbyBxdWFsaWZ5IGFzIGFycmF5IGxpa2UKICogdGhlIHZhbHVlIG5lZWRzIHRvIGJlIGVpdGhlciBhIE5vZGVMaXN0IG9yIGFuIG9iamVjdCB3aXRoIGEgTnVtYmVyIGxlbmd0aAogKiBwcm9wZXJ0eS4gTm90ZSB0aGF0IGZvciB0aGlzIGZ1bmN0aW9uIG5laXRoZXIgc3RyaW5ncyBub3IgZnVuY3Rpb25zIGFyZQogKiBjb25zaWRlcmVkICJhcnJheS1saWtlIi4KICoKICogQHBhcmFtIHs/fSB2YWwgVmFyaWFibGUgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBhbiBhcnJheS4KICovCmdvb2cuaXNBcnJheUxpa2UgPSBmdW5jdGlvbih2YWwpIHsKICB2YXIgdHlwZSA9IGdvb2cudHlwZU9mKHZhbCk7CiAgLy8gV2UgZG8gbm90IHVzZSBnb29nLmlzT2JqZWN0IGhlcmUgaW4gb3JkZXIgdG8gZXhjbHVkZSBmdW5jdGlvbiB2YWx1ZXMuCiAgcmV0dXJuIHR5cGUgPT0gJ2FycmF5JyB8fCB0eXBlID09ICdvYmplY3QnICYmIHR5cGVvZiB2YWwubGVuZ3RoID09ICdudW1iZXInOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBsb29rcyBsaWtlIGEgRGF0ZS4gVG8gcXVhbGlmeSBhcyBEYXRlLWxpa2UgdGhlCiAqIHZhbHVlIG5lZWRzIHRvIGJlIGFuIG9iamVjdCBhbmQgaGF2ZSBhIGdldEZ1bGxZZWFyKCkgZnVuY3Rpb24uCiAqIEBwYXJhbSB7P30gdmFsIFZhcmlhYmxlIHRvIHRlc3QuCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdmFyaWFibGUgaXMgYSBsaWtlIGEgRGF0ZS4KICovCmdvb2cuaXNEYXRlTGlrZSA9IGZ1bmN0aW9uKHZhbCkgewogIHJldHVybiBnb29nLmlzT2JqZWN0KHZhbCkgJiYgdHlwZW9mIHZhbC5nZXRGdWxsWWVhciA9PSAnZnVuY3Rpb24nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIGZ1bmN0aW9uLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIGEgZnVuY3Rpb24uCiAqLwpnb29nLmlzRnVuY3Rpb24gPSBmdW5jdGlvbih2YWwpIHsKICByZXR1cm4gZ29vZy50eXBlT2YodmFsKSA9PSAnZnVuY3Rpb24nOwp9OwoKCi8qKgogKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhbiBvYmplY3QuICBUaGlzIGluY2x1ZGVzIGFycmF5cyBhbmQKICogZnVuY3Rpb25zLgogKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHZhcmlhYmxlIGlzIGFuIG9iamVjdC4KICovCmdvb2cuaXNPYmplY3QgPSBmdW5jdGlvbih2YWwpIHsKICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7CiAgcmV0dXJuIHR5cGUgPT0gJ29iamVjdCcgJiYgdmFsICE9IG51bGwgfHwgdHlwZSA9PSAnZnVuY3Rpb24nOwogIC8vIHJldHVybiBPYmplY3QodmFsKSA9PT0gdmFsIGFsc28gd29ya3MsIGJ1dCBpcyBzbG93ZXIsIGVzcGVjaWFsbHkgaWYgdmFsIGlzCiAgLy8gbm90IGFuIG9iamVjdC4KfTsKCgovKioKICogR2V0cyBhIHVuaXF1ZSBJRCBmb3IgYW4gb2JqZWN0LiBUaGlzIG11dGF0ZXMgdGhlIG9iamVjdCBzbyB0aGF0IGZ1cnRoZXIgY2FsbHMKICogd2l0aCB0aGUgc2FtZSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZS4gVGhlIHVuaXF1ZSBJRCBpcwogKiBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZSBhY3Jvc3MgdGhlIGN1cnJlbnQgc2Vzc2lvbiBhbW9uZ3N0IG9iamVjdHMgdGhhdCBhcmUKICogcGFzc2VkIGludG8gYGdldFVpZGAuIFRoZXJlIGlzIG5vIGd1YXJhbnRlZSB0aGF0IHRoZSBJRCBpcyB1bmlxdWUgb3IKICogY29uc2lzdGVudCBhY3Jvc3Mgc2Vzc2lvbnMuIEl0IGlzIHVuc2FmZSB0byBnZW5lcmF0ZSB1bmlxdWUgSUQgZm9yIGZ1bmN0aW9uCiAqIHByb3RvdHlwZXMuCiAqCiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBnZXQgdGhlIHVuaXF1ZSBJRCBmb3IuCiAqIEByZXR1cm4ge251bWJlcn0gVGhlIHVuaXF1ZSBJRCBmb3IgdGhlIG9iamVjdC4KICovCmdvb2cuZ2V0VWlkID0gZnVuY3Rpb24ob2JqKSB7CiAgLy8gVE9ETyhhcnYpOiBNYWtlIHRoZSB0eXBlIHN0cmljdGVyLCBkbyBub3QgYWNjZXB0IG51bGwuCgogIC8vIEluIE9wZXJhIHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSBleGlzdHMgYnV0IGFsd2F5cyByZXR1cm5zIGZhbHNlIHNvIHdlIGF2b2lkCiAgLy8gdXNpbmcgaXQuIEFzIGEgY29uc2VxdWVuY2UgdGhlIHVuaXF1ZSBJRCBnZW5lcmF0ZWQgZm9yIEJhc2VDbGFzcy5wcm90b3R5cGUKICAvLyBhbmQgU3ViQ2xhc3MucHJvdG90eXBlIHdpbGwgYmUgdGhlIHNhbWUuCiAgLy8gVE9ETyhiLzE0MTUxMjMyMyk6IFVVSURzIGFyZSBicm9rZW4gZm9yIGN0b3JzIHdpdGggY2xhc3Mtc2lkZSBpbmhlcml0YW5jZS4KICByZXR1cm4gb2JqW2dvb2cuVUlEX1BST1BFUlRZX10gfHwKICAgICAgKG9ialtnb29nLlVJRF9QUk9QRVJUWV9dID0gKytnb29nLnVpZENvdW50ZXJfKTsKfTsKCgovKioKICogV2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGFscmVhZHkgYXNzaWduZWQgYSB1bmlxdWUgSUQuCiAqCiAqIFRoaXMgZG9lcyBub3QgbW9kaWZ5IHRoZSBvYmplY3QuCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gY2hlY2suCiAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlcmUgaXMgYW4gYXNzaWduZWQgdW5pcXVlIGlkIGZvciB0aGUgb2JqZWN0LgogKi8KZ29vZy5oYXNVaWQgPSBmdW5jdGlvbihvYmopIHsKICByZXR1cm4gISFvYmpbZ29vZy5VSURfUFJPUEVSVFlfXTsKfTsKCgovKioKICogUmVtb3ZlcyB0aGUgdW5pcXVlIElEIGZyb20gYW4gb2JqZWN0LiBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgb2JqZWN0IHdhcwogKiBwcmV2aW91c2x5IG11dGF0ZWQgdXNpbmcgYGdvb2cuZ2V0VWlkYCBpbiB3aGljaCBjYXNlIHRoZSBtdXRhdGlvbiBpcwogKiB1bmRvbmUuCiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byByZW1vdmUgdGhlIHVuaXF1ZSBJRCBmaWVsZCBmcm9tLgogKi8KZ29vZy5yZW1vdmVVaWQgPSBmdW5jdGlvbihvYmopIHsKICAvLyBUT0RPKGFydik6IE1ha2UgdGhlIHR5cGUgc3RyaWN0ZXIsIGRvIG5vdCBhY2NlcHQgbnVsbC4KCiAgLy8gSW4gSUUsIERPTSBub2RlcyBhcmUgbm90IGluc3RhbmNlcyBvZiBPYmplY3QgYW5kIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB3ZQogIC8vIHRyeSB0byBkZWxldGUuICBJbnN0ZWFkIHdlIHRyeSB0byB1c2UgcmVtb3ZlQXR0cmlidXRlLgogIGlmIChvYmogIT09IG51bGwgJiYgJ3JlbW92ZUF0dHJpYnV0ZScgaW4gb2JqKSB7CiAgICBvYmoucmVtb3ZlQXR0cmlidXRlKGdvb2cuVUlEX1BST1BFUlRZXyk7CiAgfQoKICB0cnkgewogICAgZGVsZXRlIG9ialtnb29nLlVJRF9QUk9QRVJUWV9dOwogIH0gY2F0Y2ggKGV4KSB7CiAgfQp9OwoKCi8qKgogKiBOYW1lIGZvciB1bmlxdWUgSUQgcHJvcGVydHkuIEluaXRpYWxpemVkIGluIGEgd2F5IHRvIGhlbHAgYXZvaWQgY29sbGlzaW9ucwogKiB3aXRoIG90aGVyIGNsb3N1cmUgSmF2YVNjcmlwdCBvbiB0aGUgc2FtZSBwYWdlLgogKiBAdHlwZSB7c3RyaW5nfQogKiBAcHJpdmF0ZQogKi8KZ29vZy5VSURfUFJPUEVSVFlfID0gJ2Nsb3N1cmVfdWlkXycgKyAoKE1hdGgucmFuZG9tKCkgKiAxZTkpID4+PiAwKTsKCgovKioKICogQ291bnRlciBmb3IgVUlELgogKiBAdHlwZSB7bnVtYmVyfQogKiBAcHJpdmF0ZQogKi8KZ29vZy51aWRDb3VudGVyXyA9IDA7CgoKLyoqCiAqIEFkZHMgYSBoYXNoIGNvZGUgZmllbGQgdG8gYW4gb2JqZWN0LiBUaGUgaGFzaCBjb2RlIGlzIHVuaXF1ZSBmb3IgdGhlCiAqIGdpdmVuIG9iamVjdC4KICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIGdldCB0aGUgaGFzaCBjb2RlIGZvci4KICogQHJldHVybiB7bnVtYmVyfSBUaGUgaGFzaCBjb2RlIGZvciB0aGUgb2JqZWN0LgogKiBAZGVwcmVjYXRlZCBVc2UgZ29vZy5nZXRVaWQgaW5zdGVhZC4KICovCmdvb2cuZ2V0SGFzaENvZGUgPSBnb29nLmdldFVpZDsKCgovKioKICogUmVtb3ZlcyB0aGUgaGFzaCBjb2RlIGZpZWxkIGZyb20gYW4gb2JqZWN0LgogKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcmVtb3ZlIHRoZSBmaWVsZCBmcm9tLgogKiBAZGVwcmVjYXRlZCBVc2UgZ29vZy5yZW1vdmVVaWQgaW5zdGVhZC4KICovCmdvb2cucmVtb3ZlSGFzaENvZGUgPSBnb29nLnJlbW92ZVVpZDsKCgovKioKICogQ2xvbmVzIGEgdmFsdWUuIFRoZSBpbnB1dCBtYXkgYmUgYW4gT2JqZWN0LCBBcnJheSwgb3IgYmFzaWMgdHlwZS4gT2JqZWN0cyBhbmQKICogYXJyYXlzIHdpbGwgYmUgY2xvbmVkIHJlY3Vyc2l2ZWx5LgogKgogKiBXQVJOSU5HUzoKICogPGNvZGU+Z29vZy5jbG9uZU9iamVjdDwvY29kZT4gZG9lcyBub3QgZGV0ZWN0IHJlZmVyZW5jZSBsb29wcy4gT2JqZWN0cyB0aGF0CiAqIHJlZmVyIHRvIHRoZW1zZWx2ZXMgd2lsbCBjYXVzZSBpbmZpbml0ZSByZWN1cnNpb24uCiAqCiAqIDxjb2RlPmdvb2cuY2xvbmVPYmplY3Q8L2NvZGU+IGlzIHVuYXdhcmUgb2YgdW5pcXVlIGlkZW50aWZpZXJzLCBhbmQgY29waWVzCiAqIFVJRHMgY3JlYXRlZCBieSA8Y29kZT5nZXRVaWQ8L2NvZGU+IGludG8gY2xvbmVkIHJlc3VsdHMuCiAqCiAqIEBwYXJhbSB7Kn0gb2JqIFRoZSB2YWx1ZSB0byBjbG9uZS4KICogQHJldHVybiB7Kn0gQSBjbG9uZSBvZiB0aGUgaW5wdXQgdmFsdWUuCiAqIEBkZXByZWNhdGVkIGdvb2cuY2xvbmVPYmplY3QgaXMgdW5zYWZlLiBQcmVmZXIgdGhlIGdvb2cub2JqZWN0IG1ldGhvZHMuCiAqLwpnb29nLmNsb25lT2JqZWN0ID0gZnVuY3Rpb24ob2JqKSB7CiAgdmFyIHR5cGUgPSBnb29nLnR5cGVPZihvYmopOwogIGlmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2FycmF5JykgewogICAgaWYgKHR5cGVvZiBvYmouY2xvbmUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgcmV0dXJuIG9iai5jbG9uZSgpOwogICAgfQogICAgdmFyIGNsb25lID0gdHlwZSA9PSAnYXJyYXknID8gW10gOiB7fTsKICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgY2xvbmVba2V5XSA9IGdvb2cuY2xvbmVPYmplY3Qob2JqW2tleV0pOwogICAgfQogICAgcmV0dXJuIGNsb25lOwogIH0KCiAgcmV0dXJuIG9iajsKfTsKCgovKioKICogQSBuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgZ29vZy5iaW5kLgogKiBAcGFyYW0gez9mdW5jdGlvbih0aGlzOlQsIC4uLil9IGZuIEEgZnVuY3Rpb24gdG8gcGFydGlhbGx5IGFwcGx5LgogKiBAcGFyYW0ge1R9IHNlbGZPYmogU3BlY2lmaWVzIHRoZSBvYmplY3Qgd2hpY2ggdGhpcyBzaG91bGQgcG9pbnQgdG8gd2hlbiB0aGUKICogICAgIGZ1bmN0aW9uIGlzIHJ1bi4KICogQHBhcmFtIHsuLi4qfSB2YXJfYXJncyBBZGRpdGlvbmFsIGFyZ3VtZW50cyB0aGF0IGFyZSBwYXJ0aWFsbHkgYXBwbGllZCB0byB0aGUKICogICAgIGZ1bmN0aW9uLgogKiBAcmV0dXJuIHshRnVuY3Rpb259IEEgcGFydGlhbGx5LWFwcGxpZWQgZm9ybSBvZiB0aGUgZnVuY3Rpb24gZ29vZy5iaW5kKCkgd2FzCiAqICAgICBpbnZva2VkIGFzIGEgbWV0aG9kIG9mLgogKiBAdGVtcGxhdGUgVAogKiBAcHJpdmF0ZQogKi8KZ29vZy5iaW5kTmF0aXZlXyA9IGZ1bmN0aW9uKGZuLCBzZWxmT2JqLCB2YXJfYXJncykgewogIHJldHVybiAvKiogQHR5cGUgeyFGdW5jdGlvbn0gKi8gKGZuLmNhbGwuYXBwbHkoZm4uYmluZCwgYXJndW1lbnRzKSk7Cn07CgoKLyoqCiAqIEEgcHVyZS1KUyBpbXBsZW1lbnRhdGlvbiBvZiBnb29nLmJpbmQuCiAqIEBwYXJhbSB7P2Z1bmN0aW9uKHRoaXM6VCwgLi4uKX0gZm4gQSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkuCiAqIEBwYXJhbSB7VH0gc2VsZk9iaiBTcGVjaWZpZXMgdGhlIG9iamVjdCB3aGljaCB0aGlzIHNob3VsZCBwb2ludCB0byB3aGVuIHRoZQogKiAgICAgZnVuY3Rpb24gaXMgcnVuLgogKiBAcGFyYW0gey4uLip9IHZhcl9hcmdzIEFkZGl0aW9uYWwgYXJndW1lbnRzIHRoYXQgYXJlIHBhcnRpYWxseSBhcHBsaWVkIHRvIHRoZQogKiAgICAgZnVuY3Rpb24uCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gQSBwYXJ0aWFsbHktYXBwbGllZCBmb3JtIG9mIHRoZSBmdW5jdGlvbiBnb29nLmJpbmQoKSB3YXMKICogICAgIGludm9rZWQgYXMgYSBtZXRob2Qgb2YuCiAqIEB0ZW1wbGF0ZSBUCiAqIEBwcml2YXRlCiAqLwpnb29nLmJpbmRKc18gPSBmdW5jdGlvbihmbiwgc2VsZk9iaiwgdmFyX2FyZ3MpIHsKICBpZiAoIWZuKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoKTsKICB9CgogIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikgewogICAgdmFyIGJvdW5kQXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMik7CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgIC8vIFByZXBlbmQgdGhlIGJvdW5kIGFyZ3VtZW50cyB0byB0aGUgY3VycmVudCBhcmd1bWVudHMuCiAgICAgIHZhciBuZXdBcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgQXJyYXkucHJvdG90eXBlLnVuc2hpZnQuYXBwbHkobmV3QXJncywgYm91bmRBcmdzKTsKICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGZPYmosIG5ld0FyZ3MpOwogICAgfTsKCiAgfSBlbHNlIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGZuLmFwcGx5KHNlbGZPYmosIGFyZ3VtZW50cyk7CiAgICB9OwogIH0KfTsKCgovKioKICogUGFydGlhbGx5IGFwcGxpZXMgdGhpcyBmdW5jdGlvbiB0byBhIHBhcnRpY3VsYXIgJ3RoaXMgb2JqZWN0JyBhbmQgemVybyBvcgogKiBtb3JlIGFyZ3VtZW50cy4gVGhlIHJlc3VsdCBpcyBhIG5ldyBmdW5jdGlvbiB3aXRoIHNvbWUgYXJndW1lbnRzIG9mIHRoZSBmaXJzdAogKiBmdW5jdGlvbiBwcmUtZmlsbGVkIGFuZCB0aGUgdmFsdWUgb2YgdGhpcyAncHJlLXNwZWNpZmllZCcuCiAqCiAqIFJlbWFpbmluZyBhcmd1bWVudHMgc3BlY2lmaWVkIGF0IGNhbGwtdGltZSBhcmUgYXBwZW5kZWQgdG8gdGhlIHByZS1zcGVjaWZpZWQKICogb25lcy4KICoKICogQWxzbyBzZWU6IHtAbGluayAjcGFydGlhbH0uCiAqCiAqIFVzYWdlOgogKiA8cHJlPnZhciBiYXJNZXRoQm91bmQgPSBnb29nLmJpbmQobXlGdW5jdGlvbiwgbXlPYmosICdhcmcxJywgJ2FyZzInKTsKICogYmFyTWV0aEJvdW5kKCdhcmczJywgJ2FyZzQnKTs8L3ByZT4KICoKICogQHBhcmFtIHs/ZnVuY3Rpb24odGhpczpULCAuLi4pfSBmbiBBIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseS4KICogQHBhcmFtIHtUfSBzZWxmT2JqIFNwZWNpZmllcyB0aGUgb2JqZWN0IHdoaWNoIHRoaXMgc2hvdWxkIHBvaW50IHRvIHdoZW4gdGhlCiAqICAgICBmdW5jdGlvbiBpcyBydW4uCiAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBhcmUgcGFydGlhbGx5IGFwcGxpZWQgdG8gdGhlCiAqICAgICBmdW5jdGlvbi4KICogQHJldHVybiB7IUZ1bmN0aW9ufSBBIHBhcnRpYWxseS1hcHBsaWVkIGZvcm0gb2YgdGhlIGZ1bmN0aW9uIGdvb2cuYmluZCgpIHdhcwogKiAgICAgaW52b2tlZCBhcyBhIG1ldGhvZCBvZi4KICogQHRlbXBsYXRlIFQKICogQHN1cHByZXNzIHtkZXByZWNhdGVkfSBTZWUgYWJvdmUuCiAqLwpnb29nLmJpbmQgPSBmdW5jdGlvbihmbiwgc2VsZk9iaiwgdmFyX2FyZ3MpIHsKICAvLyBUT0RPKG5pY2tzYW50b3MpOiBuYXJyb3cgdGhlIHR5cGUgc2lnbmF0dXJlLgogIGlmIChGdW5jdGlvbi5wcm90b3R5cGUuYmluZCAmJgogICAgICAvLyBOT1RFKG5pY2tzYW50b3MpOiBTb21lYm9keSBwdWxsZWQgYmFzZS5qcyBpbnRvIHRoZSBkZWZhdWx0IENocm9tZQogICAgICAvLyBleHRlbnNpb24gZW52aXJvbm1lbnQuIFRoaXMgbWVhbnMgdGhhdCBmb3IgQ2hyb21lIGV4dGVuc2lvbnMsIHRoZXkgZ2V0CiAgICAgIC8vIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCB0aGF0IGNhbGxzIGdvb2cuYmluZAogICAgICAvLyBpbnN0ZWFkIG9mIHRoZSBuYXRpdmUgb25lLiBFdmVuIHdvcnNlLCB3ZSBkb24ndCB3YW50IHRvIGludHJvZHVjZSBhCiAgICAgIC8vIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBnb29nLmJpbmQgYW5kIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCBzbwogICAgICAvLyB3ZSBoYXZlIHRvIGhhY2sgdGhpcyB0byBtYWtlIHN1cmUgaXQgd29ya3MgY29ycmVjdGx5LgogICAgICBGdW5jdGlvbi5wcm90b3R5cGUuYmluZC50b1N0cmluZygpLmluZGV4T2YoJ25hdGl2ZSBjb2RlJykgIT0gLTEpIHsKICAgIGdvb2cuYmluZCA9IGdvb2cuYmluZE5hdGl2ZV87CiAgfSBlbHNlIHsKICAgIGdvb2cuYmluZCA9IGdvb2cuYmluZEpzXzsKICB9CiAgcmV0dXJuIGdvb2cuYmluZC5hcHBseShudWxsLCBhcmd1bWVudHMpOwp9OwoKCi8qKgogKiBMaWtlIGdvb2cuYmluZCgpLCBleGNlcHQgdGhhdCBhICd0aGlzIG9iamVjdCcgaXMgbm90IHJlcXVpcmVkLiBVc2VmdWwgd2hlbgogKiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGlzIGFscmVhZHkgYm91bmQuCiAqCiAqIFVzYWdlOgogKiB2YXIgZyA9IGdvb2cucGFydGlhbChmLCBhcmcxLCBhcmcyKTsKICogZyhhcmczLCBhcmc0KTsKICoKICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gQSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkuCiAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgQWRkaXRpb25hbCBhcmd1bWVudHMgdGhhdCBhcmUgcGFydGlhbGx5IGFwcGxpZWQgdG8gZm4uCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gQSBwYXJ0aWFsbHktYXBwbGllZCBmb3JtIG9mIHRoZSBmdW5jdGlvbiBnb29nLnBhcnRpYWwoKQogKiAgICAgd2FzIGludm9rZWQgYXMgYSBtZXRob2Qgb2YuCiAqLwpnb29nLnBhcnRpYWwgPSBmdW5jdGlvbihmbiwgdmFyX2FyZ3MpIHsKICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgLy8gQ2xvbmUgdGhlIGFycmF5ICh3aXRoIHNsaWNlKCkpIGFuZCBhcHBlbmQgYWRkaXRpb25hbCBhcmd1bWVudHMKICAgIC8vIHRvIHRoZSBleGlzdGluZyBhcmd1bWVudHMuCiAgICB2YXIgbmV3QXJncyA9IGFyZ3Muc2xpY2UoKTsKICAgIG5ld0FyZ3MucHVzaC5hcHBseShuZXdBcmdzLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIGZuLmFwcGx5KC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpLCBuZXdBcmdzKTsKICB9Owp9OwoKCi8qKgogKiBDb3BpZXMgYWxsIHRoZSBtZW1iZXJzIG9mIGEgc291cmNlIG9iamVjdCB0byBhIHRhcmdldCBvYmplY3QuIFRoaXMgbWV0aG9kCiAqIGRvZXMgbm90IHdvcmsgb24gYWxsIGJyb3dzZXJzIGZvciBhbGwgb2JqZWN0cyB0aGF0IGNvbnRhaW4ga2V5cyBzdWNoIGFzCiAqIHRvU3RyaW5nIG9yIGhhc093blByb3BlcnR5LiBVc2UgZ29vZy5vYmplY3QuZXh0ZW5kIGZvciB0aGlzIHB1cnBvc2UuCiAqCiAqIE5PVEU6IFNvbWUgaGF2ZSBhZHZvY2F0ZWQgZm9yIHRoZSB1c2Ugb2YgZ29vZy5taXhpbiB0byBzZXR1cCBjbGFzc2VzCiAqIHdpdGggbXVsdGlwbGUgaW5oZXJpdGVuY2UgKHRyYWl0cywgbWl4aW5zLCBldGMpLiAgSG93ZXZlciwgYXMgaXQgc2ltcGx5CiAqIHVzZXMgImZvciBpbiIsIHRoaXMgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBFUzYgY2xhc3NlcyB3aG9zZSBtZXRob2RzIGFyZQogKiBub24tZW51bWVyYWJsZS4gIENoYW5naW5nIHRoaXMsIHdvdWxkIGJyZWFrIGNhc2VzIHdoZXJlIG5vbi1lbnVtZXJhYmxlCiAqIHByb3BlcnRpZXMgYXJlIG5vdCBleHBlY3RlZC4KICoKICogQHBhcmFtIHtPYmplY3R9IHRhcmdldCBUYXJnZXQuCiAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgU291cmNlLgogKiBAZGVwcmVjYXRlZCBQcmVmZXIgT2JqZWN0LmFzc2lnbgogKi8KZ29vZy5taXhpbiA9IGZ1bmN0aW9uKHRhcmdldCwgc291cmNlKSB7CiAgZm9yICh2YXIgeCBpbiBzb3VyY2UpIHsKICAgIHRhcmdldFt4XSA9IHNvdXJjZVt4XTsKICB9CgogIC8vIEZvciBJRTcgb3IgbG93ZXIsIHRoZSBmb3ItaW4tbG9vcCBkb2VzIG5vdCBjb250YWluIGFueSBwcm9wZXJ0aWVzIHRoYXQgYXJlCiAgLy8gbm90IGVudW1lcmFibGUgb24gdGhlIHByb3RvdHlwZSBvYmplY3QgKGZvciBleGFtcGxlLCBpc1Byb3RvdHlwZU9mIGZyb20KICAvLyBPYmplY3QucHJvdG90eXBlKSBidXQgYWxzbyBpdCB3aWxsIG5vdCBpbmNsdWRlICdyZXBsYWNlJyBvbiBvYmplY3RzIHRoYXQKICAvLyBleHRlbmQgU3RyaW5nIGFuZCBjaGFuZ2UgJ3JlcGxhY2UnIChub3QgdGhhdCBpdCBpcyBjb21tb24gZm9yIGFueW9uZSB0bwogIC8vIGV4dGVuZCBhbnl0aGluZyBleGNlcHQgT2JqZWN0KS4KfTsKCgovKioKICogQHJldHVybiB7bnVtYmVyfSBBbiBpbnRlZ2VyIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcwogKiAgICAgYmV0d2VlbiBtaWRuaWdodCwgSmFudWFyeSAxLCAxOTcwIGFuZCB0aGUgY3VycmVudCB0aW1lLgogKiBAZGVwcmVjYXRlZCBVc2UgRGF0ZS5ub3cKICovCmdvb2cubm93ID0gKGdvb2cuVFJVU1RFRF9TSVRFICYmIERhdGUubm93KSB8fCAoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAvLyBVbmFyeSBwbHVzIG9wZXJhdG9yIGNvbnZlcnRzIGl0cyBvcGVyYW5kIHRvIGEgbnVtYmVyIHdoaWNoIGluCiAgICAgICAgICAgICAvLyB0aGUgY2FzZSBvZgogICAgICAgICAgICAgLy8gYSBkYXRlIGlzIGRvbmUgYnkgY2FsbGluZyBnZXRUaW1lKCkuCiAgICAgICAgICAgICByZXR1cm4gK25ldyBEYXRlKCk7CiAgICAgICAgICAgfSk7CgoKLyoqCiAqIEV2YWxzIEphdmFTY3JpcHQgaW4gdGhlIGdsb2JhbCBzY29wZS4gIEluIElFIHRoaXMgdXNlcyBleGVjU2NyaXB0LCBvdGhlcgogKiBicm93c2VycyB1c2UgZ29vZy5nbG9iYWwuZXZhbC4gSWYgZ29vZy5nbG9iYWwuZXZhbCBkb2VzIG5vdCBldmFsdWF0ZSBpbiB0aGUKICogZ2xvYmFsIHNjb3BlIChmb3IgZXhhbXBsZSwgaW4gU2FmYXJpKSwgYXBwZW5kcyBhIHNjcmlwdCB0YWcgaW5zdGVhZC4KICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBuZWl0aGVyIGV4ZWNTY3JpcHQgb3IgZXZhbCBpcyBkZWZpbmVkLgogKiBAcGFyYW0ge3N0cmluZ30gc2NyaXB0IEphdmFTY3JpcHQgc3RyaW5nLgogKi8KZ29vZy5nbG9iYWxFdmFsID0gZnVuY3Rpb24oc2NyaXB0KSB7CiAgaWYgKGdvb2cuZ2xvYmFsLmV4ZWNTY3JpcHQpIHsKICAgIGdvb2cuZ2xvYmFsLmV4ZWNTY3JpcHQoc2NyaXB0LCAnSmF2YVNjcmlwdCcpOwogIH0gZWxzZSBpZiAoZ29vZy5nbG9iYWwuZXZhbCkgewogICAgLy8gVGVzdCB0byBzZWUgaWYgZXZhbCB3b3JrcwogICAgaWYgKGdvb2cuZXZhbFdvcmtzRm9yR2xvYmFsc18gPT0gbnVsbCkgewogICAgICB0cnkgewogICAgICAgIGdvb2cuZ2xvYmFsLmV2YWwoJ3ZhciBfZXZhbFRlc3RfID0gMTsnKTsKICAgICAgfSBjYXRjaCAoaWdub3JlKSB7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiBnb29nLmdsb2JhbFsnX2V2YWxUZXN0XyddICE9ICd1bmRlZmluZWQnKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGRlbGV0ZSBnb29nLmdsb2JhbFsnX2V2YWxUZXN0XyddOwogICAgICAgIH0gY2F0Y2ggKGlnbm9yZSkgewogICAgICAgICAgLy8gTWljcm9zb2Z0IGVkZ2UgZmFpbHMgdGhlIGRlbGV0aW9uIGFib3ZlIGluIHN0cmljdCBtb2RlLgogICAgICAgIH0KICAgICAgICBnb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBnb29nLmV2YWxXb3Jrc0Zvckdsb2JhbHNfID0gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZ29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXykgewogICAgICBnb29nLmdsb2JhbC5ldmFsKHNjcmlwdCk7CiAgICB9IGVsc2UgewogICAgICAvKiogQHR5cGUgeyFEb2N1bWVudH0gKi8KICAgICAgdmFyIGRvYyA9IGdvb2cuZ2xvYmFsLmRvY3VtZW50OwogICAgICB2YXIgc2NyaXB0RWx0ID0KICAgICAgICAgIC8qKiBAdHlwZSB7IUhUTUxTY3JpcHRFbGVtZW50fSAqLyAoZG9jLmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKTsKICAgICAgc2NyaXB0RWx0LnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgc2NyaXB0RWx0LmRlZmVyID0gZmFsc2U7CiAgICAgIC8vIE5vdGUodXNlcik6IGNhbid0IHVzZSAuaW5uZXJIVE1MIHNpbmNlICJ0KCc8dGVzdD4nKSIgd2lsbCBmYWlsIGFuZAogICAgICAvLyAudGV4dCBkb2Vzbid0IHdvcmsgaW4gU2FmYXJpIDIuICBUaGVyZWZvcmUgd2UgYXBwZW5kIGEgdGV4dCBub2RlLgogICAgICBzY3JpcHRFbHQuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKHNjcmlwdCkpOwogICAgICBkb2MuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHRFbHQpOwogICAgICBkb2MuaGVhZC5yZW1vdmVDaGlsZChzY3JpcHRFbHQpOwogICAgfQogIH0gZWxzZSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dvb2cuZ2xvYmFsRXZhbCBub3QgYXZhaWxhYmxlJyk7CiAgfQp9OwoKCi8qKgogKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3Qgd2UgY2FuIGNhbGwgJ2V2YWwnIGRpcmVjdGx5IHRvIGV2YWwgY29kZSBpbiB0aGUKICogZ2xvYmFsIHNjb3BlLiBTZXQgdG8gYSBCb29sZWFuIGJ5IHRoZSBmaXJzdCBjYWxsIHRvIGdvb2cuZ2xvYmFsRXZhbCAod2hpY2gKICogZW1waXJpY2FsbHkgdGVzdHMgd2hldGhlciBldmFsIHdvcmtzIGZvciBnbG9iYWxzKS4gQHNlZSBnb29nLmdsb2JhbEV2YWwKICogQHR5cGUgez9ib29sZWFufQogKiBAcHJpdmF0ZQogKi8KZ29vZy5ldmFsV29ya3NGb3JHbG9iYWxzXyA9IG51bGw7CgoKLyoqCiAqIE9wdGlvbmFsIG1hcCBvZiBDU1MgY2xhc3MgbmFtZXMgdG8gb2JmdXNjYXRlZCBuYW1lcyB1c2VkIHdpdGgKICogZ29vZy5nZXRDc3NOYW1lKCkuCiAqIEBwcml2YXRlIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPnx1bmRlZmluZWR9CiAqIEBzZWUgZ29vZy5zZXRDc3NOYW1lTWFwcGluZwogKi8KZ29vZy5jc3NOYW1lTWFwcGluZ187CgoKLyoqCiAqIE9wdGlvbmFsIG9iZnVzY2F0aW9uIHN0eWxlIGZvciBDU1MgY2xhc3MgbmFtZXMuIFNob3VsZCBiZSBzZXQgdG8gZWl0aGVyCiAqICdCWV9XSE9MRScgb3IgJ0JZX1BBUlQnIGlmIGRlZmluZWQuCiAqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfQogKiBAcHJpdmF0ZQogKiBAc2VlIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcKICovCmdvb2cuY3NzTmFtZU1hcHBpbmdTdHlsZV87CgoKCi8qKgogKiBBIGhvb2sgZm9yIG1vZGlmeWluZyB0aGUgZGVmYXVsdCBiZWhhdmlvciBnb29nLmdldENzc05hbWUuIFRoZSBmdW5jdGlvbgogKiBpZiBwcmVzZW50LCB3aWxsIHJlY2VpdmUgdGhlIHN0YW5kYXJkIG91dHB1dCBvZiB0aGUgZ29vZy5nZXRDc3NOYW1lIGFzCiAqIGl0cyBpbnB1dC4KICoKICogQHR5cGUgeyhmdW5jdGlvbihzdHJpbmcpOnN0cmluZyl8dW5kZWZpbmVkfQogKi8KZ29vZy5nbG9iYWwuQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk47CgoKLyoqCiAqIEhhbmRsZXMgc3RyaW5ncyB0aGF0IGFyZSBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIENTUyBjbGFzcyBuYW1lcy4KICoKICogVGhpcyBmdW5jdGlvbiB3b3JrcyBpbiB0YW5kZW0gd2l0aCBAc2VlIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcuCiAqCiAqIFdpdGhvdXQgYW55IG1hcHBpbmcgc2V0LCB0aGUgYXJndW1lbnRzIGFyZSBzaW1wbGUgam9pbmVkIHdpdGggYSBoeXBoZW4gYW5kCiAqIHBhc3NlZCB0aHJvdWdoIHVuYWx0ZXJlZC4KICoKICogV2hlbiB0aGVyZSBpcyBhIG1hcHBpbmcsIHRoZXJlIGFyZSB0d28gcG9zc2libGUgc3R5bGVzIGluIHdoaWNoIHRoZXNlCiAqIG1hcHBpbmdzIGFyZSB1c2VkLiBJbiB0aGUgQllfUEFSVCBzdHlsZSwgZWFjaCBwYXJ0IChpLmUuIGluIGJldHdlZW4gaHlwaGVucykKICogb2YgdGhlIHBhc3NlZCBpbiBjc3MgbmFtZSBpcyByZXdyaXR0ZW4gYWNjb3JkaW5nIHRvIHRoZSBtYXAuIEluIHRoZSBCWV9XSE9MRQogKiBzdHlsZSwgdGhlIGZ1bGwgY3NzIG5hbWUgaXMgbG9va2VkIHVwIGluIHRoZSBtYXAgZGlyZWN0bHkuIElmIGEgcmV3cml0ZSBpcwogKiBub3Qgc3BlY2lmaWVkIGJ5IHRoZSBtYXAsIHRoZSBjb21waWxlciB3aWxsIG91dHB1dCBhIHdhcm5pbmcuCiAqCiAqIFdoZW4gdGhlIG1hcHBpbmcgaXMgcGFzc2VkIHRvIHRoZSBjb21waWxlciwgaXQgd2lsbCByZXBsYWNlIGNhbGxzIHRvCiAqIGdvb2cuZ2V0Q3NzTmFtZSB3aXRoIHRoZSBzdHJpbmdzIGZyb20gdGhlIG1hcHBpbmcsIGUuZy4KICogICAgIHZhciB4ID0gZ29vZy5nZXRDc3NOYW1lKCdmb28nKTsKICogICAgIHZhciB5ID0gZ29vZy5nZXRDc3NOYW1lKHRoaXMuYmFzZUNsYXNzLCAnYWN0aXZlJyk7CiAqICBiZWNvbWVzOgogKiAgICAgdmFyIHggPSAnZm9vJzsKICogICAgIHZhciB5ID0gdGhpcy5iYXNlQ2xhc3MgKyAnLWFjdGl2ZSc7CiAqCiAqIElmIG9uZSBhcmd1bWVudCBpcyBwYXNzZWQgaXQgd2lsbCBiZSBwcm9jZXNzZWQsIGlmIHR3byBhcmUgcGFzc2VkIG9ubHkgdGhlCiAqIG1vZGlmaWVyIHdpbGwgYmUgcHJvY2Vzc2VkLCBhcyBpdCBpcyBhc3N1bWVkIHRoZSBmaXJzdCBhcmd1bWVudCB3YXMgZ2VuZXJhdGVkCiAqIGFzIGEgcmVzdWx0IG9mIGNhbGxpbmcgZ29vZy5nZXRDc3NOYW1lLgogKgogKiBAcGFyYW0ge3N0cmluZ30gY2xhc3NOYW1lIFRoZSBjbGFzcyBuYW1lLgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9tb2RpZmllciBBIG1vZGlmaWVyIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSBjbGFzcyBuYW1lLgogKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBjbGFzcyBuYW1lIG9yIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBjbGFzcyBuYW1lIGFuZAogKiAgICAgdGhlIG1vZGlmaWVyLgogKi8KZ29vZy5nZXRDc3NOYW1lID0gZnVuY3Rpb24oY2xhc3NOYW1lLCBvcHRfbW9kaWZpZXIpIHsKICAvLyBTdHJpbmcoKSBpcyB1c2VkIGZvciBjb21wYXRpYmlsaXR5IHdpdGggY29tcGlsZWQgc295IHdoZXJlIHRoZSBwYXNzZWQKICAvLyBjbGFzc05hbWUgY2FuIGJlIG5vbi1zdHJpbmcgb2JqZWN0cy4KICBpZiAoU3RyaW5nKGNsYXNzTmFtZSkuY2hhckF0KDApID09ICcuJykgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdjbGFzc05hbWUgcGFzc2VkIGluIGdvb2cuZ2V0Q3NzTmFtZSBtdXN0IG5vdCBzdGFydCB3aXRoICIuIi4nICsKICAgICAgICAnIFlvdSBwYXNzZWQ6ICcgKyBjbGFzc05hbWUpOwogIH0KCiAgdmFyIGdldE1hcHBpbmcgPSBmdW5jdGlvbihjc3NOYW1lKSB7CiAgICByZXR1cm4gZ29vZy5jc3NOYW1lTWFwcGluZ19bY3NzTmFtZV0gfHwgY3NzTmFtZTsKICB9OwoKICB2YXIgcmVuYW1lQnlQYXJ0cyA9IGZ1bmN0aW9uKGNzc05hbWUpIHsKICAgIC8vIFJlbWFwIGFsbCB0aGUgcGFydHMgaW5kaXZpZHVhbGx5LgogICAgdmFyIHBhcnRzID0gY3NzTmFtZS5zcGxpdCgnLScpOwogICAgdmFyIG1hcHBlZCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICBtYXBwZWQucHVzaChnZXRNYXBwaW5nKHBhcnRzW2ldKSk7CiAgICB9CiAgICByZXR1cm4gbWFwcGVkLmpvaW4oJy0nKTsKICB9OwoKICB2YXIgcmVuYW1lOwogIGlmIChnb29nLmNzc05hbWVNYXBwaW5nXykgewogICAgcmVuYW1lID0KICAgICAgICBnb29nLmNzc05hbWVNYXBwaW5nU3R5bGVfID09ICdCWV9XSE9MRScgPyBnZXRNYXBwaW5nIDogcmVuYW1lQnlQYXJ0czsKICB9IGVsc2UgewogICAgcmVuYW1lID0gZnVuY3Rpb24oYSkgewogICAgICByZXR1cm4gYTsKICAgIH07CiAgfQoKICB2YXIgcmVzdWx0ID0KICAgICAgb3B0X21vZGlmaWVyID8gY2xhc3NOYW1lICsgJy0nICsgcmVuYW1lKG9wdF9tb2RpZmllcikgOiByZW5hbWUoY2xhc3NOYW1lKTsKCiAgLy8gVGhlIHNwZWNpYWwgQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk4gYWxsb3dzIHVzZXJzIHRvIHNwZWNpZnkgZnVydGhlcgogIC8vIHByb2Nlc3Npbmcgb2YgdGhlIGNsYXNzIG5hbWUuCiAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQX0ZOKSB7CiAgICByZXR1cm4gZ29vZy5nbG9iYWwuQ0xPU1VSRV9DU1NfTkFNRV9NQVBfRk4ocmVzdWx0KTsKICB9CgogIHJldHVybiByZXN1bHQ7Cn07CgoKLyoqCiAqIFNldHMgdGhlIG1hcCB0byBjaGVjayB3aGVuIHJldHVybmluZyBhIHZhbHVlIGZyb20gZ29vZy5nZXRDc3NOYW1lKCkuIEV4YW1wbGU6CiAqIDxwcmU+CiAqIGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcoewogKiAgICJnb29nIjogImEiLAogKiAgICJkaXNhYmxlZCI6ICJiIiwKICogfSk7CiAqCiAqIHZhciB4ID0gZ29vZy5nZXRDc3NOYW1lKCdnb29nJyk7CiAqIC8vIFRoZSBmb2xsb3dpbmcgZXZhbHVhdGVzIHRvOiAiYSBhLWIiLgogKiBnb29nLmdldENzc05hbWUoJ2dvb2cnKSArICcgJyArIGdvb2cuZ2V0Q3NzTmFtZSh4LCAnZGlzYWJsZWQnKQogKiA8L3ByZT4KICogV2hlbiBkZWNsYXJlZCBhcyBhIG1hcCBvZiBzdHJpbmcgbGl0ZXJhbHMgdG8gc3RyaW5nIGxpdGVyYWxzLCB0aGUgSlNDb21waWxlcgogKiB3aWxsIHJlcGxhY2UgYWxsIGNhbGxzIHRvIGdvb2cuZ2V0Q3NzTmFtZSgpIHVzaW5nIHRoZSBzdXBwbGllZCBtYXAgaWYgdGhlCiAqIC0tcHJvY2Vzc19jbG9zdXJlX3ByaW1pdGl2ZXMgZmxhZyBpcyBzZXQuCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gbWFwcGluZyBBIG1hcCBvZiBzdHJpbmdzIHRvIHN0cmluZ3Mgd2hlcmUga2V5cyBhcmUgcG9zc2libGUKICogICAgIGFyZ3VtZW50cyB0byBnb29nLmdldENzc05hbWUoKSBhbmQgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMKICogICAgIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkLgogKiBAcGFyYW0ge3N0cmluZz19IG9wdF9zdHlsZSBUaGUgc3R5bGUgb2YgY3NzIG5hbWUgbWFwcGluZy4gVGhlcmUgYXJlIHR3byB2YWxpZAogKiAgICAgb3B0aW9uczogJ0JZX1BBUlQnLCBhbmQgJ0JZX1dIT0xFJy4KICogQHNlZSBnb29nLmdldENzc05hbWUgZm9yIGEgZGVzY3JpcHRpb24uCiAqLwpnb29nLnNldENzc05hbWVNYXBwaW5nID0gZnVuY3Rpb24obWFwcGluZywgb3B0X3N0eWxlKSB7CiAgZ29vZy5jc3NOYW1lTWFwcGluZ18gPSBtYXBwaW5nOwogIGdvb2cuY3NzTmFtZU1hcHBpbmdTdHlsZV8gPSBvcHRfc3R5bGU7Cn07CgoKLyoqCiAqIFRvIHVzZSBDU1MgcmVuYW1pbmcgaW4gY29tcGlsZWQgbW9kZSwgb25lIG9mIHRoZSBpbnB1dCBmaWxlcyBzaG91bGQgaGF2ZSBhCiAqIGNhbGwgdG8gZ29vZy5zZXRDc3NOYW1lTWFwcGluZygpIHdpdGggYW4gb2JqZWN0IGxpdGVyYWwgdGhhdCB0aGUgSlNDb21waWxlcgogKiBjYW4gZXh0cmFjdCBhbmQgdXNlIHRvIHJlcGxhY2UgYWxsIGNhbGxzIHRvIGdvb2cuZ2V0Q3NzTmFtZSgpLiBJbiB1bmNvbXBpbGVkCiAqIG1vZGUsIEphdmFTY3JpcHQgY29kZSBzaG91bGQgYmUgbG9hZGVkIGJlZm9yZSB0aGlzIGJhc2UuanMgZmlsZSB0aGF0IGRlY2xhcmVzCiAqIGEgZ2xvYmFsIHZhcmlhYmxlLCBDTE9TVVJFX0NTU19OQU1FX01BUFBJTkcsIHdoaWNoIGlzIHVzZWQgYmVsb3cuIFRoaXMgaXMKICogdG8gZW5zdXJlIHRoYXQgdGhlIG1hcHBpbmcgaXMgbG9hZGVkIGJlZm9yZSBhbnkgY2FsbHMgdG8gZ29vZy5nZXRDc3NOYW1lKCkKICogYXJlIG1hZGUgaW4gdW5jb21waWxlZCBtb2RlLgogKgogKiBBIGhvb2sgZm9yIG92ZXJyaWRpbmcgdGhlIENTUyBuYW1lIG1hcHBpbmcuCiAqIEB0eXBlIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPnx1bmRlZmluZWR9CiAqLwpnb29nLmdsb2JhbC5DTE9TVVJFX0NTU19OQU1FX01BUFBJTkc7CgoKaWYgKCFDT01QSUxFRCAmJiBnb29nLmdsb2JhbC5DTE9TVVJFX0NTU19OQU1FX01BUFBJTkcpIHsKICAvLyBUaGlzIGRvZXMgbm90IGNhbGwgZ29vZy5zZXRDc3NOYW1lTWFwcGluZygpIGJlY2F1c2UgdGhlIEpTQ29tcGlsZXIKICAvLyByZXF1aXJlcyB0aGF0IGdvb2cuc2V0Q3NzTmFtZU1hcHBpbmcoKSBiZSBjYWxsZWQgd2l0aCBhbiBvYmplY3QgbGl0ZXJhbC4KICBnb29nLmNzc05hbWVNYXBwaW5nXyA9IGdvb2cuZ2xvYmFsLkNMT1NVUkVfQ1NTX05BTUVfTUFQUElORzsKfQoKCi8qKgogKiBHZXRzIGEgbG9jYWxpemVkIG1lc3NhZ2UuCiAqCiAqIFRoaXMgZnVuY3Rpb24gaXMgYSBjb21waWxlciBwcmltaXRpdmUuIElmIHlvdSBnaXZlIHRoZSBjb21waWxlciBhIGxvY2FsaXplZAogKiBtZXNzYWdlIGJ1bmRsZSwgaXQgd2lsbCByZXBsYWNlIHRoZSBzdHJpbmcgYXQgY29tcGlsZS10aW1lIHdpdGggYSBsb2NhbGl6ZWQKICogdmVyc2lvbiwgYW5kIGV4cGFuZCBnb29nLmdldE1zZyBjYWxsIHRvIGEgY29uY2F0ZW5hdGVkIHN0cmluZy4KICoKICogTWVzc2FnZXMgbXVzdCBiZSBpbml0aWFsaXplZCBpbiB0aGUgZm9ybToKICogPGNvZGU+CiAqIHZhciBNU0dfTkFNRSA9IGdvb2cuZ2V0TXNnKCdIZWxsbyB7JHBsYWNlaG9sZGVyfScsIHsncGxhY2Vob2xkZXInOiAnd29ybGQnfSk7CiAqIDwvY29kZT4KICoKICogVGhpcyBmdW5jdGlvbiBwcm9kdWNlcyBhIHN0cmluZyB3aGljaCBzaG91bGQgYmUgdHJlYXRlZCBhcyBwbGFpbiB0ZXh0LiBVc2UKICoge0BsaW5rIGdvb2cuaHRtbC5TYWZlSHRtbEZvcm1hdHRlcn0gaW4gY29uanVuY3Rpb24gd2l0aCBnb29nLmdldE1zZyB0bwogKiBwcm9kdWNlIFNhZmVIdG1sLgogKgogKiBAcGFyYW0ge3N0cmluZ30gc3RyIFRyYW5zbGF0YWJsZSBzdHJpbmcsIHBsYWNlcyBob2xkZXJzIGluIHRoZSBmb3JtIHskZm9vfS4KICogQHBhcmFtIHtPYmplY3Q8c3RyaW5nLCBzdHJpbmc+PX0gb3B0X3ZhbHVlcyBNYXBzIHBsYWNlIGhvbGRlciBuYW1lIHRvIHZhbHVlLgogKiBAcGFyYW0ge3todG1sOiBib29sZWFufT19IG9wdF9vcHRpb25zIE9wdGlvbnM6CiAqICAgICBodG1sOiBFc2NhcGUgJzwnIGluIHN0ciB0byAnJmx0OycuIFVzZWQgYnkgQ2xvc3VyZSBUZW1wbGF0ZXMgd2hlcmUgdGhlCiAqICAgICBnZW5lcmF0ZWQgY29kZSBzaXplIGFuZCBwZXJmb3JtYW5jZSBpcyBjcml0aWNhbCB3aGljaCBpcyB3aHkge0BsaW5rCiAqICAgICBnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXJ9IGlzIG5vdCB1c2VkLiBUaGUgdmFsdWUgbXVzdCBiZSBsaXRlcmFsIHRydWUKICogICAgIG9yIGZhbHNlLgogKiBAcmV0dXJuIHtzdHJpbmd9IG1lc3NhZ2Ugd2l0aCBwbGFjZWhvbGRlcnMgZmlsbGVkLgogKi8KZ29vZy5nZXRNc2cgPSBmdW5jdGlvbihzdHIsIG9wdF92YWx1ZXMsIG9wdF9vcHRpb25zKSB7CiAgaWYgKG9wdF9vcHRpb25zICYmIG9wdF9vcHRpb25zLmh0bWwpIHsKICAgIC8vIE5vdGUgdGhhdCAnJicgaXMgbm90IHJlcGxhY2VkIGJlY2F1c2UgdGhlIHRyYW5zbGF0aW9uIGNhbiBjb250YWluIEhUTUwKICAgIC8vIGVudGl0aWVzLgogICAgc3RyID0gc3RyLnJlcGxhY2UoLzwvZywgJyZsdDsnKTsKICB9CiAgaWYgKG9wdF92YWx1ZXMpIHsKICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9ce1wkKFtefV0rKX0vZywgZnVuY3Rpb24obWF0Y2gsIGtleSkgewogICAgICByZXR1cm4gKG9wdF92YWx1ZXMgIT0gbnVsbCAmJiBrZXkgaW4gb3B0X3ZhbHVlcykgPyBvcHRfdmFsdWVzW2tleV0gOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaDsKICAgIH0pOwogIH0KICByZXR1cm4gc3RyOwp9OwoKCi8qKgogKiBHZXRzIGEgbG9jYWxpemVkIG1lc3NhZ2UuIElmIHRoZSBtZXNzYWdlIGRvZXMgbm90IGhhdmUgYSB0cmFuc2xhdGlvbiwgZ2l2ZXMgYQogKiBmYWxsYmFjayBtZXNzYWdlLgogKgogKiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGludHJvZHVjaW5nIGEgbmV3IG1lc3NhZ2UgdGhhdCBoYXMgbm90IHlldCBiZWVuCiAqIHRyYW5zbGF0ZWQgaW50byBhbGwgbGFuZ3VhZ2VzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGEgY29tcGlsZXIgcHJpbWl0aXZlLiBNdXN0IGJlIHVzZWQgaW4gdGhlIGZvcm06CiAqIDxjb2RlPnZhciB4ID0gZ29vZy5nZXRNc2dXaXRoRmFsbGJhY2soTVNHX0EsIE1TR19CKTs8L2NvZGU+CiAqIHdoZXJlIE1TR19BIGFuZCBNU0dfQiB3ZXJlIGluaXRpYWxpemVkIHdpdGggZ29vZy5nZXRNc2cuCiAqCiAqIEBwYXJhbSB7c3RyaW5nfSBhIFRoZSBwcmVmZXJyZWQgbWVzc2FnZS4KICogQHBhcmFtIHtzdHJpbmd9IGIgVGhlIGZhbGxiYWNrIG1lc3NhZ2UuCiAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGJlc3QgdHJhbnNsYXRlZCBtZXNzYWdlLgogKi8KZ29vZy5nZXRNc2dXaXRoRmFsbGJhY2sgPSBmdW5jdGlvbihhLCBiKSB7CiAgcmV0dXJuIGE7Cn07CgoKLyoqCiAqIEV4cG9zZXMgYW4gdW5vYmZ1c2NhdGVkIGdsb2JhbCBuYW1lc3BhY2UgcGF0aCBmb3IgdGhlIGdpdmVuIG9iamVjdC4KICogTm90ZSB0aGF0IGZpZWxkcyBvZiB0aGUgZXhwb3J0ZWQgb2JqZWN0ICp3aWxsKiBiZSBvYmZ1c2NhdGVkLCB1bmxlc3MgdGhleSBhcmUKICogZXhwb3J0ZWQgaW4gdHVybiB2aWEgdGhpcyBmdW5jdGlvbiBvciBnb29nLmV4cG9ydFByb3BlcnR5LgogKgogKiBBbHNvIGhhbmR5IGZvciBtYWtpbmcgcHVibGljIGl0ZW1zIHRoYXQgYXJlIGRlZmluZWQgaW4gYW5vbnltb3VzIGNsb3N1cmVzLgogKgogKiBleC4gZ29vZy5leHBvcnRTeW1ib2woJ3B1YmxpYy5wYXRoLkZvbycsIEZvbyk7CiAqCiAqIGV4LiBnb29nLmV4cG9ydFN5bWJvbCgncHVibGljLnBhdGguRm9vLnN0YXRpY0Z1bmN0aW9uJywgRm9vLnN0YXRpY0Z1bmN0aW9uKTsKICogICAgIHB1YmxpYy5wYXRoLkZvby5zdGF0aWNGdW5jdGlvbigpOwogKgogKiBleC4gZ29vZy5leHBvcnRTeW1ib2woJ3B1YmxpYy5wYXRoLkZvby5wcm90b3R5cGUubXlNZXRob2QnLAogKiAgICAgICAgICAgICAgICAgICAgICAgRm9vLnByb3RvdHlwZS5teU1ldGhvZCk7CiAqICAgICBuZXcgcHVibGljLnBhdGguRm9vKCkubXlNZXRob2QoKTsKICoKICogQHBhcmFtIHtzdHJpbmd9IHB1YmxpY1BhdGggVW5vYmZ1c2NhdGVkIG5hbWUgdG8gZXhwb3J0LgogKiBAcGFyYW0geyp9IG9iamVjdCBPYmplY3QgdGhlIG5hbWUgc2hvdWxkIHBvaW50IHRvLgogKiBAcGFyYW0ge09iamVjdD19IG9wdF9vYmplY3RUb0V4cG9ydFRvIFRoZSBvYmplY3QgdG8gYWRkIHRoZSBwYXRoIHRvOyBkZWZhdWx0CiAqICAgICBpcyBnb29nLmdsb2JhbC4KICovCmdvb2cuZXhwb3J0U3ltYm9sID0gZnVuY3Rpb24ocHVibGljUGF0aCwgb2JqZWN0LCBvcHRfb2JqZWN0VG9FeHBvcnRUbykgewogIGdvb2cuZXhwb3J0UGF0aF8ocHVibGljUGF0aCwgb2JqZWN0LCBvcHRfb2JqZWN0VG9FeHBvcnRUbyk7Cn07CgoKLyoqCiAqIEV4cG9ydHMgYSBwcm9wZXJ0eSB1bm9iZnVzY2F0ZWQgaW50byB0aGUgb2JqZWN0J3MgbmFtZXNwYWNlLgogKiBleC4gZ29vZy5leHBvcnRQcm9wZXJ0eShGb28sICdzdGF0aWNGdW5jdGlvbicsIEZvby5zdGF0aWNGdW5jdGlvbik7CiAqIGV4LiBnb29nLmV4cG9ydFByb3BlcnR5KEZvby5wcm90b3R5cGUsICdteU1ldGhvZCcsIEZvby5wcm90b3R5cGUubXlNZXRob2QpOwogKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IE9iamVjdCB3aG9zZSBzdGF0aWMgcHJvcGVydHkgaXMgYmVpbmcgZXhwb3J0ZWQuCiAqIEBwYXJhbSB7c3RyaW5nfSBwdWJsaWNOYW1lIFVub2JmdXNjYXRlZCBuYW1lIHRvIGV4cG9ydC4KICogQHBhcmFtIHsqfSBzeW1ib2wgT2JqZWN0IHRoZSBuYW1lIHNob3VsZCBwb2ludCB0by4KICovCmdvb2cuZXhwb3J0UHJvcGVydHkgPSBmdW5jdGlvbihvYmplY3QsIHB1YmxpY05hbWUsIHN5bWJvbCkgewogIG9iamVjdFtwdWJsaWNOYW1lXSA9IHN5bWJvbDsKfTsKCgovKioKICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLgogKgogKiBVc2FnZToKICogPHByZT4KICogZnVuY3Rpb24gUGFyZW50Q2xhc3MoYSwgYikgeyB9CiAqIFBhcmVudENsYXNzLnByb3RvdHlwZS5mb28gPSBmdW5jdGlvbihhKSB7IH07CiAqCiAqIGZ1bmN0aW9uIENoaWxkQ2xhc3MoYSwgYiwgYykgewogKiAgIENoaWxkQ2xhc3MuYmFzZSh0aGlzLCAnY29uc3RydWN0b3InLCBhLCBiKTsKICogfQogKiBnb29nLmluaGVyaXRzKENoaWxkQ2xhc3MsIFBhcmVudENsYXNzKTsKICoKICogdmFyIGNoaWxkID0gbmV3IENoaWxkQ2xhc3MoJ2EnLCAnYicsICdzZWUnKTsKICogY2hpbGQuZm9vKCk7IC8vIFRoaXMgd29ya3MuCiAqIDwvcHJlPgogKgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY2hpbGRDdG9yIENoaWxkIGNsYXNzLgogKiBAcGFyYW0geyFGdW5jdGlvbn0gcGFyZW50Q3RvciBQYXJlbnQgY2xhc3MuCiAqIEBzdXBwcmVzcyB7c3RyaWN0TWlzc2luZ1Byb3BlcnRpZXN9IHN1cGVyQ2xhc3NfIGFuZCBiYXNlIGlzIG5vdCBkZWZpbmVkIG9uCiAqICAgIEZ1bmN0aW9uLgogKi8KZ29vZy5pbmhlcml0cyA9IGZ1bmN0aW9uKGNoaWxkQ3RvciwgcGFyZW50Q3RvcikgewogIC8qKiBAY29uc3RydWN0b3IgKi8KICBmdW5jdGlvbiB0ZW1wQ3RvcigpIHt9CiAgdGVtcEN0b3IucHJvdG90eXBlID0gcGFyZW50Q3Rvci5wcm90b3R5cGU7CiAgY2hpbGRDdG9yLnN1cGVyQ2xhc3NfID0gcGFyZW50Q3Rvci5wcm90b3R5cGU7CiAgY2hpbGRDdG9yLnByb3RvdHlwZSA9IG5ldyB0ZW1wQ3RvcigpOwogIC8qKiBAb3ZlcnJpZGUgKi8KICBjaGlsZEN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY2hpbGRDdG9yOwoKICAvKioKICAgKiBDYWxscyBzdXBlcmNsYXNzIGNvbnN0cnVjdG9yL21ldGhvZC4KICAgKgogICAqIFRoaXMgZnVuY3Rpb24gaXMgb25seSBhdmFpbGFibGUgaWYgeW91IHVzZSBnb29nLmluaGVyaXRzIHRvCiAgICogZXhwcmVzcyBpbmhlcml0YW5jZSByZWxhdGlvbnNoaXBzIGJldHdlZW4gY2xhc3Nlcy4KICAgKgogICAqIE5PVEU6IFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3IgZ29vZy5iYXNlIGFuZCBmb3Igc3VwZXJDbGFzc18KICAgKiBwcm9wZXJ0eSBkZWZpbmVkIGluIGNoaWxkQ3Rvci4KICAgKgogICAqIEBwYXJhbSB7IU9iamVjdH0gbWUgU2hvdWxkIGFsd2F5cyBiZSAidGhpcyIuCiAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG1ldGhvZCBuYW1lIHRvIGNhbGwuIENhbGxpbmcKICAgKiAgICAgc3VwZXJjbGFzcyBjb25zdHJ1Y3RvciBjYW4gYmUgZG9uZSB3aXRoIHRoZSBzcGVjaWFsIHN0cmluZwogICAqICAgICAnY29uc3RydWN0b3InLgogICAqIEBwYXJhbSB7Li4uKn0gdmFyX2FyZ3MgVGhlIGFyZ3VtZW50cyB0byBwYXNzIHRvIHN1cGVyY2xhc3MKICAgKiAgICAgbWV0aG9kL2NvbnN0cnVjdG9yLgogICAqIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN1cGVyY2xhc3MgbWV0aG9kL2NvbnN0cnVjdG9yLgogICAqLwogIGNoaWxkQ3Rvci5iYXNlID0gZnVuY3Rpb24obWUsIG1ldGhvZE5hbWUsIHZhcl9hcmdzKSB7CiAgICAvLyBDb3B5aW5nIHVzaW5nIGxvb3AgdG8gYXZvaWQgZGVvcCBkdWUgdG8gcGFzc2luZyBhcmd1bWVudHMgb2JqZWN0IHRvCiAgICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAyKTsKICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGFyZ3NbaSAtIDJdID0gYXJndW1lbnRzW2ldOwogICAgfQogICAgcmV0dXJuIHBhcmVudEN0b3IucHJvdG90eXBlW21ldGhvZE5hbWVdLmFwcGx5KG1lLCBhcmdzKTsKICB9Owp9OwoKCi8qKgogKiBDYWxsIHVwIHRvIHRoZSBzdXBlcmNsYXNzLgogKgogKiBJZiB0aGlzIGlzIGNhbGxlZCBmcm9tIGEgY29uc3RydWN0b3IsIHRoZW4gdGhpcyBjYWxscyB0aGUgc3VwZXJjbGFzcwogKiBjb25zdHJ1Y3RvciB3aXRoIGFyZ3VtZW50cyAxLU4uCiAqCiAqIElmIHRoaXMgaXMgY2FsbGVkIGZyb20gYSBwcm90b3R5cGUgbWV0aG9kLCB0aGVuIHlvdSBtdXN0IHBhc3MgdGhlIG5hbWUgb2YgdGhlCiAqIG1ldGhvZCBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoaXMgZnVuY3Rpb24uIElmIHlvdSBkbyBub3QsIHlvdSB3aWxsIGdldCBhCiAqIHJ1bnRpbWUgZXJyb3IuIFRoaXMgY2FsbHMgdGhlIHN1cGVyY2xhc3MnIG1ldGhvZCB3aXRoIGFyZ3VtZW50cyAyLU4uCiAqCiAqIFRoaXMgZnVuY3Rpb24gb25seSB3b3JrcyBpZiB5b3UgdXNlIGdvb2cuaW5oZXJpdHMgdG8gZXhwcmVzcyBpbmhlcml0YW5jZQogKiByZWxhdGlvbnNoaXBzIGJldHdlZW4geW91ciBjbGFzc2VzLgogKgogKiBUaGlzIGZ1bmN0aW9uIGlzIGEgY29tcGlsZXIgcHJpbWl0aXZlLiBBdCBjb21waWxlLXRpbWUsIHRoZSBjb21waWxlciB3aWxsIGRvCiAqIG1hY3JvIGV4cGFuc2lvbiB0byByZW1vdmUgYSBsb3Qgb2YgdGhlIGV4dHJhIG92ZXJoZWFkIHRoYXQgdGhpcyBmdW5jdGlvbgogKiBpbnRyb2R1Y2VzLiBUaGUgY29tcGlsZXIgd2lsbCBhbHNvIGVuZm9yY2UgYSBsb3Qgb2YgdGhlIGFzc3VtcHRpb25zIHRoYXQgdGhpcwogKiBmdW5jdGlvbiBtYWtlcywgYW5kIHRyZWF0IGl0IGFzIGEgY29tcGlsZXIgZXJyb3IgaWYgeW91IGJyZWFrIHRoZW0uCiAqCiAqIEBwYXJhbSB7IU9iamVjdH0gbWUgU2hvdWxkIGFsd2F5cyBiZSAidGhpcyIuCiAqIEBwYXJhbSB7Kj19IG9wdF9tZXRob2ROYW1lIFRoZSBtZXRob2QgbmFtZSBpZiBjYWxsaW5nIGEgc3VwZXIgbWV0aG9kLgogKiBAcGFyYW0gey4uLip9IHZhcl9hcmdzIFRoZSByZXN0IG9mIHRoZSBhcmd1bWVudHMuCiAqIEByZXR1cm4geyp9IFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHN1cGVyY2xhc3MgbWV0aG9kLgogKiBAc3VwcHJlc3Mge2VzNVN0cmljdH0gVGhpcyBtZXRob2QgY2FuIG5vdCBiZSB1c2VkIGluIHN0cmljdCBtb2RlLCBidXQKICogICAgIGFsbCBDbG9zdXJlIExpYnJhcnkgY29uc3VtZXJzIG11c3QgZGVwZW5kIG9uIHRoaXMgZmlsZS4KICogQGRlcHJlY2F0ZWQgZ29vZy5iYXNlIGlzIG5vdCBzdHJpY3QgbW9kZSBjb21wYXRpYmxlLiAgUHJlZmVyIHRoZSBzdGF0aWMKICogICAgICJiYXNlIiBtZXRob2QgYWRkZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGJ5IGdvb2cuaW5oZXJpdHMKICogICAgIG9yIEVTNiBjbGFzc2VzIGFuZCB0aGUgInN1cGVyIiBrZXl3b3JkLgogKi8KZ29vZy5iYXNlID0gZnVuY3Rpb24obWUsIG9wdF9tZXRob2ROYW1lLCB2YXJfYXJncykgewogIHZhciBjYWxsZXIgPSBhcmd1bWVudHMuY2FsbGVlLmNhbGxlcjsKCiAgaWYgKGdvb2cuU1RSSUNUX01PREVfQ09NUEFUSUJMRSB8fCAoZ29vZy5ERUJVRyAmJiAhY2FsbGVyKSkgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdhcmd1bWVudHMuY2FsbGVyIG5vdCBkZWZpbmVkLiAgZ29vZy5iYXNlKCkgY2Fubm90IGJlIHVzZWQgJyArCiAgICAgICAgJ3dpdGggc3RyaWN0IG1vZGUgY29kZS4gU2VlICcgKwogICAgICAgICdodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtQycpOwogIH0KCiAgaWYgKHR5cGVvZiBjYWxsZXIuc3VwZXJDbGFzc18gIT09ICd1bmRlZmluZWQnKSB7CiAgICAvLyBDb3B5aW5nIHVzaW5nIGxvb3AgdG8gYXZvaWQgZGVvcCBkdWUgdG8gcGFzc2luZyBhcmd1bWVudHMgb2JqZWN0IHRvCiAgICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICAgIHZhciBjdG9yQXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMSk7CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICBjdG9yQXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07CiAgICB9CiAgICAvLyBUaGlzIGlzIGEgY29uc3RydWN0b3IuIENhbGwgdGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IuCiAgICByZXR1cm4gLyoqIEB0eXBlIHshRnVuY3Rpb259ICovIChjYWxsZXIuc3VwZXJDbGFzc18pCiAgICAgICAgLmNvbnN0cnVjdG9yLmFwcGx5KG1lLCBjdG9yQXJncyk7CiAgfQoKICBpZiAodHlwZW9mIG9wdF9tZXRob2ROYW1lICE9ICdzdHJpbmcnICYmIHR5cGVvZiBvcHRfbWV0aG9kTmFtZSAhPSAnc3ltYm9sJykgewogICAgdGhyb3cgbmV3IEVycm9yKAogICAgICAgICdtZXRob2QgbmFtZXMgcHJvdmlkZWQgdG8gZ29vZy5iYXNlIG11c3QgYmUgYSBzdHJpbmcgb3IgYSBzeW1ib2wnKTsKICB9CgogIC8vIENvcHlpbmcgdXNpbmcgbG9vcCB0byBhdm9pZCBkZW9wIGR1ZSB0byBwYXNzaW5nIGFyZ3VtZW50cyBvYmplY3QgdG8KICAvLyBmdW5jdGlvbi4gVGhpcyBpcyBmYXN0ZXIgaW4gbWFueSBKUyBlbmdpbmVzIGFzIG9mIGxhdGUgMjAxNC4KICB2YXIgYXJncyA9IG5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoIC0gMik7CiAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgIGFyZ3NbaSAtIDJdID0gYXJndW1lbnRzW2ldOwogIH0KICB2YXIgZm91bmRDYWxsZXIgPSBmYWxzZTsKICBmb3IgKHZhciBwcm90byA9IG1lLmNvbnN0cnVjdG9yLnByb3RvdHlwZTsgcHJvdG87CiAgICAgICBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihwcm90bykpIHsKICAgIGlmIChwcm90b1tvcHRfbWV0aG9kTmFtZV0gPT09IGNhbGxlcikgewogICAgICBmb3VuZENhbGxlciA9IHRydWU7CiAgICB9IGVsc2UgaWYgKGZvdW5kQ2FsbGVyKSB7CiAgICAgIHJldHVybiBwcm90b1tvcHRfbWV0aG9kTmFtZV0uYXBwbHkobWUsIGFyZ3MpOwogICAgfQogIH0KCiAgLy8gSWYgd2UgZGlkIG5vdCBmaW5kIHRoZSBjYWxsZXIgaW4gdGhlIHByb3RvdHlwZSBjaGFpbiwgdGhlbiBvbmUgb2YgdHdvCiAgLy8gdGhpbmdzIGhhcHBlbmVkOgogIC8vIDEpIFRoZSBjYWxsZXIgaXMgYW4gaW5zdGFuY2UgbWV0aG9kLgogIC8vIDIpIFRoaXMgbWV0aG9kIHdhcyBub3QgY2FsbGVkIGJ5IHRoZSByaWdodCBjYWxsZXIuCiAgaWYgKG1lW29wdF9tZXRob2ROYW1lXSA9PT0gY2FsbGVyKSB7CiAgICByZXR1cm4gbWUuY29uc3RydWN0b3IucHJvdG90eXBlW29wdF9tZXRob2ROYW1lXS5hcHBseShtZSwgYXJncyk7CiAgfSBlbHNlIHsKICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAnZ29vZy5iYXNlIGNhbGxlZCBmcm9tIGEgbWV0aG9kIG9mIG9uZSBuYW1lICcgKwogICAgICAgICd0byBhIG1ldGhvZCBvZiBhIGRpZmZlcmVudCBuYW1lJyk7CiAgfQp9OwoKCi8qKgogKiBBbGxvdyBmb3IgYWxpYXNpbmcgd2l0aGluIHNjb3BlIGZ1bmN0aW9ucy4gIFRoaXMgZnVuY3Rpb24gZXhpc3RzIGZvcgogKiB1bmNvbXBpbGVkIGNvZGUgLSBpbiBjb21waWxlZCBjb2RlIHRoZSBjYWxscyB3aWxsIGJlIGlubGluZWQgYW5kIHRoZSBhbGlhc2VzCiAqIGFwcGxpZWQuICBJbiB1bmNvbXBpbGVkIGNvZGUgdGhlIGZ1bmN0aW9uIGlzIHNpbXBseSBydW4gc2luY2UgdGhlIGFsaWFzZXMgYXMKICogd3JpdHRlbiBhcmUgdmFsaWQgSmF2YVNjcmlwdC4KICoKICoKICogQHBhcmFtIHtmdW5jdGlvbigpfSBmbiBGdW5jdGlvbiB0byBjYWxsLiAgVGhpcyBmdW5jdGlvbiBjYW4gY29udGFpbiBhbGlhc2VzCiAqICAgICB0byBuYW1lc3BhY2VzIChlLmcuICJ2YXIgZG9tID0gZ29vZy5kb20iKSBvciBjbGFzc2VzCiAqICAgICAoZS5nLiAidmFyIFRpbWVyID0gZ29vZy5UaW1lciIpLgogKi8KZ29vZy5zY29wZSA9IGZ1bmN0aW9uKGZuKSB7CiAgaWYgKGdvb2cuaXNJbk1vZHVsZUxvYWRlcl8oKSkgewogICAgdGhyb3cgbmV3IEVycm9yKCdnb29nLnNjb3BlIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aGluIGEgbW9kdWxlLicpOwogIH0KICBmbi5jYWxsKGdvb2cuZ2xvYmFsKTsKfTsKCgovKgogKiBUbyBzdXBwb3J0IHVuY29tcGlsZWQsIHN0cmljdCBtb2RlIGJ1bmRsZXMgdGhhdCB1c2UgZXZhbCB0byBkaXZpZGUgc291cmNlCiAqIGxpa2Ugc286CiAqICAgIGV2YWwoJ3NvbWVTb3VyY2U7Ly8jIHNvdXJjZVVybCBzb3VyY2VmaWxlLmpzJyk7CiAqIFdlIG5lZWQgdG8gZXhwb3J0IHRoZSBnbG9iYWxseSBkZWZpbmVkIHN5bWJvbHMgImdvb2ciIGFuZCAiQ09NUElMRUQiLgogKiBFeHBvcnRpbmcgImdvb2ciIGJyZWFrcyB0aGUgY29tcGlsZXIgb3B0aW1pemF0aW9ucywgc28gd2UgcmVxdWlyZWQgdGhhdAogKiBiZSBkZWZpbmVkIGV4dGVybmFsbHkuCiAqIE5PVEU6IFdlIGRvbid0IHVzZSBnb29nLmV4cG9ydFN5bWJvbCBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyCiAqIGV4dGVybiBnZW5lcmF0aW9uIHdoZW4gdGhhdCBjb21waWxlciBvcHRpb24gaXMgZW5hYmxlZC4KICovCmlmICghQ09NUElMRUQpIHsKICBnb29nLmdsb2JhbFsnQ09NUElMRUQnXSA9IENPTVBJTEVEOwp9CgoKLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLy8gZ29vZy5kZWZpbmVDbGFzcyBpbXBsZW1lbnRhdGlvbgovLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKCi8qKgogKiBDcmVhdGVzIGEgcmVzdHJpY3RlZCBmb3JtIG9mIGEgQ2xvc3VyZSAiY2xhc3MiOgogKiAgIC0gZnJvbSB0aGUgY29tcGlsZXIncyBwZXJzcGVjdGl2ZSwgdGhlIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhlCiAqICAgICBjb25zdHJ1Y3RvciBpcyBzZWFsZWQgKG5vIG5ldyBwcm9wZXJ0aWVzIG1heSBiZSBhZGRlZCkuICBUaGlzIGVuYWJsZXMKICogICAgIGJldHRlciBjaGVja3MuCiAqICAgLSB0aGUgY29tcGlsZXIgd2lsbCByZXdyaXRlIHRoaXMgZGVmaW5pdGlvbiB0byBhIGZvcm0gdGhhdCBpcyBvcHRpbWFsCiAqICAgICBmb3IgdHlwZSBjaGVja2luZyBhbmQgb3B0aW1pemF0aW9uIChpbml0aWFsbHkgdGhpcyB3aWxsIGJlIGEgbW9yZQogKiAgICAgdHJhZGl0aW9uYWwgZm9ybSkuCiAqCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyQ2xhc3MgVGhlIHN1cGVyY2xhc3MsIE9iamVjdCBvciBudWxsLgogKiBAcGFyYW0ge2dvb2cuZGVmaW5lQ2xhc3MuQ2xhc3NEZXNjcmlwdG9yfSBkZWYKICogICAgIEFuIG9iamVjdCBsaXRlcmFsIGRlc2NyaWJpbmcKICogICAgIHRoZSBjbGFzcy4gIEl0IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICogICAgICJjb25zdHJ1Y3RvciI6IHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbgogKiAgICAgInN0YXRpY3MiOiBhbiBvYmplY3QgbGl0ZXJhbCBjb250YWluaW5nIG1ldGhvZHMgdG8gYWRkIHRvIHRoZSBjb25zdHJ1Y3RvcgogKiAgICAgICAgYXMgInN0YXRpYyIgbWV0aG9kcyBvciBhIGZ1bmN0aW9uIHRoYXQgd2lsbCByZWNlaXZlIHRoZSBjb25zdHJ1Y3RvcgogKiAgICAgICAgZnVuY3Rpb24gYXMgaXRzIG9ubHkgcGFyYW1ldGVyIHRvIHdoaWNoIHN0YXRpYyBwcm9wZXJ0aWVzIGNhbgogKiAgICAgICAgYmUgYWRkZWQuCiAqICAgICBhbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhlIHByb3RvdHlwZS4KICogQHJldHVybiB7IUZ1bmN0aW9ufSBUaGUgY2xhc3MgY29uc3RydWN0b3IuCiAqIEBkZXByZWNhdGVkIFVzZSBFUzYgY2xhc3Mgc3ludGF4IGluc3RlYWQuCiAqLwpnb29nLmRlZmluZUNsYXNzID0gZnVuY3Rpb24oc3VwZXJDbGFzcywgZGVmKSB7CiAgLy8gVE9ETyhqb2hubGVueik6IGNvbnNpZGVyIG1ha2luZyB0aGUgc3VwZXJDbGFzcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuCiAgdmFyIGNvbnN0cnVjdG9yID0gZGVmLmNvbnN0cnVjdG9yOwogIHZhciBzdGF0aWNzID0gZGVmLnN0YXRpY3M7CiAgLy8gV3JhcCB0aGUgY29uc3RydWN0b3IgcHJpb3IgdG8gc2V0dGluZyB1cCB0aGUgcHJvdG90eXBlIGFuZCBzdGF0aWMgbWV0aG9kcy4KICBpZiAoIWNvbnN0cnVjdG9yIHx8IGNvbnN0cnVjdG9yID09IE9iamVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IpIHsKICAgIGNvbnN0cnVjdG9yID0gZnVuY3Rpb24oKSB7CiAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICdjYW5ub3QgaW5zdGFudGlhdGUgYW4gaW50ZXJmYWNlIChubyBjb25zdHJ1Y3RvciBkZWZpbmVkKS4nKTsKICAgIH07CiAgfQoKICB2YXIgY2xzID0gZ29vZy5kZWZpbmVDbGFzcy5jcmVhdGVTZWFsaW5nQ29uc3RydWN0b3JfKGNvbnN0cnVjdG9yLCBzdXBlckNsYXNzKTsKICBpZiAoc3VwZXJDbGFzcykgewogICAgZ29vZy5pbmhlcml0cyhjbHMsIHN1cGVyQ2xhc3MpOwogIH0KCiAgLy8gUmVtb3ZlIGFsbCB0aGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBub3QgYmUgY29waWVkIHRvIHRoZSBwcm90b3R5cGUuCiAgZGVsZXRlIGRlZi5jb25zdHJ1Y3RvcjsKICBkZWxldGUgZGVmLnN0YXRpY3M7CgogIGdvb2cuZGVmaW5lQ2xhc3MuYXBwbHlQcm9wZXJ0aWVzXyhjbHMucHJvdG90eXBlLCBkZWYpOwogIGlmIChzdGF0aWNzICE9IG51bGwpIHsKICAgIGlmIChzdGF0aWNzIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKICAgICAgc3RhdGljcyhjbHMpOwogICAgfSBlbHNlIHsKICAgICAgZ29vZy5kZWZpbmVDbGFzcy5hcHBseVByb3BlcnRpZXNfKGNscywgc3RhdGljcyk7CiAgICB9CiAgfQoKICByZXR1cm4gY2xzOwp9OwoKCi8qKgogKiBAdHlwZWRlZiB7ewogKiAgIGNvbnN0cnVjdG9yOiAoIUZ1bmN0aW9ufHVuZGVmaW5lZCksCiAqICAgc3RhdGljczogKE9iamVjdHx1bmRlZmluZWR8ZnVuY3Rpb24oRnVuY3Rpb24pOnZvaWQpCiAqIH19CiAqLwpnb29nLmRlZmluZUNsYXNzLkNsYXNzRGVzY3JpcHRvcjsKCgovKioKICogQGRlZmluZSB7Ym9vbGVhbn0gV2hldGhlciB0aGUgaW5zdGFuY2VzIHJldHVybmVkIGJ5IGdvb2cuZGVmaW5lQ2xhc3Mgc2hvdWxkCiAqICAgICBiZSBzZWFsZWQgd2hlbiBwb3NzaWJsZS4KICoKICogV2hlbiBzZWFsaW5nIGlzIGRpc2FibGVkIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiB3aWxsIG5vdCBiZSB3cmFwcGVkIGJ5CiAqIGdvb2cuZGVmaW5lQ2xhc3MsIG1ha2luZyBpdCBpbmNvbXBhdGlibGUgd2l0aCBFUzYgY2xhc3MgbWV0aG9kcy4KICovCmdvb2cuZGVmaW5lQ2xhc3MuU0VBTF9DTEFTU19JTlNUQU5DRVMgPQogICAgZ29vZy5kZWZpbmUoJ2dvb2cuZGVmaW5lQ2xhc3MuU0VBTF9DTEFTU19JTlNUQU5DRVMnLCBnb29nLkRFQlVHKTsKCgovKioKICogSWYgZ29vZy5kZWZpbmVDbGFzcy5TRUFMX0NMQVNTX0lOU1RBTkNFUyBpcyBlbmFibGVkIGFuZCBPYmplY3Quc2VhbCBpcwogKiBkZWZpbmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgd3JhcCB0aGUgY29uc3RydWN0b3IgaW4gYSBmdW5jdGlvbiB0aGF0IHNlYWxzIHRoZQogKiByZXN1bHRzIG9mIHRoZSBwcm92aWRlZCBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KICoKICogQHBhcmFtIHshRnVuY3Rpb259IGN0ciBUaGUgY29uc3RydWN0b3Igd2hvc2UgcmVzdWx0cyBtYXliZSBiZSBzZWFsZWQuCiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyQ2xhc3MgVGhlIHN1cGVyY2xhc3MgY29uc3RydWN0b3IuCiAqIEByZXR1cm4geyFGdW5jdGlvbn0gVGhlIHJlcGxhY2VtZW50IGNvbnN0cnVjdG9yLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5jcmVhdGVTZWFsaW5nQ29uc3RydWN0b3JfID0gZnVuY3Rpb24oY3RyLCBzdXBlckNsYXNzKSB7CiAgaWYgKCFnb29nLmRlZmluZUNsYXNzLlNFQUxfQ0xBU1NfSU5TVEFOQ0VTKSB7CiAgICAvLyBEbyBub3cgd3JhcCB0aGUgY29uc3RydWN0b3Igd2hlbiBzZWFsaW5nIGlzIGRpc2FibGVkLiBBbmd1bGFyIGNvZGUKICAgIC8vIGRlcGVuZHMgb24gdGhpcyBmb3IgaW5qZWN0aW9uIHRvIHdvcmsgcHJvcGVybHkuCiAgICByZXR1cm4gY3RyOwogIH0KCiAgLy8gQ29tcHV0ZSB3aGV0aGVyIHRoZSBjb25zdHJ1Y3RvciBpcyBzZWFsYWJsZSBhdCBkZWZpbml0aW9uIHRpbWUsIHJhdGhlcgogIC8vIHRoYW4gd2hlbiB0aGUgaW5zdGFuY2UgaXMgYmVpbmcgY29uc3RydWN0ZWQuCiAgdmFyIHN1cGVyY2xhc3NTZWFsYWJsZSA9ICFnb29nLmRlZmluZUNsYXNzLmlzVW5zZWFsYWJsZV8oc3VwZXJDbGFzcyk7CgogIC8qKgogICAqIEB0aGlzIHtPYmplY3R9CiAgICogQHJldHVybiB7P30KICAgKi8KICB2YXIgd3JhcHBlZEN0ciA9IGZ1bmN0aW9uKCkgewogICAgLy8gRG9uJ3Qgc2VhbCBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIHdoZW4gaXQgY2FsbHMgdGhlIGNvbnN0cnVjdG9yIG9mCiAgICAvLyBpdHMgc3VwZXIgY2xhc3MgYXMgdGhlcmUgaXMgbW9zdCBsaWtlbHkgc3RpbGwgc2V0dXAgdG8gZG8uCiAgICB2YXIgaW5zdGFuY2UgPSBjdHIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgaW5zdGFuY2VbZ29vZy5VSURfUFJPUEVSVFlfXSA9IGluc3RhbmNlW2dvb2cuVUlEX1BST1BFUlRZX107CgogICAgaWYgKHRoaXMuY29uc3RydWN0b3IgPT09IHdyYXBwZWRDdHIgJiYgc3VwZXJjbGFzc1NlYWxhYmxlICYmCiAgICAgICAgT2JqZWN0LnNlYWwgaW5zdGFuY2VvZiBGdW5jdGlvbikgewogICAgICBPYmplY3Quc2VhbChpbnN0YW5jZSk7CiAgICB9CiAgICByZXR1cm4gaW5zdGFuY2U7CiAgfTsKCiAgcmV0dXJuIHdyYXBwZWRDdHI7Cn07CgoKLyoqCiAqIEBwYXJhbSB7RnVuY3Rpb259IGN0ciBUaGUgY29uc3RydWN0b3IgdG8gdGVzdC4KICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgY29uc3RydWN0b3IgaGFzIGJlZW4gdGFnZ2VkIGFzIHVuc2VhbGFibGUKICogICAgIHVzaW5nIGdvb2cudGFnVW5zZWFsYWJsZUNsYXNzLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5pc1Vuc2VhbGFibGVfID0gZnVuY3Rpb24oY3RyKSB7CiAgcmV0dXJuIGN0ciAmJiBjdHIucHJvdG90eXBlICYmCiAgICAgIGN0ci5wcm90b3R5cGVbZ29vZy5VTlNFQUxBQkxFX0NPTlNUUlVDVE9SX1BST1BFUlRZX107Cn07CgoKLy8gVE9ETyhqb2hubGVueik6IHNoYXJlIHRoZXNlIHZhbHVlcyB3aXRoIHRoZSBnb29nLm9iamVjdAovKioKICogVGhlIG5hbWVzIG9mIHRoZSBmaWVsZHMgdGhhdCBhcmUgZGVmaW5lZCBvbiBPYmplY3QucHJvdG90eXBlLgogKiBAdHlwZSB7IUFycmF5PHN0cmluZz59CiAqIEBwcml2YXRlCiAqIEBjb25zdAogKi8KZ29vZy5kZWZpbmVDbGFzcy5PQkpFQ1RfUFJPVE9UWVBFX0ZJRUxEU18gPSBbCiAgJ2NvbnN0cnVjdG9yJywgJ2hhc093blByb3BlcnR5JywgJ2lzUHJvdG90eXBlT2YnLCAncHJvcGVydHlJc0VudW1lcmFibGUnLAogICd0b0xvY2FsZVN0cmluZycsICd0b1N0cmluZycsICd2YWx1ZU9mJwpdOwoKCi8vIFRPRE8oam9obmxlbnopOiBzaGFyZSB0aGlzIGZ1bmN0aW9uIHdpdGggdGhlIGdvb2cub2JqZWN0Ci8qKgogKiBAcGFyYW0geyFPYmplY3R9IHRhcmdldCBUaGUgb2JqZWN0IHRvIGFkZCBwcm9wZXJ0aWVzIHRvLgogKiBAcGFyYW0geyFPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLgogKiBAcHJpdmF0ZQogKi8KZ29vZy5kZWZpbmVDbGFzcy5hcHBseVByb3BlcnRpZXNfID0gZnVuY3Rpb24odGFyZ2V0LCBzb3VyY2UpIHsKICAvLyBUT0RPKGpvaG5sZW56KTogdXBkYXRlIHRoaXMgdG8gc3VwcG9ydCBFUzUgZ2V0dGVycy9zZXR0ZXJzCgogIHZhciBrZXk7CiAgZm9yIChrZXkgaW4gc291cmNlKSB7CiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgewogICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOwogICAgfQogIH0KCiAgLy8gRm9yIElFIHRoZSBmb3ItaW4tbG9vcCBkb2VzIG5vdCBjb250YWluIGFueSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdAogIC8vIGVudW1lcmFibGUgb24gdGhlIHByb3RvdHlwZSBvYmplY3QgKGZvciBleGFtcGxlIGlzUHJvdG90eXBlT2YgZnJvbQogIC8vIE9iamVjdC5wcm90b3R5cGUpIGFuZCBpdCB3aWxsIGFsc28gbm90IGluY2x1ZGUgJ3JlcGxhY2UnIG9uIG9iamVjdHMgdGhhdAogIC8vIGV4dGVuZCBTdHJpbmcgYW5kIGNoYW5nZSAncmVwbGFjZScgKG5vdCB0aGF0IGl0IGlzIGNvbW1vbiBmb3IgYW55b25lIHRvCiAgLy8gZXh0ZW5kIGFueXRoaW5nIGV4Y2VwdCBPYmplY3QpLgogIGZvciAodmFyIGkgPSAwOyBpIDwgZ29vZy5kZWZpbmVDbGFzcy5PQkpFQ1RfUFJPVE9UWVBFX0ZJRUxEU18ubGVuZ3RoOyBpKyspIHsKICAgIGtleSA9IGdvb2cuZGVmaW5lQ2xhc3MuT0JKRUNUX1BST1RPVFlQRV9GSUVMRFNfW2ldOwogICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzb3VyY2UsIGtleSkpIHsKICAgICAgdGFyZ2V0W2tleV0gPSBzb3VyY2Vba2V5XTsKICAgIH0KICB9Cn07CgoKLyoqCiAqIFNlYWxpbmcgY2xhc3NlcyBicmVha3MgdGhlIG9sZGVyIGlkaW9tIG9mIGFzc2lnbmluZyBwcm9wZXJ0aWVzIG9uIHRoZQogKiBwcm90b3R5cGUgcmF0aGVyIHRoYW4gaW4gdGhlIGNvbnN0cnVjdG9yLiBBcyBzdWNoLCBnb29nLmRlZmluZUNsYXNzCiAqIG11c3Qgbm90IHNlYWwgc3ViY2xhc3NlcyBvZiB0aGVzZSBvbGQtc3R5bGUgY2xhc3NlcyB1bnRpbCB0aGV5IGFyZSBmaXhlZC4KICogVW50aWwgdGhlbiwgdGhpcyBtYXJrcyBhIGNsYXNzIGFzICJicm9rZW4iLCBpbnN0cnVjdGluZyBkZWZpbmVDbGFzcwogKiBub3QgdG8gc2VhbCBzdWJjbGFzc2VzLgogKiBAcGFyYW0geyFGdW5jdGlvbn0gY3RyIFRoZSBsZWdhY3kgY29uc3RydWN0b3IgdG8gdGFnIGFzIHVuc2VhbGFibGUuCiAqLwpnb29nLnRhZ1Vuc2VhbGFibGVDbGFzcyA9IGZ1bmN0aW9uKGN0cikgewogIGlmICghQ09NUElMRUQgJiYgZ29vZy5kZWZpbmVDbGFzcy5TRUFMX0NMQVNTX0lOU1RBTkNFUykgewogICAgY3RyLnByb3RvdHlwZVtnb29nLlVOU0VBTEFCTEVfQ09OU1RSVUNUT1JfUFJPUEVSVFlfXSA9IHRydWU7CiAgfQp9OwoKCi8qKgogKiBOYW1lIGZvciB1bnNlYWxhYmxlIHRhZyBwcm9wZXJ0eS4KICogQGNvbnN0IEBwcml2YXRlIHtzdHJpbmd9CiAqLwpnb29nLlVOU0VBTEFCTEVfQ09OU1RSVUNUT1JfUFJPUEVSVFlfID0gJ2dvb2dfZGVmaW5lQ2xhc3NfbGVnYWN5X3Vuc2VhbGFibGUnOwoKCi8vIFRoZXJlJ3MgYSBidWcgaW4gdGhlIGNvbXBpbGVyIHdoZXJlIHdpdGhvdXQgY29sbGFwc2UgcHJvcGVydGllcyB0aGUKLy8gQ2xvc3VyZSBuYW1lc3BhY2UgZGVmaW5lcyBkbyBub3QgZ3VhcmQgY29kZSBjb3JyZWN0bHkuIFRvIGhlbHAgcmVkdWNlIGNvZGUKLy8gc2l6ZSBhbHNvIGNoZWNrIGZvciAhQ09NUElMRUQgZXZlbiB0aG91Z2ggaXQgcmVkdW5kYW50IHVudGlsIHRoaXMgaXMgZml4ZWQuCmlmICghQ09NUElMRUQgJiYgZ29vZy5ERVBFTkRFTkNJRVNfRU5BQkxFRCkgewoKICAvKioKICAgKiBUcmllcyB0byBkZXRlY3Qgd2hldGhlciBpcyBpbiB0aGUgY29udGV4dCBvZiBhbiBIVE1MIGRvY3VtZW50LgogICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgaXQgbG9va3MgbGlrZSBIVE1MIGRvY3VtZW50LgogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5pbkh0bWxEb2N1bWVudF8gPSBmdW5jdGlvbigpIHsKICAgIC8qKiBAdHlwZSB7IURvY3VtZW50fSAqLwogICAgdmFyIGRvYyA9IGdvb2cuZ2xvYmFsLmRvY3VtZW50OwogICAgcmV0dXJuIGRvYyAhPSBudWxsICYmICd3cml0ZScgaW4gZG9jOyAgLy8gWFVMRG9jdW1lbnQgbWlzc2VzIHdyaXRlLgogIH07CgoKICAvKioKICAgKiBXZSdkIGxpa2UgdG8gY2hlY2sgZm9yIGlmIHRoZSBkb2N1bWVudCByZWFkeVN0YXRlIGlzICdsb2FkaW5nJzsgaG93ZXZlcgogICAqIHRoZXJlIGFyZSBidWdzIG9uIElFIDEwIGFuZCBiZWxvdyB3aGVyZSB0aGUgcmVhZHlTdGF0ZSBiZWluZyBhbnl0aGluZyBvdGhlcgogICAqIHRoYW4gJ2NvbXBsZXRlJyBpcyBub3QgcmVsaWFibGUuCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuaXNEb2N1bWVudExvYWRpbmdfID0gZnVuY3Rpb24oKSB7CiAgICAvLyBhdHRhY2hFdmVudCBpcyBhdmFpbGFibGUgb24gSUUgNiB0aHJ1IDEwIG9ubHksIGFuZCB0aHVzIGNhbiBiZSB1c2VkIHRvCiAgICAvLyBkZXRlY3QgdGhvc2UgYnJvd3NlcnMuCiAgICAvKiogQHR5cGUgeyFIVE1MRG9jdW1lbnR9ICovCiAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CiAgICByZXR1cm4gZG9jLmF0dGFjaEV2ZW50ID8gZG9jLnJlYWR5U3RhdGUgIT0gJ2NvbXBsZXRlJyA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jLnJlYWR5U3RhdGUgPT0gJ2xvYWRpbmcnOwogIH07CgoKICAvKioKICAgKiBUcmllcyB0byBkZXRlY3QgdGhlIGJhc2UgcGF0aCBvZiBiYXNlLmpzIHNjcmlwdCB0aGF0IGJvb3RzdHJhcHMgQ2xvc3VyZS4KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuZmluZEJhc2VQYXRoXyA9IGZ1bmN0aW9uKCkgewogICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfQkFTRV9QQVRIICE9IHVuZGVmaW5lZCAmJgogICAgICAgIC8vIEFudGkgRE9NLWNsb2JiZXJpbmcgcnVudGltZSBjaGVjayAoYi8zNzczNjU3NikuCiAgICAgICAgdHlwZW9mIGdvb2cuZ2xvYmFsLkNMT1NVUkVfQkFTRV9QQVRIID09PSAnc3RyaW5nJykgewogICAgICBnb29nLmJhc2VQYXRoID0gZ29vZy5nbG9iYWwuQ0xPU1VSRV9CQVNFX1BBVEg7CiAgICAgIHJldHVybjsKICAgIH0gZWxzZSBpZiAoIWdvb2cuaW5IdG1sRG9jdW1lbnRfKCkpIHsKICAgICAgcmV0dXJuOwogICAgfQogICAgLyoqIEB0eXBlIHshRG9jdW1lbnR9ICovCiAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CiAgICAvLyBJZiB3ZSBoYXZlIGEgY3VycmVudFNjcmlwdCBhdmFpbGFibGUsIHVzZSBpdCBleGNsdXNpdmVseS4KICAgIHZhciBjdXJyZW50U2NyaXB0ID0gZG9jLmN1cnJlbnRTY3JpcHQ7CiAgICBpZiAoY3VycmVudFNjcmlwdCkgewogICAgICB2YXIgc2NyaXB0cyA9IFtjdXJyZW50U2NyaXB0XTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBzY3JpcHRzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdTQ1JJUFQnKTsKICAgIH0KICAgIC8vIFNlYXJjaCBiYWNrd2FyZHMgc2luY2UgdGhlIGN1cnJlbnQgc2NyaXB0IGlzIGluIGFsbW9zdCBhbGwgY2FzZXMgdGhlIG9uZQogICAgLy8gdGhhdCBoYXMgYmFzZS5qcy4KICAgIGZvciAodmFyIGkgPSBzY3JpcHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgIHZhciBzY3JpcHQgPSAvKiogQHR5cGUgeyFIVE1MU2NyaXB0RWxlbWVudH0gKi8gKHNjcmlwdHNbaV0pOwogICAgICB2YXIgc3JjID0gc2NyaXB0LnNyYzsKICAgICAgdmFyIHFtYXJrID0gc3JjLmxhc3RJbmRleE9mKCc/Jyk7CiAgICAgIHZhciBsID0gcW1hcmsgPT0gLTEgPyBzcmMubGVuZ3RoIDogcW1hcms7CiAgICAgIGlmIChzcmMuc3Vic3RyKGwgLSA3LCA3KSA9PSAnYmFzZS5qcycpIHsKICAgICAgICBnb29nLmJhc2VQYXRoID0gc3JjLnN1YnN0cigwLCBsIC0gNyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICB9CiAgfTsKCiAgZ29vZy5maW5kQmFzZVBhdGhfKCk7CgogIC8qKiBAc3RydWN0IEBjb25zdHJ1Y3RvciBAZmluYWwgKi8KICBnb29nLlRyYW5zcGlsZXIgPSBmdW5jdGlvbigpIHsKICAgIC8qKiBAcHJpdmF0ZSB7P09iamVjdDxzdHJpbmcsIGJvb2xlYW4+fSAqLwogICAgdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fID0gbnVsbDsKICAgIC8qKiBAcHJpdmF0ZSB7c3RyaW5nfSAqLwogICAgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0XyA9IGdvb2cuVFJBTlNQSUxFX1RPX0xBTkdVQUdFOwogIH07CgoKICAvKioKICAgKiBSZXR1cm5zIGEgbmV3bHkgY3JlYXRlZCBtYXAgZnJvbSBsYW5ndWFnZSBtb2RlIHN0cmluZyB0byBhIGJvb2xlYW4KICAgKiBpbmRpY2F0aW5nIHdoZXRoZXIgdHJhbnNwaWxhdGlvbiBzaG91bGQgYmUgZG9uZSBmb3IgdGhhdCBtb2RlIGFzIHdlbGwgYXMKICAgKiB0aGUgaGlnaGVzdCBsZXZlbCBsYW5ndWFnZSB0aGF0IHRoaXMgZW52aXJvbm1lbnQgc3VwcG9ydHMuCiAgICoKICAgKiBHdWFyYW50ZWVkIGludmFyaWFudDoKICAgKiBGb3IgYW55IHR3byBtb2RlcywgbDEgYW5kIGwyIHdoZXJlIGwyIGlzIGEgbmV3ZXIgbW9kZSB0aGFuIGwxLAogICAqIGBtYXBbbDFdID09IHRydWVgIGltcGxpZXMgdGhhdCBgbWFwW2wyXSA9PSB0cnVlYC4KICAgKgogICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgZXh0cmFjdGVkIGFuZCB1c2VkIGVsc2V3aGVyZSwgc28gaXQgY2Fubm90IHJlbHkgb24KICAgKiBhbnl0aGluZyBleHRlcm5hbCAoaXQgc2hvdWxkIGVhc2lseSBiZSBhYmxlIHRvIGJlIHRyYW5zZm9ybWVkIGludG8gYQogICAqIHN0YW5kYWxvbmUsIHRvcCBsZXZlbCBmdW5jdGlvbikuCiAgICoKICAgKiBAcHJpdmF0ZQogICAqIEByZXR1cm4ge3sKICAgKiAgIHRhcmdldDogc3RyaW5nLAogICAqICAgbWFwOiAhT2JqZWN0PHN0cmluZywgYm9vbGVhbj4KICAgKiB9fQogICAqLwogIGdvb2cuVHJhbnNwaWxlci5wcm90b3R5cGUuY3JlYXRlUmVxdWlyZXNUcmFuc3BpbGF0aW9uXyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHRyYW5zcGlsYXRpb25UYXJnZXQgPSAnZXMzJzsKICAgIHZhciAvKiogIU9iamVjdDxzdHJpbmcsIGJvb2xlYW4+ICovIHJlcXVpcmVzVHJhbnNwaWxhdGlvbiA9IHsnZXMzJzogZmFsc2V9OwogICAgdmFyIHRyYW5zcGlsYXRpb25SZXF1aXJlZEZvckFsbExhdGVyTW9kZXMgPSBmYWxzZTsKCiAgICAvKioKICAgICAqIEFkZHMgYW4gZW50cnkgdG8gcmVxdWlyZXNUcmFuc3BsaWF0aW9uIGZvciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgbW9kZS4KICAgICAqCiAgICAgKiBJTVBPUlRBTlQ6IENhbGxzIG11c3QgYmUgbWFkZSBpbiBvcmRlciBmcm9tIG9sZGVzdCB0byBuZXdlc3QgbGFuZ3VhZ2UKICAgICAqIG1vZGUuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kZU5hbWUKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKTogYm9vbGVhbn0gaXNTdXBwb3J0ZWQgUmV0dXJucyB0cnVlIGlmIHRoZSBKUyBlbmdpbmUKICAgICAqICAgICBzdXBwb3J0cyB0aGUgZ2l2ZW4gbW9kZS4KICAgICAqLwogICAgZnVuY3Rpb24gYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjayhtb2RlTmFtZSwgaXNTdXBwb3J0ZWQpIHsKICAgICAgaWYgKHRyYW5zcGlsYXRpb25SZXF1aXJlZEZvckFsbExhdGVyTW9kZXMpIHsKICAgICAgICByZXF1aXJlc1RyYW5zcGlsYXRpb25bbW9kZU5hbWVdID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmIChpc1N1cHBvcnRlZCgpKSB7CiAgICAgICAgdHJhbnNwaWxhdGlvblRhcmdldCA9IG1vZGVOYW1lOwogICAgICAgIHJlcXVpcmVzVHJhbnNwaWxhdGlvblttb2RlTmFtZV0gPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXF1aXJlc1RyYW5zcGlsYXRpb25bbW9kZU5hbWVdID0gdHJ1ZTsKICAgICAgICB0cmFuc3BpbGF0aW9uUmVxdWlyZWRGb3JBbGxMYXRlck1vZGVzID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRG9lcyB0aGUgZ2l2ZW4gY29kZSBldmFsdWF0ZSB3aXRob3V0IHN5bnRheCBlcnJvcnMgYW5kIHJldHVybiBhIHRydXRoeQogICAgICogcmVzdWx0PwogICAgICovCiAgICBmdW5jdGlvbiAvKiogYm9vbGVhbiAqLyBldmFsQ2hlY2soLyoqIHN0cmluZyAqLyBjb2RlKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuICEhZXZhbChjb2RlKTsKICAgICAgfSBjYXRjaCAoaWdub3JlZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHZhciB1c2VyQWdlbnQgPSBnb29nLmdsb2JhbC5uYXZpZ2F0b3IgJiYgZ29vZy5nbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudCA/CiAgICAgICAgZ29vZy5nbG9iYWwubmF2aWdhdG9yLnVzZXJBZ2VudCA6CiAgICAgICAgJyc7CgogICAgLy8gSWRlbnRpZnkgRVMzLW9ubHkgYnJvd3NlcnMgYnkgdGhlaXIgaW5jb3JyZWN0IHRyZWF0bWVudCBvZiBjb21tYXMuCiAgICBhZGROZXdlckxhbmd1YWdlVHJhbnNwaWxhdGlvbkNoZWNrKCdlczUnLCBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGV2YWxDaGVjaygnWzEsXS5sZW5ndGg9PTEnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM2JywgZnVuY3Rpb24oKSB7CiAgICAgIC8vIEVkZ2UgaGFzIGEgbm9uLWRldGVybWluaXN0aWMgKGkuZS4sIG5vdCByZXByb2R1Y2libGUpIGJ1ZyB3aXRoIEVTNjoKICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9DaGFrcmFDb3JlL2lzc3Vlcy8xNDk2LgogICAgICB2YXIgcmUgPSAvRWRnZVwvKFxkKykoXC5cZCkqL2k7CiAgICAgIHZhciBlZGdlVXNlckFnZW50ID0gdXNlckFnZW50Lm1hdGNoKHJlKTsKICAgICAgaWYgKGVkZ2VVc2VyQWdlbnQpIHsKICAgICAgICAvLyBUaGUgUmVmbGVjdC5jb25zdHJ1Y3QgdGVzdCBiZWxvdyBpcyBmbGFreSBvbiBFZGdlLiBJdCBjYW4gc29tZXRpbWVzCiAgICAgICAgLy8gcGFzcyBvciBmYWlsIG9uIDQwIDE1LjE1MDYzLCBzbyBqdXN0IGV4aXQgZWFybHkgZm9yIEVkZ2UgYW5kIHRyZWF0CiAgICAgICAgLy8gaXQgYXMgRVM1LiBVbnRpbCB3ZSdyZSBvbiBhIG1vcmUgdXAgdG8gZGF0ZSB2ZXJzaW9uIGp1c3QgYWx3YXlzIHVzZQogICAgICAgIC8vIEVTNS4gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvQ2hha3JhQ29yZS9pc3N1ZXMvMzIxNy4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgLy8gVGVzdCBlczY6IFtGRjUwICg/KSwgRWRnZSAxNCAoPyksIENocm9tZSA1MF0KICAgICAgLy8gICAoYSkgZGVmYXVsdCBwYXJhbXMgKHNwZWNpZmljYWxseSBzaGFkb3dpbmcgbG9jYWxzKSwKICAgICAgLy8gICAoYikgZGVzdHJ1Y3R1cmluZywgKGMpIGJsb2NrLXNjb3BlZCBmdW5jdGlvbnMsCiAgICAgIC8vICAgKGQpIGZvci1vZiAoY29uc3QpLCAoZSkgbmV3LnRhcmdldC9SZWZsZWN0LmNvbnN0cnVjdAogICAgICB2YXIgZXM2ZnVsbFRlc3QgPQogICAgICAgICAgJ2NsYXNzIFh7Y29uc3RydWN0b3IoKXtpZihuZXcudGFyZ2V0IT1TdHJpbmcpdGhyb3cgMTt0aGlzLng9NDJ9fScgKwogICAgICAgICAgJ2xldCBxPVJlZmxlY3QuY29uc3RydWN0KFgsW10sU3RyaW5nKTtpZihxLnghPTQyfHwhKHEgaW5zdGFuY2VvZiAnICsKICAgICAgICAgICdTdHJpbmcpKXRocm93IDE7Zm9yKGNvbnN0IGEgb2ZbMiwzXSl7aWYoYT09Miljb250aW51ZTtmdW5jdGlvbiAnICsKICAgICAgICAgICdmKHo9e2F9KXtsZXQgYT0wO3JldHVybiB6LmF9e2Z1bmN0aW9uIGYoKXtyZXR1cm4gMDt9fXJldHVybiBmKCknICsKICAgICAgICAgICc9PTN9JzsKCiAgICAgIHJldHVybiBldmFsQ2hlY2soJygoKT0+eyJ1c2Ugc3RyaWN0IjsnICsgZXM2ZnVsbFRlc3QgKyAnfSkoKScpOwogICAgfSk7CiAgICAvLyAqKiBhbmQgKio9IGFyZSB0aGUgb25seSBuZXcgZmVhdHVyZXMgaW4gJ2VzNycKICAgIGFkZE5ld2VyTGFuZ3VhZ2VUcmFuc3BpbGF0aW9uQ2hlY2soJ2VzNycsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZXZhbENoZWNrKCcyICoqIDIgPT0gNCcpOwogICAgfSk7CiAgICAvLyBhc3luYyBmdW5jdGlvbnMgYXJlIHRoZSBvbmx5IG5ldyBmZWF0dXJlcyBpbiAnZXM4JwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM4JywgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBldmFsQ2hlY2soJ2FzeW5jICgpID0+IDEsIHRydWUnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXM5JywgZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBldmFsQ2hlY2soJyh7Li4ucmVzdH0gPSB7fSksIHRydWUnKTsKICAgIH0pOwogICAgYWRkTmV3ZXJMYW5ndWFnZVRyYW5zcGlsYXRpb25DaGVjaygnZXNfbmV4dCcsIGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gZmFsc2U7ICAvLyBhc3N1bWUgaXQgYWx3YXlzIG5lZWQgdG8gdHJhbnNwaWxlCiAgICB9KTsKICAgIHJldHVybiB7dGFyZ2V0OiB0cmFuc3BpbGF0aW9uVGFyZ2V0LCBtYXA6IHJlcXVpcmVzVHJhbnNwaWxhdGlvbn07CiAgfTsKCgogIC8qKgogICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gbGFuZ3VhZ2UgbmVlZHMgdG8gYmUgdHJhbnNwaWxlZC4KICAgKiBAcGFyYW0ge3N0cmluZ30gbGFuZwogICAqIEBwYXJhbSB7c3RyaW5nfHVuZGVmaW5lZH0gbW9kdWxlCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKi8KICBnb29nLlRyYW5zcGlsZXIucHJvdG90eXBlLm5lZWRzVHJhbnNwaWxlID0gZnVuY3Rpb24obGFuZywgbW9kdWxlKSB7CiAgICBpZiAoZ29vZy5UUkFOU1BJTEUgPT0gJ2Fsd2F5cycpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgaWYgKGdvb2cuVFJBTlNQSUxFID09ICduZXZlcicpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSBlbHNlIGlmICghdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fKSB7CiAgICAgIHZhciBvYmogPSB0aGlzLmNyZWF0ZVJlcXVpcmVzVHJhbnNwaWxhdGlvbl8oKTsKICAgICAgdGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fID0gb2JqLm1hcDsKICAgICAgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0XyA9IHRoaXMudHJhbnNwaWxhdGlvblRhcmdldF8gfHwgb2JqLnRhcmdldDsKICAgIH0KICAgIGlmIChsYW5nIGluIHRoaXMucmVxdWlyZXNUcmFuc3BpbGF0aW9uXykgewogICAgICBpZiAodGhpcy5yZXF1aXJlc1RyYW5zcGlsYXRpb25fW2xhbmddKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gZWxzZSBpZiAoCiAgICAgICAgICBnb29nLmluSHRtbERvY3VtZW50XygpICYmIG1vZHVsZSA9PSAnZXM2JyAmJgogICAgICAgICAgISgnbm9Nb2R1bGUnIGluIGdvb2cuZ2xvYmFsLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGxhbmd1YWdlIG1vZGU6ICcgKyBsYW5nKTsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogTGF6aWx5IHJldHJpZXZlcyB0aGUgdHJhbnNwaWxlciBhbmQgYXBwbGllcyBpdCB0byB0aGUgc291cmNlLgogICAqIEBwYXJhbSB7c3RyaW5nfSBjb2RlIEpTIGNvZGUuCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0byB0aGUgY29kZS4KICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSB0cmFuc3BpbGVkIGNvZGUuCiAgICovCiAgZ29vZy5UcmFuc3BpbGVyLnByb3RvdHlwZS50cmFuc3BpbGUgPSBmdW5jdGlvbihjb2RlLCBwYXRoKSB7CiAgICAvLyBUT0RPKGpvaG5wbGFpc3RlZCk6IFdlIHNob3VsZCBkZWxldGUgZ29vZy50cmFuc3BpbGVfIGFuZCBqdXN0IGhhdmUgdGhpcwogICAgLy8gZnVuY3Rpb24uIEJ1dCB0aGVyZSdzIHNvbWUgY29tcGlsZSBlcnJvciBhdG0gd2hlcmUgZ29vZy5nbG9iYWwgaXMgYmVpbmcKICAgIC8vIHN0cmlwcGVkIGluY29ycmVjdGx5IHdpdGhvdXQgdGhpcy4KICAgIHJldHVybiBnb29nLnRyYW5zcGlsZV8oY29kZSwgcGF0aCwgdGhpcy50cmFuc3BpbGF0aW9uVGFyZ2V0Xyk7CiAgfTsKCgogIC8qKiBAcHJpdmF0ZSBAZmluYWwgeyFnb29nLlRyYW5zcGlsZXJ9ICovCiAgZ29vZy50cmFuc3BpbGVyXyA9IG5ldyBnb29nLlRyYW5zcGlsZXIoKTsKCiAgLyoqCiAgICogUmV3cml0ZXMgY2xvc2luZyBzY3JpcHQgdGFncyBpbiBpbnB1dCB0byBhdm9pZCBlbmRpbmcgYW4gZW5jbG9zaW5nIHNjcmlwdAogICAqIHRhZy4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLnByb3RlY3RTY3JpcHRUYWdfID0gZnVuY3Rpb24oc3RyKSB7CiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLzxcLyhTQ1JJUFQpL2lnLCAnXFx4M2MvJDEnKTsKICB9OwoKCiAgLyoqCiAgICogQSBkZWJ1ZyBsb2FkZXIgaXMgcmVzcG9uc2libGUgZm9yIGRvd25sb2FkaW5nIGFuZCBleGVjdXRpbmcgamF2YXNjcmlwdAogICAqIGZpbGVzIGluIGFuIHVuYnVuZGxlZCwgdW5jb21waWxlZCBlbnZpcm9ubWVudC4KICAgKgogICAqIFRoaXMgY2FuIGJlIGN1c3RpbWl6ZWQgdmlhIHRoZSBzZXREZXBlbmRlbmN5RmFjdG9yeSBtZXRob2QsIG9yIGJ5CiAgICogQ0xPU1VSRV9JTVBPUlRfU0NSSVBUL0NMT1NVUkVfTE9BRF9GSUxFX1NZTkMuCiAgICoKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvciBAZmluYWwgQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXyA9IGZ1bmN0aW9uKCkgewogICAgLyoqIEBwcml2YXRlIEBjb25zdCB7IU9iamVjdDxzdHJpbmcsICFnb29nLkRlcGVuZGVuY3k+fSAqLwogICAgdGhpcy5kZXBlbmRlbmNpZXNfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gKi8KICAgIHRoaXMuaWRUb1BhdGhfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgYm9vbGVhbj59ICovCiAgICB0aGlzLndyaXR0ZW5fID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshQXJyYXk8IWdvb2cuRGVwZW5kZW5jeT59ICovCiAgICB0aGlzLmxvYWRpbmdEZXBzXyA9IFtdOwogICAgLyoqIEBwcml2YXRlIHshQXJyYXk8IWdvb2cuRGVwZW5kZW5jeT59ICovCiAgICB0aGlzLmRlcHNUb0xvYWRfID0gW107CiAgICAvKiogQHByaXZhdGUge2Jvb2xlYW59ICovCiAgICB0aGlzLnBhdXNlZF8gPSBmYWxzZTsKICAgIC8qKiBAcHJpdmF0ZSB7IWdvb2cuRGVwZW5kZW5jeUZhY3Rvcnl9ICovCiAgICB0aGlzLmZhY3RvcnlfID0gbmV3IGdvb2cuRGVwZW5kZW5jeUZhY3RvcnkoZ29vZy50cmFuc3BpbGVyXyk7CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgIUZ1bmN0aW9uPn0gKi8KICAgIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfID0ge307CiAgICAvKiogQHByaXZhdGUgQGNvbnN0IHshQXJyYXk8c3RyaW5nPn0gKi8KICAgIHRoaXMuZGVmZXJyZWRRdWV1ZV8gPSBbXTsKICB9OwoKICAvKioKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBuYW1lc3BhY2VzCiAgICogQHBhcmFtIHtmdW5jdGlvbigpOiB1bmRlZmluZWR9IGNhbGxiYWNrIEZ1bmN0aW9uIHRvIGNhbGwgb25jZSBhbGwgdGhlCiAgICogICAgIG5hbWVzcGFjZXMgaGF2ZSBsb2FkZWQuCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmJvb3RzdHJhcCA9IGZ1bmN0aW9uKG5hbWVzcGFjZXMsIGNhbGxiYWNrKSB7CiAgICB2YXIgY2IgPSBjYWxsYmFjazsKICAgIGZ1bmN0aW9uIHJlc29sdmUoKSB7CiAgICAgIGlmIChjYikgewogICAgICAgIGdvb2cuZ2xvYmFsLnNldFRpbWVvdXQoY2IsIDApOwogICAgICAgIGNiID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGlmICghbmFtZXNwYWNlcy5sZW5ndGgpIHsKICAgICAgcmVzb2x2ZSgpOwogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGRlcHMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmFtZXNwYWNlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aEZyb21EZXBzXyhuYW1lc3BhY2VzW2ldKTsKICAgICAgaWYgKCFwYXRoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnJlZ29uaXplZCBuYW1lc3BhY2U6ICcgKyBuYW1lc3BhY2VzW2ldKTsKICAgICAgfQogICAgICBkZXBzLnB1c2godGhpcy5kZXBlbmRlbmNpZXNfW3BhdGhdKTsKICAgIH0KCiAgICB2YXIgcmVxdWlyZSA9IGdvb2cucmVxdWlyZTsKICAgIHZhciBsb2FkZWQgPSAwOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lc3BhY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHJlcXVpcmUobmFtZXNwYWNlc1tpXSk7CiAgICAgIGRlcHNbaV0ub25Mb2FkKGZ1bmN0aW9uKCkgewogICAgICAgIGlmICgrK2xvYWRlZCA9PSBuYW1lc3BhY2VzLmxlbmd0aCkgewogICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIExvYWRzIHRoZSBDbG9zdXJlIERlcGVuZGVuY3kgZmlsZS4KICAgKgogICAqIEV4cG9zZWQgYSBwdWJsaWMgZnVuY3Rpb24gc28gQ0xPU1VSRV9OT19ERVBTIGNhbiBiZSBzZXQgdG8gZmFsc2UsIGJhc2UKICAgKiBsb2FkZWQsIHNldERlcGVuZGVuY3lGYWN0b3J5IGNhbGxlZCwgYW5kIHRoZW4gdGhpcyBjYWxsZWQuIGkuZS4gYWxsb3dzCiAgICogY3VzdG9tIGxvYWRpbmcgb2YgdGhlIGRlcHMgZmlsZS4KICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZENsb3N1cmVEZXBzID0gZnVuY3Rpb24oKSB7CiAgICAvLyBDaXJjdW12ZW50IGFkZERlcGVuZGVuY3ksIHdoaWNoIHdvdWxkIHRyeSB0byB0cmFuc3BpbGUgZGVwcy5qcyBpZgogICAgLy8gdHJhbnNwaWxlIGlzIHNldCB0byBhbHdheXMuCiAgICB2YXIgcmVsUGF0aCA9ICdkZXBzLmpzJzsKICAgIHRoaXMuZGVwc1RvTG9hZF8ucHVzaCh0aGlzLmZhY3RvcnlfLmNyZWF0ZURlcGVuZGVuY3koCiAgICAgICAgZ29vZy5ub3JtYWxpemVQYXRoXyhnb29nLmJhc2VQYXRoICsgcmVsUGF0aCksIHJlbFBhdGgsIFtdLCBbXSwge30sCiAgICAgICAgZmFsc2UpKTsKICAgIHRoaXMubG9hZERlcHNfKCk7CiAgfTsKCgogIC8qKgogICAqIE5vdGlmaWVzIHRoZSBkZWJ1ZyBsb2FkZXIgd2hlbiBhIGRlcGVuZGVuY3kgaGFzIGJlZW4gcmVxdWVzdGVkLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGFic1BhdGhPcklkIFBhdGggb2YgdGhlIGRlcGVuZGVuY3kgb3IgZ29vZyBpZC4KICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfZm9yY2UKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUucmVxdWVzdGVkID0gZnVuY3Rpb24oYWJzUGF0aE9ySWQsIG9wdF9mb3JjZSkgewogICAgdmFyIHBhdGggPSB0aGlzLmdldFBhdGhGcm9tRGVwc18oYWJzUGF0aE9ySWQpOwogICAgaWYgKHBhdGggJiYKICAgICAgICAob3B0X2ZvcmNlIHx8IHRoaXMuYXJlRGVwc0xvYWRlZF8odGhpcy5kZXBlbmRlbmNpZXNfW3BhdGhdLnJlcXVpcmVzKSkpIHsKICAgICAgdmFyIGNhbGxiYWNrID0gdGhpcy5kZWZlcnJlZENhbGxiYWNrc19bcGF0aF07CiAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgIGRlbGV0ZSB0aGlzLmRlZmVycmVkQ2FsbGJhY2tzX1twYXRoXTsKICAgICAgICBjYWxsYmFjaygpOwogICAgICB9CiAgICB9CiAgfTsKCgogIC8qKgogICAqIFNldHMgdGhlIGRlcGVuZGVuY3kgZmFjdG9yeSwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGN1c3RvbQogICAqIGdvb2cuRGVwZW5kZW5jeSBpbXBsZW1lbnRhdGlvbnMgdG8gY29udHJvbCBob3cgZGVwZW5kZW5jaWVzIGFyZSBsb2FkZWQuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3lGYWN0b3J5fSBmYWN0b3J5CiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnNldERlcGVuZGVuY3lGYWN0b3J5ID0gZnVuY3Rpb24oZmFjdG9yeSkgewogICAgdGhpcy5mYWN0b3J5XyA9IGZhY3Rvcnk7CiAgfTsKCgogIC8qKgogICAqIFRyYXZzZXJzZXMgdGhlIGRlcGVuZGVuY3kgZ3JhcGggYW5kIHF1ZXVlcyB0aGUgZ2l2ZW4gZGVwZW5kZW5jeSwgYW5kIGFsbCBvZgogICAqIGl0cyB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcywgZm9yIGxvYWRpbmcgYW5kIHRoZW4gc3RhcnRzIGxvYWRpbmcgaWYgbm90CiAgICogcGF1c2VkLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWRfID0gZnVuY3Rpb24obmFtZXNwYWNlKSB7CiAgICBpZiAoIXRoaXMuZ2V0UGF0aEZyb21EZXBzXyhuYW1lc3BhY2UpKSB7CiAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSAnZ29vZy5yZXF1aXJlIGNvdWxkIG5vdCBmaW5kOiAnICsgbmFtZXNwYWNlOwoKICAgICAgZ29vZy5sb2dUb0NvbnNvbGVfKGVycm9yTWVzc2FnZSk7CiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7CiAgICB9IGVsc2UgewogICAgICB2YXIgbG9hZGVyID0gdGhpczsKCiAgICAgIHZhciBkZXBzID0gW107CgogICAgICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVzcGFjZSAqLwogICAgICB2YXIgdmlzaXQgPSBmdW5jdGlvbihuYW1lc3BhY2UpIHsKICAgICAgICB2YXIgcGF0aCA9IGxvYWRlci5nZXRQYXRoRnJvbURlcHNfKG5hbWVzcGFjZSk7CgogICAgICAgIGlmICghcGF0aCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCYWQgZGVwZW5kZW5jeSBwYXRoIG9yIHN5bWJvbDogJyArIG5hbWVzcGFjZSk7CiAgICAgICAgfQoKICAgICAgICBpZiAobG9hZGVyLndyaXR0ZW5fW3BhdGhdKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBsb2FkZXIud3JpdHRlbl9bcGF0aF0gPSB0cnVlOwoKICAgICAgICB2YXIgZGVwID0gbG9hZGVyLmRlcGVuZGVuY2llc19bcGF0aF07CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZXAucmVxdWlyZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmICghZ29vZy5pc1Byb3ZpZGVkXyhkZXAucmVxdWlyZXNbaV0pKSB7CiAgICAgICAgICAgIHZpc2l0KGRlcC5yZXF1aXJlc1tpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBkZXBzLnB1c2goZGVwKTsKICAgICAgfTsKCiAgICAgIHZpc2l0KG5hbWVzcGFjZSk7CgogICAgICB2YXIgd2FzTG9hZGluZyA9ICEhdGhpcy5kZXBzVG9Mb2FkXy5sZW5ndGg7CiAgICAgIHRoaXMuZGVwc1RvTG9hZF8gPSB0aGlzLmRlcHNUb0xvYWRfLmNvbmNhdChkZXBzKTsKCiAgICAgIGlmICghdGhpcy5wYXVzZWRfICYmICF3YXNMb2FkaW5nKSB7CiAgICAgICAgdGhpcy5sb2FkRGVwc18oKTsKICAgICAgfQogICAgfQogIH07CgoKICAvKioKICAgKiBMb2FkcyBhbnkgcXVldWVkIGRlcGVuZGVuY2llcyB1bnRpbCB0aGV5IGFyZSBhbGwgbG9hZGVkIG9yIHBhdXNlZC4KICAgKgogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWREZXBzXyA9IGZ1bmN0aW9uKCkgewogICAgdmFyIGxvYWRlciA9IHRoaXM7CiAgICB2YXIgcGF1c2VkID0gdGhpcy5wYXVzZWRfOwoKICAgIHdoaWxlICh0aGlzLmRlcHNUb0xvYWRfLmxlbmd0aCAmJiAhcGF1c2VkKSB7CiAgICAgIChmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbG9hZENhbGxEb25lID0gZmFsc2U7CiAgICAgICAgdmFyIGRlcCA9IGxvYWRlci5kZXBzVG9Mb2FkXy5zaGlmdCgpOwoKICAgICAgICB2YXIgbG9hZGVkID0gZmFsc2U7CiAgICAgICAgbG9hZGVyLmxvYWRpbmdfKGRlcCk7CgogICAgICAgIHZhciBjb250cm9sbGVyID0gewogICAgICAgICAgcGF1c2U6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAobG9hZENhbGxEb25lKSB7CiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY2FsbCBwYXVzZSBhZnRlciB0aGUgY2FsbCB0byBsb2FkLicpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHBhdXNlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICByZXN1bWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAobG9hZENhbGxEb25lKSB7CiAgICAgICAgICAgICAgbG9hZGVyLnJlc3VtZV8oKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBTb21lIGRlcCBjYWxsZWQgcGF1c2UgYW5kIHRoZW4gcmVzdW1lIGluIHRoZSBzYW1lIGxvYWQgY2FsbC4KICAgICAgICAgICAgICAvLyBKdXN0IGtlZXAgcnVubmluZyB0aGlzIHNhbWUgbG9vcC4KICAgICAgICAgICAgICBwYXVzZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIGxvYWRlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmIChsb2FkZWQpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RvdWJsZSBjYWxsIHRvIGxvYWRlZC4nKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbG9hZGVkID0gdHJ1ZTsKICAgICAgICAgICAgbG9hZGVyLmxvYWRlZF8oZGVwKTsKICAgICAgICAgIH0sCiAgICAgICAgICBwZW5kaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gRGVmZW5zaXZlIGNvcHkuCiAgICAgICAgICAgIHZhciBwZW5kaW5nID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9hZGVyLmxvYWRpbmdEZXBzXy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIHBlbmRpbmcucHVzaChsb2FkZXIubG9hZGluZ0RlcHNfW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGVuZGluZzsKICAgICAgICAgIH0sCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEBwYXJhbSB7Z29vZy5Nb2R1bGVUeXBlfSB0eXBlCiAgICAgICAgICAgKi8KICAgICAgICAgIHNldE1vZHVsZVN0YXRlOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgICAgIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfID0gewogICAgICAgICAgICAgIHR5cGU6IHR5cGUsCiAgICAgICAgICAgICAgbW9kdWxlTmFtZTogJycsCiAgICAgICAgICAgICAgZGVjbGFyZUxlZ2FjeU5hbWVzcGFjZTogZmFsc2UKICAgICAgICAgICAgfTsKICAgICAgICAgIH0sCiAgICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgc3RyaW5nLCBzdHJpbmc9KX0gKi8KICAgICAgICAgIHJlZ2lzdGVyRXM2TW9kdWxlRXhwb3J0czogZnVuY3Rpb24oCiAgICAgICAgICAgICAgcGF0aCwgZXhwb3J0cywgb3B0X2Nsb3N1cmVOYW1lc3BhY2UpIHsKICAgICAgICAgICAgaWYgKG9wdF9jbG9zdXJlTmFtZXNwYWNlKSB7CiAgICAgICAgICAgICAgZ29vZy5sb2FkZWRNb2R1bGVzX1tvcHRfY2xvc3VyZU5hbWVzcGFjZV0gPSB7CiAgICAgICAgICAgICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICAgICAgICAgICAgdHlwZTogZ29vZy5Nb2R1bGVUeXBlLkVTNiwKICAgICAgICAgICAgICAgIG1vZHVsZUlkOiBvcHRfY2xvc3VyZU5hbWVzcGFjZSB8fCAnJwogICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCiAgICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKHN0cmluZywgPyl9ICovCiAgICAgICAgICByZWdpc3Rlckdvb2dNb2R1bGVFeHBvcnRzOiBmdW5jdGlvbihtb2R1bGVJZCwgZXhwb3J0cykgewogICAgICAgICAgICBnb29nLmxvYWRlZE1vZHVsZXNfW21vZHVsZUlkXSA9IHsKICAgICAgICAgICAgICBleHBvcnRzOiBleHBvcnRzLAogICAgICAgICAgICAgIHR5cGU6IGdvb2cuTW9kdWxlVHlwZS5HT09HLAogICAgICAgICAgICAgIG1vZHVsZUlkOiBtb2R1bGVJZAogICAgICAgICAgICB9OwogICAgICAgICAgfSwKICAgICAgICAgIGNsZWFyTW9kdWxlU3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBnb29nLm1vZHVsZUxvYWRlclN0YXRlXyA9IG51bGw7CiAgICAgICAgICB9LAogICAgICAgICAgZGVmZXI6IGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmIChsb2FkQ2FsbERvbmUpIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoCiAgICAgICAgICAgICAgICAgICdDYW5ub3QgcmVnaXN0ZXIgd2l0aCBkZWZlciBhZnRlciB0aGUgY2FsbCB0byBsb2FkLicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxvYWRlci5kZWZlcl8oZGVwLCBjYWxsYmFjayk7CiAgICAgICAgICB9LAogICAgICAgICAgYXJlRGVwc0xvYWRlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBsb2FkZXIuYXJlRGVwc0xvYWRlZF8oZGVwLnJlcXVpcmVzKTsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICB0cnkgewogICAgICAgICAgZGVwLmxvYWQoY29udHJvbGxlcik7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGxvYWRDYWxsRG9uZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9KSgpOwogICAgfQoKICAgIGlmIChwYXVzZWQpIHsKICAgICAgdGhpcy5wYXVzZV8oKTsKICAgIH0KICB9OwoKCiAgLyoqIEBwcml2YXRlICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnBhdXNlXyA9IGZ1bmN0aW9uKCkgewogICAgdGhpcy5wYXVzZWRfID0gdHJ1ZTsKICB9OwoKCiAgLyoqIEBwcml2YXRlICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLnJlc3VtZV8gPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLnBhdXNlZF8pIHsKICAgICAgdGhpcy5wYXVzZWRfID0gZmFsc2U7CiAgICAgIHRoaXMubG9hZERlcHNfKCk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIE1hcmtzIHRoZSBnaXZlbiBkZXBlbmRlbmN5IGFzIGxvYWRpbmcgKGxvYWQgaGFzIGJlZW4gY2FsbGVkIGJ1dCBpdCBoYXMgbm90CiAgICogeWV0IG1hcmtlZCBpdHNlbGYgYXMgZmluaXNoZWQpLiBVc2VmdWwgZm9yIGRlcGVuZGVuY2llcyB0aGF0IHdhbnQgdG8ga25vdwogICAqIHdoYXQgZWxzZSBpcyBsb2FkaW5nLiBFeGFtcGxlOiBnb29nLm1vZHVsZXMgY2Fubm90IGV2YWwgaWYgdGhlcmUgYXJlCiAgICogbG9hZGluZyBkZXBlbmRlbmNpZXMuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3l9IGRlcAogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmxvYWRpbmdfID0gZnVuY3Rpb24oZGVwKSB7CiAgICB0aGlzLmxvYWRpbmdEZXBzXy5wdXNoKGRlcCk7CiAgfTsKCgogIC8qKgogICAqIE1hcmtzIHRoZSBnaXZlbiBkZXBlbmRlbmN5IGFzIGhhdmluZyBmaW5pc2hlZCBsb2FkaW5nIGFuZCBiZWluZyBhdmFpbGFibGUKICAgKiBmb3IgcmVxdWlyZS4KICAgKgogICAqIEBwYXJhbSB7IWdvb2cuRGVwZW5kZW5jeX0gZGVwCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUubG9hZGVkXyA9IGZ1bmN0aW9uKGRlcCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxvYWRpbmdEZXBzXy5sZW5ndGg7IGkrKykgewogICAgICBpZiAodGhpcy5sb2FkaW5nRGVwc19baV0gPT0gZGVwKSB7CiAgICAgICAgdGhpcy5sb2FkaW5nRGVwc18uc3BsaWNlKGksIDEpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmRlZmVycmVkUXVldWVfLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICh0aGlzLmRlZmVycmVkUXVldWVfW2ldID09IGRlcC5wYXRoKSB7CiAgICAgICAgdGhpcy5kZWZlcnJlZFF1ZXVlXy5zcGxpY2UoaSwgMSk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAodGhpcy5sb2FkaW5nRGVwc18ubGVuZ3RoID09IHRoaXMuZGVmZXJyZWRRdWV1ZV8ubGVuZ3RoICYmCiAgICAgICAgIXRoaXMuZGVwc1RvTG9hZF8ubGVuZ3RoKSB7CiAgICAgIC8vIFNvbWV0aGluZyBoYXMgYXNrZWQgdG8gbG9hZCB0aGVzZSwgYnV0IHRoZXkgbWF5IG5vdCBiZSBkaXJlY3RseQogICAgICAvLyByZXF1aXJlZCBhZ2FpbiBsYXRlciwgc28gbG9hZCB0aGVtIG5vdyB0aGF0IHdlIGtub3cgd2UncmUgZG9uZSBsb2FkaW5nCiAgICAgIC8vIGV2ZXJ5dGhpbmcgZWxzZS4gZS5nLiBhIGdvb2cgbW9kdWxlIGVudHJ5IHBvaW50LgogICAgICB3aGlsZSAodGhpcy5kZWZlcnJlZFF1ZXVlXy5sZW5ndGgpIHsKICAgICAgICB0aGlzLnJlcXVlc3RlZCh0aGlzLmRlZmVycmVkUXVldWVfLnNoaWZ0KCksIHRydWUpOwogICAgICB9CiAgICB9CgogICAgZGVwLmxvYWRlZCgpOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwYXRoc09ySWRzCiAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGdvb2cuRGVidWdMb2FkZXJfLnByb3RvdHlwZS5hcmVEZXBzTG9hZGVkXyA9IGZ1bmN0aW9uKHBhdGhzT3JJZHMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0aHNPcklkcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcGF0aCA9IHRoaXMuZ2V0UGF0aEZyb21EZXBzXyhwYXRoc09ySWRzW2ldKTsKICAgICAgaWYgKCFwYXRoIHx8CiAgICAgICAgICAoIShwYXRoIGluIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfKSAmJgogICAgICAgICAgICFnb29nLmlzUHJvdmlkZWRfKHBhdGhzT3JJZHNbaV0pKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB0cnVlOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gYWJzUGF0aE9ySWQKICAgKiBAcmV0dXJuIHs/c3RyaW5nfQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmdldFBhdGhGcm9tRGVwc18gPSBmdW5jdGlvbihhYnNQYXRoT3JJZCkgewogICAgaWYgKGFic1BhdGhPcklkIGluIHRoaXMuaWRUb1BhdGhfKSB7CiAgICAgIHJldHVybiB0aGlzLmlkVG9QYXRoX1thYnNQYXRoT3JJZF07CiAgICB9IGVsc2UgaWYgKGFic1BhdGhPcklkIGluIHRoaXMuZGVwZW5kZW5jaWVzXykgewogICAgICByZXR1cm4gYWJzUGF0aE9ySWQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHshZ29vZy5EZXBlbmRlbmN5fSBkZXBlbmRlbmN5CiAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrCiAgICogQHByaXZhdGUKICAgKi8KICBnb29nLkRlYnVnTG9hZGVyXy5wcm90b3R5cGUuZGVmZXJfID0gZnVuY3Rpb24oZGVwZW5kZW5jeSwgY2FsbGJhY2spIHsKICAgIHRoaXMuZGVmZXJyZWRDYWxsYmFja3NfW2RlcGVuZGVuY3kucGF0aF0gPSBjYWxsYmFjazsKICAgIHRoaXMuZGVmZXJyZWRRdWV1ZV8ucHVzaChkZXBlbmRlbmN5LnBhdGgpOwogIH07CgoKICAvKioKICAgKiBJbnRlcmZhY2UgZm9yIGdvb2cuRGVwZW5kZW5jeSBpbXBsZW1lbnRhdGlvbnMgdG8gaGF2ZSBzb21lIGNvbnRyb2wgb3ZlcgogICAqIGxvYWRpbmcgb2YgZGVwZW5kZW5jaWVzLgogICAqCiAgICogQHJlY29yZAogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogVGVsbHMgdGhlIGNvbnRyb2xsZXIgdG8gaGFsdCBsb2FkaW5nIG9mIG1vcmUgZGVwZW5kZW5jaWVzLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7fTsKCgogIC8qKgogICAqIFRlbGxzIHRoZSBjb250cm9sbGVyIHRvIHJlc3VtZSBsb2FkaW5nIG9mIG1vcmUgZGVwZW5kZW5jaWVzIGlmIHBhdXNlZC4KICAgKi8KICBnb29nLkxvYWRDb250cm9sbGVyLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogVGVsbHMgdGhlIGNvbnRyb2xsZXIgdGhhdCB0aGlzIGRlcGVuZGVuY3kgaGFzIGZpbmlzaGVkIGxvYWRpbmcuCiAgICoKICAgKiBUaGlzIGNhdXNlcyB0aGlzIHRvIGJlIHJlbW92ZWQgZnJvbSBwZW5kaW5nKCkgYW5kIGFueSBsb2FkIGNhbGxiYWNrcyB0bwogICAqIGZpcmUuCiAgICovCiAgZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUubG9hZGVkID0gZnVuY3Rpb24oKSB7fTsKCgogIC8qKgogICAqIExpc3Qgb2YgZGVwZW5kZW5jaWVzIG9uIHdoaWNoIGxvYWQgaGFzIGJlZW4gY2FsbGVkIGJ1dCB3aGljaCBoYXZlIG5vdAogICAqIGNhbGxlZCBsb2FkZWQgb24gdGhlaXIgY29udHJvbGxlci4gVGhpcyBpbmNsdWRlcyB0aGUgY3VycmVudCBkZXBlbmRlbmN5LgogICAqCiAgICogQHJldHVybiB7IUFycmF5PCFnb29nLkRlcGVuZGVuY3k+fQogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnBlbmRpbmcgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogUmVnaXN0ZXJzIGFuIG9iamVjdCBhcyBhbiBFUzYgbW9kdWxlJ3MgZXhwb3J0cyBzbyB0aGF0IGdvb2cubW9kdWxlcyBtYXkKICAgKiByZXF1aXJlIGl0IGJ5IHBhdGguCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBGdWxsIHBhdGggb2YgdGhlIG1vZHVsZS4KICAgKiBAcGFyYW0gez99IGV4cG9ydHMKICAgKiBAcGFyYW0ge3N0cmluZz19IG9wdF9jbG9zdXJlTmFtZXNwYWNlIENsb3N1cmUgbmFtZXNwYWNlIHRvIGFzc29jaWF0ZSB3aXRoCiAgICogICAgIHRoaXMgbW9kdWxlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnJlZ2lzdGVyRXM2TW9kdWxlRXhwb3J0cyA9IGZ1bmN0aW9uKAogICAgICBwYXRoLCBleHBvcnRzLCBvcHRfY2xvc3VyZU5hbWVzcGFjZSkge307CgoKICAvKioKICAgKiBTZXRzIHRoZSBjdXJyZW50IG1vZHVsZSBzdGF0ZS4KICAgKgogICAqIEBwYXJhbSB7Z29vZy5Nb2R1bGVUeXBlfSB0eXBlIFR5cGUgb2YgbW9kdWxlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLnNldE1vZHVsZVN0YXRlID0gZnVuY3Rpb24odHlwZSkge307CgoKICAvKioKICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQgbW9kdWxlIHN0YXRlLgogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLmNsZWFyTW9kdWxlU3RhdGUgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gY2FsbCBvbmNlIHRoZSBkZXBlbmRlbmN5IGlzIGFjdHVhbGx5IHJlcXVlc3RlZAogICAqIHZpYSBnb29nLnJlcXVpcmUgKyBhbGwgb2YgdGhlIGltbWVkaWF0ZSBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGxvYWRlZCBvcgogICAqIGFsbCBvdGhlciBmaWxlcyBoYXZlIGJlZW4gbG9hZGVkLiBBbGxvd3MgZm9yIGxhenkgbG9hZGluZyB1bnRpbAogICAqIHJlcXVpcmUnZCB3aXRob3V0IHBhdXNpbmcgZGVwZW5kZW5jeSBsb2FkaW5nLCB3aGljaCBpcyBuZWVkZWQgb24gb2xkIElFLgogICAqCiAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrCiAgICovCiAgZ29vZy5Mb2FkQ29udHJvbGxlci5wcm90b3R5cGUuZGVmZXIgPSBmdW5jdGlvbihjYWxsYmFjaykge307CgoKICAvKioKICAgKiBAcmV0dXJuIHtib29sZWFufQogICAqLwogIGdvb2cuTG9hZENvbnRyb2xsZXIucHJvdG90eXBlLmFyZURlcHNMb2FkZWQgPSBmdW5jdGlvbigpIHt9OwoKCiAgLyoqCiAgICogQmFzaWMgc3VwZXIgY2xhc3MgZm9yIGFsbCBkZXBlbmRlbmNpZXMgQ2xvc3VyZSBMaWJyYXJ5IGNhbiBsb2FkLgogICAqCiAgICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGRlc2lnbmVkIHRvIGxvYWQgdW50cmFuc3BpbGVkLCBub24tbW9kdWxlCiAgICogc2NyaXB0cyBpbiBhIHdlYiBicm9zd2VyLgogICAqCiAgICogRm9yIHRyYW5zcGlsZWQgbm9uLWdvb2cubW9kdWxlIGZpbGVzIHtAc2VlIGdvb2cuVHJhbnNwaWxlZERlcGVuZGVuY3l9LgogICAqIEZvciBnb29nLm1vZHVsZXMgc2VlIHtAc2VlIGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3l9LgogICAqIEZvciB1bnRyYW5zcGlsZWQgRVM2IG1vZHVsZXMge0BzZWUgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5fS4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIEFic29sdXRlIHBhdGggb2YgdGhpcyBzY3JpcHQuCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlUGF0aCBQYXRoIG9mIHRoaXMgc2NyaXB0IHJlbGF0aXZlIHRvIGdvb2cuYmFzZVBhdGguCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcHJvdmlkZXMgZ29vZy5wcm92aWRlZCBvciBnb29nLm1vZHVsZSBzeW1ib2xzCiAgICogICAgIGluIHRoaXMgZmlsZS4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBnb29nIHN5bWJvbHMgb3IgcmVsYXRpdmUgcGF0aHMgdG8gQ2xvc3VyZQogICAqICAgICB0aGlzIGRlcGVuZHMgb24uCiAgICogQHBhcmFtIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gbG9hZEZsYWdzCiAgICogQHN0cnVjdCBAY29uc3RydWN0b3IKICAgKi8KICBnb29nLkRlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncykgewogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5wYXRoID0gcGF0aDsKICAgIC8qKiBAY29uc3QgKi8KICAgIHRoaXMucmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5wcm92aWRlcyA9IHByb3ZpZGVzOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5yZXF1aXJlcyA9IHJlcXVpcmVzOwogICAgLyoqIEBjb25zdCAqLwogICAgdGhpcy5sb2FkRmxhZ3MgPSBsb2FkRmxhZ3M7CiAgICAvKiogQHByaXZhdGUge2Jvb2xlYW59ICovCiAgICB0aGlzLmxvYWRlZF8gPSBmYWxzZTsKICAgIC8qKiBAcHJpdmF0ZSB7IUFycmF5PGZ1bmN0aW9uKCk+fSAqLwogICAgdGhpcy5sb2FkQ2FsbGJhY2tzXyA9IFtdOwogIH07CgoKICAvKioKICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwYXRobmFtZSBwYXJ0IG9mIHRoaXMgZGVwZW5kZW5jeSdzIHBhdGggaWYgaXQgaXMgYQogICAqICAgICBVUkkuCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5nZXRQYXRoTmFtZSA9IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhdGhOYW1lID0gdGhpcy5wYXRoOwogICAgdmFyIHByb3RvY29sSW5kZXggPSBwYXRoTmFtZS5pbmRleE9mKCc6Ly8nKTsKICAgIGlmIChwcm90b2NvbEluZGV4ID49IDApIHsKICAgICAgcGF0aE5hbWUgPSBwYXRoTmFtZS5zdWJzdHJpbmcocHJvdG9jb2xJbmRleCArIDMpOwogICAgICB2YXIgc2xhc2hJbmRleCA9IHBhdGhOYW1lLmluZGV4T2YoJy8nKTsKICAgICAgaWYgKHNsYXNoSW5kZXggPj0gMCkgewogICAgICAgIHBhdGhOYW1lID0gcGF0aE5hbWUuc3Vic3RyaW5nKHNsYXNoSW5kZXggKyAxKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHBhdGhOYW1lOwogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIGZpcmUgYXMgc29vbiBhcyB0aGlzIGhhcyBsb2FkZWQuCiAgICogQGZpbmFsCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5vbkxvYWQgPSBmdW5jdGlvbihjYWxsYmFjaykgewogICAgaWYgKHRoaXMubG9hZGVkXykgewogICAgICBjYWxsYmFjaygpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5sb2FkQ2FsbGJhY2tzXy5wdXNoKGNhbGxiYWNrKTsKICAgIH0KICB9OwoKCiAgLyoqCiAgICogTWFya3MgdGhpcyBkZXBlbmRlbmN5IGFzIGxvYWRlZCBhbmQgZmlyZXMgYW55IGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGgKICAgKiBvbkxvYWQuCiAgICogQGZpbmFsCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkZWQgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMubG9hZGVkXyA9IHRydWU7CiAgICB2YXIgY2FsbGJhY2tzID0gdGhpcy5sb2FkQ2FsbGJhY2tzXzsKICAgIHRoaXMubG9hZENhbGxiYWNrc18gPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGNhbGxiYWNrc1tpXSgpOwogICAgfQogIH07CgoKICAvKioKICAgKiBXaGV0aGVyIG9yIG5vdCBkb2N1bWVudC53cml0dGVuIC8gYXBwZW5kZWQgc2NyaXB0IHRhZ3Mgc2hvdWxkIGJlIGRlZmVycmVkLgogICAqCiAgICogQHByaXZhdGUge2Jvb2xlYW59CiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LmRlZmVyXyA9IGZhbHNlOwoKCiAgLyoqCiAgICogTWFwIG9mIHNjcmlwdCByZWFkeSAvIHN0YXRlIGNoYW5nZSBjYWxsYmFja3MuIE9sZCBJRSBjYW5ub3QgaGFuZGxlIHB1dHRpbmcKICAgKiB0aGVzZSBwcm9wZXJ0aWVzIG9uIGdvb2cuZ2xvYmFsLgogICAqCiAgICogQHByaXZhdGUgQGNvbnN0IHshT2JqZWN0PHN0cmluZywgZnVuY3Rpb24oPyk6dW5kZWZpbmVkPn0KICAgKi8KICBnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tNYXBfID0ge307CgoKICAvKioKICAgKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLj8pOj99IGNhbGxiYWNrCiAgICogQHJldHVybiB7c3RyaW5nfQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfID0gZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgIHZhciBrZXkgPSBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDMyKTsKICAgIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF9ba2V5XSA9IGNhbGxiYWNrOwogICAgcmV0dXJuIGtleTsKICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IGtleQogICAqIEBwcml2YXRlCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5LnVucmVnaXN0ZXJDYWxsYmFja18gPSBmdW5jdGlvbihrZXkpIHsKICAgIGRlbGV0ZSBnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tNYXBfW2tleV07CiAgfTsKCgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkKICAgKiBAcGFyYW0gey4uLj99IHZhcl9hcmdzCiAgICogQHByaXZhdGUKICAgKiBAc3VwcHJlc3Mge3VudXNlZFByaXZhdGVNZW1iZXJzfQogICAqLwogIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja18gPSBmdW5jdGlvbihrZXksIHZhcl9hcmdzKSB7CiAgICBpZiAoa2V5IGluIGdvb2cuRGVwZW5kZW5jeS5jYWxsYmFja01hcF8pIHsKICAgICAgdmFyIGNhbGxiYWNrID0gZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrTWFwX1trZXldOwogICAgICB2YXIgYXJncyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgIGFyZ3MucHVzaChhcmd1bWVudHNbaV0pOwogICAgICB9CiAgICAgIGNhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJncyk7CiAgICB9IGVsc2UgewogICAgICB2YXIgZXJyb3JNZXNzYWdlID0gJ0NhbGxiYWNrIGtleSAnICsga2V5ICsKICAgICAgICAgICcgZG9lcyBub3QgZXhpc3QgKHdhcyBiYXNlLmpzIGxvYWRlZCBtb3JlIHRoYW4gb25jZT8pLic7CiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7CiAgICB9CiAgfTsKCgogIC8qKgogICAqIFN0YXJ0cyBsb2FkaW5nIHRoaXMgZGVwZW5kZW5jeS4gVGhpcyBkZXBlbmRlbmN5IGNhbiBwYXVzZSBsb2FkaW5nIGlmIGl0CiAgICogbmVlZHMgdG8gYW5kIHJlc3VtZSBpdCBsYXRlciB2aWEgdGhlIGNvbnRyb2xsZXIgaW50ZXJmYWNlLgogICAqCiAgICogV2hlbiB0aGlzIGlzIGxvYWRlZCBpdCBzaG91bGQgY2FsbCBjb250cm9sbGVyLmxvYWRlZCgpLiBOb3RlIHRoYXQgdGhpcyB3aWxsCiAgICogZW5kIHVwIGNhbGxpbmcgdGhlIGxvYWRlZCBtZXRob2Qgb2YgdGhpcyBkZXBlbmRlbmN5OyB0aGVyZSBpcyBubyBuZWVkIHRvCiAgICogY2FsbCBpdCBleHBsaWNpdGx5LgogICAqCiAgICogQHBhcmFtIHshZ29vZy5Mb2FkQ29udHJvbGxlcn0gY29udHJvbGxlcgogICAqLwogIGdvb2cuRGVwZW5kZW5jeS5wcm90b3R5cGUubG9hZCA9IGZ1bmN0aW9uKGNvbnRyb2xsZXIpIHsKICAgIGlmIChnb29nLmdsb2JhbC5DTE9TVVJFX0lNUE9SVF9TQ1JJUFQpIHsKICAgICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVCh0aGlzLnBhdGgpKSB7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICghZ29vZy5pbkh0bWxEb2N1bWVudF8oKSkgewogICAgICBnb29nLmxvZ1RvQ29uc29sZV8oCiAgICAgICAgICAnQ2Fubm90IHVzZSBkZWZhdWx0IGRlYnVnIGxvYWRlciBvdXRzaWRlIG9mIEhUTUwgZG9jdW1lbnRzLicpOwogICAgICBpZiAodGhpcy5yZWxhdGl2ZVBhdGggPT0gJ2RlcHMuanMnKSB7CiAgICAgICAgLy8gU29tZSBvbGQgY29kZSBpcyByZWx5aW5nIG9uIGJhc2UuanMgYXV0byBsb2FkaW5nIGRlcHMuanMgZmFpbGluZyB3aXRoCiAgICAgICAgLy8gbm8gZXJyb3IgYmVmb3JlIGxhdGVyIHNldHRpbmcgQ0xPU1VSRV9JTVBPUlRfU0NSSVBULgogICAgICAgIC8vIENMT1NVUkVfSU1QT1JUX1NDUklQVCBzaG91bGQgYmUgc2V0ICpiZWZvcmUqIGJhc2UuanMgaXMgbG9hZGVkLCBvcgogICAgICAgIC8vIENMT1NVUkVfTk9fREVQUyBzZXQgdG8gdHJ1ZS4KICAgICAgICBnb29nLmxvZ1RvQ29uc29sZV8oCiAgICAgICAgICAgICdDb25zaWRlciBzZXR0aW5nIENMT1NVUkVfSU1QT1JUX1NDUklQVCBiZWZvcmUgbG9hZGluZyBiYXNlLmpzLCAnICsKICAgICAgICAgICAgJ29yIHNldHRpbmcgQ0xPU1VSRV9OT19ERVBTIHRvIHRydWUuJyk7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qKiBAdHlwZSB7IUhUTUxEb2N1bWVudH0gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICAvLyBJZiB0aGUgdXNlciB0cmllcyB0byByZXF1aXJlIGEgbmV3IHN5bWJvbCBhZnRlciBkb2N1bWVudCBsb2FkLAogICAgLy8gc29tZXRoaW5nIGhhcyBnb25lIHRlcnJpYmx5IHdyb25nLiBEb2luZyBhIGRvY3VtZW50LndyaXRlIHdvdWxkCiAgICAvLyB3aXBlIG91dCB0aGUgcGFnZS4gVGhpcyBkb2VzIG5vdCBhcHBseSB0byB0aGUgQ1NQLWNvbXBsaWFudCBtZXRob2QKICAgIC8vIG9mIHdyaXRpbmcgc2NyaXB0IHRhZ3MuCiAgICBpZiAoZG9jLnJlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJyAmJgogICAgICAgICFnb29nLkVOQUJMRV9DSFJPTUVfQVBQX1NBRkVfU0NSSVBUX0xPQURJTkcpIHsKICAgICAgLy8gQ2VydGFpbiB0ZXN0IGZyYW1ld29ya3MgbG9hZCBiYXNlLmpzIG11bHRpcGxlIHRpbWVzLCB3aGljaCB0cmllcwogICAgICAvLyB0byB3cml0ZSBkZXBzLmpzIGVhY2ggdGltZS4gSWYgdGhhdCBoYXBwZW5zLCBqdXN0IGZhaWwgc2lsZW50bHkuCiAgICAgIC8vIFRoZXNlIGZyYW1ld29ya3Mgd2lwZSB0aGUgcGFnZSBiZXR3ZWVuIGVhY2ggbG9hZCBvZiBiYXNlLmpzLCBzbyB0aGlzCiAgICAgIC8vIGlzIE9LLgogICAgICB2YXIgaXNEZXBzID0gL1xiZGVwcy5qcyQvLnRlc3QodGhpcy5wYXRoKTsKICAgICAgaWYgKGlzRGVwcykgewogICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IEVycm9yKCdDYW5ub3Qgd3JpdGUgIicgKyB0aGlzLnBhdGggKyAnIiBhZnRlciBkb2N1bWVudCBsb2FkJyk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIWdvb2cuRU5BQkxFX0NIUk9NRV9BUFBfU0FGRV9TQ1JJUFRfTE9BRElORyAmJgogICAgICAgIGdvb2cuaXNEb2N1bWVudExvYWRpbmdfKCkpIHsKICAgICAgdmFyIGtleSA9IGdvb2cuRGVwZW5kZW5jeS5yZWdpc3RlckNhbGxiYWNrXyhmdW5jdGlvbihzY3JpcHQpIHsKICAgICAgICBpZiAoIWdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8gfHwgc2NyaXB0LnJlYWR5U3RhdGUgPT0gJ2NvbXBsZXRlJykgewogICAgICAgICAgZ29vZy5EZXBlbmRlbmN5LnVucmVnaXN0ZXJDYWxsYmFja18oa2V5KTsKICAgICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgdmFyIG5vbmNlQXR0ciA9ICFnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfICYmIGdvb2cuZ2V0U2NyaXB0Tm9uY2UoKSA/CiAgICAgICAgICAnIG5vbmNlPSInICsgZ29vZy5nZXRTY3JpcHROb25jZSgpICsgJyInIDoKICAgICAgICAgICcnOwogICAgICB2YXIgZXZlbnQgPQogICAgICAgICAgZ29vZy5EZWJ1Z0xvYWRlcl8uSVNfT0xEX0lFXyA/ICdvbnJlYWR5c3RhdGVjaGFuZ2UnIDogJ29ubG9hZCc7CiAgICAgIHZhciBkZWZlciA9IGdvb2cuRGVwZW5kZW5jeS5kZWZlcl8gPyAnZGVmZXInIDogJyc7CiAgICAgIHZhciBzY3JpcHQgPSAnPHNjcmlwdCBzcmM9IicgKyB0aGlzLnBhdGggKyAnIiAnICsgZXZlbnQgKwogICAgICAgICAgJz0iZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXyhcJycgKyBrZXkgKwogICAgICAgICAgJ1wnLCB0aGlzKSIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiAnICsgZGVmZXIgKyBub25jZUF0dHIgKyAnPjwnICsKICAgICAgICAgICcvc2NyaXB0Pic7CiAgICAgIGRvYy53cml0ZSgKICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgICBnb29nLlRSVVNURURfVFlQRVNfUE9MSUNZXy5jcmVhdGVIVE1MKHNjcmlwdCkgOgogICAgICAgICAgICAgIHNjcmlwdCk7CiAgICB9IGVsc2UgewogICAgICB2YXIgc2NyaXB0RWwgPQogICAgICAgICAgLyoqIEB0eXBlIHshSFRNTFNjcmlwdEVsZW1lbnR9ICovIChkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpOwogICAgICBzY3JpcHRFbC5kZWZlciA9IGdvb2cuRGVwZW5kZW5jeS5kZWZlcl87CiAgICAgIHNjcmlwdEVsLmFzeW5jID0gZmFsc2U7CiAgICAgIHNjcmlwdEVsLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsKCiAgICAgIC8vIElmIENTUCBub25jZXMgYXJlIHVzZWQsIHByb3BhZ2F0ZSB0aGVtIHRvIGR5bmFtaWNhbGx5IGNyZWF0ZWQgc2NyaXB0cy4KICAgICAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYWxsb3cgbm9uY2UtYmFzZWQgQ1NQcyB3aXRob3V0ICdzdHJpY3QtZHluYW1pYycuCiAgICAgIHZhciBub25jZSA9IGdvb2cuZ2V0U2NyaXB0Tm9uY2UoKTsKICAgICAgaWYgKG5vbmNlKSB7CiAgICAgICAgc2NyaXB0RWwuc2V0QXR0cmlidXRlKCdub25jZScsIG5vbmNlKTsKICAgICAgfQoKICAgICAgaWYgKGdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8pIHsKICAgICAgICAvLyBFeGVjdXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQgb24gb2xkIElFLCBoYWx0IGxvYWRpbmcgYW5kIHdyaXRlCiAgICAgICAgLy8gdGhlc2Ugc2NyaXB0cyBvbmUgYXQgYSB0aW1lLCBhZnRlciBlYWNoIGxvYWRzLgogICAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgICBzY3JpcHRFbC5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChzY3JpcHRFbC5yZWFkeVN0YXRlID09ICdsb2FkZWQnIHx8CiAgICAgICAgICAgICAgc2NyaXB0RWwucmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnKSB7CiAgICAgICAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICAgICAgICAgIGNvbnRyb2xsZXIucmVzdW1lKCk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzY3JpcHRFbC5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHNjcmlwdEVsLm9ubG9hZCA9IG51bGw7CiAgICAgICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHNjcmlwdEVsLnNyYyA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZVNjcmlwdFVSTCh0aGlzLnBhdGgpIDoKICAgICAgICAgIHRoaXMucGF0aDsKICAgICAgZG9jLmhlYWQuYXBwZW5kQ2hpbGQoc2NyaXB0RWwpOwogICAgfQogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBBYnNvbHV0ZSBwYXRoIG9mIHRoaXMgc2NyaXB0LgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVBhdGggUGF0aCBvZiB0aGlzIHNjcmlwdCByZWxhdGl2ZSB0byBnb29nLmJhc2VQYXRoLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHByb3ZpZGVzIFNob3VsZCBiZSBhbiBlbXB0eSBhcnJheS4KICAgKiAgICAgVE9ETyhqb2hucGxhaXN0ZWQpIGFkZCBzdXBwb3J0IGZvciBhZGRpbmcgY2xvc3VyZSBuYW1lc3BhY2VzIHRvIEVTNgogICAqICAgICBtb2R1bGVzIGZvciBpbnRlcm9wIHB1cnBvc2VzLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLkRlcGVuZGVuY3l9CiAgICovCiAgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpIHsKICAgIGdvb2cuRXM2TW9kdWxlRGVwZW5kZW5jeS5iYXNlKAogICAgICAgIHRoaXMsICdjb25zdHJ1Y3RvcicsIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogIH07CiAgZ29vZy5pbmhlcml0cyhnb29nLkVzNk1vZHVsZURlcGVuZGVuY3ksIGdvb2cuRGVwZW5kZW5jeSk7CgoKICAvKiogQG92ZXJyaWRlICovCiAgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24oY29udHJvbGxlcikgewogICAgaWYgKGdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVCkgewogICAgICBpZiAoZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKHRoaXMucGF0aCkpIHsKICAgICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgICB9IGVsc2UgewogICAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCFnb29nLmluSHRtbERvY3VtZW50XygpKSB7CiAgICAgIGdvb2cubG9nVG9Db25zb2xlXygKICAgICAgICAgICdDYW5ub3QgdXNlIGRlZmF1bHQgZGVidWcgbG9hZGVyIG91dHNpZGUgb2YgSFRNTCBkb2N1bWVudHMuJyk7CiAgICAgIGNvbnRyb2xsZXIucGF1c2UoKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8qKiBAdHlwZSB7IUhUTUxEb2N1bWVudH0gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICB2YXIgZGVwID0gdGhpczsKCiAgICAvLyBUT0RPKGpvaG5wbGFpc3RlZCk6IERvZXMgZG9jdW1lbnQud3JpdGluZyByZWFsbHkgc3BlZWQgdXAgYW55dGhpbmc/IEFueQogICAgLy8gZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIGp1c3Qgd2FpdGluZyBmb3IgaW50ZXJhY3RpdmUgbW9kZSBhbmQgdGhlbgogICAgLy8gYXBwZW5kaW5nPwogICAgZnVuY3Rpb24gd3JpdGUoc3JjLCBjb250ZW50cykgewogICAgICBpZiAoY29udGVudHMpIHsKICAgICAgICB2YXIgc2NyaXB0ID0gJzxzY3JpcHQgdHlwZT0ibW9kdWxlIiBjcm9zc29yaWdpbj4nICsgY29udGVudHMgKyAnPC8nICsKICAgICAgICAgICAgJ3NjcmlwdD4nOwogICAgICAgIGRvYy53cml0ZSgKICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlSFRNTChzY3JpcHQpIDoKICAgICAgICAgICAgICAgIHNjcmlwdCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHNjcmlwdCA9ICc8c2NyaXB0IHR5cGU9Im1vZHVsZSIgY3Jvc3NvcmlnaW4gc3JjPSInICsgc3JjICsgJyI+PC8nICsKICAgICAgICAgICAgJ3NjcmlwdD4nOwogICAgICAgIGRvYy53cml0ZSgKICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlSFRNTChzY3JpcHQpIDoKICAgICAgICAgICAgICAgIHNjcmlwdCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhcHBlbmQoc3JjLCBjb250ZW50cykgewogICAgICB2YXIgc2NyaXB0RWwgPQogICAgICAgICAgLyoqIEB0eXBlIHshSFRNTFNjcmlwdEVsZW1lbnR9ICovIChkb2MuY3JlYXRlRWxlbWVudCgnc2NyaXB0JykpOwogICAgICBzY3JpcHRFbC5kZWZlciA9IHRydWU7CiAgICAgIHNjcmlwdEVsLmFzeW5jID0gZmFsc2U7CiAgICAgIHNjcmlwdEVsLnR5cGUgPSAnbW9kdWxlJzsKICAgICAgc2NyaXB0RWwuc2V0QXR0cmlidXRlKCdjcm9zc29yaWdpbicsIHRydWUpOwoKICAgICAgLy8gSWYgQ1NQIG5vbmNlcyBhcmUgdXNlZCwgcHJvcGFnYXRlIHRoZW0gdG8gZHluYW1pY2FsbHkgY3JlYXRlZCBzY3JpcHRzLgogICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSB0byBhbGxvdyBub25jZS1iYXNlZCBDU1BzIHdpdGhvdXQgJ3N0cmljdC1keW5hbWljJy4KICAgICAgdmFyIG5vbmNlID0gZ29vZy5nZXRTY3JpcHROb25jZSgpOwogICAgICBpZiAobm9uY2UpIHsKICAgICAgICBzY3JpcHRFbC5zZXRBdHRyaWJ1dGUoJ25vbmNlJywgbm9uY2UpOwogICAgICB9CgogICAgICBpZiAoY29udGVudHMpIHsKICAgICAgICBzY3JpcHRFbC50ZXh0Q29udGVudCA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlU2NyaXB0KGNvbnRlbnRzKSA6CiAgICAgICAgICAgIGNvbnRlbnRzOwogICAgICB9IGVsc2UgewogICAgICAgIHNjcmlwdEVsLnNyYyA9IGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID8KICAgICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8uY3JlYXRlU2NyaXB0VVJMKHNyYykgOgogICAgICAgICAgICBzcmM7CiAgICAgIH0KCiAgICAgIGRvYy5oZWFkLmFwcGVuZENoaWxkKHNjcmlwdEVsKTsKICAgIH0KCiAgICB2YXIgY3JlYXRlOwoKICAgIGlmIChnb29nLmlzRG9jdW1lbnRMb2FkaW5nXygpKSB7CiAgICAgIGNyZWF0ZSA9IHdyaXRlOwogICAgICAvLyBXZSBjYW4gT05MWSBjYWxsIGRvY3VtZW50LndyaXRlIGlmIHdlIGFyZSBndWFyYW50ZWVkIHRoYXQgYW55CiAgICAgIC8vIG5vbi1tb2R1bGUgc2NyaXB0IHRhZ3MgZG9jdW1lbnQud3JpdHRlbiBhZnRlciB0aGlzIGFyZSBkZWZlcnJlZC4KICAgICAgLy8gU21hbGwgb3B0aW1pemF0aW9uLCBpbiB0aGVvcnkgZG9jdW1lbnQud3JpdGluZyBpcyBmYXN0ZXIuCiAgICAgIGdvb2cuRGVwZW5kZW5jeS5kZWZlcl8gPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgY3JlYXRlID0gYXBwZW5kOwogICAgfQoKICAgIC8vIFdyaXRlIDQgc2VwYXJhdGUgdGFncyBoZXJlOgogICAgLy8gMSkgU2V0cyB0aGUgbW9kdWxlIHN0YXRlIGF0IHRoZSBjb3JyZWN0IHRpbWUgKGp1c3QgYmVmb3JlIGV4ZWN1dGlvbikuCiAgICAvLyAyKSBBIHNyYyBub2RlIGZvciB0aGlzLCB3aGljaCBqdXN0IGhvcGVmdWxseSBsZXRzIHRoZSBicm93c2VyIGxvYWQgaXQgYQogICAgLy8gICAgbGl0dGxlIGVhcmx5IChubyBuZWVkIHRvIHBhcnNlICMzKS4KICAgIC8vIDMpIEltcG9ydCB0aGUgbW9kdWxlIGFuZCByZWdpc3RlciBpdC4KICAgIC8vIDQpIENsZWFyIHRoZSBtb2R1bGUgc3RhdGUgYXQgdGhlIGNvcnJlY3QgdGltZS4gR3VhcmFudGVlZCB0byBydW4gZXZlbgogICAgLy8gICAgaWYgdGhlcmUgaXMgYW4gZXJyb3IgaW4gdGhlIG1vZHVsZSAoIzMgd2lsbCBub3QgcnVuIGlmIHRoZXJlIGlzIGFuCiAgICAvLyAgICBlcnJvciBpbiB0aGUgbW9kdWxlKS4KICAgIHZhciBiZWZvcmVLZXkgPSBnb29nLkRlcGVuZGVuY3kucmVnaXN0ZXJDYWxsYmFja18oZnVuY3Rpb24oKSB7CiAgICAgIGdvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGJlZm9yZUtleSk7CiAgICAgIGNvbnRyb2xsZXIuc2V0TW9kdWxlU3RhdGUoZ29vZy5Nb2R1bGVUeXBlLkVTNik7CiAgICB9KTsKICAgIGNyZWF0ZSh1bmRlZmluZWQsICdnb29nLkRlcGVuZGVuY3kuY2FsbGJhY2tfKCInICsgYmVmb3JlS2V5ICsgJyIpJyk7CgogICAgLy8gVE9ETyhqb2hucGxhaXN0ZWQpOiBEb2VzIHRoaXMgcmVhbGx5IHNwZWVkIHVwIGFueXRoaW5nPwogICAgY3JlYXRlKHRoaXMucGF0aCwgdW5kZWZpbmVkKTsKCiAgICB2YXIgcmVnaXN0ZXJLZXkgPSBnb29nLkRlcGVuZGVuY3kucmVnaXN0ZXJDYWxsYmFja18oZnVuY3Rpb24oZXhwb3J0cykgewogICAgICBnb29nLkRlcGVuZGVuY3kudW5yZWdpc3RlckNhbGxiYWNrXyhyZWdpc3RlcktleSk7CiAgICAgIGNvbnRyb2xsZXIucmVnaXN0ZXJFczZNb2R1bGVFeHBvcnRzKAogICAgICAgICAgZGVwLnBhdGgsIGV4cG9ydHMsIGdvb2cubW9kdWxlTG9hZGVyU3RhdGVfLm1vZHVsZU5hbWUpOwogICAgfSk7CiAgICBjcmVhdGUoCiAgICAgICAgdW5kZWZpbmVkLAogICAgICAgICdpbXBvcnQgKiBhcyBtIGZyb20gIicgKyB0aGlzLnBhdGggKyAnIjsgZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArCiAgICAgICAgICAgIHJlZ2lzdGVyS2V5ICsgJyIsIG0pJyk7CgogICAgdmFyIGFmdGVyS2V5ID0gZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfKGZ1bmN0aW9uKCkgewogICAgICBnb29nLkRlcGVuZGVuY3kudW5yZWdpc3RlckNhbGxiYWNrXyhhZnRlcktleSk7CiAgICAgIGNvbnRyb2xsZXIuY2xlYXJNb2R1bGVTdGF0ZSgpOwogICAgICBjb250cm9sbGVyLmxvYWRlZCgpOwogICAgfSk7CiAgICBjcmVhdGUodW5kZWZpbmVkLCAnZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArIGFmdGVyS2V5ICsgJyIpJyk7CiAgfTsKCgogIC8qKgogICAqIFN1cGVyY2xhc3Mgb2YgYW55IGRlcGVuZGVuY3kgdGhhdCBuZWVkcyB0byBiZSBsb2FkZWQgaW50byBtZW1vcnksCiAgICogdHJhbnNmb3JtZWQsIGFuZCB0aGVuIGV2YWwnZCAoZ29vZy5tb2R1bGVzIGFuZCB0cmFuc3BpbGVkIGZpbGVzKS4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIEFic29sdXRlIHBhdGggb2YgdGhpcyBzY3JpcHQuCiAgICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlUGF0aCBQYXRoIG9mIHRoaXMgc2NyaXB0IHJlbGF0aXZlIHRvIGdvb2cuYmFzZVBhdGguCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcHJvdmlkZXMgZ29vZy5wcm92aWRlZCBvciBnb29nLm1vZHVsZSBzeW1ib2xzCiAgICogICAgIGluIHRoaXMgZmlsZS4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBnb29nIHN5bWJvbHMgb3IgcmVsYXRpdmUgcGF0aHMgdG8gQ2xvc3VyZQogICAqICAgICB0aGlzIGRlcGVuZHMgb24uCiAgICogQHBhcmFtIHshT2JqZWN0PHN0cmluZywgc3RyaW5nPn0gbG9hZEZsYWdzCiAgICogQHN0cnVjdCBAY29uc3RydWN0b3IgQGFic3RyYWN0CiAgICogQGV4dGVuZHMge2dvb2cuRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeSA9IGZ1bmN0aW9uKAogICAgICBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKSB7CiAgICBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeS5iYXNlKAogICAgICAgIHRoaXMsICdjb25zdHJ1Y3RvcicsIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogICAgLyoqIEBwcml2YXRlIHs/c3RyaW5nfSAqLwogICAgdGhpcy5jb250ZW50c18gPSBudWxsOwoKICAgIC8qKgogICAgICogV2hldGhlciB0byBsYXppbHkgbWFrZSB0aGUgc3luY2hyb25vdXMgWEhSICh3aGVuIGdvb2cucmVxdWlyZSdkKSBvciBtYWtlCiAgICAgKiB0aGUgc3luY2hyb25vdXMgWEhSIHdoZW4gaW5pdGlhbGx5IGxvYWRpbmcuIE9uIEZpcmVGb3ggNjEgdGhlcmUgaXMgYSBidWcKICAgICAqIHdoZXJlIGFuIEVTNiBtb2R1bGUgY2Fubm90IG1ha2UgYSBzeW5jaHJvbm91cyBYSFIgKHJhdGhlciwgaXQgY2FuLCBidXQgaWYKICAgICAqIGl0IGRvZXMgdGhlbiBubyBvdGhlciBFUzYgbW9kdWxlcyB3aWxsIGxvYWQgYWZ0ZXIpLgogICAgICoKICAgICAqIHRsO2RyIHdlIGxhenkgbG9hZCBkdWUgdG8gYnVncyBvbiBvbGRlciBicm93c2VycyBhbmQgZWFnZXIgbG9hZCBkdWUgdG8KICAgICAqIGJ1Z3Mgb24gbmV3ZXIgb25lcy4KICAgICAqCiAgICAgKiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNDc3MDkwCiAgICAgKgogICAgICogQHByaXZhdGUgQGNvbnN0IHtib29sZWFufQogICAgICovCiAgICB0aGlzLmxhenlGZXRjaF8gPSAhZ29vZy5pbkh0bWxEb2N1bWVudF8oKSB8fAogICAgICAgICEoJ25vTW9kdWxlJyBpbiBnb29nLmdsb2JhbC5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKSk7CiAgfTsKICBnb29nLmluaGVyaXRzKGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LCBnb29nLkRlcGVuZGVuY3kpOwoKCiAgLyoqIEBvdmVycmlkZSAqLwogIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5LnByb3RvdHlwZS5sb2FkID0gZnVuY3Rpb24oY29udHJvbGxlcikgewogICAgdmFyIGRlcCA9IHRoaXM7CgogICAgZnVuY3Rpb24gZmV0Y2goKSB7CiAgICAgIGRlcC5jb250ZW50c18gPSBnb29nLmxvYWRGaWxlU3luY18oZGVwLnBhdGgpOwoKICAgICAgaWYgKGRlcC5jb250ZW50c18pIHsKICAgICAgICBkZXAuY29udGVudHNfID0gZGVwLnRyYW5zZm9ybShkZXAuY29udGVudHNfKTsKICAgICAgICBpZiAoZGVwLmNvbnRlbnRzXykgewogICAgICAgICAgZGVwLmNvbnRlbnRzXyArPSAnXG4vLyMgc291cmNlVVJMPScgKyBkZXAucGF0aDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKSB7CiAgICAgIGZldGNoKCk7CiAgICAgIGlmICh0aGlzLmNvbnRlbnRzXyAmJgogICAgICAgICAgZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUKCcnLCB0aGlzLmNvbnRlbnRzXykpIHsKICAgICAgICB0aGlzLmNvbnRlbnRzXyA9IG51bGw7CiAgICAgICAgY29udHJvbGxlci5sb2FkZWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQoKCiAgICB2YXIgaXNFczYgPSB0aGlzLmxvYWRGbGFnc1snbW9kdWxlJ10gPT0gZ29vZy5Nb2R1bGVUeXBlLkVTNjsKCiAgICBpZiAoIXRoaXMubGF6eUZldGNoXykgewogICAgICBmZXRjaCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxvYWQoKSB7CiAgICAgIGlmIChkZXAubGF6eUZldGNoXykgewogICAgICAgIGZldGNoKCk7CiAgICAgIH0KCiAgICAgIGlmICghZGVwLmNvbnRlbnRzXykgewogICAgICAgIC8vIGxvYWRGaWxlU3luY18gb3IgdHJhbnNmb3JtIGFyZSByZXNwb25zaWJsZS4gQXNzdW1lIHRoZXkgbG9nZ2VkIGFuCiAgICAgICAgLy8gZXJyb3IuCiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoaXNFczYpIHsKICAgICAgICBjb250cm9sbGVyLnNldE1vZHVsZVN0YXRlKGdvb2cuTW9kdWxlVHlwZS5FUzYpOwogICAgICB9CgogICAgICB2YXIgbmFtZXNwYWNlOwoKICAgICAgdHJ5IHsKICAgICAgICB2YXIgY29udGVudHMgPSBkZXAuY29udGVudHNfOwogICAgICAgIGRlcC5jb250ZW50c18gPSBudWxsOwogICAgICAgIGdvb2cuZ2xvYmFsRXZhbChjb250ZW50cyk7CiAgICAgICAgaWYgKGlzRXM2KSB7CiAgICAgICAgICBuYW1lc3BhY2UgPSBnb29nLm1vZHVsZUxvYWRlclN0YXRlXy5tb2R1bGVOYW1lOwogICAgICAgIH0KICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBpZiAoaXNFczYpIHsKICAgICAgICAgIGNvbnRyb2xsZXIuY2xlYXJNb2R1bGVTdGF0ZSgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGlzRXM2KSB7CiAgICAgICAgLy8gRHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY2llcyB0aGlzIG1heSBub3QgYmUgYXZhaWxhYmxlIGZvciByZXF1aXJlCiAgICAgICAgLy8gcmlnaHQgbm93LgogICAgICAgIGdvb2cuZ2xvYmFsWyckanNjb21wJ11bJ3JlcXVpcmUnXVsnZW5zdXJlJ10oCiAgICAgICAgICAgIFtkZXAuZ2V0UGF0aE5hbWUoKV0sIGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGNvbnRyb2xsZXIucmVnaXN0ZXJFczZNb2R1bGVFeHBvcnRzKAogICAgICAgICAgICAgICAgICBkZXAucGF0aCwKICAgICAgICAgICAgICAgICAgZ29vZy5nbG9iYWxbJyRqc2NvbXAnXVsncmVxdWlyZSddKGRlcC5nZXRQYXRoTmFtZSgpKSwKICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlKTsKICAgICAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGNvbnRyb2xsZXIubG9hZGVkKCk7CiAgICB9CgogICAgLy8gRG8gbm90IGZldGNoIG5vdzsgaW4gRmlyZUZveCA0NyB0aGUgc3luY2hyb25vdXMgWEhSIGRvZXNuJ3QgYmxvY2sgYWxsCiAgICAvLyBldmVudHMuIElmIHdlIGZldGNoZWQgbm93IGFuZCB0aGVuIGRvY3VtZW50LndyaXRlJ2QgdGhlIGNvbnRlbnRzIHRoZQogICAgLy8gZG9jdW1lbnQud3JpdGUgd291bGQgYmUgYW4gZXZhbCBhbmQgd291bGQgZXhlY3V0ZSB0b28gc29vbiEgSW5zdGVhZCB3cml0ZQogICAgLy8gYSBzY3JpcHQgdGFnIHRvIGZldGNoIGFuZCBldmFsIHN5bmNocm9ub3VzbHkgYXQgdGhlIGNvcnJlY3QgdGltZS4KICAgIGZ1bmN0aW9uIGZldGNoSW5Pd25TY3JpcHRUaGVuTG9hZCgpIHsKICAgICAgLyoqIEB0eXBlIHshSFRNTERvY3VtZW50fSAqLwogICAgICB2YXIgZG9jID0gZ29vZy5nbG9iYWwuZG9jdW1lbnQ7CgogICAgICB2YXIga2V5ID0gZ29vZy5EZXBlbmRlbmN5LnJlZ2lzdGVyQ2FsbGJhY2tfKGZ1bmN0aW9uKCkgewogICAgICAgIGdvb2cuRGVwZW5kZW5jeS51bnJlZ2lzdGVyQ2FsbGJhY2tfKGtleSk7CiAgICAgICAgbG9hZCgpOwogICAgICB9KTsKCiAgICAgIHZhciBzY3JpcHQgPSAnPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPicgKwogICAgICAgICAgZ29vZy5wcm90ZWN0U2NyaXB0VGFnXygnZ29vZy5EZXBlbmRlbmN5LmNhbGxiYWNrXygiJyArIGtleSArICciKTsnKSArCiAgICAgICAgICAnPC8nICsKICAgICAgICAgICdzY3JpcHQ+JzsKICAgICAgZG9jLndyaXRlKAogICAgICAgICAgZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV8gPwogICAgICAgICAgICAgIGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfLmNyZWF0ZUhUTUwoc2NyaXB0KSA6CiAgICAgICAgICAgICAgc2NyaXB0KTsKICAgIH0KCiAgICAvLyBJZiBvbmUgdGhpbmcgaXMgcGVuZGluZyBpdCBpcyB0aGlzLgogICAgdmFyIGFueXRoaW5nRWxzZVBlbmRpbmcgPSBjb250cm9sbGVyLnBlbmRpbmcoKS5sZW5ndGggPiAxOwoKICAgIC8vIElmIGFueXRoaW5nIGVsc2UgaXMgbG9hZGluZyB3ZSBuZWVkIHRvIGxhenkgbG9hZCBkdWUgdG8gYnVncyBpbiBvbGQgSUUuCiAgICAvLyBTcGVjaWZpY2FsbHkgc2NyaXB0IHRhZ3Mgd2l0aCBzcmMgYW5kIHNjcmlwdCB0YWdzIHdpdGggY29udGVudHMgY291bGQKICAgIC8vIGV4ZWN1dGUgb3V0IG9mIG9yZGVyIGlmIGRvY3VtZW50LndyaXRlIGlzIHVzZWQsIHNvIHdlIGNhbm5vdCB1c2UKICAgIC8vIGRvY3VtZW50LndyaXRlLiBEbyBub3QgcGF1c2UgaGVyZTsgaXQgYnJlYWtzIG9sZCBJRSBhcyB3ZWxsLgogICAgdmFyIHVzZU9sZEllV29ya0Fyb3VuZCA9CiAgICAgICAgYW55dGhpbmdFbHNlUGVuZGluZyAmJiBnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfOwoKICAgIC8vIEFkZGl0aW9uYWxseSBpZiB3ZSBhcmUgbWVhbnQgdG8gZGVmZXIgc2NyaXB0cyBidXQgdGhlIHBhZ2UgaXMgc3RpbGwKICAgIC8vIGxvYWRpbmcgKGUuZy4gYW4gRVM2IG1vZHVsZSBpcyBsb2FkaW5nKSB0aGVuIGFsc28gZGVmZXIuIE9yIGlmIHdlIGFyZQogICAgLy8gbWVhbnQgdG8gZGVmZXIgYW5kIGFueXRoaW5nIGVsc2UgaXMgcGVuZGluZyB0aGVuIGRlZmVyICh0aG9zZSBtYXkgYmUKICAgIC8vIHNjcmlwdHMgdGhhdCBkaWQgbm90IG5lZWQgdHJhbnNmb3JtYXRpb24gYW5kIGFyZSBqdXN0IHNjcmlwdCB0YWdzIHdpdGgKICAgIC8vIGRlZmVyIHNldCB0byB0cnVlLCBhbmQgd2UgbmVlZCB0byBldmFsdWF0ZSBhZnRlciB0aGF0IGRlZmVycmVkIHNjcmlwdCkuCiAgICB2YXIgbmVlZHNBc3luY0xvYWRpbmcgPSBnb29nLkRlcGVuZGVuY3kuZGVmZXJfICYmCiAgICAgICAgKGFueXRoaW5nRWxzZVBlbmRpbmcgfHwgZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSk7CgogICAgaWYgKHVzZU9sZEllV29ya0Fyb3VuZCB8fCBuZWVkc0FzeW5jTG9hZGluZykgewogICAgICAvLyBOb3RlIHRoYXQgd2Ugb25seSBkZWZlciB3aGVuIHdlIGhhdmUgdG8gcmF0aGVyIHRoYW4gMTAwJSBvZiB0aGUgdGltZS4KICAgICAgLy8gQWx3YXlzIGRlZmVyaW5nIHdvdWxkIHdvcmssIGJ1dCB0aGVuIGluIHRoZW9yeSB0aGUgb3JkZXIgb2YKICAgICAgLy8gZ29vZy5yZXF1aXJlIGNhbGxzIHdvdWxkIHRoZW4gbWF0dGVyLiBXZSB3YW50IHRvIGVuZm9yY2UgdGhhdCBtb3N0IG9mCiAgICAgIC8vIHRoZSB0aW1lIHRoZSBvcmRlciBvZiB0aGUgcmVxdWlyZSBjYWxscyBkb2VzIG5vdCBtYXR0ZXIuCiAgICAgIGNvbnRyb2xsZXIuZGVmZXIoZnVuY3Rpb24oKSB7CiAgICAgICAgbG9hZCgpOwogICAgICB9KTsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gVE9ETyhqb2hucGxhaXN0ZWQpOiBFeHRlcm5zIGFyZSBtaXNzaW5nIG9ucmVhZHlzdGF0ZWNoYW5nZSBmb3IKICAgIC8vIEhUTUxEb2N1bWVudC4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIHZhciBkb2MgPSBnb29nLmdsb2JhbC5kb2N1bWVudDsKCiAgICB2YXIgaXNJbnRlcm5ldEV4cGxvcmVyID0KICAgICAgICBnb29nLmluSHRtbERvY3VtZW50XygpICYmICdBY3RpdmVYT2JqZWN0JyBpbiBnb29nLmdsb2JhbDsKCiAgICAvLyBEb24ndCBkZWxheSBpbiBhbnkgdmVyc2lvbiBvZiBJRS4gVGhlcmUncyBidWcgYXJvdW5kIHRoaXMgdGhhdCB3aWxsCiAgICAvLyBjYXVzZSBvdXQgb2Ygb3JkZXIgc2NyaXB0IGV4ZWN1dGlvbi4gVGhpcyBtZWFucyB0aGF0IG9uIG9sZGVyIElFIEVTNgogICAgLy8gbW9kdWxlcyB3aWxsIGxvYWQgdG9vIGVhcmx5ICh3aGlsZSB0aGUgZG9jdW1lbnQgaXMgc3RpbGwgbG9hZGluZyArIHRoZQogICAgLy8gZG9tIGlzIG5vdCBhdmFpbGFibGUpLiBUaGUgb3RoZXIgb3B0aW9uIGlzIHRvIGxvYWQgdG9vIGxhdGUgKHdoZW4gdGhlCiAgICAvLyBkb2N1bWVudCBpcyBjb21wbGV0ZSBhbmQgdGhlIG9ubG9hZCBldmVuIHdpbGwgbmV2ZXIgZmlyZSkuIFRoaXMgc2VlbXMKICAgIC8vIHRvIGJlIHRoZSBsZXNzZXIgb2YgdHdvIGV2aWxzIGFzIHNjcmlwdHMgYWxyZWFkeSBhY3QgbGlrZSB0aGUgZm9ybWVyLgogICAgaWYgKGlzRXM2ICYmIGdvb2cuaW5IdG1sRG9jdW1lbnRfKCkgJiYgZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSAmJgogICAgICAgICFpc0ludGVybmV0RXhwbG9yZXIpIHsKICAgICAgZ29vZy5EZXBlbmRlbmN5LmRlZmVyXyA9IHRydWU7CiAgICAgIC8vIFRyYW5zcGlsZWQgRVM2IG1vZHVsZXMgc3RpbGwgbmVlZCB0byBsb2FkIGxpa2UgcmVndWxhciBFUzYgbW9kdWxlcywKICAgICAgLy8gYWthIG9ubHkgYWZ0ZXIgdGhlIGRvY3VtZW50IGlzIGludGVyYWN0aXZlLgogICAgICBjb250cm9sbGVyLnBhdXNlKCk7CiAgICAgIHZhciBvbGRDYWxsYmFjayA9IGRvYy5vbnJlYWR5c3RhdGVjaGFuZ2U7CiAgICAgIGRvYy5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoZG9jLnJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJykgewogICAgICAgICAgZG9jLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IG9sZENhbGxiYWNrOwogICAgICAgICAgbG9hZCgpOwogICAgICAgICAgY29udHJvbGxlci5yZXN1bWUoKTsKICAgICAgICB9CiAgICAgICAgaWYgKGdvb2cuaXNGdW5jdGlvbihvbGRDYWxsYmFjaykpIHsKICAgICAgICAgIG9sZENhbGxiYWNrLmFwcGx5KHVuZGVmaW5lZCwgYXJndW1lbnRzKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9IGVsc2UgewogICAgICAvLyBBbHdheXMgZXZhbCBvbiBvbGQgSUUuCiAgICAgIGlmIChnb29nLkRlYnVnTG9hZGVyXy5JU19PTERfSUVfIHx8ICFnb29nLmluSHRtbERvY3VtZW50XygpIHx8CiAgICAgICAgICAhZ29vZy5pc0RvY3VtZW50TG9hZGluZ18oKSkgewogICAgICAgIGxvYWQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmZXRjaEluT3duU2NyaXB0VGhlbkxvYWQoKTsKICAgICAgfQogICAgfQogIH07CgoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gY29udGVudHMKICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICogQGFic3RyYWN0CiAgICovCiAgZ29vZy5UcmFuc2Zvcm1lZERlcGVuZGVuY3kucHJvdG90eXBlLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGNvbnRlbnRzKSB7fTsKCgogIC8qKgogICAqIEFueSBub24tZ29vZy5tb2R1bGUgZGVwZW5kZW5jeSB3aGljaCBuZWVkcyB0byBiZSB0cmFuc3BpbGVkIGJlZm9yZSBldmFsLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGlzIHNjcmlwdC4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggb2YgdGhpcyBzY3JpcHQgcmVsYXRpdmUgdG8gZ29vZy5iYXNlUGF0aC4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBnb29nLnByb3ZpZGVkIG9yIGdvb2cubW9kdWxlIHN5bWJvbHMKICAgKiAgICAgaW4gdGhpcyBmaWxlLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAcGFyYW0geyFnb29nLlRyYW5zcGlsZXJ9IHRyYW5zcGlsZXIKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlRyYW5zcGlsZWREZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIHRyYW5zcGlsZXIpIHsKICAgIGdvb2cuVHJhbnNwaWxlZERlcGVuZGVuY3kuYmFzZSgKICAgICAgICB0aGlzLCAnY29uc3RydWN0b3InLCBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKTsKICAgIC8qKiBAcHJvdGVjdGVkIEBjb25zdCovCiAgICB0aGlzLnRyYW5zcGlsZXIgPSB0cmFuc3BpbGVyOwogIH07CiAgZ29vZy5pbmhlcml0cyhnb29nLlRyYW5zcGlsZWREZXBlbmRlbmN5LCBnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeSk7CgoKICAvKiogQG92ZXJyaWRlICovCiAgZ29vZy5UcmFuc3BpbGVkRGVwZW5kZW5jeS5wcm90b3R5cGUudHJhbnNmb3JtID0gZnVuY3Rpb24oY29udGVudHMpIHsKICAgIC8vIFRyYW5zcGlsZSB3aXRoIHRoZSBwYXRobmFtZSBzbyB0aGF0IEVTNiBtb2R1bGVzIGFyZSBkb21haW4gYWdub3N0aWMuCiAgICByZXR1cm4gdGhpcy50cmFuc3BpbGVyLnRyYW5zcGlsZShjb250ZW50cywgdGhpcy5nZXRQYXRoTmFtZSgpKTsKICB9OwoKCiAgLyoqCiAgICogQW4gRVM2IG1vZHVsZSBkZXBlbmRlbmN5IHRoYXQgd2FzIHRyYW5zcGlsZWQgdG8gYSBqc2NvbXAgbW9kdWxlIG91dHNpZGUKICAgKiBvZiB0aGUgZGVidWcgbG9hZGVyLCBlLmcuIHNlcnZlciBzaWRlLgogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGlzIHNjcmlwdC4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggb2YgdGhpcyBzY3JpcHQgcmVsYXRpdmUgdG8gZ29vZy5iYXNlUGF0aC4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBnb29nLnByb3ZpZGVkIG9yIGdvb2cubW9kdWxlIHN5bWJvbHMKICAgKiAgICAgaW4gdGhpcyBmaWxlLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHJlcXVpcmVzIGdvb2cgc3ltYm9scyBvciByZWxhdGl2ZSBwYXRocyB0byBDbG9zdXJlCiAgICogICAgIHRoaXMgZGVwZW5kcyBvbi4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLlByZVRyYW5zcGlsZWRFczZNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpIHsKICAgIGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3kuYmFzZSgKICAgICAgICB0aGlzLCAnY29uc3RydWN0b3InLCBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzKTsKICB9OwogIGdvb2cuaW5oZXJpdHMoCiAgICAgIGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3ksIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5KTsKCgogIC8qKiBAb3ZlcnJpZGUgKi8KICBnb29nLlByZVRyYW5zcGlsZWRFczZNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbigKICAgICAgY29udGVudHMpIHsKICAgIHJldHVybiBjb250ZW50czsKICB9OwoKCiAgLyoqCiAgICogQSBnb29nLm1vZHVsZSwgdHJhbnNwaWxlZCBvciBub3QuIFdpbGwgYWx3YXlzIHBlcmZvcm0gc29tZSBtaW5pbWFsCiAgICogdHJhbnNmb3JtYXRpb24gZXZlbiB3aGVuIG5vdCB0cmFuc3BpbGVkIHRvIHdyYXAgaW4gYSBnb29nLmxvYWRNb2R1bGUKICAgKiBzdGF0ZW1lbnQuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBBYnNvbHV0ZSBwYXRoIG9mIHRoaXMgc2NyaXB0LgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxhdGl2ZVBhdGggUGF0aCBvZiB0aGlzIHNjcmlwdCByZWxhdGl2ZSB0byBnb29nLmJhc2VQYXRoLgogICAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz59IHByb3ZpZGVzIGdvb2cucHJvdmlkZWQgb3IgZ29vZy5tb2R1bGUgc3ltYm9scwogICAqICAgICBpbiB0aGlzIGZpbGUuCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcmVxdWlyZXMgZ29vZyBzeW1ib2xzIG9yIHJlbGF0aXZlIHBhdGhzIHRvIENsb3N1cmUKICAgKiAgICAgdGhpcyBkZXBlbmRzIG9uLgogICAqIEBwYXJhbSB7IU9iamVjdDxzdHJpbmcsIHN0cmluZz59IGxvYWRGbGFncwogICAqIEBwYXJhbSB7Ym9vbGVhbn0gbmVlZHNUcmFuc3BpbGUKICAgKiBAcGFyYW0geyFnb29nLlRyYW5zcGlsZXJ9IHRyYW5zcGlsZXIKICAgKiBAc3RydWN0IEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtnb29nLlRyYW5zZm9ybWVkRGVwZW5kZW5jeX0KICAgKi8KICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5ID0gZnVuY3Rpb24oCiAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIG5lZWRzVHJhbnNwaWxlLAogICAgICB0cmFuc3BpbGVyKSB7CiAgICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5LmJhc2UoCiAgICAgICAgdGhpcywgJ2NvbnN0cnVjdG9yJywgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAvKiogQHByaXZhdGUgQGNvbnN0ICovCiAgICB0aGlzLm5lZWRzVHJhbnNwaWxlXyA9IG5lZWRzVHJhbnNwaWxlOwogICAgLyoqIEBwcml2YXRlIEBjb25zdCAqLwogICAgdGhpcy50cmFuc3BpbGVyXyA9IHRyYW5zcGlsZXI7CiAgfTsKICBnb29nLmluaGVyaXRzKGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3ksIGdvb2cuVHJhbnNmb3JtZWREZXBlbmRlbmN5KTsKCgogIC8qKiBAb3ZlcnJpZGUgKi8KICBnb29nLkdvb2dNb2R1bGVEZXBlbmRlbmN5LnByb3RvdHlwZS50cmFuc2Zvcm0gPSBmdW5jdGlvbihjb250ZW50cykgewogICAgaWYgKHRoaXMubmVlZHNUcmFuc3BpbGVfKSB7CiAgICAgIGNvbnRlbnRzID0gdGhpcy50cmFuc3BpbGVyXy50cmFuc3BpbGUoY29udGVudHMsIHRoaXMuZ2V0UGF0aE5hbWUoKSk7CiAgICB9CgogICAgaWYgKCFnb29nLkxPQURfTU9EVUxFX1VTSU5HX0VWQUwgfHwgZ29vZy5nbG9iYWwuSlNPTiA9PT0gdW5kZWZpbmVkKSB7CiAgICAgIHJldHVybiAnJyArCiAgICAgICAgICAnZ29vZy5sb2FkTW9kdWxlKGZ1bmN0aW9uKGV4cG9ydHMpIHsnICsKICAgICAgICAgICcidXNlIHN0cmljdCI7JyArIGNvbnRlbnRzICsKICAgICAgICAgICdcbicgKyAgLy8gdGVybWluYXRlIGFueSB0cmFpbGluZyBzaW5nbGUgbGluZSBjb21tZW50LgogICAgICAgICAgJztyZXR1cm4gZXhwb3J0cycgKwogICAgICAgICAgJ30pOycgKwogICAgICAgICAgJ1xuLy8jIHNvdXJjZVVSTD0nICsgdGhpcy5wYXRoICsgJ1xuJzsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiAnJyArCiAgICAgICAgICAnZ29vZy5sb2FkTW9kdWxlKCcgKwogICAgICAgICAgZ29vZy5nbG9iYWwuSlNPTi5zdHJpbmdpZnkoCiAgICAgICAgICAgICAgY29udGVudHMgKyAnXG4vLyMgc291cmNlVVJMPScgKyB0aGlzLnBhdGggKyAnXG4nKSArCiAgICAgICAgICAnKTsnOwogICAgfQogIH07CgoKICAvKioKICAgKiBXaGV0aGVyIHRoZSBicm93c2VyIGlzIElFOSBvciBlYXJsaWVyLCB3aGljaCBuZWVkcyBzcGVjaWFsIGhhbmRsaW5nCiAgICogZm9yIGRlZmVycmVkIG1vZHVsZXMuCiAgICogQGNvbnN0IEBwcml2YXRlIHtib29sZWFufQogICAqLwogIGdvb2cuRGVidWdMb2FkZXJfLklTX09MRF9JRV8gPSAhISgKICAgICAgIWdvb2cuZ2xvYmFsLmF0b2IgJiYgZ29vZy5nbG9iYWwuZG9jdW1lbnQgJiYgZ29vZy5nbG9iYWwuZG9jdW1lbnRbJ2FsbCddKTsKCgogIC8qKgogICAqIEBwYXJhbSB7c3RyaW5nfSByZWxQYXRoCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPnx1bmRlZmluZWR9IHByb3ZpZGVzCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gcmVxdWlyZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW58IU9iamVjdDxzdHJpbmc+PX0gb3B0X2xvYWRGbGFncwogICAqIEBzZWUgZ29vZy5hZGREZXBlbmRlbmN5CiAgICovCiAgZ29vZy5EZWJ1Z0xvYWRlcl8ucHJvdG90eXBlLmFkZERlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcmVsUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBvcHRfbG9hZEZsYWdzKSB7CiAgICBwcm92aWRlcyA9IHByb3ZpZGVzIHx8IFtdOwogICAgcmVsUGF0aCA9IHJlbFBhdGgucmVwbGFjZSgvXFwvZywgJy8nKTsKICAgIHZhciBwYXRoID0gZ29vZy5ub3JtYWxpemVQYXRoXyhnb29nLmJhc2VQYXRoICsgcmVsUGF0aCk7CiAgICBpZiAoIW9wdF9sb2FkRmxhZ3MgfHwgdHlwZW9mIG9wdF9sb2FkRmxhZ3MgPT09ICdib29sZWFuJykgewogICAgICBvcHRfbG9hZEZsYWdzID0gb3B0X2xvYWRGbGFncyA/IHsnbW9kdWxlJzogZ29vZy5Nb2R1bGVUeXBlLkdPT0d9IDoge307CiAgICB9CiAgICB2YXIgZGVwID0gdGhpcy5mYWN0b3J5Xy5jcmVhdGVEZXBlbmRlbmN5KAogICAgICAgIHBhdGgsIHJlbFBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgb3B0X2xvYWRGbGFncywKICAgICAgICBnb29nLnRyYW5zcGlsZXJfLm5lZWRzVHJhbnNwaWxlKAogICAgICAgICAgICBvcHRfbG9hZEZsYWdzWydsYW5nJ10gfHwgJ2VzMycsIG9wdF9sb2FkRmxhZ3NbJ21vZHVsZSddKSk7CiAgICB0aGlzLmRlcGVuZGVuY2llc19bcGF0aF0gPSBkZXA7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3ZpZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHRoaXMuaWRUb1BhdGhfW3Byb3ZpZGVzW2ldXSA9IHBhdGg7CiAgICB9CiAgICB0aGlzLmlkVG9QYXRoX1tyZWxQYXRoXSA9IHBhdGg7CiAgfTsKCgogIC8qKgogICAqIENyZWF0ZXMgZ29vZy5EZXBlbmRlbmN5IGluc3RhbmNlcyBmb3IgdGhlIGRlYnVnIGxvYWRlciB0byBsb2FkLgogICAqCiAgICogU2hvdWxkIGJlIG92ZXJyaWRkZW4gdG8gaGF2ZSB0aGUgZGVidWcgbG9hZGVyIHVzZSBjdXN0b20gc3ViY2xhc3NlcyBvZgogICAqIGdvb2cuRGVwZW5kZW5jeS4KICAgKgogICAqIEBwYXJhbSB7IWdvb2cuVHJhbnNwaWxlcn0gdHJhbnNwaWxlcgogICAqIEBzdHJ1Y3QgQGNvbnN0cnVjdG9yCiAgICovCiAgZ29vZy5EZXBlbmRlbmN5RmFjdG9yeSA9IGZ1bmN0aW9uKHRyYW5zcGlsZXIpIHsKICAgIC8qKiBAcHJvdGVjdGVkIEBjb25zdCAqLwogICAgdGhpcy50cmFuc3BpbGVyID0gdHJhbnNwaWxlcjsKICB9OwoKCiAgLyoqCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZS4KICAgKiBAcGFyYW0ge3N0cmluZ30gcmVsYXRpdmVQYXRoIFBhdGggcmVsYXRpdmUgdG8gY2xvc3VyZeKAmXMgYmFzZS5qcy4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBwcm92aWRlcyBBcnJheSBvZiBwcm92aWRlZCBnb29nLnByb3ZpZGUvbW9kdWxlIGlkcy4KICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSByZXF1aXJlcyBBcnJheSBvZiByZXF1aXJlZCBnb29nLnByb3ZpZGUvbW9kdWxlIC8KICAgKiAgICAgcmVsYXRpdmUgRVM2IG1vZHVsZSBwYXRocy4KICAgKiBAcGFyYW0geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fSBsb2FkRmxhZ3MKICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5lZWRzVHJhbnNwaWxlIFRydWUgaWYgdGhlIGZpbGUgbmVlZHMgdG8gYmUgdHJhbnNwaWxlZAogICAqICAgICBwZXIgdGhlIGdvb2cuVHJhbnNwaWxlci4KICAgKiBAcmV0dXJuIHshZ29vZy5EZXBlbmRlbmN5fQogICAqLwogIGdvb2cuRGVwZW5kZW5jeUZhY3RvcnkucHJvdG90eXBlLmNyZWF0ZURlcGVuZGVuY3kgPSBmdW5jdGlvbigKICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncywgbmVlZHNUcmFuc3BpbGUpIHsKCiAgICBpZiAobG9hZEZsYWdzWydtb2R1bGUnXSA9PSBnb29nLk1vZHVsZVR5cGUuR09PRykgewogICAgICByZXR1cm4gbmV3IGdvb2cuR29vZ01vZHVsZURlcGVuZGVuY3koCiAgICAgICAgICBwYXRoLCByZWxhdGl2ZVBhdGgsIHByb3ZpZGVzLCByZXF1aXJlcywgbG9hZEZsYWdzLCBuZWVkc1RyYW5zcGlsZSwKICAgICAgICAgIHRoaXMudHJhbnNwaWxlcik7CiAgICB9IGVsc2UgaWYgKG5lZWRzVHJhbnNwaWxlKSB7CiAgICAgIHJldHVybiBuZXcgZ29vZy5UcmFuc3BpbGVkRGVwZW5kZW5jeSgKICAgICAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MsIHRoaXMudHJhbnNwaWxlcik7CiAgICB9IGVsc2UgewogICAgICBpZiAobG9hZEZsYWdzWydtb2R1bGUnXSA9PSBnb29nLk1vZHVsZVR5cGUuRVM2KSB7CiAgICAgICAgaWYgKGdvb2cuVFJBTlNQSUxFID09ICduZXZlcicgJiYgZ29vZy5BU1NVTUVfRVNfTU9EVUxFU19UUkFOU1BJTEVEKSB7CiAgICAgICAgICByZXR1cm4gbmV3IGdvb2cuUHJlVHJhbnNwaWxlZEVzNk1vZHVsZURlcGVuZGVuY3koCiAgICAgICAgICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBuZXcgZ29vZy5FczZNb2R1bGVEZXBlbmRlbmN5KAogICAgICAgICAgICAgIHBhdGgsIHJlbGF0aXZlUGF0aCwgcHJvdmlkZXMsIHJlcXVpcmVzLCBsb2FkRmxhZ3MpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbmV3IGdvb2cuRGVwZW5kZW5jeSgKICAgICAgICAgICAgcGF0aCwgcmVsYXRpdmVQYXRoLCBwcm92aWRlcywgcmVxdWlyZXMsIGxvYWRGbGFncyk7CiAgICAgIH0KICAgIH0KICB9OwoKCiAgLyoqIEBwcml2YXRlIEBjb25zdCAqLwogIGdvb2cuZGVidWdMb2FkZXJfID0gbmV3IGdvb2cuRGVidWdMb2FkZXJfKCk7CgoKICAvKioKICAgKiBMb2FkcyB0aGUgQ2xvc3VyZSBEZXBlbmRlbmN5IGZpbGUuCiAgICoKICAgKiBFeHBvc2VkIGEgcHVibGljIGZ1bmN0aW9uIHNvIENMT1NVUkVfTk9fREVQUyBjYW4gYmUgc2V0IHRvIGZhbHNlLCBiYXNlCiAgICogbG9hZGVkLCBzZXREZXBlbmRlbmN5RmFjdG9yeSBjYWxsZWQsIGFuZCB0aGVuIHRoaXMgY2FsbGVkLiBpLmUuIGFsbG93cwogICAqIGN1c3RvbSBsb2FkaW5nIG9mIHRoZSBkZXBzIGZpbGUuCiAgICovCiAgZ29vZy5sb2FkQ2xvc3VyZURlcHMgPSBmdW5jdGlvbigpIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLmxvYWRDbG9zdXJlRGVwcygpOwogIH07CgoKICAvKioKICAgKiBTZXRzIHRoZSBkZXBlbmRlbmN5IGZhY3RvcnksIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBjdXN0b20KICAgKiBnb29nLkRlcGVuZGVuY3kgaW1wbGVtZW50YXRpb25zIHRvIGNvbnRyb2wgaG93IGRlcGVuZGVuY2llcyBhcmUgbG9hZGVkLgogICAqCiAgICogTm90ZTogaWYgeW91IHdpc2ggdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIGFuZCBwcm92aWRlIHlvdXIgb3duIGltcGxlbW5ldGF0aW9uCiAgICogaXQgaXMgYSB3aXNlIGlkZWEgdG8gc2V0IENMT1NVUkVfTk9fREVQUyB0byB0cnVlLCBvdGhlcndpc2UgdGhlIGRlcGVuZGVuY3kKICAgKiBmaWxlIGFuZCBhbGwgb2YgaXRzIGdvb2cuYWRkRGVwZW5kZW5jeSBjYWxscyB3aWxsIHVzZSB0aGUgZGVmYXVsdCBmYWN0b3J5LgogICAqIFlvdSBjYW4gY2FsbCBnb29nLmxvYWRDbG9zdXJlRGVwcyB0byBsb2FkIHRoZSBDbG9zdXJlIGRlcGVuZGVuY3kgZmlsZQogICAqIGxhdGVyLCBhZnRlciB5b3VyIGZhY3RvcnkgaXMgaW5qZWN0ZWQuCiAgICoKICAgKiBAcGFyYW0geyFnb29nLkRlcGVuZGVuY3lGYWN0b3J5fSBmYWN0b3J5CiAgICovCiAgZ29vZy5zZXREZXBlbmRlbmN5RmFjdG9yeSA9IGZ1bmN0aW9uKGZhY3RvcnkpIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLnNldERlcGVuZGVuY3lGYWN0b3J5KGZhY3RvcnkpOwogIH07CgoKICBpZiAoIWdvb2cuZ2xvYmFsLkNMT1NVUkVfTk9fREVQUykgewogICAgZ29vZy5kZWJ1Z0xvYWRlcl8ubG9hZENsb3N1cmVEZXBzKCk7CiAgfQoKCiAgLyoqCiAgICogQm9vdHN0cmFwcyB0aGUgZ2l2ZW4gbmFtZXNwYWNlcyBhbmQgY2FsbHMgdGhlIGNhbGxiYWNrIG9uY2UgdGhleSBhcmUKICAgKiBhdmFpbGFibGUgZWl0aGVyIHZpYSBnb29nLnJlcXVpcmUuIFRoaXMgaXMgYSByZXBsYWNlbWVudCBmb3IgdXNpbmcKICAgKiBgZ29vZy5yZXF1aXJlYCB0byBib290c3RyYXAgQ2xvc3VyZSBKYXZhU2NyaXB0LiBQcmV2aW91c2x5IGEgYGdvb2cucmVxdWlyZWAKICAgKiBpbiBhbiBIVE1MIGZpbGUgd291bGQgZ3VhcmFudGVlIHRoYXQgdGhlIHJlcXVpcmUnZCBuYW1lc3BhY2Ugd2FzIGF2YWlsYWJsZQogICAqIGluIHRoZSBuZXh0IGltbWVkaWF0ZSBzY3JpcHQgdGFnLiBXaXRoIEVTNiBtb2R1bGVzIHRoaXMgbm8gbG9uZ2VyIGEKICAgKiBndWFyYW50ZWUuCiAgICoKICAgKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fSBuYW1lc3BhY2VzCiAgICogQHBhcmFtIHtmdW5jdGlvbigpOiA/fSBjYWxsYmFjayBGdW5jdGlvbiB0byBjYWxsIG9uY2UgYWxsIHRoZSBuYW1lc3BhY2VzCiAgICogICAgIGhhdmUgbG9hZGVkLiBBbHdheXMgY2FsbGVkIGFzeW5jaHJvbm91c2x5LgogICAqLwogIGdvb2cuYm9vdHN0cmFwID0gZnVuY3Rpb24obmFtZXNwYWNlcywgY2FsbGJhY2spIHsKICAgIGdvb2cuZGVidWdMb2FkZXJfLmJvb3RzdHJhcChuYW1lc3BhY2VzLCBjYWxsYmFjayk7CiAgfTsKfQoKCi8qKgogKiBAZGVmaW5lIHtzdHJpbmd9IFRydXN0ZWQgVHlwZXMgcG9saWN5IG5hbWUuIElmIG5vbi1lbXB0eSB0aGVuIENsb3N1cmUgd2lsbAogKiB1c2UgVHJ1c3RlZCBUeXBlcy4KICovCmdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfTkFNRSA9CiAgICBnb29nLmRlZmluZSgnZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV9OQU1FJywgJycpOwoKCi8qKgogKiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIuCiAqIEBwYXJhbSB7c3RyaW5nfSBzCiAqIEByZXR1cm4ge3N0cmluZ30KICogQHByaXZhdGUKICovCmdvb2cuaWRlbnRpdHlfID0gZnVuY3Rpb24ocykgewogIHJldHVybiBzOwp9OwoKCi8qKgogKiBDcmVhdGVzIFRydXN0ZWQgVHlwZXMgcG9saWN5IGlmIFRydXN0ZWQgVHlwZXMgYXJlIHN1cHBvcnRlZCBieSB0aGUgYnJvd3Nlci4KICogVGhlIHBvbGljeSBqdXN0IGJsZXNzZXMgYW55IHN0cmluZyBhcyBhIFRydXN0ZWQgVHlwZS4gSXQgaXMgbm90IHZpc2liaWxpdHkKICogcmVzdHJpY3RlZCBiZWNhdXNlIGFueW9uZSBjYW4gYWxzbyBjYWxsIFRydXN0ZWRUeXBlcy5jcmVhdGVQb2xpY3kgZGlyZWN0bHkuCiAqIEhvd2V2ZXIsIHRoZSBhbGxvd2VkIG5hbWVzIHNob3VsZCBiZSByZXN0cmljdGVkIGJ5IGEgSFRUUCBoZWFkZXIgYW5kIHRoZQogKiByZWZlcmVuY2UgdG8gdGhlIGNyZWF0ZWQgcG9saWN5IHNob3VsZCBiZSB2aXNpYmlsaXR5IHJlc3RyaWN0ZWQuCiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAqIEByZXR1cm4gez9UcnVzdGVkVHlwZVBvbGljeX0KICovCmdvb2cuY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5ID0gZnVuY3Rpb24obmFtZSkgewogIHZhciBwb2xpY3kgPSBudWxsOwogIC8vIFRPRE8oa290byk6IFJlbW92ZSB3aW5kb3cuVHJ1c3RlZFR5cGVzIHZhcmlhbnQgd2hlbiB0aGUgbmV3ZXIgQVBJIHNoaXBzLgogIHZhciBwb2xpY3lGYWN0b3J5ID0gZ29vZy5nbG9iYWwudHJ1c3RlZFR5cGVzIHx8IGdvb2cuZ2xvYmFsLlRydXN0ZWRUeXBlczsKICBpZiAoIXBvbGljeUZhY3RvcnkgfHwgIXBvbGljeUZhY3RvcnkuY3JlYXRlUG9saWN5KSB7CiAgICByZXR1cm4gcG9saWN5OwogIH0KICAvLyBUcnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5IHRocm93cyBpZiBjYWxsZWQgd2l0aCBhIG5hbWUgdGhhdCBpcyBhbHJlYWR5CiAgLy8gcmVnaXN0ZXJlZCwgZXZlbiBpbiByZXBvcnQtb25seSBtb2RlLiBVbnRpbCB0aGUgQVBJIGNoYW5nZXMsIGNhdGNoIHRoZQogIC8vIGVycm9yIG5vdCB0byBicmVhayB0aGUgYXBwbGljYXRpb25zIGZ1bmN0aW9uYWxseS4gSW4gc3VjaCBjYXNlLCB0aGUgY29kZQogIC8vIHdpbGwgZmFsbCBiYWNrIHRvIHVzaW5nIHJlZ3VsYXIgU2FmZSBUeXBlcy4KICAvLyBUT0RPKGtvdG8pOiBSZW1vdmUgY2F0Y2hpbmcgb25jZSBjcmVhdGVQb2xpY3kgQVBJIHN0b3BzIHRocm93aW5nLgogIHRyeSB7CiAgICBwb2xpY3kgPSBwb2xpY3lGYWN0b3J5LmNyZWF0ZVBvbGljeShuYW1lLCB7CiAgICAgIGNyZWF0ZUhUTUw6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVTY3JpcHQ6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVTY3JpcHRVUkw6IGdvb2cuaWRlbnRpdHlfLAogICAgICBjcmVhdGVVUkw6IGdvb2cuaWRlbnRpdHlfCiAgICB9KTsKICB9IGNhdGNoIChlKSB7CiAgICBnb29nLmxvZ1RvQ29uc29sZV8oZS5tZXNzYWdlKTsKICB9CiAgcmV0dXJuIHBvbGljeTsKfTsKCgovKiogQHByaXZhdGUgQGNvbnN0IHs/VHJ1c3RlZFR5cGVQb2xpY3l9ICovCmdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID0gZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV9OQU1FID8KICAgIGdvb2cuY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfTkFNRSArICcjYmFzZScpIDoKICAgIG51bGw7CgovLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2xvc3VyZSBMaWJyYXJ5IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi8vCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUy1JUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgovLwovLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgR2VuSnNEZXBzLCBwbGVhc2UgZG8gbm90IGVkaXQuCgovLyBEaXNhYmxlIENsYW5nIGZvcm1hdHRlciBmb3IgdGhpcyBmaWxlLgovLyBTZWUgaHR0cDovL2dvby5nbC9TZGl3WkgKLy8gY2xhbmctZm9ybWF0IG9mZgoKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xsZWN0aW9ucy9zZXRzLmpzJywgWydnb29nLmNvbGxlY3Rpb25zLnNldHMnXSwgWydnb29nLmxhYnMuY29sbGVjdGlvbnMuaXRlcmFibGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY29sbGVjdGlvbnMvc2V0c190ZXN0LmpzJywgWydnb29nLmNvbGxlY3Rpb25zLnNldHNUZXN0J10sIFsnZ29vZy5jb2xsZWN0aW9ucy5zZXRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWQuanMnLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5hc3luYy5EZWZlcnJlZC5BbHJlYWR5Q2FsbGVkRXJyb3InLCAnZ29vZy5hc3luYy5EZWZlcnJlZC5DYW5jZWxlZEVycm9yJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGhlbmFibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnLi4vLi4vdGhpcmRfcGFydHkvY2xvc3VyZS9nb29nL21vY2hpa2l0L2FzeW5jL2RlZmVycmVkX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuZGVmZXJyZWRBc3luY1Rlc3QnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWRfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5kZWZlcnJlZFRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaGVuYWJsZScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWRsaXN0LmpzJywgWydnb29nLmFzeW5jLkRlZmVycmVkTGlzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJy4uLy4uL3RoaXJkX3BhcnR5L2Nsb3N1cmUvZ29vZy9tb2NoaWtpdC9hc3luYy9kZWZlcnJlZGxpc3RfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5kZWZlcnJlZExpc3RUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuYXN5bmMuRGVmZXJyZWRMaXN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90by9wcm90by5qcycsIFsnZ29vZy5wcm90byddLCBbJ2dvb2cucHJvdG8uU2VyaWFsaXplciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8vc2VyaWFsaXplci5qcycsIFsnZ29vZy5wcm90by5TZXJpYWxpemVyJ10sIFsnZ29vZy5qc29uLlNlcmlhbGl6ZXInLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvL3NlcmlhbGl6ZXJfdGVzdC5qcycsIFsnZ29vZy5wcm90b1Rlc3QnXSwgWydnb29nLnByb3RvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhMTF5L2FyaWEvYW5ub3VuY2VyLmpzJywgWydnb29nLmExMXkuYXJpYS5Bbm5vdW5jZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL2Fubm91bmNlcl90ZXN0LmpzJywgWydnb29nLmExMXkuYXJpYS5Bbm5vdW5jZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQW5ub3VuY2VyJywgJ2dvb2cuYTExeS5hcmlhLkxpdmVQcmlvcml0eScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uaWZyYW1lJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ExMXkvYXJpYS9hcmlhLmpzJywgWydnb29nLmExMXkuYXJpYSddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hMTF5LmFyaWEuZGF0YXRhYmxlcycsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhMTF5L2FyaWEvYXJpYV90ZXN0LmpzJywgWydnb29nLmExMXkuYXJpYVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ExMXkvYXJpYS9hdHRyaWJ1dGVzLmpzJywgWydnb29nLmExMXkuYXJpYS5BdXRvQ29tcGxldGVWYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuQ2hlY2tlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5Ecm9wRWZmZWN0VmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLkV4cGFuZGVkVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLkdyYWJiZWRWYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuSW52YWxpZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5hMTF5LmFyaWEuT3JpZW50YXRpb25WYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuUHJlc3NlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5SZWxldmFudFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5TZWxlY3RlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5Tb3J0VmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL2RhdGF0YWJsZXMuanMnLCBbJ2dvb2cuYTExeS5hcmlhLmRhdGF0YWJsZXMnXSwgWydnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL3JvbGVzLmpzJywgWydnb29nLmExMXkuYXJpYS5Sb2xlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXJyYXkvYXJyYXkuanMnLCBbJ2dvb2cuYXJyYXknXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FycmF5L2FycmF5X3Rlc3QuanMnLCBbJ2dvb2cuYXJyYXlUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczcnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXNzZXJ0cy9hc3NlcnRzLmpzJywgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJ10sIFsnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRvbS5Ob2RlVHlwZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXNzZXJ0cy9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cuYXNzZXJ0c1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5yZWZsZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9hbmltYXRpb25kZWxheS5qcycsIFsnZ29vZy5hc3luYy5BbmltYXRpb25EZWxheSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvYW5pbWF0aW9uZGVsYXlfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5BbmltYXRpb25EZWxheVRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmFzeW5jLkFuaW1hdGlvbkRlbGF5JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9jb25kaXRpb25hbGRlbGF5LmpzJywgWydnb29nLmFzeW5jLkNvbmRpdGlvbmFsRGVsYXknXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hc3luYy5EZWxheSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvY29uZGl0aW9uYWxkZWxheV90ZXN0LmpzJywgWydnb29nLmFzeW5jLkNvbmRpdGlvbmFsRGVsYXlUZXN0J10sIFsnZ29vZy5hc3luYy5Db25kaXRpb25hbERlbGF5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2RlYm91bmNlci5qcycsIFsnZ29vZy5hc3luYy5EZWJvdW5jZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvZGVib3VuY2VyX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuRGVib3VuY2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWJvdW5jZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2RlbGF5LmpzJywgWydnb29nLkRlbGF5JywgJ2dvb2cuYXN5bmMuRGVsYXknXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvZGVsYXlfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5EZWxheVRlc3QnXSwgWydnb29nLmFzeW5jLkRlbGF5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2ZyZWVsaXN0LmpzJywgWydnb29nLmFzeW5jLkZyZWVMaXN0J10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2ZyZWVsaXN0X3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuRnJlZUxpc3RUZXN0J10sIFsnZ29vZy5hc3luYy5GcmVlTGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvbmV4dHRpY2suanMnLCBbJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5hc3luYy50aHJvd0V4Y2VwdGlvbiddLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL25leHR0aWNrX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMubmV4dFRpY2tUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvcnVuLmpzJywgWydnb29nLmFzeW5jLnJ1biddLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlJywgJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5hc3luYy50aHJvd0V4Y2VwdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvcnVuX25leHRfdGlja190ZXN0LmpzJywgWydnb29nLmFzeW5jLnJ1bk5leHRUaWNrVGVzdCddLCBbJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9ydW5fdGVzdC5qcycsIFsnZ29vZy5hc3luYy5ydW5UZXN0J10sIFsnZ29vZy5hc3luYy5ydW4nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy90aHJvdHRsZS5qcycsIFsnZ29vZy5UaHJvdHRsZScsICdnb29nLmFzeW5jLlRocm90dGxlJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL3Rocm90dGxlX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuVGhyb3R0bGVUZXN0J10sIFsnZ29vZy5hc3luYy5UaHJvdHRsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy93b3JrcXVldWUuanMnLCBbJ2dvb2cuYXN5bmMuV29ya0l0ZW0nLCAnZ29vZy5hc3luYy5Xb3JrUXVldWUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5GcmVlTGlzdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvd29ya3F1ZXVlX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlVGVzdCddLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdiYXNlLmpzJywgWydnb29nJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYmFzZV9tb2R1bGVfdGVzdC5qcycsIFsnZ29vZy5iYXNlTW9kdWxlVGVzdCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy50ZXN0X21vZHVsZScsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuanN1bml0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdiYXNlX3Rlc3QuanMnLCBbJ2dvb2cuYmFzZVRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLlVyaScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdF9tb2R1bGUnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9hbHBoYS5qcycsIFsnZ29vZy5jb2xvci5hbHBoYSddLCBbJ2dvb2cuY29sb3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NvbG9yL2FscGhhX3Rlc3QuanMnLCBbJ2dvb2cuY29sb3IuYWxwaGFUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNvbG9yLmFscGhhJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9jb2xvci5qcycsIFsnZ29vZy5jb2xvcicsICdnb29nLmNvbG9yLkhzbCcsICdnb29nLmNvbG9yLkhzdicsICdnb29nLmNvbG9yLlJnYiddLCBbJ2dvb2cuY29sb3IubmFtZXMnLCAnZ29vZy5tYXRoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9jb2xvcl90ZXN0LmpzJywgWydnb29nLmNvbG9yVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5jb2xvcicsICdnb29nLmNvbG9yLm5hbWVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9uYW1lcy5qcycsIFsnZ29vZy5jb2xvci5uYW1lcyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Flcy5qcycsIFsnZ29vZy5jcnlwdC5BZXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5CbG9ja0NpcGhlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYWVzX3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuQWVzVGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5BZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2FyYzQuanMnLCBbJ2dvb2cuY3J5cHQuQXJjNCddLCBbJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYXJjNF90ZXN0LmpzJywgWydnb29nLmNyeXB0LkFyYzRUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNyeXB0LkFyYzQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2U2NC5qcycsIFsnZ29vZy5jcnlwdC5iYXNlNjQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdCcsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmFzZTY0X3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuYmFzZTY0VGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5iYXNlNjQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2VuLmpzJywgWydnb29nLmNyeXB0LmJhc2VOJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2VuX3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuYmFzZU5UZXN0J10sIFsnZ29vZy5jcnlwdC5iYXNlTicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmxvYmhhc2hlci5qcycsIFsnZ29vZy5jcnlwdC5CbG9iSGFzaGVyJywgJ2dvb2cuY3J5cHQuQmxvYkhhc2hlci5FdmVudFR5cGUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mcycsICdnb29nLmxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmxvYmhhc2hlcl90ZXN0LmpzJywgWydnb29nLmNyeXB0LkJsb2JIYXNoZXJUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkJsb2JIYXNoZXInLCAnZ29vZy5jcnlwdC5NZDUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jsb2NrY2lwaGVyLmpzJywgWydnb29nLmNyeXB0LkJsb2NrQ2lwaGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYnl0ZXN0cmluZ19wZXJmLmpzJywgWydnb29nLmNyeXB0LmJ5dGVBcnJheVRvU3RyaW5nUGVyZiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2NiYy5qcycsIFsnZ29vZy5jcnlwdC5DYmMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuQmxvY2tDaXBoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2NiY190ZXN0LmpzJywgWydnb29nLmNyeXB0LkNiY1Rlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuQWVzJywgJ2dvb2cuY3J5cHQuQ2JjJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jcnlwdC5qcycsIFsnZ29vZy5jcnlwdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jcnlwdF90ZXN0LmpzJywgWydnb29nLmNyeXB0VGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2N0ci5qcycsIFsnZ29vZy5jcnlwdC5DdHInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jdHJfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5DdHJUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkFlcycsICdnb29nLmNyeXB0LkN0cicsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvaGFzaC5qcycsIFsnZ29vZy5jcnlwdC5IYXNoJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvaGFzaDMyLmpzJywgWydnb29nLmNyeXB0Lmhhc2gzMiddLCBbJ2dvb2cuY3J5cHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2hhc2gzMl90ZXN0LmpzJywgWydnb29nLmNyeXB0Lmhhc2gzMlRlc3QnXSwgWydnb29nLmNyeXB0Lmhhc2gzMicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2hhc2h0ZXN0ZXIuanMnLCBbJ2dvb2cuY3J5cHQuaGFzaFRlc3RlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5jcnlwdCcsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnRlc3RpbmcuUGVyZm9ybWFuY2VUYWJsZScsICdnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9obWFjLmpzJywgWydnb29nLmNyeXB0LkhtYWMnXSwgWydnb29nLmNyeXB0Lkhhc2gnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2htYWNfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5IbWFjVGVzdCddLCBbJ2dvb2cuY3J5cHQuSG1hYycsICdnb29nLmNyeXB0LlNoYTEnLCAnZ29vZy5jcnlwdC5oYXNoVGVzdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9tZDUuanMnLCBbJ2dvb2cuY3J5cHQuTWQ1J10sIFsnZ29vZy5jcnlwdC5IYXNoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9tZDVfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5NZDVUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0Lk1kNScsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3Bia2RmMi5qcycsIFsnZ29vZy5jcnlwdC5wYmtkZjInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuSG1hYycsICdnb29nLmNyeXB0LlNoYTEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3Bia2RmMl90ZXN0LmpzJywgWydnb29nLmNyeXB0LnBia2RmMlRlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQucGJrZGYyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGExLmpzJywgWydnb29nLmNyeXB0LlNoYTEnXSwgWydnb29nLmNyeXB0Lkhhc2gnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTFfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5TaGExVGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5TaGExJywgJ2dvb2cuY3J5cHQuaGFzaFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvc2hhMi5qcycsIFsnZ29vZy5jcnlwdC5TaGEyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5IYXNoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyMjQuanMnLCBbJ2dvb2cuY3J5cHQuU2hhMjI0J10sIFsnZ29vZy5jcnlwdC5TaGEyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyMjRfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5TaGEyMjRUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LlNoYTIyNCcsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTI1Ni5qcycsIFsnZ29vZy5jcnlwdC5TaGEyNTYnXSwgWydnb29nLmNyeXB0LlNoYTInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTI1Nl90ZXN0LmpzJywgWydnb29nLmNyeXB0LlNoYTI1NlRlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuU2hhMjU2JywgJ2dvb2cuY3J5cHQuaGFzaFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvc2hhMl82NGJpdC5qcycsIFsnZ29vZy5jcnlwdC5TaGEyXzY0Yml0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5IYXNoJywgJ2dvb2cubWF0aC5Mb25nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyXzY0Yml0X3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuU2hhMl82NGJpdF90ZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuU2hhMzg0JywgJ2dvb2cuY3J5cHQuU2hhNTEyJywgJ2dvb2cuY3J5cHQuU2hhNTEyXzI1NicsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTM4NC5qcycsIFsnZ29vZy5jcnlwdC5TaGEzODQnXSwgWydnb29nLmNyeXB0LlNoYTJfNjRiaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTUxMi5qcycsIFsnZ29vZy5jcnlwdC5TaGE1MTInXSwgWydnb29nLmNyeXB0LlNoYTJfNjRiaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTUxMl8yNTYuanMnLCBbJ2dvb2cuY3J5cHQuU2hhNTEyXzI1NiddLCBbJ2dvb2cuY3J5cHQuU2hhMl82NGJpdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vY3Nzb20uanMnLCBbJ2dvb2cuY3Nzb20nLCAnZ29vZy5jc3NvbS5Dc3NSdWxlVHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vY3Nzb21fdGVzdC5qcycsIFsnZ29vZy5jc3NvbVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY3Nzb20nLCAnZ29vZy5jc3NvbS5Dc3NSdWxlVHlwZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vaWZyYW1lL3N0eWxlLmpzJywgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNzc29tJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Nzc29tL2lmcmFtZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZVRlc3QnXSwgWydnb29nLmNzc29tJywgJ2dvb2cuY3Nzb20uaWZyYW1lLnN0eWxlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2RhdGFtYW5hZ2VyLmpzJywgWydnb29nLmRzLkRhdGFNYW5hZ2VyJ10sIFsnZ29vZy5kcy5CYXNpY05vZGVMaXN0JywgJ2dvb2cuZHMuRGF0YU5vZGUnLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuTWFwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2RhdGFzb3VyY2UuanMnLCBbJ2dvb2cuZHMuQmFzZURhdGFOb2RlJywgJ2dvb2cuZHMuQmFzaWNOb2RlTGlzdCcsICdnb29nLmRzLkRhdGFOb2RlJywgJ2dvb2cuZHMuRGF0YU5vZGVMaXN0JywgJ2dvb2cuZHMuRW1wdHlOb2RlTGlzdCcsICdnb29nLmRzLkxvYWRTdGF0ZScsICdnb29nLmRzLlNvcnRlZE5vZGVMaXN0JywgJ2dvb2cuZHMuVXRpbCcsICdnb29nLmRzLmxvZ2dlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvZGF0YXNvdXJjZV90ZXN0LmpzJywgWydnb29nLmRzLkpzRGF0YVNvdXJjZVRlc3QnXSwgWydnb29nLmRvbS54bWwnLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkpzRGF0YVNvdXJjZScsICdnb29nLmRzLlNvcnRlZE5vZGVMaXN0JywgJ2dvb2cuZHMuWG1sRGF0YVNvdXJjZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0YXNvdXJjZS9leHByLmpzJywgWydnb29nLmRzLkV4cHInXSwgWydnb29nLmRzLkJhc2ljTm9kZUxpc3QnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2V4cHJfdGVzdC5qcycsIFsnZ29vZy5kcy5FeHByVGVzdCddLCBbJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cuZHMuSnNEYXRhU291cmNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2Zhc3RkYXRhbm9kZS5qcycsIFsnZ29vZy5kcy5BYnN0cmFjdEZhc3REYXRhTm9kZScsICdnb29nLmRzLkZhc3REYXRhTm9kZScsICdnb29nLmRzLkZhc3RMaXN0Tm9kZScsICdnb29nLmRzLlByaW1pdGl2ZUZhc3REYXRhTm9kZSddLCBbJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5EYXRhTm9kZUxpc3QnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2Zhc3RkYXRhbm9kZV90ZXN0LmpzJywgWydnb29nLmRzLkZhc3REYXRhTm9kZVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cuZHMuRmFzdERhdGFOb2RlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2pzZGF0YXNvdXJjZS5qcycsIFsnZ29vZy5kcy5Kc0RhdGFTb3VyY2UnLCAnZ29vZy5kcy5Kc1Byb3BlcnR5RGF0YVNvdXJjZSddLCBbJ2dvb2cuZHMuQmFzZURhdGFOb2RlJywgJ2dvb2cuZHMuQmFzaWNOb2RlTGlzdCcsICdnb29nLmRzLkRhdGFNYW5hZ2VyJywgJ2dvb2cuZHMuRGF0YU5vZGUnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuZHMuTG9hZFN0YXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2pzb25kYXRhc291cmNlLmpzJywgWydnb29nLmRzLkpzb25EYXRhU291cmNlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5Kc0RhdGFTb3VyY2UnLCAnZ29vZy5kcy5Mb2FkU3RhdGUnLCAnZ29vZy5kcy5sb2dnZXInLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvanN4bWxodHRwZGF0YXNvdXJjZS5qcycsIFsnZ29vZy5kcy5Kc1htbEh0dHBEYXRhU291cmNlJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkZhc3REYXRhTm9kZScsICdnb29nLmRzLkxvYWRTdGF0ZScsICdnb29nLmRzLmxvZ2dlcicsICdnb29nLmV2ZW50cycsICdnb29nLmxvZycsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvanN4bWxodHRwZGF0YXNvdXJjZV90ZXN0LmpzJywgWydnb29nLmRzLkpzWG1sSHR0cERhdGFTb3VyY2VUZXN0J10sIFsnZ29vZy5kcy5Kc1htbEh0dHBEYXRhU291cmNlJywgJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0YXNvdXJjZS94bWxkYXRhc291cmNlLmpzJywgWydnb29nLmRzLlhtbERhdGFTb3VyY2UnLCAnZ29vZy5kcy5YbWxIdHRwRGF0YVNvdXJjZSddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnhtbCcsICdnb29nLmRzLkJhc2ljTm9kZUxpc3QnLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkRhdGFOb2RlJywgJ2dvb2cuZHMuTG9hZFN0YXRlJywgJ2dvb2cuZHMubG9nZ2VyJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL2RhdGUuanMnLCBbJ2dvb2cuZGF0ZScsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5tb250aCcsICdnb29nLmRhdGUud2Vla0RheSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRhdGUuRGF0ZUxpa2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9kYXRlX3Rlc3QuanMnLCBbJ2dvb2cuZGF0ZVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZGF0ZScsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5tb250aCcsICdnb29nLmRhdGUud2Vla0RheScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZGF0ZWxpa2UuanMnLCBbJ2dvb2cuZGF0ZS5EYXRlTGlrZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZGF0ZXJhbmdlLmpzJywgWydnb29nLmRhdGUuRGF0ZVJhbmdlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UuSXRlcmF0b3InLCAnZ29vZy5kYXRlLkRhdGVSYW5nZS5TdGFuZGFyZERhdGVSYW5nZUtleXMnXSwgWydnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuSW50ZXJ2YWwnLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL2RhdGVyYW5nZV90ZXN0LmpzJywgWydnb29nLmRhdGUuRGF0ZVJhbmdlVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZHVyYXRpb24uanMnLCBbJ2dvb2cuZGF0ZS5kdXJhdGlvbiddLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uTWVzc2FnZUZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9kdXJhdGlvbl90ZXN0LmpzJywgWydnb29nLmRhdGUuZHVyYXRpb25UZXN0J10sIFsnZ29vZy5kYXRlLmR1cmF0aW9uJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZhJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3JlbGF0aXZlLmpzJywgWydnb29nLmRhdGUucmVsYXRpdmUnLCAnZ29vZy5kYXRlLnJlbGF0aXZlLlRpbWVEZWx0YUZvcm1hdHRlcicsICdnb29nLmRhdGUucmVsYXRpdmUuVW5pdCddLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJucycsICdnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9yZWxhdGl2ZV90ZXN0LmpzJywgWydnb29nLmRhdGUucmVsYXRpdmVUZXN0J10sIFsnZ29vZy5kYXRlLnJlbGF0aXZlQ29tbW9uVGVzdHMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3JlbGF0aXZlY29tbW9udGVzdHMuanMnLCBbJ2dvb2cuZGF0ZS5yZWxhdGl2ZUNvbW1vblRlc3RzJ10sIFsnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5yZWxhdGl2ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3V0Y2RhdGV0aW1lLmpzJywgWydnb29nLmRhdGUuVXRjRGF0ZVRpbWUnXSwgWydnb29nLmRhdGUnLCAnZ29vZy5kYXRlLkRhdGUnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS91dGNkYXRldGltZV90ZXN0LmpzJywgWydnb29nLmRhdGUuVXRjRGF0ZVRpbWVUZXN0J10sIFsnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5VdGNEYXRlVGltZScsICdnb29nLmRhdGUubW9udGgnLCAnZ29vZy5kYXRlLndlZWtEYXknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RiL2N1cnNvci5qcycsIFsnZ29vZy5kYi5DdXJzb3InXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRlYnVnJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9kYi5qcycsIFsnZ29vZy5kYicsICdnb29nLmRiLkJsb2NrZWRDYWxsYmFjaycsICdnb29nLmRiLlVwZ3JhZGVOZWVkZWRDYWxsYmFjayddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5JbmRleGVkRGInLCAnZ29vZy5kYi5UcmFuc2FjdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvZGJfdGVzdC5qcycsIFsnZ29vZy5kYlRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmRiJywgJ2dvb2cuZGIuQ3Vyc29yJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5JbmRleGVkRGInLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRiLlRyYW5zYWN0aW9uJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9lcnJvci5qcycsIFsnZ29vZy5kYi5Eb21FcnJvckxpa2UnLCAnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLkVycm9yLkVycm9yQ29kZScsICdnb29nLmRiLkVycm9yLkVycm9yTmFtZScsICdnb29nLmRiLkVycm9yLlZlcnNpb25DaGFuZ2VCbG9ja2VkRXJyb3InXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvaW5kZXguanMnLCBbJ2dvb2cuZGIuSW5kZXgnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuQ3Vyc29yJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9pbmRleGVkZGIuanMnLCBbJ2dvb2cuZGIuSW5kZXhlZERiJ10sIFsnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLk9iamVjdFN0b3JlJywgJ2dvb2cuZGIuVHJhbnNhY3Rpb24nLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIva2V5cmFuZ2UuanMnLCBbJ2dvb2cuZGIuS2V5UmFuZ2UnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9vYmplY3RzdG9yZS5qcycsIFsnZ29vZy5kYi5PYmplY3RTdG9yZSddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5kYi5DdXJzb3InLCAnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLkluZGV4JywgJ2dvb2cuZGIuS2V5UmFuZ2UnLCAnZ29vZy5kZWJ1ZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvdHJhbnNhY3Rpb24uanMnLCBbJ2dvb2cuZGIuVHJhbnNhY3Rpb24nLCAnZ29vZy5kYi5UcmFuc2FjdGlvbi5UcmFuc2FjdGlvbk1vZGUnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5PYmplY3RTdG9yZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2NvbnNvbGUuanMnLCBbJ2dvb2cuZGVidWcuQ29uc29sZSddLCBbJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRlYnVnLlRleHRGb3JtYXR0ZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2NvbnNvbGVfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Db25zb2xlVGVzdCddLCBbJ2dvb2cuZGVidWcuQ29uc29sZScsICdnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RlYnVnLmpzJywgWydnb29nLmRlYnVnJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZGVidWdfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Z1Rlc3QnXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuZXJyb3Jjb250ZXh0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZWJ1Z3dpbmRvdy5qcycsIFsnZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdyddLCBbJ2dvb2cuZGVidWcuSHRtbEZvcm1hdHRlcicsICdnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZGVidWd3aW5kb3dfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvd1Rlc3QnXSwgWydnb29nLmRlYnVnLkRlYnVnV2luZG93JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZXZjc3MvZGV2Y3NzLmpzJywgWydnb29nLmRlYnVnLkRldkNzcycsICdnb29nLmRlYnVnLkRldkNzcy5Vc2VyQWdlbnQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jc3NvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZXZjc3MvZGV2Y3NzX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuRGV2Q3NzVGVzdCddLCBbJ2dvb2cuZGVidWcuRGV2Q3NzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RldmNzcy9kZXZjc3NydW5uZXIuanMnLCBbJ2dvb2cuZGVidWcuZGV2Q3NzUnVubmVyJ10sIFsnZ29vZy5kZWJ1Zy5EZXZDc3MnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RpdmNvbnNvbGUuanMnLCBbJ2dvb2cuZGVidWcuRGl2Q29uc29sZSddLCBbJ2dvb2cuZGVidWcuSHRtbEZvcm1hdHRlcicsICdnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2VuaGFuY2VlcnJvcl90ZXN0LmpzJywgWydnb29nLmRlYnVnRW5oYW5jZUVycm9yVGVzdCddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2VudHJ5cG9pbnRyZWdpc3RyeS5qcycsIFsnZ29vZy5kZWJ1Zy5FbnRyeVBvaW50TW9uaXRvcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeSddLCBbJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZW50cnlwb2ludHJlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5VGVzdCddLCBbJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvci5qcycsIFsnZ29vZy5kZWJ1Zy5FcnJvciddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLkVycm9yVGVzdCddLCBbJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3Jjb250ZXh0LmpzJywgWydnb29nLmRlYnVnLmVycm9yY29udGV4dCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2Vycm9yY29udGV4dF90ZXN0LmpzJywgWydnb29nLmRlYnVnLmVycm9yY29udGV4dFRlc3QnXSwgWydnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JoYW5kbGVyLmpzJywgWydnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLkVycm9ySGFuZGxlci5Qcm90ZWN0ZWRGdW5jdGlvbkVycm9yJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuRW50cnlQb2ludE1vbml0b3InLCAnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLlRyYWNlJ10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JoYW5kbGVyX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyQXN5bmNUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcmhhbmRsZXJ3ZWFrZGVwLmpzJywgWydnb29nLmRlYnVnLmVycm9ySGFuZGxlcldlYWtEZXAnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcnJlcG9ydGVyLmpzJywgWydnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXInLCAnZ29vZy5kZWJ1Zy5FcnJvclJlcG9ydGVyLkV4Y2VwdGlvbkV2ZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeScsICdnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmxvZycsICdnb29nLm5ldC5YaHJJbycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnVyaS51dGlscycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JyZXBvcnRlcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXInLCAnZ29vZy5kZWJ1Zy5lcnJvcmNvbnRleHQnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZmFuY3l3aW5kb3cuanMnLCBbJ2dvb2cuZGVidWcuRmFuY3lXaW5kb3cnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnLkRlYnVnV2luZG93JywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2Zvcm1hdHRlci5qcycsIFsnZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXInLCAnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZGVidWcuVGV4dEZvcm1hdHRlciddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kZWJ1Zy5SZWxhdGl2ZVRpbWVQcm92aWRlcicsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9mb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJywgJ2dvb2cuZGVidWcuTG9nZ2VyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZnBzZGlzcGxheS5qcycsIFsnZ29vZy5kZWJ1Zy5GcHNEaXNwbGF5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuYXN5bmMuQW5pbWF0aW9uRGVsYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZnBzZGlzcGxheV90ZXN0LmpzJywgWydnb29nLmRlYnVnLkZwc0Rpc3BsYXlUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmRlYnVnLkZwc0Rpc3BsYXknLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2didWZmZXIuanMnLCBbJ2dvb2cuZGVidWcuTG9nQnVmZmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2didWZmZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dCdWZmZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5Mb2dCdWZmZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2xvZ2dlci5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyJywgJ2dvb2cuZGVidWcuTG9nZ2FibGUnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nQnVmZmVyJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dnZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dnZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyJywgJ2dvb2cuZGVidWcuTG9nZ2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dyZWNvcmQuanMnLCBbJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvbG9ncmVjb3Jkc2VyaWFsaXplci5qcycsIFsnZ29vZy5kZWJ1Zy5sb2dSZWNvcmRTZXJpYWxpemVyJ10sIFsnZ29vZy5kZWJ1Zy5Mb2dSZWNvcmQnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5qc29uJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dyZWNvcmRzZXJpYWxpemVyX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcubG9nUmVjb3JkU2VyaWFsaXplclRlc3QnXSwgWydnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRlYnVnLmxvZ1JlY29yZFNlcmlhbGl6ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL3JlbGF0aXZldGltZXByb3ZpZGVyLmpzJywgWydnb29nLmRlYnVnLlJlbGF0aXZlVGltZVByb3ZpZGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvdHJhY2VyLmpzJywgWydnb29nLmRlYnVnLlN0b3BUcmFjZURldGFpbCcsICdnb29nLmRlYnVnLlRyYWNlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5pdGVyJywgJ2dvb2cubG9nJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL3RyYWNlcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLlRyYWNlVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kZWJ1Zy5UcmFjZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlZmluZWNsYXNzX3Rlc3QuanMnLCBbJ2dvb2cuZGVmaW5lQ2xhc3NUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlbGVnYXRlL2RlbGVnYXRlcmVnaXN0cnkuanMnLCBbJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWxlZ2F0ZS9kZWxlZ2F0ZXJlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVsZWdhdGUvZGVsZWdhdGVzLmpzJywgWydnb29nLmRlbGVnYXRlLmRlbGVnYXRlcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWxlZ2F0ZS9kZWxlZ2F0ZXNfdGVzdC5qcycsIFsnZ29vZy5kZWxlZ2F0ZS5kZWxlZ2F0ZXNUZXN0J10sIFsnZ29vZy5kZWxlZ2F0ZS5kZWxlZ2F0ZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkaXNwb3NhYmxlL2Rpc3Bvc2FibGUuanMnLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kaXNwb3NlQWxsJ10sIFsnZ29vZy5kaXNwb3NhYmxlLklEaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkaXNwb3NhYmxlL2Rpc3Bvc2FibGVfdGVzdC5qcycsIFsnZ29vZy5EaXNwb3NhYmxlVGVzdCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Rpc3Bvc2FibGUvaWRpc3Bvc2FibGUuanMnLCBbJ2dvb2cuZGlzcG9zYWJsZS5JRGlzcG9zYWJsZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hYnN0cmFjdG11bHRpcmFuZ2UuanMnLCBbJ2dvb2cuZG9tLkFic3RyYWN0TXVsdGlSYW5nZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hYnN0cmFjdHJhbmdlLmpzJywgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlSXRlcmF0b3InLCAnZ29vZy5kb20uUmFuZ2VUeXBlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlJywgJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYWJzdHJhY3RyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2FuaW1hdGlvbmZyYW1lL2FuaW1hdGlvbmZyYW1lLmpzJywgWydnb29nLmRvbS5hbmltYXRpb25GcmFtZScsICdnb29nLmRvbS5hbmltYXRpb25GcmFtZS5TcGVjJywgJ2dvb2cuZG9tLmFuaW1hdGlvbkZyYW1lLlN0YXRlJ10sIFsnZ29vZy5kb20uYW5pbWF0aW9uRnJhbWUucG9seWZpbGwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbmltYXRpb25mcmFtZS9hbmltYXRpb25mcmFtZV90ZXN0LmpzJywgWydnb29nLmRvbS5BbmltYXRpb25GcmFtZVRlc3QnXSwgWydnb29nLmRvbS5hbmltYXRpb25GcmFtZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYW5pbWF0aW9uZnJhbWUvcG9seWZpbGwuanMnLCBbJ2dvb2cuZG9tLmFuaW1hdGlvbkZyYW1lLnBvbHlmaWxsJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbm5vdGF0ZS5qcycsIFsnZ29vZy5kb20uYW5ub3RhdGUnLCAnZ29vZy5kb20uYW5ub3RhdGUuQW5ub3RhdGVGbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbm5vdGF0ZV90ZXN0LmpzJywgWydnb29nLmRvbS5hbm5vdGF0ZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmFubm90YXRlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Fzc2VydHMuanMnLCBbJ2dvb2cuZG9tLmFzc2VydHMnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmFzc2VydHNUZXN0J10sIFsnZ29vZy5kb20uYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2F0dHIuanMnLCBbJ2dvb2cuZG9tLkF0dHInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnJvd3NlcmZlYXR1cmUuanMnLCBbJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJ10sIFsnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VyZmVhdHVyZV90ZXN0LmpzJywgWydnb29nLmRvbS5Ccm93c2VyRmVhdHVyZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ccm93c2VyRmVhdHVyZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS9hYnN0cmFjdHJhbmdlLmpzJywgWydnb29nLmRvbS5icm93c2VycmFuZ2UuQWJzdHJhY3RSYW5nZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvcicsICdnb29nLml0ZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnJvd3NlcnJhbmdlL2Jyb3dzZXJyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5FcnJvciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5HZWNrb1JhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5JZVJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5PcGVyYVJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XM2NSYW5nZScsICdnb29nLmRvbS5icm93c2VycmFuZ2UuV2ViS2l0UmFuZ2UnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvYnJvd3NlcnJhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvZ2Vja29yYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkdlY2tvUmFuZ2UnXSwgWydnb29nLmRvbS5icm93c2VycmFuZ2UuVzNjUmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvaWVyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkllUmFuZ2UnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5icm93c2VycmFuZ2UuQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxvZycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS9vcGVyYXJhbmdlLmpzJywgWydnb29nLmRvbS5icm93c2VycmFuZ2UuT3BlcmFSYW5nZSddLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XM2NSYW5nZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS93M2NyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLlczY1JhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2Uvd2Via2l0cmFuZ2UuanMnLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XZWJLaXRSYW5nZSddLCBbJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlLlczY1JhbmdlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnVmZmVyZWR2aWV3cG9ydHNpemVtb25pdG9yLmpzJywgWydnb29nLmRvbS5CdWZmZXJlZFZpZXdwb3J0U2l6ZU1vbml0b3InXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWxheScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9idWZmZXJlZHZpZXdwb3J0c2l6ZW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy5kb20uQnVmZmVyZWRWaWV3cG9ydFNpemVNb25pdG9yVGVzdCddLCBbJ2dvb2cuZG9tLkJ1ZmZlcmVkVmlld3BvcnRTaXplTW9uaXRvcicsICdnb29nLmRvbS5WaWV3cG9ydFNpemVNb25pdG9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NsYXNzZXMuanMnLCBbJ2dvb2cuZG9tLmNsYXNzZXMnXSwgWydnb29nLmFycmF5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vY2xhc3Nlc190ZXN0LmpzJywgWydnb29nLmRvbS5jbGFzc2VzX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9jbGFzc2xpc3QuanMnLCBbJ2dvb2cuZG9tLmNsYXNzbGlzdCddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9jbGFzc2xpc3RfdGVzdC5qcycsIFsnZ29vZy5kb20uY2xhc3NsaXN0X3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NvbnRyb2xyYW5nZS5qcycsIFsnZ29vZy5kb20uQ29udHJvbFJhbmdlJywgJ2dvb2cuZG9tLkNvbnRyb2xSYW5nZUl0ZXJhdG9yJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5BYnN0cmFjdE11bHRpUmFuZ2UnLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5SYW5nZUl0ZXJhdG9yJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLlRleHRSYW5nZScsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NvbnRyb2xyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5Db250cm9sUmFuZ2VUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uQ29udHJvbFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlRleHRSYW5nZScsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZGF0YXNldC5qcycsIFsnZ29vZy5kb20uZGF0YXNldCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZGF0YXNldF90ZXN0LmpzJywgWydnb29nLmRvbS5kYXRhc2V0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmRhdGFzZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9kb20uanMnLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFwcGVuZGFibGUnLCAnZ29vZy5kb20uRG9tSGVscGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2RvbV9jb21waWxlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLkRvbUNvbXBpbGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2RvbV90ZXN0LmpzJywgWydnb29nLmRvbS5kb21fdGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9udHNpemVtb25pdG9yLmpzJywgWydnb29nLmRvbS5Gb250U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uRm9udFNpemVNb25pdG9yLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9udHNpemVtb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLkZvbnRTaXplTW9uaXRvclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Gb250U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9ybXMuanMnLCBbJ2dvb2cuZG9tLmZvcm1zJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cud2luZG93J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9ybXNfdGVzdC5qcycsIFsnZ29vZy5kb20uZm9ybXNUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uZm9ybXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9mdWxsc2NyZWVuLmpzJywgWydnb29nLmRvbS5mdWxsc2NyZWVuJywgJ2dvb2cuZG9tLmZ1bGxzY3JlZW4uRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9mdWxsc2NyZWVuX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmZ1bGxzY3JlZW5fdGVzdCddLCBbJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5mdWxsc2NyZWVuJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vaHRtbGVsZW1lbnQuanMnLCBbJ2dvb2cuZG9tLkh0bWxFbGVtZW50J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lmcmFtZS5qcycsIFsnZ29vZy5kb20uaWZyYW1lJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9pZnJhbWVfdGVzdC5qcycsIFsnZ29vZy5kb20uaWZyYW1lVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lucHV0dHlwZS5qcycsIFsnZ29vZy5kb20uSW5wdXRUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lucHV0dHlwZV90ZXN0LmpzJywgWydnb29nLmRvbS5JbnB1dFR5cGVUZXN0J10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vaXRlci5qcycsIFsnZ29vZy5kb20uaXRlci5BbmNlc3Rvckl0ZXJhdG9yJywgJ2dvb2cuZG9tLml0ZXIuQ2hpbGRJdGVyYXRvcicsICdnb29nLmRvbS5pdGVyLlNpYmxpbmdJdGVyYXRvciddLCBbJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2l0ZXJfdGVzdC5qcycsIFsnZ29vZy5kb20uaXRlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5pdGVyLkFuY2VzdG9ySXRlcmF0b3InLCAnZ29vZy5kb20uaXRlci5DaGlsZEl0ZXJhdG9yJywgJ2dvb2cuZG9tLml0ZXIuU2libGluZ0l0ZXJhdG9yJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9tdWx0aXJhbmdlLmpzJywgWydnb29nLmRvbS5NdWx0aVJhbmdlJywgJ2dvb2cuZG9tLk11bHRpUmFuZ2VJdGVyYXRvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RNdWx0aVJhbmdlJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2VJdGVyYXRvcicsICdnb29nLmRvbS5SYW5nZVR5cGUnLCAnZ29vZy5kb20uU2F2ZWRSYW5nZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnLCAnZ29vZy5pdGVyJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbXVsdGlyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5NdWx0aVJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk11bHRpUmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5pdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbm9kZWl0ZXJhdG9yLmpzJywgWydnb29nLmRvbS5Ob2RlSXRlcmF0b3InXSwgWydnb29nLmRvbS5UYWdJdGVyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL25vZGVpdGVyYXRvcl90ZXN0LmpzJywgWydnb29nLmRvbS5Ob2RlSXRlcmF0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZUl0ZXJhdG9yJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9ub2Rlb2Zmc2V0LmpzJywgWydnb29nLmRvbS5Ob2RlT2Zmc2V0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZG9tLlRhZ05hbWUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9ub2Rlb2Zmc2V0X3Rlc3QuanMnLCBbJ2dvb2cuZG9tLk5vZGVPZmZzZXRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZU9mZnNldCcsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbm9kZXR5cGUuanMnLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vYWJzdHJhY3RwYXR0ZXJuLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLkFic3RyYWN0UGF0dGVybiddLCBbJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9hbGxjaGlsZHJlbi5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5BbGxDaGlsZHJlbiddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9jYWxsYmFjay9jYWxsYmFjay5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjayddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vY2FsbGJhY2svY291bnRlci5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5Db3VudGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vY2FsbGJhY2svdGVzdC5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5UZXN0J10sIFsnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL2NoaWxkbWF0Y2hlcy5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5DaGlsZE1hdGNoZXMnXSwgWydnb29nLmRvbS5wYXR0ZXJuLkFsbENoaWxkcmVuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9lbmR0YWcuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uRW5kVGFnJ10sIFsnZ29vZy5kb20uVGFnV2Fsa1R5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL2Z1bGx0YWcuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uRnVsbFRhZyddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uU3RhcnRUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL21hdGNoZXIuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hlciddLCBbJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vbWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLm1hdGNoZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5wYXR0ZXJuLkVuZFRhZycsICdnb29nLmRvbS5wYXR0ZXJuLkZ1bGxUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5NYXRjaGVyJywgJ2dvb2cuZG9tLnBhdHRlcm4uUmVwZWF0JywgJ2dvb2cuZG9tLnBhdHRlcm4uU2VxdWVuY2UnLCAnZ29vZy5kb20ucGF0dGVybi5TdGFydFRhZycsICdnb29nLmRvbS5wYXR0ZXJuLmNhbGxiYWNrLkNvdW50ZXInLCAnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5UZXN0JywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9ub2RldHlwZS5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5Ob2RlVHlwZSddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9wYXR0ZXJuLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vcGF0dGVybl90ZXN0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWxsQ2hpbGRyZW4nLCAnZ29vZy5kb20ucGF0dGVybi5DaGlsZE1hdGNoZXMnLCAnZ29vZy5kb20ucGF0dGVybi5FbmRUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5GdWxsVGFnJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uTm9kZVR5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5SZXBlYXQnLCAnZ29vZy5kb20ucGF0dGVybi5TZXF1ZW5jZScsICdnb29nLmRvbS5wYXR0ZXJuLlN0YXJ0VGFnJywgJ2dvb2cuZG9tLnBhdHRlcm4uVGV4dCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vcmVwZWF0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlJlcGVhdCddLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9zZXF1ZW5jZS5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5TZXF1ZW5jZSddLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4nLCAnZ29vZy5kb20ucGF0dGVybi5BYnN0cmFjdFBhdHRlcm4nLCAnZ29vZy5kb20ucGF0dGVybi5NYXRjaFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL3N0YXJ0dGFnLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlN0YXJ0VGFnJ10sIFsnZ29vZy5kb20uVGFnV2Fsa1R5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL3RhZy5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwgWydnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi90ZXh0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlRleHQnXSwgWydnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcmFuZ2UuanMnLCBbJ2dvb2cuZG9tLlJhbmdlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5Ccm93c2VyRmVhdHVyZScsICdnb29nLmRvbS5Db250cm9sUmFuZ2UnLCAnZ29vZy5kb20uTXVsdGlSYW5nZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9yYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5SYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9yYW5nZWVuZHBvaW50LmpzJywgWydnb29nLmRvbS5SYW5nZUVuZHBvaW50J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhZmUuanMnLCBbJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5kb20uc2FmZS5JbnNlcnRBZGphY2VudEh0bWxQb3NpdGlvbiddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5hc3NlcnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2FmZV90ZXN0LmpzJywgWydnb29nLmRvbS5zYWZlVGVzdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5kb20uc2FmZS5JbnNlcnRBZGphY2VudEh0bWxQb3NpdGlvbicsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhdmVkY2FyZXRyYW5nZS5qcycsIFsnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9zYXZlZGNhcmV0cmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlNhdmVkQ2FyZXRSYW5nZScsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2F2ZWRyYW5nZS5qcycsIFsnZ29vZy5kb20uU2F2ZWRSYW5nZSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhdmVkcmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5kb20uU2F2ZWRSYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NlbGVjdGlvbi5qcycsIFsnZ29vZy5kb20uc2VsZWN0aW9uJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2VsZWN0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnNlbGVjdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdpdGVyYXRvci5qcycsIFsnZ29vZy5kb20uVGFnSXRlcmF0b3InLCAnZ29vZy5kb20uVGFnV2Fsa1R5cGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdpdGVyYXRvcl90ZXN0LmpzJywgWydnb29nLmRvbS5UYWdJdGVyYXRvclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGFnbmFtZS5qcycsIFsnZ29vZy5kb20uVGFnTmFtZSddLCBbJ2dvb2cuZG9tLkh0bWxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGFnbmFtZV90ZXN0LmpzJywgWydnb29nLmRvbS5UYWdOYW1lVGVzdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdzLmpzJywgWydnb29nLmRvbS50YWdzJ10sIFsnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdzX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnRhZ3NUZXN0J10sIFsnZ29vZy5kb20udGFncycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRhc3NlcnQuanMnLCBbJ2dvb2cuZG9tLnRleHRBc3NlcnQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRhc3NlcnRfdGVzdC5qcycsIFsnZ29vZy5kb20udGV4dGFzc2VydF90ZXN0J10sIFsnZ29vZy5kb20udGV4dEFzc2VydCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRyYW5nZS5qcycsIFsnZ29vZy5kb20uVGV4dFJhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uVGV4dFJhbmdlSXRlcmF0b3InLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGV4dHJhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLlRleHRSYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Db250cm9sUmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGV4dFJhbmdlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRyYW5nZWl0ZXJhdG9yLmpzJywgWydnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2VJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGV4dHJhbmdlaXRlcmF0b3JfdGVzdC5qcycsIFsnZ29vZy5kb20uVGV4dFJhbmdlSXRlcmF0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdXJpLmpzJywgWydnb29nLmRvbS51cmknXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3VyaV90ZXN0LmpzJywgWydnb29nLmRvbS51cmlUZXN0J10sIFsnZ29vZy5kb20udXJpJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS92ZW5kb3IuanMnLCBbJ2dvb2cuZG9tLnZlbmRvciddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdmVuZG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnZlbmRvclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLnZlbmRvcicsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tVc2VyQWdlbnQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudFRlc3RVdGlsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3ZpZXdwb3J0c2l6ZW1vbml0b3IuanMnLCBbJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3InXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLlNpemUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS92aWV3cG9ydHNpemVtb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3JUZXN0J10sIFsnZ29vZy5kb20uVmlld3BvcnRTaXplTW9uaXRvcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3htbC5qcycsIFsnZ29vZy5kb20ueG1sJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS94bWxfdGVzdC5qcycsIFsnZ29vZy5kb20ueG1sVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20ueG1sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvYnJvd3NlcmZlYXR1cmUuanMnLCBbJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJ10sIFsnZ29vZy5lZGl0b3IuZGVmaW5lcycsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2Jyb3dzZXJmZWF0dXJlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jbGlja3RvZWRpdHdyYXBwZXIuanMnLCBbJ2dvb2cuZWRpdG9yLkNsaWNrVG9FZGl0V3JhcHBlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jbGlja3RvZWRpdHdyYXBwZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuQ2xpY2tUb0VkaXRXcmFwcGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ2xpY2tUb0VkaXRXcmFwcGVyJywgJ2dvb2cuZWRpdG9yLlNlYW1sZXNzRmllbGQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvY29tbWFuZC5qcycsIFsnZ29vZy5lZGl0b3IuQ29tbWFuZCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jb250ZW50ZWRpdGFibGVmaWVsZC5qcycsIFsnZ29vZy5lZGl0b3IuQ29udGVudEVkaXRhYmxlRmllbGQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jb250ZW50ZWRpdGFibGVmaWVsZF90ZXN0LmpzJywgWydnb29nLmVkaXRvci5Db250ZW50RWRpdGFibGVGaWVsZFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db250ZW50RWRpdGFibGVGaWVsZCcsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9kZWZpbmVzLmpzJywgWydnb29nLmVkaXRvci5kZWZpbmVzJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2ZpZWxkLmpzJywgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5GaWVsZC5FdmVudFR5cGUnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuYXN5bmMuRGVsYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLlBsdWdpbkltcGwnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvZmllbGRfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuZmllbGRfdGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9mb2N1cy5qcycsIFsnZ29vZy5lZGl0b3IuZm9jdXMnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9mb2N1c190ZXN0LmpzJywgWydnb29nLmVkaXRvci5mb2N1c1Rlc3QnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuZm9jdXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9pY29udGVudC5qcycsIFsnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2ljb250ZW50X3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLmljb250ZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvbGluay5qcycsIFsnZ29vZy5lZGl0b3IuTGluayddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVyaS51dGlscycsICdnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2xpbmtfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuTGlua1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkxpbmsnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9ub2RlLmpzJywgWydnb29nLmVkaXRvci5ub2RlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5pdGVyLkNoaWxkSXRlcmF0b3InLCAnZ29vZy5kb20uaXRlci5TaWJsaW5nSXRlcmF0b3InLCAnZ29vZy5pdGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9ub2RlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLm5vZGVUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2luLmpzJywgWydnb29nLmVkaXRvci5QbHVnaW4nXSwgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW5JbXBsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2luX2ltcGwuanMnLCBbJ2dvb2cuZWRpdG9yLlBsdWdpbkltcGwnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmxvZycsICdnb29nLm9iamVjdCcsICdnb29nLnJlZmxlY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuUGx1Z2luVGVzdCddLCBbJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RidWJibGVwbHVnaW4uanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5zdHlsZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLmFjdGlvbkV2ZW50V3JhcHBlcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RidWJibGVwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdEJ1YmJsZVBsdWdpblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5CdWJibGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdGRpYWxvZ3BsdWdpbi5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpbicsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0RGlhbG9nUGx1Z2luLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLmV2ZW50cycsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RkaWFsb2dwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpbicsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuQXJndW1lbnRNYXRjaGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lZGl0b3IuQWJzdHJhY3REaWFsb2cnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdHRhYmhhbmRsZXIuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RUYWJIYW5kbGVyJ10sIFsnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdHRhYmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdFRhYkhhbmRsZXJUZXN0J10sIFsnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdFRhYkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9iYXNpY3RleHRmb3JtYXR0ZXIuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmFzaWNUZXh0Rm9ybWF0dGVyJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmFzaWNUZXh0Rm9ybWF0dGVyLkNPTU1BTkQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5MaW5rJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuaXRlcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLmxvZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2Jhc2ljdGV4dGZvcm1hdHRlcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CYXNpY1RleHRGb3JtYXR0ZXInLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9ibG9ja3F1b3RlLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkJsb2NrcXVvdGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9ibG9ja3F1b3RlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmxvY2txdW90ZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmxvY2txdW90ZScsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2Vtb3RpY29ucy5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbW90aWNvbnMnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnVpLmVtb2ppLkVtb2ppJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9lbW90aWNvbnNfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbW90aWNvbnNUZXN0J10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW1vdGljb25zJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2VudGVyaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbnRlckhhbmRsZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlT2Zmc2V0JywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CbG9ja3F1b3RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9lbnRlcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbnRlckhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CbG9ja3F1b3RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW50ZXJIYW5kbGVyJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvZmlyc3RzdHJvbmcuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRmlyc3RTdHJvbmcnXSwgWydnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5pMThuLmJpZGknLCAnZ29vZy5pMThuLnVDaGFyJywgJ2dvb2cuaXRlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvZmlyc3RzdHJvbmdfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5GaXJzdFN0cm9uZ1Rlc3QnXSwgWydnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRmlyc3RTdHJvbmcnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvaGVhZGVyZm9ybWF0dGVyLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkhlYWRlckZvcm1hdHRlciddLCBbJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9oZWFkZXJmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5IZWFkZXJGb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlcicsICdnb29nLmVkaXRvci5wbHVnaW5zLkhlYWRlckZvcm1hdHRlcicsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtidWJibGUuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlua0J1YmJsZScsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtCdWJibGUuQWN0aW9uJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0QnViYmxlUGx1Z2luJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51cmkudXRpbHMnLCAnZ29vZy53aW5kb3cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtidWJibGVfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rQnViYmxlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5MaW5rJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlua0J1YmJsZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlua2RpYWxvZ3BsdWdpbi5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rRGlhbG9nUGx1Z2luJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3REaWFsb2dQbHVnaW4nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2cnLCAnZ29vZy51cmkudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtkaWFsb2dwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy51aS5lZGl0b3IucGx1Z2lucy5MaW5rRGlhbG9nVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtEaWFsb2dQbHVnaW4nLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLmRvbScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlua3Nob3J0Y3V0cGx1Z2luLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtTaG9ydGN1dFBsdWdpbiddLCBbJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9saW5rc2hvcnRjdXRwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rU2hvcnRjdXRQbHVnaW5UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlcicsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtCdWJibGUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rU2hvcnRjdXRQbHVnaW4nLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpc3R0YWJoYW5kbGVyLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkxpc3RUYWJIYW5kbGVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RUYWJIYW5kbGVyJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlzdHRhYmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaXN0VGFiSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlzdFRhYkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbG9yZW1pcHN1bS5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5Mb3JlbUlwc3VtJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9sb3JlbWlwc3VtX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTG9yZW1JcHN1bVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTG9yZW1JcHN1bScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvcmVtb3ZlZm9ybWF0dGluZy5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5SZW1vdmVGb3JtYXR0aW5nJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3Iubm9kZScsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvcmVtb3ZlZm9ybWF0dGluZ190ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlJlbW92ZUZvcm1hdHRpbmdUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5wbHVnaW5zLlJlbW92ZUZvcm1hdHRpbmcnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvc3BhY2VzdGFiaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5TcGFjZXNUYWJIYW5kbGVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0VGFiSGFuZGxlcicsICdnb29nLmVkaXRvci5yYW5nZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvc3BhY2VzdGFiaGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlNwYWNlc1RhYkhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5TcGFjZXNUYWJIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3RhYmxlZWRpdG9yLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlRhYmxlRWRpdG9yJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5UYWJsZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy90YWJsZWVkaXRvcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlRhYmxlRWRpdG9yVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWJsZUVkaXRvcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5GaWVsZE1vY2snLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy90YWdvbmVudGVyaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWdPbkVudGVySGFuZGxlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW50ZXJIYW5kbGVyJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvdGFnb25lbnRlcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWdPbkVudGVySGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5wbHVnaW5zLlRhZ09uRW50ZXJIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZU9mZnNldCcsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9NYW5hZ2VyJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9TdGF0ZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9UZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5icm93c2VycmFuZ2UnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5Mb3JlbUlwc3VtJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG8nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvbWFuYWdlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXInLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy91bmRvcmVkb21hbmFnZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXJUZXN0J10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXInLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy91bmRvcmVkb3N0YXRlLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvU3RhdGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvdW5kb3JlZG9zdGF0ZV90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvU3RhdGVUZXN0J10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcmFuZ2UuanMnLCBbJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnJhbmdlLlBvaW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlNhdmVkQ2FyZXRSYW5nZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuaXRlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3JhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5lZGl0b3IucmFuZ2UuUG9pbnQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3NlYW1sZXNzZmllbGQuanMnLCBbJ2dvb2cuZWRpdG9yLlNlYW1sZXNzRmllbGQnXSwgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLnN0eWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3Ivc2VhbWxlc3NmaWVsZF90ZXN0LmpzJywgWydnb29nLmVkaXRvci5zZWFtbGVzc2ZpZWxkX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5TZWFtbGVzc0ZpZWxkJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tSYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3N0eWxlLmpzJywgWydnb29nLmVkaXRvci5zdHlsZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm9iamVjdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3Ivc3R5bGVfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3Iuc3R5bGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5zdHlsZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvdGFibGUuanMnLCBbJ2dvb2cuZWRpdG9yLlRhYmxlJywgJ2dvb2cuZWRpdG9yLlRhYmxlQ2VsbCcsICdnb29nLmVkaXRvci5UYWJsZVJvdyddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxvZycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci90YWJsZV90ZXN0LmpzJywgWydnb29nLmVkaXRvci5UYWJsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlRhYmxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uZXZlbnR3cmFwcGVyLmpzJywgWydnb29nLmV2ZW50cy5hY3Rpb25FdmVudFdyYXBwZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRXZlbnRXcmFwcGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uZXZlbnR3cmFwcGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLmFjdGlvbkV2ZW50V3JhcHBlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5hY3Rpb25FdmVudFdyYXBwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2FjdGlvbmhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkFjdGlvbkV2ZW50JywgJ2dvb2cuZXZlbnRzLkFjdGlvbkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQWN0aW9uSGFuZGxlci5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuQmVmb3JlQWN0aW9uRXZlbnQnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uaGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5BY3Rpb25IYW5kbGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkFjdGlvbkhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2Jyb3dzZXJldmVudC5qcycsIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5Nb3VzZUJ1dHRvbicsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuUG9pbnRlclR5cGUnXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnJlZmxlY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9icm93c2VyZXZlbnRfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50VGVzdCddLCBbJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2Jyb3dzZXJmZWF0dXJlLmpzJywgWydnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZSddLCBbJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnQuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50TGlrZSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmV2ZW50cy5FdmVudElkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRUZXN0J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlclRlc3QnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRpZC5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRJZCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHMuanMnLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkNhcHR1cmVTaW11bGF0aW9uTW9kZScsICdnb29nLmV2ZW50cy5LZXknLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZVR5cGUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ldmVudHMuTGlzdGVuZXJNYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHNfdGVzdC5qcycsIFsnZ29vZy5ldmVudHNUZXN0J10sIFsnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cuZGVidWcuRW50cnlQb2ludE1vbml0b3InLCAnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLmV2ZW50cy5DYXB0dXJlU2ltdWxhdGlvbk1vZGUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCcsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0X3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0VGVzdCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ldmVudHMuZXZlbnRUYXJnZXRUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHRhcmdldF92aWFfZ29vZ2V2ZW50c190ZXN0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldEdvb2dFdmVudHNUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuZXZlbnRUYXJnZXRUZXN0ZXInLCAnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0YXJnZXRfdmlhX3czY2ludGVyZmFjZV90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldFczQ1Rlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0dGVzdGVyLmpzJywgWydnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0eXBlLmpzJywgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuTW91c2VBc01vdXNlRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLk1vdXNlRXZlbnRzJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJBc01vdXNlRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJBc1RvdWNoRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLmV2ZW50cy5Qb2ludGVyVG91Y2hGYWxsYmFja0V2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0eXBlX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZVRlc3QnXSwgWydnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuUG9pbnRlckZhbGxiYWNrRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJUb3VjaEZhbGxiYWNrRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR3cmFwcGVyLmpzJywgWydnb29nLmV2ZW50cy5FdmVudFdyYXBwZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZmlsZWRyb3BoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5GaWxlRHJvcEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9maWxlZHJvcGhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZm9jdXNoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5Gb2N1c0hhbmRsZXInLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2ltZWhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkltZUhhbmRsZXInLCAnZ29vZy5ldmVudHMuSW1lSGFuZGxlci5FdmVudCcsICdnb29nLmV2ZW50cy5JbWVIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9pbWVoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkltZUhhbmRsZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5JbWVIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2lucHV0aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlci5FdmVudFR5cGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2lucHV0aGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2tleWNvZGVzLmpzJywgWydnb29nLmV2ZW50cy5LZXlDb2RlcyddLCBbJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5Y29kZXNfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuS2V5Q29kZXNUZXN0J10sIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuS2V5RXZlbnQnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9rZXloYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLktleUV2ZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9rZXluYW1lcy5qcycsIFsnZ29vZy5ldmVudHMuS2V5TmFtZXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5cy5qcycsIFsnZ29vZy5ldmVudHMuS2V5cyddLCBbXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbGlzdGVuYWJsZS5qcycsIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlS2V5J10sIFsnZ29vZy5ldmVudHMuRXZlbnRJZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2xpc3RlbmFibGVfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZVRlc3QnXSwgWydnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbGlzdGVuZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkxpc3RlbmVyJ10sIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZUtleSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2xpc3RlbmVybWFwLmpzJywgWydnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuTGlzdGVuZXInLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9saXN0ZW5lcm1hcF90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5MaXN0ZW5lck1hcFRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL21vdXNld2hlZWxoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5Nb3VzZVdoZWVsRXZlbnQnLCAnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXInLCAnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubWF0aCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbW91c2V3aGVlbGhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLk1vdXNlV2hlZWxFdmVudCcsICdnb29nLmV2ZW50cy5Nb3VzZVdoZWVsSGFuZGxlcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvb25saW5laGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuT25saW5lSGFuZGxlcicsICdnb29nLmV2ZW50cy5PbmxpbmVIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5OZXR3b3JrU3RhdHVzTW9uaXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL29ubGluZWxpc3RlbmVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXInLCAnZ29vZy5uZXQuTmV0d29ya1N0YXR1c01vbml0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9wYXN0ZWhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlcicsICdnb29nLmV2ZW50cy5QYXN0ZUhhbmRsZXIuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlci5TdGF0ZSddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3luYy5Db25kaXRpb25hbERlbGF5JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubG9nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvcGFzdGVoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvd2hlZWxldmVudC5qcycsIFsnZ29vZy5ldmVudHMuV2hlZWxFdmVudCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy93aGVlbGhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLldoZWVsSGFuZGxlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLldoZWVsRXZlbnQnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvd2hlZWxoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLldoZWVsSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuV2hlZWxFdmVudCcsICdnb29nLmV2ZW50cy5XaGVlbEhhbmRsZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2VtYWlsYWRkcmVzcy5qcycsIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJ10sIFsnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9lbWFpbGFkZHJlc3NfdGVzdC5qcycsIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvZm9ybWF0LmpzJywgWydnb29nLmZvcm1hdCddLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuZm9ybWF0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mb3JtYXQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9odG1scHJldHR5cHJpbnRlci5qcycsIFsnZ29vZy5mb3JtYXQuSHRtbFByZXR0eVByaW50ZXInLCAnZ29vZy5mb3JtYXQuSHRtbFByZXR0eVByaW50ZXIuQnVmZmVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9odG1scHJldHR5cHJpbnRlcl90ZXN0LmpzJywgWydnb29nLmZvcm1hdC5IdG1sUHJldHR5UHJpbnRlclRlc3QnXSwgWydnb29nLmZvcm1hdC5IdG1sUHJldHR5UHJpbnRlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvaW50ZXJuYXRpb25hbGl6ZWRlbWFpbGFkZHJlc3MuanMnLCBbJ2dvb2cuZm9ybWF0LkludGVybmF0aW9uYWxpemVkRW1haWxBZGRyZXNzJ10sIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvaW50ZXJuYXRpb25hbGl6ZWRlbWFpbGFkZHJlc3NfdGVzdC5qcycsIFsnZ29vZy5mb3JtYXQuSW50ZXJuYXRpb25hbGl6ZWRFbWFpbEFkZHJlc3NUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmZvcm1hdC5JbnRlcm5hdGlvbmFsaXplZEVtYWlsQWRkcmVzcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2pzb25wcmV0dHlwcmludGVyLmpzJywgWydnb29nLmZvcm1hdC5Kc29uUHJldHR5UHJpbnRlcicsICdnb29nLmZvcm1hdC5Kc29uUHJldHR5UHJpbnRlci5TYWZlSHRtbERlbGltaXRlcnMnLCAnZ29vZy5mb3JtYXQuSnNvblByZXR0eVByaW50ZXIuVGV4dERlbGltaXRlcnMnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5TZXJpYWxpemVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLmZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2pzb25wcmV0dHlwcmludGVyX3Rlc3QuanMnLCBbJ2dvb2cuZm9ybWF0Lkpzb25QcmV0dHlQcmludGVyVGVzdCddLCBbJ2dvb2cuZm9ybWF0Lkpzb25QcmV0dHlQcmludGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9lbnRyeS5qcycsIFsnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkRpcmVjdG9yeUVudHJ5LkJlaGF2aW9yJywgJ2dvb2cuZnMuRW50cnknLCAnZ29vZy5mcy5GaWxlRW50cnknXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9lbnRyeWltcGwuanMnLCBbJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnlJbXBsJywgJ2dvb2cuZnMuRW50cnlJbXBsJywgJ2dvb2cuZnMuRmlsZUVudHJ5SW1wbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cuZnMuRW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVFbnRyeScsICdnb29nLmZzLkZpbGVXcml0ZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL2Vycm9yLmpzJywgWydnb29nLmZzLkRPTUVycm9yTGlrZScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRXJyb3IuRXJyb3JDb2RlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL2ZpbGVyZWFkZXIuanMnLCBbJ2dvb2cuZnMuRmlsZVJlYWRlcicsICdnb29nLmZzLkZpbGVSZWFkZXIuRXZlbnRUeXBlJywgJ2dvb2cuZnMuRmlsZVJlYWRlci5SZWFkeVN0YXRlJ10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuUHJvZ3Jlc3NFdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZmlsZXNhdmVyLmpzJywgWydnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLmZzLkZpbGVTYXZlci5FdmVudFR5cGUnLCAnZ29vZy5mcy5GaWxlU2F2ZXIuUmVhZHlTdGF0ZSddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5Qcm9ncmVzc0V2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9maWxlc3lzdGVtLmpzJywgWydnb29nLmZzLkZpbGVTeXN0ZW0nXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9maWxlc3lzdGVtaW1wbC5qcycsIFsnZ29vZy5mcy5GaWxlU3lzdGVtSW1wbCddLCBbJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnlJbXBsJywgJ2dvb2cuZnMuRmlsZVN5c3RlbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZmlsZXdyaXRlci5qcycsIFsnZ29vZy5mcy5GaWxlV3JpdGVyJ10sIFsnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZnMuanMnLCBbJ2dvb2cuZnMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVSZWFkZXInLCAnZ29vZy5mcy5GaWxlU3lzdGVtSW1wbCcsICdnb29nLmZzLnVybCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZnNfdGVzdC5qcycsIFsnZ29vZy5mc1Rlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMnLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZVJlYWRlcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvcHJvZ3Jlc3NldmVudC5qcycsIFsnZ29vZy5mcy5Qcm9ncmVzc0V2ZW50J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL3VybC5qcycsIFsnZ29vZy5mcy51cmwnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvdXJsX3Rlc3QuanMnLCBbJ2dvb2cudXJsVGVzdCddLCBbJ2dvb2cuZnMudXJsJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmdW5jdGlvbnMvZnVuY3Rpb25zLmpzJywgWydnb29nLmZ1bmN0aW9ucyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmdW5jdGlvbnMvZnVuY3Rpb25zX3Rlc3QuanMnLCBbJ2dvb2cuZnVuY3Rpb25zVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Fic3RyYWN0ZHJhZ2Ryb3AuanMnLCBbJ2dvb2cuZnguQWJzdHJhY3REcmFnRHJvcCcsICdnb29nLmZ4LkFic3RyYWN0RHJhZ0Ryb3AuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ0Ryb3BFdmVudCcsICdnb29nLmZ4LkRyYWdEcm9wSXRlbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Fic3RyYWN0ZHJhZ2Ryb3BfdGVzdC5qcycsIFsnZ29vZy5meC5BYnN0cmFjdERyYWdEcm9wVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5meC5BYnN0cmFjdERyYWdEcm9wJywgJ2dvb2cuZnguRHJhZ0Ryb3BJdGVtJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW0vYW5pbS5qcycsIFsnZ29vZy5meC5hbmltJywgJ2dvb2cuZnguYW5pbS5BbmltYXRlZCddLCBbJ2dvb2cuYXN5bmMuQW5pbWF0aW9uRGVsYXknLCAnZ29vZy5hc3luYy5EZWxheScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvYW5pbS9hbmltX3Rlc3QuanMnLCBbJ2dvb2cuZnguYW5pbVRlc3QnXSwgWydnb29nLmFzeW5jLkFuaW1hdGlvbkRlbGF5JywgJ2dvb2cuYXN5bmMuRGVsYXknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5hbmltJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9hbmltYXRpb24uanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguQW5pbWF0aW9uLkV2ZW50VHlwZScsICdnb29nLmZ4LkFuaW1hdGlvbi5TdGF0ZScsICdnb29nLmZ4LkFuaW1hdGlvbkV2ZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnLCAnZ29vZy5meC5hbmltJywgJ2dvb2cuZnguYW5pbS5BbmltYXRlZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvYW5pbWF0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW1hdGlvbnF1ZXVlLmpzJywgWydnb29nLmZ4LkFuaW1hdGlvblBhcmFsbGVsUXVldWUnLCAnZ29vZy5meC5BbmltYXRpb25RdWV1ZScsICdnb29nLmZ4LkFuaW1hdGlvblNlcmlhbFF1ZXVlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW1hdGlvbnF1ZXVlX3Rlc3QuanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uUXVldWVUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5BbmltYXRpb25QYXJhbGxlbFF1ZXVlJywgJ2dvb2cuZnguQW5pbWF0aW9uU2VyaWFsUXVldWUnLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguYW5pbScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9jc3MzL2Z4LmpzJywgWydnb29nLmZ4LmNzczMnXSwgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvY3NzMy90cmFuc2l0aW9uLmpzJywgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvbiddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLnRyYW5zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2NzczMvdHJhbnNpdGlvbl90ZXN0LmpzJywgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvblRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5meC5jc3MzLlRyYW5zaXRpb24nLCAnZ29vZy5zdHlsZS50cmFuc2l0aW9uJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9jc3NzcHJpdGVhbmltYXRpb24uanMnLCBbJ2dvb2cuZnguQ3NzU3ByaXRlQW5pbWF0aW9uJ10sIFsnZ29vZy5meC5BbmltYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Nzc3Nwcml0ZWFuaW1hdGlvbl90ZXN0LmpzJywgWydnb29nLmZ4LkNzc1Nwcml0ZUFuaW1hdGlvblRlc3QnXSwgWydnb29nLmZ4LkNzc1Nwcml0ZUFuaW1hdGlvbicsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RvbS5qcycsIFsnZ29vZy5meC5kb20nLCAnZ29vZy5meC5kb20uQmdDb2xvclRyYW5zZm9ybScsICdnb29nLmZ4LmRvbS5Db2xvclRyYW5zZm9ybScsICdnb29nLmZ4LmRvbS5GYWRlJywgJ2dvb2cuZnguZG9tLkZhZGVJbicsICdnb29nLmZ4LmRvbS5GYWRlSW5BbmRTaG93JywgJ2dvb2cuZnguZG9tLkZhZGVPdXQnLCAnZ29vZy5meC5kb20uRmFkZU91dEFuZEhpZGUnLCAnZ29vZy5meC5kb20uUHJlZGVmaW5lZEVmZmVjdCcsICdnb29nLmZ4LmRvbS5SZXNpemUnLCAnZ29vZy5meC5kb20uUmVzaXplSGVpZ2h0JywgJ2dvb2cuZnguZG9tLlJlc2l6ZVdpZHRoJywgJ2dvb2cuZnguZG9tLlNjcm9sbCcsICdnb29nLmZ4LmRvbS5TbGlkZScsICdnb29nLmZ4LmRvbS5TbGlkZUZyb20nLCAnZ29vZy5meC5kb20uU3dpcGUnXSwgWydnb29nLmNvbG9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2Ryb3AuanMnLCBbJ2dvb2cuZnguRHJhZ0Ryb3AnXSwgWydnb29nLmZ4LkFic3RyYWN0RHJhZ0Ryb3AnLCAnZ29vZy5meC5EcmFnRHJvcEl0ZW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RyYWdkcm9wZ3JvdXAuanMnLCBbJ2dvb2cuZnguRHJhZ0Ryb3BHcm91cCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZnguQWJzdHJhY3REcmFnRHJvcCcsICdnb29nLmZ4LkRyYWdEcm9wSXRlbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2Ryb3Bncm91cF90ZXN0LmpzJywgWydnb29nLmZ4LkRyYWdEcm9wR3JvdXBUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5EcmFnRHJvcEdyb3VwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9kcmFnZ2VyLmpzJywgWydnb29nLmZ4LkRyYWdFdmVudCcsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5meC5EcmFnZ2VyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2dlcl90ZXN0LmpzJywgWydnb29nLmZ4LkRyYWdnZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2xpc3Rncm91cC5qcycsIFsnZ29vZy5meC5EcmFnTGlzdERpcmVjdGlvbicsICdnb29nLmZ4LkRyYWdMaXN0R3JvdXAnLCAnZ29vZy5meC5EcmFnTGlzdEdyb3VwLkV2ZW50VHlwZScsICdnb29nLmZ4LkRyYWdMaXN0R3JvdXBFdmVudCcsICdnb29nLmZ4LkRyYWdMaXN0UGVybWlzc2lvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5meC5EcmFnZ2VyJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RyYWdsaXN0Z3JvdXBfdGVzdC5qcycsIFsnZ29vZy5meC5EcmFnTGlzdEdyb3VwVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmZ4LkRyYWdFdmVudCcsICdnb29nLmZ4LkRyYWdMaXN0RGlyZWN0aW9uJywgJ2dvb2cuZnguRHJhZ0xpc3RHcm91cCcsICdnb29nLmZ4LkRyYWdMaXN0UGVybWlzc2lvbicsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9kcmFnc2Nyb2xsc3VwcG9ydC5qcycsIFsnZ29vZy5meC5EcmFnU2Nyb2xsU3VwcG9ydCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ3Njcm9sbHN1cHBvcnRfdGVzdC5qcycsIFsnZ29vZy5meC5EcmFnU2Nyb2xsU3VwcG9ydFRlc3QnXSwgWydnb29nLmZ4LkRyYWdTY3JvbGxTdXBwb3J0JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZWFzaW5nLmpzJywgWydnb29nLmZ4LmVhc2luZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Vhc2luZ190ZXN0LmpzJywgWydnb29nLmZ4LmVhc2luZ1Rlc3QnXSwgWydnb29nLmZ4LmVhc2luZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZnguanMnLCBbJ2dvb2cuZngnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5BbmltYXRpb24uRXZlbnRUeXBlJywgJ2dvb2cuZnguQW5pbWF0aW9uLlN0YXRlJywgJ2dvb2cuZnguQW5pbWF0aW9uRXZlbnQnLCAnZ29vZy5meC5UcmFuc2l0aW9uLkV2ZW50VHlwZScsICdnb29nLmZ4LmVhc2luZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZnhfdGVzdC5qcycsIFsnZ29vZy5meFRlc3QnXSwgWydnb29nLmZ4LkFuaW1hdGlvbicsICdnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC90cmFuc2l0aW9uLmpzJywgWydnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uLkV2ZW50VHlwZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L3RyYW5zaXRpb25iYXNlLmpzJywgWydnb29nLmZ4LlRyYW5zaXRpb25CYXNlJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UuU3RhdGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZ4LlRyYW5zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dvb2cuanMnLCBbXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9hYnN0cmFjdGdyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLkFic3RyYWN0R3JhcGhpY3MnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLmdyYXBoaWNzLkVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkZpbGwnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUGF0aCcsICdnb29nLmdyYXBoaWNzLlBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdHJva2UnLCAnZ29vZy5ncmFwaGljcy5TdHJva2VBbmRGaWxsRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlRleHRFbGVtZW50JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2FmZmluZXRyYW5zZm9ybS5qcycsIFsnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvYWZmaW5ldHJhbnNmb3JtX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQWZmaW5lVHJhbnNmb3JtVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLm1hdGgnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2VsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkNhbnZhc1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzVGV4dEVsZW1lbnQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmdyYXBoaWNzLkVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuRm9udCcsICdnb29nLmdyYXBoaWNzLkdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5QYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlJlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVGV4dEVsZW1lbnQnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLm1hdGgnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLkNhbnZhc0dyYXBoaWNzJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ncmFwaGljcy5BYnN0cmFjdEdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkNhbnZhc1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzVGV4dEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2dyYXBoaWNzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzR3JhcGhpY3NUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCcsICdnb29nLmdyYXBoaWNzLlN0cm9rZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5FbGVtZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5tYXRoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9lbGxpcHNlZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCddLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9jb29yZGluYXRlcy5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2Nvb3JkaW5hdGVzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LmNvb3JkaW5hdGVzVGVzdCddLCBbJ2dvb2cuZ3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9lbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5FbGVtZW50J10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9lbGVtZW50X3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsZW1lbnRUZXN0J10sIFsnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLmV4dCcsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2VsbGlwc2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsbGlwc2UnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2V4dC5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5FbGxpcHNlJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LkdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LkltYWdlJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LlJlY3RhbmdsZScsICdnb29nLmdyYXBoaWNzLmV4dC5TaGFwZScsICdnb29nLmdyYXBoaWNzLmV4dC5jb29yZGluYXRlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5HcmFwaGljcyddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9leHQvZ3JvdXAuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmdyYXBoaWNzLmV4dC5FbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9leHQvaW1hZ2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkltYWdlJ10sIFsnZ29vZy5ncmFwaGljcy5leHQuRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3BhdGguanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LlBhdGgnXSwgWydnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5tYXRoLlJlY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9wYXRoX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LlBhdGhUZXN0J10sIFsnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLmV4dC5QYXRoJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cudGVzdGluZy5ncmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3JlY3RhbmdsZS5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuUmVjdGFuZ2xlJ10sIFsnZ29vZy5ncmFwaGljcy5leHQuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9zaGFwZS5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuU2hhcGUnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3N0cm9rZWFuZGZpbGxlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ZpbGwuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ZvbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuRm9udCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLlN2Z0dyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuVm1sR3JhcGhpY3MnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2dyb3VwZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5Hcm91cEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ltYWdlZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5JbWFnZUVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2xpbmVhcmdyYWRpZW50LmpzJywgWydnb29nLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aC5qcycsIFsnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuUGF0aC5TZWdtZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLm1hdGgnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3BhdGhfdGVzdC5qcycsIFsnZ29vZy5ncmFwaGljcy5QYXRoVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cudGVzdGluZy5ncmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuUGF0aEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLlN0cm9rZUFuZEZpbGxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9wYXRocy5qcycsIFsnZ29vZy5ncmFwaGljcy5wYXRocyddLCBbJ2dvb2cuZ3JhcGhpY3MuUGF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aHNfdGVzdC5qcycsIFsnZ29vZy5ncmFwaGljcy5wYXRoc1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MucGF0aHMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3JlY3RlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLlJlY3RFbGVtZW50J10sIFsnZ29vZy5ncmFwaGljcy5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc29saWRmaWxsLmpzJywgWydnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCddLCBbJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc29saWRmaWxsX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsVGVzdCddLCBbJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9zdHJva2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc3Ryb2tlYW5kZmlsbGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3N2Z2VsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3ZnRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlN2Z1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuU3ZnVGV4dEVsZW1lbnQnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzLkVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuSW1hZ2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUGF0aEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5SZWN0RWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlRleHRFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9zdmdncmFwaGljcy5qcycsIFsnZ29vZy5ncmFwaGljcy5TdmdHcmFwaGljcyddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmdyYXBoaWNzLkFic3RyYWN0R3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQnLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJywgJ2dvb2cuZ3JhcGhpY3MuU3ZnRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlN2Z1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuU3ZnVGV4dEVsZW1lbnQnLCAnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3N2Z2dyYXBoaWNzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3ZnR3JhcGhpY3NUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5ncmFwaGljcy5TdmdHcmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvdGV4dGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuVGV4dEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLlN0cm9rZUFuZEZpbGxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy92bWxlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLlZtbEVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sSW1hZ2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sUGF0aEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5WbWxSZWN0RWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbFRleHRFbGVtZW50J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5UZXh0RWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvdm1sZ3JhcGhpY3MuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuVm1sR3JhcGhpY3MnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZ3JhcGhpY3MuQWJzdHJhY3RHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLkZvbnQnLCAnZ29vZy5ncmFwaGljcy5MaW5lYXJHcmFkaWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5ncmFwaGljcy5WbWxFbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbEdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbEltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbFBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5WbWxUZXh0RWxlbWVudCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2V2ZW50LmpzJywgWydnb29nLmhpc3RvcnkuRXZlbnQnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmhpc3RvcnkuRXZlbnRUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2V2ZW50dHlwZS5qcycsIFsnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2hpc3RvcnkvaGlzdG9yeS5qcycsIFsnZ29vZy5IaXN0b3J5JywgJ2dvb2cuSGlzdG9yeS5FdmVudCcsICdnb29nLkhpc3RvcnkuRXZlbnRUeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuRXZlbnQnLCAnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5kZXZpY2UnLCAnZ29vZy5tZW1vaXplJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2hpc3RvcnlfdGVzdC5qcycsIFsnZ29vZy5IaXN0b3J5VGVzdCddLCBbJ2dvb2cuSGlzdG9yeScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaGlzdG9yeS9odG1sNWhpc3RvcnkuanMnLCBbJ2dvb2cuaGlzdG9yeS5IdG1sNUhpc3RvcnknLCAnZ29vZy5oaXN0b3J5Lkh0bWw1SGlzdG9yeS5Ub2tlblRyYW5zZm9ybWVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2hpc3RvcnkvaHRtbDVoaXN0b3J5X3Rlc3QuanMnLCBbJ2dvb2cuaGlzdG9yeS5IdG1sNUhpc3RvcnlUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuSHRtbDVIaXN0b3J5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9jc3NzcGVjaWZpY2l0eS5qcycsIFsnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5J10sIFsnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvY3Nzc3BlY2lmaWNpdHlfdGVzdC5qcycsIFsnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5VGVzdCddLCBbJ2dvb2cuaHRtbC5Dc3NTcGVjaWZpY2l0eScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2ZsYXNoLmpzJywgWydnb29nLmh0bWwuZmxhc2gnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2ZsYXNoX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5mbGFzaFRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuZmxhc2gnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvbGVnYWN5Y29udmVyc2lvbnMuanMnLCBbJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucyddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2xlZ2FjeWNvbnZlcnNpb25zX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9uc1Rlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZWh0bWwuanMnLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20udGFncycsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcmVjdGlvbmFsU3RyaW5nJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5UeXBlZFN0cmluZycsICdnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZlaHRtbF90ZXN0LmpzJywgWydnb29nLmh0bWwuc2FmZUh0bWxUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmVodG1sZm9ybWF0dGVyLmpzJywgWydnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20udGFncycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZWh0bWxmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVIdG1sRm9ybWF0dGVyVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXNjcmlwdC5qcycsIFsnZ29vZy5odG1sLlNhZmVTY3JpcHQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5UeXBlZFN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZlc2NyaXB0X3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYWZlU2NyaXB0VGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlLmpzJywgWydnb29nLmh0bWwuU2FmZVN0eWxlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmVzdHlsZV90ZXN0LmpzJywgWydnb29nLmh0bWwuc2FmZVN0eWxlVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlc2hlZXQuanMnLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlc2hlZXRfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVTdHlsZVNoZWV0VGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmV1cmwuanMnLCBbJ2dvb2cuaHRtbC5TYWZlVXJsJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnMudXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcmVjdGlvbmFsU3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RyaW5nLlR5cGVkU3RyaW5nJywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmV1cmxfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVVcmxUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuc2FmZVVybFRlc3RWZWN0b3JzJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZldXJsX3Rlc3RfdmVjdG9ycy5qcycsIFsnZ29vZy5odG1sLnNhZmVVcmxUZXN0VmVjdG9ycyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2F0dHJpYnV0ZXdoaXRlbGlzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5BdHRyaWJ1dGVTYW5pdGl6ZWRXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5BdHRyaWJ1dGVXaGl0ZWxpc3QnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9jc3Nwcm9wZXJ0eXNhbml0aXplci5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5Dc3NQcm9wZXJ0eVNhbml0aXplciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2Nzc3Byb3BlcnR5c2FuaXRpemVyX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzUHJvcGVydHlTYW5pdGl6ZXJUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnNhbml0aXplci5Dc3NQcm9wZXJ0eVNhbml0aXplcicsICdnb29nLmh0bWwuc2FuaXRpemVyLm5vY2xvYmJlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9jc3NzYW5pdGl6ZXIuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzU2FuaXRpemVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzUHJvcGVydHlTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2Nzc3Nhbml0aXplcl90ZXN0LmpzJywgWydnb29nLmh0bWwuQ3NzU2FuaXRpemVyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnNhbml0aXplci5Dc3NTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9lbGVtZW50d2Vha21hcC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5FbGVtZW50V2Vha01hcCddLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvZWxlbWVudHdlYWttYXBfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5FbGVtZW50V2Vha01hcFRlc3QnXSwgWydnb29nLmh0bWwuc2FuaXRpemVyLkVsZW1lbnRXZWFrTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sX3Rlc3RfdmVjdG9ycy5qcycsIFsnZ29vZy5odG1sLmh0bWxUZXN0VmVjdG9ycyddLCBbXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sc2FuaXRpemVyLmpzJywgWydnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyQXR0cmlidXRlUG9saWN5JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclBvbGljeScsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXJQb2xpY3lDb250ZXh0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclBvbGljeUhpbnRzJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclVybFBvbGljeSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQXR0cmlidXRlU2FuaXRpemVkV2hpdGVsaXN0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQXR0cmlidXRlV2hpdGVsaXN0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzU2FuaXRpemVyJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuU2FmZURvbVRyZWVQcm9jZXNzb3InLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdCbGFja2xpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvaHRtbHNhbml0aXplcl90ZXN0LmpzJywgWydnb29nLmh0bWwuSHRtbFNhbml0aXplclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sc2FuaXRpemVyX3VuaWZpZWRfdGVzdC5qcycsIFsnZ29vZy5odG1sLkh0bWxTYW5pdGl6ZXJVbmlmaWVkVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuaHRtbFRlc3RWZWN0b3JzJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplci5CdWlsZGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9ub2Nsb2JiZXIuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNScsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9ub2Nsb2JiZXJfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXJUZXN0J10sIFsnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9zYWZlZG9tdHJlZXByb2Nlc3Nvci5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5TYWZlRG9tVHJlZVByb2Nlc3NvciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuc2FuaXRpemVyLkVsZW1lbnRXZWFrTWFwJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxvZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3NhZmVkb210cmVlcHJvY2Vzc29yX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuU2FmZURvbVRyZWVQcm9jZXNzb3JUZXN0J10sIFsnZ29vZy5odG1sLnNhbml0aXplci5TYWZlRG9tVHJlZVByb2Nlc3NvcicsICdnb29nLmh0bWwuc2FuaXRpemVyLm5vY2xvYmJlcicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci90YWdibGFja2xpc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuVGFnQmxhY2tsaXN0J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvdGFnd2hpdGVsaXN0LmpzJywgWydnb29nLmh0bWwuc2FuaXRpemVyLlRhZ1doaXRlbGlzdCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3Vuc2FmZS5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci51bnNhZmUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3Vuc2FmZV90ZXN0LmpzJywgWydnb29nLmh0bWwuVW5zYWZlVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkF0dHJpYnV0ZVdoaXRlbGlzdCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci51bnNhZmUnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zaWx2ZXJsaWdodC5qcycsIFsnZ29vZy5odG1sLnNpbHZlcmxpZ2h0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLmZsYXNoJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NpbHZlcmxpZ2h0X3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zaWx2ZXJsaWdodFRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuc2lsdmVybGlnaHQnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdGVzdGluZy5qcycsIFsnZ29vZy5odG1sLnRlc3RpbmcnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLkFyZ3VtZW50TWF0Y2hlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90ZXh0ZXh0cmFjdG9yLmpzJywgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdGV4dGV4dHJhY3Rvcl90ZXN0LmpzJywgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvclRlc3QnXSwgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90cnVzdGVkcmVzb3VyY2V1cmwuanMnLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5pMThuLmJpZGkuRGlyZWN0aW9uYWxTdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdHJ1c3RlZHJlc291cmNldXJsX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC50cnVzdGVkUmVzb3VyY2VVcmxUZXN0J10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwudHJ1c3RlZHR5cGVzJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90cnVzdGVkdHlwZXMuanMnLCBbJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3VuY2hlY2tlZGNvbnZlcnNpb25zLmpzJywgWydnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdW5jaGVja2VkY29udmVyc2lvbnNfdGVzdC5qcycsIFsnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdXRpbHMuanMnLCBbJ2dvb2cuaHRtbC51dGlscyddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3V0aWxzX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5VdGlsc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnV0aWxzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2JpZGkuanMnLCBbJ2dvb2cuaTE4bi5iaWRpJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLmkxOG4uYmlkaS5EaXJlY3Rpb25hbFN0cmluZycsICdnb29nLmkxOG4uYmlkaS5Gb3JtYXQnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9iaWRpX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5iaWRpVGVzdCddLCBbJ2dvb2cuaTE4bi5iaWRpJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9iaWRpZm9ybWF0dGVyLmpzJywgWydnb29nLmkxOG4uQmlkaUZvcm1hdHRlciddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmkxOG4uYmlkaScsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5pMThuLmJpZGkuRm9ybWF0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2JpZGlmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5pMThuLkJpZGlGb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cuaTE4bi5CaWRpRm9ybWF0dGVyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLmkxOG4uYmlkaS5Gb3JtYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY2hhcmxpc3RkZWNvbXByZXNzb3IuanMnLCBbJ2dvb2cuaTE4bi5DaGFyTGlzdERlY29tcHJlc3NvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5pMThuLnVDaGFyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2NoYXJsaXN0ZGVjb21wcmVzc29yX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5DaGFyTGlzdERlY29tcHJlc3NvclRlc3QnXSwgWydnb29nLmkxOG4uQ2hhckxpc3REZWNvbXByZXNzb3InLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY2hhcnBpY2tlcmRhdGEuanMnLCBbJ2dvb2cuaTE4bi5DaGFyUGlja2VyRGF0YSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29sbGF0aW9uLmpzJywgWydnb29nLmkxOG4uY29sbGF0aW9uJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29sbGF0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5jb2xsYXRpb25UZXN0J10sIFsnZ29vZy5pMThuLmNvbGxhdGlvbicsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9jb21wYWN0bnVtYmVyZm9ybWF0c3ltYm9scy5qcycsIFsnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hZicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYW0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9EWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2F6JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYnMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jaHInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jeScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9BVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGVfQ0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lcycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfNDE5JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfTVgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ldCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19maScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ0EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3N3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ndScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGF3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19odScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lkJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pbicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2l0JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2thJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19raycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa20nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19taycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21uJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25iJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25vJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ub19OTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb3InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3BhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0JSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9QVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zdicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190ZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190cicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3VyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191eicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3poJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9DTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3poX1RXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196dSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29tcGFjdG51bWJlcmZvcm1hdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc0V4dCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYWZfTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hZ3EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FncV9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FrX0dIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hbV9FVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9BRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfQkgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0RKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9FSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfRVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0lMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfSk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0tNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfTEInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfTVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX09NJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9QUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfUUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfU08nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfVEQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1ROJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9YQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hc19JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hc2FfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FzdCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9DeXJsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9DeXJsX0FaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuX0FaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iYXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmVfQlknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JlbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iZXonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Jlel9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JtJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ibV9NTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ibycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYm9fQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JvX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icl9GUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYnJ4JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icnhfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmxfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG5fQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhX0FEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jYV9FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2FfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhX0lUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jY3AnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9CRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2NwX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2VfUlUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NlYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2ViX1BIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jZ2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NnZ19VRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2hyX1VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ja2InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jc19DWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY3lfR0InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RhX0RLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kYV9HTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGF2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kYXZfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0JFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGVfSVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGplJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kamVfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RzYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZHNiX0RFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kdWEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2R1YV9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZHlvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19keW9fU04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2R6JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kel9CVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZWJ1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lYnVfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lZV9HSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZWVfVEcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbF9HUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9BRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9BVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0JFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9CSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0JTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9CVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9DWCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0RFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ERycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0RNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9FUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0ZKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9GSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ISycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9JTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0pNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0tOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9LWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9MUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01IJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01TJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01XJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX05GJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ORycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX05SJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9OVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1BHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9QSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1BOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9QUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1JXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1RLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9UTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1RWJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9VU19QT1NJWCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1ZHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9WSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1dTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9YQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19BUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19CWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQ0wnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19DUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQ1UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19FQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfRUMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19HVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfSE4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19OSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfUEEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19QSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfUFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19TVicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfVVknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ldF9FRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXVfRVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mYV9BRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmFfSVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZmJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0JGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX01SJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19maV9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmlsX1BIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZm9fREsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZvX0ZPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQkYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0JJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQkwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ0cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0RKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0dBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfR04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0dQJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfSFQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0tNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01DJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01VJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1BGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfUkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1JXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfU04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1NZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfVEcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1ROJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfV0YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1lUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mdXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Z1cl9JVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nYV9JRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ2QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nbF9FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3N3X0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dzd19MSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3VfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3V6X0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ndicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oYV9HSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hhX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oYXdfVVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oaV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHJfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oc2InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hzYl9ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2h5X0FNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pYScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pZF9JRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19paScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWlfQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdF9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaXRfSVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdF9WQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamFfSlAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19qbWMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfanYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2p2X0lEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2FiJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rYWJfRFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2thbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2FtX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rZGUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2VhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rZWFfQ1YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tocScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2hxX01MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19raScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2trX0taJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ra2onLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2wnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tsX0dMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tsbl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa21fS0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rb19LUCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa29fS1InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa29rX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rcycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tzYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NiX1RaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rc2YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tzZl9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NoJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rc2hfREUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2t1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rdV9UUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2t3X0dCJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19reV9LRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbGFnJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sYWdfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xiJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sYl9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbGcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xnX1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sa3QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xrdF9VUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbG5fQU8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xuX0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sbl9DRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xvX0xBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19scmMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHJjX0lSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdF9MVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x1X0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdW8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x1b19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHV5JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdXlfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x2X0xWJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tYXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21hc19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWFzX1RaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21lcl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWZlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZmVfTVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21nJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZ19NRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWdoJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZ2hfTVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21nbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19taScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWlfTlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21rX01LJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tbF9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbW5fTU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21yX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tc19CTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXNfTVknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdF9NVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXVhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX215X01NJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tem4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX216bl9JUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmFxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uYXFfTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25iX05PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uYl9TSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25kX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZHMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25kc19ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmRzX05MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmVfTlAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX0FXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmxfQlEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX0NXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmxfU1InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX1NYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25tZ19DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbm4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubmgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25uaF9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19udXNfU1MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX255bicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb21fRVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vcl9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb3MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vc19SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfR3VydScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfR3VydV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3BzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wc19BRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHNfUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0FPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0dRJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9HVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9NWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X1RMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19xdScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3F1X0VDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19xdV9QRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3JtX0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ybicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3JvX01EJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yb19STycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yb2ZfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1X0JZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcnVfS1onLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1X01EJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcnVfVUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcndrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yd2tfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2FoX1JVJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zYXEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2JwJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zYnBfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZF9QSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NlX0ZJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZV9OTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NlaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2VoX01aJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Nlc19NTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaGknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NoaV9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2hpX1RmbmcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NoaV9UZm5nX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2tfU0snLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NsX1NJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Ntbl9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc24nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc29fREonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zb19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc29fU08nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zcV9NSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3FfWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfTUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fUlMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zdl9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3ZfU0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zd19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3dfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190YV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGFfTEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190YV9TRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGVfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGVvX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190ZW9fVUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190Z19USicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGhfVEgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190aV9FUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGlfRVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190a19UTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdG8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190cl9DWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHJfVFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190dF9SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHdxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3R6bScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHptX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191ZycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdWdfQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3VrX1VBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfQUYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmxfVVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmFpX0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc192YWlfVmFpaScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmFpX1ZhaWlfTFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc192dW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Z1bl9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc193YWVfQ0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3dvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeGgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3hoX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3hvZ19VRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeWF2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3lpJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195aV8wMDEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195b19CSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeW9fTkcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeXVlX0hhbnMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZV9IYW5zX0NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeXVlX0hhbnRfSEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3pnaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX1NHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X0hLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196dV9aQSddLCBbJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9jdXJyZW5jeS5qcycsIFsnZ29vZy5pMThuLmN1cnJlbmN5JywgJ2dvb2cuaTE4bi5jdXJyZW5jeS5DdXJyZW5jeUluZm8nLCAnZ29vZy5pMThuLmN1cnJlbmN5LkN1cnJlbmN5SW5mb1RpZXIyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY3VycmVuY3lfdGVzdC5qcycsIFsnZ29vZy5pMThuLmN1cnJlbmN5VGVzdCddLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQnLCAnZ29vZy5pMThuLmN1cnJlbmN5JywgJ2dvb2cuaTE4bi5jdXJyZW5jeS5DdXJyZW5jeUluZm8nLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY3VycmVuY3ljb2RlbWFwLmpzJywgWydnb29nLmkxOG4uY3VycmVuY3lDb2RlTWFwJywgJ2dvb2cuaTE4bi5jdXJyZW5jeUNvZGVNYXBUaWVyMiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFsZm9ybWF0LmpzJywgWydnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kYXRlLkRhdGVMaWtlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzVHlwZScsICdnb29nLmkxOG4uVGltZVpvbmUnLCAnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFN5bWJvbHMnLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNScsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGVpbnRlcnZhbGZvcm1hdF90ZXN0LmpzJywgWydnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0VGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aCcsICdnb29nLmkxOG4uVGltZVpvbmUnLCAnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFBhdHRlcm5zJywgJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxTeW1ib2xzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGVpbnRlcnZhbHBhdHRlcm5zLmpzJywgWydnb29nLmkxOG4uZGF0ZUludGVydmFsUGF0dGVybnMnXSwgWydnb29nLmkxOG4uZGF0ZUludGVydmFsU3ltYm9scyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFscGF0dGVybnNleHQuanMnLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxQYXR0ZXJuc0V4dCddLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxQYXR0ZXJucyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFsc3ltYm9scy5qcycsIFsnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFN5bWJvbHMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRlaW50ZXJ2YWxzeW1ib2xzZXh0LmpzJywgWydnb29nLmkxOG4uZGF0ZUludGVydmFsU3ltYm9sc0V4dCddLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxTeW1ib2xzJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZWZvcm1hdC5qcycsIFsnZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5Gb3JtYXQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kYXRlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMnLCAnZ29vZy5pMThuLlRpbWVab25lJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdFRlc3QnXSwgWydnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuX1hBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2phJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3N2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnRfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0RKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGVfSUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19qYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvX1JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3YnLCAnZ29vZy5pMThuLlRpbWVab25lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lcGFyc2UuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhcnNlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGF0ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZXBhcnNlX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhcnNlVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXJzZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZXBhdHRlcm5zLmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJucycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hZicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hbScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcl9FRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19heicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ibicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jaHInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY3knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXNfNDE5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX01YJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZpbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mcicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfaGF3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lkJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2luJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2l0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2l3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2phJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2thJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2trJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ttJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21rJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21sJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21yJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX210JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX215JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25iJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25lJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25sJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25vX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29yJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0X0JSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0X1BUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3J1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdHInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdmknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lcGF0dGVybnNleHQuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zRXh0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FmX05BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FmX1pBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FncScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hZ3FfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYWsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYWtfR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYW1fRVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXJfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0JIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0RKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0pPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0tNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0tXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0xCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0xZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX01SJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX09NJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1BTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1FBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1REJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1ROJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1hCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1lFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hc2FfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXN0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzdF9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hel9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2F6X0N5cmxfQVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXpfTGF0bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hel9MYXRuX0FaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JhcycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iYXNfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmVfQlknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmVtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JlbV9aTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmV6X1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JnX0JHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JtX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JuX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JuX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JyeCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icnhfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYnNfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ic19DeXJsX0JBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JzX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYnNfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9BRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9GUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jY3AnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2NwX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NjcF9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZWInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2ViX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NnZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZ2dfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2hyX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NrYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ja2JfSVEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2tiX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NzX0NaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2N5X0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhX0dMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhdicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kYXZfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfSVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGplJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RqZV9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2R1YScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kdWFfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZHlvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2R5b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19keicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kel9CVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19lYnUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZWJ1X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlX1RHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VsX0NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VsX0dSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19lbl8xNTAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRkonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRksnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR1UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTEMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTFMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTUgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUFInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1onLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVEMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVE8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVVNfUE9TSVgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fV1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWEEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW9fMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0FSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0RPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0dRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0dUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0hOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0lDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX05JJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1VZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1ZFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V0X0VFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V1X0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V3bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ld29fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmFfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmFfSVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0JGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9HSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0dNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9HVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19maV9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19maWxfUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm9fREsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm9fRk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfREonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfRFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfRlInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfSFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfS00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTkMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUEYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVEQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfV0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfWVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnVyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2Z1cl9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19meScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19meV9OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nYV9JRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nZF9HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nbF9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nc3dfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3N3X0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2dzd19MSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ndV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ndXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3V6X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2d2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2d2X0lNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhd19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oZV9JTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oaV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ocl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ocl9IUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfaHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h1X0hVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h5X0FNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lhXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZF9JRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZ19ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19paScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19paV9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pc19JUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9TTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9WQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qYV9KUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qZ28nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfamdvX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ptYycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qbWNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfanYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfanZfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FfR0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FiJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2thYl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rYW0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FtX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tkZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rZGVfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2VhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tlYV9DVicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19raHEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2hxX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tpX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2trX0taJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2traicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ra2pfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2xfR0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2xuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tsbl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rbV9LSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rbl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb19LUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb19LUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb2snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa29rX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rc2JfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa3NmJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzZl9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rc2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa3NoX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t1X1RSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t3X0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t5X0tHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xhZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sYWdfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGJfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGdfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGt0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xrdF9VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9BTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sb19MQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19scmMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHJjX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xyY19JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdF9MVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdV9DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x1eScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdXlfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHZfTFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWFzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21hc19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tYXNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWVyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21lcl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tZmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWZlX01VJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21naCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tZ2hfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWdvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nb19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19taScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19taV9OWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ta19NSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tbF9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tbl9NTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tcl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19CTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tdF9NVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tdWEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbXVhX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX215X01NJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX216bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tem5fSVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbmFxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25hcV9OQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uYl9OTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uYl9TSicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZF9aVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbmRzX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25kc19OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZV9OUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9BVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9CRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9CUScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9DVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9TUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9TWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubWcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbm1nX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubmhfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbnVzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX251c19TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ueW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbnluX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tX0VUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zX0dFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zX1JVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhX0FyYWInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhX0d1cnVfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcGxfUEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHNfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHNfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQ1YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfR1cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfU1QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfVEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfQk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfUEUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm1fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm5fQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9fTUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9fUk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9mJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3JvZl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9CWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9LRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9NRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9VQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19yd19SVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19yd2snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcndrX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NhaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zYWhfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2FxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NhcV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zYnAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2JwX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NkJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NkX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX0ZJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX1NFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZWhfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2VzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Nlc19NTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZ19DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX0xhdG5fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX1RmbmcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX1RmbmdfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2lfTEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2tfU0snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2xfU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc21uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Ntbl9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbl9aVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19TTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9BTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9NSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0N5cmxfQkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfQ3lybF9NRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9DeXJsX1JTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0N5cmxfWEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9MYXRuX01FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0xhdG5fUlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfTGF0bl9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9BWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Rlb19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190Z19USicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aF9USCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aV9FUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190a19UTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190b19UTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190cl9DWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190cl9UUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190dCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190dF9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190d3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdHdxX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3R6bScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190em1fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWdfQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWtfVUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXJfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXJfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXpfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc191el9BcmFiX0FGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3V6X0N5cmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc191el9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdmFpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9WYWlpX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZpX1ZOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Z1bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc192dW5fVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfd2FlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3dhZV9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc193bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc193b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194aCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194aF9aQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194b2cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeG9nX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lhdicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195YXZfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeWknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeWlfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvX0JKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3l1ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFucycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFuc19DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFudCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196Z2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemdoX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFuc19DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFuc19TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW50JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFudF9NTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3p1X1pBJ10sIFsnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZXRpbWVzeW1ib2xzLmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNUeXBlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hbScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9FRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2F6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19iZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19icycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2hyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jeScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9BVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RlX0NIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0lFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JU08nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fWkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzXzQxOScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfTVgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ndScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhdycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ocicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2h1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2luJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2l3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfamEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2trJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa20nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sdicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21rJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX210JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25lJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25vX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb3InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9CUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X1BUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zdicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190cicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191eicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196dSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZXRpbWVzeW1ib2xzZXh0LmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzRXh0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWZfTkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hZl9aQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FncScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FncV9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWtfR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hbV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfQkgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0VIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9JTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfSk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9LTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0tXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfTEInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9MWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9PTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1BTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfUUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfU08nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfVEQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9UTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1hCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXNhX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXN0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXpfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2F6X0N5cmxfQVonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXpfTGF0bl9BWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JhcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JlX0JZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmVtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmV6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmV6X1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ibScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JtX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ibl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm9fQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ib19JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnJ4JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnJ4X0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnNfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JzX0N5cmxfQkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ic19MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnNfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhX0FEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2FfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jYV9GUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhX0lUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jZV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NlYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NlYl9QSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NnZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NnZ19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Nocl9VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYl9JUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYl9JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NzX0NaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY3lfR0InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kYV9ESycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RhX0dMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGF2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGF2X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGVfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9ERScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RlX0lUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGVfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RqZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RqZV9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RzYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RzYl9ERScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R1YScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R1YV9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R5bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R5b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZHpfQlQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lYnUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lYnVfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VlX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZWVfVEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbF9DWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VsX0dSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fMTUwJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9BRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0FJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9BVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9CSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9CVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0NLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9DWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ERycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fRE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9FUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0ZJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fRkonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9GSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0ZNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0pFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0tJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fS04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9LWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0xDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9MUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTUgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01QJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01VJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTVcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTlInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9OVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05aJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9QSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9QUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1BXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1RDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9UTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1RUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9VU19QT1NJWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1ZDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9WSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1ZVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fV1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9YQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1pNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fWlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VvXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0FSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19CUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQ0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19DTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0NSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQ1UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19ETycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0VBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19HUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0dUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfSE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19JQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX05JJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfUEEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19QRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfUFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19QWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX1NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfVVknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19WRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V0X0VFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXVfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ld28nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ld29fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYV9BRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZhX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9CRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9HTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9MUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmlfRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19maWxfUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZvX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZm9fRk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0JGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0JMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQ0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfREonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfR0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0dOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfR1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0hUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfS00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01SJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfUEYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1JFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfU1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1RHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfVE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1dGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfWVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mdXJfSVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19meScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2FfSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2xfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ndV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d1el9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oYV9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhd19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGlfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ocl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHNiJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oeV9BTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWRfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19paV9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXRfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pdF9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXRfVkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19qYV9KUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2pnb19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ptYycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2p2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfanZfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thYl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thbScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thbV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tkZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tlYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tlYV9DVicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tocScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tocV9NTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ra19LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2traicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa2xfR0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbG5fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbV9LSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa29fS1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rb19LUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tva19JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2JfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2YnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2ZfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2hfREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2t1X1RSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rd19HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2t5X0tHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGFnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGFnX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sYl9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGdfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sa3QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sa3RfVVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbl9BTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xuX0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbG5fQ0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbl9DRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xvX0xBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHRfTFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2x1X0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHVvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHV5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHV5X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHZfTFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXNfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZXJfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZmVfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21nX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdoX01aJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdvX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19taV9OWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21rX01LJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWxfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tbl9NTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXNfQk4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tc19NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXRfTVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tdWEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19teV9NTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX216bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX216bl9JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25hcScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25hcV9OQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25iX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmJfU0onLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25kX1pXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzX05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmVfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uZV9OUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX0FXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmxfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubF9CUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX0NXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmxfTkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubF9TUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX1NYJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm1nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm1nX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubl9OTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25uaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25uaF9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX251cycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX251c19TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX255bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX255bl9VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29tJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb21fRVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19vbV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19vc19HRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29zX1JVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGFfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BhX0FyYWJfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGFfR3VydV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BsX1BMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wc19BRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BzX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfQU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X0NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9HVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X0xVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9NWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X1NUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfVEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19xdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3F1X0JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcXVfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19xdV9QRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ybicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JuX0JJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm9fTUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yb19STycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvZicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvZl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J1X0JZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcnVfS0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydV9LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J1X01EJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcnVfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydV9VQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcndfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yd2snLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yd2tfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYWgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYWhfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYXEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYXFfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYnAnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYnBfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NkX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZV9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NlX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZWgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZWhfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZXNfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NoaV9UZm5nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpX1RmbmdfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NrX1NLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2xfU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbW5fRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc28nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zb19ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc29fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zb19TTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3FfTUsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcV9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9DeXJsX0JBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfQ3lybF9NRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9DeXJsX1hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9MYXRuX1JTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfTGF0bl9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3ZfRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zdl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3dfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zd19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGFfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190YV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGFfU0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190ZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Rlb19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Rlb19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGdfVEonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190aF9USCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGlfRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190aV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGtfVE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdHJfQ1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190cl9UUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdHRfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190d3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190em0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190em1fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191ZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VnX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdWtfVUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VyX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXpfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3V6X0FyYWJfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191el9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3V6X0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191el9MYXRuX1VaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc192YWlfTGF0bl9MUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpX1ZhaWlfTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc192aV9WTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Z1bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Z1bl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dhZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dhZV9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfd29fU04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc194aCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3hoX1pBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeG9nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeG9nX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWF2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWF2X0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195aV8wMDEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3lvX0JKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeW9fTkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWVfSGFucycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3l1ZV9IYW5zX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeXVlX0hhbnQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3pnaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3pnaF9NQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW5zX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFuc19ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW5zX1NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFudCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW50X01PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFudF9UVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9ncmFwaGVtZWJyZWFrLmpzJywgWydnb29nLmkxOG4uR3JhcGhlbWVCcmVhayddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4udUNoYXInLCAnZ29vZy5zdHJ1Y3RzLkludmVyc2lvbk1hcCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9ncmFwaGVtZWJyZWFrX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrVGVzdCddLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrJywgJ2dvb2cuaTE4bi51Q2hhcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9sb2NhbGVmZWF0dXJlLmpzJywgWydnb29nLmkxOG4uTG9jYWxlRmVhdHVyZSddLCBbXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2xvY2FsZWZlYXR1cmVfdGVzdC5qcycsIFsnZ29vZy5pMThuLkxvY2FsZUZlYXR1cmVUZXN0J10sIFsnZ29vZy5pMThuLkxvY2FsZUZlYXR1cmUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbWVzc2FnZWZvcm1hdC5qcycsIFsnZ29vZy5pMThuLk1lc3NhZ2VGb3JtYXQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9scycsICdnb29nLmkxOG4ub3JkaW5hbFJ1bGVzJywgJ2dvb2cuaTE4bi5wbHVyYWxSdWxlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9tZXNzYWdlZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0VGVzdCddLCBbJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cuaTE4bi5wbHVyYWxSdWxlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9taW1lLmpzJywgWydnb29nLmkxOG4ubWltZScsICdnb29nLmkxOG4ubWltZS5lbmNvZGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaTE4bi51Q2hhciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9taW1lX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5taW1lLmVuY29kZVRlc3QnXSwgWydnb29nLmkxOG4ubWltZS5lbmNvZGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbnVtYmVyZm9ybWF0LmpzJywgWydnb29nLmkxOG4uTnVtYmVyRm9ybWF0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQuQ3VycmVuY3lTdHlsZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0LkZvcm1hdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5jdXJyZW5jeScsICdnb29nLm1hdGgnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbnVtYmVyZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRUZXN0J10sIFsnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUdfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3JvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3VfbnVfbGF0bicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL251bWJlcmZvcm1hdHN5bWJvbHMuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FtJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VHX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19heicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2hyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2N5JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0FUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0NIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzXzQxOScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19FUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19NWCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19VUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ldCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ldScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dzdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ndScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19oYXcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfamEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa20nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa24nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa28nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX210JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX215JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX215X3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm9fTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfb3InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfUFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcnUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2wnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfTGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190YScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190ZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190aCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190bCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190cicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfQ04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfVFcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL251bWJlcmZvcm1hdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzRXh0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmX05BJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FncScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hZ3FfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYWtfR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYW1fRVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0FFX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9CSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9CSF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfREonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfREpfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JTF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfSVEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfSVFfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0pPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0pPX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LTV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfS1cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfS1dfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xCX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9MWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NUl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfT00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfT01fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1BTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1BTX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9RQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9RQV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU0EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU0FfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NEX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TT191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU1NfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NZX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9URCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9URF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfVE4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWEInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUVfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzX0lOX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzYV9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hc3QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2F6X0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXpfQ3lybF9BWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2F6X0xhdG5fQVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmFzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZV9CWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZW0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JleicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZXpfVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm1fTUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ib19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ib19JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19icl9GUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19icngnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnJ4X0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnNfQ3lybF9CQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ic19MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG5fQkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfQUQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfRVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfRlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfSVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2NwJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9CRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jY3BfQkRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jY3BfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2VfUlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2ViJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NlYl9QSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jZ2cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2dnX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Nocl9VUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ja2InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lRJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jc19DWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jeV9HQicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYV9ESycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYV9HTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYXYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZGF2X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0JFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0RFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RqZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kamVfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHNiJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RzYl9ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kdWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHVhX0NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2R5bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19keW9fU04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHpfQlQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHpfQlRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2R6X3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lYnUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZWJ1X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlX0dIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlX1RHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0dSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuXzAwMScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRE0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRVInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRksnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTFMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUE4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0wnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVE8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVVNfUE9TSVgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fV1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWEEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0FSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0VBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0VDJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0hOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX05JJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1NWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1VZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V0X0VFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V1X0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ld29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmFfQUYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmFfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZhX0lSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZhX0lSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fQkYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fR00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9TTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpX0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpbF9QSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mb19ESycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mb19GTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ESicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9GUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9IVCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9LTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ORScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9SRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9SVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9UTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9XRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ZVCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mdXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZnVyX0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Z5JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dhX0lFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dkJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dsX0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dzd19DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3N3X0xJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2d1X0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ndXpfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGF3X1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hpX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0JBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hzYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19oc2JfREUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHlfQU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lkX0lEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lpX0NOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X0NIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1ZBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2phX0pQJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qZ29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfam1jJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qdl9JRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYWInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2FiX0RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2thbScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYW1fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rZWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2VhX0NWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tocScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19raHFfTUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2tfS1onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2tqJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbF9HTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2xuX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ttX0tIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvX0tQJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvX0tSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rb2tfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rc2InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NiX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzZicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rc2ZfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NoJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzaF9ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdV9UUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rd19HQicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19reV9LRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sYWcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbGFnX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xiJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xiX0xVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xnX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xrdCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sa3RfVVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG9fTEEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHJjJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19scmNfSVFfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19scmNfSVJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHRfTFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHVfQ0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHVvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2x1b19LRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sdXknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHV5X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2x2X0xWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21hcycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tYXNfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWFzX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21lcicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZXJfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWZlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21mZV9NVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ19NRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWdoX01aJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21nbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWlfTlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWtfTUsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWxfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW5fTU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX0JOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX01ZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX210X01UJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX211YScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXlfTU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXlfTU1fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX216bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tem5fSVInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXpuX0lSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tem5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25hcScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uYXFfTkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmJfTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmJfU0onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmRfWlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmRzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25kc19ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZHNfTkwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmVfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmVfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25lX05QJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25lX05QX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9BVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9DVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9TUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9TWCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm1nX0NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uaCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubmhfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX251c19TUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ueW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29yX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zX1JVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BhX0FyYWInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9BcmFiX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9BcmFiX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BhX0d1cnVfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHNfQUYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHNfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BzX1BLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BzX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfR1EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfR1cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfVEwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfRUMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfUEUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9fTUQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9fUk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3JvZl9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9CWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9NRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9VQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19yd2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcndrX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zYWhfUlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2FxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zYnAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2JwX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkX1BLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zZF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfRkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VoJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NlaF9NWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VzX01MJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NoaScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfVGZuZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfVGZuZ19NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19za19TSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zbF9TSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc21uX0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0RKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX1NPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX01LJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX1hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfQ3lybF9CQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9DeXJsX01FJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfQ3lybF9YSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuX0JBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfTGF0bl9SUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuX1hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X1NFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX0xLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RlX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190ZW9fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdGVvX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RnX1RKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RoX1RIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpX0VSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RrX1RNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RyX0NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RyX1RSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R0X1JVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R3cScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdHptJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R6bV9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191ZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191Z19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191a19VQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXpfQXJhYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191el9BcmFiX0FGJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191el9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdmFpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpX0xSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3Z1bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc192dW5fVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3dhZV9DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc193bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194aCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194aF9aQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeG9nX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lhdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeWknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeWlfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvX0JKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvX05HJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFucycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFuc19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196Z2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFuc19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFuc19TRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFudF9NTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdV9udV9sYXRuJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL29yZGluYWxydWxlcy5qcycsIFsnZ29vZy5pMThuLm9yZGluYWxSdWxlcyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3BsdXJhbHJ1bGVzLmpzJywgWydnb29nLmkxOG4ucGx1cmFsUnVsZXMnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9wbHVyYWxydWxlc190ZXN0LmpzJywgWydnb29nLmkxOG4ucGx1cmFsUnVsZXNUZXN0J10sIFsnZ29vZy5pMThuLnBsdXJhbFJ1bGVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3JlbGF0aXZlZGF0ZXRpbWVmb3JtYXQuanMnLCBbJ2dvb2cuaTE4bi5SZWxhdGl2ZURhdGVUaW1lRm9ybWF0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaTE4bi5Mb2NhbGVGZWF0dXJlJywgJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0JywgJ2dvb2cuaTE4bi5yZWxhdGl2ZURhdGVUaW1lU3ltYm9scyddLCB7J2xhbmcnOiAnZXM1JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vcmVsYXRpdmVkYXRldGltZWZvcm1hdF90ZXN0LmpzJywgWydnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdFRlc3QnXSwgWydnb29nLmkxOG4uTG9jYWxlRmVhdHVyZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9FRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lbicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lcycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYScsICdnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4ucmVsYXRpdmVEYXRlVGltZVN5bWJvbHMnLCAnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzRXh0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3JlbGF0aXZlZGF0ZXRpbWVzeW1ib2xzLmpzJywgWydnb29nLmkxOG4ucmVsYXRpdmVEYXRlVGltZVN5bWJvbHMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9yZWxhdGl2ZWRhdGV0aW1lc3ltYm9sc2V4dC5qcycsIFsnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzRXh0J10sIFsnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzJ10sIHsnbGFuZyc6ICdlczUnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi90aW1lem9uZS5qcycsIFsnZ29vZy5pMThuLlRpbWVab25lJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRhdGUuRGF0ZUxpa2UnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdGltZXpvbmVfdGVzdC5qcycsIFsnZ29vZy5pMThuLlRpbWVab25lVGVzdCddLCBbJ2dvb2cuaTE4bi5UaW1lWm9uZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi91Y2hhci5qcycsIFsnZ29vZy5pMThuLnVDaGFyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbG9jYWxuYW1lZmV0Y2hlci5qcycsIFsnZ29vZy5pMThuLnVDaGFyLkxvY2FsTmFtZUZldGNoZXInXSwgWydnb29nLmkxOG4udUNoYXIuTmFtZUZldGNoZXInLCAnZ29vZy5pMThuLnVDaGFyTmFtZXMnLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbG9jYWxuYW1lZmV0Y2hlcl90ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXIuTG9jYWxOYW1lRmV0Y2hlclRlc3QnXSwgWydnb29nLmkxOG4udUNoYXIuTG9jYWxOYW1lRmV0Y2hlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbmFtZWZldGNoZXIuanMnLCBbJ2dvb2cuaTE4bi51Q2hhci5OYW1lRmV0Y2hlciddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvcmVtb3RlbmFtZWZldGNoZXIuanMnLCBbJ2dvb2cuaTE4bi51Q2hhci5SZW1vdGVOYW1lRmV0Y2hlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlVyaScsICdnb29nLmV2ZW50cycsICdnb29nLmkxOG4udUNoYXInLCAnZ29vZy5pMThuLnVDaGFyLk5hbWVGZXRjaGVyJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5YaHJJbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi91Y2hhci9yZW1vdGVuYW1lZmV0Y2hlcl90ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXIuUmVtb3RlTmFtZUZldGNoZXJUZXN0J10sIFsnZ29vZy5pMThuLnVDaGFyLlJlbW90ZU5hbWVGZXRjaGVyJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3VjaGFyX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi51Q2hhclRlc3QnXSwgWydnb29nLmkxOG4udUNoYXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXJuYW1lcy5qcycsIFsnZ29vZy5pMThuLnVDaGFyTmFtZXMnXSwgWydnb29nLmkxOG4udUNoYXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXJuYW1lc190ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXJOYW1lc1Rlc3QnXSwgWydnb29nLmkxOG4udUNoYXJOYW1lcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9lczYuanMnLCBbJ2dvb2cuaXRlci5lczYnXSwgWydnb29nLml0ZXIuSXRlcmFibGUnLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9lczZfdGVzdC5qcycsIFsnZ29vZy5pdGVyLmVzNlRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLmVzNicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9pdGVyLmpzJywgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLkl0ZXJhYmxlJywgJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubWF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9pdGVyX3Rlc3QuanMnLCBbJ2dvb2cuaXRlclRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2h5YnJpZC5qcycsIFsnZ29vZy5qc29uLmh5YnJpZCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmpzb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2pzb24vaHlicmlkX3Rlc3QuanMnLCBbJ2dvb2cuanNvbi5oeWJyaWRUZXN0J10sIFsnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5oeWJyaWQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2pzb24uanMnLCBbJ2dvb2cuanNvbicsICdnb29nLmpzb24uUmVwbGFjZXInLCAnZ29vZy5qc29uLlJldml2ZXInLCAnZ29vZy5qc29uLlNlcmlhbGl6ZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9qc29uX3BlcmYuanMnLCBbJ2dvb2cuanNvblBlcmYnXSwgWydnb29nLmRvbScsICdnb29nLmpzb24nLCAnZ29vZy5tYXRoJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRhYmxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2pzb24vanNvbl90ZXN0LmpzJywgWydnb29nLmpzb25UZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2pzb25hYmxlLmpzJywgWydnb29nLmpzb24uSnNvbmFibGUnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9uYXRpdmVqc29ucHJvY2Vzc29yLmpzJywgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmpzb24uUHJvY2Vzc29yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL3Byb2Nlc3Nvci5qcycsIFsnZ29vZy5qc29uLlByb2Nlc3NvciddLCBbJ2dvb2cuc3RyaW5nLlBhcnNlcicsICdnb29nLnN0cmluZy5TdHJpbmdpZmllciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9wcm9jZXNzb3JfdGVzdC5qcycsIFsnZ29vZy5qc29uLnByb2Nlc3NvclRlc3QnXSwgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9jb2xsZWN0aW9ucy9pdGVyYWJsZXMuanMnLCBbJ2dvb2cubGFicy5jb2xsZWN0aW9ucy5pdGVyYWJsZXMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9jb2xsZWN0aW9ucy9pdGVyYWJsZXNfdGVzdC5qcycsIFsnZ29vZy5sYWJzLml0ZXJhYmxlVGVzdCddLCBbJ2dvb2cubGFicy5jb2xsZWN0aW9ucy5pdGVyYWJsZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2RvbS9wYWdldmlzaWJpbGl0eW1vbml0b3IuanMnLCBbJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlFdmVudCcsICdnb29nLmxhYnMuZG9tLlBhZ2VWaXNpYmlsaXR5TW9uaXRvcicsICdnb29nLmxhYnMuZG9tLlBhZ2VWaXNpYmlsaXR5U3RhdGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS52ZW5kb3InLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWVtb2l6ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9kb20vcGFnZXZpc2liaWxpdHltb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlNb25pdG9yVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlNb25pdG9yJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZXZlbnRzL25vbmRpc3Bvc2FibGVldmVudHRhcmdldC5qcycsIFsnZ29vZy5sYWJzLmV2ZW50cy5Ob25EaXNwb3NhYmxlRXZlbnRUYXJnZXQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmVyTWFwJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2V2ZW50cy9ub25kaXNwb3NhYmxlZXZlbnR0YXJnZXRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLmV2ZW50cy5Ob25EaXNwb3NhYmxlRXZlbnRUYXJnZXRUZXN0J10sIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLmxhYnMuZXZlbnRzLk5vbkRpc3Bvc2FibGVFdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9ldmVudHMvbm9uZGlzcG9zYWJsZWV2ZW50dGFyZ2V0X3ZpYV9nb29nZXZlbnRzX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5ldmVudHMuTm9uRGlzcG9zYWJsZUV2ZW50VGFyZ2V0R29vZ0V2ZW50c1Rlc3QnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLmxhYnMuZXZlbnRzLk5vbkRpc3Bvc2FibGVFdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZXZlbnRzL3RvdWNoLmpzJywgWydnb29nLmxhYnMuZXZlbnRzLnRvdWNoJywgJ2dvb2cubGFicy5ldmVudHMudG91Y2guVG91Y2hEYXRhJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2V2ZW50cy90b3VjaF90ZXN0LmpzJywgWydnb29nLmxhYnMuZXZlbnRzLnRvdWNoVGVzdCddLCBbJ2dvb2cubGFicy5ldmVudHMudG91Y2gnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZm9ybWF0L2Nzdi5qcycsIFsnZ29vZy5sYWJzLmZvcm1hdC5jc3YnLCAnZ29vZy5sYWJzLmZvcm1hdC5jc3YuUGFyc2VFcnJvcicsICdnb29nLmxhYnMuZm9ybWF0LmNzdi5Ub2tlbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcubmV3bGluZXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZm9ybWF0L2Nzdl90ZXN0LmpzJywgWydnb29nLmxhYnMuZm9ybWF0LmNzdlRlc3QnXSwgWydnb29nLmxhYnMuZm9ybWF0LmNzdicsICdnb29nLmxhYnMuZm9ybWF0LmNzdi5QYXJzZUVycm9yJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdGZvcm1hdC5qcycsIFsnZ29vZy5sYWJzLmkxOG4uR2VuZGVySW5mbycsICdnb29nLmxhYnMuaTE4bi5HZW5kZXJJbmZvLkdlbmRlcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdGZvcm1hdF90ZXN0LmpzJywgWydnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0VGVzdCddLCBbJ2dvb2cubGFicy5pMThuLkdlbmRlckluZm8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9scycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196dScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9pMThuL2xpc3RzeW1ib2xzLmpzJywgWydnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9scycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hZicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hbScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcl9EWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcl9FRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19heicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ibicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jaHInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY3MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY3knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZWwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSUUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZXMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZXNfNDE5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX01YJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZpbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcl9DQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nc3cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfaGF3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lkJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2luJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2l0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2l3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2phJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2thJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2trJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ttJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x2JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21rJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21sJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21vJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21yJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX210JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX215JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25iJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25lJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25sJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25vJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25vX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29yJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0X0JSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0X1BUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3JvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3J1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NoJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NrJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdHInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfQ04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfVFcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzRXh0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FmX05BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FncScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hZ3FfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYWtfR0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYW1fRVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0FFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0JIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0RKJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0VIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0VSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0lMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0lRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0pPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0tNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0tXJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0xCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0xZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX01BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX01SJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX09NJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1BTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1FBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1REJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1ROJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1hCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1lFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hc2FfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXN0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzdF9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hel9DeXJsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2F6X0N5cmxfQVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXpfTGF0bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hel9MYXRuX0FaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JhcycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iYXNfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmVfQlknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmVtJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JlbV9aTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmV6X1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JnX0JHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JtJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JtX01MJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JuX0JEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvX0NOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JyX0ZSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JyeCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icnhfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYnNfQ3lybCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ic19DeXJsX0JBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JzX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYnNfTGF0bl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9BRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9GUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jY3AnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2NwX0JEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NjcF9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZV9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZWInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2ViX1BIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NnZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZ2dfVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2hyX1VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NrYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ja2JfSVEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NzX0NaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2N5X0dCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhX0RLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhX0dMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhdicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kYXZfS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfREUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfSVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfTEknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGplJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RqZV9ORScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kc2InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZHNiX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2R1YScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kdWFfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZHlvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2R5b19TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19keicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kel9CVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lYnUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZWJ1X0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlX0dIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlX1RHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VsX0dSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VuXzAwMScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ1gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRE0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRkonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRksnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTFInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTFMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTUgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUE4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUFInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1onLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVE8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVU0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVVNfUE9TSVgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fV1MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWEEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0FSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VDJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0dUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0hOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX05JJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1NWJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1VZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V0X0VFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V1X0VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ld29fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmFfQUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmFfSVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0JGJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0dNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fR04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9ORScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fU0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19maV9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19maWxfUEgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm9fREsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm9fRk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfREonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfRFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfRlInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR0EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR1AnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR1EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfSFQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfS00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTkMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUEYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUE0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVEQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVEcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVE4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfV0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfWVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnVyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2Z1cl9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19meScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19meV9OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nYV9JRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nZCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nZF9HQicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nbF9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nc3dfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3N3X0ZSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2dzd19MSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ndV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ndXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3V6X0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2d2JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2d2X0lNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX0dIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX05FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhd19VUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oZV9JTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oaV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ocl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ocl9IUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oc2InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfaHNiX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h1X0hVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h5X0FNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lhXzAwMScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZF9JRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZ19ORycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19paScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19paV9DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pc19JUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9DSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9TTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9WQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qYV9KUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qZ28nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfamdvX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ptYycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qbWNfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfanYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfanZfSUQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FfR0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FiJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2thYl9EWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rYW0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FtX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tkZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rZGVfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2VhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tlYV9DVicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19raHEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2hxX01MJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tpX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2trX0taJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2traicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ra2pfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2xfR0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2xuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tsbl9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rbV9LSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rbl9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb19LUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb19LUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb2snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa29rX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rc2JfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa3NmJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzZl9DTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rc2gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa3NoX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t1X1RSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t3X0dCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t5X0tHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xhZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sYWdfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGJfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGdfVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGt0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xrdF9VUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9BTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sb19MQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19scmMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHJjX0lRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xyY19JUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdF9MVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdV9DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHVvX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x1eScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdXlfS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHZfTFYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWFzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21hc19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tYXNfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWVyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21lcl9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tZmUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWZlX01VJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nX01HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21naCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tZ2hfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWdvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nb19DTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19taScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19taV9OWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ta19NSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbF9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbl9NTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tcl9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19CTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19NWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tdF9NVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tdWEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbXVhX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX215X01NJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX216bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tem5fSVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbmFxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25hcV9OQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uYl9OTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uYl9TSicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZF9aVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZHMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbmRzX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25kc19OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZV9OUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9BVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9CUScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9DVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9TUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9TWCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbm1nX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubmhfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX251c19TUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ueW4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tX0VUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29yX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zX1JVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhX0FyYWInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhX0d1cnVfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHNfQUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHNfUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfR1EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfR1cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfVEwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfRUMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfUEUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9fTUQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9fUk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3JvZl9UWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9CWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9LWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9NRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9VQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19yd2snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcndrX1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zYWhfUlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2FxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zYnAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2JwX1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NkX1BLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX0ZJJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX1NFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZWhfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2VzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Nlc19NTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZ19DRicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zaGknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX0xhdG5fTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX1RmbmcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX1RmbmdfTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2lfTEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2tfU0snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2xfU0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc21uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Ntbl9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbl9aVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19ESicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19FVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19TTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9BTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9NSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9YSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9DeXJsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0N5cmxfQkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfQ3lybF9NRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9DeXJsX1JTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0N5cmxfWEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfTGF0bl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9MYXRuX01FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0xhdG5fUlMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfTGF0bl9YSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9BWCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9TRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19UWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19VRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9MSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9NWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGVvX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Rlb19VRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190Z19USicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aF9USCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aV9FUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aV9FVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190a19UTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190b19UTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190cl9DWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190cl9UUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190dCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190dF9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190d3EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdHdxX05FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3R6bScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190em1fTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWdfQ04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWtfVUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXJfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXpfQXJhYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc191el9BcmFiX0FGJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc191el9MYXRuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdmFpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Z1bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc192dW5fVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3dhZV9DSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc193bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194aCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194aF9aQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeG9nX1VHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lhdicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeWknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeWlfMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvX0JKJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFucycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFuc19DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196Z2gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFuc19DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFuc19TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFudF9NTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbW9jay9tb2NrLmpzJywgWydnb29nLmxhYnMubW9jaycsICdnb29nLmxhYnMubW9jay5UaW1lb3V0RXJyb3InLCAnZ29vZy5sYWJzLm1vY2suVmVyaWZpY2F0aW9uRXJyb3InXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLm1vY2sudGltZW91dCcsICdnb29nLmxhYnMubW9jay50aW1lb3V0LlRpbWVvdXRNb2RlJywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLmxhYnMubW9jay52ZXJpZmljYXRpb24uQmFzZVZlcmlmaWNhdGlvbk1vZGUnLCAnZ29vZy5sYWJzLm1vY2sudmVyaWZpY2F0aW9uLlZlcmlmaWNhdGlvbk1vZGUnLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svbW9ja190ZXN0LmpzJywgWydnb29nLmxhYnMubW9ja1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy5tb2NrJywgJ2dvb2cubGFicy5tb2NrLlRpbWVvdXRFcnJvcicsICdnb29nLmxhYnMubW9jay5WZXJpZmljYXRpb25FcnJvcicsICdnb29nLmxhYnMubW9jay50aW1lb3V0JywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLmxhYnMudGVzdGluZy5Bbnl0aGluZ01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuR3JlYXRlclRoYW5NYXRjaGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzOCd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdGltZW91dG1vZGUuanMnLCBbJ2dvb2cubGFicy5tb2NrLnRpbWVvdXQnLCAnZ29vZy5sYWJzLm1vY2sudGltZW91dC5UaW1lb3V0TW9kZSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdmVyaWZpY2F0aW9ubW9kZS5qcycsIFsnZ29vZy5sYWJzLm1vY2sudmVyaWZpY2F0aW9uJywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbi5CYXNlVmVyaWZpY2F0aW9uTW9kZScsICdnb29nLmxhYnMubW9jay52ZXJpZmljYXRpb24uVmVyaWZpY2F0aW9uTW9kZSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdmVyaWZpY2F0aW9ubW9kZV90ZXN0LmpzJywgWydnb29nLmxhYnMubW9jay5WZXJpZmljYXRpb25Nb2RlVGVzdCddLCBbJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvaW1hZ2UuanMnLCBbJ2dvb2cubGFicy5uZXQuaW1hZ2UnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvaW1hZ2VfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC5pbWFnZVRlc3QnXSwgWydnb29nLmxhYnMubmV0LmltYWdlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwuanMnLCBbJ2dvb2cubmV0LldlYkNoYW5uZWwnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cubmV0LlhtbEh0dHBGYWN0b3J5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2Jhc2V0ZXN0Y2hhbm5lbC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkJhc2VUZXN0Q2hhbm5lbCddLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5uZXQuV2ViQ2hhbm5lbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9jaGFubmVsLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbCddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2NoYW5uZWxyZXF1ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbFJlcXVlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXN5bmMuVGhyb3R0bGUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsRGVidWcnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLmVudmlyb25tZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XZWJDaGFubmVsJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvY2hhbm5lbHJlcXVlc3RfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLmNoYW5uZWxSZXF1ZXN0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cy5TZXJ2ZXJSZWFjaGFiaWxpdHknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9jb25uZWN0aW9uc3RhdGUuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Db25uZWN0aW9uU3RhdGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2Vudmlyb25tZW50LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuZW52aXJvbm1lbnQnXSwgWydnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvZW52aXJvbm1lbnRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkVudmlyb25tZW50VGVzdCddLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5lbnZpcm9ubWVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9mb3J3YXJkY2hhbm5lbHJlcXVlc3Rwb29sLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuRm9yd2FyZENoYW5uZWxSZXF1ZXN0UG9vbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cy5TZXQnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2ZvcndhcmRjaGFubmVscmVxdWVzdHBvb2xfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2xUZXN0J10sIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Gb3J3YXJkQ2hhbm5lbFJlcXVlc3RQb29sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL25ldHV0aWxzLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwubmV0VXRpbHMnXSwgWydnb29nLlVyaScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL3JlcXVlc3RzdGF0cy5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzLkV2ZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU2VydmVyUmVhY2hhYmlsaXR5JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU2VydmVyUmVhY2hhYmlsaXR5RXZlbnQnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cy5TdGF0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU3RhdEV2ZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuVGltaW5nRXZlbnQnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZS5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5ydW4nLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5CYXNlVGVzdENoYW5uZWwnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWwnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Db25uZWN0aW9uU3RhdGUnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2wnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxEZWJ1ZycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZVY4JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5uZXRVdGlscycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzJywgJ2dvb2cubmV0LldlYkNoYW5uZWwnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQucnBjLkh0dHBDb3JzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZV90ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwud2ViQ2hhbm5lbEJhc2VUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuanNvbicsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2wnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZVRyYW5zcG9ydCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5uZXRVdGlscycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU3RhdCcsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2ViY2hhbm5lbGJhc2V0cmFuc3BvcnQuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZVRyYW5zcG9ydCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmpzb24nLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLmxvZycsICdnb29nLm5ldC5XZWJDaGFubmVsJywgJ2dvb2cubmV0LldlYkNoYW5uZWxUcmFuc3BvcnQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcucGF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZXRyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwud2ViQ2hhbm5lbEJhc2VUcmFuc3BvcnRUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbEJhc2UnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlVHJhbnNwb3J0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cubmV0LldlYkNoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2ViY2hhbm5lbGRlYnVnLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJ10sIFsnZ29vZy5qc29uJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL3dpcmUuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2lyZXY4LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZVY4J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuanNvbicsICdnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLnN0cnVjdHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2lyZXY4X3Rlc3QuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlVjhUZXN0J10sIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldpcmVWOCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbHRyYW5zcG9ydC5qcycsIFsnZ29vZy5uZXQuV2ViQ2hhbm5lbFRyYW5zcG9ydCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWx0cmFuc3BvcnRmYWN0b3J5LmpzJywgWydnb29nLm5ldC5jcmVhdGVXZWJDaGFubmVsVHJhbnNwb3J0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlVHJhbnNwb3J0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC94aHIuanMnLCBbJ2dvb2cubGFicy5uZXQueGhyJywgJ2dvb2cubGFicy5uZXQueGhyLkVycm9yJywgJ2dvb2cubGFicy5uZXQueGhyLkh0dHBFcnJvcicsICdnb29nLmxhYnMubmV0Lnhoci5PcHRpb25zJywgJ2dvb2cubGFicy5uZXQueGhyLlBvc3REYXRhJywgJ2dvb2cubGFicy5uZXQueGhyLlJlc3BvbnNlVHlwZScsICdnb29nLmxhYnMubmV0Lnhoci5UaW1lb3V0RXJyb3InXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5uZXQuSHR0cFN0YXR1cycsICdnb29nLm5ldC5YbWxIdHRwJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXJpLnV0aWxzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC94aHJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC54aHJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmxhYnMubmV0LnhocicsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWGhyTGlrZScsICdnb29nLm5ldC5YbWxIdHRwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3B1YnN1Yi9icm9hZGNhc3RwdWJzdWIuanMnLCBbJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLnJ1bicsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubG9nJywgJ2dvb2cubWF0aCcsICdnb29nLnB1YnN1Yi5QdWJTdWInLCAnZ29vZy5zdG9yYWdlLlN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNUxvY2FsU3RvcmFnZScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9wdWJzdWIvYnJvYWRjYXN0cHVic3ViX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViJywgJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0b3JhZ2UvYm91bmRlZGNvbGxlY3RhYmxlc3RvcmFnZS5qcycsIFsnZ29vZy5sYWJzLnN0b3JhZ2UuQm91bmRlZENvbGxlY3RhYmxlU3RvcmFnZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlcicsICdnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLkV4cGlyaW5nU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9zdG9yYWdlL2JvdW5kZWRjb2xsZWN0YWJsZXN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnN0b3JhZ2UuQm91bmRlZENvbGxlY3RhYmxlU3RvcmFnZVRlc3QnXSwgWydnb29nLmxhYnMuc3RvcmFnZS5Cb3VuZGVkQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0cnVjdHMvbXVsdGltYXAuanMnLCBbJ2dvb2cubGFicy5zdHJ1Y3RzLk11bHRpbWFwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLm9iamVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvc3RydWN0cy9tdWx0aW1hcF90ZXN0LmpzJywgWydnb29nLmxhYnMuc3RydWN0cy5NdWx0aW1hcFRlc3QnXSwgWydnb29nLmxhYnMuc3RydWN0cy5NdWx0aW1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9zdHlsZS9waXhlbGRlbnNpdHltb25pdG9yLmpzJywgWydnb29nLmxhYnMuc3R5bGUuUGl4ZWxEZW5zaXR5TW9uaXRvcicsICdnb29nLmxhYnMuc3R5bGUuUGl4ZWxEZW5zaXR5TW9uaXRvci5EZW5zaXR5JywgJ2dvb2cubGFicy5zdHlsZS5QaXhlbERlbnNpdHlNb25pdG9yLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0eWxlL3BpeGVsZGVuc2l0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnN0eWxlLlBpeGVsRGVuc2l0eU1vbml0b3JUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5sYWJzLnN0eWxlLlBpeGVsRGVuc2l0eU1vbml0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Fzc2VydHRoYXQuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5hc3NlcnRUaGF0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Fzc2VydHRoYXRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuYXNzZXJ0VGhhdFRlc3QnXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyRXJyb3InLCAnZ29vZy5sYWJzLnRlc3RpbmcuYXNzZXJ0VGhhdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kZWNvcmF0b3JtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5Bbnl0aGluZ01hdGNoZXInXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3RpbmcvZGVjb3JhdG9ybWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5kZWNvcmF0b3JNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFueXRoaW5nTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5HcmVhdGVyVGhhbk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kaWN0aW9uYXJ5bWF0Y2hlci5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuSGFzRW50cmllc01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSGFzRW50cnlNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkhhc0tleU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSGFzVmFsdWVNYXRjaGVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kaWN0aW9uYXJ5bWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5kaWN0aW9uYXJ5TWF0Y2hlclRlc3QnXSwgWydnb29nLmxhYnMudGVzdGluZy5IYXNFbnRyeU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9lbnZpcm9ubWVudC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnXSwgWydnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuQ29uc29sZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9lbnZpcm9ubWVudF90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5lbnZpcm9ubWVudFRlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczgnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Vudmlyb25tZW50X3VzYWdlX3Rlc3QuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLmVudmlyb25tZW50VXNhZ2VUZXN0J10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9qc29uX2Z1enppbmcuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLkpzb25GdXp6aW5nJ10sIFsnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2pzb25fZnV6emluZ190ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5Kc29uRnV6emluZ1Rlc3QnXSwgWydnb29nLmpzb24nLCAnZ29vZy5sYWJzLnRlc3RpbmcuSnNvbkZ1enppbmcnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9sb2dpY21hdGNoZXIuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFsbE9mTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5BbnlPZk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNOb3RNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmxvZ2ljTWF0Y2hlcnMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9sb2dpY21hdGNoZXJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcubG9naWNNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFsbE9mTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5HcmVhdGVyVGhhbk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9tYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9udW1iZXJtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5BbnlOdW1iZXJNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkNsb3NlVG9NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkVxdWFsVG9NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkdyZWF0ZXJUaGFuRXF1YWxUb01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuR3JlYXRlclRoYW5NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkxlc3NUaGFuRXF1YWxUb01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTGVzc1RoYW5NYXRjaGVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9udW1iZXJtYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLm51bWJlck1hdGNoZXJUZXN0J10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuTGVzc1RoYW5NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5hc3NlcnRUaGF0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvb2JqZWN0bWF0Y2hlci5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuQW55T2JqZWN0TWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5IYXNQcm9wZXJ0eU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSW5zdGFuY2VPZk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNOdWxsTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5Jc051bGxPclVuZGVmaW5lZE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNVbmRlZmluZWRNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLk9iamVjdEVxdWFsc01hdGNoZXInXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvb2JqZWN0bWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5vYmplY3RNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5PYmplY3RFcXVhbHNNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9zdHJpbmdtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5BbnlTdHJpbmdNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkNvbnRhaW5zU3RyaW5nTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5FbmRzV2l0aE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuRXF1YWxUb0lnbm9yaW5nV2hpdGVzcGFjZU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuRXF1YWxzTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5SZWdleE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuU3RhcnRzV2l0aE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuU3RyaW5nQ29udGFpbnNJbk9yZGVyTWF0Y2hlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvc3RyaW5nbWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5zdHJpbmdNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5TdHJpbmdDb250YWluc0luT3JkZXJNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2Jyb3dzZXIuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9icm93c2VyX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlclRlc3QnXSwgWydnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZGV2aWNlLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmRldmljZSddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZGV2aWNlX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZGV2aWNlVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZGV2aWNlJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2VuZ2luZS5qcycsIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZW5naW5lX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2V4dHJhLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmV4dHJhJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9leHRyYV90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmV4dHJhVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmV4dHJhJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L3BsYXRmb3JtLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9wbGF0Zm9ybV90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdGVzdF9hZ2VudHMuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC91dGlsLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnV0aWwnXSwgWydnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdXRpbF90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnV0aWxUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdmVyaWZpZXIuanMnLCBbJ2dvb2cubGFicy51c2VyYWdlbnQudmVyaWZpZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdmVyaWZpZXJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnVzZXJhZ2VudC52ZXJpZmllclRlc3QnXSwgWydnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJhZ2VudC52ZXJpZmllcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9hZGVyL2Fic3RyYWN0bW9kdWxlbWFuYWdlci5qcycsIFsnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubG9hZGVyLkFic3RyYWN0TW9kdWxlTWFuYWdlci5DYWxsYmFja1R5cGUnLCAnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyLkZhaWx1cmVUeXBlJ10sIFsnZ29vZy5tb2R1bGUuQWJzdHJhY3RNb2R1bGVMb2FkZXInLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvYWRlci9hY3RpdmVtb2R1bGVtYW5hZ2VyLmpzJywgWydnb29nLmxvYWRlci5hY3RpdmVNb2R1bGVNYW5hZ2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubG9hZGVyLkFic3RyYWN0TW9kdWxlTWFuYWdlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9jb3VudHJpZXMuanMnLCBbJ2dvb2cubG9jYWxlLmNvdW50cmllcyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9jb3VudHJ5bGFuZ3VhZ2VuYW1lc190ZXN0LmpzJywgWydnb29nLmxvY2FsZS5jb3VudHJ5TGFuZ3VhZ2VOYW1lc1Rlc3QnXSwgWydnb29nLmxvY2FsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2RlZmF1bHRsb2NhbGVuYW1lY29uc3RhbnRzLmpzJywgWydnb29nLmxvY2FsZS5kZWZhdWx0TG9jYWxlTmFtZUNvbnN0YW50cyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9nZW5lcmljZm9udG5hbWVzLmpzJywgWydnb29nLmxvY2FsZS5nZW5lcmljRm9udE5hbWVzJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2dlbmVyaWNmb250bmFtZXNfdGVzdC5qcycsIFsnZ29vZy5sb2NhbGUuZ2VuZXJpY0ZvbnROYW1lc1Rlc3QnXSwgWydnb29nLmxvY2FsZS5nZW5lcmljRm9udE5hbWVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvZ2VuZXJpY2ZvbnRuYW1lc2RhdGEuanMnLCBbJ2dvb2cubG9jYWxlLmdlbmVyaWNGb250TmFtZXNEYXRhJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2xvY2FsZS5qcycsIFsnZ29vZy5sb2NhbGUnXSwgWydnb29nLmxvY2FsZS5uYXRpdmVOYW1lQ29uc3RhbnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvbmF0aXZlbmFtZWNvbnN0YW50cy5qcycsIFsnZ29vZy5sb2NhbGUubmF0aXZlTmFtZUNvbnN0YW50cyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9zY3JpcHRUb0xhbmd1YWdlcy5qcycsIFsnZ29vZy5sb2NhbGUuc2NyaXB0VG9MYW5ndWFnZXMnXSwgWydnb29nLmxvY2FsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL3RpbWV6b25lZGV0ZWN0aW9uLmpzJywgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvbiddLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lRmluZ2VycHJpbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS90aW1lem9uZWRldGVjdGlvbl90ZXN0LmpzJywgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvblRlc3QnXSwgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL3RpbWV6b25lZmluZ2VycHJpbnQuanMnLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lRmluZ2VycHJpbnQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvdGltZXpvbmVsaXN0LmpzJywgWydnb29nLmxvY2FsZS5UaW1lWm9uZUxpc3QnLCAnZ29vZy5sb2NhbGUuZ2V0VGltZVpvbmVBbGxMb25nTmFtZXMnLCAnZ29vZy5sb2NhbGUuZ2V0VGltZVpvbmVTZWxlY3RlZExvbmdOYW1lcycsICdnb29nLmxvY2FsZS5nZXRUaW1lWm9uZVNlbGVjdGVkU2hvcnROYW1lcyddLCBbJ2dvb2cubG9jYWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvdGltZXpvbmVsaXN0X3Rlc3QuanMnLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lTGlzdFRlc3QnXSwgWydnb29nLmxvY2FsZScsICdnb29nLmxvY2FsZS5UaW1lWm9uZUxpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvZy9sb2cuanMnLCBbJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubG9nLkxvZ1JlY29yZCcsICdnb29nLmxvZy5Mb2dnZXInXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9nL2xvZ190ZXN0LmpzJywgWydnb29nLmxvZ1Rlc3QnXSwgWydnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYWZmaW5ldHJhbnNmb3JtLmpzJywgWydnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYWZmaW5ldHJhbnNmb3JtX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5BZmZpbmVUcmFuc2Zvcm1UZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkFmZmluZVRyYW5zZm9ybScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9iZXppZXIuanMnLCBbJ2dvb2cubWF0aC5CZXppZXInXSwgWydnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYmV6aWVyX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5CZXppZXJUZXN0J10sIFsnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5CZXppZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYm94LmpzJywgWydnb29nLm1hdGguQm94J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2JveF90ZXN0LmpzJywgWydnb29nLm1hdGguQm94VGVzdCddLCBbJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZS5qcycsIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwgWydnb29nLm1hdGgnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZTMuanMnLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlMyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2Nvb3JkaW5hdGUzX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlM1Rlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZTMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZV90ZXN0LmpzJywgWydnb29nLm1hdGguQ29vcmRpbmF0ZVRlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9leHBvbmVudGlhbGJhY2tvZmYuanMnLCBbJ2dvb2cubWF0aC5FeHBvbmVudGlhbEJhY2tvZmYnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvZXhwb25lbnRpYWxiYWNrb2ZmX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5FeHBvbmVudGlhbEJhY2tvZmZUZXN0J10sIFsnZ29vZy5tYXRoLkV4cG9uZW50aWFsQmFja29mZicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pbnRlZ2VyLmpzJywgWydnb29nLm1hdGguSW50ZWdlciddLCBbJ2dvb2cucmVmbGVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pbnRlZ2VyX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5JbnRlZ2VyVGVzdCddLCBbJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9pbnRlcnBvbGF0b3IxLmpzJywgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkludGVycG9sYXRvcjEnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9saW5lYXIxLmpzJywgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkxpbmVhcjEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLmludGVycG9sYXRvci5JbnRlcnBvbGF0b3IxJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9saW5lYXIxX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuTGluZWFyMVRlc3QnXSwgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkxpbmVhcjEnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3BjaGlwMS5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDEnXSwgWydnb29nLm1hdGgnLCAnZ29vZy5tYXRoLmludGVycG9sYXRvci5TcGxpbmUxJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9wY2hpcDFfdGVzdC5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDFUZXN0J10sIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDEnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3NwbGluZTEuanMnLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuU3BsaW5lMSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguaW50ZXJwb2xhdG9yLkludGVycG9sYXRvcjEnLCAnZ29vZy5tYXRoLnRkbWEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3NwbGluZTFfdGVzdC5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5TcGxpbmUxVGVzdCddLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuU3BsaW5lMScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pcmVjdC5qcycsIFsnZ29vZy5tYXRoLklSZWN0J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9saW5lLmpzJywgWydnb29nLm1hdGguTGluZSddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9saW5lX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5MaW5lVGVzdCddLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5MaW5lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2xvbmcuanMnLCBbJ2dvb2cubWF0aC5Mb25nJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucmVmbGVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbG9uZ190ZXN0LmpzJywgWydnb29nLm1hdGguTG9uZ1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5tYXRoLkxvbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbWF0aC5qcycsIFsnZ29vZy5tYXRoJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbWF0aF90ZXN0LmpzJywgWydnb29nLm1hdGhUZXN0J10sIFsnZ29vZy5tYXRoJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL21hdHJpeC5qcycsIFsnZ29vZy5tYXRoLk1hdHJpeCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9tYXRyaXhfdGVzdC5qcycsIFsnZ29vZy5tYXRoLk1hdHJpeFRlc3QnXSwgWydnb29nLm1hdGguTWF0cml4JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGguanMnLCBbJ2dvb2cubWF0aC5QYXRoJywgJ2dvb2cubWF0aC5QYXRoLlNlZ21lbnQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGhfdGVzdC5qcycsIFsnZ29vZy5tYXRoLlBhdGhUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJywgJ2dvb2cubWF0aC5QYXRoJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGhzLmpzJywgWydnb29nLm1hdGgucGF0aHMnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLm1hdGguUGF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9wYXRoc190ZXN0LmpzJywgWydnb29nLm1hdGgucGF0aHNUZXN0J10sIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLnBhdGhzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3JhbmdlLmpzJywgWydnb29nLm1hdGguUmFuZ2UnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvcmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5tYXRoLlJhbmdlVGVzdCddLCBbJ2dvb2cubWF0aC5SYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yYW5nZXNldC5qcycsIFsnZ29vZy5tYXRoLlJhbmdlU2V0J10sIFsnZ29vZy5hcnJheScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5tYXRoLlJhbmdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3Jhbmdlc2V0X3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5SYW5nZVNldFRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5tYXRoLlJhbmdlJywgJ2dvb2cubWF0aC5SYW5nZVNldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yZWN0LmpzJywgWydnb29nLm1hdGguUmVjdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5JUmVjdCcsICdnb29nLm1hdGguU2l6ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yZWN0X3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5SZWN0VGVzdCddLCBbJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvc2l6ZS5qcycsIFsnZ29vZy5tYXRoLlNpemUnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9zaXplX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5TaXplVGVzdCddLCBbJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3RkbWEuanMnLCBbJ2dvb2cubWF0aC50ZG1hJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdGRtYV90ZXN0LmpzJywgWydnb29nLm1hdGgudGRtYVRlc3QnXSwgWydnb29nLm1hdGgudGRtYScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC92ZWMyLmpzJywgWydnb29nLm1hdGguVmVjMiddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdmVjMl90ZXN0LmpzJywgWydnb29nLm1hdGguVmVjMlRlc3QnXSwgWydnb29nLm1hdGguVmVjMicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC92ZWMzLmpzJywgWydnb29nLm1hdGguVmVjMyddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZTMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdmVjM190ZXN0LmpzJywgWydnb29nLm1hdGguVmVjM1Rlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZTMnLCAnZ29vZy5tYXRoLlZlYzMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lbW9pemUvbWVtb2l6ZS5qcycsIFsnZ29vZy5tZW1vaXplJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lbW9pemUvbWVtb2l6ZV90ZXN0LmpzJywgWydnb29nLm1lbW9pemVUZXN0J10sIFsnZ29vZy5tZW1vaXplJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYWJzdHJhY3RjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLk1lc3NhZ2VDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYWJzdHJhY3RjaGFubmVsX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkFic3RyYWN0Q2hhbm5lbFRlc3QnXSwgWydnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5hc3luYy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL2J1ZmZlcmVkY2hhbm5lbC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuQnVmZmVyZWRDaGFubmVsJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5tZXNzYWdpbmcuTWVzc2FnZUNoYW5uZWwnLCAnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYnVmZmVyZWRjaGFubmVsX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkJ1ZmZlcmVkQ2hhbm5lbFRlc3QnXSwgWydnb29nLmRlYnVnLkNvbnNvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm1lc3NhZ2luZy5CdWZmZXJlZENoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmFzeW5jLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvZGVmZXJyZWRjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5EZWZlcnJlZENoYW5uZWwnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5tZXNzYWdpbmcuTWVzc2FnZUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9kZWZlcnJlZGNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUNoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9sb2dnZXJjbGllbnQuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkxvZ2dlckNsaWVudCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL2xvZ2dlcmNsaWVudF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5Mb2dnZXJDbGllbnRUZXN0J10sIFsnZ29vZy5kZWJ1ZycsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLm1lc3NhZ2luZy5Mb2dnZXJDbGllbnQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbG9nZ2Vyc2VydmVyLmpzJywgWydnb29nLm1lc3NhZ2luZy5Mb2dnZXJTZXJ2ZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9sb2dnZXJzZXJ2ZXJfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuTG9nZ2VyU2VydmVyVGVzdCddLCBbJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm1lc3NhZ2luZy5Mb2dnZXJTZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbWVzc2FnZWNoYW5uZWwuanMnLCBbJ2dvb2cubWVzc2FnaW5nLk1lc3NhZ2VDaGFubmVsJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL21lc3NhZ2luZy5qcycsIFsnZ29vZy5tZXNzYWdpbmcnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbWVzc2FnaW5nX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsVGVzdCddLCBbJ2dvb2cubWVzc2FnaW5nJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL211bHRpY2hhbm5lbC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJywgJ2dvb2cubWVzc2FnaW5nLk11bHRpQ2hhbm5lbC5WaXJ0dWFsQ2hhbm5lbCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5NZXNzYWdlQ2hhbm5lbCcsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL211bHRpY2hhbm5lbF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5NdWx0aUNoYW5uZWxUZXN0J10sIFsnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLklnbm9yZUFyZ3VtZW50JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydGNhbGxlci5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cubWVzc2FnaW5nLkRlZmVycmVkQ2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0TmV0d29yaycsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRjYWxsZXJfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlclRlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2FsbGVyJywgJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGVidWcnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuanNvbicsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnLCAnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydGNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENoYW5uZWxUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5qc29uJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUV2ZW50JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG5ldHdvcmsuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRuZXR3b3JrX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG9wZXJhdG9yLmpzJywgWydnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJywgJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG9wZXJhdG9yX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnRPcGVyYXRvclRlc3QnXSwgWydnb29nLm1lc3NhZ2luZy5Qb3J0TmV0d29yaycsICdnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VQb3J0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcmVzcG9uZGluZ2NoYW5uZWwuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlJlc3BvbmRpbmdDaGFubmVsJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5NdWx0aUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9yZXNwb25kaW5nY2hhbm5lbF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5SZXNwb25kaW5nQ2hhbm5lbFRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5tZXNzYWdpbmcuUmVzcG9uZGluZ0NoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3Rlc3RkYXRhL3BvcnRjaGFubmVsX3dvcmtlci5qcycsIFsnZ29vZy5tZXNzYWdpbmcudGVzdGRhdGEucG9ydGNoYW5uZWxfd29ya2VyJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy90ZXN0ZGF0YS9wb3J0bmV0d29ya193b3JrZXIxLmpzJywgWydnb29nLm1lc3NhZ2luZy50ZXN0ZGF0YS5wb3J0bmV0d29ya193b3JrZXIxJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlcicsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3Rlc3RkYXRhL3BvcnRuZXR3b3JrX3dvcmtlcjIuanMnLCBbJ2dvb2cubWVzc2FnaW5nLnRlc3RkYXRhLnBvcnRuZXR3b3JrX3dvcmtlcjInXSwgWydnb29nLm1lc3NhZ2luZy5Qb3J0Q2FsbGVyJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvYWJzdHJhY3Rtb2R1bGVsb2FkZXIuanMnLCBbJ2dvb2cubW9kdWxlLkFic3RyYWN0TW9kdWxlTG9hZGVyJ10sIFsnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL2Jhc2Vtb2R1bGUuanMnLCBbJ2dvb2cubW9kdWxlLkJhc2VNb2R1bGUnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5tb2R1bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9sb2FkZXIuanMnLCBbJ2dvb2cubW9kdWxlLkxvYWRlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucycsICdnb29nLm1vZHVsZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL21vZHVsZS5qcycsIFsnZ29vZy5tb2R1bGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlaW5mby5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbyddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzeW5jLnRocm93RXhjZXB0aW9uJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVpbmZvX3Rlc3QuanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUluZm9UZXN0J10sIFsnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVJbmZvJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVsb2FkY2FsbGJhY2suanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRDYWxsYmFjayddLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cubW9kdWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbG9hZGNhbGxiYWNrX3Rlc3QuanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRDYWxsYmFja1Rlc3QnXSwgWydnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbG9hZGVyLmpzJywgWydnb29nLm1vZHVsZS5Nb2R1bGVMb2FkZXInXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50SWQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5tb2R1bGUuQWJzdHJhY3RNb2R1bGVMb2FkZXInLCAnZ29vZy5uZXQuQnVsa0xvYWRlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuanNsb2FkZXInLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlTG9hZGVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxvYWRlci5hY3RpdmVNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRlcicsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyJywgJ2dvb2cubmV0LkJ1bGtMb2FkZXInLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbWFuYWdlci5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlcicsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyLkNhbGxiYWNrVHlwZScsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyLkZhaWx1cmVUeXBlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnLlRyYWNlJywgJ2dvb2cuZGlzcG9zYWJsZS5JRGlzcG9zYWJsZScsICdnb29nLmRpc3Bvc2VBbGwnLCAnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubG9hZGVyLmFjdGl2ZU1vZHVsZU1hbmFnZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbWFuYWdlcl90ZXN0LmpzJywgWydnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyJywgJ2dvb2cudGVzdGluZycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEFfMS5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQV8xJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEFfMi5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQV8yJ10sIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEJfMS5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQl8xJ10sIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Jyb3dzZXJjaGFubmVsLmpzJywgWydnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FcnJvcicsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FdmVudCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5IYW5kbGVyJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsLkxvZ1NhdmVyJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsLlF1ZXVlZE1hcCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TZXJ2ZXJSZWFjaGFiaWxpdHknLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU2VydmVyUmVhY2hhYmlsaXR5RXZlbnQnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0RXZlbnQnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdGUnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuVGltaW5nRXZlbnQnXSwgWydnb29nLlVyaScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnLlRleHRGb3JtYXR0ZXInLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5OYXRpdmVKc29uUHJvY2Vzc29yJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbCcsICdnb29nLm5ldC5DaGFubmVsRGVidWcnLCAnZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQudG1wbmV0d29yaycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvYnJvd3NlcmNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWxUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuanNvbicsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbCcsICdnb29nLm5ldC5DaGFubmVsRGVidWcnLCAnZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5uZXQudG1wbmV0d29yaycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvYnJvd3NlcnRlc3RjaGFubmVsLmpzJywgWydnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwnXSwgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdCcsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvcicsICdnb29nLm5ldC50bXBuZXR3b3JrJywgJ2dvb2cuc3RyaW5nLlBhcnNlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2J1bGtsb2FkZXIuanMnLCBbJ2dvb2cubmV0LkJ1bGtMb2FkZXInXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuQnVsa0xvYWRlckhlbHBlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9idWxrbG9hZGVyX3Rlc3QuanMnLCBbJ2dvb2cubmV0LkJ1bGtMb2FkZXJUZXN0J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cubmV0LkJ1bGtMb2FkZXInLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9idWxrbG9hZGVyaGVscGVyLmpzJywgWydnb29nLm5ldC5CdWxrTG9hZGVySGVscGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY2hhbm5lbGRlYnVnLmpzJywgWydnb29nLm5ldC5DaGFubmVsRGVidWcnXSwgWydnb29nLmpzb24nLCAnZ29vZy5sb2cnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY2hhbm5lbHJlcXVlc3QuanMnLCBbJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LkVycm9yJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzeW5jLlRocm90dGxlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NoYW5uZWxyZXF1ZXN0X3Rlc3QuanMnLCBbJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsJywgJ2dvb2cubmV0LkNoYW5uZWxEZWJ1ZycsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY29va2llcy5qcycsIFsnZ29vZy5uZXQuQ29va2llcycsICdnb29nLm5ldC5jb29raWVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nJ10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Nvb2tpZXNfdGVzdC5qcycsIFsnZ29vZy5uZXQuY29va2llc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubmV0LkNvb2tpZXMnLCAnZ29vZy5uZXQuY29va2llcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NvcnN4bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuQ29yc1htbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LkllQ29yc1hockFkYXB0ZXInXSwgWydnb29nLm5ldC5IdHRwU3RhdHVzJywgJ2dvb2cubmV0Llhockxpa2UnLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5YbWxIdHRwRmFjdG9yeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NvcnN4bWxodHRwZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLm5ldC5Db3JzWG1sSHR0cEZhY3RvcnlUZXN0J10sIFsnZ29vZy5uZXQuQ29yc1htbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LkllQ29yc1hockFkYXB0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9jcm9zc2RvbWFpbnJwYy5qcycsIFsnZ29vZy5uZXQuQ3Jvc3NEb21haW5ScGMnXSwgWydnb29nLlVyaScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSHR0cFN0YXR1cycsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Nyb3NzZG9tYWlucnBjX3Rlc3QuanMnLCBbJ2dvb2cubmV0LkNyb3NzRG9tYWluUnBjVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmxvZycsICdnb29nLm5ldC5Dcm9zc0RvbWFpblJwYycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Vycm9yY29kZS5qcycsIFsnZ29vZy5uZXQuRXJyb3JDb2RlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2V2ZW50dHlwZS5qcycsIFsnZ29vZy5uZXQuRXZlbnRUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2ZldGNoeG1saHR0cGZhY3RvcnkuanMnLCBbJ2dvb2cubmV0LkZldGNoWG1sSHR0cCcsICdnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0Llhockxpa2UnLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvZmV0Y2h4bWxodHRwZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5VGVzdCddLCBbJ2dvb2cubmV0LkZldGNoWG1sSHR0cCcsICdnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2ZpbGVkb3dubG9hZGVyLmpzJywgWydnb29nLm5ldC5GaWxlRG93bmxvYWRlcicsICdnb29nLm5ldC5GaWxlRG93bmxvYWRlci5FcnJvciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmNyeXB0Lmhhc2gzMicsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmZzJywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvZmlsZWRvd25sb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuRmlsZURvd25sb2FkZXJUZXN0J10sIFsnZ29vZy5mcy5FcnJvcicsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRmlsZURvd25sb2FkZXInLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcuZnMuRmlsZVN5c3RlbScsICdnb29nLnRlc3RpbmcubmV0LlhocklvUG9vbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2h0dHBzdGF0dXMuanMnLCBbJ2dvb2cubmV0Lkh0dHBTdGF0dXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaHR0cHN0YXR1c25hbWUuanMnLCBbJ2dvb2cubmV0Lkh0dHBTdGF0dXNOYW1lJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2lmcmFtZWlvLmpzJywgWydnb29nLm5ldC5JZnJhbWVJbycsICdnb29nLm5ldC5JZnJhbWVJby5JbmNyZW1lbnRhbERhdGFFdmVudCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucycsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5yZWZsZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RydWN0cycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2lmcmFtZWlvX3Rlc3QuanMnLCBbJ2dvb2cubmV0LklmcmFtZUlvVGVzdCddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5EaXZDb25zb2xlJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC5JZnJhbWVJbycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9pZnJhbWVsb2FkbW9uaXRvci5qcycsIFsnZ29vZy5uZXQuSWZyYW1lTG9hZE1vbml0b3InXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9pZnJhbWVsb2FkbW9uaXRvcl90ZXN0LmpzJywgWydnb29nLm5ldC5JZnJhbWVMb2FkTW9uaXRvclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LklmcmFtZUxvYWRNb25pdG9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaW1hZ2Vsb2FkZXIuanMnLCBbJ2dvb2cubmV0LkltYWdlTG9hZGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaW1hZ2Vsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuSW1hZ2VMb2FkZXJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5JbWFnZUxvYWRlcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaXBhZGRyZXNzLmpzJywgWydnb29nLm5ldC5JcEFkZHJlc3MnLCAnZ29vZy5uZXQuSXB2NEFkZHJlc3MnLCAnZ29vZy5uZXQuSXB2NkFkZHJlc3MnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaXBhZGRyZXNzX3Rlc3QuanMnLCBbJ2dvb2cubmV0LklwQWRkcmVzc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cubmV0LklwQWRkcmVzcycsICdnb29nLm5ldC5JcHY0QWRkcmVzcycsICdnb29nLm5ldC5JcHY2QWRkcmVzcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2pzbG9hZGVyLmpzJywgWydnb29nLm5ldC5qc2xvYWRlcicsICdnb29nLm5ldC5qc2xvYWRlci5FcnJvcicsICdnb29nLm5ldC5qc2xvYWRlci5FcnJvckNvZGUnLCAnZ29vZy5uZXQuanNsb2FkZXIuT3B0aW9ucyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvanNsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuanNsb2FkZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5uZXQuanNsb2FkZXInLCAnZ29vZy5uZXQuanNsb2FkZXIuRXJyb3JDb2RlJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvanNvbnAuanMnLCBbJ2dvb2cubmV0Lkpzb25wJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLm5ldC5qc2xvYWRlcicsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2pzb25wX3Rlc3QuanMnLCBbJ2dvb2cubmV0Lkpzb25wVGVzdCddLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5uZXQuSnNvbnAnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbW9ja2lmcmFtZWlvLmpzJywgWydnb29nLm5ldC5Nb2NrSUZyYW1lSW8nXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LklmcmFtZUlvJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbXVsdGlpZnJhbWVsb2FkbW9uaXRvci5qcycsIFsnZ29vZy5uZXQuTXVsdGlJZnJhbWVMb2FkTW9uaXRvciddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LklmcmFtZUxvYWRNb25pdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbXVsdGlpZnJhbWVsb2FkbW9uaXRvcl90ZXN0LmpzJywgWydnb29nLm5ldC5NdWx0aUlmcmFtZUxvYWRNb25pdG9yVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5uZXQuTXVsdGlJZnJhbWVMb2FkTW9uaXRvcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L25ldHdvcmtzdGF0dXNtb25pdG9yLmpzJywgWydnb29nLm5ldC5OZXR3b3JrU3RhdHVzTW9uaXRvciddLCBbJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9uZXR3b3JrdGVzdGVyLmpzJywgWydnb29nLm5ldC5OZXR3b3JrVGVzdGVyJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLlVyaScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbmV0d29ya3Rlc3Rlcl90ZXN0LmpzJywgWydnb29nLm5ldC5OZXR3b3JrVGVzdGVyVGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cubmV0Lk5ldHdvcmtUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3JwYy9odHRwY29ycy5qcycsIFsnZ29vZy5uZXQucnBjLkh0dHBDb3JzJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51cmkudXRpbHMnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvcnBjL2h0dHBjb3JzX3Rlc3QuanMnLCBbJ2dvb2cubmV0LnJwYy5IdHRwQ29yc1Rlc3QnXSwgWydnb29nLlVyaScsICdnb29nLm5ldC5ycGMuSHR0cENvcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2Jhc2U2NHBic3RyZWFtcGFyc2VyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuQmFzZTY0U3RyZWFtRGVjb2RlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvYmFzZTY0cGJzdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5CYXNlNjRQYlN0cmVhbVBhcnNlclRlc3QnXSwgWydnb29nLmNyeXB0LmJhc2U2NCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9iYXNlNjRzdHJlYW1kZWNvZGVyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFN0cmVhbURlY29kZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5iYXNlNjQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2Jhc2U2NHN0cmVhbWRlY29kZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5CYXNlNjRTdHJlYW1EZWNvZGVyVGVzdCddLCBbJ2dvb2cubmV0LnN0cmVhbXMuQmFzZTY0U3RyZWFtRGVjb2RlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvanNvbnN0cmVhbXBhcnNlci5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlci5PcHRpb25zJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2pzb25zdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy50ZXN0aW5nLkpzb25GdXp6aW5nJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXJpLnV0aWxzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvbm9kZXJlYWRhYmxlc3RyZWFtLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLk5vZGVSZWFkYWJsZVN0cmVhbSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3BianNvbnN0cmVhbXBhcnNlci5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9wYmpzb25zdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXJUZXN0J10sIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3Bic3RyZWFtcGFyc2VyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9wYnN0cmVhbXBhcnNlcl90ZXN0LmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyVGVzdCddLCBbJ2dvb2cubmV0LnN0cmVhbXMuUGJTdHJlYW1QYXJzZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3N0cmVhbWZhY3RvcnkuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMuY3JlYXRlWGhyTm9kZVJlYWRhYmxlU3RyZWFtJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyTm9kZVJlYWRhYmxlU3RyZWFtJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyU3RyZWFtUmVhZGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9zdHJlYW1wYXJzZXIuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvdXRpbHMuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwgW10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMveGhybm9kZXJlYWRhYmxlc3RyZWFtLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuc3RyZWFtcy5Ob2RlUmVhZGFibGVTdHJlYW0nLCAnZ29vZy5uZXQuc3RyZWFtcy5YaHJTdHJlYW1SZWFkZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3hocm5vZGVyZWFkYWJsZXN0cmVhbV90ZXN0LmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbVRlc3QnXSwgWydnb29nLm5ldC5zdHJlYW1zLk5vZGVSZWFkYWJsZVN0cmVhbScsICdnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbScsICdnb29nLm5ldC5zdHJlYW1zLlhoclN0cmVhbVJlYWRlcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMveGhyc3RyZWFtcmVhZGVyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhoclN0cmVhbVJlYWRlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmxvZycsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy94aHJzdHJlYW1yZWFkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5YaHJTdHJlYW1SZWFkZXJUZXN0J10sIFsnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyU3RyZWFtUmVhZGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC90ZXN0ZGF0YS9qc2xvYWRlcl90ZXN0MS5qcycsIFsnZ29vZy5uZXQudGVzdGRhdGEuanNsb2FkZXJfdGVzdDEnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvdGVzdGRhdGEvanNsb2FkZXJfdGVzdDIuanMnLCBbJ2dvb2cubmV0LnRlc3RkYXRhLmpzbG9hZGVyX3Rlc3QyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3Rlc3RkYXRhL2pzbG9hZGVyX3Rlc3QzLmpzJywgWydnb29nLm5ldC50ZXN0ZGF0YS5qc2xvYWRlcl90ZXN0MyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC90ZXN0ZGF0YS9qc2xvYWRlcl90ZXN0NC5qcycsIFsnZ29vZy5uZXQudGVzdGRhdGEuanNsb2FkZXJfdGVzdDQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvdG1wbmV0d29yay5qcycsIFsnZ29vZy5uZXQudG1wbmV0d29yayddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5uZXQuQ2hhbm5lbERlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvd2Vic29ja2V0LmpzJywgWydnb29nLm5ldC5XZWJTb2NrZXQnLCAnZ29vZy5uZXQuV2ViU29ja2V0LkVycm9yRXZlbnQnLCAnZ29vZy5uZXQuV2ViU29ja2V0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XZWJTb2NrZXQuTWVzc2FnZUV2ZW50J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5sb2cnXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvd2Vic29ja2V0X3Rlc3QuanMnLCBbJ2dvb2cubmV0LldlYlNvY2tldFRlc3QnXSwgWydnb29nLmRlYnVnLkVudHJ5UG9pbnRNb25pdG9yJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LldlYlNvY2tldCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3dyYXBwZXJ4bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuV3JhcHBlclhtbEh0dHBGYWN0b3J5J10sIFsnZ29vZy5uZXQuWGhyTGlrZScsICdnb29nLm5ldC5YbWxIdHRwRmFjdG9yeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hocmlvLmpzJywgWydnb29nLm5ldC5YaHJJbycsICdnb29nLm5ldC5YaHJJby5SZXNwb25zZVR5cGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuanNvbi5oeWJyaWQnLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5IdHRwU3RhdHVzJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy51cmkudXRpbHMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb190ZXN0LmpzJywgWydnb29nLm5ldC5YaHJJb1Rlc3QnXSwgWydnb29nLlVyaScsICdnb29nLmRlYnVnLkVudHJ5UG9pbnRNb25pdG9yJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb3Bvb2wuanMnLCBbJ2dvb2cubmV0LlhocklvUG9vbCddLCBbJ2dvb2cubmV0LlhocklvJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVBvb2wnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb3Bvb2xfdGVzdC5qcycsIFsnZ29vZy5uZXQuWGhySW9Qb29sVGVzdCddLCBbJ2dvb2cubmV0LlhocklvUG9vbCcsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveGhybGlrZS5qcycsIFsnZ29vZy5uZXQuWGhyTGlrZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJtYW5hZ2VyLmpzJywgWydnb29nLm5ldC5YaHJNYW5hZ2VyJywgJ2dvb2cubmV0Llhock1hbmFnZXIuRXZlbnQnLCAnZ29vZy5uZXQuWGhyTWFuYWdlci5SZXF1ZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJtYW5hZ2VyX3Rlc3QuanMnLCBbJ2dvb2cubmV0Llhock1hbmFnZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cubmV0Llhock1hbmFnZXInLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJb1Bvb2wnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveG1saHR0cC5qcycsIFsnZ29vZy5uZXQuRGVmYXVsdFhtbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5uZXQuWG1sSHR0cC5PcHRpb25UeXBlJywgJ2dvb2cubmV0LlhtbEh0dHAuUmVhZHlTdGF0ZScsICdnb29nLm5ldC5YbWxIdHRwRGVmaW5lcyddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwgWydnb29nLm5ldC5YaHJMaWtlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWwuanMnLCBbJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmFzeW5jLkRlbGF5JywgJ2dvb2cuZGlzcG9zZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLkFic3RyYWN0Q2hhbm5lbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ2hhbm5lbFN0YXRlcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLkRpcmVjdFRyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuTmF0aXZlTWVzc2FnaW5nVHJhbnNwb3J0JywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnRUeXBlcycsICdnb29nLm5ldC54cGMuVXJpQ2ZnRmllbGRzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXJpLnV0aWxzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5uZXQueHBjLkNyb3NzUGFnZUNoYW5uZWxUZXN0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuVXJpJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubmV0LnhwYycsICdnb29nLm5ldC54cGMuQ2ZnRmllbGRzJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsUm9sZScsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzOCd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWxyb2xlLmpzJywgWydnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2RpcmVjdHRyYW5zcG9ydC5qcycsIFsnZ29vZy5uZXQueHBjLkRpcmVjdFRyYW5zcG9ydCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQueHBjJywgJ2dvb2cubmV0LnhwYy5DZmdGaWVsZHMnLCAnZ29vZy5uZXQueHBjLkNyb3NzUGFnZUNoYW5uZWxSb2xlJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnQnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydFR5cGVzJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2RpcmVjdHRyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLm5ldC54cGMuRGlyZWN0VHJhbnNwb3J0VGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydFR5cGVzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9pZnJhbWVwb2xsaW5ndHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydC5SZWNlaXZlcicsICdnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydC5TZW5kZXInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvaWZyYW1lcG9sbGluZ3RyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydFRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLklmcmFtZVBvbGxpbmdUcmFuc3BvcnQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvbmF0aXZlbWVzc2FnaW5ndHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuTmF0aXZlTWVzc2FnaW5nVHJhbnNwb3J0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQueHBjJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsUm9sZScsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0JywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnRUeXBlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9uYXRpdmVtZXNzYWdpbmd0cmFuc3BvcnRfdGVzdC5qcycsIFsnZ29vZy5uZXQueHBjLk5hdGl2ZU1lc3NhZ2luZ1RyYW5zcG9ydFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLk5hdGl2ZU1lc3NhZ2luZ1RyYW5zcG9ydCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9yZWxheS5qcycsIFsnZ29vZy5uZXQueHBjLnJlbGF5J10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvdHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuVHJhbnNwb3J0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZG9tJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnROYW1lcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy94cGMuanMnLCBbJ2dvb2cubmV0LnhwYycsICdnb29nLm5ldC54cGMuQ2ZnRmllbGRzJywgJ2dvb2cubmV0LnhwYy5DaGFubmVsU3RhdGVzJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnROYW1lcycsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy5uZXQueHBjLlVyaUNmZ0ZpZWxkcyddLCBbJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdvYmplY3Qvb2JqZWN0LmpzJywgWydnb29nLm9iamVjdCddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdvYmplY3Qvb2JqZWN0X3Rlc3QuanMnLCBbJ2dvb2cub2JqZWN0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy9hYnNvbHV0ZXBvc2l0aW9uLmpzJywgWydnb29nLnBvc2l0aW9uaW5nLkFic29sdXRlUG9zaXRpb24nXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQWJzdHJhY3RQb3NpdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvYWJzdHJhY3Rwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BYnN0cmFjdFBvc2l0aW9uJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvYW5jaG9yZWRwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFBvc2l0aW9uJ10sIFsnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkcG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkdmlld3BvcnRwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFZpZXdwb3J0UG9zaXRpb24nXSwgWydnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkdmlld3BvcnRwb3NpdGlvbl90ZXN0LmpzJywgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkVmlld3BvcnRQb3NpdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLm1hdGguQm94JywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvY2xpZW50cG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvY2xpZW50cG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5jbGllbnRQb3NpdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvbWVudWFuY2hvcmVkcG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nXSwgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkVmlld3BvcnRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy9tZW51YW5jaG9yZWRwb3NpdGlvbl90ZXN0LmpzJywgWydnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5NZW51QW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvcG9zaXRpb25pbmcuanMnLCBbJ2dvb2cucG9zaXRpb25pbmcnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXJCaXQnLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3Bvc2l0aW9uaW5nX3Rlc3QuanMnLCBbJ2dvb2cucG9zaXRpb25pbmdUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy92aWV3cG9ydGNsaWVudHBvc2l0aW9uLmpzJywgWydnb29nLnBvc2l0aW9uaW5nLlZpZXdwb3J0Q2xpZW50UG9zaXRpb24nXSwgWydnb29nLmRvbScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3ZpZXdwb3J0Y2xpZW50cG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5WaWV3cG9ydENsaWVudFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5wb3NpdGlvbmluZy5WaWV3cG9ydENsaWVudFBvc2l0aW9uJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3ZpZXdwb3J0cG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuVmlld3BvcnRQb3NpdGlvbiddLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cucG9zaXRpb25pbmcnLCAnZ29vZy5wb3NpdGlvbmluZy5BYnN0cmFjdFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb21pc2UvbmF0aXZlcmVzb2x2ZXIuanMnLCBbJ2dvb2cucHJvbWlzZS5OYXRpdmVSZXNvbHZlciddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL25hdGl2ZXJlc29sdmVyX3Rlc3QuanMnLCBbJ2dvb2cucHJvbWlzZS5uYXRpdmVSZXNvbHZlclRlc3QnXSwgWydnb29nLnByb21pc2UuTmF0aXZlUmVzb2x2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb21pc2UvcHJvbWlzZS5qcycsIFsnZ29vZy5Qcm9taXNlJ10sIFsnZ29vZy5UaGVuYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5GcmVlTGlzdCcsICdnb29nLmFzeW5jLnJ1bicsICdnb29nLmFzeW5jLnRocm93RXhjZXB0aW9uJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5wcm9taXNlLlJlc29sdmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Byb21pc2VfdGVzdC5qcycsIFsnZ29vZy5Qcm9taXNlVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Jlc29sdmVyLmpzJywgWydnb29nLnByb21pc2UuUmVzb2x2ZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Rlc3RzdWl0ZWFkYXB0ZXIuanMnLCBbJ2dvb2cucHJvbWlzZS50ZXN0U3VpdGVBZGFwdGVyJ10sIFsnZ29vZy5Qcm9taXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3RoZW5hYmxlLmpzJywgWydnb29nLlRoZW5hYmxlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2Rlc2NyaXB0b3IuanMnLCBbJ2dvb2cucHJvdG8yLkRlc2NyaXB0b3InLCAnZ29vZy5wcm90bzIuTWV0YWRhdGEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2Rlc2NyaXB0b3JfdGVzdC5qcycsIFsnZ29vZy5wcm90bzIuRGVzY3JpcHRvclRlc3QnXSwgWydnb29nLnByb3RvMi5EZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9maWVsZGRlc2NyaXB0b3IuanMnLCBbJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2ZpZWxkZGVzY3JpcHRvcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3JUZXN0J10sIFsnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9sYXp5ZGVzZXJpYWxpemVyLmpzJywgWydnb29nLnByb3RvMi5MYXp5RGVzZXJpYWxpemVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy5wcm90bzIuU2VyaWFsaXplciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL21lc3NhZ2UuanMnLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2UnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5wcm90bzIuRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9tZXNzYWdlX3Rlc3QuanMnLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2VUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdwcm90bzIuVGVzdEFsbFR5cGVzJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScsICdwcm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnLCAncHJvdG8yLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9vYmplY3RzZXJpYWxpemVyLmpzJywgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5TZXJpYWxpemVyJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvb2JqZWN0c2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyVGVzdCddLCBbJ2dvb2cucHJvdG8yLk9iamVjdFNlcmlhbGl6ZXInLCAnZ29vZy5wcm90bzIuU2VyaWFsaXplcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGFja2FnZV90ZXN0LnBiLmpzJywgWydzb21lcHJvdG9wYWNrYWdlLlRlc3RQYWNrYWdlVHlwZXMnXSwgWydnb29nLnByb3RvMi5NZXNzYWdlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGJsaXRlc2VyaWFsaXplci5qcycsIFsnZ29vZy5wcm90bzIuUGJMaXRlU2VyaWFsaXplciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3InLCAnZ29vZy5wcm90bzIuTGF6eURlc2VyaWFsaXplcicsICdnb29nLnByb3RvMi5TZXJpYWxpemVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGJsaXRlc2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5QYkxpdGVTZXJpYWxpemVyVGVzdCddLCBbJ2dvb2cucHJvdG8yLlBiTGl0ZVNlcmlhbGl6ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdwcm90bzIuVGVzdEFsbFR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL3Byb3RvX3Rlc3QuanMnLCBbJ2dvb2cucHJvdG8yLm1lc3NhZ2VUZXN0J10sIFsnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAncHJvdG8yLlRlc3RBbGxUeXBlcycsICdwcm90bzIuVGVzdERlZmF1bHRQYXJlbnQnLCAnc29tZXByb3RvcGFja2FnZS5UZXN0UGFja2FnZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL3NlcmlhbGl6ZXIuanMnLCBbJ2dvb2cucHJvdG8yLlNlcmlhbGl6ZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi90ZXN0LnBiLmpzJywgWydwcm90bzIuVGVzdEFsbFR5cGVzJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScsICdwcm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnLCAncHJvdG8yLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCcsICdwcm90bzIuVGVzdERlZmF1bHRDaGlsZCcsICdwcm90bzIuVGVzdERlZmF1bHRQYXJlbnQnXSwgWydnb29nLnByb3RvMi5NZXNzYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvdGV4dGZvcm1hdHNlcmlhbGl6ZXIuanMnLCBbJ2dvb2cucHJvdG8yLlRleHRGb3JtYXRTZXJpYWxpemVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5tYXRoJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5NZXNzYWdlJywgJ2dvb2cucHJvdG8yLlNlcmlhbGl6ZXInLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi90ZXh0Zm9ybWF0c2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5UZXh0Rm9ybWF0U2VyaWFsaXplclRlc3QnXSwgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyJywgJ2dvb2cucHJvdG8yLlRleHRGb3JtYXRTZXJpYWxpemVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAncHJvdG8yLlRlc3RBbGxUeXBlcyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi91dGlsLmpzJywgWydnb29nLnByb3RvMi5VdGlsJ10sIFsnZ29vZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwdWJzdWIvcHVic3ViLmpzJywgWydnb29nLnB1YnN1Yi5QdWJTdWInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLnJ1biddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3B1YnN1Yl90ZXN0LmpzJywgWydnb29nLnB1YnN1Yi5QdWJTdWJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnB1YnN1Yi5QdWJTdWInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3RvcGljaWQuanMnLCBbJ2dvb2cucHVic3ViLlRvcGljSWQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwdWJzdWIvdHlwZWRwdWJzdWIuanMnLCBbJ2dvb2cucHVic3ViLlR5cGVkUHViU3ViJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cucHVic3ViLlB1YlN1YiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3R5cGVkcHVic3ViX3Rlc3QuanMnLCBbJ2dvb2cucHVic3ViLlR5cGVkUHViU3ViVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5wdWJzdWIuVG9waWNJZCcsICdnb29nLnB1YnN1Yi5UeXBlZFB1YlN1YicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVmbGVjdC9yZWZsZWN0LmpzJywgWydnb29nLnJlZmxlY3QnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVmbGVjdC9yZWZsZWN0X3Rlc3QuanMnLCBbJ2dvb2cucmVmbGVjdFRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnJlZmxlY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9jaGFpbl90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5jaGFpblRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cucmVzdWx0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdyZXN1bHQvY29tYmluZV90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5jb21iaW5lVGVzdCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLnJlc3VsdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L2RlZmVycmVkYWRhcHRvci5qcycsIFsnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yJ10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5SZXN1bHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9kZWZlcnJlZGFkYXB0b3JfdGVzdC5qcycsIFsnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5yZXN1bHQnLCAnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yJywgJ2dvb2cucmVzdWx0LlNpbXBsZVJlc3VsdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9kZXBlbmRlbnRyZXN1bHQuanMnLCBbJ2dvb2cucmVzdWx0LkRlcGVuZGVudFJlc3VsdCddLCBbJ2dvb2cucmVzdWx0LlJlc3VsdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3Jlc3VsdF9pbnRlcmZhY2UuanMnLCBbJ2dvb2cucmVzdWx0LlJlc3VsdCddLCBbJ2dvb2cuVGhlbmFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9yZXN1bHR1dGlsLmpzJywgWydnb29nLnJlc3VsdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5yZXN1bHQuRGVwZW5kZW50UmVzdWx0JywgJ2dvb2cucmVzdWx0LlJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9yZXN1bHR1dGlsX3Rlc3QuanMnLCBbJ2dvb2cucmVzdWx0VGVzdCddLCBbJ2dvb2cucmVzdWx0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdyZXN1bHQvc2ltcGxlcmVzdWx0LmpzJywgWydnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy5yZXN1bHQuU2ltcGxlUmVzdWx0LlN0YXRlRXJyb3InXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaGVuYWJsZScsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cucmVzdWx0LlJlc3VsdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3NpbXBsZXJlc3VsdF90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHRUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGhlbmFibGUnLCAnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3RyYW5zZm9ybV90ZXN0LmpzJywgWydnb29nLnJlc3VsdC50cmFuc2Zvcm1UZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC93YWl0X3Rlc3QuanMnLCBbJ2dvb2cucmVzdWx0LndhaXRUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3NveS9kYXRhLmpzJywgWydnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnQnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRDb250ZW50S2luZCcsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENzcycsICdnb29nLnNveS5kYXRhLlNhbml0aXplZEh0bWwnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRIdG1sQXR0cmlidXRlJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkSnMnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRUcnVzdGVkUmVzb3VyY2VVcmknLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRVcmknXSwgWydnb29nLlVyaScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnN0cmluZy5Db25zdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L2RhdGFfdGVzdC5qcycsIFsnZ29vZy5zb3kuZGF0YVRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zb3kudGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3JlbmRlcmVyLmpzJywgWydnb29nLnNveS5JbmplY3RlZERhdGFTdXBwbGllcicsICdnb29nLnNveS5SZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLnNveScsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnQnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRDb250ZW50S2luZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3JlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cuc295LlJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnNveS5SZW5kZXJlcicsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnRLaW5kJywgJ2dvb2cuc295LnRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzb3kvc295LmpzJywgWydnb29nLnNveSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ29udGVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3NveV90ZXN0LmpzJywgWydnb29nLnNveVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc295JywgJ2dvb2cuc295LnRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3NveS9zb3lfdGVzdGhlbHBlci5qcycsIFsnZ29vZy5zb3kudGVzdEhlbHBlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ29udGVudCcsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnRLaW5kJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ3NzJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkVHJ1c3RlZFJlc291cmNlVXJpJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3BlbGwvc3BlbGxjaGVjay5qcycsIFsnZ29vZy5zcGVsbC5TcGVsbENoZWNrJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjay5Xb3JkQ2hhbmdlZEV2ZW50J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cnVjdHMuU2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzcGVsbC9zcGVsbGNoZWNrX3Rlc3QuanMnLCBbJ2dvb2cuc3BlbGwuU3BlbGxDaGVja1Rlc3QnXSwgWydnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0YXRzL2Jhc2ljc3RhdC5qcycsIFsnZ29vZy5zdGF0cy5CYXNpY1N0YXQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RhdHMvYmFzaWNzdGF0X3Rlc3QuanMnLCBbJ2dvb2cuc3RhdHMuQmFzaWNTdGF0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5zdGF0cy5CYXNpY1N0YXQnLCAnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cudGVzdGluZy5Qc2V1ZG9SYW5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvY29sbGVjdGFibGVzdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLml0ZXInLCAnZ29vZy5zdG9yYWdlLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UuRXhwaXJpbmdTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9jb2xsZWN0YWJsZXN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLkNvbGxlY3RhYmxlU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2NvbGxlY3RhYmxlc3RvcmFnZXRlc3Rlci5qcycsIFsnZ29vZy5zdG9yYWdlLmNvbGxlY3RhYmxlU3RvcmFnZVRlc3RlciddLCBbJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2VuY3J5cHRlZHN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5FbmNyeXB0ZWRTdG9yYWdlJ10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkFyYzQnLCAnZ29vZy5jcnlwdC5TaGExJywgJ2dvb2cuY3J5cHQuYmFzZTY0JywgJ2dvb2cuanNvbicsICdnb29nLmpzb24uU2VyaWFsaXplcicsICdnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2VuY3J5cHRlZHN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLkVuY3J5cHRlZFN0b3JhZ2VUZXN0J10sIFsnZ29vZy5qc29uJywgJ2dvb2cuc3RvcmFnZS5FbmNyeXB0ZWRTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvZXJyb3Jjb2RlLmpzJywgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9leHBpcmluZ3N0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5FeHBpcmluZ1N0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UuUmljaFN0b3JhZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvZXhwaXJpbmdzdG9yYWdlX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5FeHBpcmluZ1N0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLkV4cGlyaW5nU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL2Vycm9yY29kZS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9lcnJvcmhhbmRsaW5nbWVjaGFuaXNtLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9ySGFuZGxpbmdNZWNoYW5pc20nXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLk1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vZXJyb3JoYW5kbGluZ21lY2hhbmlzbV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9ySGFuZGxpbmdNZWNoYW5pc21UZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckhhbmRsaW5nTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVsb2NhbHN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVMb2NhbFN0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1V2ViU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVsb2NhbHN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNUxvY2FsU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1TG9jYWxTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2VwYXJhdGlvblRlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXNlc3Npb25zdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1U2Vzc2lvblN0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1V2ViU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVzZXNzaW9uc3RvcmFnZV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1U2Vzc2lvblN0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVNlc3Npb25TdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2VwYXJhdGlvblRlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXdlYnN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVXZWJTdG9yYWdlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXdlYnN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVdlYlN0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVdlYlN0b3JhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL2lldXNlcmRhdGEuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSUVVc2VyRGF0YSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5JdGVyYWJsZU1lY2hhbmlzbScsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9pZXVzZXJkYXRhX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSUVVc2VyRGF0YVRlc3QnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLklFVXNlckRhdGEnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21TZXBhcmF0aW9uVGVzdGVyJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2hhcmluZ1Rlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9pdGVyYWJsZW1lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5JdGVyYWJsZU1lY2hhbmlzbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLk1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaXRlcmFibGVtZWNoYW5pc210ZXN0ZXIuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uaXRlcmFibGVNZWNoYW5pc21UZXN0ZXInXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL21lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5NZWNoYW5pc20nXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21mYWN0b3J5LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbWZhY3RvcnknXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1TG9jYWxTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVTZXNzaW9uU3RvcmFnZScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLklFVXNlckRhdGEnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vbWVjaGFuaXNtZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbWZhY3RvcnlUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21mYWN0b3J5JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21zZXBhcmF0aW9udGVzdGVyLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNlcGFyYXRpb25UZXN0ZXInXSwgWydnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21zaGFyaW5ndGVzdGVyLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInXSwgWydnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc210ZXN0ZGVmaW5pdGlvbi5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL21lY2hhbmlzbXRlc3Rlci5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0ZXInXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9yQ29kZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9wcmVmaXhlZG1lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbSddLCBbJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9wcmVmaXhlZG1lY2hhbmlzbV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLlByZWZpeGVkTWVjaGFuaXNtVGVzdCddLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVMb2NhbFN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNlcGFyYXRpb25UZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21TaGFyaW5nVGVzdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3JpY2hzdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UuUmljaFN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlLldyYXBwZXInXSwgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJywgJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3JpY2hzdG9yYWdlX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJywgJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3N0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJ10sIFsnZ29vZy5qc29uJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2Uvc3RvcmFnZV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2Uuc3RvcmFnZV90ZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdG9yYWdlLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UuU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3N0b3JhZ2V0ZXN0ZXIuanMnLCBbJ2dvb2cuc3RvcmFnZS5zdG9yYWdlVGVzdGVyJ10sIFsnZ29vZy5zdG9yYWdlLlN0b3JhZ2UnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9kZWZpbmVzLmpzJywgWydnb29nLnN0cmVhbXMuZGVmaW5lcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsJ10sIFsnZ29vZy5zdHJlYW1zLmRlZmluZXMnLCAnZ29vZy5zdHJlYW1zLmZ1bGxJbXBsJywgJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbCcsICdnb29nLnN0cmVhbXMuZnVsbFR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX2ltcGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsSW1wbCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnByb21pc2UuTmF0aXZlUmVzb2x2ZXInLCAnZ29vZy5zdHJlYW1zLmZ1bGxUeXBlcycsICdnb29nLnN0cmVhbXMubGl0ZUltcGwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGxfaW1wbF90ZXN0LmpzJywgWydnb29nLnN0cmVhbXMuZnVsbEltcGxUZXN0J10sIFsnZ29vZy5zdHJlYW1zLmZ1bGxJbXBsJywgJ2dvb2cuc3RyZWFtcy5mdWxsVGVzdENhc2VzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGxfbmF0aXZlX2ltcGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbCddLCBbJ2dvb2cuc3RyZWFtcy5mdWxsVHlwZXMnLCAnZ29vZy5zdHJlYW1zLmxpdGVOYXRpdmVJbXBsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX25hdGl2ZV9pbXBsX3Rlc3QuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbFRlc3QnXSwgWydnb29nLnN0cmVhbXMuZnVsbE5hdGl2ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmZ1bGxUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvZnVsbF90ZXN0X2Nhc2VzLmpzJywgWydnb29nLnN0cmVhbXMuZnVsbFRlc3RDYXNlcyddLCBbJ2dvb2cuc3RyZWFtcy5mdWxsVHlwZXMnLCAnZ29vZy5zdHJlYW1zLmxpdGVUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJ10sIHsnbGFuZyc6ICdlczknLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX3R5cGVzLmpzJywgWydnb29nLnN0cmVhbXMuZnVsbFR5cGVzJ10sIFsnZ29vZy5zdHJlYW1zLmxpdGVUeXBlcyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZS5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGUnXSwgWydnb29nLnN0cmVhbXMuZGVmaW5lcycsICdnb29nLnN0cmVhbXMubGl0ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmxpdGVOYXRpdmVJbXBsJywgJ2dvb2cuc3RyZWFtcy5saXRlVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2xpdGVfaW1wbC5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVJbXBsJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvbWlzZS5OYXRpdmVSZXNvbHZlcicsICdnb29nLnN0cmVhbXMubGl0ZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX2ltcGxfdGVzdC5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVJbXBsVGVzdCddLCBbJ2dvb2cuc3RyZWFtcy5saXRlSW1wbCcsICdnb29nLnN0cmVhbXMubGl0ZVRlc3RDYXNlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX25hdGl2ZV9pbXBsLmpzJywgWydnb29nLnN0cmVhbXMubGl0ZU5hdGl2ZUltcGwnXSwgWydnb29nLnN0cmVhbXMubGl0ZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX25hdGl2ZV9pbXBsX3Rlc3QuanMnLCBbJ2dvb2cuc3RyZWFtcy5saXRlTmF0aXZlSW1wbFRlc3QnXSwgWydnb29nLnN0cmVhbXMubGl0ZU5hdGl2ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmxpdGVUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZV90ZXN0X2Nhc2VzLmpzJywgWydnb29nLnN0cmVhbXMubGl0ZVRlc3RDYXNlcyddLCBbJ2dvb2cuc3RyZWFtcy5saXRlVHlwZXMnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZV90eXBlcy5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVUeXBlcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvY29uc3QuanMnLCBbJ2dvb2cuc3RyaW5nLkNvbnN0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nLlR5cGVkU3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvY29uc3RfdGVzdC5qcycsIFsnZ29vZy5zdHJpbmcuY29uc3RUZXN0J10sIFsnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9pbnRlcm5hbC5qcycsIFsnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL2xpbmtpZnkuanMnLCBbJ2dvb2cuc3RyaW5nLmxpbmtpZnknXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9saW5raWZ5X3Rlc3QuanMnLCBbJ2dvb2cuc3RyaW5nLmxpbmtpZnlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5saW5raWZ5JywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9uZXdsaW5lcy5qcycsIFsnZ29vZy5zdHJpbmcubmV3bGluZXMnLCAnZ29vZy5zdHJpbmcubmV3bGluZXMuTGluZSddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9uZXdsaW5lc190ZXN0LmpzJywgWydnb29nLnN0cmluZy5uZXdsaW5lc1Rlc3QnXSwgWydnb29nLnN0cmluZy5uZXdsaW5lcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3BhcnNlci5qcycsIFsnZ29vZy5zdHJpbmcuUGFyc2VyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3BhdGguanMnLCBbJ2dvb2cuc3RyaW5nLnBhdGgnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvcGF0aF90ZXN0LmpzJywgWydnb29nLnN0cmluZy5wYXRoVGVzdCddLCBbJ2dvb2cuc3RyaW5nLnBhdGgnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9zdHJpbmcuanMnLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnXSwgWydnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ190ZXN0LmpzJywgWydnb29nLnN0cmluZ1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5nYnVmZmVyLmpzJywgWydnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ2J1ZmZlcl90ZXN0LmpzJywgWydnb29nLnN0cmluZy5TdHJpbmdCdWZmZXJUZXN0J10sIFsnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5nZm9ybWF0LmpzJywgWydnb29nLnN0cmluZy5mb3JtYXQnXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ2Zvcm1hdF90ZXN0LmpzJywgWydnb29nLnN0cmluZy5mb3JtYXRUZXN0J10sIFsnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5naWZpZXIuanMnLCBbJ2dvb2cuc3RyaW5nLlN0cmluZ2lmaWVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3R5cGVkc3RyaW5nLmpzJywgWydnb29nLnN0cmluZy5UeXBlZFN0cmluZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvYXZsdHJlZS5qcycsIFsnZ29vZy5zdHJ1Y3RzLkF2bFRyZWUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5zdHJ1Y3RzLkNvbGxlY3Rpb24nXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2F2bHRyZWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkF2bFRyZWVUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnN0cnVjdHMuQXZsVHJlZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9jaXJjdWxhcmJ1ZmZlci5qcycsIFsnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvY2lyY3VsYXJidWZmZXJfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9jb2xsZWN0aW9uLmpzJywgWydnb29nLnN0cnVjdHMuQ29sbGVjdGlvbiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvY29sbGVjdGlvbl90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuQ29sbGVjdGlvblRlc3QnXSwgWydnb29nLnN0cnVjdHMuQXZsVHJlZScsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2hlYXAuanMnLCBbJ2dvb2cuc3RydWN0cy5IZWFwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMuTm9kZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9oZWFwX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5IZWFwVGVzdCddLCBbJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuSGVhcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9pbnZlcnNpb25tYXAuanMnLCBbJ2dvb2cuc3RydWN0cy5JbnZlcnNpb25NYXAnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9pbnZlcnNpb25tYXBfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkludmVyc2lvbk1hcFRlc3QnXSwgWydnb29nLnN0cnVjdHMuSW52ZXJzaW9uTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2xpbmtlZG1hcC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcCddLCBbJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvbGlua2VkbWFwX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5MaW5rZWRNYXBUZXN0J10sIFsnZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvbWFwLmpzJywgWydnb29nLnN0cnVjdHMuTWFwJ10sIFsnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL21hcF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuTWFwVGVzdCddLCBbJ2dvb2cuaXRlcicsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9ub2RlLmpzJywgWydnb29nLnN0cnVjdHMuTm9kZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlBvb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5zdHJ1Y3RzLlF1ZXVlJywgJ2dvb2cuc3RydWN0cy5TZXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcG9vbF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuUG9vbFRlc3QnXSwgWydnb29nLnN0cnVjdHMuUG9vbCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlByaW9yaXR5UG9vbCddLCBbJ2dvb2cuc3RydWN0cy5Qb29sJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVF1ZXVlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cG9vbF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuUHJpb3JpdHlQb29sVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVBvb2wnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9wcmlvcml0eXF1ZXVlLmpzJywgWydnb29nLnN0cnVjdHMuUHJpb3JpdHlRdWV1ZSddLCBbJ2dvb2cuc3RydWN0cy5IZWFwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cXVldWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlByaW9yaXR5UXVldWVUZXN0J10sIFsnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVF1ZXVlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3F1YWR0cmVlLmpzJywgWydnb29nLnN0cnVjdHMuUXVhZFRyZWUnLCAnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlLk5vZGUnLCAnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlLlBvaW50J10sIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVhZHRyZWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlVGVzdCddLCBbJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuUXVhZFRyZWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVldWUuanMnLCBbJ2dvb2cuc3RydWN0cy5RdWV1ZSddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVldWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlF1ZXVlVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5RdWV1ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zZXQuanMnLCBbJ2dvb2cuc3RydWN0cy5TZXQnXSwgWydnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLkNvbGxlY3Rpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zZXRfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlNldFRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc2ltcGxlcG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc3RyaW5nc2V0LmpzJywgWydnb29nLnN0cnVjdHMuU3RyaW5nU2V0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zdHJpbmdzZXRfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlN0cmluZ1NldFRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaXRlcicsICdnb29nLnN0cnVjdHMuU3RyaW5nU2V0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3N0cnVjdHMuanMnLCBbJ2dvb2cuc3RydWN0cyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc3RydWN0c190ZXN0LmpzJywgWydnb29nLnN0cnVjdHNUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJlZW5vZGUuanMnLCBbJ2dvb2cuc3RydWN0cy5UcmVlTm9kZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RydWN0cy5Ob2RlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3RyZWVub2RlX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5UcmVlTm9kZVRlc3QnXSwgWydnb29nLnN0cnVjdHMuVHJlZU5vZGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJpZS5qcycsIFsnZ29vZy5zdHJ1Y3RzLlRyaWUnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJpZV90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuVHJpZVRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLlRyaWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL2JpZGkuanMnLCBbJ2dvb2cuc3R5bGUuYmlkaSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvYmlkaV90ZXN0LmpzJywgWydnb29nLnN0eWxlLmJpZGlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL2N1cnNvci5qcycsIFsnZ29vZy5zdHlsZS5jdXJzb3InXSwgWydnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvY3Vyc29yX3Rlc3QuanMnLCBbJ2dvb2cuc3R5bGUuY3Vyc29yVGVzdCddLCBbJ2dvb2cuc3R5bGUuY3Vyc29yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS9zdHlsZS5qcycsIFsnZ29vZy5zdHlsZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20udmVuZG9yJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvc3R5bGVfZG9jdW1lbnRfc2Nyb2xsX3Rlc3QuanMnLCBbJ2dvb2cuc3R5bGUuc3R5bGVfZG9jdW1lbnRfc2Nyb2xsX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLnN0eWxlX3Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnLCAnZ29vZy51c2VyQWdlbnRUZXN0VXRpbC5Vc2VyQWdlbnRzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvc3R5bGVfd2Via2l0X3Njcm9sbGJhcnNfdGVzdC5qcycsIFsnZ29vZy5zdHlsZS53ZWJraXRTY3JvbGxiYXJzVGVzdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGVTY3JvbGxiYXJUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3N0eWxlc2Nyb2xsYmFydGVzdGVyLmpzJywgWydnb29nLnN0eWxlU2Nyb2xsYmFyVGVzdGVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS90cmFuc2Zvcm0uanMnLCBbJ2dvb2cuc3R5bGUudHJhbnNmb3JtJ10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3RyYW5zZm9ybV90ZXN0LmpzJywgWydnb29nLnN0eWxlLnRyYW5zZm9ybVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy5zdHlsZS50cmFuc2Zvcm0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3RyYW5zaXRpb24uanMnLCBbJ2dvb2cuc3R5bGUudHJhbnNpdGlvbicsICdnb29nLnN0eWxlLnRyYW5zaXRpb24uQ3NzM1Byb3BlcnR5J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZG9tLnZlbmRvcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvdHJhbnNpdGlvbl90ZXN0LmpzJywgWydnb29nLnN0eWxlLnRyYW5zaXRpb25UZXN0J10sIFsnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLnRyYW5zaXRpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RfbW9kdWxlLmpzJywgWydnb29nLnRlc3RfbW9kdWxlJ10sIFsnZ29vZy50ZXN0X21vZHVsZV9kZXAnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0X21vZHVsZV9kZXAuanMnLCBbJ2dvb2cudGVzdF9tb2R1bGVfZGVwJ10sIFtdLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXNzZXJ0aW9uZmFpbHVyZS5qcycsIFsnZ29vZy50ZXN0aW5nLnNhZmUuYXNzZXJ0aW9uRmFpbHVyZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXNzZXJ0cy5qcycsIFsnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwgWydnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2Fzc2VydHNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmFzc2VydHNUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRvbScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jL21vY2tjb250cm9sLmpzJywgWydnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLklnbm9yZUFyZ3VtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jL21vY2tjb250cm9sX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5hc3luYy5Nb2NrQ29udHJvbFRlc3QnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXN5bmN0ZXN0Y2FzZS5qcycsIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UuQ29udHJvbEJyZWFraW5nRXhjZXB0aW9uJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9hc3luY3Rlc3RjYXNlX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5Bc3luY1Rlc3RDYXNlQXN5bmNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jdGVzdGNhc2Vfbm9hc3luY190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuQXN5bmNUZXN0Q2FzZVN5bmNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXN5bmN0ZXN0Y2FzZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuQXN5bmNUZXN0Q2FzZVRlc3QnXSwgWydnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cudGVzdGluZy5Bc3luY1Rlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2JlbmNobWFyay5qcycsIFsnZ29vZy50ZXN0aW5nLmJlbmNobWFyayddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGFibGUnLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGltZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2NvbnRpbnVhdGlvbnRlc3RjYXNlLmpzJywgWydnb29nLnRlc3RpbmcuQ29udGludWF0aW9uVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlLkNvbnRpbnVhdGlvblRlc3QnLCAnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlLlN0ZXAnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvY29udGludWF0aW9udGVzdGNhc2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cudGVzdGluZy5Db250aW51YXRpb25UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9kZWZlcnJlZHRlc3RjYXNlLmpzJywgWydnb29nLnRlc3RpbmcuRGVmZXJyZWRUZXN0Q2FzZSddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2RlZmVycmVkdGVzdGNhc2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLkRlZmVycmVkVGVzdENhc2VUZXN0J10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLnRlc3RpbmcuRGVmZXJyZWRUZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2RvbS5qcycsIFsnZ29vZy50ZXN0aW5nLmRvbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLk5vZGVJdGVyYXRvcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLml0ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmRvbVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL2RvbS5qcycsIFsnZ29vZy50ZXN0aW5nLmVkaXRvci5kb20nXSwgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9lZGl0b3IvZG9tX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5lZGl0b3IuZG9tVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL2ZpZWxkbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLmVkaXRvci5GaWVsZE1vY2snXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLnRlc3RpbmcuTG9vc2VNb2NrJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL3Rlc3RoZWxwZXIuanMnLCBbJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nLCAnZ29vZy50ZXN0aW5nLmRvbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9lZGl0b3IvdGVzdGhlbHBlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvZXZlbnRvYnNlcnZlci5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvZXZlbnRvYnNlcnZlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL2V2ZW50cy5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL2V2ZW50c190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL21hdGNoZXJzLmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuQXJndW1lbnRNYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2V2ZW50cy9tYXRjaGVyc190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlclRlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvb25saW5laGFuZGxlci5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5PbmxpbmVIYW5kbGVyJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5uZXQuTmV0d29ya1N0YXR1c01vbml0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL29ubGluZWhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5PbmxpbmVIYW5kbGVyVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0Lk5ldHdvcmtTdGF0dXNNb25pdG9yJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnRPYnNlcnZlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzLk9ubGluZUhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXhwZWN0ZWRmYWlsdXJlcy5qcycsIFsnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5EaXZDb25zb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubG9nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXhwZWN0ZWRmYWlsdXJlc190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlc1Rlc3QnXSwgWydnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2Jsb2IuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5CbG9iJ10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LmJhc2U2NCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9ibG9iX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5CbG9iVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy5mcy5CbG9iJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2RpcmVjdG9yeWVudHJ5X3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5EaXJlY3RvcnlFbnRyeVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuZnMuRmlsZVN5c3RlbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9lbnRyeS5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cudGVzdGluZy5mcy5FbnRyeScsICdnb29nLnRlc3RpbmcuZnMuRmlsZUVudHJ5J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeUltcGwnLCAnZ29vZy5mcy5FbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZUVudHJ5JywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlV3JpdGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2VudHJ5X3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5FbnRyeVRlc3QnXSwgWydnb29nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZmlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGUnXSwgWydnb29nLnRlc3RpbmcuZnMuQmxvYiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxlZW50cnlfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVFbnRyeVRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlRW50cnknLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZmlsZXJlYWRlci5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVSZWFkZXInXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5GaWxlUmVhZGVyJywgJ2dvb2cudGVzdGluZy5mcy5CbG9iJywgJ2dvb2cudGVzdGluZy5mcy5Qcm9ncmVzc0V2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2ZpbGVyZWFkZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVSZWFkZXJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVSZWFkZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlUmVhZGVyJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlU3lzdGVtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2ZpbGVzeXN0ZW0uanMnLCBbJ2dvb2cudGVzdGluZy5mcy5GaWxlU3lzdGVtJ10sIFsnZ29vZy5mcy5GaWxlU3lzdGVtJywgJ2dvb2cudGVzdGluZy5mcy5EaXJlY3RvcnlFbnRyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxld3JpdGVyLmpzJywgWydnb29nLnRlc3RpbmcuZnMuRmlsZVdyaXRlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuZnMuQmxvYicsICdnb29nLnRlc3RpbmcuZnMuRmlsZScsICdnb29nLnRlc3RpbmcuZnMuUHJvZ3Jlc3NFdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxld3JpdGVyX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5GaWxlV3JpdGVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5GaWxlU2F2ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLmZzLkJsb2InLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZnMuanMnLCBbJ2dvb2cudGVzdGluZy5mcyddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZnMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmZzLkJsb2InLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZnNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzVGVzdCddLCBbJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcuZnMuQmxvYicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9pbnRlZ3JhdGlvbl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZnMuaW50ZWdyYXRpb25UZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMnLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZVNhdmVyJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9wcm9ncmVzc2V2ZW50LmpzJywgWydnb29nLnRlc3RpbmcuZnMuUHJvZ3Jlc3NFdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2Z1bmN0aW9ubW9jay5qcycsIFsnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5GdW5jdGlvbk1vY2snLCAnZ29vZy50ZXN0aW5nLkdsb2JhbEZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuTWV0aG9kTW9jayddLCBbJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnVuY3Rpb25tb2NrX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5GdW5jdGlvbk1vY2tUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuTW9jaycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2dyYXBoaWNzLmpzJywgWydnb29nLnRlc3RpbmcuZ3JhcGhpY3MnXSwgWydnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvaTE4bi9hc3NlcnRzLmpzJywgWydnb29nLnRlc3RpbmcuaTE4bi5hc3NlcnRzJ10sIFsnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvaTE4bi9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5pMThuLmFzc2VydHNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmkxOG4uYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9qc3RkYXN5bmN3cmFwcGVyLmpzJywgWydnb29nLnRlc3RpbmcuSnNUZEFzeW5jV3JhcHBlciddLCBbJ2dvb2cuUHJvbWlzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9qc3RkdGVzdGNhc2VhZGFwdGVyLmpzJywgWydnb29nLnRlc3RpbmcuSnNUZFRlc3RDYXNlQWRhcHRlciddLCBbJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5Kc1RkQXN5bmNXcmFwcGVyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2pzdW5pdC5qcycsIFsnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0UnVubmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2pzdW5pdGV4Y2VwdGlvbi5qcycsIFsnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbiddLCBbJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2xvb3NlbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLkxvb3NlRXhwZWN0YXRpb25Db2xsZWN0aW9uJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLk1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbG9vc2Vtb2NrX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5Mb29zZU1vY2tUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrbWVzc2FnZWNoYW5uZWwuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJ10sIFsnZ29vZy5tZXNzYWdpbmcuQWJzdHJhY3RDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tZXNzYWdpbmcvbW9ja21lc3NhZ2VldmVudC5qcycsIFsnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUV2ZW50J10sIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrbWVzc2FnZXBvcnQuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VQb3J0J10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrcG9ydG5ldHdvcmsuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja1BvcnROZXR3b3JrJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydE5ldHdvcmsnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tFeHBlY3RhdGlvbiddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm9iamVjdCcsICdnb29nLnByb21pc2UuUmVzb2x2ZXInLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuTW9ja0ludGVyZmFjZScsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Nb2NrRXhwZWN0YXRpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2NsYXNzZmFjdG9yeS5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc0ZhY3RvcnknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc1JlY29yZCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY2xhc3NmYWN0b3J5X3Rlc3QuanMnLCBbJ2Zha2UuQmFzZUNsYXNzJywgJ2Zha2UuQ2hpbGRDbGFzcycsICdnb29nLnRlc3RpbmcuTW9ja0NsYXNzRmFjdG9yeVRlc3QnXSwgWydnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc0ZhY3RvcnknLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2Nsb2NrLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY2xvY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDbG9ja1Rlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY29udHJvbC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2NvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NraW50ZXJmYWNlLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja0ludGVyZmFjZSddLCBbJ2dvb2cuUHJvbWlzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrbWF0Y2hlcnMuanMnLCBbJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5JZ25vcmVBcmd1bWVudCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLkluc3RhbmNlT2YnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5PYmplY3RFcXVhbHMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5SZWdleHBNYXRjaCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLlNhdmVBcmd1bWVudCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLlR5cGVPZiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja21hdGNoZXJzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnNUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcuanN1bml0JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5kb20uanMnLCBbJ2dvb2cudGVzdGluZy5Nb2NrUmFuZG9tJ10sIFsnZ29vZy5EaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tSYW5kb21UZXN0J10sIFsnZ29vZy50ZXN0aW5nLk1vY2tSYW5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3JhbmdlLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1JhbmdlJ10sIFsnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLnRlc3RpbmcuTG9vc2VNb2NrJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5nZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1JhbmdlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrUmFuZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3N0b3JhZ2UuanMnLCBbJ2dvb2cudGVzdGluZy5Nb2NrU3RvcmFnZSddLCBbJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3N0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tTdG9yYWdlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrU3RvcmFnZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrdXNlcmFnZW50LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3VzZXJhZ2VudF90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudFRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy50ZXN0aW5nLk1vY2tVc2VyQWdlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbXVsdGl0ZXN0cnVubmVyLmpzJywgWydnb29nLnRlc3RpbmcuTXVsdGlUZXN0UnVubmVyJywgJ2dvb2cudGVzdGluZy5NdWx0aVRlc3RSdW5uZXIuVGVzdEZyYW1lJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2VydmVyQ2hhcnQnLCAnZ29vZy51aS5UYWJsZVNvcnRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tdWx0aXRlc3RydW5uZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9uZXQvbW9ja2lmcmFtZWlvLmpzJywgWydnb29nLnRlc3RpbmcubmV0Lk1vY2tJRnJhbWVJbyddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSWZyYW1lSW8nLCAnZ29vZy50ZXN0aW5nLlRlc3RRdWV1ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9uZXQveGhyaW8uanMnLCBbJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nXSwgWydnb29nLlVyaScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tLnhtbCcsICdnb29nLmV2ZW50cycsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcuVGVzdFF1ZXVlJywgJ2dvb2cudXJpLnV0aWxzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL25ldC94aHJpb190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcubmV0LlhocklvVGVzdCddLCBbJ2dvb2cuZG9tLnhtbCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuSW5zdGFuY2VPZicsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL25ldC94aHJpb3Bvb2wuanMnLCBbJ2dvb2cudGVzdGluZy5uZXQuWGhySW9Qb29sJ10sIFsnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvb2JqZWN0cHJvcGVydHlzdHJpbmcuanMnLCBbJ2dvb2cudGVzdGluZy5PYmplY3RQcm9wZXJ0eVN0cmluZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcGFyYWxsZWxfY2xvc3VyZV90ZXN0X3N1aXRlLmpzJywgWydnb29nLnRlc3RpbmcucGFyYWxsZWxDbG9zdXJlVGVzdFN1aXRlJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cycsICdnb29nLmpzb24nLCAnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcGFyYWxsZWxfY2xvc3VyZV90ZXN0X3N1aXRlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5wYXJhbGxlbENsb3N1cmVUZXN0U3VpdGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5NdWx0aVRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnBhcmFsbGVsQ2xvc3VyZVRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wZXJmb3JtYW5jZXRhYmxlLmpzJywgWydnb29nLnRlc3RpbmcuUGVyZm9ybWFuY2VUYWJsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3BlcmZvcm1hbmNldGltZXIuanMnLCBbJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyLlRhc2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5tYXRoJ10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wZXJmb3JtYW5jZXRpbWVyX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5kb20nLCAnZ29vZy5tYXRoJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGltZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvcGVydHlyZXBsYWNlci5qcycsIFsnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvcGVydHlyZXBsYWNlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvdG8yL3Byb3RvMi5qcycsIFsnZ29vZy50ZXN0aW5nLnByb3RvMiddLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy5wcm90bzIuT2JqZWN0U2VyaWFsaXplcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wcm90bzIvcHJvdG8yX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5wcm90bzJUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnByb3RvMicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3BzZXVkb3JhbmRvbS5qcycsIFsnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbSddLCBbJ2dvb2cuRGlzcG9zYWJsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wc2V1ZG9yYW5kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbVRlc3QnXSwgWydnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3JlY29yZGZ1bmN0aW9uLmpzJywgWydnb29nLnRlc3RpbmcuRnVuY3Rpb25DYWxsJywgJ2dvb2cudGVzdGluZy5yZWNvcmRDb25zdHJ1Y3RvcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5wcm9taXNlLlJlc29sdmVyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3JlY29yZGZ1bmN0aW9uX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvblRlc3QnXSwgWydnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkQ29uc3RydWN0b3InLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3NoYXJkaW5ndGVzdGNhc2UuanMnLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaGFyZGluZ3Rlc3RjYXNlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaW5nbGV0b24uanMnLCBbJ2dvb2cudGVzdGluZy5zaW5nbGV0b24nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaW5nbGV0b25fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLnNpbmdsZXRvblRlc3QnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc2luZ2xldG9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3N0YWNrdHJhY2UuanMnLCBbJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlJywgJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlLkZyYW1lJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3RhY2t0cmFjZV90ZXN0LmpzJywgWydnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZVRlc3QnXSwgWydnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZScsICdnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZS5GcmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdG9yYWdlL2Zha2VtZWNoYW5pc20uanMnLCBbJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJywgJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3RyaWN0bW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy5Nb2NrJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3N0cmljdG1vY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2tUZXN0J10sIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3R5bGUvbGF5b3V0YXNzZXJ0cy5qcycsIFsnZ29vZy50ZXN0aW5nLnN0eWxlLmxheW91dGFzc2VydHMnXSwgWydnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9sYXlvdXRhc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5zdHlsZS5sYXlvdXRhc3NlcnRzVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3Rpbmcuc3R5bGUubGF5b3V0YXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9zdHlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLnN0eWxlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLnRlc3Rpbmcuc3R5bGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0Y2FzZS5qcycsIFsnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZS5FcnJvcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UuT3JkZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlLlJlc3VsdCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UuVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0Y2FzZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuVGVzdENhc2VUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJywgJ2dvb2cudGVzdGluZy5NZXRob2RNb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrUmFuZG9tJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczgnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0cXVldWUuanMnLCBbJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3Rlc3RydW5uZXIuanMnLCBbJ2dvb2cudGVzdGluZy5UZXN0UnVubmVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuanNvbicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvdGVzdHJ1bm5lcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuVGVzdFJ1bm5lclRlc3QnXSwgWydnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvdGVzdHN1aXRlLmpzJywgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3Rlc3RzdWl0ZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9yZW5kZXJlcmFzc2VydHMuanMnLCBbJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9yZW5kZXJlcmFzc2VydHNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLnJlbmRlcmVyYXNzZXJ0c1Rlc3QnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3VpL3JlbmRlcmVyaGFybmVzcy5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLlJlbmRlcmVySGFybmVzcyddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9zdHlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLnN0eWxlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3VpL3N0eWxlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy51aS5zdHlsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3RpbWVyL3RpbWVyLmpzJywgWydnb29nLlRpbWVyJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0aW1lci90aW1lcl90ZXN0LmpzJywgWydnb29nLlRpbWVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL2VudHJpZXMuanMnLCBbJ2dvb2cudHdlYWsuQmFzZUVudHJ5JywgJ2dvb2cudHdlYWsuQmFzZVByaW1pdGl2ZVNldHRpbmcnLCAnZ29vZy50d2Vhay5CYXNlU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5TdHJpbmdTZXR0aW5nJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL2VudHJpZXNfdGVzdC5qcycsIFsnZ29vZy50d2Vhay5CYXNlRW50cnlUZXN0J10sIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50d2Vhay50ZXN0aGVscGVycyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3JlZ2lzdHJ5LmpzJywgWydnb29nLnR3ZWFrLlJlZ2lzdHJ5J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50d2Vhay5CYXNlUHJpbWl0aXZlU2V0dGluZycsICdnb29nLnR3ZWFrLkJhc2VTZXR0aW5nJywgJ2dvb2cudHdlYWsuQm9vbGVhblNldHRpbmcnLCAnZ29vZy50d2Vhay5OdW1lcmljU2V0dGluZycsICdnb29nLnR3ZWFrLlN0cmluZ1NldHRpbmcnLCAnZ29vZy51cmkudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3JlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cudHdlYWsuUmVnaXN0cnlUZXN0J10sIFsnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50d2VhaycsICdnb29nLnR3ZWFrLnRlc3RoZWxwZXJzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndHdlYWsvdGVzdGhlbHBlcnMuanMnLCBbJ2dvb2cudHdlYWsudGVzdGhlbHBlcnMnXSwgWydnb29nLnR3ZWFrJywgJ2dvb2cudHdlYWsuQm9vbGVhbkdyb3VwJywgJ2dvb2cudHdlYWsuQm9vbGVhbkluR3JvdXBTZXR0aW5nJywgJ2dvb2cudHdlYWsuQm9vbGVhblNldHRpbmcnLCAnZ29vZy50d2Vhay5CdXR0b25BY3Rpb24nLCAnZ29vZy50d2Vhay5OdW1lcmljU2V0dGluZycsICdnb29nLnR3ZWFrLlJlZ2lzdHJ5JywgJ2dvb2cudHdlYWsuU3RyaW5nU2V0dGluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndHdlYWsvdHdlYWsuanMnLCBbJ2dvb2cudHdlYWsnLCAnZ29vZy50d2Vhay5Db25maWdQYXJhbXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy50d2Vhay5CYXNlU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5SZWdpc3RyeScsICdnb29nLnR3ZWFrLlN0cmluZ1NldHRpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3R3ZWFrdWkuanMnLCBbJ2dvb2cudHdlYWsuRW50cmllc1BhbmVsJywgJ2dvb2cudHdlYWsuVHdlYWtVaSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50d2VhaycsICdnb29nLnR3ZWFrLkJhc2VFbnRyeScsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5TdHJpbmdTZXR0aW5nJywgJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3R3ZWFrdWlfdGVzdC5qcycsIFsnZ29vZy50d2Vhay5Ud2Vha1VpVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnR3ZWFrJywgJ2dvb2cudHdlYWsuVHdlYWtVaScsICdnb29nLnR3ZWFrLnRlc3RoZWxwZXJzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWJzdHJhY3RzcGVsbGNoZWNrZXIuanMnLCBbJ2dvb2cudWkuQWJzdHJhY3RTcGVsbENoZWNrZXInLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlci5Bc3luY1Jlc3VsdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InLCAnZ29vZy51aS5Qb3B1cE1lbnUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2FjLmpzJywgWydnb29nLnVpLmFjJ10sIFsnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInLCAnZ29vZy51aS5hYy5BdXRvQ29tcGxldGUnLCAnZ29vZy51aS5hYy5JbnB1dEhhbmRsZXInLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYWNfdGVzdC5qcycsIFsnZ29vZy51aS5hY1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLnNlbGVjdGlvbicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2FycmF5bWF0Y2hlci5qcycsIFsnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuQXJyYXlNYXRjaGVyVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9hdXRvY29tcGxldGUuanMnLCBbJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlJywgJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYXV0b2NvbXBsZXRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJlbmRlck9wdGlvbnMnLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2NhY2hpbmdtYXRjaGVyLmpzJywgWydnb29nLnVpLmFjLkNhY2hpbmdNYXRjaGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLlRocm90dGxlJywgJ2dvb2cudWkuYWMuQXJyYXlNYXRjaGVyJywgJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvY2FjaGluZ21hdGNoZXJfdGVzdC5qcycsIFsnZ29vZy51aS5hYy5DYWNoaW5nTWF0Y2hlclRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuYWMuQ2FjaGluZ01hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9pbnB1dGhhbmRsZXIuanMnLCBbJ2dvb2cudWkuYWMuSW5wdXRIYW5kbGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2lucHV0aGFuZGxlcl90ZXN0LmpzJywgWydnb29nLnVpLmFjLklucHV0SGFuZGxlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2VsZWN0aW9uJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbW90ZS5qcycsIFsnZ29vZy51aS5hYy5SZW1vdGUnXSwgWydnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJlbW90ZUFycmF5TWF0Y2hlcicsICdnb29nLnVpLmFjLlJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yZW1vdGVhcnJheW1hdGNoZXIuanMnLCBbJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVXJpJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5YaHJJbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvcmVtb3RlYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyVGVzdCddLCBbJ2dvb2cubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5SZW1vdGVBcnJheU1hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yZW5kZXJlci5qcycsIFsnZ29vZy51aS5hYy5SZW5kZXJlcicsICdnb29nLnVpLmFjLlJlbmRlcmVyLkN1c3RvbVJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguZG9tLkZhZGVJbkFuZFNob3cnLCAnZ29vZy5meC5kb20uRmFkZU91dEFuZEhpZGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JZEdlbmVyYXRvcicsICdnb29nLnVpLmFjLkF1dG9Db21wbGV0ZSddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5kb20uRmFkZUluQW5kU2hvdycsICdnb29nLmZ4LmRvbS5GYWRlT3V0QW5kSGlkZScsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5BdXRvQ29tcGxldGUnLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbmRlcm9wdGlvbnMuanMnLCBbJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JpY2hpbnB1dGhhbmRsZXIuanMnLCBbJ2dvb2cudWkuYWMuUmljaElucHV0SGFuZGxlciddLCBbJ2dvb2cudWkuYWMuSW5wdXRIYW5kbGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yaWNocmVtb3RlLmpzJywgWydnb29nLnVpLmFjLlJpY2hSZW1vdGUnXSwgWydnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLlJlbW90ZScsICdnb29nLnVpLmFjLlJlbmRlcmVyJywgJ2dvb2cudWkuYWMuUmljaElucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJpY2hSZW1vdGVBcnJheU1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JpY2hyZW1vdGVhcnJheW1hdGNoZXIuanMnLCBbJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yaWNocmVtb3RlYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlclRlc3QnXSwgWydnb29nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjdGl2aXR5bW9uaXRvci5qcycsIFsnZ29vZy51aS5BY3Rpdml0eU1vbml0b3InXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hY3Rpdml0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy51aS5BY3Rpdml0eU1vbml0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FkdmFuY2VkdG9vbHRpcC5qcycsIFsnZ29vZy51aS5BZHZhbmNlZFRvb2x0aXAnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuVG9vbHRpcCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWR2YW5jZWR0b29sdGlwX3Rlc3QuanMnLCBbJ2dvb2cudWkuQWR2YW5jZWRUb29sdGlwVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFkdmFuY2VkVG9vbHRpcCcsICdnb29nLnVpLlRvb2x0aXAnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hbmltYXRlZHppcHB5LmpzJywgWydnb29nLnVpLkFuaW1hdGVkWmlwcHknXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguZWFzaW5nJywgJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51aS5aaXBweUV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hbmltYXRlZHppcHB5X3Rlc3QuanMnLCBbJ2dvb2cudWkuQW5pbWF0ZWRaaXBweVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmZ4LkFuaW1hdGlvbicsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFuaW1hdGVkWmlwcHknLCAnZ29vZy51aS5aaXBweSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2F0dGFjaGFibGVtZW51LmpzJywgWydnb29nLnVpLkF0dGFjaGFibGVNZW51J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JdGVtRXZlbnQnLCAnZ29vZy51aS5NZW51QmFzZScsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYmlkaWlucHV0LmpzJywgWydnb29nLnVpLkJpZGlJbnB1dCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLmkxOG4uYmlkaScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYmlkaWlucHV0X3Rlc3QuanMnLCBbJ2dvb2cudWkuQmlkaUlucHV0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5CaWRpSW5wdXQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idWJibGUuanMnLCBbJ2dvb2cudWkuQnViYmxlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQWJzb2x1dGVQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXJCaXQnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlBvcHVwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b24uanMnLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQnV0dG9uLlNpZGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLnVpLkJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuQnV0dG9uU2lkZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b25fdGVzdC5qcycsIFsnZ29vZy51aS5CdXR0b25UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuQnV0dG9uU2lkZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk5hdGl2ZUJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnVpLkJ1dHRvblNpZGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2J1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkJ1dHRvblNpZGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b25zaWRlLmpzJywgWydnb29nLnVpLkJ1dHRvblNpZGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jaGFyY291bnRlci5qcycsIFsnZ29vZy51aS5DaGFyQ291bnRlcicsICdnb29nLnVpLkNoYXJDb3VudGVyLkRpc3BsYXknXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoYXJjb3VudGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ2hhckNvdW50ZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNoYXJDb3VudGVyJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hhcnBpY2tlci5qcycsIFsnZ29vZy51aS5DaGFyUGlja2VyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmkxOG4uQ2hhckxpc3REZWNvbXByZXNzb3InLCAnZ29vZy5pMThuLkNoYXJQaWNrZXJEYXRhJywgJ2dvb2cuaTE4bi51Q2hhcicsICdnb29nLmkxOG4udUNoYXIuTmFtZUZldGNoZXInLCAnZ29vZy5zdHJ1Y3RzLlNldCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyU2Nyb2xsZXInLCAnZ29vZy51aS5GbGF0QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5Ib3ZlckNhcmQnLCAnZ29vZy51aS5MYWJlbElucHV0JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlRvb2x0aXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoYXJwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5DaGFyUGlja2VyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZGlzcG9zZScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5pMThuLkNoYXJQaWNrZXJEYXRhJywgJ2dvb2cuaTE4bi51Q2hhci5OYW1lRmV0Y2hlcicsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DaGFyUGlja2VyJywgJ2dvb2cudWkuRmxhdEJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hlY2tib3guanMnLCBbJ2dvb2cudWkuQ2hlY2tib3gnLCAnZ29vZy51aS5DaGVja2JveC5TdGF0ZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnN0cmluZycsICdnb29nLnVpLkNoZWNrYm94UmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoZWNrYm94X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ2hlY2tib3hUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DaGVja2JveCcsICdnb29nLnVpLkNoZWNrYm94UmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInLCAnZ29vZy51aS5kZWNvcmF0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoZWNrYm94bWVudWl0ZW0uanMnLCBbJ2dvb2cudWkuQ2hlY2tCb3hNZW51SXRlbSddLCBbJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hlY2tib3hyZW5kZXJlci5qcycsIFsnZ29vZy51aS5DaGVja2JveFJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm9iamVjdCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ybWVudWJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ybWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29sb3JNZW51QnV0dG9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkuUmVuZGVyZXJIYXJuZXNzJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b24nLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ycGFsZXR0ZS5qcycsIFsnZ29vZy51aS5Db2xvclBhbGV0dGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuUGFsZXR0ZScsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29sb3JQYWxldHRlVGVzdCddLCBbJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29sb3JQYWxldHRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JwaWNrZXIuanMnLCBbJ2dvb2cudWkuQ29sb3JQaWNrZXInLCAnZ29vZy51aS5Db2xvclBpY2tlci5FdmVudFR5cGUnXSwgWydnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29tYm9ib3guanMnLCBbJ2dvb2cudWkuQ29tYm9Cb3gnLCAnZ29vZy51aS5Db21ib0JveEl0ZW0nXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cubG9nJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkl0ZW1FdmVudCcsICdnb29nLnVpLkxhYmVsSW5wdXQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yJywgJ2dvb2cudWkucmVnaXN0cnknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbWJvYm94X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29tYm9Cb3hUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21ib0JveCcsICdnb29nLnVpLkNvbWJvQm94SXRlbScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLkxhYmVsSW5wdXQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb21wb25lbnQuanMnLCBbJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50LkVycm9yJywgJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudC5TdGF0ZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JZEdlbmVyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29tcG9uZW50X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29tcG9uZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb21wb25lbnR1dGlsLmpzJywgWydnb29nLnVpLkNvbXBvbmVudFV0aWwnXSwgWydnb29nLmV2ZW50cy5Nb3VzZUFzTW91c2VFdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuTW91c2VFdmVudHMnLCAnZ29vZy5ldmVudHMuUG9pbnRlckFzTW91c2VFdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbXBvbmVudHV0aWxfdGVzdC5qcycsIFsnZ29vZy51aS5Db21wb25lbnRVdGlsVGVzdCddLCBbJ2dvb2cuZXZlbnRzLk1vdXNlQXNNb3VzZUV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5Qb2ludGVyQXNNb3VzZUV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRhaW5lci5qcycsIFsnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5Db250YWluZXIuRXZlbnRUeXBlJywgJ2dvb2cudWkuQ29udGFpbmVyLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db21wb25lbnRVdGlsJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInLCAnZ29vZy51aS5Db250cm9sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Db250YWluZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUV2ZW50JywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRyb2wnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5Db250YWluZXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5yZWdpc3RyeScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29udGFpbmVycmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Db250YWluZXJSZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJzY3JvbGxlci5qcycsIFsnZ29vZy51aS5Db250YWluZXJTY3JvbGxlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJzY3JvbGxlcl90ZXN0LmpzJywgWydnb29nLnVpLkNvbnRhaW5lclNjcm9sbGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyU2Nyb2xsZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250cm9sLmpzJywgWydnb29nLnVpLkNvbnRyb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCcsICdnb29nLnVpLkNvbnRyb2xDb250ZW50JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy51aS5Db250cm9sVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5JywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29udHJvbGNvbnRlbnQuanMnLCBbJ2dvb2cudWkuQ29udHJvbENvbnRlbnQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250cm9scmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbENvbnRlbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRyb2xyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLkNvbnRyb2xSZW5kZXJlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb29raWVlZGl0b3IuanMnLCBbJ2dvb2cudWkuQ29va2llRWRpdG9yJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LmNvb2tpZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29va2llZWRpdG9yX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29va2llRWRpdG9yVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5jb29raWVzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvb2tpZUVkaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NzczNidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Dc3MzQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY3NzM21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Dc3MzTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Nzc25hbWVzLmpzJywgWydnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21idXR0b24uanMnLCBbJ2dvb2cudWkuQ3VzdG9tQnV0dG9uJ10sIFsnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21idXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21jb2xvcnBhbGV0dGUuanMnLCBbJ2dvb2cudWkuQ3VzdG9tQ29sb3JQYWxldHRlJ10sIFsnZ29vZy5jb2xvcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY3VzdG9tY29sb3JwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ3VzdG9tQ29sb3JQYWxldHRlVGVzdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DdXN0b21Db2xvclBhbGV0dGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kYXRlcGlja2VyLmpzJywgWydnb29nLnVpLkRhdGVQaWNrZXInLCAnZ29vZy51aS5EYXRlUGlja2VyLkV2ZW50cycsICdnb29nLnVpLkRhdGVQaWNrZXJFdmVudCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVJhbmdlJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuRGVmYXVsdERhdGVQaWNrZXJSZW5kZXJlcicsICdnb29nLnVpLklkR2VuZXJhdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuRGF0ZVBpY2tlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSEsnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRGF0ZVBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RhdGVwaWNrZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5EYXRlUGlja2VyUmVuZGVyZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kZWNvcmF0ZS5qcycsIFsnZ29vZy51aS5kZWNvcmF0ZSddLCBbJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RlY29yYXRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuZGVjb3JhdGVUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmRlY29yYXRlJywgJ2dvb2cudWkucmVnaXN0cnknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kZWZhdWx0ZGF0ZXBpY2tlcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkRlZmF1bHREYXRlUGlja2VyUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudWkuRGF0ZVBpY2tlclJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaWFsb2cuanMnLCBbJ2dvb2cudWkuRGlhbG9nJywgJ2dvb2cudWkuRGlhbG9nLkJ1dHRvblNldCcsICdnb29nLnVpLkRpYWxvZy5CdXR0b25TZXQuRGVmYXVsdEJ1dHRvbnMnLCAnZ29vZy51aS5EaWFsb2cuRGVmYXVsdEJ1dHRvbkNhcHRpb25zJywgJ2dvb2cudWkuRGlhbG9nLkRlZmF1bHRCdXR0b25LZXlzJywgJ2dvb2cudWkuRGlhbG9nLkV2ZW50JywgJ2dvb2cudWkuRGlhbG9nLkV2ZW50VHlwZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleXMnLCAnZ29vZy5meC5EcmFnZ2VyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Nb2RhbFBvcHVwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaWFsb2dfdGVzdC5qcycsIFsnZ29vZy51aS5EaWFsb2dUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5meC5jc3MzJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RpbWVuc2lvbnBpY2tlci5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXInXSwgWydnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuUG9pbnRlclR5cGUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLkFubm91bmNlcicsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmkxOG4uYmlkaScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLkRpbWVuc2lvblBpY2tlclJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhLkxpdmVQcmlvcml0eScsICdnb29nLmFycmF5JywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kcmFnZHJvcGRldGVjdG9yLmpzJywgWydnb29nLnVpLkRyYWdEcm9wRGV0ZWN0b3InLCAnZ29vZy51aS5EcmFnRHJvcERldGVjdG9yLkV2ZW50VHlwZScsICdnb29nLnVpLkRyYWdEcm9wRGV0ZWN0b3IuSW1hZ2VEcm9wRXZlbnQnLCAnZ29vZy51aS5EcmFnRHJvcERldGVjdG9yLkxpbmtEcm9wRXZlbnQnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RyaWxsZG93bnJvdy5qcycsIFsnZ29vZy51aS5EcmlsbGRvd25Sb3cnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZHJpbGxkb3ducm93X3Rlc3QuanMnLCBbJ2dvb2cudWkuRHJpbGxkb3duUm93VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5EcmlsbGRvd25Sb3cnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvYWJzdHJhY3RkaWFsb2cuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nLkJ1aWxkZXInLCAnZ29vZy51aS5lZGl0b3IuQWJzdHJhY3REaWFsb2cuRXZlbnRUeXBlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cmluZycsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL2Fic3RyYWN0ZGlhbG9nX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9idWJibGUuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sb2cnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLm9iamVjdCcsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvd1N0YXR1cycsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvYnViYmxlX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLmVkaXRvci5CdWJibGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9kZWZhdWx0dG9vbGJhci5qcycsIFsnZ29vZy51aS5lZGl0b3IuQnV0dG9uRGVzY3JpcHRvcicsICdnb29nLnVpLmVkaXRvci5EZWZhdWx0VG9vbGJhciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9saW5rZGlhbG9nLmpzJywgWydnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2cuQmVmb3JlVGVzdExpbmtFdmVudCcsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nLkV2ZW50VHlwZScsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nLk9rRXZlbnQnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkxpbmsnLCAnZ29vZy5lZGl0b3IuZm9jdXMnLCAnZ29vZy5lZGl0b3Iubm9kZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTGlua0J1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLlRhYlBhbmUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy53aW5kb3cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9saW5rZGlhbG9nX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2dUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLm1lc3NhZ2VzJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL21lc3NhZ2VzLmpzJywgWydnb29nLnVpLmVkaXRvci5tZXNzYWdlcyddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbEZvcm1hdHRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL3RhYnBhbmUuanMnLCBbJ2dvb2cudWkuZWRpdG9yLlRhYlBhbmUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5UYWInLCAnZ29vZy51aS5UYWJCYXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci90b29sYmFyY29udHJvbGxlci5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckNvbnRyb2xsZXInXSwgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci90b29sYmFyZmFjdG9yeS5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuT3B0aW9uJywgJ2dvb2cudWkuVG9vbGJhcicsICdnb29nLnVpLlRvb2xiYXJCdXR0b24nLCAnZ29vZy51aS5Ub29sYmFyQ29sb3JNZW51QnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b24nLCAnZ29vZy51aS5Ub29sYmFyUmVuZGVyZXInLCAnZ29vZy51aS5Ub29sYmFyU2VsZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvdG9vbGJhcmZhY3RvcnlfdGVzdC5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9lbW9qaS5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL2Vtb2ppcGFsZXR0ZS5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBhbGV0dGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSW1hZ2VMb2FkZXInLCAnZ29vZy51aS5QYWxldHRlJywgJ2dvb2cudWkuZW1vamkuRW1vamknLCAnZ29vZy51aS5lbW9qaS5FbW9qaVBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZW1vamlwYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuRW1vamlQYWxldHRlUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlcicsICdnb29nLnVpLmVtb2ppLkVtb2ppJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9lbW9qaXBpY2tlci5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBpY2tlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlRhYlBhbmUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZVJlbmRlcmVyJywgJ2dvb2cudWkuZW1vamkuUHJvZ3Jlc3NpdmVFbW9qaVBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZW1vamlwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJywgJ2dvb2cudWkuZW1vamkuU3ByaXRlSW5mbyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL2Zhc3Rfbm9ucHJvZ3Jlc3NpdmVfZW1vamlwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5lbW9qaS5GYXN0Tm9uUHJvZ3Jlc3NpdmVFbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVtb2ppLkVtb2ppJywgJ2dvb2cudWkuZW1vamkuRW1vamlQaWNrZXInLCAnZ29vZy51aS5lbW9qaS5TcHJpdGVJbmZvJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZmFzdF9wcm9ncmVzc2l2ZV9lbW9qaXBpY2tlcl90ZXN0LmpzJywgWydnb29nLnVpLmVtb2ppLkZhc3RQcm9ncmVzc2l2ZUVtb2ppUGlja2VyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJywgJ2dvb2cudWkuZW1vamkuU3ByaXRlSW5mbyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL3BvcHVwZW1vamlwaWNrZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9wb3B1cGVtb2ppcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL3Byb2dyZXNzaXZlZW1vamlwYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuUHJvZ3Jlc3NpdmVFbW9qaVBhbGV0dGVSZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9zcHJpdGVpbmZvLmpzJywgWydnb29nLnVpLmVtb2ppLlNwcml0ZUluZm8nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvc3ByaXRlaW5mb190ZXN0LmpzJywgWydnb29nLnVpLmVtb2ppLlNwcml0ZUluZm9UZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVtb2ppLlNwcml0ZUluZm8nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJlZG1lbnUuanMnLCBbJ2dvb2cudWkuRmlsdGVyZWRNZW51J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQXV0b0NvbXBsZXRlVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkZpbHRlck9ic2VydmluZ01lbnVJdGVtJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJlZG1lbnVfdGVzdC5qcycsIFsnZ29vZy51aS5GaWx0ZXJlZE1lbnVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQXV0b0NvbXBsZXRlVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRmlsdGVyZWRNZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJvYnNlcnZpbmdtZW51aXRlbS5qcycsIFsnZ29vZy51aS5GaWx0ZXJPYnNlcnZpbmdNZW51SXRlbSddLCBbJ2dvb2cudWkuRmlsdGVyT2JzZXJ2aW5nTWVudUl0ZW1SZW5kZXJlcicsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ZpbHRlcm9ic2VydmluZ21lbnVpdGVtcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuRmlsdGVyT2JzZXJ2aW5nTWVudUl0ZW1SZW5kZXJlciddLCBbJ2dvb2cudWkuTWVudUl0ZW1SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZmxhdGJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ZsYXRtZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuRmxhdE1lbnVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUJ1dHRvbicsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9mb3JtcG9zdC5qcycsIFsnZ29vZy51aS5Gb3JtUG9zdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Zvcm1wb3N0X3Rlc3QuanMnLCBbJ2dvb2cudWkuRm9ybVBvc3RUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Gb3JtUG9zdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZ2F1Z2UuanMnLCBbJ2dvb2cudWkuR2F1Z2UnLCAnZ29vZy51aS5HYXVnZUNvbG9yZWRSYW5nZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmVhc2luZycsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuRm9udCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5tYXRoJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuR2F1Z2VUaGVtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZ2F1Z2V0aGVtZS5qcycsIFsnZ29vZy51aS5HYXVnZVRoZW1lJ10sIFsnZ29vZy5ncmFwaGljcy5MaW5lYXJHcmFkaWVudCcsICdnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCcsICdnb29nLmdyYXBoaWNzLlN0cm9rZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaG92ZXJjYXJkLmpzJywgWydnb29nLnVpLkhvdmVyQ2FyZCcsICdnb29nLnVpLkhvdmVyQ2FyZC5FdmVudFR5cGUnLCAnZ29vZy51aS5Ib3ZlckNhcmQuVHJpZ2dlckV2ZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5BZHZhbmNlZFRvb2x0aXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnLCAnZ29vZy51aS5Ub29sdGlwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9ob3ZlcmNhcmRfdGVzdC5qcycsIFsnZ29vZy51aS5Ib3ZlckNhcmRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSG92ZXJDYXJkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaHN2YXBhbGV0dGUuanMnLCBbJ2dvb2cudWkuSHN2YVBhbGV0dGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3IuYWxwaGEnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkhzdlBhbGV0dGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2hzdmFwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuSHN2YVBhbGV0dGVUZXN0J10sIFsnZ29vZy5jb2xvci5hbHBoYScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Ic3ZhUGFsZXR0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2hzdnBhbGV0dGUuanMnLCBbJ2dvb2cudWkuSHN2UGFsZXR0ZSddLCBbJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaHN2cGFsZXR0ZV90ZXN0LmpzJywgWydnb29nLnVpLkhzdlBhbGV0dGVUZXN0J10sIFsnZ29vZy5jb2xvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Ic3ZQYWxldHRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaWRnZW5lcmF0b3IuanMnLCBbJ2dvb2cudWkuSWRHZW5lcmF0b3InXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pZGxldGltZXIuanMnLCBbJ2dvb2cudWkuSWRsZVRpbWVyJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudWkuQWN0aXZpdHlNb25pdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pZGxldGltZXJfdGVzdC5qcycsIFsnZ29vZy51aS5JZGxlVGltZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSWRsZVRpbWVyJywgJ2dvb2cudWkuTW9ja0FjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2lmcmFtZW1hc2suanMnLCBbJ2dvb2cudWkuSWZyYW1lTWFzayddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5zdHJ1Y3RzLlBvb2wnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaWZyYW1lbWFza190ZXN0LmpzJywgWydnb29nLnVpLklmcmFtZU1hc2tUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5pZnJhbWUnLCAnZ29vZy5zdHJ1Y3RzLlBvb2wnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5JZnJhbWVNYXNrJywgJ2dvb2cudWkuUG9wdXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pbWFnZWxlc3NidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5JbWFnZWxlc3NCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ltYWdlbGVzc21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5JbWFnZWxlc3NNZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2lucHV0ZGF0ZXBpY2tlci5qcycsIFsnZ29vZy51aS5JbnB1dERhdGVQaWNrZXInXSwgWydnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGFyc2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5EYXRlUGlja2VyJywgJ2dvb2cudWkuTGFiZWxJbnB1dCcsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVpLlBvcHVwRGF0ZVBpY2tlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaW5wdXRkYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuSW5wdXREYXRlUGlja2VyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXJzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSW5wdXREYXRlUGlja2VyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaXRlbWV2ZW50LmpzJywgWydnb29nLnVpLkl0ZW1FdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9rZXlib2FyZGV2ZW50ZGF0YS5qcycsIFsnZ29vZy51aS5LZXlib2FyZEV2ZW50RGF0YSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9rZXlib2FyZHNob3J0Y3V0aGFuZGxlci5qcycsIFsnZ29vZy51aS5LZXlib2FyZFNob3J0Y3V0RXZlbnQnLCAnZ29vZy51aS5LZXlib2FyZFNob3J0Y3V0SGFuZGxlcicsICdnb29nLnVpLktleWJvYXJkU2hvcnRjdXRIYW5kbGVyLkV2ZW50VHlwZScsICdnb29nLnVpLktleWJvYXJkU2hvcnRjdXRIYW5kbGVyLk1vZGlmaWVycyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleU5hbWVzJywgJ2dvb2cuZXZlbnRzLktleXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51aS5LZXlib2FyZEV2ZW50RGF0YScsICdnb29nLnVpLlN5bnRoZXRpY0tleWJvYXJkRXZlbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2tleWJvYXJkc2hvcnRjdXRoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuS2V5Ym9hcmRTaG9ydGN1dEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuS2V5Ym9hcmRTaG9ydGN1dEhhbmRsZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9sYWJlbGlucHV0LmpzJywgWydnb29nLnVpLkxhYmVsSW5wdXQnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbGFiZWxpbnB1dF90ZXN0LmpzJywgWydnb29nLnVpLkxhYmVsSW5wdXRUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuTGFiZWxJbnB1dCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2xpbmtidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5MaW5rQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9mbGFzaG9iamVjdC5qcycsIFsnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0LlNjcmlwdEFjY2Vzc0xldmVsJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QuV21vZGVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLmZsYXNoJywgJ2dvb2cubG9nJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5mbGFzaCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxhc2hvYmplY3RfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxpY2tyLmpzJywgWydnb29nLnVpLm1lZGlhLkZsaWNrclNldCcsICdnb29nLnVpLm1lZGlhLkZsaWNrclNldE1vZGVsJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxpY2tyX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0JywgJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0TW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL2dvb2dsZXZpZGVvLmpzJywgWydnb29nLnVpLm1lZGlhLkdvb2dsZVZpZGVvJywgJ2dvb2cudWkubWVkaWEuR29vZ2xlVmlkZW9Nb2RlbCddLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL2dvb2dsZXZpZGVvX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuR29vZ2xlVmlkZW9UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5Hb29nbGVWaWRlbycsICdnb29nLnVpLm1lZGlhLkdvb2dsZVZpZGVvTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21lZGlhLmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9tZWRpYV90ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9tZWRpYW1vZGVsLmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLkNhdGVnb3J5JywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5DcmVkaXQnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLkNyZWRpdC5Sb2xlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5DcmVkaXQuU2NoZW1lJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5NZWRpdW0nLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLk1pbWVUeXBlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5QbGF5ZXInLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLlN1YlRpdGxlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5UaHVtYm5haWwnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21lZGlhbW9kZWxfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvbXAzLmpzJywgWydnb29nLnVpLm1lZGlhLk1wMyddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5NZWRpYScsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21wM190ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLk1wM1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1wMyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL3Bob3RvLmpzJywgWydnb29nLnVpLm1lZGlhLlBob3RvJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvcGhvdG9fdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5QaG90b1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuUGhvdG8nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9waWNhc2EuanMnLCBbJ2dvb2cudWkubWVkaWEuUGljYXNhQWxidW0nLCAnZ29vZy51aS5tZWRpYS5QaWNhc2FBbGJ1bU1vZGVsJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvcGljYXNhX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuUGljYXNhVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5QaWNhc2FBbGJ1bScsICdnb29nLnVpLm1lZGlhLlBpY2FzYUFsYnVtTW9kZWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS92aW1lby5qcycsIFsnZ29vZy51aS5tZWRpYS5WaW1lbycsICdnb29nLnVpLm1lZGlhLlZpbWVvTW9kZWwnXSwgWydnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5NZWRpYScsICdnb29nLnVpLm1lZGlhLk1lZGlhTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS92aW1lb190ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLlZpbWVvVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5WaW1lbycsICdnb29nLnVpLm1lZGlhLlZpbWVvTW9kZWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS95b3V0dWJlLmpzJywgWydnb29nLnVpLm1lZGlhLllvdXR1YmUnLCAnZ29vZy51aS5tZWRpYS5Zb3V0dWJlTW9kZWwnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL3lvdXR1YmVfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5Zb3V0dWJlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuWW91dHViZScsICdnb29nLnVpLm1lZGlhLllvdXR1YmVNb2RlbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnUuanMnLCBbJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnUuRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudC5TdGF0ZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lci5PcmllbnRhdGlvbicsICdnb29nLnVpLk1lbnVIZWFkZXInLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YmFyLmpzJywgWydnb29nLnVpLm1lbnVCYXInXSwgWydnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLk1lbnVCYXJSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudWJhcmRlY29yYXRvci5qcycsIFsnZ29vZy51aS5tZW51QmFyRGVjb3JhdG9yJ10sIFsnZ29vZy51aS5NZW51QmFyUmVuZGVyZXInLCAnZ29vZy51aS5tZW51QmFyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnViYXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5NZW51QmFyUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnViYXNlLmpzJywgWydnb29nLnVpLk1lbnVCYXNlJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudWkuUG9wdXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVidXR0b24uanMnLCBbJ2dvb2cudWkuTWVudUJ1dHRvbiddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLklkR2VuZXJhdG9yJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJywgJ2dvb2cudWkuU3ViTWVudScsICdnb29nLnVpLnJlZ2lzdHJ5JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YnV0dG9uX3Rlc3QuanMnLCBbJ2dvb2cudWkuTWVudUJ1dHRvblRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUhhbmRsZXInLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlN1Yk1lbnUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YnV0dG9ucmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuTWVudUJ1dHRvbicsICdnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVoZWFkZXIuanMnLCBbJ2dvb2cudWkuTWVudUhlYWRlciddLCBbJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLk1lbnVIZWFkZXJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51aGVhZGVycmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuTWVudUhlYWRlclJlbmRlcmVyJ10sIFsnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVpdGVtLmpzJywgWydnb29nLnVpLk1lbnVJdGVtJ10sIFsnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0cmluZycsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5NZW51SXRlbVJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVpdGVtX3Rlc3QuanMnLCBbJ2dvb2cudWkuTWVudUl0ZW1UZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51aXRlbXJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudWl0ZW1yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5NZW51SXRlbVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5Db250YWluZXJSZW5kZXJlcicsICdnb29nLnVpLlNlcGFyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXNlcGFyYXRvci5qcycsIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yJ10sIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5TZXBhcmF0b3InLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXNlcGFyYXRvcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVTZXBhcmF0b3JSZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51c2VwYXJhdG9ycmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tb2NrYWN0aXZpdHltb25pdG9yLmpzJywgWydnb29nLnVpLk1vY2tBY3Rpdml0eU1vbml0b3InXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5BY3Rpdml0eU1vbml0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vY2thY3Rpdml0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy51aS5Nb2NrQWN0aXZpdHlNb25pdG9yVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQWN0aXZpdHlNb25pdG9yJywgJ2dvb2cudWkuTW9ja0FjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vZGFsYXJpYXZpc2liaWxpdHloZWxwZXIuanMnLCBbJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tb2RhbGFyaWF2aXNpYmlsaXR5aGVscGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vZGFscG9wdXAuanMnLCBbJ2dvb2cudWkuTW9kYWxQb3B1cCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYW5pbWF0aW9uRnJhbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlcicsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbW9kYWxwb3B1cF90ZXN0LmpzJywgWydnb29nLnVpLk1vZGFsUG9wdXBUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kaXNwb3NlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmNzczMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLk1vZGFsUG9wdXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9uYXRpdmVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL25hdGl2ZWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuTmF0aXZlQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL29wdGlvbi5qcycsIFsnZ29vZy51aS5PcHRpb24nXSwgWydnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BhbGV0dGUuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlcicsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5RXZlbnQnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLlBhbGV0dGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlSXRlcmF0b3InLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uZGF0YXNldCcsICdnb29nLml0ZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcGFsZXR0ZXJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5QYWxldHRlJywgJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcGxhaW50ZXh0c3BlbGxjaGVja2VyLmpzJywgWydnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQWJzdHJhY3RTcGVsbENoZWNrZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BsYWludGV4dHNwZWxsY2hlY2tlcl90ZXN0LmpzJywgWydnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlclRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlcicsICdnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwLmpzJywgWydnb29nLnVpLlBvcHVwJ10sIFsnZ29vZy5tYXRoLkJveCcsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBfdGVzdC5qcycsIFsnZ29vZy51aS5Qb3B1cFRlc3QnXSwgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuUG9wdXAnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wb3B1cGJhc2UuanMnLCBbJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuUG9wdXBCYXNlLkV2ZW50VHlwZScsICdnb29nLnVpLlBvcHVwQmFzZS5UeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBiYXNlX3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBCYXNlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmNzczMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwY29sb3JwaWNrZXIuanMnLCBbJ2dvb2cudWkuUG9wdXBDb2xvclBpY2tlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnVpLkNvbG9yUGlja2VyJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuUG9wdXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwY29sb3JwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Qb3B1cENvbG9yUGlja2VyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbG9yUGlja2VyJywgJ2dvb2cudWkuUG9wdXBDb2xvclBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwZGF0ZXBpY2tlci5qcycsIFsnZ29vZy51aS5Qb3B1cERhdGVQaWNrZXInXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFZpZXdwb3J0UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkRhdGVQaWNrZXInLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBkYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBEYXRlUGlja2VyVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5EYXRlUGlja2VyJywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuUG9wdXBEYXRlUGlja2VyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBtZW51LmpzJywgWydnb29nLnVpLlBvcHVwTWVudSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuTW91c2VCdXR0b24nLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLlZpZXdwb3J0Q2xpZW50UG9zaXRpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBtZW51X3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBNZW51VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5Qb3B1cE1lbnUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wcm9ncmVzc2Jhci5qcycsIFsnZ29vZy51aS5Qcm9ncmVzc0JhcicsICdnb29nLnVpLlByb2dyZXNzQmFyLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlJhbmdlTW9kZWwnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Byb21wdC5qcycsIFsnZ29vZy51aS5Qcm9tcHQnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5EaWFsb2cnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Byb21wdF90ZXN0LmpzJywgWydnb29nLnVpLlByb21wdFRlc3QnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkJpZGlJbnB1dCcsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVpLlByb21wdCcsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmFuZ2Vtb2RlbC5qcycsIFsnZ29vZy51aS5SYW5nZU1vZGVsJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JhbmdlbW9kZWxfdGVzdC5qcycsIFsnZ29vZy51aS5SYW5nZU1vZGVsVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5SYW5nZU1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmF0aW5ncy5qcycsIFsnZ29vZy51aS5SYXRpbmdzJywgJ2dvb2cudWkuUmF0aW5ncy5FdmVudFR5cGUnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JlZ2lzdHJ5LmpzJywgWydnb29nLnVpLnJlZ2lzdHJ5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmVnaXN0cnlfdGVzdC5qcycsIFsnZ29vZy51aS5yZWdpc3RyeVRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkucmVnaXN0cnknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9yaWNodGV4dHNwZWxsY2hlY2tlci5qcycsIFsnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlcicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlBvcHVwTWVudSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmljaHRleHRzcGVsbGNoZWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlclRlc3QnXSwgWydnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLm9iamVjdCcsICdnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JvdW5kZWRwYW5lbC5qcycsIFsnZ29vZy51aS5CYXNlUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuQ3NzUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuR3JhcGhpY3NSb3VuZGVkUGFuZWwnLCAnZ29vZy51aS5Sb3VuZGVkUGFuZWwnLCAnZ29vZy51aS5Sb3VuZGVkUGFuZWwuQ29ybmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZ3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9yb3VuZGVkcGFuZWxfdGVzdC5qcycsIFsnZ29vZy51aS5Sb3VuZGVkUGFuZWxUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNzc1JvdW5kZWRQYW5lbCcsICdnb29nLnVpLkdyYXBoaWNzUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuUm91bmRlZFBhbmVsJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcm91bmRlZHRhYnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlJvdW5kZWRUYWJSZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5UYWInLCAnZ29vZy51aS5UYWJCYXInLCAnZ29vZy51aS5UYWJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zY3JvbGxmbG9hdGVyLmpzJywgWydnb29nLnVpLlNjcm9sbEZsb2F0ZXInLCAnZ29vZy51aS5TY3JvbGxGbG9hdGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zY3JvbGxmbG9hdGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2Nyb2xsRmxvYXRlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5TY3JvbGxGbG9hdGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VsZWN0LmpzJywgWydnb29nLnVpLlNlbGVjdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5JZEdlbmVyYXRvcicsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdF90ZXN0LmpzJywgWydnb29nLnVpLlNlbGVjdFRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TZWxlY3QnLCAnZ29vZy51aS5TZXBhcmF0b3InXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zZWxlY3Rpb25tZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1lbnVCdXR0b24nLCAnZ29vZy51aS5TZWxlY3Rpb25NZW51QnV0dG9uLlNlbGVjdGlvblN0YXRlJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VsZWN0aW9ubWVudWJ1dHRvbl90ZXN0LmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1lbnVCdXR0b25UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2VsZWN0aW9uTWVudUJ1dHRvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdGlvbm1vZGVsLmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdGlvbm1vZGVsX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2VsZWN0aW9uTW9kZWxUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VwYXJhdG9yLmpzJywgWydnb29nLnVpLlNlcGFyYXRvciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VydmVyY2hhcnQuanMnLCBbJ2dvb2cudWkuU2VydmVyQ2hhcnQnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5BeGlzRGlzcGxheVR5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5DaGFydFR5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5FbmNvZGluZ1R5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5FdmVudCcsICdnb29nLnVpLlNlcnZlckNoYXJ0LkxlZ2VuZFBvc2l0aW9uJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTWF4aW11bVZhbHVlJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTXVsdGlBeGlzQWxpZ25tZW50JywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTXVsdGlBeGlzVHlwZScsICdnb29nLnVpLlNlcnZlckNoYXJ0LlVyaVBhcmFtJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuVXJpVG9vTG9uZ0V2ZW50J10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQ29tcG9uZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zZXJ2ZXJjaGFydF90ZXN0LmpzJywgWydnb29nLnVpLlNlcnZlckNoYXJ0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NsaWRlci5qcycsIFsnZ29vZy51aS5TbGlkZXInLCAnZ29vZy51aS5TbGlkZXIuT3JpZW50YXRpb24nXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5TbGlkZXJCYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zbGlkZXJiYXNlLmpzJywgWydnb29nLnVpLlNsaWRlckJhc2UnLCAnZ29vZy51aS5TbGlkZXJCYXNlLkFuaW1hdGlvbkZhY3RvcnknLCAnZ29vZy51aS5TbGlkZXJCYXNlLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLk1vdXNlV2hlZWxIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuZnguQW5pbWF0aW9uUGFyYWxsZWxRdWV1ZScsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguZG9tLlJlc2l6ZUhlaWdodCcsICdnb29nLmZ4LmRvbS5SZXNpemVXaWR0aCcsICdnb29nLmZ4LmRvbS5TbGlkZScsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5SYW5nZU1vZGVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zbGlkZXJiYXNlX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2xpZGVyQmFzZVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2xpZGVyQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NwbGl0cGFuZS5qcycsIFsnZ29vZy51aS5TcGxpdFBhbmUnLCAnZ29vZy51aS5TcGxpdFBhbmUuT3JpZW50YXRpb24nXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguUmVjdCcsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zcGxpdHBhbmVfdGVzdC5qcycsIFsnZ29vZy51aS5TcGxpdFBhbmVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU3BsaXRQYW5lJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL2J1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N0eWxlL2FwcC9idXR0b25yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N0eWxlL2FwcC9tZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuc3R5bGUuYXBwLk1lbnVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJywgJ2dvb2cudWkuc3R5bGUuYXBwLkJ1dHRvblJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zdHlsZS9hcHAvbWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuc3R5bGUuYXBwLk1lbnVCdXR0b25SZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5zdHlsZS5hcHAuTWVudUJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL3ByaW1hcnlhY3Rpb25idXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5zdHlsZS5hcHAuUHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5yZWdpc3RyeScsICdnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL3ByaW1hcnlhY3Rpb25idXR0b25yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5QcmltYXJ5QWN0aW9uQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkuc3R5bGUnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5zdHlsZS5hcHAuUHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudS5qcycsIFsnZ29vZy51aS5TdWJNZW51J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TdWJNZW51UmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudV90ZXN0LmpzJywgWydnb29nLnVpLlN1Yk1lbnVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TdWJNZW51JywgJ2dvb2cudWkuU3ViTWVudVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudXJlbmRlcmVyLmpzJywgWydnb29nLnVpLlN1Yk1lbnVSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N5bnRoZXRpY2tleWJvYXJkZXZlbnQuanMnLCBbJ2dvb2cudWkuU3ludGhldGljS2V5Ym9hcmRFdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cudWkuS2V5Ym9hcmRFdmVudERhdGEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYi5qcycsIFsnZ29vZy51aS5UYWInXSwgWydnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5UYWJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90YWJfdGVzdC5qcycsIFsnZ29vZy51aS5UYWJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYlJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFiYmFyLmpzJywgWydnb29nLnVpLlRhYkJhcicsICdnb29nLnVpLlRhYkJhci5Mb2NhdGlvbiddLCBbJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lci5PcmllbnRhdGlvbicsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYkJhclJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmJhcl90ZXN0LmpzJywgWydnb29nLnVpLlRhYkJhclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYkJhcicsICdnb29nLnVpLlRhYkJhclJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFiYmFycmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVGFiQmFyUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmJhcnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVGFiQmFyUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5UYWJCYXInLCAnZ29vZy51aS5UYWJCYXJSZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmxlc29ydGVyLmpzJywgWydnb29nLnVpLlRhYmxlU29ydGVyJywgJ2dvb2cudWkuVGFibGVTb3J0ZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmxlc29ydGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVGFibGVTb3J0ZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5UYWJsZVNvcnRlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYnBhbmUuanMnLCBbJ2dvb2cudWkuVGFiUGFuZScsICdnb29nLnVpLlRhYlBhbmUuRXZlbnRzJywgJ2dvb2cudWkuVGFiUGFuZS5UYWJMb2NhdGlvbicsICdnb29nLnVpLlRhYlBhbmUuVGFiUGFnZScsICdnb29nLnVpLlRhYlBhbmVFdmVudCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYnBhbmVfdGVzdC5qcycsIFsnZ29vZy51aS5UYWJQYW5lVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5UYWJQYW5lJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFicmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVGFiUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90YWJyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLlRhYlJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuVGFiJywgJ2dvb2cudWkuVGFiUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90ZXh0YXJlYS5qcycsIFsnZ29vZy51aS5UZXh0YXJlYScsICdnb29nLnVpLlRleHRhcmVhLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkuVGV4dGFyZWFSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGV4dGFyZWFfdGVzdC5qcycsIFsnZ29vZy51aS5UZXh0YXJlYVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlRleHRhcmVhJywgJ2dvb2cudWkuVGV4dGFyZWFSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGV4dGFyZWFyZW5kZXJlci5qcycsIFsnZ29vZy51aS5UZXh0YXJlYVJlbmRlcmVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9nZ2xlYnV0dG9uLmpzJywgWydnb29nLnVpLlRvZ2dsZUJ1dHRvbiddLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhci5qcycsIFsnZ29vZy51aS5Ub29sYmFyJ10sIFsnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5Ub29sYmFyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJfdGVzdC5qcycsIFsnZ29vZy51aS5Ub29sYmFyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlRvb2xiYXInLCAnZ29vZy51aS5Ub29sYmFyTWVudUJ1dHRvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJidXR0b24uanMnLCBbJ2dvb2cudWkuVG9vbGJhckJ1dHRvbiddLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhckJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Ub29sYmFyQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLkN1c3RvbUJ1dHRvblJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyY29sb3JtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b24nXSwgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyY29sb3JtZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcmNvbG9ybWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvblJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50ZXN0aW5nLnVpLlJlbmRlcmVySGFybmVzcycsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b25SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uJ10sIFsnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFybWVudWJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lclJlbmRlcmVyJywgJ2dvb2cudWkuU2VwYXJhdG9yJywgJ2dvb2cudWkuVG9vbGJhclNlcGFyYXRvclJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyc2VsZWN0LmpzJywgWydnb29nLnVpLlRvb2xiYXJTZWxlY3QnXSwgWydnb29nLnVpLlNlbGVjdCcsICdnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnNlcGFyYXRvci5qcycsIFsnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yJ10sIFsnZ29vZy51aS5TZXBhcmF0b3InLCAnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnNlcGFyYXRvcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3JSZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJzZXBhcmF0b3JyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3JSZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuSU5MSU5FX0JMT0NLX0NMQVNTTkFNRScsICdnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3InLCAnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFydG9nZ2xlYnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJUb2dnbGVCdXR0b24nXSwgWydnb29nLnVpLlRvZ2dsZUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sdGlwLmpzJywgWydnb29nLnVpLlRvb2x0aXAnLCAnZ29vZy51aS5Ub29sdGlwLkN1cnNvclRvb2x0aXBQb3NpdGlvbicsICdnb29nLnVpLlRvb2x0aXAuRWxlbWVudFRvb2x0aXBQb3NpdGlvbicsICdnb29nLnVpLlRvb2x0aXAuU3RhdGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cucG9zaXRpb25pbmcuVmlld3BvcnRQb3NpdGlvbicsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbHRpcF90ZXN0LmpzJywgWydnb29nLnVpLlRvb2x0aXBUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkZvY3VzSGFuZGxlcicsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nLkFic29sdXRlUG9zaXRpb24nLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuVG9vbHRpcCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvYmFzZW5vZGUuanMnLCBbJ2dvb2cudWkudHJlZS5CYXNlTm9kZScsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUuRXZlbnRUeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHJlZS9iYXNlbm9kZV90ZXN0LmpzJywgWydnb29nLnVpLnRyZWUuQmFzZU5vZGVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUnLCAnZ29vZy51aS50cmVlLlRyZWVDb250cm9sJywgJ2dvb2cudWkudHJlZS5UcmVlTm9kZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHJlZWNvbnRyb2wuanMnLCBbJ2dvb2cudWkudHJlZS5UcmVlQ29udHJvbCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkZvY3VzSGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUnLCAnZ29vZy51aS50cmVlLlRyZWVOb2RlJywgJ2dvb2cudWkudHJlZS5UeXBlQWhlYWQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHJlZWNvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy51aS50cmVlLlRyZWVDb250cm9sVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS50cmVlLlRyZWVDb250cm9sJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHJlZS90cmVlbm9kZS5qcycsIFsnZ29vZy51aS50cmVlLlRyZWVOb2RlJ10sIFsnZ29vZy51aS50cmVlLkJhc2VOb2RlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90cmVlL3R5cGVhaGVhZC5qcycsIFsnZ29vZy51aS50cmVlLlR5cGVBaGVhZCcsICdnb29nLnVpLnRyZWUuVHlwZUFoZWFkLk9mZnNldCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJ1Y3RzLlRyaWUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHlwZWFoZWFkX3Rlc3QuanMnLCBbJ2dvb2cudWkudHJlZS5UeXBlQWhlYWRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLnRyZWUuVHJlZUNvbnRyb2wnLCAnZ29vZy51aS50cmVlLlR5cGVBaGVhZCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyaXN0YXRlbWVudWl0ZW0uanMnLCBbJ2dvb2cudWkuVHJpU3RhdGVNZW51SXRlbScsICdnb29nLnVpLlRyaVN0YXRlTWVudUl0ZW0uU3RhdGUnXSwgWydnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlRyaVN0YXRlTWVudUl0ZW1SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90cmlzdGF0ZW1lbnVpdGVtcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVHJpU3RhdGVNZW51SXRlbVJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3R3b3RodW1ic2xpZGVyLmpzJywgWydnb29nLnVpLlR3b1RodW1iU2xpZGVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudWkuU2xpZGVyQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHdvdGh1bWJzbGlkZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Ud29UaHVtYlNsaWRlclRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuU2xpZGVyQmFzZScsICdnb29nLnVpLlR3b1RodW1iU2xpZGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvemlwcHkuanMnLCBbJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51aS5aaXBweS5FdmVudHMnLCAnZ29vZy51aS5aaXBweUV2ZW50J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3ppcHB5X3Rlc3QuanMnLCBbJ2dvb2cudWkuWmlwcHlUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuWmlwcHknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1cmkvdXJpLmpzJywgWydnb29nLlVyaScsICdnb29nLlVyaS5RdWVyeURhdGEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnVyaS51dGlscycsICdnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleCcsICdnb29nLnVyaS51dGlscy5TdGFuZGFyZFF1ZXJ5UGFyYW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VyaS91cmlfdGVzdC5qcycsIFsnZ29vZy5VcmlUZXN0J10sIFsnZ29vZy5VcmknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VyaS91dGlscy5qcycsIFsnZ29vZy51cmkudXRpbHMnLCAnZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXgnLCAnZ29vZy51cmkudXRpbHMuUXVlcnlBcnJheScsICdnb29nLnVyaS51dGlscy5RdWVyeVZhbHVlJywgJ2dvb2cudXJpLnV0aWxzLlN0YW5kYXJkUXVlcnlQYXJhbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1cmkvdXRpbHNfdGVzdC5qcycsIFsnZ29vZy51cmkudXRpbHNUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVyaS51dGlscyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9hZG9iZXJlYWRlci5qcycsIFsnZ29vZy51c2VyQWdlbnQuYWRvYmVSZWFkZXInXSwgWydnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9hZG9iZXJlYWRlcl90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5hZG9iZVJlYWRlclRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LmFkb2JlUmVhZGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L2ZsYXNoLmpzJywgWydnb29nLnVzZXJBZ2VudC5mbGFzaCddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvZmxhc2hfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnQuZmxhc2hUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudC5mbGFzaCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9pcGhvdG8uanMnLCBbJ2dvb2cudXNlckFnZW50LmlwaG90byddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvanNjcmlwdC5qcycsIFsnZ29vZy51c2VyQWdlbnQuanNjcmlwdCddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvanNjcmlwdF90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5qc2NyaXB0VGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQuanNjcmlwdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9rZXlib2FyZC5qcycsIFsnZ29vZy51c2VyQWdlbnQua2V5Ym9hcmQnXSwgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQva2V5Ym9hcmRfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnQua2V5Ym9hcmRUZXN0J10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LmtleWJvYXJkJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcGxhdGZvcm0uanMnLCBbJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJ10sIFsnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9wbGF0Zm9ybV90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5wbGF0Zm9ybVRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdC5qcycsIFsnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdF9pc3ZlcnNpb24uanMnLCBbJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdF90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5wcm9kdWN0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nLCAnZ29vZy51c2VyQWdlbnRUZXN0VXRpbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC91c2VyYWdlbnQuanMnLCBbJ2dvb2cudXNlckFnZW50J10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lJywgJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L3VzZXJhZ2VudF9xdWlya3NfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnRRdWlya3NUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC91c2VyYWdlbnRfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnRUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudFRlc3RVdGlsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L3VzZXJhZ2VudHRlc3R1dGlsLmpzJywgWydnb29nLnVzZXJBZ2VudFRlc3RVdGlsJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwuVXNlckFnZW50cyddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LmtleWJvYXJkJywgJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9mbG9hdDMyYXJyYXkuanMnLCBbJ2dvb2cudmVjLkZsb2F0MzJBcnJheSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvZmxvYXQzMmFycmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLkZsb2F0MzJBcnJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLkZsb2F0MzJBcnJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9mbG9hdDY0YXJyYXkuanMnLCBbJ2dvb2cudmVjLkZsb2F0NjRBcnJheSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvZmxvYXQ2NGFycmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLkZsb2F0NjRBcnJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLkZsb2F0NjRBcnJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQzLmpzJywgWydnb29nLnZlYy5NYXQzJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQzX3Rlc3QuanMnLCBbJ2dvb2cudmVjLk1hdDNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5NYXQzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDNkLmpzJywgWydnb29nLnZlYy5tYXQzZCcsICdnb29nLnZlYy5tYXQzZC5UeXBlJ10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMudmVjM2QuVHlwZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDNkX3Rlc3QuanMnLCBbJ2dvb2cudmVjLm1hdDNkVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMubWF0M2QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0M2YuanMnLCBbJ2dvb2cudmVjLm1hdDNmJywgJ2dvb2cudmVjLm1hdDNmLlR5cGUnXSwgWydnb29nLnZlYycsICdnb29nLnZlYy52ZWMzZi5UeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0M2ZfdGVzdC5qcycsIFsnZ29vZy52ZWMubWF0M2ZUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5tYXQzZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQ0LmpzJywgWydnb29nLnZlYy5NYXQ0J10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMuVmVjMycsICdnb29nLnZlYy5WZWM0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NF90ZXN0LmpzJywgWydnb29nLnZlYy5NYXQ0VGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuTWF0NCcsICdnb29nLnZlYy5WZWMzJywgJ2dvb2cudmVjLlZlYzQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NGQuanMnLCBbJ2dvb2cudmVjLm1hdDRkJywgJ2dvb2cudmVjLm1hdDRkLlR5cGUnXSwgWydnb29nLnZlYycsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLnZlYzNkJywgJ2dvb2cudmVjLnZlYzRkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NGRfdGVzdC5qcycsIFsnZ29vZy52ZWMubWF0NGRUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLm1hdDRkJywgJ2dvb2cudmVjLnZlYzNkJywgJ2dvb2cudmVjLnZlYzRkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDRmLmpzJywgWydnb29nLnZlYy5tYXQ0ZicsICdnb29nLnZlYy5tYXQ0Zi5UeXBlJ10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMuUXVhdGVybmlvbicsICdnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWM0ZiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDRmX3Rlc3QuanMnLCBbJ2dvb2cudmVjLm1hdDRmVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuUXVhdGVybmlvbicsICdnb29nLnZlYy5tYXQ0ZicsICdnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWM0ZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9xdWF0ZXJuaW9uLmpzJywgWydnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLlF1YXRlcm5pb24uQW55VHlwZSddLCBbJ2dvb2cudmVjJywgJ2dvb2cudmVjLlZlYzMnLCAnZ29vZy52ZWMuVmVjNCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3F1YXRlcm5pb25fdGVzdC5qcycsIFsnZ29vZy52ZWMuUXVhdGVybmlvblRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLk1hdDMnLCAnZ29vZy52ZWMuTWF0NCcsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLlZlYzMnLCAnZ29vZy52ZWMudmVjM2YnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvcmF5LmpzJywgWydnb29nLnZlYy5SYXknXSwgWydnb29nLnZlYy5WZWMzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvcmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLlJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLlJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMuanMnLCBbJ2dvb2cudmVjJywgJ2dvb2cudmVjLkFueVR5cGUnLCAnZ29vZy52ZWMuQXJyYXlUeXBlJywgJ2dvb2cudmVjLkZsb2F0MzInLCAnZ29vZy52ZWMuRmxvYXQ2NCcsICdnb29nLnZlYy5OdW1iZXInXSwgWydnb29nLnZlYy5GbG9hdDMyQXJyYXknLCAnZ29vZy52ZWMuRmxvYXQ2NEFycmF5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMi5qcycsIFsnZ29vZy52ZWMuVmVjMiddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMl90ZXN0LmpzJywgWydnb29nLnZlYy5WZWMyVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuVmVjMiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMyZC5qcycsIFsnZ29vZy52ZWMudmVjMmQnLCAnZ29vZy52ZWMudmVjMmQuVHlwZSddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMmRfdGVzdC5qcycsIFsnZ29vZy52ZWMudmVjMmRUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy52ZWMyZCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMyZi5qcycsIFsnZ29vZy52ZWMudmVjMmYnLCAnZ29vZy52ZWMudmVjMmYuVHlwZSddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMmZfdGVzdC5qcycsIFsnZ29vZy52ZWMudmVjMmZUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy52ZWMyZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzLmpzJywgWydnb29nLnZlYy5WZWMzJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzX3Rlc3QuanMnLCBbJ2dvb2cudmVjLlZlYzNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5WZWMzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzNkLmpzJywgWydnb29nLnZlYy52ZWMzZCcsICdnb29nLnZlYy52ZWMzZC5UeXBlJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzZF90ZXN0LmpzJywgWydnb29nLnZlYy52ZWMzZFRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLnZlYzNkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzNmLmpzJywgWydnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWMzZi5UeXBlJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzZl90ZXN0LmpzJywgWydnb29nLnZlYy52ZWMzZlRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLnZlYzNmJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzQuanMnLCBbJ2dvb2cudmVjLlZlYzQnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRfdGVzdC5qcycsIFsnZ29vZy52ZWMuVmVjNFRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLlZlYzQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjNGQuanMnLCBbJ2dvb2cudmVjLnZlYzRkJywgJ2dvb2cudmVjLnZlYzRkLlR5cGUnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRkX3Rlc3QuanMnLCBbJ2dvb2cudmVjLnZlYzRkVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMudmVjNGQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjNGYuanMnLCBbJ2dvb2cudmVjLnZlYzRmJywgJ2dvb2cudmVjLnZlYzRmLlR5cGUnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRmX3Rlc3QuanMnLCBbJ2dvb2cudmVjLnZlYzRmVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMudmVjNGYnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd3ZWJnbC93ZWJnbC5qcycsIFsnZ29vZy53ZWJnbCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3dpbmRvdy93aW5kb3cuanMnLCBbJ2dvb2cud2luZG93J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd3aW5kb3cvd2luZG93X3Rlc3QuanMnLCBbJ2dvb2cud2luZG93VGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cud2luZG93J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi9leHRlcm5hbC9jb21fZ29vZ2xlX2phdmFzY3JpcHRfY2xvc3VyZV9saWJyYXJ5L2Nsb3N1cmUvZ29vZy9iYXNlLmpzCmZ1bmN0aW9uIHdhKGIpe3ZhciBkPTA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGQ8Yi5sZW5ndGg/e2RvbmU6ITEsdmFsdWU6YltkKytdfTp7ZG9uZTohMH19fWZ1bmN0aW9uIGdiKGIpe3JldHVybntuZXh0OndhKGIpfX1mdW5jdGlvbiBsYihiKXt2YXIgZD0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZiW1N5bWJvbC5pdGVyYXRvcl07cmV0dXJuIGQ/ZC5jYWxsKGIpOmdiKGIpfXZhciB3Yj1mdW5jdGlvbihiKXtyZXR1cm4idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09Yj9iOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOmJ9KHRoaXMpLFJiPSJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZGVmaW5lUHJvcGVydGllcz9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oYixkLGYpe2IhPUFycmF5LnByb3RvdHlwZSYmYiE9T2JqZWN0LnByb3RvdHlwZSYmKGJbZF09Zi52YWx1ZSl9OwpmdW5jdGlvbiBVYihiLGQpe2lmKGQpe3ZhciBmPXdiO2I9Yi5zcGxpdCgiLiIpO2Zvcih2YXIgaD0wO2g8Yi5sZW5ndGgtMTtoKyspe3ZhciBrPWJbaF07ayBpbiBmfHwoZltrXT17fSk7Zj1mW2tdfWI9YltiLmxlbmd0aC0xXTtoPWZbYl07ZD1kKGgpO2QhPWgmJm51bGwhPWQmJlJiKGYsYix7Y29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOmR9KX19ClViKCJQcm9taXNlIixmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHApe3RoaXMuc3RhdGVfPTA7dGhpcy5yZXN1bHRfPXZvaWQgMDt0aGlzLm9uU2V0dGxlZENhbGxiYWNrc189W107dmFyIG09dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpO3RyeXtwKG0ucmVzb2x2ZSxtLnJlamVjdCl9Y2F0Y2gobil7bS5yZWplY3Qobil9fWZ1bmN0aW9uIGYoKXt0aGlzLmJhdGNoXz1udWxsfWZ1bmN0aW9uIGgocCl7c3dpdGNoKHR5cGVvZiBwKXtjYXNlICJvYmplY3QiOnJldHVybiBudWxsIT1wO2Nhc2UgImZ1bmN0aW9uIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX1mdW5jdGlvbiBrKHApe3JldHVybiBwIGluc3RhbmNlb2YgZD9wOm5ldyBkKGZ1bmN0aW9uKG0pe20ocCl9KX1pZihiKXJldHVybiBiO2YucHJvdG90eXBlLmFzeW5jRXhlY3V0ZT1mdW5jdGlvbihwKXtpZihudWxsPT10aGlzLmJhdGNoXyl7dGhpcy5iYXRjaF89W107dmFyIG09dGhpczt0aGlzLmFzeW5jRXhlY3V0ZUZ1bmN0aW9uKGZ1bmN0aW9uKCl7bS5leGVjdXRlQmF0Y2hfKCl9KX10aGlzLmJhdGNoXy5wdXNoKHApfTsKdmFyIHQ9d2Iuc2V0VGltZW91dDtmLnByb3RvdHlwZS5hc3luY0V4ZWN1dGVGdW5jdGlvbj1mdW5jdGlvbihwKXt0KHAsMCl9O2YucHJvdG90eXBlLmV4ZWN1dGVCYXRjaF89ZnVuY3Rpb24oKXtmb3IoO3RoaXMuYmF0Y2hfJiZ0aGlzLmJhdGNoXy5sZW5ndGg7KXt2YXIgcD10aGlzLmJhdGNoXzt0aGlzLmJhdGNoXz1bXTtmb3IodmFyIG09MDttPHAubGVuZ3RoOysrbSl7dmFyIG49cFttXTtwW21dPW51bGw7dHJ5e24oKX1jYXRjaChxKXt0aGlzLmFzeW5jVGhyb3dfKHEpfX19dGhpcy5iYXRjaF89bnVsbH07Zi5wcm90b3R5cGUuYXN5bmNUaHJvd189ZnVuY3Rpb24ocCl7dGhpcy5hc3luY0V4ZWN1dGVGdW5jdGlvbihmdW5jdGlvbigpe3Rocm93IHA7fSl9O2QucHJvdG90eXBlLmNyZWF0ZVJlc29sdmVBbmRSZWplY3RfPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcChxKXtyZXR1cm4gZnVuY3Rpb24odSl7bnx8KG49ITAscS5jYWxsKG0sdSkpfX12YXIgbT10aGlzLG49ITE7cmV0dXJue3Jlc29sdmU6cCh0aGlzLnJlc29sdmVUb18pLApyZWplY3Q6cCh0aGlzLnJlamVjdF8pfX07ZC5wcm90b3R5cGUucmVzb2x2ZVRvXz1mdW5jdGlvbihwKXtwPT09dGhpcz90aGlzLnJlamVjdF8obmV3IFR5cGVFcnJvcigiQSBQcm9taXNlIGNhbm5vdCByZXNvbHZlIHRvIGl0c2VsZiIpKTpwIGluc3RhbmNlb2YgZD90aGlzLnNldHRsZVNhbWVBc1Byb21pc2VfKHApOmgocCk/dGhpcy5yZXNvbHZlVG9Ob25Qcm9taXNlT2JqXyhwKTp0aGlzLmZ1bGZpbGxfKHApfTtkLnByb3RvdHlwZS5yZXNvbHZlVG9Ob25Qcm9taXNlT2JqXz1mdW5jdGlvbihwKXt2YXIgbT12b2lkIDA7dHJ5e209cC50aGVufWNhdGNoKG4pe3RoaXMucmVqZWN0XyhuKTtyZXR1cm59ImZ1bmN0aW9uIj09dHlwZW9mIG0/dGhpcy5zZXR0bGVTYW1lQXNUaGVuYWJsZV8obSxwKTp0aGlzLmZ1bGZpbGxfKHApfTtkLnByb3RvdHlwZS5yZWplY3RfPWZ1bmN0aW9uKHApe3RoaXMuc2V0dGxlXygyLHApfTtkLnByb3RvdHlwZS5mdWxmaWxsXz1mdW5jdGlvbihwKXt0aGlzLnNldHRsZV8oMSwKcCl9O2QucHJvdG90eXBlLnNldHRsZV89ZnVuY3Rpb24ocCxtKXtpZigwIT10aGlzLnN0YXRlXyl0aHJvdyBFcnJvcigiQ2Fubm90IHNldHRsZSgiK3ArIiwgIittKyIpOiBQcm9taXNlIGFscmVhZHkgc2V0dGxlZCBpbiBzdGF0ZSIrdGhpcy5zdGF0ZV8pO3RoaXMuc3RhdGVfPXA7dGhpcy5yZXN1bHRfPW07dGhpcy5leGVjdXRlT25TZXR0bGVkQ2FsbGJhY2tzXygpfTtkLnByb3RvdHlwZS5leGVjdXRlT25TZXR0bGVkQ2FsbGJhY2tzXz1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXyl7Zm9yKHZhciBwPTA7cDx0aGlzLm9uU2V0dGxlZENhbGxiYWNrc18ubGVuZ3RoOysrcClsLmFzeW5jRXhlY3V0ZSh0aGlzLm9uU2V0dGxlZENhbGxiYWNrc19bcF0pO3RoaXMub25TZXR0bGVkQ2FsbGJhY2tzXz1udWxsfX07dmFyIGw9bmV3IGY7ZC5wcm90b3R5cGUuc2V0dGxlU2FtZUFzUHJvbWlzZV89ZnVuY3Rpb24ocCl7dmFyIG09dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpOwpwLmNhbGxXaGVuU2V0dGxlZF8obS5yZXNvbHZlLG0ucmVqZWN0KX07ZC5wcm90b3R5cGUuc2V0dGxlU2FtZUFzVGhlbmFibGVfPWZ1bmN0aW9uKHAsbSl7dmFyIG49dGhpcy5jcmVhdGVSZXNvbHZlQW5kUmVqZWN0XygpO3RyeXtwLmNhbGwobSxuLnJlc29sdmUsbi5yZWplY3QpfWNhdGNoKHEpe24ucmVqZWN0KHEpfX07ZC5wcm90b3R5cGUudGhlbj1mdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oQSx5KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgQT9mdW5jdGlvbih3KXt0cnl7cShBKHcpKX1jYXRjaChDKXt1KEMpfX06eX12YXIgcSx1LHg9bmV3IGQoZnVuY3Rpb24oQSx5KXtxPUE7dT15fSk7dGhpcy5jYWxsV2hlblNldHRsZWRfKG4ocCxxKSxuKG0sdSkpO3JldHVybiB4fTtkLnByb3RvdHlwZS5jYXRjaD1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy50aGVuKHZvaWQgMCxwKX07ZC5wcm90b3R5cGUuY2FsbFdoZW5TZXR0bGVkXz1mdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXtzd2l0Y2gocS5zdGF0ZV8pe2Nhc2UgMTpwKHEucmVzdWx0Xyk7CmJyZWFrO2Nhc2UgMjptKHEucmVzdWx0Xyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5leHBlY3RlZCBzdGF0ZTogIitxLnN0YXRlXyk7fX12YXIgcT10aGlzO251bGw9PXRoaXMub25TZXR0bGVkQ2FsbGJhY2tzXz9sLmFzeW5jRXhlY3V0ZShuKTp0aGlzLm9uU2V0dGxlZENhbGxiYWNrc18ucHVzaChuKX07ZC5yZXNvbHZlPWs7ZC5yZWplY3Q9ZnVuY3Rpb24ocCl7cmV0dXJuIG5ldyBkKGZ1bmN0aW9uKG0sbil7bihwKX0pfTtkLnJhY2U9ZnVuY3Rpb24ocCl7cmV0dXJuIG5ldyBkKGZ1bmN0aW9uKG0sbil7Zm9yKHZhciBxPWxiKHApLHU9cS5uZXh0KCk7IXUuZG9uZTt1PXEubmV4dCgpKWsodS52YWx1ZSkuY2FsbFdoZW5TZXR0bGVkXyhtLG4pfSl9O2QuYWxsPWZ1bmN0aW9uKHApe3ZhciBtPWxiKHApLG49bS5uZXh0KCk7cmV0dXJuIG4uZG9uZT9rKFtdKTpuZXcgZChmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHgodyl7cmV0dXJuIGZ1bmN0aW9uKEMpe0Fbd109Qzt5LS07MD09CnkmJnEoQSl9fXZhciBBPVtdLHk9MDtkbyBBLnB1c2godm9pZCAwKSx5KyssayhuLnZhbHVlKS5jYWxsV2hlblNldHRsZWRfKHgoQS5sZW5ndGgtMSksdSksbj1tLm5leHQoKTt3aGlsZSghbi5kb25lKX0pfTtyZXR1cm4gZH0pO2Z1bmN0aW9uIGFjKGIpe2Z1bmN0aW9uIGQoaCl7cmV0dXJuIGIubmV4dChoKX1mdW5jdGlvbiBmKGgpe3JldHVybiBiLnRocm93KGgpfXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihoLGspe2Z1bmN0aW9uIHQobCl7bC5kb25lP2gobC52YWx1ZSk6UHJvbWlzZS5yZXNvbHZlKGwudmFsdWUpLnRoZW4oZCxmKS50aGVuKHQsayl9dChiLm5leHQoKSl9KX1mdW5jdGlvbiBoYyhiKXtyZXR1cm4gYWMoYigpKX07Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6L2V4dGVybmFsL2NvbV9nb29nbGVfamF2YXNjcmlwdF9jbG9zdXJlX2xpYnJhcnkvY2xvc3VyZS9nb29nL2RlcHMuanMKLy8jIHNvdXJjZVVSTD1idWlsZDovL2FuYWx5dGljcy5odG1sLmpzCndpbmRvdy5nYT1mdW5jdGlvbigpe307CgovLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci8vCi8vIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiFmdW5jdGlvbihhLGIpe3ZhciBjPXt9LGQ9e30sZT17fSxmPW51bGw7IWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtpZigibnVtYmVyIj09dHlwZW9mIGEpcmV0dXJuIGE7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYltjXT1hW2NdO3JldHVybiBifWZ1bmN0aW9uIGQoKXt0aGlzLl9kZWxheT0wLHRoaXMuX2VuZERlbGF5PTAsdGhpcy5fZmlsbD0ibm9uZSIsdGhpcy5faXRlcmF0aW9uU3RhcnQ9MCx0aGlzLl9pdGVyYXRpb25zPTEsdGhpcy5fZHVyYXRpb249MCx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9kaXJlY3Rpb249Im5vcm1hbCIsdGhpcy5fZWFzaW5nPSJsaW5lYXIiLHRoaXMuX2Vhc2luZ0Z1bmN0aW9uPXd9ZnVuY3Rpb24gZSgpe3JldHVybiBhLmlzRGVwcmVjYXRlZCgiSW52YWxpZCB0aW1pbmcgaW5wdXRzIiwiMjAxNi0wMy0wMiIsIlR5cGVFcnJvciBleGNlcHRpb25zIHdpbGwgYmUgdGhyb3duIGluc3RlYWQuIiwhMCl9ZnVuY3Rpb24gZihiLGMsZSl7dmFyIGY9bmV3IGQ7cmV0dXJuIGMmJihmLmZpbGw9ImJvdGgiLGYuZHVyYXRpb249ImF1dG8iKSwibnVtYmVyIiE9dHlwZW9mIGJ8fGlzTmFOKGIpP3ZvaWQgMCE9PWImJk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGIpLmZvckVhY2goZnVuY3Rpb24oYyl7aWYoImF1dG8iIT1iW2NdKXtpZigoIm51bWJlciI9PXR5cGVvZiBmW2NdfHwiZHVyYXRpb24iPT1jKSYmKCJudW1iZXIiIT10eXBlb2YgYltjXXx8aXNOYU4oYltjXSkpKXJldHVybjtpZigiZmlsbCI9PWMmJi0xPT11LmluZGV4T2YoYltjXSkpcmV0dXJuO2lmKCJkaXJlY3Rpb24iPT1jJiYtMT09di5pbmRleE9mKGJbY10pKXJldHVybjtpZigicGxheWJhY2tSYXRlIj09YyYmMSE9PWJbY10mJmEuaXNEZXByZWNhdGVkKCJBbmltYXRpb25FZmZlY3RUaW1pbmcucGxheWJhY2tSYXRlIiwiMjAxNC0xMS0yOCIsIlVzZSBBbmltYXRpb24ucGxheWJhY2tSYXRlIGluc3RlYWQuIikpcmV0dXJuO2ZbY109YltjXX19KTpmLmR1cmF0aW9uPWIsZn1mdW5jdGlvbiBnKGEpe3JldHVybiJudW1iZXIiPT10eXBlb2YgYSYmKGE9aXNOYU4oYSk/e2R1cmF0aW9uOjB9OntkdXJhdGlvbjphfSksYX1mdW5jdGlvbiBoKGIsYyl7cmV0dXJuIGI9YS5udW1lcmljVGltaW5nVG9PYmplY3QoYiksZihiLGMpfWZ1bmN0aW9uIGkoYSxiLGMsZCl7cmV0dXJuIDA+YXx8YT4xfHwwPmN8fGM+MT93OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGYoYSxiLGMpe3JldHVybiAzKmEqKDEtYykqKDEtYykqYyszKmIqKDEtYykqYypjK2MqYypjfWlmKDA9PWV8fDE9PWUpcmV0dXJuIGU7Zm9yKHZhciBnPTAsaD0xOzspe3ZhciBpPShnK2gpLzIsaj1mKGEsYyxpKTtpZihNYXRoLmFicyhlLWopPDFlLTQpcmV0dXJuIGYoYixkLGkpO2U+aj9nPWk6aD1pfX19ZnVuY3Rpb24gaihhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjPj0xKXJldHVybiAxO3ZhciBkPTEvYTtyZXR1cm4gYys9YipkLGMtYyVkfX1mdW5jdGlvbiBrKGEpe0J8fChCPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlKSxCLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uPSIiLEIuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb249YTt2YXIgYj1CLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uO2lmKCIiPT1iJiZlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcihhKyIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIGVhc2luZyIpO3ZhciBjPUQuZXhlYyhiKTtpZihjKXJldHVybiBpLmFwcGx5KHRoaXMsYy5zbGljZSgxKS5tYXAoTnVtYmVyKSk7dmFyIGQ9RS5leGVjKGIpO2lmKGQpcmV0dXJuIGooTnVtYmVyKGRbMV0pLHtzdGFydDp4LG1pZGRsZTp5LGVuZDp6fVtkWzJdXSk7dmFyIGY9QVtiXTtyZXR1cm4gZj9mOnd9ZnVuY3Rpb24gbChhKXtyZXR1cm4gTWF0aC5hYnMobShhKS9hLnBsYXliYWNrUmF0ZSl9ZnVuY3Rpb24gbShhKXtyZXR1cm4gYS5kdXJhdGlvbiphLml0ZXJhdGlvbnN9ZnVuY3Rpb24gbihhLGIsYyl7cmV0dXJuIG51bGw9PWI/RjpiPGMuZGVsYXk/RzpiPj1jLmRlbGF5K2E/SDpJfWZ1bmN0aW9uIG8oYSxiLGMsZCxlKXtzd2l0Y2goZCl7Y2FzZSBHOnJldHVybiJiYWNrd2FyZHMiPT1ifHwiYm90aCI9PWI/MDpudWxsO2Nhc2UgSTpyZXR1cm4gYy1lO2Nhc2UgSDpyZXR1cm4iZm9yd2FyZHMiPT1ifHwiYm90aCI9PWI/YTpudWxsO2Nhc2UgRjpyZXR1cm4gbnVsbH19ZnVuY3Rpb24gcChhLGIsYyxkKXtyZXR1cm4oZC5wbGF5YmFja1JhdGU8MD9iLWE6YikqZC5wbGF5YmFja1JhdGUrY31mdW5jdGlvbiBxKGEsYixjLGQsZSl7cmV0dXJuIGM9PT0xLzB8fGM9PT0tKDEvMCl8fGMtZD09YiYmZS5pdGVyYXRpb25zJiYoZS5pdGVyYXRpb25zK2UuaXRlcmF0aW9uU3RhcnQpJTE9PTA/YTpjJWF9ZnVuY3Rpb24gcihhLGIsYyxkKXtyZXR1cm4gMD09PWM/MDpiPT1hP2QuaXRlcmF0aW9uU3RhcnQrZC5pdGVyYXRpb25zLTE6TWF0aC5mbG9vcihjL2EpfWZ1bmN0aW9uIHMoYSxiLGMsZCl7dmFyIGU9YSUyPj0xLGY9Im5vcm1hbCI9PWQuZGlyZWN0aW9ufHxkLmRpcmVjdGlvbj09KGU/ImFsdGVybmF0ZS1yZXZlcnNlIjoiYWx0ZXJuYXRlIiksZz1mP2M6Yi1jLGg9Zy9iO3JldHVybiBiKmQuX2Vhc2luZ0Z1bmN0aW9uKGgpfWZ1bmN0aW9uIHQoYSxiLGMpe3ZhciBkPW4oYSxiLGMpLGU9byhhLGMuZmlsbCxiLGQsYy5kZWxheSk7aWYobnVsbD09PWUpcmV0dXJuIG51bGw7aWYoMD09PWEpcmV0dXJuIGQ9PT1HPzA6MTt2YXIgZj1jLml0ZXJhdGlvblN0YXJ0KmMuZHVyYXRpb24sZz1wKGEsZSxmLGMpLGg9cShjLmR1cmF0aW9uLG0oYyksZyxmLGMpLGk9cihjLmR1cmF0aW9uLGgsZyxjKTtyZXR1cm4gcyhpLGMuZHVyYXRpb24saCxjKS9jLmR1cmF0aW9ufXZhciB1PSJiYWNrd2FyZHN8Zm9yd2FyZHN8Ym90aHxub25lIi5zcGxpdCgifCIpLHY9InJldmVyc2V8YWx0ZXJuYXRlfGFsdGVybmF0ZS1yZXZlcnNlIi5zcGxpdCgifCIpLHc9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2QucHJvdG90eXBlPXtfc2V0TWVtYmVyOmZ1bmN0aW9uKGIsYyl7dGhpc1siXyIrYl09Yyx0aGlzLl9lZmZlY3QmJih0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0W2JdPWMsdGhpcy5fZWZmZWN0Ll90aW1pbmc9YS5ub3JtYWxpemVUaW1pbmdJbnB1dCh0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0KSx0aGlzLl9lZmZlY3QuYWN0aXZlRHVyYXRpb249YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbih0aGlzLl9lZmZlY3QuX3RpbWluZyksdGhpcy5fZWZmZWN0Ll9hbmltYXRpb24mJnRoaXMuX2VmZmVjdC5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBkZWxheShhKXt0aGlzLl9zZXRNZW1iZXIoImRlbGF5IixhKX0sZ2V0IGRlbGF5KCl7cmV0dXJuIHRoaXMuX2RlbGF5fSxzZXQgZW5kRGVsYXkoYSl7dGhpcy5fc2V0TWVtYmVyKCJlbmREZWxheSIsYSl9LGdldCBlbmREZWxheSgpe3JldHVybiB0aGlzLl9lbmREZWxheX0sc2V0IGZpbGwoYSl7dGhpcy5fc2V0TWVtYmVyKCJmaWxsIixhKX0sZ2V0IGZpbGwoKXtyZXR1cm4gdGhpcy5fZmlsbH0sc2V0IGl0ZXJhdGlvblN0YXJ0KGEpe2lmKChpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvblN0YXJ0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLCByZWNlaXZlZDogIit0aW1pbmcuaXRlcmF0aW9uU3RhcnQpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9uU3RhcnQiLGEpfSxnZXQgaXRlcmF0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy5faXRlcmF0aW9uU3RhcnR9LHNldCBkdXJhdGlvbihhKXtpZigiYXV0byIhPWEmJihpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoImR1cmF0aW9uIG11c3QgYmUgbm9uLW5lZ2F0aXZlIG9yIGF1dG8sIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiZHVyYXRpb24iLGEpfSxnZXQgZHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fZHVyYXRpb259LHNldCBkaXJlY3Rpb24oYSl7dGhpcy5fc2V0TWVtYmVyKCJkaXJlY3Rpb24iLGEpfSxnZXQgZGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpcmVjdGlvbn0sc2V0IGVhc2luZyhhKXt0aGlzLl9lYXNpbmdGdW5jdGlvbj1rKGEpLHRoaXMuX3NldE1lbWJlcigiZWFzaW5nIixhKX0sZ2V0IGVhc2luZygpe3JldHVybiB0aGlzLl9lYXNpbmd9LHNldCBpdGVyYXRpb25zKGEpe2lmKChpc05hTihhKXx8MD5hKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvbnMgbXVzdCBiZSBub24tbmVnYXRpdmUsIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9ucyIsYSl9LGdldCBpdGVyYXRpb25zKCl7cmV0dXJuIHRoaXMuX2l0ZXJhdGlvbnN9fTt2YXIgeD0xLHk9LjUsej0wLEE9e2Vhc2U6aSguMjUsLjEsLjI1LDEpLCJlYXNlLWluIjppKC40MiwwLDEsMSksImVhc2Utb3V0IjppKDAsMCwuNTgsMSksImVhc2UtaW4tb3V0IjppKC40MiwwLC41OCwxKSwic3RlcC1zdGFydCI6aigxLHgpLCJzdGVwLW1pZGRsZSI6aigxLHkpLCJzdGVwLWVuZCI6aigxLHopfSxCPW51bGwsQz0iXFxzKigtP1xcZCtcXC4/XFxkKnwtP1xcLlxcZCspXFxzKiIsRD1uZXcgUmVnRXhwKCJjdWJpYy1iZXppZXJcXCgiK0MrIiwiK0MrIiwiK0MrIiwiK0MrIlxcKSIpLEU9L3N0ZXBzXChccyooXGQrKVxzKixccyooc3RhcnR8bWlkZGxlfGVuZClccypcKS8sRj0wLEc9MSxIPTIsST0zO2EuY2xvbmVUaW1pbmdJbnB1dD1jLGEubWFrZVRpbWluZz1mLGEubnVtZXJpY1RpbWluZ1RvT2JqZWN0PWcsYS5ub3JtYWxpemVUaW1pbmdJbnB1dD1oLGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb249bCxhLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbj10LGEuY2FsY3VsYXRlUGhhc2U9bixhLnRvVGltaW5nRnVuY3Rpb249a30oYyxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYSBpbiBqP2pbYV1bYl18fGI6Yn1mdW5jdGlvbiBkKGEsYixkKXt2YXIgZT1nW2FdO2lmKGUpe2guc3R5bGVbYV09Yjtmb3IodmFyIGYgaW4gZSl7dmFyIGk9ZVtmXSxqPWguc3R5bGVbaV07ZFtpXT1jKGksail9fWVsc2UgZFthXT1jKGEsYil9ZnVuY3Rpb24gZShhKXt2YXIgYj1bXTtmb3IodmFyIGMgaW4gYSlpZighKGMgaW5bImVhc2luZyIsIm9mZnNldCIsImNvbXBvc2l0ZSJdKSl7dmFyIGQ9YVtjXTtBcnJheS5pc0FycmF5KGQpfHwoZD1bZF0pO2Zvcih2YXIgZSxmPWQubGVuZ3RoLGc9MDtmPmc7ZysrKWU9e30sIm9mZnNldCJpbiBhP2Uub2Zmc2V0PWEub2Zmc2V0OjE9PWY/ZS5vZmZzZXQ9MTplLm9mZnNldD1nLyhmLTEpLCJlYXNpbmciaW4gYSYmKGUuZWFzaW5nPWEuZWFzaW5nKSwiY29tcG9zaXRlImluIGEmJihlLmNvbXBvc2l0ZT1hLmNvbXBvc2l0ZSksZVtjXT1kW2ddLGIucHVzaChlKX1yZXR1cm4gYi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEub2Zmc2V0LWIub2Zmc2V0fSksYn1mdW5jdGlvbiBmKGEpe2Z1bmN0aW9uIGIoKXt2YXIgYT1jLmxlbmd0aDtudWxsPT1jW2EtMV0ub2Zmc2V0JiYoY1thLTFdLm9mZnNldD0xKSxhPjEmJm51bGw9PWNbMF0ub2Zmc2V0JiYoY1swXS5vZmZzZXQ9MCk7Zm9yKHZhciBiPTAsZD1jWzBdLm9mZnNldCxlPTE7YT5lO2UrKyl7dmFyIGY9Y1tlXS5vZmZzZXQ7aWYobnVsbCE9Zil7Zm9yKHZhciBnPTE7ZS1iPmc7ZysrKWNbYitnXS5vZmZzZXQ9ZCsoZi1kKSpnLyhlLWIpO2I9ZSxkPWZ9fX1pZihudWxsPT1hKXJldHVybltdO3dpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmFbU3ltYm9sLml0ZXJhdG9yXSYmKGE9QXJyYXkuZnJvbShhKSksQXJyYXkuaXNBcnJheShhKXx8KGE9ZShhKSk7Zm9yKHZhciBjPWEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKXt2YXIgZT1hW2NdO2lmKCJvZmZzZXQiPT1jKXtpZihudWxsIT1lJiYoZT1OdW1iZXIoZSksIWlzRmluaXRlKGUpKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJrZXlmcmFtZSBvZmZzZXRzIG11c3QgYmUgbnVtYmVycy4iKX1lbHNle2lmKCJjb21wb3NpdGUiPT1jKXRocm93e3R5cGU6RE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLG5hbWU6Ik5vdFN1cHBvcnRlZEVycm9yIixtZXNzYWdlOiJhZGQgY29tcG9zaXRpbmcgaXMgbm90IHN1cHBvcnRlZCJ9O2U9IiIrZX1kKGMsZSxiKX1yZXR1cm4gdm9pZCAwPT1iLm9mZnNldCYmKGIub2Zmc2V0PW51bGwpLGJ9KSxmPSEwLGc9LSgxLzApLGg9MDtoPGMubGVuZ3RoO2grKyl7dmFyIGk9Y1toXS5vZmZzZXQ7aWYobnVsbCE9aSl7aWYoZz5pKXRocm93e2NvZGU6RE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUixuYW1lOiJJbnZhbGlkTW9kaWZpY2F0aW9uRXJyb3IiLG1lc3NhZ2U6IktleWZyYW1lcyBhcmUgbm90IGxvb3NlbHkgc29ydGVkIGJ5IG9mZnNldC4gU29ydCBvciBzcGVjaWZ5IG9mZnNldHMuIn07Zz1pfWVsc2UgZj0hMX1yZXR1cm4gYz1jLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXQ+PTAmJmEub2Zmc2V0PD0xfSksZnx8YigpLGN9dmFyIGc9e2JhY2tncm91bmQ6WyJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kUG9zaXRpb24iLCJiYWNrZ3JvdW5kU2l6ZSIsImJhY2tncm91bmRSZXBlYXQiLCJiYWNrZ3JvdW5kQXR0YWNobWVudCIsImJhY2tncm91bmRPcmlnaW4iLCJiYWNrZ3JvdW5kQ2xpcCIsImJhY2tncm91bmRDb2xvciJdLGJvcmRlcjpbImJvcmRlclRvcENvbG9yIiwiYm9yZGVyVG9wU3R5bGUiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlclJpZ2h0Q29sb3IiLCJib3JkZXJSaWdodFN0eWxlIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbUNvbG9yIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckxlZnRDb2xvciIsImJvcmRlckxlZnRTdHlsZSIsImJvcmRlckxlZnRXaWR0aCJdLGJvcmRlckJvdHRvbTpbImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21Db2xvciJdLGJvcmRlckNvbG9yOlsiYm9yZGVyVG9wQ29sb3IiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJMZWZ0Q29sb3IiXSxib3JkZXJMZWZ0OlsiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyTGVmdENvbG9yIl0sYm9yZGVyUmFkaXVzOlsiYm9yZGVyVG9wTGVmdFJhZGl1cyIsImJvcmRlclRvcFJpZ2h0UmFkaXVzIiwiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLCJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIl0sYm9yZGVyUmlnaHQ6WyJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlclJpZ2h0Q29sb3IiXSxib3JkZXJUb3A6WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyVG9wQ29sb3IiXSxib3JkZXJXaWR0aDpbImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyTGVmdFdpZHRoIl0sZmxleDpbImZsZXhHcm93IiwiZmxleFNocmluayIsImZsZXhCYXNpcyJdLGZvbnQ6WyJmb250RmFtaWx5IiwiZm9udFNpemUiLCJmb250U3R5bGUiLCJmb250VmFyaWFudCIsImZvbnRXZWlnaHQiLCJsaW5lSGVpZ2h0Il0sbWFyZ2luOlsibWFyZ2luVG9wIiwibWFyZ2luUmlnaHQiLCJtYXJnaW5Cb3R0b20iLCJtYXJnaW5MZWZ0Il0sb3V0bGluZTpbIm91dGxpbmVDb2xvciIsIm91dGxpbmVTdHlsZSIsIm91dGxpbmVXaWR0aCJdLHBhZGRpbmc6WyJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0Il19LGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2IiksaT17dGhpbjoiMXB4IixtZWRpdW06IjNweCIsdGhpY2s6IjVweCJ9LGo9e2JvcmRlckJvdHRvbVdpZHRoOmksYm9yZGVyTGVmdFdpZHRoOmksYm9yZGVyUmlnaHRXaWR0aDppLGJvcmRlclRvcFdpZHRoOmksZm9udFNpemU6eyJ4eC1zbWFsbCI6IjYwJSIsIngtc21hbGwiOiI3NSUiLHNtYWxsOiI4OSUiLG1lZGl1bToiMTAwJSIsbGFyZ2U6IjEyMCUiLCJ4LWxhcmdlIjoiMTUwJSIsInh4LWxhcmdlIjoiMjAwJSJ9LGZvbnRXZWlnaHQ6e25vcm1hbDoiNDAwIixib2xkOiI3MDAifSxvdXRsaW5lV2lkdGg6aSx0ZXh0U2hhZG93Ontub25lOiIwcHggMHB4IDBweCB0cmFuc3BhcmVudCJ9LGJveFNoYWRvdzp7bm9uZToiMHB4IDBweCAwcHggMHB4IHRyYW5zcGFyZW50In19O2EuY29udmVydFRvQXJyYXlGb3JtPWUsYS5ub3JtYWxpemVLZXlmcmFtZXM9Zn0oYyxmKSxmdW5jdGlvbihhKXt2YXIgYj17fTthLmlzRGVwcmVjYXRlZD1mdW5jdGlvbihhLGMsZCxlKXt2YXIgZj1lPyJhcmUiOiJpcyIsZz1uZXcgRGF0ZSxoPW5ldyBEYXRlKGMpO3JldHVybiBoLnNldE1vbnRoKGguZ2V0TW9udGgoKSszKSxoPmc/KGEgaW4gYnx8Y29uc29sZS53YXJuKCJXZWIgQW5pbWF0aW9uczogIithKyIgIitmKyIgZGVwcmVjYXRlZCBhbmQgd2lsbCBzdG9wIHdvcmtpbmcgb24gIitoLnRvRGF0ZVN0cmluZygpKyIuICIrZCksYlthXT0hMCwhMSk6ITB9LGEuZGVwcmVjYXRlZD1mdW5jdGlvbihiLGMsZCxlKXt2YXIgZj1lPyJhcmUiOiJpcyI7aWYoYS5pc0RlcHJlY2F0ZWQoYixjLGQsZSkpdGhyb3cgbmV3IEVycm9yKGIrIiAiK2YrIiBubyBsb25nZXIgc3VwcG9ydGVkLiAiK2QpfX0oYyksZnVuY3Rpb24oKXtpZihkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYW5pbWF0ZSl7dmFyIGE9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFuaW1hdGUoW10sMCksYj0hMDtpZihhJiYoYj0hMSwicGxheXxjdXJyZW50VGltZXxwYXVzZXxyZXZlcnNlfHBsYXliYWNrUmF0ZXxjYW5jZWx8ZmluaXNofHN0YXJ0VGltZXxwbGF5U3RhdGUiLnNwbGl0KCJ8IikuZm9yRWFjaChmdW5jdGlvbihjKXt2b2lkIDA9PT1hW2NdJiYoYj0hMCl9KSksIWIpcmV0dXJufSFmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWZvcih2YXIgZCBpbiBhW2NdKWlmKCJvZmZzZXQiIT1kJiYiZWFzaW5nIiE9ZCYmImNvbXBvc2l0ZSIhPWQpe3ZhciBlPXtvZmZzZXQ6YVtjXS5vZmZzZXQsZWFzaW5nOmFbY10uZWFzaW5nLHZhbHVlOmFbY11bZF19O2JbZF09YltkXXx8W10sYltkXS5wdXNoKGUpfWZvcih2YXIgZiBpbiBiKXt2YXIgZz1iW2ZdO2lmKDAhPWdbMF0ub2Zmc2V0fHwxIT1nW2cubGVuZ3RoLTFdLm9mZnNldCl0aHJvd3t0eXBlOkRPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUixuYW1lOiJOb3RTdXBwb3J0ZWRFcnJvciIsbWVzc2FnZToiUGFydGlhbCBrZXlmcmFtZXMgYXJlIG5vdCBzdXBwb3J0ZWQifX1yZXR1cm4gYn1mdW5jdGlvbiBlKGMpe3ZhciBkPVtdO2Zvcih2YXIgZSBpbiBjKWZvcih2YXIgZj1jW2VdLGc9MDtnPGYubGVuZ3RoLTE7ZysrKXt2YXIgaD1mW2ddLm9mZnNldCxpPWZbZysxXS5vZmZzZXQsaj1mW2ddLnZhbHVlLGs9ZltnKzFdLnZhbHVlLGw9ZltnXS5lYXNpbmc7aD09aSYmKDE9PWk/aj1rOms9aiksZC5wdXNoKHtzdGFydFRpbWU6aCxlbmRUaW1lOmksZWFzaW5nOmEudG9UaW1pbmdGdW5jdGlvbihsP2w6ImxpbmVhciIpLHByb3BlcnR5OmUsaW50ZXJwb2xhdGlvbjpiLnByb3BlcnR5SW50ZXJwb2xhdGlvbihlLGosayl9KX1yZXR1cm4gZC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3RhcnRUaW1lLWIuc3RhcnRUaW1lfSksZH1iLmNvbnZlcnRFZmZlY3RJbnB1dD1mdW5jdGlvbihjKXt2YXIgZj1hLm5vcm1hbGl6ZUtleWZyYW1lcyhjKSxnPWQoZiksaD1lKGcpO3JldHVybiBmdW5jdGlvbihhLGMpe2lmKG51bGwhPWMpaC5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIDA+PWMmJjA9PWEuc3RhcnRUaW1lfHxjPj0xJiYxPT1hLmVuZFRpbWV8fGM+PWEuc3RhcnRUaW1lJiZjPD1hLmVuZFRpbWV9KS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWMtZC5zdGFydFRpbWUsZj1kLmVuZFRpbWUtZC5zdGFydFRpbWUsZz0wPT1mPzA6ZC5lYXNpbmcoZS9mKTtiLmFwcGx5KGEsZC5wcm9wZXJ0eSxkLmludGVycG9sYXRpb24oZykpfSk7ZWxzZSBmb3IodmFyIGQgaW4gZykib2Zmc2V0IiE9ZCYmImVhc2luZyIhPWQmJiJjb21wb3NpdGUiIT1kJiZiLmNsZWFyKGEsZCl9fX0oYyxkLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhLnJlcGxhY2UoLy0oLikvZyxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KX1mdW5jdGlvbiBlKGEsYixjKXtoW2NdPWhbY118fFtdLGhbY10ucHVzaChbYSxiXSl9ZnVuY3Rpb24gZihhLGIsYyl7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspe3ZhciBnPWNbZl07ZShhLGIsZChnKSl9fWZ1bmN0aW9uIGcoYyxlLGYpe3ZhciBnPWM7Ly0vLnRlc3QoYykmJiFhLmlzRGVwcmVjYXRlZCgiSHlwaGVuYXRlZCBwcm9wZXJ0eSBuYW1lcyIsIjIwMTYtMDMtMjIiLCJVc2UgY2FtZWxDYXNlIGluc3RlYWQuIiwhMCkmJihnPWQoYykpLCJpbml0aWFsIiE9ZSYmImluaXRpYWwiIT1mfHwoImluaXRpYWwiPT1lJiYoZT1pW2ddKSwiaW5pdGlhbCI9PWYmJihmPWlbZ10pKTtmb3IodmFyIGo9ZT09Zj9bXTpoW2ddLGs9MDtqJiZrPGoubGVuZ3RoO2srKyl7dmFyIGw9altrXVswXShlKSxtPWpba11bMF0oZik7aWYodm9pZCAwIT09bCYmdm9pZCAwIT09bSl7dmFyIG49altrXVsxXShsLG0pO2lmKG4pe3ZhciBvPWIuSW50ZXJwb2xhdGlvbi5hcHBseShudWxsLG4pO3JldHVybiBmdW5jdGlvbihhKXtyZXR1cm4gMD09YT9lOjE9PWE/ZjpvKGEpfX19fXJldHVybiBiLkludGVycG9sYXRpb24oITEsITAsZnVuY3Rpb24oYSl7cmV0dXJuIGE/ZjplfSl9dmFyIGg9e307Yi5hZGRQcm9wZXJ0aWVzSGFuZGxlcj1mO3ZhciBpPXtiYWNrZ3JvdW5kQ29sb3I6InRyYW5zcGFyZW50IixiYWNrZ3JvdW5kUG9zaXRpb246IjAlIDAlIixib3JkZXJCb3R0b21Db2xvcjoiY3VycmVudENvbG9yIixib3JkZXJCb3R0b21MZWZ0UmFkaXVzOiIwcHgiLGJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzOiIwcHgiLGJvcmRlckJvdHRvbVdpZHRoOiIzcHgiLGJvcmRlckxlZnRDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJMZWZ0V2lkdGg6IjNweCIsYm9yZGVyUmlnaHRDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJSaWdodFdpZHRoOiIzcHgiLGJvcmRlclNwYWNpbmc6IjJweCIsYm9yZGVyVG9wQ29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyVG9wTGVmdFJhZGl1czoiMHB4Iixib3JkZXJUb3BSaWdodFJhZGl1czoiMHB4Iixib3JkZXJUb3BXaWR0aDoiM3B4Iixib3R0b206ImF1dG8iLGNsaXA6InJlY3QoMHB4LCAwcHgsIDBweCwgMHB4KSIsY29sb3I6ImJsYWNrIixmb250U2l6ZToiMTAwJSIsZm9udFdlaWdodDoiNDAwIixoZWlnaHQ6ImF1dG8iLGxlZnQ6ImF1dG8iLGxldHRlclNwYWNpbmc6Im5vcm1hbCIsbGluZUhlaWdodDoiMTIwJSIsbWFyZ2luQm90dG9tOiIwcHgiLG1hcmdpbkxlZnQ6IjBweCIsbWFyZ2luUmlnaHQ6IjBweCIsbWFyZ2luVG9wOiIwcHgiLG1heEhlaWdodDoibm9uZSIsbWF4V2lkdGg6Im5vbmUiLG1pbkhlaWdodDoiMHB4IixtaW5XaWR0aDoiMHB4IixvcGFjaXR5OiIxLjAiLG91dGxpbmVDb2xvcjoiaW52ZXJ0IixvdXRsaW5lT2Zmc2V0OiIwcHgiLG91dGxpbmVXaWR0aDoiM3B4IixwYWRkaW5nQm90dG9tOiIwcHgiLHBhZGRpbmdMZWZ0OiIwcHgiLHBhZGRpbmdSaWdodDoiMHB4IixwYWRkaW5nVG9wOiIwcHgiLHJpZ2h0OiJhdXRvIix0ZXh0SW5kZW50OiIwcHgiLHRleHRTaGFkb3c6IjBweCAwcHggMHB4IHRyYW5zcGFyZW50Iix0b3A6ImF1dG8iLHRyYW5zZm9ybToiIix2ZXJ0aWNhbEFsaWduOiIwcHgiLHZpc2liaWxpdHk6InZpc2libGUiLHdpZHRoOiJhdXRvIix3b3JkU3BhY2luZzoibm9ybWFsIix6SW5kZXg6ImF1dG8ifTtiLnByb3BlcnR5SW50ZXJwb2xhdGlvbj1nfShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYil7dmFyIGM9YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihiKSxkPWZ1bmN0aW9uKGQpe3JldHVybiBhLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihjLGQsYil9O3JldHVybiBkLl90b3RhbER1cmF0aW9uPWIuZGVsYXkrYytiLmVuZERlbGF5LGQuX2lzQ3VycmVudD1mdW5jdGlvbihkKXt2YXIgZT1hLmNhbGN1bGF0ZVBoYXNlKGMsZCxiKTtyZXR1cm4gZT09PVBoYXNlQWN0aXZlfHxlPT09UGhhc2VCZWZvcmV9LGR9Yi5LZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihjLGUsZixnKXt2YXIgaCxpPWQoYS5ub3JtYWxpemVUaW1pbmdJbnB1dChmKSksaj1iLmNvbnZlcnRFZmZlY3RJbnB1dChlKSxrPWZ1bmN0aW9uKCl7aihjLGgpfTtyZXR1cm4gay5fdXBkYXRlPWZ1bmN0aW9uKGEpe3JldHVybiBoPWkoYSksbnVsbCE9PWh9LGsuX2NsZWFyPWZ1bmN0aW9uKCl7aihjLG51bGwpfSxrLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBjPT09YX0say5faXNDdXJyZW50PWkuX2lzQ3VycmVudCxrLl90b3RhbER1cmF0aW9uPWkuX3RvdGFsRHVyYXRpb24say5faWQ9ZyxrfSxiLk51bGxFZmZlY3Q9ZnVuY3Rpb24oYSl7dmFyIGI9ZnVuY3Rpb24oKXthJiYoYSgpLGE9bnVsbCl9O3JldHVybiBiLl91cGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gbnVsbH0sYi5fdG90YWxEdXJhdGlvbj0wLGIuX2lzQ3VycmVudD1mdW5jdGlvbigpe3JldHVybiExfSxiLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuITF9LGJ9fShjLGQsZiksZnVuY3Rpb24oYSxiKXthLmFwcGx5PWZ1bmN0aW9uKGIsYyxkKXtiLnN0eWxlW2EucHJvcGVydHlOYW1lKGMpXT1kfSxhLmNsZWFyPWZ1bmN0aW9uKGIsYyl7Yi5zdHlsZVthLnByb3BlcnR5TmFtZShjKV09IiJ9fShkLGYpLGZ1bmN0aW9uKGEpe3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGEudGltZWxpbmUuX3BsYXkoYS5LZXlmcmFtZUVmZmVjdCh0aGlzLGIsYyxkKSl9fShkKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiLGQpe2lmKCJudW1iZXIiPT10eXBlb2YgYSYmIm51bWJlciI9PXR5cGVvZiBiKXJldHVybiBhKigxLWQpK2IqZDtpZigiYm9vbGVhbiI9PXR5cGVvZiBhJiYiYm9vbGVhbiI9PXR5cGVvZiBiKXJldHVybi41PmQ/YTpiO2lmKGEubGVuZ3RoPT1iLmxlbmd0aCl7Zm9yKHZhciBlPVtdLGY9MDtmPGEubGVuZ3RoO2YrKyllLnB1c2goYyhhW2ZdLGJbZl0sZCkpO3JldHVybiBlfXRocm93Ik1pc21hdGNoZWQgaW50ZXJwb2xhdGlvbiBhcmd1bWVudHMgIithKyI6IitifWEuSW50ZXJwb2xhdGlvbj1mdW5jdGlvbihhLGIsZCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBkKGMoYSxiLGUpKX19fShkLGYpLGZ1bmN0aW9uKGEsYixjKXthLnNlcXVlbmNlTnVtYmVyPTA7dmFyIGQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJmaW5pc2giLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX07Yi5BbmltYXRpb249ZnVuY3Rpb24oYil7dGhpcy5pZD0iIixiJiZiLl9pZCYmKHRoaXMuaWQ9Yi5faWQpLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9jdXJyZW50VGltZT0wLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9pblRpbWVsaW5lPSEwLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMCx0aGlzLm9uZmluaXNoPW51bGwsdGhpcy5fZmluaXNoSGFuZGxlcnM9W10sdGhpcy5fZWZmZWN0PWIsdGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoMCksdGhpcy5faWRsZT0hMCx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITF9LGIuQW5pbWF0aW9uLnByb3RvdHlwZT17X2Vuc3VyZUFsaXZlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGU8MCYmMD09PXRoaXMuY3VycmVudFRpbWU/dGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoLTEpOnRoaXMuX2luRWZmZWN0PXRoaXMuX2VmZmVjdC5fdXBkYXRlKHRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2luVGltZWxpbmV8fCF0aGlzLl9pbkVmZmVjdCYmdGhpcy5fZmluaXNoZWRGbGFnfHwodGhpcy5faW5UaW1lbGluZT0hMCxiLnRpbWVsaW5lLl9hbmltYXRpb25zLnB1c2godGhpcykpfSxfdGlja0N1cnJlbnRUaW1lOmZ1bmN0aW9uKGEsYil7YSE9dGhpcy5fY3VycmVudFRpbWUmJih0aGlzLl9jdXJyZW50VGltZT1hLHRoaXMuX2lzRmluaXNoZWQmJiFiJiYodGhpcy5fY3VycmVudFRpbWU9dGhpcy5fcGxheWJhY2tSYXRlPjA/dGhpcy5fdG90YWxEdXJhdGlvbjowKSx0aGlzLl9lbnN1cmVBbGl2ZSgpKX0sZ2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX2lkbGV8fHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz9udWxsOnRoaXMuX2N1cnJlbnRUaW1lfSxzZXQgY3VycmVudFRpbWUoYSl7YT0rYSxpc05hTihhKXx8KGIucmVzdGFydCgpLHRoaXMuX3BhdXNlZHx8bnVsbD09dGhpcy5fc3RhcnRUaW1lfHwodGhpcy5fc3RhcnRUaW1lPXRoaXMuX3RpbWVsaW5lLmN1cnJlbnRUaW1lLWEvdGhpcy5fcGxheWJhY2tSYXRlKSx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITEsdGhpcy5fY3VycmVudFRpbWUhPWEmJih0aGlzLl90aWNrQ3VycmVudFRpbWUoYSwhMCksYi5pbnZhbGlkYXRlRWZmZWN0cygpKSl9LGdldCBzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fc3RhcnRUaW1lfSxzZXQgc3RhcnRUaW1lKGEpe2E9K2EsaXNOYU4oYSl8fHRoaXMuX3BhdXNlZHx8dGhpcy5faWRsZXx8KHRoaXMuX3N0YXJ0VGltZT1hLHRoaXMuX3RpY2tDdXJyZW50VGltZSgodGhpcy5fdGltZWxpbmUuY3VycmVudFRpbWUtdGhpcy5fc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSksYi5pbnZhbGlkYXRlRWZmZWN0cygpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7aWYoYSE9dGhpcy5fcGxheWJhY2tSYXRlKXt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX3BsYXliYWNrUmF0ZT1hLHRoaXMuX3N0YXJ0VGltZT1udWxsLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5wbGF5KCksbnVsbCE9YiYmKHRoaXMuY3VycmVudFRpbWU9Yil9fSxnZXQgX2lzRmluaXNoZWQoKXtyZXR1cm4hdGhpcy5faWRsZSYmKHRoaXMuX3BsYXliYWNrUmF0ZT4wJiZ0aGlzLl9jdXJyZW50VGltZT49dGhpcy5fdG90YWxEdXJhdGlvbnx8dGhpcy5fcGxheWJhY2tSYXRlPDAmJnRoaXMuX2N1cnJlbnRUaW1lPD0wKX0sZ2V0IF90b3RhbER1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdC5fdG90YWxEdXJhdGlvbn0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9pZGxlPyJpZGxlIjpudWxsPT10aGlzLl9zdGFydFRpbWUmJiF0aGlzLl9wYXVzZWQmJjAhPXRoaXMucGxheWJhY2tSYXRlfHx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc/InBlbmRpbmciOnRoaXMuX3BhdXNlZD8icGF1c2VkIjp0aGlzLl9pc0ZpbmlzaGVkPyJmaW5pc2hlZCI6InJ1bm5pbmcifSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkPSExLCh0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl9pZGxlKSYmKHRoaXMuX2N1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wPzA6dGhpcy5fdG90YWxEdXJhdGlvbix0aGlzLl9zdGFydFRpbWU9bnVsbCksdGhpcy5fZmluaXNoZWRGbGFnPSExLHRoaXMuX2lkbGU9ITEsdGhpcy5fZW5zdXJlQWxpdmUoKSxiLmludmFsaWRhdGVFZmZlY3RzKCl9LHBhdXNlOmZ1bmN0aW9uKCl7dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fcGF1c2VkfHx0aGlzLl9pZGxlfHwodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSEwKSx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9wYXVzZWQ9ITB9LGZpbmlzaDpmdW5jdGlvbigpe3RoaXMuX2lkbGV8fCh0aGlzLmN1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wP3RoaXMuX3RvdGFsRHVyYXRpb246MCx0aGlzLl9zdGFydFRpbWU9dGhpcy5fdG90YWxEdXJhdGlvbi10aGlzLmN1cnJlbnRUaW1lLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxjYW5jZWw6ZnVuY3Rpb24oKXt0aGlzLl9pbkVmZmVjdCYmKHRoaXMuX2luRWZmZWN0PSExLHRoaXMuX2lkbGU9ITAsdGhpcy5fZmluaXNoZWRGbGFnPSEwLHRoaXMuY3VycmVudFRpbWU9MCx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9lZmZlY3QuX3VwZGF0ZShudWxsKSxiLmludmFsaWRhdGVFZmZlY3RzKCkpfSxyZXZlcnNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGUqPS0xLHRoaXMucGxheSgpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7ImZ1bmN0aW9uIj09dHlwZW9mIGImJiJmaW5pc2giPT1hJiZ0aGlzLl9maW5pc2hIYW5kbGVycy5wdXNoKGIpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7aWYoImZpbmlzaCI9PWEpe3ZhciBjPXRoaXMuX2ZpbmlzaEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fZmluaXNoSGFuZGxlcnMuc3BsaWNlKGMsMSl9fSxfZmlyZUV2ZW50czpmdW5jdGlvbihhKXtpZih0aGlzLl9pc0ZpbmlzaGVkKXtpZighdGhpcy5fZmluaXNoZWRGbGFnKXt2YXIgYj1uZXcgZCh0aGlzLHRoaXMuX2N1cnJlbnRUaW1lLGEpLGM9dGhpcy5fZmluaXNoSGFuZGxlcnMuY29uY2F0KHRoaXMub25maW5pc2g/W3RoaXMub25maW5pc2hdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChiLnRhcmdldCxiKX0pfSwwKSx0aGlzLl9maW5pc2hlZEZsYWc9ITB9fWVsc2UgdGhpcy5fZmluaXNoZWRGbGFnPSExfSxfdGljazpmdW5jdGlvbihhLGIpe3RoaXMuX2lkbGV8fHRoaXMuX3BhdXNlZHx8KG51bGw9PXRoaXMuX3N0YXJ0VGltZT9iJiYodGhpcy5zdGFydFRpbWU9YS10aGlzLl9jdXJyZW50VGltZS90aGlzLnBsYXliYWNrUmF0ZSk6dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fdGlja0N1cnJlbnRUaW1lKChhLXRoaXMuX3N0YXJ0VGltZSkqdGhpcy5wbGF5YmFja1JhdGUpKSxiJiYodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExLHRoaXMuX2ZpcmVFdmVudHMoYSkpfSxnZXQgX25lZWRzVGljaygpe3JldHVybiB0aGlzLnBsYXlTdGF0ZSBpbntwZW5kaW5nOjEscnVubmluZzoxfXx8IXRoaXMuX2ZpbmlzaGVkRmxhZ319fShjLGQsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9ajtqPVtdLGE8cC5jdXJyZW50VGltZSYmKGE9cC5jdXJyZW50VGltZSksaChhLCEwKSxiLmZvckVhY2goZnVuY3Rpb24oYil7YlsxXShhKX0pLGcoKSxsPXZvaWQgMH1mdW5jdGlvbiBlKGEsYil7cmV0dXJuIGEuX3NlcXVlbmNlTnVtYmVyLWIuX3NlcXVlbmNlTnVtYmVyfWZ1bmN0aW9uIGYoKXt0aGlzLl9hbmltYXRpb25zPVtdLHRoaXMuY3VycmVudFRpbWU9d2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2Uubm93KCk6MH1mdW5jdGlvbiBnKCl7by5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EoKX0pLG8ubGVuZ3RoPTB9ZnVuY3Rpb24gaChhLGMpe249ITE7dmFyIGQ9Yi50aW1lbGluZTtkLmN1cnJlbnRUaW1lPWEsZC5fYW5pbWF0aW9ucy5zb3J0KGUpLG09ITE7dmFyIGY9ZC5fYW5pbWF0aW9ucztkLl9hbmltYXRpb25zPVtdO3ZhciBnPVtdLGg9W107Zj1mLmZpbHRlcihmdW5jdGlvbihiKXtiLl90aWNrKGEsYyksYi5faW5FZmZlY3Q/aC5wdXNoKGIuX2VmZmVjdCk6Zy5wdXNoKGIuX2VmZmVjdCksYi5fbmVlZHNUaWNrJiYobT0hMCk7dmFyIGQ9Yi5faW5FZmZlY3R8fGIuX25lZWRzVGljaztyZXR1cm4gYi5faW5UaW1lbGluZT1kLGR9KSxvLnB1c2guYXBwbHkobyxnKSxvLnB1c2guYXBwbHkobyxoKSxkLl9hbmltYXRpb25zLnB1c2guYXBwbHkoZC5fYW5pbWF0aW9ucyxmKSxtJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt9KX12YXIgaT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLGo9W10saz0wO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7dmFyIGI9aysrO3JldHVybiAwPT1qLmxlbmd0aCYmaShkKSxqLnB1c2goW2IsYV0pLGJ9LHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZT1mdW5jdGlvbihhKXtqLmZvckVhY2goZnVuY3Rpb24oYil7YlswXT09YSYmKGJbMV09ZnVuY3Rpb24oKXt9KX0pfSxmLnByb3RvdHlwZT17X3BsYXk6ZnVuY3Rpb24oYyl7Yy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy50aW1pbmcpO3ZhciBkPW5ldyBiLkFuaW1hdGlvbihjKTtyZXR1cm4gZC5faWRsZT0hMSxkLl90aW1lbGluZT10aGlzLHRoaXMuX2FuaW1hdGlvbnMucHVzaChkKSxiLnJlc3RhcnQoKSxiLmludmFsaWRhdGVFZmZlY3RzKCksZH19O3ZhciBsPXZvaWQgMCxtPSExLG49ITE7Yi5yZXN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIG18fChtPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe30pLG49ITApLG59LGIuaW52YWxpZGF0ZUVmZmVjdHM9ZnVuY3Rpb24oKXtoKGIudGltZWxpbmUuY3VycmVudFRpbWUsITEpLGcoKX07dmFyIG89W10scD1uZXcgZjtiLnRpbWVsaW5lPXB9KGMsZCxmKSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9YS5leGVjKGIpO3JldHVybiBjPyhjPWEuaWdub3JlQ2FzZT9jWzBdLnRvTG93ZXJDYXNlKCk6Y1swXSxbYyxiLnN1YnN0cihjLmxlbmd0aCldKTp2b2lkIDB9ZnVuY3Rpb24gYyhhLGIpe2I9Yi5yZXBsYWNlKC9eXHMqLywiIik7dmFyIGM9YShiKTtyZXR1cm4gYz9bY1swXSxjWzFdLnJlcGxhY2UoL15ccyovLCIiKV06dm9pZCAwfWZ1bmN0aW9uIGQoYSxkLGUpe2E9Yy5iaW5kKG51bGwsYSk7Zm9yKHZhciBmPVtdOzspe3ZhciBnPWEoZSk7aWYoIWcpcmV0dXJuW2YsZV07aWYoZi5wdXNoKGdbMF0pLGU9Z1sxXSxnPWIoZCxlKSwhZ3x8IiI9PWdbMV0pcmV0dXJuW2YsZV07ZT1nWzFdfX1mdW5jdGlvbiBlKGEsYil7Zm9yKHZhciBjPTAsZD0wO2Q8Yi5sZW5ndGgmJighL1xzfCwvLnRlc3QoYltkXSl8fDAhPWMpO2QrKylpZigiKCI9PWJbZF0pYysrO2Vsc2UgaWYoIikiPT1iW2RdJiYoYy0tLDA9PWMmJmQrKywwPj1jKSlicmVhazt2YXIgZT1hKGIuc3Vic3RyKDAsZCkpO3JldHVybiB2b2lkIDA9PWU/dm9pZCAwOltlLGIuc3Vic3RyKGQpXX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjPWEsZD1iO2MmJmQ7KWM+ZD9jJT1kOmQlPWM7cmV0dXJuIGM9YSpiLyhjK2QpfWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWEoYik7cmV0dXJuIGMmJihjWzBdPXZvaWQgMCksY319ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbihjKXt2YXIgZD1hKGMpO3JldHVybiBkP2Q6W2IsY119fWZ1bmN0aW9uIGkoYixjKXtmb3IodmFyIGQ9W10sZT0wO2U8Yi5sZW5ndGg7ZSsrKXt2YXIgZj1hLmNvbnN1bWVUcmltbWVkKGJbZV0sYyk7aWYoIWZ8fCIiPT1mWzBdKXJldHVybjt2b2lkIDAhPT1mWzBdJiZkLnB1c2goZlswXSksYz1mWzFdfXJldHVybiIiPT1jP2Q6dm9pZCAwfWZ1bmN0aW9uIGooYSxiLGMsZCxlKXtmb3IodmFyIGc9W10saD1bXSxpPVtdLGo9ZihkLmxlbmd0aCxlLmxlbmd0aCksaz0wO2o+aztrKyspe3ZhciBsPWIoZFtrJWQubGVuZ3RoXSxlW2slZS5sZW5ndGhdKTtpZighbClyZXR1cm47Zy5wdXNoKGxbMF0pLGgucHVzaChsWzFdKSxpLnB1c2gobFsyXSl9cmV0dXJuW2csaCxmdW5jdGlvbihiKXt2YXIgZD1iLm1hcChmdW5jdGlvbihhLGIpe3JldHVybiBpW2JdKGEpfSkuam9pbihjKTtyZXR1cm4gYT9hKGQpOmR9XX1mdW5jdGlvbiBrKGEsYixjKXtmb3IodmFyIGQ9W10sZT1bXSxmPVtdLGc9MCxoPTA7aDxjLmxlbmd0aDtoKyspaWYoImZ1bmN0aW9uIj09dHlwZW9mIGNbaF0pe3ZhciBpPWNbaF0oYVtnXSxiW2crK10pO2QucHVzaChpWzBdKSxlLnB1c2goaVsxXSksZi5wdXNoKGlbMl0pfWVsc2UhZnVuY3Rpb24oYSl7ZC5wdXNoKCExKSxlLnB1c2goITEpLGYucHVzaChmdW5jdGlvbigpe3JldHVybiBjW2FdfSl9KGgpO3JldHVybltkLGUsZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKyliKz1mW2NdKGFbY10pO3JldHVybiBifV19YS5jb25zdW1lVG9rZW49YixhLmNvbnN1bWVUcmltbWVkPWMsYS5jb25zdW1lUmVwZWF0ZWQ9ZCxhLmNvbnN1bWVQYXJlbnRoZXNpc2VkPWUsYS5pZ25vcmU9ZyxhLm9wdGlvbmFsPWgsYS5jb25zdW1lTGlzdD1pLGEubWVyZ2VOZXN0ZWRSZXBlYXRlZD1qLmJpbmQobnVsbCxudWxsKSxhLm1lcmdlV3JhcHBlZE5lc3RlZFJlcGVhdGVkPWosYS5tZXJnZUxpc3Q9a30oZCksZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtmdW5jdGlvbiBjKGIpe3ZhciBjPWEuY29uc3VtZVRva2VuKC9eaW5zZXQvaSxiKTtpZihjKXJldHVybiBkLmluc2V0PSEwLGM7dmFyIGM9YS5jb25zdW1lTGVuZ3RoT3JQZXJjZW50KGIpO2lmKGMpcmV0dXJuIGQubGVuZ3Rocy5wdXNoKGNbMF0pLGM7dmFyIGM9YS5jb25zdW1lQ29sb3IoYik7cmV0dXJuIGM/KGQuY29sb3I9Y1swXSxjKTp2b2lkIDB9dmFyIGQ9e2luc2V0OiExLGxlbmd0aHM6W10sY29sb3I6bnVsbH0sZT1hLmNvbnN1bWVSZXBlYXRlZChjLC9eLyxiKTtyZXR1cm4gZSYmZVswXS5sZW5ndGg/W2QsZVsxXV06dm9pZCAwfWZ1bmN0aW9uIGMoYyl7dmFyIGQ9YS5jb25zdW1lUmVwZWF0ZWQoYiwvXiwvLGMpO3JldHVybiBkJiYiIj09ZFsxXT9kWzBdOnZvaWQgMH1mdW5jdGlvbiBkKGIsYyl7Zm9yKDtiLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWIubGVuZ3Rocy5wdXNoKHtweDowfSk7Zm9yKDtjLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWMubGVuZ3Rocy5wdXNoKHtweDowfSk7aWYoYi5pbnNldD09Yy5pbnNldCYmISFiLmNvbG9yPT0hIWMuY29sb3Ipe2Zvcih2YXIgZCxlPVtdLGY9W1tdLDBdLGc9W1tdLDBdLGg9MDtoPGIubGVuZ3Rocy5sZW5ndGg7aCsrKXt2YXIgaT1hLm1lcmdlRGltZW5zaW9ucyhiLmxlbmd0aHNbaF0sYy5sZW5ndGhzW2hdLDI9PWgpO2ZbMF0ucHVzaChpWzBdKSxnWzBdLnB1c2goaVsxXSksZS5wdXNoKGlbMl0pfWlmKGIuY29sb3ImJmMuY29sb3Ipe3ZhciBqPWEubWVyZ2VDb2xvcnMoYi5jb2xvcixjLmNvbG9yKTtmWzFdPWpbMF0sZ1sxXT1qWzFdLGQ9alsyXX1yZXR1cm5bZixnLGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1iLmluc2V0PyJpbnNldCAiOiIgIixmPTA7ZjxlLmxlbmd0aDtmKyspYys9ZVtmXShhWzBdW2ZdKSsiICI7cmV0dXJuIGQmJihjKz1kKGFbMV0pKSxjfV19fWZ1bmN0aW9uIGUoYixjLGQsZSl7ZnVuY3Rpb24gZihhKXtyZXR1cm57aW5zZXQ6YSxjb2xvcjpbMCwwLDAsMF0sbGVuZ3Roczpbe3B4OjB9LHtweDowfSx7cHg6MH0se3B4OjB9XX19Zm9yKHZhciBnPVtdLGg9W10saT0wO2k8ZC5sZW5ndGh8fGk8ZS5sZW5ndGg7aSsrKXt2YXIgaj1kW2ldfHxmKGVbaV0uaW5zZXQpLGs9ZVtpXXx8ZihkW2ldLmluc2V0KTtnLnB1c2goaiksaC5wdXNoKGspfXJldHVybiBhLm1lcmdlTmVzdGVkUmVwZWF0ZWQoYixjLGcsaCl9dmFyIGY9ZS5iaW5kKG51bGwsZCwiLCAiKTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGMsZixbImJveC1zaGFkb3ciLCJ0ZXh0LXNoYWRvdyJdKX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBhLnRvRml4ZWQoMykucmVwbGFjZSgiLjAwMCIsIiIpfWZ1bmN0aW9uIGQoYSxiLGMpe3JldHVybiBNYXRoLm1pbihiLE1hdGgubWF4KGEsYykpfWZ1bmN0aW9uIGUoYSl7cmV0dXJuL15ccypbLStdPyhcZCpcLik/XGQrXHMqJC8udGVzdChhKT9OdW1iZXIoYSk6dm9pZCAwfWZ1bmN0aW9uIGYoYSxiKXtyZXR1cm5bYSxiLGNdfWZ1bmN0aW9uIGcoYSxiKXtyZXR1cm4gMCE9YT9pKDAsMS8wKShhLGIpOnZvaWQgMH1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW2EsYixmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChkKDEsMS8wLGEpKX1dfWZ1bmN0aW9uIGkoYSxiKXtyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm5bZSxmLGZ1bmN0aW9uKGUpe3JldHVybiBjKGQoYSxiLGUpKX1dfX1mdW5jdGlvbiBqKGEsYil7cmV0dXJuW2EsYixNYXRoLnJvdW5kXX1hLmNsYW1wPWQsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxLzApLFsiYm9yZGVyLWltYWdlLXdpZHRoIiwibGluZS1oZWlnaHQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxKSxbIm9wYWNpdHkiLCJzaGFwZS1pbWFnZS10aHJlc2hvbGQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGcsWyJmbGV4LWdyb3ciLCJmbGV4LXNocmluayJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaCxbIm9ycGhhbnMiLCJ3aWRvd3MiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ6LWluZGV4Il0pLGEucGFyc2VOdW1iZXI9ZSxhLm1lcmdlTnVtYmVycz1mLGEubnVtYmVyVG9TdHJpbmc9Y30oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4idmlzaWJsZSI9PWF8fCJ2aXNpYmxlIj09Yj9bMCwxLGZ1bmN0aW9uKGMpe3JldHVybiAwPj1jP2E6Yz49MT9iOiJ2aXNpYmxlIn1dOnZvaWQgMH1hLmFkZFByb3BlcnRpZXNIYW5kbGVyKFN0cmluZyxjLFsidmlzaWJpbGl0eSJdKX0oZCksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe2E9YS50cmltKCksZi5maWxsU3R5bGU9IiMwMDAiLGYuZmlsbFN0eWxlPWE7dmFyIGI9Zi5maWxsU3R5bGU7aWYoZi5maWxsU3R5bGU9IiNmZmYiLGYuZmlsbFN0eWxlPWEsYj09Zi5maWxsU3R5bGUpe2YuZmlsbFJlY3QoMCwwLDEsMSk7dmFyIGM9Zi5nZXRJbWFnZURhdGEoMCwwLDEsMSkuZGF0YTtmLmNsZWFyUmVjdCgwLDAsMSwxKTt2YXIgZD1jWzNdLzI1NTtyZXR1cm5bY1swXSpkLGNbMV0qZCxjWzJdKmQsZF19fWZ1bmN0aW9uIGQoYixjKXtyZXR1cm5bYixjLGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIE1hdGgubWF4KDAsTWF0aC5taW4oMjU1LGEpKX1pZihiWzNdKWZvcih2YXIgZD0wOzM+ZDtkKyspYltkXT1NYXRoLnJvdW5kKGMoYltkXS9iWzNdKSk7cmV0dXJuIGJbM109YS5udW1iZXJUb1N0cmluZyhhLmNsYW1wKDAsMSxiWzNdKSksInJnYmEoIitiLmpvaW4oIiwiKSsiKSJ9XX12YXIgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKTtlLndpZHRoPWUuaGVpZ2h0PTE7dmFyIGY9ZS5nZXRDb250ZXh0KCIyZCIpO2EuYWRkUHJvcGVydGllc0hhbmRsZXIoYyxkLFsiYmFja2dyb3VuZC1jb2xvciIsImJvcmRlci1ib3R0b20tY29sb3IiLCJib3JkZXItbGVmdC1jb2xvciIsImJvcmRlci1yaWdodC1jb2xvciIsImJvcmRlci10b3AtY29sb3IiLCJjb2xvciIsIm91dGxpbmUtY29sb3IiLCJ0ZXh0LWRlY29yYXRpb24tY29sb3IiXSksYS5jb25zdW1lQ29sb3I9YS5jb25zdW1lUGFyZW50aGVzaXNlZC5iaW5kKG51bGwsYyksYS5tZXJnZUNvbG9ycz1kfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKGI9Yi50cmltKCkudG9Mb3dlckNhc2UoKSwiMCI9PWImJiJweCIuc2VhcmNoKGEpPj0wKXJldHVybntweDowfTtpZigvXlteKF0qJHxeY2FsYy8udGVzdChiKSl7Yj1iLnJlcGxhY2UoL2NhbGNcKC9nLCIoIik7dmFyIGM9e307Yj1iLnJlcGxhY2UoYSxmdW5jdGlvbihhKXtyZXR1cm4gY1thXT1udWxsLCJVIithfSk7Zm9yKHZhciBkPSJVKCIrYS5zb3VyY2UrIikiLGU9Yi5yZXBsYWNlKC9bLStdPyhcZCpcLik/XGQrL2csIk4iKS5yZXBsYWNlKG5ldyBSZWdFeHAoIk4iK2QsImciKSwiRCIpLnJlcGxhY2UoL1xzWystXVxzL2csIk8iKS5yZXBsYWNlKC9ccy9nLCIiKSxmPVsvTlwqKEQpL2csLyhOfEQpWypcL11OL2csLyhOfEQpT1wxL2csL1woKE58RClcKS9nXSxnPTA7ZzxmLmxlbmd0aDspZltnXS50ZXN0KGUpPyhlPWUucmVwbGFjZShmW2ddLCIkMSIpLGc9MCk6ZysrO2lmKCJEIj09ZSl7Zm9yKHZhciBoIGluIGMpe3ZhciBpPWV2YWwoYi5yZXBsYWNlKG5ldyBSZWdFeHAoIlUiK2gsImciKSwiIikucmVwbGFjZShuZXcgUmVnRXhwKGQsImciKSwiKjAiKSk7aWYoIWlzRmluaXRlKGkpKXJldHVybjtjW2hdPWl9cmV0dXJuIGN9fX1mdW5jdGlvbiBkKGEsYil7cmV0dXJuIGUoYSxiLCEwKX1mdW5jdGlvbiBlKGIsYyxkKXt2YXIgZSxmPVtdO2ZvcihlIGluIGIpZi5wdXNoKGUpO2ZvcihlIGluIGMpZi5pbmRleE9mKGUpPDAmJmYucHVzaChlKTtyZXR1cm4gYj1mLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYlthXXx8MH0pLGM9Zi5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGNbYV18fDB9KSxbYixjLGZ1bmN0aW9uKGIpe3ZhciBjPWIubWFwKGZ1bmN0aW9uKGMsZSl7cmV0dXJuIDE9PWIubGVuZ3RoJiZkJiYoYz1NYXRoLm1heChjLDApKSxhLm51bWJlclRvU3RyaW5nKGMpK2ZbZV19KS5qb2luKCIgKyAiKTtyZXR1cm4gYi5sZW5ndGg+MT8iY2FsYygiK2MrIikiOmN9XX12YXIgZj0icHh8ZW18ZXh8Y2h8cmVtfHZ3fHZofHZtaW58dm1heHxjbXxtbXxpbnxwdHxwYyIsZz1jLmJpbmQobnVsbCxuZXcgUmVnRXhwKGYsImciKSksaD1jLmJpbmQobnVsbCxuZXcgUmVnRXhwKGYrInwlIiwiZyIpKSxpPWMuYmluZChudWxsLC9kZWd8cmFkfGdyYWR8dHVybi9nKTthLnBhcnNlTGVuZ3RoPWcsYS5wYXJzZUxlbmd0aE9yUGVyY2VudD1oLGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudD1hLmNvbnN1bWVQYXJlbnRoZXNpc2VkLmJpbmQobnVsbCxoKSxhLnBhcnNlQW5nbGU9aSxhLm1lcmdlRGltZW5zaW9ucz1lO3ZhciBqPWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGcpLGs9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaiwvXi8pLGw9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaywvXiwvKTthLmNvbnN1bWVTaXplUGFpckxpc3Q9bDt2YXIgbT1mdW5jdGlvbihhKXt2YXIgYj1sKGEpO3JldHVybiBiJiYiIj09YlsxXT9iWzBdOnZvaWQgMH0sbj1hLm1lcmdlTmVzdGVkUmVwZWF0ZWQuYmluZCh2b2lkIDAsZCwiICIpLG89YS5tZXJnZU5lc3RlZFJlcGVhdGVkLmJpbmQodm9pZCAwLG4sIiwiKTthLm1lcmdlTm9uTmVnYXRpdmVTaXplUGFpcj1uLGEuYWRkUHJvcGVydGllc0hhbmRsZXIobSxvLFsiYmFja2dyb3VuZC1zaXplIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoaCxkLFsiYm9yZGVyLWJvdHRvbS13aWR0aCIsImJvcmRlci1pbWFnZS13aWR0aCIsImJvcmRlci1sZWZ0LXdpZHRoIiwiYm9yZGVyLXJpZ2h0LXdpZHRoIiwiYm9yZGVyLXRvcC13aWR0aCIsImZsZXgtYmFzaXMiLCJmb250LXNpemUiLCJoZWlnaHQiLCJsaW5lLWhlaWdodCIsIm1heC1oZWlnaHQiLCJtYXgtd2lkdGgiLCJvdXRsaW5lLXdpZHRoIiwid2lkdGgiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihoLGUsWyJib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzIiwiYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMiLCJib3JkZXItdG9wLWxlZnQtcmFkaXVzIiwiYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMiLCJib3R0b20iLCJsZWZ0IiwibGV0dGVyLXNwYWNpbmciLCJtYXJnaW4tYm90dG9tIiwibWFyZ2luLWxlZnQiLCJtYXJnaW4tcmlnaHQiLCJtYXJnaW4tdG9wIiwibWluLWhlaWdodCIsIm1pbi13aWR0aCIsIm91dGxpbmUtb2Zmc2V0IiwicGFkZGluZy1ib3R0b20iLCJwYWRkaW5nLWxlZnQiLCJwYWRkaW5nLXJpZ2h0IiwicGFkZGluZy10b3AiLCJwZXJzcGVjdGl2ZSIsInJpZ2h0Iiwic2hhcGUtbWFyZ2luIiwidGV4dC1pbmRlbnQiLCJ0b3AiLCJ2ZXJ0aWNhbC1hbGlnbiIsIndvcmQtc3BhY2luZyJdKX0oZCxmKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYil7cmV0dXJuIGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudChiKXx8YS5jb25zdW1lVG9rZW4oL15hdXRvLyxiKX1mdW5jdGlvbiBkKGIpe3ZhciBkPWEuY29uc3VtZUxpc3QoW2EuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXnJlY3QvKSksYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9eXCgvKSksYS5jb25zdW1lUmVwZWF0ZWQuYmluZChudWxsLGMsL14sLyksYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9eXCkvKSldLGIpO3JldHVybiBkJiY0PT1kWzBdLmxlbmd0aD9kWzBdOnZvaWQgMH1mdW5jdGlvbiBlKGIsYyl7cmV0dXJuImF1dG8iPT1ifHwiYXV0byI9PWM/WyEwLCExLGZ1bmN0aW9uKGQpe3ZhciBlPWQ/YjpjO2lmKCJhdXRvIj09ZSlyZXR1cm4iYXV0byI7dmFyIGY9YS5tZXJnZURpbWVuc2lvbnMoZSxlKTtyZXR1cm4gZlsyXShmWzBdKX1dOmEubWVyZ2VEaW1lbnNpb25zKGIsYyl9ZnVuY3Rpb24gZihhKXtyZXR1cm4icmVjdCgiK2ErIikifXZhciBnPWEubWVyZ2VXcmFwcGVkTmVzdGVkUmVwZWF0ZWQuYmluZChudWxsLGYsZSwiLCAiKTthLnBhcnNlQm94PWQsYS5tZXJnZUJveGVzPWcsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihkLGcsWyJjbGlwIl0pfShkLGYpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7dmFyIGM9MDtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGE9PT1rP2JbYysrXTphfSl9fWZ1bmN0aW9uIGQoYSl7cmV0dXJuIGF9ZnVuY3Rpb24gZShiKXtpZihiPWIudG9Mb3dlckNhc2UoKS50cmltKCksIm5vbmUiPT1iKXJldHVybltdO2Zvcih2YXIgYyxkPS9ccyooXHcrKVwoKFteKV0qKVwpL2csZT1bXSxmPTA7Yz1kLmV4ZWMoYik7KXtpZihjLmluZGV4IT1mKXJldHVybjtmPWMuaW5kZXgrY1swXS5sZW5ndGg7dmFyIGc9Y1sxXSxoPW5bZ107aWYoIWgpcmV0dXJuO3ZhciBpPWNbMl0uc3BsaXQoIiwiKSxqPWhbMF07aWYoai5sZW5ndGg8aS5sZW5ndGgpcmV0dXJuO2Zvcih2YXIgaz1bXSxvPTA7bzxqLmxlbmd0aDtvKyspe3ZhciBwLHE9aVtvXSxyPWpbb107aWYocD1xP3tBOmZ1bmN0aW9uKGIpe3JldHVybiIwIj09Yi50cmltKCk/bTphLnBhcnNlQW5nbGUoYil9LE46YS5wYXJzZU51bWJlcixUOmEucGFyc2VMZW5ndGhPclBlcmNlbnQsTDphLnBhcnNlTGVuZ3RofVtyLnRvVXBwZXJDYXNlKCldKHEpOnthOm0sbjprWzBdLHQ6bH1bcl0sdm9pZCAwPT09cClyZXR1cm47ay5wdXNoKHApfWlmKGUucHVzaCh7dDpnLGQ6a30pLGQubGFzdEluZGV4PT1iLmxlbmd0aClyZXR1cm4gZX19ZnVuY3Rpb24gZihhKXtyZXR1cm4gYS50b0ZpeGVkKDYpLnJlcGxhY2UoIi4wMDAwMDAiLCIiKX1mdW5jdGlvbiBnKGIsYyl7aWYoYi5kZWNvbXBvc2l0aW9uUGFpciE9PWMpe2IuZGVjb21wb3NpdGlvblBhaXI9Yzt2YXIgZD1hLm1ha2VNYXRyaXhEZWNvbXBvc2l0aW9uKGIpfWlmKGMuZGVjb21wb3NpdGlvblBhaXIhPT1iKXtjLmRlY29tcG9zaXRpb25QYWlyPWI7dmFyIGU9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbihjKX1yZXR1cm4gbnVsbD09ZFswXXx8bnVsbD09ZVswXT9bWyExXSxbITBdLGZ1bmN0aW9uKGEpe3JldHVybiBhP2NbMF0uZDpiWzBdLmR9XTooZFswXS5wdXNoKDApLGVbMF0ucHVzaCgxKSxbZCxlLGZ1bmN0aW9uKGIpe3ZhciBjPWEucXVhdChkWzBdWzNdLGVbMF1bM10sYls1XSksZz1hLmNvbXBvc2VNYXRyaXgoYlswXSxiWzFdLGJbMl0sYyxiWzRdKSxoPWcubWFwKGYpLmpvaW4oIiwiKTtyZXR1cm4gaH1dKX1mdW5jdGlvbiBoKGEpe3JldHVybiBhLnJlcGxhY2UoL1t4eV0vLCIiKX1mdW5jdGlvbiBpKGEpe3JldHVybiBhLnJlcGxhY2UoLyh4fHl8enwzZCk/JC8sIjNkIil9ZnVuY3Rpb24gaihiLGMpe3ZhciBkPWEubWFrZU1hdHJpeERlY29tcG9zaXRpb24mJiEwLGU9ITE7aWYoIWIubGVuZ3RofHwhYy5sZW5ndGgpe2IubGVuZ3RofHwoZT0hMCxiPWMsYz1bXSk7Zm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspe3ZhciBqPWJbZl0udCxrPWJbZl0uZCxsPSJzY2FsZSI9PWouc3Vic3RyKDAsNSk/MTowO2MucHVzaCh7dDpqLGQ6ay5tYXAoZnVuY3Rpb24oYSl7aWYoIm51bWJlciI9PXR5cGVvZiBhKXJldHVybiBsO3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKWJbY109bDtyZXR1cm4gYn0pfSl9fXZhciBtPWZ1bmN0aW9uKGEsYil7cmV0dXJuInBlcnNwZWN0aXZlIj09YSYmInBlcnNwZWN0aXZlIj09Ynx8KCJtYXRyaXgiPT1hfHwibWF0cml4M2QiPT1hKSYmKCJtYXRyaXgiPT1ifHwibWF0cml4M2QiPT1iKX0sbz1bXSxwPVtdLHE9W107aWYoYi5sZW5ndGghPWMubGVuZ3RoKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXX1lbHNlIGZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKXt2YXIgaixzPWJbZl0udCx0PWNbZl0udCx1PWJbZl0uZCx2PWNbZl0uZCx3PW5bc10seD1uW3RdO2lmKG0ocyx0KSl7aWYoIWQpcmV0dXJuO3ZhciByPWcoW2JbZl1dLFtjW2ZdXSk7by5wdXNoKHJbMF0pLHAucHVzaChyWzFdKSxxLnB1c2goWyJtYXRyaXgiLFtyWzJdXV0pfWVsc2V7aWYocz09dClqPXM7ZWxzZSBpZih3WzJdJiZ4WzJdJiZoKHMpPT1oKHQpKWo9aChzKSx1PXdbMl0odSksdj14WzJdKHYpO2Vsc2V7aWYoIXdbMV18fCF4WzFdfHxpKHMpIT1pKHQpKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXTticmVha31qPWkocyksdT13WzFdKHUpLHY9eFsxXSh2KX1mb3IodmFyIHk9W10sej1bXSxBPVtdLEI9MDtCPHUubGVuZ3RoO0IrKyl7dmFyIEM9Im51bWJlciI9PXR5cGVvZiB1W0JdP2EubWVyZ2VOdW1iZXJzOmEubWVyZ2VEaW1lbnNpb25zLHI9Qyh1W0JdLHZbQl0pO3lbQl09clswXSx6W0JdPXJbMV0sQS5wdXNoKHJbMl0pfW8ucHVzaCh5KSxwLnB1c2goeikscS5wdXNoKFtqLEFdKX19aWYoZSl7dmFyIEQ9bztvPXAscD1EfXJldHVybltvLHAsZnVuY3Rpb24oYSl7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS5tYXAoZnVuY3Rpb24oYSxjKXtyZXR1cm4gcVtiXVsxXVtjXShhKX0pLmpvaW4oIiwiKTtyZXR1cm4ibWF0cml4Ij09cVtiXVswXSYmMTY9PWMuc3BsaXQoIiwiKS5sZW5ndGgmJihxW2JdWzBdPSJtYXRyaXgzZCIpLHFbYl1bMF0rIigiK2MrIikifSkuam9pbigiICIpfV19dmFyIGs9bnVsbCxsPXtweDowfSxtPXtkZWc6MH0sbj17bWF0cml4OlsiTk5OTk5OIixbayxrLDAsMCxrLGssMCwwLDAsMCwxLDAsayxrLDAsMV0sZF0sbWF0cml4M2Q6WyJOTk5OTk5OTk5OTk5OTk5OIixkXSxyb3RhdGU6WyJBIl0scm90YXRleDpbIkEiXSxyb3RhdGV5OlsiQSJdLHJvdGF0ZXo6WyJBIl0scm90YXRlM2Q6WyJOTk5BIl0scGVyc3BlY3RpdmU6WyJMIl0sc2NhbGU6WyJObiIsYyhbayxrLDFdKSxkXSxzY2FsZXg6WyJOIixjKFtrLDEsMV0pLGMoW2ssMV0pXSxzY2FsZXk6WyJOIixjKFsxLGssMV0pLGMoWzEsa10pXSxzY2FsZXo6WyJOIixjKFsxLDEsa10pXSxzY2FsZTNkOlsiTk5OIixkXSxza2V3OlsiQWEiLG51bGwsZF0sc2tld3g6WyJBIixudWxsLGMoW2ssbV0pXSxza2V3eTpbIkEiLG51bGwsYyhbbSxrXSldLHRyYW5zbGF0ZTpbIlR0IixjKFtrLGssbF0pLGRdLHRyYW5zbGF0ZXg6WyJUIixjKFtrLGwsbF0pLGMoW2ssbF0pXSx0cmFuc2xhdGV5OlsiVCIsYyhbbCxrLGxdKSxjKFtsLGtdKV0sdHJhbnNsYXRlejpbIkwiLGMoW2wsbCxrXSldLHRyYW5zbGF0ZTNkOlsiVFRMIixkXX07YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ0cmFuc2Zvcm0iXSl9KGQsZiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7Yi5jb25jYXQoW2FdKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlJiYoZFthXT1iKX0pfXZhciBkPXt9O2MoInRyYW5zZm9ybSIsWyJ3ZWJraXRUcmFuc2Zvcm0iLCJtc1RyYW5zZm9ybSJdKSxjKCJ0cmFuc2Zvcm1PcmlnaW4iLFsid2Via2l0VHJhbnNmb3JtT3JpZ2luIl0pLGMoInBlcnNwZWN0aXZlIixbIndlYmtpdFBlcnNwZWN0aXZlIl0pLGMoInBlcnNwZWN0aXZlT3JpZ2luIixbIndlYmtpdFBlcnNwZWN0aXZlT3JpZ2luIl0pLGEucHJvcGVydHlOYW1lPWZ1bmN0aW9uKGEpe3JldHVybiBkW2FdfHxhfX0oZCxmKX0oKSwhZnVuY3Rpb24oKXtpZih2b2lkIDA9PT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5hbmltYXRlKFtdKS5vbmNhbmNlbCl7dmFyIGE7aWYod2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3cpdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gcGVyZm9ybWFuY2Uubm93KCl9O2Vsc2UgdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX07dmFyIGI9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJjYW5jZWwiLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX0sYz13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTt3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihkLGUpe3ZhciBmPWMuY2FsbCh0aGlzLGQsZSk7Zi5fY2FuY2VsSGFuZGxlcnM9W10sZi5vbmNhbmNlbD1udWxsO3ZhciBnPWYuY2FuY2VsO2YuY2FuY2VsPWZ1bmN0aW9uKCl7Zy5jYWxsKHRoaXMpO3ZhciBjPW5ldyBiKHRoaXMsbnVsbCxhKCkpLGQ9dGhpcy5fY2FuY2VsSGFuZGxlcnMuY29uY2F0KHRoaXMub25jYW5jZWw/W3RoaXMub25jYW5jZWxdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChjLnRhcmdldCxjKX0pfSwwKX07dmFyIGg9Zi5hZGRFdmVudExpc3RlbmVyO2YuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIpeyJmdW5jdGlvbiI9PXR5cGVvZiBiJiYiY2FuY2VsIj09YT90aGlzLl9jYW5jZWxIYW5kbGVycy5wdXNoKGIpOmguY2FsbCh0aGlzLGEsYil9O3ZhciBpPWYucmVtb3ZlRXZlbnRMaXN0ZW5lcjtyZXR1cm4gZi5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYil7aWYoImNhbmNlbCI9PWEpe3ZhciBjPXRoaXMuX2NhbmNlbEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fY2FuY2VsSGFuZGxlcnMuc3BsaWNlKGMsMSl9ZWxzZSBpLmNhbGwodGhpcyxhLGIpfSxmfX19KCksZnVuY3Rpb24oYSl7dmFyIGI9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGM9bnVsbCxkPSExO3RyeXt2YXIgZT1nZXRDb21wdXRlZFN0eWxlKGIpLmdldFByb3BlcnR5VmFsdWUoIm9wYWNpdHkiKSxmPSIwIj09ZT8iMSI6IjAiO2M9Yi5hbmltYXRlKHtvcGFjaXR5OltmLGZdfSx7ZHVyYXRpb246MX0pLGMuY3VycmVudFRpbWU9MCxkPWdldENvbXB1dGVkU3R5bGUoYikuZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpPT1mfWNhdGNoKGcpe31maW5hbGx5e2MmJmMuY2FuY2VsKCl9aWYoIWQpe3ZhciBoPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlO3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIHdpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmJbU3ltYm9sLml0ZXJhdG9yXSYmKGI9QXJyYXkuZnJvbShiKSksQXJyYXkuaXNBcnJheShiKXx8bnVsbD09PWJ8fChiPWEuY29udmVydFRvQXJyYXlGb3JtKGIpKSxoLmNhbGwodGhpcyxiLGMpfX19KGMpLCFmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXt2YXIgYj13aW5kb3cuZG9jdW1lbnQudGltZWxpbmU7Yi5jdXJyZW50VGltZT1hLGIuX2Rpc2NhcmRBbmltYXRpb25zKCksMD09Yi5fYW5pbWF0aW9ucy5sZW5ndGg/Zj0hMTpyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZCk7Cn12YXIgZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIGUoZnVuY3Rpb24oYil7d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKSxhKGIpLHdpbmRvdy5kb2N1bWVudC50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCl9KX0sYi5BbmltYXRpb25UaW1lbGluZT1mdW5jdGlvbigpe3RoaXMuX2FuaW1hdGlvbnM9W10sdGhpcy5jdXJyZW50VGltZT12b2lkIDB9LGIuQW5pbWF0aW9uVGltZWxpbmUucHJvdG90eXBlPXtnZXRBbmltYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc2NhcmRBbmltYXRpb25zKCksdGhpcy5fYW5pbWF0aW9ucy5zbGljZSgpfSxfdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzOmZ1bmN0aW9uKCl7Yi5hbmltYXRpb25zV2l0aFByb21pc2VzPWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuX3VwZGF0ZVByb21pc2VzKCl9KX0sX2Rpc2NhcmRBbmltYXRpb25zOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksdGhpcy5fYW5pbWF0aW9ucz10aGlzLl9hbmltYXRpb25zLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZmluaXNoZWQiIT1hLnBsYXlTdGF0ZSYmImlkbGUiIT1hLnBsYXlTdGF0ZX0pfSxfcGxheTpmdW5jdGlvbihhKXt2YXIgYz1uZXcgYi5BbmltYXRpb24oYSx0aGlzKTtyZXR1cm4gdGhpcy5fYW5pbWF0aW9ucy5wdXNoKGMpLGIucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaygpLGMuX3VwZGF0ZVByb21pc2VzKCksYy5fYW5pbWF0aW9uLnBsYXkoKSxjLl91cGRhdGVQcm9taXNlcygpLGN9LHBsYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEucmVtb3ZlKCksdGhpcy5fcGxheShhKX19O3ZhciBmPSExO2IucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaz1mdW5jdGlvbigpe2Z8fChmPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShkKSl9O3ZhciBnPW5ldyBiLkFuaW1hdGlvblRpbWVsaW5lO2IudGltZWxpbmU9Zzt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5kb2N1bWVudCwidGltZWxpbmUiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGd9fSl9Y2F0Y2goaCl7fXRyeXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmU9Z31jYXRjaChoKXt9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2IuYW5pbWF0aW9uc1dpdGhQcm9taXNlcz1bXSxiLkFuaW1hdGlvbj1mdW5jdGlvbihiLGMpe2lmKHRoaXMuaWQ9IiIsYiYmYi5faWQmJih0aGlzLmlkPWIuX2lkKSx0aGlzLmVmZmVjdD1iLGImJihiLl9hbmltYXRpb249dGhpcyksIWMpdGhyb3cgbmV3IEVycm9yKCJBbmltYXRpb24gd2l0aCBudWxsIHRpbWVsaW5lIGlzIG5vdCBzdXBwb3J0ZWQiKTt0aGlzLl90aW1lbGluZT1jLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9ob2xkVGltZT0wLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9pc0dyb3VwPSExLHRoaXMuX2FuaW1hdGlvbj1udWxsLHRoaXMuX2NoaWxkQW5pbWF0aW9ucz1bXSx0aGlzLl9jYWxsYmFjaz1udWxsLHRoaXMuX29sZFBsYXlTdGF0ZT0iaWRsZSIsdGhpcy5fcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb24oKSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sYi5BbmltYXRpb24ucHJvdG90eXBlPXtfdXBkYXRlUHJvbWlzZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9vbGRQbGF5U3RhdGUsYj10aGlzLnBsYXlTdGF0ZTtyZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0UmVhZHlQcm9taXNlKCksdGhpcy5fcmVhZHlQcm9taXNlPXZvaWQgMCk6InBlbmRpbmciPT1hP3RoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKToicGVuZGluZyI9PWImJih0aGlzLl9yZWFkeVByb21pc2U9dm9pZCAwKSksdGhpcy5fZmluaXNoZWRQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlKCksdGhpcy5fZmluaXNoZWRQcm9taXNlPXZvaWQgMCk6ImZpbmlzaGVkIj09Yj90aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlKCk6ImZpbmlzaGVkIj09YSYmKHRoaXMuX2ZpbmlzaGVkUHJvbWlzZT12b2lkIDApKSx0aGlzLl9vbGRQbGF5U3RhdGU9dGhpcy5wbGF5U3RhdGUsdGhpcy5fcmVhZHlQcm9taXNlfHx0aGlzLl9maW5pc2hlZFByb21pc2V9LF9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGEsYyxkLGUsZj0hIXRoaXMuX2FuaW1hdGlvbjtmJiYoYT10aGlzLnBsYXliYWNrUmF0ZSxjPXRoaXMuX3BhdXNlZCxkPXRoaXMuc3RhcnRUaW1lLGU9dGhpcy5jdXJyZW50VGltZSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fYW5pbWF0aW9uLl93cmFwcGVyPW51bGwsdGhpcy5fYW5pbWF0aW9uPW51bGwpLCghdGhpcy5lZmZlY3R8fHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LktleWZyYW1lRWZmZWN0KSYmKHRoaXMuX2FuaW1hdGlvbj1iLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdCh0aGlzLmVmZmVjdCksYi5iaW5kQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3QodGhpcykpLCh0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdHx8dGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuR3JvdXBFZmZlY3QpJiYodGhpcy5fYW5pbWF0aW9uPWIubmV3VW5kZXJseWluZ0FuaW1hdGlvbkZvckdyb3VwKHRoaXMuZWZmZWN0KSxiLmJpbmRBbmltYXRpb25Gb3JHcm91cCh0aGlzKSksdGhpcy5lZmZlY3QmJnRoaXMuZWZmZWN0Ll9vbnNhbXBsZSYmYi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0KHRoaXMpLGYmJigxIT1hJiYodGhpcy5wbGF5YmFja1JhdGU9YSksbnVsbCE9PWQ/dGhpcy5zdGFydFRpbWU9ZDpudWxsIT09ZT90aGlzLmN1cnJlbnRUaW1lPWU6bnVsbCE9PXRoaXMuX2hvbGRUaW1lJiYodGhpcy5jdXJyZW50VGltZT10aGlzLl9ob2xkVGltZSksYyYmdGhpcy5wYXVzZSgpKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxfdXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24oKXtpZih0aGlzLmVmZmVjdCYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSl7dmFyIGE9dGhpcy5lZmZlY3QuX3RpbWluZy5kZWxheTt0aGlzLl9jaGlsZEFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbihjKXt0aGlzLl9hcnJhbmdlQ2hpbGRyZW4oYyxhKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGErPWIuZ3JvdXBDaGlsZER1cmF0aW9uKGMuZWZmZWN0KSl9LmJpbmQodGhpcykpfX0sX3NldEV4dGVybmFsQW5pbWF0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKWZvcih2YXIgYj0wO2I8dGhpcy5lZmZlY3QuY2hpbGRyZW4ubGVuZ3RoO2IrKyl0aGlzLmVmZmVjdC5jaGlsZHJlbltiXS5fYW5pbWF0aW9uPWEsdGhpcy5fY2hpbGRBbmltYXRpb25zW2JdLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9uczpmdW5jdGlvbigpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKXt2YXIgYT10aGlzLmVmZmVjdC5fdGltaW5nLmRlbGF5O3RoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpLHRoaXMuZWZmZWN0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9d2luZG93LmRvY3VtZW50LnRpbWVsaW5lLl9wbGF5KGMpO3RoaXMuX2NoaWxkQW5pbWF0aW9ucy5wdXNoKGQpLGQucGxheWJhY2tSYXRlPXRoaXMucGxheWJhY2tSYXRlLHRoaXMuX3BhdXNlZCYmZC5wYXVzZSgpLGMuX2FuaW1hdGlvbj10aGlzLmVmZmVjdC5fYW5pbWF0aW9uLHRoaXMuX2FycmFuZ2VDaGlsZHJlbihkLGEpLHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0JiYoYSs9Yi5ncm91cENoaWxkRHVyYXRpb24oYykpfS5iaW5kKHRoaXMpKX19LF9hcnJhbmdlQ2hpbGRyZW46ZnVuY3Rpb24oYSxiKXtudWxsPT09dGhpcy5zdGFydFRpbWU/YS5jdXJyZW50VGltZT10aGlzLmN1cnJlbnRUaW1lLWIvdGhpcy5wbGF5YmFja1JhdGU6YS5zdGFydFRpbWUhPT10aGlzLnN0YXJ0VGltZStiL3RoaXMucGxheWJhY2tSYXRlJiYoYS5zdGFydFRpbWU9dGhpcy5zdGFydFRpbWUrYi90aGlzLnBsYXliYWNrUmF0ZSl9LGdldCB0aW1lbGluZSgpe3JldHVybiB0aGlzLl90aW1lbGluZX0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9hbmltYXRpb24/dGhpcy5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSJ9LGdldCBmaW5pc2hlZCgpe3JldHVybiB3aW5kb3cuUHJvbWlzZT8odGhpcy5fZmluaXNoZWRQcm9taXNlfHwoLTE9PWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5pbmRleE9mKHRoaXMpJiZiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMucHVzaCh0aGlzKSx0aGlzLl9maW5pc2hlZFByb21pc2U9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXt0aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlPWZ1bmN0aW9uKCl7YSh0aGlzKX0sdGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlPWZ1bmN0aW9uKCl7Yih7dHlwZTpET01FeGNlcHRpb24uQUJPUlRfRVJSLG5hbWU6IkFib3J0RXJyb3IifSl9fS5iaW5kKHRoaXMpKSwiZmluaXNoZWQiPT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5fcmVzb2x2ZUZpbmlzaGVkUHJvbWlzZSgpKSx0aGlzLl9maW5pc2hlZFByb21pc2UpOihjb25zb2xlLndhcm4oIkFuaW1hdGlvbiBQcm9taXNlcyByZXF1aXJlIEphdmFTY3JpcHQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpLG51bGwpfSxnZXQgcmVhZHkoKXtyZXR1cm4gd2luZG93LlByb21pc2U/KHRoaXMuX3JlYWR5UHJvbWlzZXx8KC0xPT1iLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMuaW5kZXhPZih0aGlzKSYmYi5hbmltYXRpb25zV2l0aFByb21pc2VzLnB1c2godGhpcyksdGhpcy5fcmVhZHlQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7dGhpcy5fcmVzb2x2ZVJlYWR5UHJvbWlzZT1mdW5jdGlvbigpe2EodGhpcyl9LHRoaXMuX3JlamVjdFJlYWR5UHJvbWlzZT1mdW5jdGlvbigpe2Ioe3R5cGU6RE9NRXhjZXB0aW9uLkFCT1JUX0VSUixuYW1lOiJBYm9ydEVycm9yIn0pfX0uYmluZCh0aGlzKSksInBlbmRpbmciIT09dGhpcy5wbGF5U3RhdGUmJnRoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKSksdGhpcy5fcmVhZHlQcm9taXNlKTooY29uc29sZS53YXJuKCJBbmltYXRpb24gUHJvbWlzZXMgcmVxdWlyZSBKYXZhU2NyaXB0IFByb21pc2UgY29uc3RydWN0b3IiKSxudWxsKX0sZ2V0IG9uZmluaXNoKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaH0sc2V0IG9uZmluaXNoKGEpeyJmdW5jdGlvbiI9PXR5cGVvZiBhP3RoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaD1mdW5jdGlvbihiKXtiLnRhcmdldD10aGlzLGEuY2FsbCh0aGlzLGIpfS5iaW5kKHRoaXMpOnRoaXMuX2FuaW1hdGlvbi5vbmZpbmlzaD1hfSxnZXQgb25jYW5jZWwoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsfSxzZXQgb25jYW5jZWwoYSl7ImZ1bmN0aW9uIj09dHlwZW9mIGE/dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPWZ1bmN0aW9uKGIpe2IudGFyZ2V0PXRoaXMsYS5jYWxsKHRoaXMsYil9LmJpbmQodGhpcyk6dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPWF9LGdldCBjdXJyZW50VGltZSgpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5fYW5pbWF0aW9uLmN1cnJlbnRUaW1lO3JldHVybiB0aGlzLl91cGRhdGVQcm9taXNlcygpLGF9LHNldCBjdXJyZW50VGltZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5jdXJyZW50VGltZT1pc0Zpbml0ZShhKT9hOk1hdGguc2lnbihhKSpOdW1iZXIuTUFYX1ZBTFVFLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGIsYyl7Yi5jdXJyZW50VGltZT1hLWN9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgc3RhcnRUaW1lKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5zdGFydFRpbWV9LHNldCBzdGFydFRpbWUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb24uc3RhcnRUaW1lPWlzRmluaXRlKGEpP2E6TWF0aC5zaWduKGEpKk51bWJlci5NQVhfVkFMVUUsdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYixjKXtiLnN0YXJ0VGltZT1hK2N9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKTt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGU9YSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYil7Yi5wbGF5YmFja1JhdGU9YX0pLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5wbGF5KCksbnVsbCE9PWImJih0aGlzLmN1cnJlbnRUaW1lPWIpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9hbmltYXRpb24ucGxheSgpLC0xPT10aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5pbmRleE9mKHRoaXMpJiZ0aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5wdXNoKHRoaXMpLHRoaXMuX3JlZ2lzdGVyKCksYi5hd2FpdFN0YXJ0VGltZSh0aGlzKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7dmFyIGI9YS5jdXJyZW50VGltZTthLnBsYXkoKSxhLmN1cnJlbnRUaW1lPWJ9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5jdXJyZW50VGltZSYmKHRoaXMuX2hvbGRUaW1lPXRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2FuaW1hdGlvbi5wYXVzZSgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pLHRoaXMuX3BhdXNlZD0hMCx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxmaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5maW5pc2goKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0scmV2ZXJzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5jdXJyZW50VGltZTt0aGlzLl9hbmltYXRpb24ucmV2ZXJzZSgpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXthLnJldmVyc2UoKX0pLG51bGwhPT1hJiYodGhpcy5jdXJyZW50VGltZT1hKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YjsiZnVuY3Rpb24iPT10eXBlb2YgYiYmKGM9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9dGhpcyxiLmNhbGwodGhpcyxhKX0uYmluZCh0aGlzKSxiLl93cmFwcGVyPWMpLHRoaXMuX2FuaW1hdGlvbi5hZGRFdmVudExpc3RlbmVyKGEsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXt0aGlzLl9hbmltYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGImJmIuX3dyYXBwZXJ8fGIpfSxfcmVtb3ZlQ2hpbGRBbmltYXRpb25zOmZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl9jaGlsZEFuaW1hdGlvbnMubGVuZ3RoOyl0aGlzLl9jaGlsZEFuaW1hdGlvbnMucG9wKCkuY2FuY2VsKCl9LF9mb3JFYWNoQ2hpbGQ6ZnVuY3Rpb24oYil7dmFyIGM9MDtpZih0aGlzLmVmZmVjdC5jaGlsZHJlbiYmdGhpcy5fY2hpbGRBbmltYXRpb25zLmxlbmd0aDx0aGlzLmVmZmVjdC5jaGlsZHJlbi5sZW5ndGgmJnRoaXMuX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9ucygpLHRoaXMuX2NoaWxkQW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2IuY2FsbCh0aGlzLGEsYyksdGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3QmJihjKz1hLmVmZmVjdC5hY3RpdmVEdXJhdGlvbil9LmJpbmQodGhpcykpLCJwZW5kaW5nIiE9dGhpcy5wbGF5U3RhdGUpe3ZhciBkPXRoaXMuZWZmZWN0Ll90aW1pbmcsZT10aGlzLmN1cnJlbnRUaW1lO251bGwhPT1lJiYoZT1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGQpLGUsZCkpLChudWxsPT1lfHxpc05hTihlKSkmJnRoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpfX19LHdpbmRvdy5BbmltYXRpb249Yi5BbmltYXRpb259KGMsZSxmKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChiKXt0aGlzLl9mcmFtZXM9YS5ub3JtYWxpemVLZXlmcmFtZXMoYil9ZnVuY3Rpb24gZSgpe2Zvcih2YXIgYT0hMTtpLmxlbmd0aDspe3ZhciBiPWkuc2hpZnQoKTtiLl91cGRhdGVDaGlsZHJlbigpLGE9ITB9cmV0dXJuIGF9dmFyIGY9ZnVuY3Rpb24oYSl7aWYoYS5fYW5pbWF0aW9uPXZvaWQgMCxhIGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0fHxhIGluc3RhbmNlb2Ygd2luZG93Lkdyb3VwRWZmZWN0KWZvcih2YXIgYj0wO2I8YS5jaGlsZHJlbi5sZW5ndGg7YisrKWYoYS5jaGlsZHJlbltiXSl9O2IucmVtb3ZlTXVsdGk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtkLl9wYXJlbnQ/KC0xPT1iLmluZGV4T2YoZC5fcGFyZW50KSYmYi5wdXNoKGQuX3BhcmVudCksZC5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShkLl9wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihkKSwxKSxkLl9wYXJlbnQ9bnVsbCxmKGQpKTpkLl9hbmltYXRpb24mJmQuX2FuaW1hdGlvbi5lZmZlY3Q9PWQmJihkLl9hbmltYXRpb24uY2FuY2VsKCksZC5fYW5pbWF0aW9uLmVmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QobnVsbCxbXSksZC5fYW5pbWF0aW9uLl9jYWxsYmFjayYmKGQuX2FuaW1hdGlvbi5fY2FsbGJhY2suX2FuaW1hdGlvbj1udWxsKSxkLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCksZihkKSl9Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLl9yZWJ1aWxkKCl9LGIuS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYixjLGUsZil7cmV0dXJuIHRoaXMudGFyZ2V0PWIsdGhpcy5fcGFyZW50PW51bGwsZT1hLm51bWVyaWNUaW1pbmdUb09iamVjdChlKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoZSksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoZSksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGUsITEsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBjPyhhLmRlcHJlY2F0ZWQoIkN1c3RvbSBLZXlmcmFtZUVmZmVjdCIsIjIwMTUtMDYtMjIiLCJVc2UgS2V5ZnJhbWVFZmZlY3Qub25zYW1wbGUgaW5zdGVhZC4iKSx0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzPWMpOnRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM9bmV3IGQoYyksdGhpcy5fa2V5ZnJhbWVzPWMsdGhpcy5hY3RpdmVEdXJhdGlvbj1hLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKHRoaXMuX3RpbWluZyksdGhpcy5faWQ9Zix0aGlzfSxiLktleWZyYW1lRWZmZWN0LnByb3RvdHlwZT17Z2V0RnJhbWVzOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM/dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lczp0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLl9mcmFtZXN9LHNldCBvbnNhbXBsZShhKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5nZXRGcmFtZXMoKSl0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgb25zYW1wbGUgb24gY3VzdG9tIGVmZmVjdCBLZXlmcmFtZUVmZmVjdCBpcyBub3Qgc3VwcG9ydGVkLiIpO3RoaXMuX29uc2FtcGxlPWEsdGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LGdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fSxjbG9uZTpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmdldEZyYW1lcygpKXRocm93IG5ldyBFcnJvcigiQ2xvbmluZyBjdXN0b20gZWZmZWN0cyBpcyBub3Qgc3VwcG9ydGVkLiIpO3ZhciBiPW5ldyBLZXlmcmFtZUVmZmVjdCh0aGlzLnRhcmdldCxbXSxhLmNsb25lVGltaW5nSW5wdXQodGhpcy5fdGltaW5nSW5wdXQpLHRoaXMuX2lkKTtyZXR1cm4gYi5fbm9ybWFsaXplZEtleWZyYW1lcz10aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLGIuX2tleWZyYW1lcz10aGlzLl9rZXlmcmFtZXMsYn0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX07dmFyIGc9RWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTtFbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGIudGltZWxpbmUuX3BsYXkobmV3IGIuS2V5ZnJhbWVFZmZlY3QodGhpcyxhLGMsZCkpfTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKTtiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXtpZihhKXt2YXIgYj1hLnRhcmdldHx8aCxjPWEuX2tleWZyYW1lczsiZnVuY3Rpb24iPT10eXBlb2YgYyYmKGM9W10pO3ZhciBkPWEuX3RpbWluZ0lucHV0O2QuaWQ9YS5faWR9ZWxzZSB2YXIgYj1oLGM9W10sZD0wO3JldHVybiBnLmFwcGx5KGIsW2MsZF0pfSxiLmJpbmRBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXthLmVmZmVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZWZmZWN0Ll9ub3JtYWxpemVkS2V5ZnJhbWVzJiZiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3QoYSl9O3ZhciBpPVtdO2IuYXdhaXRTdGFydFRpbWU9ZnVuY3Rpb24oYSl7bnVsbD09PWEuc3RhcnRUaW1lJiZhLl9pc0dyb3VwJiYoMD09aS5sZW5ndGgmJnJlcXVlc3RBbmltYXRpb25GcmFtZShlKSxpLnB1c2goYSkpfTt2YXIgaj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZTtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJnZXRDb21wdXRlZFN0eWxlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpO3ZhciBhPWouYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBlKCkmJihhPWouYXBwbHkodGhpcyxhcmd1bWVudHMpKSx3aW5kb3cuZG9jdW1lbnQudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpLGF9fSksd2luZG93LktleWZyYW1lRWZmZWN0PWIuS2V5ZnJhbWVFZmZlY3Qsd2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEFuaW1hdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQudGltZWxpbmUuZ2V0QW5pbWF0aW9ucygpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9PWEuZWZmZWN0JiZhLmVmZmVjdC50YXJnZXQ9PXRoaXN9LmJpbmQodGhpcykpfX0oYyxlLGYpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2EuX3JlZ2lzdGVyZWR8fChhLl9yZWdpc3RlcmVkPSEwLGcucHVzaChhKSxofHwoaD0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSkpKX1mdW5jdGlvbiBlKGEpe3ZhciBiPWc7Zz1bXSxiLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5fc2VxdWVuY2VOdW1iZXItYi5fc2VxdWVuY2VOdW1iZXJ9KSxiPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe2EoKTt2YXIgYj1hLl9hbmltYXRpb24/YS5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSI7cmV0dXJuInJ1bm5pbmciIT1iJiYicGVuZGluZyIhPWImJihhLl9yZWdpc3RlcmVkPSExKSxhLl9yZWdpc3RlcmVkfSksZy5wdXNoLmFwcGx5KGcsYiksZy5sZW5ndGg/KGg9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpKTpoPSExfXZhciBmPShkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKSwwKTtiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3Q9ZnVuY3Rpb24oYil7dmFyIGMsZT1iLmVmZmVjdC50YXJnZXQsZz0iZnVuY3Rpb24iPT10eXBlb2YgYi5lZmZlY3QuZ2V0RnJhbWVzKCk7Yz1nP2IuZWZmZWN0LmdldEZyYW1lcygpOmIuZWZmZWN0Ll9vbnNhbXBsZTt2YXIgaD1iLmVmZmVjdC50aW1pbmcsaT1udWxsO2g9YS5ub3JtYWxpemVUaW1pbmdJbnB1dChoKTt2YXIgaj1mdW5jdGlvbigpe3ZhciBkPWouX2FuaW1hdGlvbj9qLl9hbmltYXRpb24uY3VycmVudFRpbWU6bnVsbDtudWxsIT09ZCYmKGQ9YS5jYWxjdWxhdGVUaW1lRnJhY3Rpb24oYS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihoKSxkLGgpLGlzTmFOKGQpJiYoZD1udWxsKSksZCE9PWkmJihnP2MoZCxlLGIuZWZmZWN0KTpjKGQsYi5lZmZlY3QsYi5lZmZlY3QuX2FuaW1hdGlvbikpLGk9ZH07ai5fYW5pbWF0aW9uPWIsai5fcmVnaXN0ZXJlZD0hMSxqLl9zZXF1ZW5jZU51bWJlcj1mKyssYi5fY2FsbGJhY2s9aixkKGopfTt2YXIgZz1bXSxoPSExO2IuQW5pbWF0aW9uLnByb3RvdHlwZS5fcmVnaXN0ZXI9ZnVuY3Rpb24oKXt0aGlzLl9jYWxsYmFjayYmZCh0aGlzLl9jYWxsYmFjayl9fShjLGUsZiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuIGEuX3RpbWluZy5kZWxheSthLmFjdGl2ZUR1cmF0aW9uK2EuX3RpbWluZy5lbmREZWxheX1mdW5jdGlvbiBlKGIsYyxkKXt0aGlzLl9pZD1kLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49Ynx8W10sdGhpcy5fcmVwYXJlbnQodGhpcy5jaGlsZHJlbiksYz1hLm51bWVyaWNUaW1pbmdUb09iamVjdChjKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoYyksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYywhMCksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGMsITAsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJhdXRvIj09PXRoaXMuX3RpbWluZy5kdXJhdGlvbiYmKHRoaXMuX3RpbWluZy5kdXJhdGlvbj10aGlzLmFjdGl2ZUR1cmF0aW9uKX13aW5kb3cuU2VxdWVuY2VFZmZlY3Q9ZnVuY3Rpb24oKXtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sd2luZG93Lkdyb3VwRWZmZWN0PWZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlPXtfaXNBbmNlc3RvcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcztudWxsIT09Yjspe2lmKGI9PWEpcmV0dXJuITA7Yj1iLl9wYXJlbnR9cmV0dXJuITF9LF9yZWJ1aWxkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXM7YTspImF1dG8iPT09YS50aW1pbmcuZHVyYXRpb24mJihhLl90aW1pbmcuZHVyYXRpb249YS5hY3RpdmVEdXJhdGlvbiksYT1hLl9wYXJlbnQ7dGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LF9yZXBhcmVudDpmdW5jdGlvbihhKXtiLnJlbW92ZU11bHRpKGEpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uX3BhcmVudD10aGlzfSxfcHV0Q2hpbGQ6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yj8iQ2Fubm90IGFwcGVuZCBhbiBhbmNlc3RvciBvciBzZWxmIjoiQ2Fubm90IHByZXBlbmQgYW4gYW5jZXN0b3Igb3Igc2VsZiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKHRoaXMuX2lzQW5jZXN0b3IoYVtkXSkpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLG5hbWU6IkhpZXJhcmNoeVJlcXVlc3RFcnJvciIsbWVzc2FnZTpjfTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyliP3RoaXMuY2hpbGRyZW4ucHVzaChhW2RdKTp0aGlzLmNoaWxkcmVuLnVuc2hpZnQoYVtkXSk7dGhpcy5fcmVwYXJlbnQoYSksdGhpcy5fcmVidWlsZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXt0aGlzLl9wdXRDaGlsZChhcmd1bWVudHMsITApfSxwcmVwZW5kOmZ1bmN0aW9uKCl7dGhpcy5fcHV0Q2hpbGQoYXJndW1lbnRzLCExKX0sZ2V0IHBhcmVudCgpe3JldHVybiB0aGlzLl9wYXJlbnR9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoP3RoaXMuY2hpbGRyZW5bMF06bnVsbH0sZ2V0IGxhc3RDaGlsZCgpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD90aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoLTFdOm51bGx9LGNsb25lOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWEuY2xvbmVUaW1pbmdJbnB1dCh0aGlzLl90aW1pbmdJbnB1dCksYz1bXSxkPTA7ZDx0aGlzLmNoaWxkcmVuLmxlbmd0aDtkKyspYy5wdXNoKHRoaXMuY2hpbGRyZW5bZF0uY2xvbmUoKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBHcm91cEVmZmVjdD9uZXcgR3JvdXBFZmZlY3QoYyxiKTpuZXcgU2VxdWVuY2VFZmZlY3QoYyxiKX0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX0sd2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YSs9ZChiKX0pLE1hdGgubWF4KGEsMCl9fSksd2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YT1NYXRoLm1heChhLGQoYikpfSksYX19KSxiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JHcm91cD1mdW5jdGlvbihjKXt2YXIgZCxlPW51bGwsZj1mdW5jdGlvbihiKXt2YXIgYz1kLl93cmFwcGVyO3JldHVybiBjJiYicGVuZGluZyIhPWMucGxheVN0YXRlJiZjLmVmZmVjdD9udWxsPT1iP3ZvaWQgYy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCk6MD09YiYmYy5wbGF5YmFja1JhdGU8MCYmKGV8fChlPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy5lZmZlY3QudGltaW5nKSksYj1hLmNhbGN1bGF0ZVRpbWVGcmFjdGlvbihhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGUpLC0xLGUpLGlzTmFOKGIpfHxudWxsPT1iKT8oYy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EuY3VycmVudFRpbWU9LTF9KSx2b2lkIGMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpKTp2b2lkIDA6dm9pZCAwfSxnPW5ldyBLZXlmcmFtZUVmZmVjdChudWxsLFtdLGMuX3RpbWluZyxjLl9pZCk7cmV0dXJuIGcub25zYW1wbGU9ZixkPWIudGltZWxpbmUuX3BsYXkoZyl9LGIuYmluZEFuaW1hdGlvbkZvckdyb3VwPWZ1bmN0aW9uKGEpe2EuX2FuaW1hdGlvbi5fd3JhcHBlcj1hLGEuX2lzR3JvdXA9ITAsYi5hd2FpdFN0YXJ0VGltZShhKSxhLl9jb25zdHJ1Y3RDaGlsZEFuaW1hdGlvbnMoKSxhLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sYi5ncm91cENoaWxkRHVyYXRpb249ZH0oYyxlLGYpLGJbInRydWUiXT1hfSh7fSxmdW5jdGlvbigpe3JldHVybiB0aGlzfSgpKTsKCi8qKgpAbGljZW5zZSBAbm9jb21waWxlCkNvcHlyaWdodCAoYykgMjAxOCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuClRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CkNvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCnN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiovCihmdW5jdGlvbigpey8qCgogQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwondXNlIHN0cmljdCc7dmFyIG4scD0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93PT09dGhpcz90aGlzOiJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsJiZudWxsIT1nbG9iYWw/Z2xvYmFsOnRoaXMsYWE9ImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzP09iamVjdC5kZWZpbmVQcm9wZXJ0eTpmdW5jdGlvbihhLGIsYyl7YSE9QXJyYXkucHJvdG90eXBlJiZhIT1PYmplY3QucHJvdG90eXBlJiYoYVtiXT1jLnZhbHVlKX07ZnVuY3Rpb24gYmEoKXtiYT1mdW5jdGlvbigpe307cC5TeW1ib2x8fChwLlN5bWJvbD1jYSl9dmFyIGNhPWZ1bmN0aW9uKCl7dmFyIGE9MDtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuImpzY29tcF9zeW1ib2xfIisoYnx8IiIpK2ErK319KCk7CmZ1bmN0aW9uIGRhKCl7YmEoKTt2YXIgYT1wLlN5bWJvbC5pdGVyYXRvcjthfHwoYT1wLlN5bWJvbC5pdGVyYXRvcj1wLlN5bWJvbCgiaXRlcmF0b3IiKSk7ImZ1bmN0aW9uIiE9dHlwZW9mIEFycmF5LnByb3RvdHlwZVthXSYmYWEoQXJyYXkucHJvdG90eXBlLGEse2NvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBlYSh0aGlzKX19KTtkYT1mdW5jdGlvbigpe319ZnVuY3Rpb24gZWEoYSl7dmFyIGI9MDtyZXR1cm4gZmEoZnVuY3Rpb24oKXtyZXR1cm4gYjxhLmxlbmd0aD97ZG9uZTohMSx2YWx1ZTphW2IrK119Ontkb25lOiEwfX0pfWZ1bmN0aW9uIGZhKGEpe2RhKCk7YT17bmV4dDphfTthW3AuU3ltYm9sLml0ZXJhdG9yXT1mdW5jdGlvbigpe3JldHVybiB0aGlzfTtyZXR1cm4gYX1mdW5jdGlvbiBpYShhKXtkYSgpO3ZhciBiPWFbU3ltYm9sLml0ZXJhdG9yXTtyZXR1cm4gYj9iLmNhbGwoYSk6ZWEoYSl9CmZ1bmN0aW9uIGphKGEpe2Zvcih2YXIgYixjPVtdOyEoYj1hLm5leHQoKSkuZG9uZTspYy5wdXNoKGIudmFsdWUpO3JldHVybiBjfQooZnVuY3Rpb24oKXtpZighZnVuY3Rpb24oKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTthLmluaXRFdmVudCgiZm9vIiwhMCwhMCk7YS5wcmV2ZW50RGVmYXVsdCgpO3JldHVybiBhLmRlZmF1bHRQcmV2ZW50ZWR9KCkpe3ZhciBhPUV2ZW50LnByb3RvdHlwZS5wcmV2ZW50RGVmYXVsdDtFdmVudC5wcm90b3R5cGUucHJldmVudERlZmF1bHQ9ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbGFibGUmJihhLmNhbGwodGhpcyksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImRlZmF1bHRQcmV2ZW50ZWQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sY29uZmlndXJhYmxlOiEwfSkpfX12YXIgYj0vVHJpZGVudC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtpZighd2luZG93LkN1c3RvbUV2ZW50fHxiJiYiZnVuY3Rpb24iIT09dHlwZW9mIHdpbmRvdy5DdXN0b21FdmVudCl3aW5kb3cuQ3VzdG9tRXZlbnQ9ZnVuY3Rpb24oYSxiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpOwpjLmluaXRDdXN0b21FdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIuZGV0YWlsKTtyZXR1cm4gY30sd2luZG93LkN1c3RvbUV2ZW50LnByb3RvdHlwZT13aW5kb3cuRXZlbnQucHJvdG90eXBlO2lmKCF3aW5kb3cuRXZlbnR8fGImJiJmdW5jdGlvbiIhPT10eXBlb2Ygd2luZG93LkV2ZW50KXt2YXIgYz13aW5kb3cuRXZlbnQ7d2luZG93LkV2ZW50PWZ1bmN0aW9uKGEsYil7Yj1ifHx7fTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTtjLmluaXRFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlKTtyZXR1cm4gY307aWYoYylmb3IodmFyIGQgaW4gYyl3aW5kb3cuRXZlbnRbZF09Y1tkXTt3aW5kb3cuRXZlbnQucHJvdG90eXBlPWMucHJvdG90eXBlfWlmKCF3aW5kb3cuTW91c2VFdmVudHx8YiYmImZ1bmN0aW9uIiE9PXR5cGVvZiB3aW5kb3cuTW91c2VFdmVudCl7Yj13aW5kb3cuTW91c2VFdmVudDt3aW5kb3cuTW91c2VFdmVudD1mdW5jdGlvbihhLApiKXtiPWJ8fHt9O3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJNb3VzZUV2ZW50Iik7Yy5pbml0TW91c2VFdmVudChhLCEhYi5idWJibGVzLCEhYi5jYW5jZWxhYmxlLGIudmlld3x8d2luZG93LGIuZGV0YWlsLGIuc2NyZWVuWCxiLnNjcmVlblksYi5jbGllbnRYLGIuY2xpZW50WSxiLmN0cmxLZXksYi5hbHRLZXksYi5zaGlmdEtleSxiLm1ldGFLZXksYi5idXR0b24sYi5yZWxhdGVkVGFyZ2V0KTtyZXR1cm4gY307aWYoYilmb3IoZCBpbiBiKXdpbmRvdy5Nb3VzZUV2ZW50W2RdPWJbZF07d2luZG93Lk1vdXNlRXZlbnQucHJvdG90eXBlPWIucHJvdG90eXBlfUFycmF5LmZyb218fChBcnJheS5mcm9tPWZ1bmN0aW9uKGEpe3JldHVybltdLnNsaWNlLmNhbGwoYSl9KTtPYmplY3QuYXNzaWdufHwoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihhLGIpe2Zvcih2YXIgYz1bXS5zbGljZS5jYWxsKGFyZ3VtZW50cywxKSxkPTAsZTtkPGMubGVuZ3RoO2QrKylpZihlPWNbZF0pZm9yKHZhciBmPQphLG09ZSxxPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKG0pLHg9MDt4PHEubGVuZ3RoO3grKyllPXFbeF0sZltlXT1tW2VdO3JldHVybiBhfSl9KSh3aW5kb3cuV2ViQ29tcG9uZW50cyk7KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe31mdW5jdGlvbiBiKGEsYil7aWYoIWEuY2hpbGROb2Rlcy5sZW5ndGgpcmV0dXJuW107c3dpdGNoKGEubm9kZVR5cGUpe2Nhc2UgTm9kZS5ET0NVTUVOVF9OT0RFOnJldHVybiB1YS5jYWxsKGEsYik7Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6cmV0dXJuIGxiLmNhbGwoYSxiKTtkZWZhdWx0OnJldHVybiBVLmNhbGwoYSxiKX19dmFyIGM9InVuZGVmaW5lZCI9PT10eXBlb2YgSFRNTFRlbXBsYXRlRWxlbWVudCxkPSEoZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLmNsb25lTm9kZSgpaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KSxlPSExOy9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpJiZmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3IodmFyIGQ7ZD1hLmZpcnN0Q2hpbGQ7KWMuY2FsbCh0aGlzLGQsYik7ZWxzZSBjLmNhbGwodGhpcywKYSxiKTtyZXR1cm4gYX1lPSEwO3ZhciBiPU5vZGUucHJvdG90eXBlLmNsb25lTm9kZTtOb2RlLnByb3RvdHlwZS5jbG9uZU5vZGU9ZnVuY3Rpb24oYSl7YT1iLmNhbGwodGhpcyxhKTt0aGlzIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKGEuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gYX07RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbD1IVE1MRWxlbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbDtEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yPUhUTUxFbGVtZW50LnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLHtub2RlVHlwZTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERX0sY29uZmlndXJhYmxlOiEwfSxsb2NhbE5hbWU6e2dldDpmdW5jdGlvbigpe30sCmNvbmZpZ3VyYWJsZTohMH0sbm9kZU5hbWU6e2dldDpmdW5jdGlvbigpe3JldHVybiIjZG9jdW1lbnQtZnJhZ21lbnQifSxjb25maWd1cmFibGU6ITB9fSk7dmFyIGM9Tm9kZS5wcm90b3R5cGUuaW5zZXJ0QmVmb3JlO05vZGUucHJvdG90eXBlLmluc2VydEJlZm9yZT1hO3ZhciBkPU5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkO05vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkPWZ1bmN0aW9uKGIpe2IgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P2EuY2FsbCh0aGlzLGIsbnVsbCk6ZC5jYWxsKHRoaXMsYik7cmV0dXJuIGJ9O3ZhciBmPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGc9Tm9kZS5wcm90b3R5cGUucmVwbGFjZUNoaWxkO05vZGUucHJvdG90eXBlLnJlcGxhY2VDaGlsZD1mdW5jdGlvbihiLGMpe2IgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50PyhhLmNhbGwodGhpcyxiLGMpLGYuY2FsbCh0aGlzLGMpKTpnLmNhbGwodGhpcyxiLGMpO3JldHVybiBjfTtEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudD0KZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNyZWF0ZUVsZW1lbnQoImRmIik7YS5fX3Byb3RvX189RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGU7cmV0dXJuIGF9O3ZhciBoPURvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlO0RvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7Yj1oLmNhbGwodGhpcyxhLGJ8fCExKTthIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCYmKGIuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlKTtyZXR1cm4gYn19KCk7dmFyIGY9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlLGc9RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsaD1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZSxrPU5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLGw9Tm9kZS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQsbT1Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQscT1ET01QYXJzZXIucHJvdG90eXBlLnBhcnNlRnJvbVN0cmluZywKeD1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHdpbmRvdy5IVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpfHx7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5pbm5lckhUTUw9YX19LE09T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsImNoaWxkTm9kZXMiKXx8e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9fSxVPUVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsdWE9RG9jdW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwsbGI9RG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucXVlcnlTZWxlY3RvckFsbCxtYj1mdW5jdGlvbigpe2lmKCFjKXt2YXIgYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpLGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtiLmNvbnRlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwphLmNvbnRlbnQuYXBwZW5kQ2hpbGQoYik7YT1hLmNsb25lTm9kZSghMCk7cmV0dXJuIDA9PT1hLmNvbnRlbnQuY2hpbGROb2Rlcy5sZW5ndGh8fDA9PT1hLmNvbnRlbnQuZmlyc3RDaGlsZC5jb250ZW50LmNoaWxkTm9kZXMubGVuZ3RofHxkfX0oKTtpZihjKXt2YXIgUz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoInRlbXBsYXRlIiksQz0hMCxWPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7Vi50ZXh0Q29udGVudD0idGVtcGxhdGV7ZGlzcGxheTpub25lO30iO3ZhciBoYT1kb2N1bWVudC5oZWFkO2hhLmluc2VydEJlZm9yZShWLGhhLmZpcnN0RWxlbWVudENoaWxkKTthLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEhUTUxFbGVtZW50LnByb3RvdHlwZSk7dmFyIHZhPSFkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5oYXNPd25Qcm9wZXJ0eSgiaW5uZXJIVE1MIik7YS5HPWZ1bmN0aW9uKGIpe2lmKCFiLmNvbnRlbnQmJmIubmFtZXNwYWNlVVJJPT09CmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkpe2IuY29udGVudD1TLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTtmb3IodmFyIGM7Yz1iLmZpcnN0Q2hpbGQ7KWwuY2FsbChiLmNvbnRlbnQsYyk7aWYodmEpYi5fX3Byb3RvX189YS5wcm90b3R5cGU7ZWxzZSBpZihiLmNsb25lTm9kZT1mdW5jdGlvbihiKXtyZXR1cm4gYS5hKHRoaXMsYil9LEMpdHJ5e1AoYiksVyhiKX1jYXRjaChUZyl7Qz0hMX1hLkMoYi5jb250ZW50KX19O3ZhciBYPXtvcHRpb246WyJzZWxlY3QiXSx0aGVhZDpbInRhYmxlIl0sY29sOlsiY29sZ3JvdXAiLCJ0YWJsZSJdLHRyOlsidGJvZHkiLCJ0YWJsZSJdLHRoOlsidHIiLCJ0Ym9keSIsInRhYmxlIl0sdGQ6WyJ0ciIsInRib2R5IiwidGFibGUiXX0sUD1mdW5jdGlvbihiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYiwiaW5uZXJIVE1MIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIG5iKHRoaXMpfSxzZXQ6ZnVuY3Rpb24oYil7dmFyIGM9WFsoLzwoW2Etel1bXi9cMD5ceDIwXHRcclxuXGZdKykvaS5leGVjKGIpfHwKWyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV07aWYoYylmb3IodmFyIGQ9MDtkPGMubGVuZ3RoO2QrKyliPSI8IitjW2RdKyI+IitiKyI8LyIrY1tkXSsiPiI7Uy5ib2R5LmlubmVySFRNTD1iO2ZvcihhLkMoUyk7dGhpcy5jb250ZW50LmZpcnN0Q2hpbGQ7KWsuY2FsbCh0aGlzLmNvbnRlbnQsdGhpcy5jb250ZW50LmZpcnN0Q2hpbGQpO2I9Uy5ib2R5O2lmKGMpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKyliPWIubGFzdENoaWxkO2Zvcig7Yi5maXJzdENoaWxkOylsLmNhbGwodGhpcy5jb250ZW50LGIuZmlyc3RDaGlsZCl9LGNvbmZpZ3VyYWJsZTohMH0pfSxXPWZ1bmN0aW9uKGEpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJvdXRlckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4iPHRlbXBsYXRlPiIrdGhpcy5pbm5lckhUTUwrIjwvdGVtcGxhdGU+In0sc2V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMucGFyZW50Tm9kZSl7Uy5ib2R5LmlubmVySFRNTD1hO2ZvcihhPXRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7Uy5ib2R5LmZpcnN0Q2hpbGQ7KWwuY2FsbChhLApTLmJvZHkuZmlyc3RDaGlsZCk7bS5jYWxsKHRoaXMucGFyZW50Tm9kZSxhLHRoaXMpfWVsc2UgdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBzZXQgdGhlICdvdXRlckhUTUwnIHByb3BlcnR5IG9uICdFbGVtZW50JzogVGhpcyBlbGVtZW50IGhhcyBubyBwYXJlbnQgbm9kZS4iKTt9LGNvbmZpZ3VyYWJsZTohMH0pfTtQKGEucHJvdG90eXBlKTtXKGEucHJvdG90eXBlKTthLkM9ZnVuY3Rpb24oYyl7Yz1iKGMsInRlbXBsYXRlIik7Zm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmO2Q8ZSYmKGY9Y1tkXSk7ZCsrKWEuRyhmKX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsZnVuY3Rpb24oKXthLkMoZG9jdW1lbnQpfSk7RG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24oKXt2YXIgYj1nLmFwcGx5KHRoaXMsYXJndW1lbnRzKTsidGVtcGxhdGUiPT09Yi5sb2NhbE5hbWUmJmEuRyhiKTtyZXR1cm4gYn07RE9NUGFyc2VyLnByb3RvdHlwZS5wYXJzZUZyb21TdHJpbmc9CmZ1bmN0aW9uKCl7dmFyIGI9cS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7YS5DKGIpO3JldHVybiBifTtPYmplY3QuZGVmaW5lUHJvcGVydHkoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmIodGhpcyl9LHNldDpmdW5jdGlvbihiKXt4LnNldC5jYWxsKHRoaXMsYik7YS5DKHRoaXMpfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO3ZhciBWZT0vWyZcdTAwQTAiXS9nLHljPS9bJlx1MDBBMDw+XS9nLHpjPWZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlICImIjpyZXR1cm4iJmFtcDsiO2Nhc2UgIjwiOnJldHVybiImbHQ7IjtjYXNlICI+IjpyZXR1cm4iJmd0OyI7Y2FzZSAnIic6cmV0dXJuIiZxdW90OyI7Y2FzZSAiXHUwMGEwIjpyZXR1cm4iJm5ic3A7In19O1Y9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXt9LGM9MDtjPGEubGVuZ3RoO2MrKyliW2FbY11dPSEwO3JldHVybiBifTt2YXIgV2U9VigiYXJlYSBiYXNlIGJyIGNvbCBjb21tYW5kIGVtYmVkIGhyIGltZyBpbnB1dCBrZXlnZW4gbGluayBtZXRhIHBhcmFtIHNvdXJjZSB0cmFjayB3YnIiLnNwbGl0KCIgIikpLApYZT1WKCJzdHlsZSBzY3JpcHQgeG1wIGlmcmFtZSBub2VtYmVkIG5vZnJhbWVzIHBsYWludGV4dCBub3NjcmlwdCIuc3BsaXQoIiAiKSksbmI9ZnVuY3Rpb24oYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOk0uZ2V0LmNhbGwoYSksZT0wLGY9ZC5sZW5ndGgsZztlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hO3ZhciBsPWI7c3dpdGNoKGgubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Zm9yKHZhciBQPWgubG9jYWxOYW1lLG09IjwiK1AsVz1oLmF0dHJpYnV0ZXMscT0wO2s9V1txXTtxKyspbSs9IiAiK2submFtZSsnPSInK2sudmFsdWUucmVwbGFjZShWZSx6YykrJyInO20rPSI+IjtoPVdlW1BdP206bStuYihoLGwpKyI8LyIrUCsiPiI7YnJlYWsgYTtjYXNlIE5vZGUuVEVYVF9OT0RFOmg9aC5kYXRhO2g9ayYmWGVbay5sb2NhbE5hbWVdP2g6aC5yZXBsYWNlKHljLHpjKTticmVhayBhOwpjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksRXJyb3IoIm5vdCBpbXBsZW1lbnRlZCIpO319Yys9aH1yZXR1cm4gY319aWYoY3x8bWIpe2EuYT1mdW5jdGlvbihhLGIpe3ZhciBjPWYuY2FsbChhLCExKTt0aGlzLkcmJnRoaXMuRyhjKTtiJiYobC5jYWxsKGMuY29udGVudCxmLmNhbGwoYS5jb250ZW50LCEwKSksb2IoYy5jb250ZW50LGEuY29udGVudCkpO3JldHVybiBjfTt2YXIgb2I9ZnVuY3Rpb24oYyxkKXtpZihkLnF1ZXJ5U2VsZWN0b3JBbGwmJihkPWIoZCwidGVtcGxhdGUiKSwwIT09ZC5sZW5ndGgpKXtjPWIoYywidGVtcGxhdGUiKTtmb3IodmFyIGU9MCxmPWMubGVuZ3RoLGcsaDtlPGY7ZSsrKWg9ZFtlXSxnPWNbZV0sYSYmYS5HJiZhLkcoaCksbS5jYWxsKGcucGFyZW50Tm9kZSxZZS5jYWxsKGgsITApLGcpfX0sWWU9Tm9kZS5wcm90b3R5cGUuY2xvbmVOb2RlPQpmdW5jdGlvbihiKXtpZighZSYmZCYmdGhpcyBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpaWYoYil2YXIgYz1aZS5jYWxsKHRoaXMub3duZXJEb2N1bWVudCx0aGlzLCEwKTtlbHNlIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2Vsc2UgdGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiYidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUmJnRoaXMubmFtZXNwYWNlVVJJPT1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJP2M9YS5hKHRoaXMsYik6Yz1mLmNhbGwodGhpcyxiKTtiJiZvYihjLHRoaXMpO3JldHVybiBjfSxaZT1Eb2N1bWVudC5wcm90b3R5cGUuaW1wb3J0Tm9kZT1mdW5jdGlvbihjLGQpe2Q9ZHx8ITE7aWYoInRlbXBsYXRlIj09PWMubG9jYWxOYW1lKXJldHVybiBhLmEoYyxkKTt2YXIgZT1oLmNhbGwodGhpcyxjLGQpO2lmKGQpe29iKGUsYyk7Yz1iKGUsJ3NjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXScpOwpmb3IodmFyIGYsaz0wO2s8Yy5sZW5ndGg7aysrKXtmPWNba107ZD1nLmNhbGwoZG9jdW1lbnQsInNjcmlwdCIpO2QudGV4dENvbnRlbnQ9Zi50ZXh0Q29udGVudDtmb3IodmFyIGw9Zi5hdHRyaWJ1dGVzLFA9MCxXO1A8bC5sZW5ndGg7UCsrKVc9bFtQXSxkLnNldEF0dHJpYnV0ZShXLm5hbWUsVy52YWx1ZSk7bS5jYWxsKGYucGFyZW50Tm9kZSxkLGYpfX1yZXR1cm4gZX19YyYmKHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50PWEpfSkoKTt2YXIga2E9c2V0VGltZW91dDtmdW5jdGlvbiBsYSgpe31mdW5jdGlvbiBtYShhLGIpe3JldHVybiBmdW5jdGlvbigpe2EuYXBwbHkoYixhcmd1bWVudHMpfX1mdW5jdGlvbiByKGEpe2lmKCEodGhpcyBpbnN0YW5jZW9mIHIpKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2VzIG11c3QgYmUgY29uc3RydWN0ZWQgdmlhIG5ldyIpO2lmKCJmdW5jdGlvbiIhPT10eXBlb2YgYSl0aHJvdyBuZXcgVHlwZUVycm9yKCJub3QgYSBmdW5jdGlvbiIpO3RoaXMudT0wO3RoaXMubWE9ITE7dGhpcy5oPXZvaWQgMDt0aGlzLkk9W107bmEoYSx0aGlzKX0KZnVuY3Rpb24gb2EoYSxiKXtmb3IoOzM9PT1hLnU7KWE9YS5oOzA9PT1hLnU/YS5JLnB1c2goYik6KGEubWE9ITAscGEoZnVuY3Rpb24oKXt2YXIgYz0xPT09YS51P2IuTmE6Yi5PYTtpZihudWxsPT09YykoMT09PWEudT9xYTpyYSkoYi5nYSxhLmgpO2Vsc2V7dHJ5e3ZhciBkPWMoYS5oKX1jYXRjaChlKXtyYShiLmdhLGUpO3JldHVybn1xYShiLmdhLGQpfX0pKX1mdW5jdGlvbiBxYShhLGIpe3RyeXtpZihiPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJBIHByb21pc2UgY2Fubm90IGJlIHJlc29sdmVkIHdpdGggaXRzZWxmLiIpO2lmKGImJigib2JqZWN0Ij09PXR5cGVvZiBifHwiZnVuY3Rpb24iPT09dHlwZW9mIGIpKXt2YXIgYz1iLnRoZW47aWYoYiBpbnN0YW5jZW9mIHIpe2EudT0zO2EuaD1iO3NhKGEpO3JldHVybn1pZigiZnVuY3Rpb24iPT09dHlwZW9mIGMpe25hKG1hKGMsYiksYSk7cmV0dXJufX1hLnU9MTthLmg9YjtzYShhKX1jYXRjaChkKXtyYShhLGQpfX0KZnVuY3Rpb24gcmEoYSxiKXthLnU9MjthLmg9YjtzYShhKX1mdW5jdGlvbiBzYShhKXsyPT09YS51JiYwPT09YS5JLmxlbmd0aCYmcGEoZnVuY3Rpb24oKXthLm1hfHwidW5kZWZpbmVkIiE9PXR5cGVvZiBjb25zb2xlJiZjb25zb2xlJiZjb25zb2xlLndhcm4oIlBvc3NpYmxlIFVuaGFuZGxlZCBQcm9taXNlIFJlamVjdGlvbjoiLGEuaCl9KTtmb3IodmFyIGI9MCxjPWEuSS5sZW5ndGg7YjxjO2IrKylvYShhLGEuSVtiXSk7YS5JPW51bGx9ZnVuY3Rpb24gdGEoYSxiLGMpe3RoaXMuTmE9ImZ1bmN0aW9uIj09PXR5cGVvZiBhP2E6bnVsbDt0aGlzLk9hPSJmdW5jdGlvbiI9PT10eXBlb2YgYj9iOm51bGw7dGhpcy5nYT1jfWZ1bmN0aW9uIG5hKGEsYil7dmFyIGM9ITE7dHJ5e2EoZnVuY3Rpb24oYSl7Y3x8KGM9ITAscWEoYixhKSl9LGZ1bmN0aW9uKGEpe2N8fChjPSEwLHJhKGIsYSkpfSl9Y2F0Y2goZCl7Y3x8KGM9ITAscmEoYixkKSl9fQpyLnByb3RvdHlwZVsiY2F0Y2giXT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50aGVuKG51bGwsYSl9O3IucHJvdG90eXBlLnRoZW49ZnVuY3Rpb24oYSxiKXt2YXIgYz1uZXcgdGhpcy5jb25zdHJ1Y3RvcihsYSk7b2EodGhpcyxuZXcgdGEoYSxiLGMpKTtyZXR1cm4gY307ci5wcm90b3R5cGVbImZpbmFsbHkiXT1mdW5jdGlvbihhKXt2YXIgYj10aGlzLmNvbnN0cnVjdG9yO3JldHVybiB0aGlzLnRoZW4oZnVuY3Rpb24oYyl7cmV0dXJuIGIucmVzb2x2ZShhKCkpLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gY30pfSxmdW5jdGlvbihjKXtyZXR1cm4gYi5yZXNvbHZlKGEoKSkudGhlbihmdW5jdGlvbigpe3JldHVybiBiLnJlamVjdChjKX0pfSl9OwpmdW5jdGlvbiB3YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtmdW5jdGlvbiBkKGEsZyl7dHJ5e2lmKGcmJigib2JqZWN0Ij09PXR5cGVvZiBnfHwiZnVuY3Rpb24iPT09dHlwZW9mIGcpKXt2YXIgaD1nLnRoZW47aWYoImZ1bmN0aW9uIj09PXR5cGVvZiBoKXtoLmNhbGwoZyxmdW5jdGlvbihiKXtkKGEsYil9LGMpO3JldHVybn19ZVthXT1nOzA9PT0tLWYmJmIoZSl9Y2F0Y2gobSl7YyhtKX19aWYoIWF8fCJ1bmRlZmluZWQiPT09dHlwZW9mIGEubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoIlByb21pc2UuYWxsIGFjY2VwdHMgYW4gYXJyYXkiKTt2YXIgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhKTtpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGIoW10pO2Zvcih2YXIgZj1lLmxlbmd0aCxnPTA7ZzxlLmxlbmd0aDtnKyspZChnLGVbZ10pfSl9CmZ1bmN0aW9uIHhhKGEpe3JldHVybiBhJiYib2JqZWN0Ij09PXR5cGVvZiBhJiZhLmNvbnN0cnVjdG9yPT09cj9hOm5ldyByKGZ1bmN0aW9uKGIpe2IoYSl9KX1mdW5jdGlvbiB5YShhKXtyZXR1cm4gbmV3IHIoZnVuY3Rpb24oYixjKXtjKGEpfSl9ZnVuY3Rpb24gemEoYSl7cmV0dXJuIG5ldyByKGZ1bmN0aW9uKGIsYyl7Zm9yKHZhciBkPTAsZT1hLmxlbmd0aDtkPGU7ZCsrKWFbZF0udGhlbihiLGMpfSl9dmFyIHBhPSJmdW5jdGlvbiI9PT10eXBlb2Ygc2V0SW1tZWRpYXRlJiZmdW5jdGlvbihhKXtzZXRJbW1lZGlhdGUoYSl9fHxmdW5jdGlvbihhKXtrYShhLDApfTsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KaWYoIXdpbmRvdy5Qcm9taXNlKXt3aW5kb3cuUHJvbWlzZT1yO3IucHJvdG90eXBlLnRoZW49ci5wcm90b3R5cGUudGhlbjtyLmFsbD13YTtyLnJhY2U9emE7ci5yZXNvbHZlPXhhO3IucmVqZWN0PXlhO3ZhciBBYT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiIiksQmE9W107KG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7Zm9yKHZhciBhPUJhLmxlbmd0aCxiPTA7YjxhO2IrKylCYVtiXSgpO0JhLnNwbGljZSgwLGEpfSkpLm9ic2VydmUoQWEse2NoYXJhY3RlckRhdGE6ITB9KTtwYT1mdW5jdGlvbihhKXtCYS5wdXNoKGEpO0FhLnRleHRDb250ZW50PTA8QWEudGV4dENvbnRlbnQubGVuZ3RoPyIiOiJhIn19OyhmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7aWYoImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQpcmV0dXJuIG5ldyBDdXN0b21FdmVudChhLGIpO3ZhciBjPWRvY3VtZW50LmNyZWF0ZUV2ZW50KCJDdXN0b21FdmVudCIpO2MuaW5pdEN1c3RvbUV2ZW50KGEsISFiLmJ1YmJsZXMsISFiLmNhbmNlbGFibGUsYi5kZXRhaWwpO3JldHVybiBjfWZ1bmN0aW9uIGMoYSl7aWYoTSlyZXR1cm4gYS5vd25lckRvY3VtZW50IT09ZG9jdW1lbnQ/YS5vd25lckRvY3VtZW50Om51bGw7dmFyIGI9YS5fX2ltcG9ydERvYztpZighYiYmYS5wYXJlbnROb2RlKXtiPWEucGFyZW50Tm9kZTtpZigiZnVuY3Rpb24iPT09dHlwZW9mIGIuY2xvc2VzdCliPWIuY2xvc2VzdCgibGlua1tyZWw9aW1wb3J0XSIpO2Vsc2UgZm9yKDshaChiKSYmKGI9Yi5wYXJlbnROb2RlKTspO2EuX19pbXBvcnREb2M9Yn1yZXR1cm4gYn1mdW5jdGlvbiBkKGEpe3ZhciBiPW0oZG9jdW1lbnQsImxpbmtbcmVsPWltcG9ydF06bm90KFtpbXBvcnQtZGVwZW5kZW5jeV0pIiksCmM9Yi5sZW5ndGg7Yz9xKGIsZnVuY3Rpb24oYil7cmV0dXJuIGcoYixmdW5jdGlvbigpezA9PT0tLWMmJmEoKX0pfSk6YSgpfWZ1bmN0aW9uIGUoYSl7ZnVuY3Rpb24gYigpeyJsb2FkaW5nIiE9PWRvY3VtZW50LnJlYWR5U3RhdGUmJmRvY3VtZW50LmJvZHkmJihkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIixiKSxhKCkpfWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGIpO2IoKX1mdW5jdGlvbiBmKGEpe2UoZnVuY3Rpb24oKXtyZXR1cm4gZChmdW5jdGlvbigpe3JldHVybiBhJiZhKCl9KX0pfWZ1bmN0aW9uIGcoYSxiKXtpZihhLl9fbG9hZGVkKWImJmIoKTtlbHNlIGlmKCJzY3JpcHQiPT09YS5sb2NhbE5hbWUmJiFhLnNyY3x8InN0eWxlIj09PWEubG9jYWxOYW1lJiYhYS5maXJzdENoaWxkKWEuX19sb2FkZWQ9ITAsYiYmYigpO2Vsc2V7dmFyIGM9ZnVuY3Rpb24oZCl7YS5yZW1vdmVFdmVudExpc3RlbmVyKGQudHlwZSwKYyk7YS5fX2xvYWRlZD0hMDtiJiZiKCl9O2EuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsYyk7aGEmJiJzdHlsZSI9PT1hLmxvY2FsTmFtZXx8YS5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsYyl9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGEubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmImxpbmsiPT09YS5sb2NhbE5hbWUmJiJpbXBvcnQiPT09YS5yZWx9ZnVuY3Rpb24gaygpe3ZhciBhPXRoaXM7dGhpcy5hPXt9O3RoaXMuYj0wO3RoaXMuYz1uZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbihiKXtyZXR1cm4gYS5KYShiKX0pO3RoaXMuYy5vYnNlcnZlKGRvY3VtZW50LmhlYWQse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7dGhpcy5sb2FkSW1wb3J0cyhkb2N1bWVudCl9ZnVuY3Rpb24gbChhKXtxKG0oYSwidGVtcGxhdGUiKSxmdW5jdGlvbihhKXtxKG0oYS5jb250ZW50LCdzY3JpcHQ6bm90KFt0eXBlXSksc2NyaXB0W3R5cGU9ImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0idGV4dC9qYXZhc2NyaXB0Il0sc2NyaXB0W3R5cGU9Im1vZHVsZSJdJyksCmZ1bmN0aW9uKGEpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO3EoYS5hdHRyaWJ1dGVzLGZ1bmN0aW9uKGEpe3JldHVybiBiLnNldEF0dHJpYnV0ZShhLm5hbWUsYS52YWx1ZSl9KTtiLnRleHRDb250ZW50PWEudGV4dENvbnRlbnQ7YS5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChiLGEpfSk7bChhLmNvbnRlbnQpfSl9ZnVuY3Rpb24gbShhLGIpe3JldHVybiBhLmNoaWxkTm9kZXMubGVuZ3RoP2EucXVlcnlTZWxlY3RvckFsbChiKTpVfWZ1bmN0aW9uIHEoYSxiLGMpe3ZhciBkPWE/YS5sZW5ndGg6MCxlPWM/LTE6MTtmb3IoYz1jP2QtMTowO2M8ZCYmMDw9YztjKz1lKWIoYVtjXSxjKX12YXIgeD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaW5rIiksTT0iaW1wb3J0ImluIHgsVT14LnF1ZXJ5U2VsZWN0b3JBbGwoIioiKSx1YT1udWxsOyExPT09ImN1cnJlbnRTY3JpcHQiaW4gZG9jdW1lbnQmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwiY3VycmVudFNjcmlwdCIsCntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdWF8fCgiY29tcGxldGUiIT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9kb2N1bWVudC5zY3JpcHRzW2RvY3VtZW50LnNjcmlwdHMubGVuZ3RoLTFdOm51bGwpfSxjb25maWd1cmFibGU6ITB9KTt2YXIgbGI9Lyh1cmxcKCkoW14pXSopKFwpKS9nLG1iPS8oQGltcG9ydFtcc10rKD8hdXJsXCgpKShbXjtdKikoOykvZyxTPS8oPGxpbmtbXj5dKikocmVsPVsnfCJdP3N0eWxlc2hlZXRbJ3wiXT9bXj5dKj4pL2csQz17RWE6ZnVuY3Rpb24oYSxiKXthLmhyZWYmJmEuc2V0QXR0cmlidXRlKCJocmVmIixDLlgoYS5nZXRBdHRyaWJ1dGUoImhyZWYiKSxiKSk7YS5zcmMmJmEuc2V0QXR0cmlidXRlKCJzcmMiLEMuWChhLmdldEF0dHJpYnV0ZSgic3JjIiksYikpO2lmKCJzdHlsZSI9PT1hLmxvY2FsTmFtZSl7dmFyIGM9Qy5xYShhLnRleHRDb250ZW50LGIsbGIpO2EudGV4dENvbnRlbnQ9Qy5xYShjLGIsbWIpfX0scWE6ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBhLnJlcGxhY2UoYywKZnVuY3Rpb24oYSxjLGQsZSl7YT1kLnJlcGxhY2UoL1siJ10vZywiIik7YiYmKGE9Qy5YKGEsYikpO3JldHVybiBjKyInIithKyInIitlfSl9LFg6ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1DLmFhKXtDLmFhPSExO3RyeXt2YXIgYz1uZXcgVVJMKCJiIiwiaHR0cDovL2EiKTtjLnBhdGhuYW1lPSJjJTIwZCI7Qy5hYT0iaHR0cDovL2EvYyUyMGQiPT09Yy5ocmVmfWNhdGNoKHljKXt9fWlmKEMuYWEpcmV0dXJuKG5ldyBVUkwoYSxiKSkuaHJlZjtjPUMueGE7Y3x8KGM9ZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCJ0ZW1wIiksQy54YT1jLGMuamE9Yy5jcmVhdGVFbGVtZW50KCJiYXNlIiksYy5oZWFkLmFwcGVuZENoaWxkKGMuamEpLGMuaWE9Yy5jcmVhdGVFbGVtZW50KCJhIikpO2MuamEuaHJlZj1iO2MuaWEuaHJlZj1hO3JldHVybiBjLmlhLmhyZWZ8fGF9fSxWPXthc3luYzohMCxsb2FkOmZ1bmN0aW9uKGEsYixjKXtpZihhKWlmKGEubWF0Y2goL15kYXRhOi8pKXthPQphLnNwbGl0KCIsIik7dmFyIGQ9YVsxXTtkPS0xPGFbMF0uaW5kZXhPZigiO2Jhc2U2NCIpP2F0b2IoZCk6ZGVjb2RlVVJJQ29tcG9uZW50KGQpO2IoZCl9ZWxzZXt2YXIgZT1uZXcgWE1MSHR0cFJlcXVlc3Q7ZS5vcGVuKCJHRVQiLGEsVi5hc3luYyk7ZS5vbmxvYWQ9ZnVuY3Rpb24oKXt2YXIgYT1lLnJlc3BvbnNlVVJMfHxlLmdldFJlc3BvbnNlSGVhZGVyKCJMb2NhdGlvbiIpO2EmJjA9PT1hLmluZGV4T2YoIi8iKSYmKGE9KGxvY2F0aW9uLm9yaWdpbnx8bG9jYXRpb24ucHJvdG9jb2wrIi8vIitsb2NhdGlvbi5ob3N0KSthKTt2YXIgZD1lLnJlc3BvbnNlfHxlLnJlc3BvbnNlVGV4dDszMDQ9PT1lLnN0YXR1c3x8MD09PWUuc3RhdHVzfHwyMDA8PWUuc3RhdHVzJiYzMDA+ZS5zdGF0dXM/YihkLGEpOmMoZCl9O2Uuc2VuZCgpfWVsc2UgYygiZXJyb3I6IGhyZWYgbXVzdCBiZSBzcGVjaWZpZWQiKX19LGhhPS9UcmlkZW50Ly50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfHwvRWRnZVwvXGQuL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKay5wcm90b3R5cGUubG9hZEltcG9ydHM9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpczthPW0oYSwibGlua1tyZWw9aW1wb3J0XSIpO3EoYSxmdW5jdGlvbihhKXtyZXR1cm4gYi5nKGEpfSl9O2sucHJvdG90eXBlLmc9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPWEuaHJlZjtpZih2b2lkIDAhPT10aGlzLmFbY10pe3ZhciBkPXRoaXMuYVtjXTtkJiZkLl9fbG9hZGVkJiYoYS5fX2ltcG9ydD1kLHRoaXMuZihhKSl9ZWxzZSB0aGlzLmIrKyx0aGlzLmFbY109InBlbmRpbmciLFYubG9hZChjLGZ1bmN0aW9uKGEsZCl7YT1iLkthKGEsZHx8Yyk7Yi5hW2NdPWE7Yi5iLS07Yi5sb2FkSW1wb3J0cyhhKTtiLmwoKX0sZnVuY3Rpb24oKXtiLmFbY109bnVsbDtiLmItLTtiLmwoKX0pfTtrLnByb3RvdHlwZS5LYT1mdW5jdGlvbihhLGIpe2lmKCFhKXJldHVybiBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7aGEmJihhPWEucmVwbGFjZShTLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4tMT09PQphLmluZGV4T2YoInR5cGU9Iik/YisiIHR5cGU9aW1wb3J0LWRpc2FibGUgIitjOmF9KSk7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtjLmlubmVySFRNTD1hO2lmKGMuY29udGVudClhPWMuY29udGVudCxsKGEpO2Vsc2UgZm9yKGE9ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO2MuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChjLmZpcnN0Q2hpbGQpO2lmKGM9YS5xdWVyeVNlbGVjdG9yKCJiYXNlIikpYj1DLlgoYy5nZXRBdHRyaWJ1dGUoImhyZWYiKSxiKSxjLnJlbW92ZUF0dHJpYnV0ZSgiaHJlZiIpO2M9bShhLCdsaW5rW3JlbD1pbXBvcnRdLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdW3R5cGU9aW1wb3J0LWRpc2FibGVdLHN0eWxlOm5vdChbdHlwZV0pLGxpbmtbcmVsPXN0eWxlc2hlZXRdW2hyZWZdOm5vdChbdHlwZV0pLHNjcmlwdDpub3QoW3R5cGVdKSxzY3JpcHRbdHlwZT0iYXBwbGljYXRpb24vamF2YXNjcmlwdCJdLHNjcmlwdFt0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiXSxzY3JpcHRbdHlwZT0ibW9kdWxlIl0nKTsKdmFyIGQ9MDtxKGMsZnVuY3Rpb24oYSl7ZyhhKTtDLkVhKGEsYik7YS5zZXRBdHRyaWJ1dGUoImltcG9ydC1kZXBlbmRlbmN5IiwiIik7aWYoInNjcmlwdCI9PT1hLmxvY2FsTmFtZSYmIWEuc3JjJiZhLnRleHRDb250ZW50KXtpZigibW9kdWxlIj09PWEudHlwZSl0aHJvdyBFcnJvcigiSW5saW5lIG1vZHVsZSBzY3JpcHRzIGFyZSBub3Qgc3VwcG9ydGVkIGluIEhUTUwgSW1wb3J0cy4iKTthLnNldEF0dHJpYnV0ZSgic3JjIiwiZGF0YTp0ZXh0L2phdmFzY3JpcHQ7Y2hhcnNldD11dGYtOCwiK2VuY29kZVVSSUNvbXBvbmVudChhLnRleHRDb250ZW50KygiXG4vLyMgc291cmNlVVJMPSIrYisoZD8iLSIrZDoiIikrIi5qc1xuIikpKTthLnRleHRDb250ZW50PSIiO2QrK319KTtyZXR1cm4gYX07ay5wcm90b3R5cGUubD1mdW5jdGlvbigpe3ZhciBhPXRoaXM7aWYoIXRoaXMuYil7dGhpcy5jLmRpc2Nvbm5lY3QoKTt0aGlzLmZsYXR0ZW4oZG9jdW1lbnQpO3ZhciBiPSExLGM9ITEsZD1mdW5jdGlvbigpe2MmJgpiJiYoYS5sb2FkSW1wb3J0cyhkb2N1bWVudCksYS5ifHwoYS5jLm9ic2VydmUoZG9jdW1lbnQuaGVhZCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxhLmRhKCkpKX07dGhpcy5NYShmdW5jdGlvbigpe2M9ITA7ZCgpfSk7dGhpcy5MYShmdW5jdGlvbigpe2I9ITA7ZCgpfSl9fTtrLnByb3RvdHlwZS5mbGF0dGVuPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7YT1tKGEsImxpbmtbcmVsPWltcG9ydF0iKTtxKGEsZnVuY3Rpb24oYSl7dmFyIGM9Yi5hW2EuaHJlZl07KGEuX19pbXBvcnQ9YykmJmMubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJihiLmFbYS5ocmVmXT1hLGEucmVhZHlTdGF0ZT0ibG9hZGluZyIsYS5fX2ltcG9ydD1hLGIuZmxhdHRlbihjKSxhLmFwcGVuZENoaWxkKGMpKX0pfTtrLnByb3RvdHlwZS5MYT1mdW5jdGlvbihhKXtmdW5jdGlvbiBiKGUpe2lmKGU8ZCl7dmFyIGY9Y1tlXSxoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2YucmVtb3ZlQXR0cmlidXRlKCJpbXBvcnQtZGVwZW5kZW5jeSIpOwpxKGYuYXR0cmlidXRlcyxmdW5jdGlvbihhKXtyZXR1cm4gaC5zZXRBdHRyaWJ1dGUoYS5uYW1lLGEudmFsdWUpfSk7dWE9aDtmLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGgsZik7ZyhoLGZ1bmN0aW9uKCl7dWE9bnVsbDtiKGUrMSl9KX1lbHNlIGEoKX12YXIgYz1tKGRvY3VtZW50LCJzY3JpcHRbaW1wb3J0LWRlcGVuZGVuY3ldIiksZD1jLmxlbmd0aDtiKDApfTtrLnByb3RvdHlwZS5NYT1mdW5jdGlvbihhKXt2YXIgYj1tKGRvY3VtZW50LCJzdHlsZVtpbXBvcnQtZGVwZW5kZW5jeV0sbGlua1tyZWw9c3R5bGVzaGVldF1baW1wb3J0LWRlcGVuZGVuY3ldIiksZD1iLmxlbmd0aDtpZihkKXt2YXIgZT1oYSYmISFkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJsaW5rW3JlbD1zdHlsZXNoZWV0XVtocmVmXVt0eXBlPWltcG9ydC1kaXNhYmxlXSIpO3EoYixmdW5jdGlvbihiKXtnKGIsZnVuY3Rpb24oKXtiLnJlbW92ZUF0dHJpYnV0ZSgiaW1wb3J0LWRlcGVuZGVuY3kiKTswPT09LS1kJiYKYSgpfSk7aWYoZSYmYi5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCl7dmFyIGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChiLmxvY2FsTmFtZSk7Zi5fX2FwcGxpZWRFbGVtZW50PWI7Zi5zZXRBdHRyaWJ1dGUoInR5cGUiLCJpbXBvcnQtcGxhY2Vob2xkZXIiKTtiLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGYsYi5uZXh0U2libGluZyk7Zm9yKGY9YyhiKTtmJiZjKGYpOylmPWMoZik7Zi5wYXJlbnROb2RlIT09ZG9jdW1lbnQuaGVhZCYmKGY9bnVsbCk7ZG9jdW1lbnQuaGVhZC5pbnNlcnRCZWZvcmUoYixmKTtiLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpfX0pfWVsc2UgYSgpfTtrLnByb3RvdHlwZS5kYT1mdW5jdGlvbigpe3ZhciBhPXRoaXMsYj1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdIik7cShiLGZ1bmN0aW9uKGIpe3JldHVybiBhLmYoYil9LCEwKX07ay5wcm90b3R5cGUuZj1mdW5jdGlvbihhKXthLl9fbG9hZGVkfHwoYS5fX2xvYWRlZD0hMCxhLmltcG9ydCYmKGEuaW1wb3J0LnJlYWR5U3RhdGU9CiJjb21wbGV0ZSIpLGEuZGlzcGF0Y2hFdmVudChiKGEuaW1wb3J0PyJsb2FkIjoiZXJyb3IiLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITEsZGV0YWlsOnZvaWQgMH0pKSl9O2sucHJvdG90eXBlLkphPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXM7cShhLGZ1bmN0aW9uKGEpe3JldHVybiBxKGEuYWRkZWROb2RlcyxmdW5jdGlvbihhKXthJiZhLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJihoKGEpP2IuZyhhKTpiLmxvYWRJbXBvcnRzKGEpKX0pfSl9O3ZhciB2YT1udWxsO2lmKE0peD1tKGRvY3VtZW50LCJsaW5rW3JlbD1pbXBvcnRdIikscSh4LGZ1bmN0aW9uKGEpe2EuaW1wb3J0JiYibG9hZGluZyI9PT1hLmltcG9ydC5yZWFkeVN0YXRlfHwoYS5fX2xvYWRlZD0hMCl9KSx4PWZ1bmN0aW9uKGEpe2E9YS50YXJnZXQ7aChhKSYmKGEuX19sb2FkZWQ9ITApfSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIix4LCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJlcnJvciIsCngsITApO2Vsc2V7dmFyIFg9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihOb2RlLnByb3RvdHlwZSwiYmFzZVVSSSIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSgoIVh8fFguY29uZmlndXJhYmxlP05vZGU6RWxlbWVudCkucHJvdG90eXBlLCJiYXNlVVJJIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9aCh0aGlzKT90aGlzOmModGhpcyk7cmV0dXJuIGE/YS5ocmVmOlgmJlguZ2V0P1guZ2V0LmNhbGwodGhpcyk6KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoImJhc2UiKXx8d2luZG93LmxvY2F0aW9uKS5ocmVmfSxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShIVE1MTGlua0VsZW1lbnQucHJvdG90eXBlLCJpbXBvcnQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ltcG9ydHx8bnVsbH0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9KTtlKGZ1bmN0aW9uKCl7dmE9bmV3IGt9KX1mKGZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmRpc3BhdGNoRXZlbnQoYigiSFRNTEltcG9ydHNMb2FkZWQiLAp7Y2FuY2VsYWJsZTohMCxidWJibGVzOiEwLGRldGFpbDp2b2lkIDB9KSl9KTthLnVzZU5hdGl2ZT1NO2Eud2hlblJlYWR5PWY7YS5pbXBvcnRGb3JFbGVtZW50PWM7YS5sb2FkSW1wb3J0cz1mdW5jdGlvbihhKXt2YSYmdmEubG9hZEltcG9ydHMoYSl9fSkod2luZG93LkhUTUxJbXBvcnRzPXdpbmRvdy5IVE1MSW1wb3J0c3x8e30pOy8qCgogQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwp3aW5kb3cuV2ViQ29tcG9uZW50cz13aW5kb3cuV2ViQ29tcG9uZW50c3x8e2ZsYWdzOnt9fTt2YXIgQ2E9ZG9jdW1lbnQucXVlcnlTZWxlY3Rvcignc2NyaXB0W3NyYyo9IndlYmNvbXBvbmVudHMtbGl0ZS5qcyJdJyksRGE9L3djLSguKykvLHQ9e307aWYoIXQubm9PcHRzKXtsb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkuc3BsaXQoIiYiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe2E9YS5zcGxpdCgiPSIpO3ZhciBiO2FbMF0mJihiPWFbMF0ubWF0Y2goRGEpKSYmKHRbYlsxXV09YVsxXXx8ITApfSk7aWYoQ2EpZm9yKHZhciBFYT0wLEZhPXZvaWQgMDtGYT1DYS5hdHRyaWJ1dGVzW0VhXTtFYSsrKSJzcmMiIT09RmEubmFtZSYmKHRbRmEubmFtZV09RmEudmFsdWV8fCEwKTtpZih0LmxvZyYmdC5sb2cuc3BsaXQpe3ZhciBHYT10LmxvZy5zcGxpdCgiLCIpO3QubG9nPXt9O0dhLmZvckVhY2goZnVuY3Rpb24oYSl7dC5sb2dbYV09ITB9KX1lbHNlIHQubG9nPXt9fQp3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncz10O3ZhciBIYT10LnNoYWR5ZG9tO0hhJiYod2luZG93LlNoYWR5RE9NPXdpbmRvdy5TaGFkeURPTXx8e30sd2luZG93LlNoYWR5RE9NLmZvcmNlPUhhKTt2YXIgSWE9dC5yZWdpc3Rlcnx8dC5jZTtJYSYmd2luZG93LmN1c3RvbUVsZW1lbnRzJiYod2luZG93LmN1c3RvbUVsZW1lbnRzLmZvcmNlUG9seWZpbGw9SWEpOy8qCgpDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgpUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0ClRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dApDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwpzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAoqLwpmdW5jdGlvbiBKYSgpe3RoaXMucGE9dGhpcy5yb290PW51bGw7dGhpcy5UPSExO3RoaXMuRD10aGlzLlA9dGhpcy5jYT10aGlzLmFzc2lnbmVkU2xvdD10aGlzLmFzc2lnbmVkTm9kZXM9dGhpcy5IPW51bGw7dGhpcy5jaGlsZE5vZGVzPXRoaXMubmV4dFNpYmxpbmc9dGhpcy5wcmV2aW91c1NpYmxpbmc9dGhpcy5sYXN0Q2hpbGQ9dGhpcy5maXJzdENoaWxkPXRoaXMucGFyZW50Tm9kZT10aGlzLks9dm9pZCAwO3RoaXMua2E9dGhpcy5sYT0hMTt0aGlzLk89e319SmEucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3JldHVybnt9fTtmdW5jdGlvbiB1KGEpe2EuX19zaGFkeXx8KGEuX19zaGFkeT1uZXcgSmEpO3JldHVybiBhLl9fc2hhZHl9ZnVuY3Rpb24gdihhKXtyZXR1cm4gYSYmYS5fX3NoYWR5fTt2YXIgdz13aW5kb3cuU2hhZHlET018fHt9O3cuR2E9ISghRWxlbWVudC5wcm90b3R5cGUuYXR0YWNoU2hhZG93fHwhTm9kZS5wcm90b3R5cGUuZ2V0Um9vdE5vZGUpO3ZhciBLYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJmaXJzdENoaWxkIik7dy5tPSEhKEthJiZLYS5jb25maWd1cmFibGUmJkthLmdldCk7dy5lYT13LmZvcmNlfHwhdy5HYTt3Lko9dy5ub1BhdGNofHwhMTt3Lm9hPXcucHJlZmVyUGVyZm9ybWFuY2U7ZnVuY3Rpb24geShhKXtyZXR1cm4oYT12KGEpKSYmdm9pZCAwIT09YS5maXJzdENoaWxkfWZ1bmN0aW9uIHooYSl7cmV0dXJuIlNoYWR5Um9vdCI9PT1hLnphfWZ1bmN0aW9uIExhKGEpe3JldHVybihhPShhPXYoYSkpJiZhLnJvb3QpJiZNYShhKX0KdmFyIE5hPUVsZW1lbnQucHJvdG90eXBlLE9hPU5hLm1hdGNoZXN8fE5hLm1hdGNoZXNTZWxlY3Rvcnx8TmEubW96TWF0Y2hlc1NlbGVjdG9yfHxOYS5tc01hdGNoZXNTZWxlY3Rvcnx8TmEub01hdGNoZXNTZWxlY3Rvcnx8TmEud2Via2l0TWF0Y2hlc1NlbGVjdG9yLFBhPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIiKSxRYT0wLFJhPVtdOyhuZXcgTXV0YXRpb25PYnNlcnZlcihmdW5jdGlvbigpe2Zvcig7UmEubGVuZ3RoOyl0cnl7UmEuc2hpZnQoKSgpfWNhdGNoKGEpe3Rocm93IFBhLnRleHRDb250ZW50PVFhKyssYTt9fSkpLm9ic2VydmUoUGEse2NoYXJhY3RlckRhdGE6ITB9KTtmdW5jdGlvbiBTYShhKXtSYS5wdXNoKGEpO1BhLnRleHRDb250ZW50PVFhKyt9dmFyIFRhPSEhZG9jdW1lbnQuY29udGFpbnM7ZnVuY3Rpb24gVWEoYSxiKXtmb3IoO2I7KXtpZihiPT1hKXJldHVybiEwO2I9Yi5fX3NoYWR5X3BhcmVudE5vZGV9cmV0dXJuITF9CmZ1bmN0aW9uIFZhKGEpe2Zvcih2YXIgYj1hLmxlbmd0aC0xOzA8PWI7Yi0tKXt2YXIgYz1hW2JdLGQ9Yy5nZXRBdHRyaWJ1dGUoImlkIil8fGMuZ2V0QXR0cmlidXRlKCJuYW1lIik7ZCYmImxlbmd0aCIhPT1kJiZpc05hTihkKSYmKGFbZF09Yyl9YS5pdGVtPWZ1bmN0aW9uKGIpe3JldHVybiBhW2JdfTthLm5hbWVkSXRlbT1mdW5jdGlvbihiKXtpZigibGVuZ3RoIiE9PWImJmlzTmFOKGIpJiZhW2JdKXJldHVybiBhW2JdO2Zvcih2YXIgYz1pYShhKSxkPWMubmV4dCgpOyFkLmRvbmU7ZD1jLm5leHQoKSlpZihkPWQudmFsdWUsKGQuZ2V0QXR0cmlidXRlKCJpZCIpfHxkLmdldEF0dHJpYnV0ZSgibmFtZSIpKT09YilyZXR1cm4gZDtyZXR1cm4gbnVsbH07cmV0dXJuIGF9CmZ1bmN0aW9uIEEoYSxiLGMsZCl7Yz12b2lkIDA9PT1jPyIiOmM7Zm9yKHZhciBlIGluIGIpe3ZhciBmPWJbZV07aWYoIShkJiYwPD1kLmluZGV4T2YoZSkpKXtmLmNvbmZpZ3VyYWJsZT0hMDt2YXIgZz1jK2U7aWYoZi52YWx1ZSlhW2ddPWYudmFsdWU7ZWxzZSB0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsZyxmKX1jYXRjaChoKXt9fX19ZnVuY3Rpb24gQihhKXt2YXIgYj17fTtPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2JbY109T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhLGMpfSk7cmV0dXJuIGJ9O3ZhciBXYT1bXSxYYTtmdW5jdGlvbiBZYShhKXtYYXx8KFhhPSEwLFNhKFphKSk7V2EucHVzaChhKX1mdW5jdGlvbiBaYSgpe1hhPSExO2Zvcih2YXIgYT0hIVdhLmxlbmd0aDtXYS5sZW5ndGg7KVdhLnNoaWZ0KCkoKTtyZXR1cm4gYX1aYS5saXN0PVdhO2Z1bmN0aW9uICRhKCl7dGhpcy5hPSExO3RoaXMuYWRkZWROb2Rlcz1bXTt0aGlzLnJlbW92ZWROb2Rlcz1bXTt0aGlzLlM9bmV3IFNldH1mdW5jdGlvbiBhYihhKXthLmF8fChhLmE9ITAsU2EoZnVuY3Rpb24oKXthLmZsdXNoKCl9KSl9JGEucHJvdG90eXBlLmZsdXNoPWZ1bmN0aW9uKCl7aWYodGhpcy5hKXt0aGlzLmE9ITE7dmFyIGE9dGhpcy50YWtlUmVjb3JkcygpO2EubGVuZ3RoJiZ0aGlzLlMuZm9yRWFjaChmdW5jdGlvbihiKXtiKGEpfSl9fTskYS5wcm90b3R5cGUudGFrZVJlY29yZHM9ZnVuY3Rpb24oKXtpZih0aGlzLmFkZGVkTm9kZXMubGVuZ3RofHx0aGlzLnJlbW92ZWROb2Rlcy5sZW5ndGgpe3ZhciBhPVt7YWRkZWROb2Rlczp0aGlzLmFkZGVkTm9kZXMscmVtb3ZlZE5vZGVzOnRoaXMucmVtb3ZlZE5vZGVzfV07dGhpcy5hZGRlZE5vZGVzPVtdO3RoaXMucmVtb3ZlZE5vZGVzPVtdO3JldHVybiBhfXJldHVybltdfTsKZnVuY3Rpb24gYmIoYSxiKXt2YXIgYz11KGEpO2MuSHx8KGMuSD1uZXcgJGEpO2MuSC5TLmFkZChiKTt2YXIgZD1jLkg7cmV0dXJue3lhOmIsRjpkLEFhOmEsdGFrZVJlY29yZHM6ZnVuY3Rpb24oKXtyZXR1cm4gZC50YWtlUmVjb3JkcygpfX19ZnVuY3Rpb24gY2IoYSl7dmFyIGI9YSYmYS5GO2ImJihiLlMuZGVsZXRlKGEueWEpLGIuUy5zaXplfHwodShhLkFhKS5IPW51bGwpKX0KZnVuY3Rpb24gZGIoYSxiKXt2YXIgYz1iLmdldFJvb3ROb2RlKCk7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe3ZhciBiPWM9PT1hLnRhcmdldC5nZXRSb290Tm9kZSgpO2lmKGImJmEuYWRkZWROb2Rlcyl7aWYoYj1BcnJheS5mcm9tKGEuYWRkZWROb2RlcykuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBjPT09YS5nZXRSb290Tm9kZSgpfSksYi5sZW5ndGgpcmV0dXJuIGE9T2JqZWN0LmNyZWF0ZShhKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiYWRkZWROb2RlcyIse3ZhbHVlOmIsY29uZmlndXJhYmxlOiEwfSksYX1lbHNlIGlmKGIpcmV0dXJuIGF9KS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGF9KX07dmFyIGViPS9bJlx1MDBBMCJdL2csZmI9L1smXHUwMEEwPD5dL2c7ZnVuY3Rpb24gZ2IoYSl7c3dpdGNoKGEpe2Nhc2UgIiYiOnJldHVybiImYW1wOyI7Y2FzZSAiPCI6cmV0dXJuIiZsdDsiO2Nhc2UgIj4iOnJldHVybiImZ3Q7IjtjYXNlICciJzpyZXR1cm4iJnF1b3Q7IjtjYXNlICJcdTAwYTAiOnJldHVybiImbmJzcDsifX1mdW5jdGlvbiBoYihhKXtmb3IodmFyIGI9e30sYz0wO2M8YS5sZW5ndGg7YysrKWJbYVtjXV09ITA7cmV0dXJuIGJ9dmFyIGliPWhiKCJhcmVhIGJhc2UgYnIgY29sIGNvbW1hbmQgZW1iZWQgaHIgaW1nIGlucHV0IGtleWdlbiBsaW5rIG1ldGEgcGFyYW0gc291cmNlIHRyYWNrIHdiciIuc3BsaXQoIiAiKSksamI9aGIoInN0eWxlIHNjcmlwdCB4bXAgaWZyYW1lIG5vZW1iZWQgbm9mcmFtZXMgcGxhaW50ZXh0IG5vc2NyaXB0Ii5zcGxpdCgiICIpKTsKZnVuY3Rpb24ga2IoYSxiKXsidGVtcGxhdGUiPT09YS5sb2NhbE5hbWUmJihhPWEuY29udGVudCk7Zm9yKHZhciBjPSIiLGQ9Yj9iKGEpOmEuY2hpbGROb2RlcyxlPTAsZj1kLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWRbZV0pO2UrKyl7YTp7dmFyIGg9Zzt2YXIgaz1hLGw9Yjtzd2l0Y2goaC5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTprPWgubG9jYWxOYW1lO2Zvcih2YXIgbT0iPCIrayxxPWguYXR0cmlidXRlcyx4PTAsTTtNPXFbeF07eCsrKW0rPSIgIitNLm5hbWUrJz0iJytNLnZhbHVlLnJlcGxhY2UoZWIsZ2IpKyciJzttKz0iPiI7aD1pYltrXT9tOm0ra2IoaCxsKSsiPC8iK2srIj4iO2JyZWFrIGE7Y2FzZSBOb2RlLlRFWFRfTk9ERTpoPWguZGF0YTtoPWsmJmpiW2subG9jYWxOYW1lXT9oOmgucmVwbGFjZShmYixnYik7YnJlYWsgYTtjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOmg9Ilx4M2MhLS0iK2guZGF0YSsiLS1ceDNlIjticmVhayBhO2RlZmF1bHQ6dGhyb3cgd2luZG93LmNvbnNvbGUuZXJyb3IoaCksCkVycm9yKCJub3QgaW1wbGVtZW50ZWQiKTt9fWMrPWh9cmV0dXJuIGN9O3ZhciBwYj13Lm0scWI9e3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvcihhKX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9xdWVyeVNlbGVjdG9yQWxsKGEpfX0scmI9e307ZnVuY3Rpb24gc2IoYSl7cmJbYV09ZnVuY3Rpb24oYil7cmV0dXJuIGJbIl9fc2hhZHlfbmF0aXZlXyIrYV19fWZ1bmN0aW9uIHRiKGEsYil7QShhLGIsIl9fc2hhZHlfbmF0aXZlXyIpO2Zvcih2YXIgYyBpbiBiKXNiKGMpfWZ1bmN0aW9uIEQoYSxiKXtiPXZvaWQgMD09PWI/W106Yjtmb3IodmFyIGM9MDtjPGIubGVuZ3RoO2MrKyl7dmFyIGQ9YltjXSxlPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYSxkKTtlJiYoT2JqZWN0LmRlZmluZVByb3BlcnR5KGEsIl9fc2hhZHlfbmF0aXZlXyIrZCxlKSxlLnZhbHVlP3FiW2RdfHwocWJbZF09ZS52YWx1ZSk6c2IoZCkpfX0KdmFyIEU9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfQUxMLG51bGwsITEpLEY9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCxOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCxudWxsLCExKSx1Yj1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0Iik7ZnVuY3Rpb24gdmIoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkOylhLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGIpfXZhciB3Yj1bImZpcnN0RWxlbWVudENoaWxkIiwibGFzdEVsZW1lbnRDaGlsZCIsImNoaWxkcmVuIiwiY2hpbGRFbGVtZW50Q291bnQiXSx4Yj1bInF1ZXJ5U2VsZWN0b3IiLCJxdWVyeVNlbGVjdG9yQWxsIl07CmZ1bmN0aW9uIHliKCl7dmFyIGE9WyJkaXNwYXRjaEV2ZW50IiwiYWRkRXZlbnRMaXN0ZW5lciIsInJlbW92ZUV2ZW50TGlzdGVuZXIiXTt3aW5kb3cuRXZlbnRUYXJnZXQ/RCh3aW5kb3cuRXZlbnRUYXJnZXQucHJvdG90eXBlLGEpOihEKE5vZGUucHJvdG90eXBlLGEpLEQoV2luZG93LnByb3RvdHlwZSxhKSk7cGI/RChOb2RlLnByb3RvdHlwZSwicGFyZW50Tm9kZSBmaXJzdENoaWxkIGxhc3RDaGlsZCBwcmV2aW91c1NpYmxpbmcgbmV4dFNpYmxpbmcgY2hpbGROb2RlcyBwYXJlbnRFbGVtZW50IHRleHRDb250ZW50Ii5zcGxpdCgiICIpKTp0YihOb2RlLnByb3RvdHlwZSx7cGFyZW50Tm9kZTp7Z2V0OmZ1bmN0aW9uKCl7RS5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBFLnBhcmVudE5vZGUoKX19LGZpcnN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5maXJzdENoaWxkKCl9fSxsYXN0Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9CnRoaXM7cmV0dXJuIEUubGFzdENoaWxkKCl9fSxwcmV2aW91c1NpYmxpbmc6e2dldDpmdW5jdGlvbigpe0UuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRS5wcmV2aW91c1NpYmxpbmcoKX19LG5leHRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtFLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEUubmV4dFNpYmxpbmcoKX19LGNoaWxkTm9kZXM6e2dldDpmdW5jdGlvbigpe3ZhciBhPVtdO0UuY3VycmVudE5vZGU9dGhpcztmb3IodmFyIGM9RS5maXJzdENoaWxkKCk7YzspYS5wdXNoKGMpLGM9RS5uZXh0U2libGluZygpO3JldHVybiBhfX0scGFyZW50RWxlbWVudDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLnBhcmVudE5vZGUoKX19LHRleHRDb250ZW50OntnZXQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTpmb3IodmFyIGE9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcih0aGlzLApOb2RlRmlsdGVyLlNIT1dfVEVYVCxudWxsLCExKSxjPSIiLGQ7ZD1hLm5leHROb2RlKCk7KWMrPWQubm9kZVZhbHVlO3JldHVybiBjO2RlZmF1bHQ6cmV0dXJuIHRoaXMubm9kZVZhbHVlfX0sc2V0OmZ1bmN0aW9uKGEpe2lmKCJ1bmRlZmluZWQiPT09dHlwZW9mIGF8fG51bGw9PT1hKWE9IiI7c3dpdGNoKHRoaXMubm9kZVR5cGUpe2Nhc2UgTm9kZS5FTEVNRU5UX05PREU6Y2FzZSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU6dmIodGhpcyk7KDA8YS5sZW5ndGh8fHRoaXMubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSkmJnRoaXMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGEpLHZvaWQgMCk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX19fSk7RChOb2RlLnByb3RvdHlwZSwiYXBwZW5kQ2hpbGQgaW5zZXJ0QmVmb3JlIHJlbW92ZUNoaWxkIHJlcGxhY2VDaGlsZCBjbG9uZU5vZGUgY29udGFpbnMiLnNwbGl0KCIgIikpOwphPXtmaXJzdEVsZW1lbnRDaGlsZDp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLmZpcnN0Q2hpbGQoKX19LGxhc3RFbGVtZW50Q2hpbGQ6e2dldDpmdW5jdGlvbigpe0YuY3VycmVudE5vZGU9dGhpcztyZXR1cm4gRi5sYXN0Q2hpbGQoKX19LGNoaWxkcmVuOntnZXQ6ZnVuY3Rpb24oKXt2YXIgYT1bXTtGLmN1cnJlbnROb2RlPXRoaXM7Zm9yKHZhciBjPUYuZmlyc3RDaGlsZCgpO2M7KWEucHVzaChjKSxjPUYubmV4dFNpYmxpbmcoKTtyZXR1cm4gVmEoYSl9fSxjaGlsZEVsZW1lbnRDb3VudDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4/dGhpcy5jaGlsZHJlbi5sZW5ndGg6MH19fTtwYj8oRChFbGVtZW50LnByb3RvdHlwZSx3YiksRChFbGVtZW50LnByb3RvdHlwZSxbInByZXZpb3VzRWxlbWVudFNpYmxpbmciLCJuZXh0RWxlbWVudFNpYmxpbmciLCJpbm5lckhUTUwiXSksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsCiJjaGlsZHJlbiIpJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImNoaWxkcmVuIl0pLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSYmRChIVE1MRWxlbWVudC5wcm90b3R5cGUsWyJpbm5lckhUTUwiXSkpOih0YihFbGVtZW50LnByb3RvdHlwZSxhKSx0YihFbGVtZW50LnByb3RvdHlwZSx7cHJldmlvdXNFbGVtZW50U2libGluZzp7Z2V0OmZ1bmN0aW9uKCl7Ri5jdXJyZW50Tm9kZT10aGlzO3JldHVybiBGLnByZXZpb3VzU2libGluZygpfX0sbmV4dEVsZW1lbnRTaWJsaW5nOntnZXQ6ZnVuY3Rpb24oKXtGLmN1cnJlbnROb2RlPXRoaXM7cmV0dXJuIEYubmV4dFNpYmxpbmcoKX19LGlubmVySFRNTDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGtiKHRoaXMsZnVuY3Rpb24oYSl7cmV0dXJuIGEuX19zaGFkeV9uYXRpdmVfY2hpbGROb2Rlc30pfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lPwp0aGlzLmNvbnRlbnQ6dGhpczt2YihiKTt2YXIgZD10aGlzLmxvY2FsTmFtZXx8ImRpdiI7ZD10aGlzLm5hbWVzcGFjZVVSSSYmdGhpcy5uYW1lc3BhY2VVUkkhPT11Yi5uYW1lc3BhY2VVUkk/dWIuY3JlYXRlRWxlbWVudE5TKHRoaXMubmFtZXNwYWNlVVJJLGQpOnViLmNyZWF0ZUVsZW1lbnQoZCk7ZC5pbm5lckhUTUw9YTtmb3IoYT0idGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWU/ZC5jb250ZW50OmQ7ZD1hLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWIuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGQsdm9pZCAwKX19fSkpO0QoRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUgaGFzQXR0cmlidXRlIHJlbW92ZUF0dHJpYnV0ZSBmb2N1cyBibHVyIi5zcGxpdCgiICIpKTtEKEVsZW1lbnQucHJvdG90eXBlLHhiKTtEKEhUTUxFbGVtZW50LnByb3RvdHlwZSxbImZvY3VzIiwiYmx1ciIsImNvbnRhaW5zIl0pO3BiJiZEKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKWyJwYXJlbnRFbGVtZW50IiwiY2hpbGRyZW4iLCJpbm5lckhUTUwiXSk7d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQmJkQod2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQucHJvdG90eXBlLFsiaW5uZXJIVE1MIl0pO3BiP0QoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUsd2IpOnRiKERvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlLGEpO0QoRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUseGIpO3BiPyhEKERvY3VtZW50LnByb3RvdHlwZSx3YiksRChEb2N1bWVudC5wcm90b3R5cGUsWyJhY3RpdmVFbGVtZW50Il0pKTp0YihEb2N1bWVudC5wcm90b3R5cGUsYSk7RChEb2N1bWVudC5wcm90b3R5cGUsWyJpbXBvcnROb2RlIiwiZ2V0RWxlbWVudEJ5SWQiXSk7RChEb2N1bWVudC5wcm90b3R5cGUseGIpfTt2YXIgemI9Qih7Z2V0IGNoaWxkTm9kZXMoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NoaWxkTm9kZXN9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdENoaWxkfSxnZXQgbGFzdENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9sYXN0Q2hpbGR9LGdldCB0ZXh0Q29udGVudCgpe3JldHVybiB0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXt0aGlzLl9fc2hhZHlfdGV4dENvbnRlbnQ9YX0sZ2V0IGNoaWxkRWxlbWVudENvdW50KCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZEVsZW1lbnRDb3VudH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9jaGlsZHJlbn0sZ2V0IGZpcnN0RWxlbWVudENoaWxkKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9maXJzdEVsZW1lbnRDaGlsZH0sZ2V0IGxhc3RFbGVtZW50Q2hpbGQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2xhc3RFbGVtZW50Q2hpbGR9LGdldCBpbm5lckhUTUwoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2lubmVySFRNTH0sCnNldCBpbm5lckhUTUwoYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9pbm5lckhUTUw9YX0sZ2V0IHNoYWRvd1Jvb3QoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3NoYWRvd1Jvb3R9fSksQWI9Qih7Z2V0IHBhcmVudEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3BhcmVudEVsZW1lbnR9LGdldCBwYXJlbnROb2RlKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wYXJlbnROb2RlfSxnZXQgbmV4dFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25leHRTaWJsaW5nfSxnZXQgcHJldmlvdXNTaWJsaW5nKCl7cmV0dXJuIHRoaXMuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9LGdldCBuZXh0RWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X25leHRFbGVtZW50U2libGluZ30sZ2V0IHByZXZpb3VzRWxlbWVudFNpYmxpbmcoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X3ByZXZpb3VzRWxlbWVudFNpYmxpbmd9LGdldCBjbGFzc05hbWUoKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2NsYXNzTmFtZX0sCnNldCBjbGFzc05hbWUoYSl7cmV0dXJuIHRoaXMuX19zaGFkeV9jbGFzc05hbWU9YX19KSxCYjtmb3IoQmIgaW4gemIpemJbQmJdLmVudW1lcmFibGU9ITE7Zm9yKHZhciBDYiBpbiBBYilBYltDYl0uZW51bWVyYWJsZT0hMTt2YXIgRGI9dy5tfHx3LkosRWI9RGI/ZnVuY3Rpb24oKXt9OmZ1bmN0aW9uKGEpe3ZhciBiPXUoYSk7Yi5sYXx8KGIubGE9ITAsQShhLEFiKSl9LEZiPURiP2Z1bmN0aW9uKCl7fTpmdW5jdGlvbihhKXt2YXIgYj11KGEpO2Iua2F8fChiLmthPSEwLEEoYSx6YikpfTt2YXIgR2I9Il9fZXZlbnRXcmFwcGVycyIrRGF0ZS5ub3coKSxIYj1mdW5jdGlvbigpe3ZhciBhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoRXZlbnQucHJvdG90eXBlLCJjb21wb3NlZCIpO3JldHVybiBhP2Z1bmN0aW9uKGIpe3JldHVybiBhLmdldC5jYWxsKGIpfTpudWxsfSgpLEliPXtibHVyOiEwLGZvY3VzOiEwLGZvY3VzaW46ITAsZm9jdXNvdXQ6ITAsY2xpY2s6ITAsZGJsY2xpY2s6ITAsbW91c2Vkb3duOiEwLG1vdXNlZW50ZXI6ITAsbW91c2VsZWF2ZTohMCxtb3VzZW1vdmU6ITAsbW91c2VvdXQ6ITAsbW91c2VvdmVyOiEwLG1vdXNldXA6ITAsd2hlZWw6ITAsYmVmb3JlaW5wdXQ6ITAsaW5wdXQ6ITAsa2V5ZG93bjohMCxrZXl1cDohMCxjb21wb3NpdGlvbnN0YXJ0OiEwLGNvbXBvc2l0aW9udXBkYXRlOiEwLGNvbXBvc2l0aW9uZW5kOiEwLHRvdWNoc3RhcnQ6ITAsdG91Y2hlbmQ6ITAsdG91Y2htb3ZlOiEwLHRvdWNoY2FuY2VsOiEwLHBvaW50ZXJvdmVyOiEwLApwb2ludGVyZW50ZXI6ITAscG9pbnRlcmRvd246ITAscG9pbnRlcm1vdmU6ITAscG9pbnRlcnVwOiEwLHBvaW50ZXJjYW5jZWw6ITAscG9pbnRlcm91dDohMCxwb2ludGVybGVhdmU6ITAsZ290cG9pbnRlcmNhcHR1cmU6ITAsbG9zdHBvaW50ZXJjYXB0dXJlOiEwLGRyYWdzdGFydDohMCxkcmFnOiEwLGRyYWdlbnRlcjohMCxkcmFnbGVhdmU6ITAsZHJhZ292ZXI6ITAsZHJvcDohMCxkcmFnZW5kOiEwLERPTUFjdGl2YXRlOiEwLERPTUZvY3VzSW46ITAsRE9NRm9jdXNPdXQ6ITAsa2V5cHJlc3M6ITB9LEpiPXtET01BdHRyTW9kaWZpZWQ6ITAsRE9NQXR0cmlidXRlTmFtZUNoYW5nZWQ6ITAsRE9NQ2hhcmFjdGVyRGF0YU1vZGlmaWVkOiEwLERPTUVsZW1lbnROYW1lQ2hhbmdlZDohMCxET01Ob2RlSW5zZXJ0ZWQ6ITAsRE9NTm9kZUluc2VydGVkSW50b0RvY3VtZW50OiEwLERPTU5vZGVSZW1vdmVkOiEwLERPTU5vZGVSZW1vdmVkRnJvbURvY3VtZW50OiEwLERPTVN1YnRyZWVNb2RpZmllZDohMH07CmZ1bmN0aW9uIEtiKGEpe3JldHVybiBhIGluc3RhbmNlb2YgTm9kZT9hLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTphfWZ1bmN0aW9uIExiKGEsYil7dmFyIGM9W10sZD1hO2ZvcihhPUtiKGEpO2Q7KWMucHVzaChkKSxkLl9fc2hhZHlfYXNzaWduZWRTbG90P2Q9ZC5fX3NoYWR5X2Fzc2lnbmVkU2xvdDpkLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiZkLmhvc3QmJihifHxkIT09YSk/ZD1kLmhvc3Q6ZD1kLl9fc2hhZHlfcGFyZW50Tm9kZTtjW2MubGVuZ3RoLTFdPT09ZG9jdW1lbnQmJmMucHVzaCh3aW5kb3cpO3JldHVybiBjfWZ1bmN0aW9uIE1iKGEpe2EuX19jb21wb3NlZFBhdGh8fChhLl9fY29tcG9zZWRQYXRoPUxiKGEudGFyZ2V0LCEwKSk7cmV0dXJuIGEuX19jb21wb3NlZFBhdGh9CmZ1bmN0aW9uIE5iKGEsYil7aWYoIXopcmV0dXJuIGE7YT1MYihhLCEwKTtmb3IodmFyIGM9MCxkLGU9dm9pZCAwLGYsZz12b2lkIDA7YzxiLmxlbmd0aDtjKyspaWYoZD1iW2NdLGY9S2IoZCksZiE9PWUmJihnPWEuaW5kZXhPZihmKSxlPWYpLCF6KGYpfHwtMTxnKXJldHVybiBkfWZ1bmN0aW9uIE9iKGEpe2Z1bmN0aW9uIGIoYixkKXtiPW5ldyBhKGIsZCk7Yi5fX2NvbXBvc2VkPWQmJiEhZC5jb21wb3NlZDtyZXR1cm4gYn1iLl9fcHJvdG9fXz1hO2IucHJvdG90eXBlPWEucHJvdG90eXBlO3JldHVybiBifXZhciBQYj17Zm9jdXM6ITAsYmx1cjohMH07ZnVuY3Rpb24gUWIoYSl7cmV0dXJuIGEuX190YXJnZXQhPT1hLnRhcmdldHx8YS5fX3JlbGF0ZWRUYXJnZXQhPT1hLnJlbGF0ZWRUYXJnZXR9CmZ1bmN0aW9uIFJiKGEsYixjKXtpZihjPWIuX19oYW5kbGVycyYmYi5fX2hhbmRsZXJzW2EudHlwZV0mJmIuX19oYW5kbGVyc1thLnR5cGVdW2NdKWZvcih2YXIgZD0wLGU7KGU9Y1tkXSkmJighUWIoYSl8fGEudGFyZ2V0IT09YS5yZWxhdGVkVGFyZ2V0KSYmKGUuY2FsbChiLGEpLCFhLl9faW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKTtkKyspO30KZnVuY3Rpb24gU2IoYSl7dmFyIGI9YS5jb21wb3NlZFBhdGgoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiY3VycmVudFRhcmdldCIse2dldDpmdW5jdGlvbigpe3JldHVybiBkfSxjb25maWd1cmFibGU6ITB9KTtmb3IodmFyIGM9Yi5sZW5ndGgtMTswPD1jO2MtLSl7dmFyIGQ9YltjXTtSYihhLGQsImNhcHR1cmUiKTtpZihhLlopcmV0dXJufU9iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJldmVudFBoYXNlIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIEV2ZW50LkFUX1RBUkdFVH19KTt2YXIgZTtmb3IoYz0wO2M8Yi5sZW5ndGg7YysrKXtkPWJbY107dmFyIGY9dihkKTtmPWYmJmYucm9vdDtpZigwPT09Y3x8ZiYmZj09PWUpaWYoUmIoYSxkLCJidWJibGUiKSxkIT09d2luZG93JiYoZT1kLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKSksYS5aKWJyZWFrfX0KZnVuY3Rpb24gVGIoYSxiLGMsZCxlLGYpe2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXt2YXIgaD1hW2ddLGs9aC50eXBlLGw9aC5jYXB0dXJlLG09aC5vbmNlLHE9aC5wYXNzaXZlO2lmKGI9PT1oLm5vZGUmJmM9PT1rJiZkPT09bCYmZT09PW0mJmY9PT1xKXJldHVybiBnfXJldHVybi0xfQpmdW5jdGlvbiBVYihhLGIsYyl7aWYoYil7dmFyIGQ9dHlwZW9mIGI7aWYoImZ1bmN0aW9uIj09PWR8fCJvYmplY3QiPT09ZClpZigib2JqZWN0IiE9PWR8fGIuaGFuZGxlRXZlbnQmJiJmdW5jdGlvbiI9PT10eXBlb2YgYi5oYW5kbGVFdmVudCl7aWYoSmJbYV0pcmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGIsYyk7aWYoYyYmIm9iamVjdCI9PT10eXBlb2YgYyl7dmFyIGU9ISFjLmNhcHR1cmU7dmFyIGY9ISFjLm9uY2U7dmFyIGc9ISFjLnBhc3NpdmV9ZWxzZSBlPSEhYyxnPWY9ITE7dmFyIGg9YyYmYy4kfHx0aGlzLGs9YltHYl07aWYoayl7aWYoLTE8VGIoayxoLGEsZSxmLGcpKXJldHVybn1lbHNlIGJbR2JdPVtdO2s9ZnVuY3Rpb24oZSl7ZiYmdGhpcy5fX3NoYWR5X3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2UuX190YXJnZXR8fFZiKGUpO2lmKGghPT10aGlzKXt2YXIgZz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsImN1cnJlbnRUYXJnZXQiKTsKT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImN1cnJlbnRUYXJnZXQiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gaH0sY29uZmlndXJhYmxlOiEwfSl9ZS5fX3ByZXZpb3VzQ3VycmVudFRhcmdldD1lLmN1cnJlbnRUYXJnZXQ7aWYoIXooaCl8fC0xIT1lLmNvbXBvc2VkUGF0aCgpLmluZGV4T2YoaCkpaWYoZS5jb21wb3NlZHx8LTE8ZS5jb21wb3NlZFBhdGgoKS5pbmRleE9mKGgpKWlmKFFiKGUpJiZlLnRhcmdldD09PWUucmVsYXRlZFRhcmdldCllLmV2ZW50UGhhc2U9PT1FdmVudC5CVUJCTElOR19QSEFTRSYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtlbHNlIGlmKGUuZXZlbnRQaGFzZT09PUV2ZW50LkNBUFRVUklOR19QSEFTRXx8ZS5idWJibGVzfHxlLnRhcmdldD09PWh8fGggaW5zdGFuY2VvZiBXaW5kb3cpe3ZhciBrPSJmdW5jdGlvbiI9PT1kP2IuY2FsbChoLGUpOmIuaGFuZGxlRXZlbnQmJmIuaGFuZGxlRXZlbnQoZSk7aCE9PXRoaXMmJihnPyhPYmplY3QuZGVmaW5lUHJvcGVydHkoZSwKImN1cnJlbnRUYXJnZXQiLGcpLGc9bnVsbCk6ZGVsZXRlIGUuY3VycmVudFRhcmdldCk7cmV0dXJuIGt9fTtiW0diXS5wdXNoKHtub2RlOmgsdHlwZTphLGNhcHR1cmU6ZSxvbmNlOmYscGFzc2l2ZTpnLFlhOmt9KTtQYlthXT8odGhpcy5fX2hhbmRsZXJzPXRoaXMuX19oYW5kbGVyc3x8e30sdGhpcy5fX2hhbmRsZXJzW2FdPXRoaXMuX19oYW5kbGVyc1thXXx8e2NhcHR1cmU6W10sYnViYmxlOltdfSx0aGlzLl9faGFuZGxlcnNbYV1bZT8iY2FwdHVyZSI6ImJ1YmJsZSJdLnB1c2goaykpOnRoaXMuX19zaGFkeV9uYXRpdmVfYWRkRXZlbnRMaXN0ZW5lcihhLGssYyl9fX0KZnVuY3Rpb24gV2IoYSxiLGMpe2lmKGIpe2lmKEpiW2FdKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxiLGMpO2lmKGMmJiJvYmplY3QiPT09dHlwZW9mIGMpe3ZhciBkPSEhYy5jYXB0dXJlO3ZhciBlPSEhYy5vbmNlO3ZhciBmPSEhYy5wYXNzaXZlfWVsc2UgZD0hIWMsZj1lPSExO3ZhciBnPWMmJmMuJHx8dGhpcyxoPXZvaWQgMDt2YXIgaz1udWxsO3RyeXtrPWJbR2JdfWNhdGNoKGwpe31rJiYoZT1UYihrLGcsYSxkLGUsZiksLTE8ZSYmKGg9ay5zcGxpY2UoZSwxKVswXS5ZYSxrLmxlbmd0aHx8KGJbR2JdPXZvaWQgMCkpKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUV2ZW50TGlzdGVuZXIoYSxofHxiLGMpO2gmJlBiW2FdJiZ0aGlzLl9faGFuZGxlcnMmJnRoaXMuX19oYW5kbGVyc1thXSYmKGE9dGhpcy5fX2hhbmRsZXJzW2FdW2Q/ImNhcHR1cmUiOiJidWJibGUiXSxoPWEuaW5kZXhPZihoKSwtMTxoJiZhLnNwbGljZShoLDEpKX19CmZ1bmN0aW9uIFhiKCl7Zm9yKHZhciBhIGluIFBiKXdpbmRvdy5fX3NoYWR5X25hdGl2ZV9hZGRFdmVudExpc3RlbmVyKGEsZnVuY3Rpb24oYSl7YS5fX3RhcmdldHx8KFZiKGEpLFNiKGEpKX0sITApfQp2YXIgWWI9Qih7Z2V0IGNvbXBvc2VkKCl7dm9pZCAwPT09dGhpcy5fX2NvbXBvc2VkJiYoSGI/dGhpcy5fX2NvbXBvc2VkPSJmb2N1c2luIj09PXRoaXMudHlwZXx8ImZvY3Vzb3V0Ij09PXRoaXMudHlwZXx8SGIodGhpcyk6ITEhPT10aGlzLmlzVHJ1c3RlZCYmKHRoaXMuX19jb21wb3NlZD1JYlt0aGlzLnR5cGVdKSk7cmV0dXJuIHRoaXMuX19jb21wb3NlZHx8ITF9LGNvbXBvc2VkUGF0aDpmdW5jdGlvbigpe3RoaXMuX19jb21wb3NlZFBhdGh8fCh0aGlzLl9fY29tcG9zZWRQYXRoPUxiKHRoaXMuX190YXJnZXQsdGhpcy5jb21wb3NlZCkpO3JldHVybiB0aGlzLl9fY29tcG9zZWRQYXRofSxnZXQgdGFyZ2V0KCl7cmV0dXJuIE5iKHRoaXMuY3VycmVudFRhcmdldHx8dGhpcy5fX3ByZXZpb3VzQ3VycmVudFRhcmdldCx0aGlzLmNvbXBvc2VkUGF0aCgpKX0sZ2V0IHJlbGF0ZWRUYXJnZXQoKXtpZighdGhpcy5fX3JlbGF0ZWRUYXJnZXQpcmV0dXJuIG51bGw7dGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGh8fAoodGhpcy5fX3JlbGF0ZWRUYXJnZXRDb21wb3NlZFBhdGg9TGIodGhpcy5fX3JlbGF0ZWRUYXJnZXQsITApKTtyZXR1cm4gTmIodGhpcy5jdXJyZW50VGFyZ2V0fHx0aGlzLl9fcHJldmlvdXNDdXJyZW50VGFyZ2V0LHRoaXMuX19yZWxhdGVkVGFyZ2V0Q29tcG9zZWRQYXRoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuWj0hMH0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7RXZlbnQucHJvdG90eXBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbi5jYWxsKHRoaXMpO3RoaXMuWj10aGlzLl9faW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPSEwfX0pOwpmdW5jdGlvbiBWYihhKXthLl9fdGFyZ2V0PWEudGFyZ2V0O2EuX19yZWxhdGVkVGFyZ2V0PWEucmVsYXRlZFRhcmdldDtpZih3Lm0pe3ZhciBiPU9iamVjdC5nZXRQcm90b3R5cGVPZihhKTtpZighT2JqZWN0Lmhhc093blByb3BlcnR5KGIsIl9fc2hhZHlfcGF0Y2hlZFByb3RvIikpe3ZhciBjPU9iamVjdC5jcmVhdGUoYik7Yy5fX3NoYWR5X3NvdXJjZVByb3RvPWI7QShjLFliKTtiLl9fc2hhZHlfcGF0Y2hlZFByb3RvPWN9YS5fX3Byb3RvX189Yi5fX3NoYWR5X3BhdGNoZWRQcm90b31lbHNlIEEoYSxZYil9dmFyIFpiPU9iKEV2ZW50KSwkYj1PYihDdXN0b21FdmVudCksYWM9T2IoTW91c2VFdmVudCk7CmZ1bmN0aW9uIGJjKCl7aWYoIUhiJiZPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEV2ZW50LnByb3RvdHlwZSwiaXNUcnVzdGVkIikpe3ZhciBhPWZ1bmN0aW9uKCl7dmFyIGE9bmV3IE1vdXNlRXZlbnQoImNsaWNrIix7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNvbXBvc2VkOiEwfSk7dGhpcy5fX3NoYWR5X2Rpc3BhdGNoRXZlbnQoYSl9O0VsZW1lbnQucHJvdG90eXBlLmNsaWNrP0VsZW1lbnQucHJvdG90eXBlLmNsaWNrPWE6SFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrJiYoSFRNTEVsZW1lbnQucHJvdG90eXBlLmNsaWNrPWEpfX12YXIgY2M9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoRG9jdW1lbnQucHJvdG90eXBlKS5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIm9uIj09PWEuc3Vic3RyaW5nKDAsMil9KTtmdW5jdGlvbiBkYyhhLGIpe3JldHVybntpbmRleDphLEw6W10sUjpifX0KZnVuY3Rpb24gZWMoYSxiLGMsZCl7dmFyIGU9MCxmPTAsZz0wLGg9MCxrPU1hdGgubWluKGItZSxkLWYpO2lmKDA9PWUmJjA9PWYpYTp7Zm9yKGc9MDtnPGs7ZysrKWlmKGFbZ10hPT1jW2ddKWJyZWFrIGE7Zz1rfWlmKGI9PWEubGVuZ3RoJiZkPT1jLmxlbmd0aCl7aD1hLmxlbmd0aDtmb3IodmFyIGw9Yy5sZW5ndGgsbT0wO208ay1nJiZmYyhhWy0taF0sY1stLWxdKTspbSsrO2g9bX1lKz1nO2YrPWc7Yi09aDtkLT1oO2lmKDA9PWItZSYmMD09ZC1mKXJldHVybltdO2lmKGU9PWIpe2ZvcihiPWRjKGUsMCk7ZjxkOyliLkwucHVzaChjW2YrK10pO3JldHVybltiXX1pZihmPT1kKXJldHVybltkYyhlLGItZSldO2s9ZTtnPWY7ZD1kLWcrMTtoPWItaysxO2I9QXJyYXkoZCk7Zm9yKGw9MDtsPGQ7bCsrKWJbbF09QXJyYXkoaCksYltsXVswXT1sO2ZvcihsPTA7bDxoO2wrKyliWzBdW2xdPWw7Zm9yKGw9MTtsPGQ7bCsrKWZvcihtPTE7bTxoO20rKylpZihhW2srbS0xXT09PWNbZytsLTFdKWJbbF1bbV09CmJbbC0xXVttLTFdO2Vsc2V7dmFyIHE9YltsLTFdW21dKzEseD1iW2xdW20tMV0rMTtiW2xdW21dPXE8eD9xOnh9az1iLmxlbmd0aC0xO2c9YlswXS5sZW5ndGgtMTtkPWJba11bZ107Zm9yKGE9W107MDxrfHwwPGc7KTA9PWs/KGEucHVzaCgyKSxnLS0pOjA9PWc/KGEucHVzaCgzKSxrLS0pOihoPWJbay0xXVtnLTFdLGw9YltrLTFdW2ddLG09YltrXVtnLTFdLHE9bDxtP2w8aD9sOmg6bTxoP206aCxxPT1oPyhoPT1kP2EucHVzaCgwKTooYS5wdXNoKDEpLGQ9aCksay0tLGctLSk6cT09bD8oYS5wdXNoKDMpLGstLSxkPWwpOihhLnB1c2goMiksZy0tLGQ9bSkpO2EucmV2ZXJzZSgpO2I9dm9pZCAwO2s9W107Zm9yKGc9MDtnPGEubGVuZ3RoO2crKylzd2l0Y2goYVtnXSl7Y2FzZSAwOmImJihrLnB1c2goYiksYj12b2lkIDApO2UrKztmKys7YnJlYWs7Y2FzZSAxOmJ8fChiPWRjKGUsMCkpO2IuUisrO2UrKztiLkwucHVzaChjW2ZdKTtmKys7YnJlYWs7Y2FzZSAyOmJ8fChiPWRjKGUsMCkpOwpiLlIrKztlKys7YnJlYWs7Y2FzZSAzOmJ8fChiPWRjKGUsMCkpLGIuTC5wdXNoKGNbZl0pLGYrK31iJiZrLnB1c2goYik7cmV0dXJuIGt9ZnVuY3Rpb24gZmMoYSxiKXtyZXR1cm4gYT09PWJ9O2Z1bmN0aW9uIGdjKGEsYixjKXtFYihhKTtjPWN8fG51bGw7dmFyIGQ9dShhKSxlPXUoYiksZj1jP3UoYyk6bnVsbDtkLnByZXZpb3VzU2libGluZz1jP2YucHJldmlvdXNTaWJsaW5nOmIuX19zaGFkeV9sYXN0Q2hpbGQ7aWYoZj12KGQucHJldmlvdXNTaWJsaW5nKSlmLm5leHRTaWJsaW5nPWE7aWYoZj12KGQubmV4dFNpYmxpbmc9YykpZi5wcmV2aW91c1NpYmxpbmc9YTtkLnBhcmVudE5vZGU9YjtjP2M9PT1lLmZpcnN0Q2hpbGQmJihlLmZpcnN0Q2hpbGQ9YSk6KGUubGFzdENoaWxkPWEsZS5maXJzdENoaWxkfHwoZS5maXJzdENoaWxkPWEpKTtlLmNoaWxkTm9kZXM9bnVsbH0KZnVuY3Rpb24gaGMoYSxiLGMpe0ZiKGIpO3ZhciBkPXUoYik7dm9pZCAwIT09ZC5maXJzdENoaWxkJiYoZC5jaGlsZE5vZGVzPW51bGwpO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2Q9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspZ2MoZFtlXSxiLGMpO2E9dShhKTtiPXZvaWQgMCE9PWEuZmlyc3RDaGlsZD9udWxsOnZvaWQgMDthLmZpcnN0Q2hpbGQ9YS5sYXN0Q2hpbGQ9YjthLmNoaWxkTm9kZXM9Yn1lbHNlIGdjKGEsYixjKX0KZnVuY3Rpb24gaWMoYSxiKXt2YXIgYz11KGEpO2I9dShiKTthPT09Yi5maXJzdENoaWxkJiYoYi5maXJzdENoaWxkPWMubmV4dFNpYmxpbmcpO2E9PT1iLmxhc3RDaGlsZCYmKGIubGFzdENoaWxkPWMucHJldmlvdXNTaWJsaW5nKTthPWMucHJldmlvdXNTaWJsaW5nO3ZhciBkPWMubmV4dFNpYmxpbmc7YSYmKHUoYSkubmV4dFNpYmxpbmc9ZCk7ZCYmKHUoZCkucHJldmlvdXNTaWJsaW5nPWEpO2MucGFyZW50Tm9kZT1jLnByZXZpb3VzU2libGluZz1jLm5leHRTaWJsaW5nPXZvaWQgMDt2b2lkIDAhPT1iLmNoaWxkTm9kZXMmJihiLmNoaWxkTm9kZXM9bnVsbCl9CmZ1bmN0aW9uIGpjKGEpe3ZhciBiPXUoYSk7aWYodm9pZCAwPT09Yi5maXJzdENoaWxkKXtiLmNoaWxkTm9kZXM9bnVsbDt2YXIgYz1iLmZpcnN0Q2hpbGQ9YS5fX3NoYWR5X25hdGl2ZV9maXJzdENoaWxkfHxudWxsO2IubGFzdENoaWxkPWEuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfHxudWxsO0ZiKGEpO2I9Yztmb3IoYz12b2lkIDA7YjtiPWIuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmcpe3ZhciBkPXUoYik7ZC5wYXJlbnROb2RlPWE7ZC5uZXh0U2libGluZz1iLl9fc2hhZHlfbmF0aXZlX25leHRTaWJsaW5nfHxudWxsO2QucHJldmlvdXNTaWJsaW5nPWN8fG51bGw7Yz1iO0ViKGIpfX19O3ZhciBrYz1udWxsO2Z1bmN0aW9uIEcoKXtrY3x8KGtjPXdpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKTtyZXR1cm4ga2N8fG51bGx9ZnVuY3Rpb24gbGMoYSxiKXt2YXIgYz1HKCk7YyYmYy51bnNjb3BlTm9kZShhLGIpfWZ1bmN0aW9uIG1jKGEsYil7dmFyIGM9RygpO2lmKCFjKXJldHVybiEwO2lmKGEubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUpe2M9ITA7YT1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGQ9MDtjJiZkPGEubGVuZ3RoO2QrKyljPWMmJm1jKGFbZF0sYik7cmV0dXJuIGN9cmV0dXJuIGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERT8hMDpjLmN1cnJlbnRTY29wZUZvck5vZGUoYSk9PT1ifWZ1bmN0aW9uIG5jKGEpe2lmKGEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4iIjt2YXIgYj1HKCk7cmV0dXJuIGI/Yi5jdXJyZW50U2NvcGVGb3JOb2RlKGEpOiIifQpmdW5jdGlvbiBvYyhhLGIpe2lmKGEpe2Eubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmYihhKTthPWEuX19zaGFkeV9jaGlsZE5vZGVzO2Zvcih2YXIgYz0wLGQ7YzxhLmxlbmd0aDtjKyspZD1hW2NdLGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmb2MoZCxiKX19O3ZhciBwYz13aW5kb3cuZG9jdW1lbnQscWM9dy5vYSxyYz1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE5vZGUucHJvdG90eXBlLCJpc0Nvbm5lY3RlZCIpLHNjPXJjJiZyYy5nZXQ7ZnVuY3Rpb24gdGMoYSl7Zm9yKHZhciBiO2I9YS5fX3NoYWR5X2ZpcnN0Q2hpbGQ7KWEuX19zaGFkeV9yZW1vdmVDaGlsZChiKX1mdW5jdGlvbiB1YyhhKXt2YXIgYj12KGEpO2lmKGImJnZvaWQgMCE9PWIuSyl7Yj1hLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkPWIubGVuZ3RoLGU9dm9pZCAwO2M8ZCYmKGU9YltjXSk7YysrKXVjKGUpfWlmKGE9dihhKSlhLks9dm9pZCAwfWZ1bmN0aW9uIHZjKGEpe3ZhciBiPWE7YSYmInNsb3QiPT09YS5sb2NhbE5hbWUmJihiPShiPShiPXYoYSkpJiZiLkQpJiZiLmxlbmd0aD9iWzBdOnZjKGEuX19zaGFkeV9uZXh0U2libGluZykpO3JldHVybiBifQpmdW5jdGlvbiB3YyhhLGIsYyl7aWYoYT0oYT12KGEpKSYmYS5IKWImJmEuYWRkZWROb2Rlcy5wdXNoKGIpLGMmJmEucmVtb3ZlZE5vZGVzLnB1c2goYyksYWIoYSl9CnZhciBDYz1CKHtnZXQgcGFyZW50Tm9kZSgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLnBhcmVudE5vZGU7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGV9LGdldCBmaXJzdENoaWxkKCl7dmFyIGE9dih0aGlzKTthPWEmJmEuZmlyc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfZmlyc3RDaGlsZH0sZ2V0IGxhc3RDaGlsZCgpe3ZhciBhPXYodGhpcyk7YT1hJiZhLmxhc3RDaGlsZDtyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdENoaWxkfSxnZXQgbmV4dFNpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5uZXh0U2libGluZztyZXR1cm4gdm9pZCAwIT09YT9hOnRoaXMuX19zaGFkeV9uYXRpdmVfbmV4dFNpYmxpbmd9LGdldCBwcmV2aW91c1NpYmxpbmcoKXt2YXIgYT12KHRoaXMpO2E9YSYmYS5wcmV2aW91c1NpYmxpbmc7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3ByZXZpb3VzU2libGluZ30sCmdldCBjaGlsZE5vZGVzKCl7aWYoeSh0aGlzKSl7dmFyIGE9dih0aGlzKTtpZighYS5jaGlsZE5vZGVzKXthLmNoaWxkTm9kZXM9W107Zm9yKHZhciBiPXRoaXMuX19zaGFkeV9maXJzdENoaWxkO2I7Yj1iLl9fc2hhZHlfbmV4dFNpYmxpbmcpYS5jaGlsZE5vZGVzLnB1c2goYil9dmFyIGM9YS5jaGlsZE5vZGVzfWVsc2UgYz10aGlzLl9fc2hhZHlfbmF0aXZlX2NoaWxkTm9kZXM7Yy5pdGVtPWZ1bmN0aW9uKGEpe3JldHVybiBjW2FdfTtyZXR1cm4gY30sZ2V0IHBhcmVudEVsZW1lbnQoKXt2YXIgYT12KHRoaXMpOyhhPWEmJmEucGFyZW50Tm9kZSkmJmEubm9kZVR5cGUhPT1Ob2RlLkVMRU1FTlRfTk9ERSYmKGE9bnVsbCk7cmV0dXJuIHZvaWQgMCE9PWE/YTp0aGlzLl9fc2hhZHlfbmF0aXZlX3BhcmVudEVsZW1lbnR9LGdldCBpc0Nvbm5lY3RlZCgpe2lmKHNjJiZzYy5jYWxsKHRoaXMpKXJldHVybiEwO2lmKHRoaXMubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSlyZXR1cm4hMTsKdmFyIGE9dGhpcy5vd25lckRvY3VtZW50O2lmKFRhKXtpZihhLl9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpKXJldHVybiEwfWVsc2UgaWYoYS5kb2N1bWVudEVsZW1lbnQmJmEuZG9jdW1lbnRFbGVtZW50Ll9fc2hhZHlfbmF0aXZlX2NvbnRhaW5zKHRoaXMpKXJldHVybiEwO2ZvcihhPXRoaXM7YSYmIShhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEuX19zaGFkeV9wYXJlbnROb2RlfHwoeihhKT9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hIShhJiZhIGluc3RhbmNlb2YgRG9jdW1lbnQpfSxnZXQgdGV4dENvbnRlbnQoKXtpZih5KHRoaXMpKXtmb3IodmFyIGE9W10sYj0wLGM9dGhpcy5fX3NoYWR5X2NoaWxkTm9kZXMsZDtkPWNbYl07YisrKWQubm9kZVR5cGUhPT1Ob2RlLkNPTU1FTlRfTk9ERSYmYS5wdXNoKGQuX19zaGFkeV90ZXh0Q29udGVudCk7cmV0dXJuIGEuam9pbigiIil9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfdGV4dENvbnRlbnR9LHNldCB0ZXh0Q29udGVudChhKXtpZigidW5kZWZpbmVkIj09PQp0eXBlb2YgYXx8bnVsbD09PWEpYT0iIjtzd2l0Y2godGhpcy5ub2RlVHlwZSl7Y2FzZSBOb2RlLkVMRU1FTlRfTk9ERTpjYXNlIE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERTppZigheSh0aGlzKSYmdy5tKXt2YXIgYj10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDsoYiE9dGhpcy5fX3NoYWR5X2xhc3RDaGlsZHx8YiYmYi5ub2RlVHlwZSE9Tm9kZS5URVhUX05PREUpJiZ0Yyh0aGlzKTt0aGlzLl9fc2hhZHlfbmF0aXZlX3RleHRDb250ZW50PWF9ZWxzZSB0Yyh0aGlzKSwoMDxhLmxlbmd0aHx8dGhpcy5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKSYmdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSk7YnJlYWs7ZGVmYXVsdDp0aGlzLm5vZGVWYWx1ZT1hfX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGEsYil7aWYodGhpcy5vd25lckRvY3VtZW50IT09cGMmJmEub3duZXJEb2N1bWVudCE9PXBjKXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShhLApiKSxhO2lmKGE9PT10aGlzKXRocm93IEVycm9yKCJGYWlsZWQgdG8gZXhlY3V0ZSAnYXBwZW5kQ2hpbGQnIG9uICdOb2RlJzogVGhlIG5ldyBjaGlsZCBlbGVtZW50IGNvbnRhaW5zIHRoZSBwYXJlbnQuIik7aWYoYil7dmFyIGM9dihiKTtjPWMmJmMucGFyZW50Tm9kZTtpZih2b2lkIDAhPT1jJiZjIT09dGhpc3x8dm9pZCAwPT09YyYmYi5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlIT09dGhpcyl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGV4ZWN1dGUgJ2luc2VydEJlZm9yZScgb24gJ05vZGUnOiBUaGUgbm9kZSBiZWZvcmUgd2hpY2ggdGhlIG5ldyBub2RlIGlzIHRvIGJlIGluc2VydGVkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbm9kZS4iKTt9aWYoYj09PWEpcmV0dXJuIGE7dmFyIGQ9W10sZT0oYz14Yyh0aGlzKSk/Yy5ob3N0LmxvY2FsTmFtZTpuYyh0aGlzKSxmPWEuX19zaGFkeV9wYXJlbnROb2RlO2lmKGYpe3ZhciBnPW5jKGEpO2YuX19zaGFkeV9yZW1vdmVDaGlsZChhLCEhY3x8CiF4YyhhKSl9Zj0hMDt2YXIgaD0oIXFjfHx2b2lkIDA9PT1hLl9fbm9JbnNlcnRpb25Qb2ludCkmJiFtYyhhLGUpLGs9YyYmIWEuX19ub0luc2VydGlvblBvaW50JiYoIXFjfHxhLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKTtpZihrfHxoKWgmJihnPWd8fG5jKGEpKSxvYyhhLGZ1bmN0aW9uKGEpe2smJiJzbG90Ij09PWEubG9jYWxOYW1lJiZkLnB1c2goYSk7aWYoaCl7dmFyIGI9ZztHKCkmJihiJiZsYyhhLGIpLChiPUcoKSkmJmIuc2NvcGVOb2RlKGEsZSkpfX0pO2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lfHxkLmxlbmd0aClkLmxlbmd0aCYmKGMuYz1jLmN8fFtdLGMuYT1jLmF8fFtdLGMuYj1jLmJ8fHt9LGMuYy5wdXNoLmFwcGx5KGMuYyxkIGluc3RhbmNlb2YgQXJyYXk/ZDpqYShpYShkKSkpKSxjJiZBYyhjKTt5KHRoaXMpJiYoaGMoYSx0aGlzLGIpLGM9dih0aGlzKSxMYSh0aGlzKT8oQWMoYy5yb290KSxmPSExKTpjLnJvb3QmJihmPSExKSk7Zj8KKGM9eih0aGlzKT90aGlzLmhvc3Q6dGhpcyxiPyhiPXZjKGIpLGMuX19zaGFkeV9uYXRpdmVfaW5zZXJ0QmVmb3JlKGEsYikpOmMuX19zaGFkeV9uYXRpdmVfYXBwZW5kQ2hpbGQoYSkpOmEub3duZXJEb2N1bWVudCE9PXRoaXMub3duZXJEb2N1bWVudCYmdGhpcy5vd25lckRvY3VtZW50LmFkb3B0Tm9kZShhKTt3Yyh0aGlzLGEpO3JldHVybiBhfSxhcHBlbmRDaGlsZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX0scmVtb3ZlQ2hpbGQ6ZnVuY3Rpb24oYSxiKXtiPXZvaWQgMD09PWI/ITE6YjtpZih0aGlzLm93bmVyRG9jdW1lbnQhPT1wYylyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChhKTtpZihhLl9fc2hhZHlfcGFyZW50Tm9kZSE9PXRoaXMpdGhyb3cgRXJyb3IoIlRoZSBub2RlIHRvIGJlIHJlbW92ZWQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyBub2RlOiAiK2EpO3ZhciBjPXhjKGEpLGQ9YyYmQmMoYyxhKSxlPXYodGhpcyk7CmlmKHkodGhpcykmJihpYyhhLHRoaXMpLExhKHRoaXMpKSl7QWMoZS5yb290KTt2YXIgZj0hMH1pZihHKCkmJiFiJiZjKXt2YXIgZz1uYyhhKTtvYyhhLGZ1bmN0aW9uKGEpe2xjKGEsZyl9KX11YyhhKTtjJiYoKGI9dGhpcyYmInNsb3QiPT09dGhpcy5sb2NhbE5hbWUpJiYoZj0hMCksKGR8fGIpJiZBYyhjKSk7Znx8KGY9eih0aGlzKT90aGlzLmhvc3Q6dGhpcywoIWUucm9vdCYmInNsb3QiIT09YS5sb2NhbE5hbWV8fGY9PT1hLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUpJiZmLl9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGEpKTt3Yyh0aGlzLG51bGwsYSk7cmV0dXJuIGF9LHJlcGxhY2VDaGlsZDpmdW5jdGlvbihhLGIpe3RoaXMuX19zaGFkeV9pbnNlcnRCZWZvcmUoYSxiKTt0aGlzLl9fc2hhZHlfcmVtb3ZlQ2hpbGQoYik7cmV0dXJuIGF9LGNsb25lTm9kZTpmdW5jdGlvbihhKXtpZigidGVtcGxhdGUiPT10aGlzLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9jbG9uZU5vZGUoYSk7CnZhciBiPXRoaXMuX19zaGFkeV9uYXRpdmVfY2xvbmVOb2RlKCExKTtpZihhJiZiLm5vZGVUeXBlIT09Tm9kZS5BVFRSSUJVVEVfTk9ERSl7YT10aGlzLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGM9MCxkO2M8YS5sZW5ndGg7YysrKWQ9YVtjXS5fX3NoYWR5X2Nsb25lTm9kZSghMCksYi5fX3NoYWR5X2FwcGVuZENoaWxkKGQpfXJldHVybiBifSxnZXRSb290Tm9kZTpmdW5jdGlvbihhKXtpZih0aGlzJiZ0aGlzLm5vZGVUeXBlKXt2YXIgYj11KHRoaXMpLGM9Yi5LO3ZvaWQgMD09PWMmJih6KHRoaXMpPyhjPXRoaXMsYi5LPWMpOihjPShjPXRoaXMuX19zaGFkeV9wYXJlbnROb2RlKT9jLl9fc2hhZHlfZ2V0Um9vdE5vZGUoYSk6dGhpcyxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuX19zaGFkeV9uYXRpdmVfY29udGFpbnModGhpcykmJihiLks9YykpKTtyZXR1cm4gY319LGNvbnRhaW5zOmZ1bmN0aW9uKGEpe3JldHVybiBVYSh0aGlzLGEpfX0pO2Z1bmN0aW9uIERjKGEsYixjKXt2YXIgZD1bXTtFYyhhLl9fc2hhZHlfY2hpbGROb2RlcyxiLGMsZCk7cmV0dXJuIGR9ZnVuY3Rpb24gRWMoYSxiLGMsZCl7Zm9yKHZhciBlPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtlPGYmJihnPWFbZV0pO2UrKyl7dmFyIGg7aWYoaD1nLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe2g9Zzt2YXIgaz1iLGw9YyxtPWQscT1rKGgpO3EmJm0ucHVzaChoKTtsJiZsKHEpP2g9cTooRWMoaC5fX3NoYWR5X2NoaWxkTm9kZXMsayxsLG0pLGg9dm9pZCAwKX1pZihoKWJyZWFrfX0KdmFyIEZjPUIoe2dldCBmaXJzdEVsZW1lbnRDaGlsZCgpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5maXJzdENoaWxkKXtmb3IoYT10aGlzLl9fc2hhZHlfZmlyc3RDaGlsZDthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X25leHRTaWJsaW5nO3JldHVybiBhfXJldHVybiB0aGlzLl9fc2hhZHlfbmF0aXZlX2ZpcnN0RWxlbWVudENoaWxkfSxnZXQgbGFzdEVsZW1lbnRDaGlsZCgpe3ZhciBhPXYodGhpcyk7aWYoYSYmdm9pZCAwIT09YS5sYXN0Q2hpbGQpe2ZvcihhPXRoaXMuX19zaGFkeV9sYXN0Q2hpbGQ7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9wcmV2aW91c1NpYmxpbmc7cmV0dXJuIGF9cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfbGFzdEVsZW1lbnRDaGlsZH0sZ2V0IGNoaWxkcmVuKCl7cmV0dXJuIHkodGhpcyk/VmEoQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKHRoaXMuX19zaGFkeV9jaGlsZE5vZGVzLApmdW5jdGlvbihhKXtyZXR1cm4gYS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFfSkpOnRoaXMuX19zaGFkeV9uYXRpdmVfY2hpbGRyZW59LGdldCBjaGlsZEVsZW1lbnRDb3VudCgpe3ZhciBhPXRoaXMuX19zaGFkeV9jaGlsZHJlbjtyZXR1cm4gYT9hLmxlbmd0aDowfX0pLEdjPUIoe3F1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24oYSl7cmV0dXJuIERjKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIE9hLmNhbGwoYixhKX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9LHF1ZXJ5U2VsZWN0b3JBbGw6ZnVuY3Rpb24oYSxiKXtpZihiKXtiPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuX19zaGFkeV9uYXRpdmVfcXVlcnlTZWxlY3RvckFsbChhKSk7dmFyIGM9dGhpcy5fX3NoYWR5X2dldFJvb3ROb2RlKCk7cmV0dXJuIGIuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBhLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKT09Y30pfXJldHVybiBEYyh0aGlzLGZ1bmN0aW9uKGIpe3JldHVybiBPYS5jYWxsKGIsCmEpfSl9fSksSGM9dy5vYT9PYmplY3QuYXNzaWduKHt9LEZjKTpGYztPYmplY3QuYXNzaWduKEZjLEdjKTt2YXIgSWM9Qih7Z2V0RWxlbWVudEJ5SWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIiI9PT1hP251bGw6RGModGhpcyxmdW5jdGlvbihiKXtyZXR1cm4gYi5pZD09YX0sZnVuY3Rpb24oYSl7cmV0dXJuISFhfSlbMF18fG51bGx9fSk7dmFyIEpjPUIoe2dldCBhY3RpdmVFbGVtZW50KCl7dmFyIGE9dy5tP2RvY3VtZW50Ll9fc2hhZHlfbmF0aXZlX2FjdGl2ZUVsZW1lbnQ6ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtpZighYXx8IWEubm9kZVR5cGUpcmV0dXJuIG51bGw7dmFyIGI9ISF6KHRoaXMpO2lmKCEodGhpcz09PWRvY3VtZW50fHxiJiZ0aGlzLmhvc3QhPT1hJiZ0aGlzLmhvc3QuX19zaGFkeV9uYXRpdmVfY29udGFpbnMoYSkpKXJldHVybiBudWxsO2ZvcihiPXhjKGEpO2ImJmIhPT10aGlzOylhPWIuaG9zdCxiPXhjKGEpO3JldHVybiB0aGlzPT09ZG9jdW1lbnQ/Yj9udWxsOmE6Yj09PXRoaXM/YTpudWxsfX0pO3ZhciBLYz1kb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoImluZXJ0IiksTGM9Qih7Z2V0IGlubmVySFRNTCgpe3JldHVybiB5KHRoaXMpP2tiKCJ0ZW1wbGF0ZSI9PT10aGlzLmxvY2FsTmFtZT90aGlzLmNvbnRlbnQ6dGhpcyxmdW5jdGlvbihhKXtyZXR1cm4gYS5fX3NoYWR5X2NoaWxkTm9kZXN9KTp0aGlzLl9fc2hhZHlfbmF0aXZlX2lubmVySFRNTH0sc2V0IGlubmVySFRNTChhKXtpZigidGVtcGxhdGUiPT09dGhpcy5sb2NhbE5hbWUpdGhpcy5fX3NoYWR5X25hdGl2ZV9pbm5lckhUTUw9YTtlbHNle3RjKHRoaXMpO3ZhciBiPXRoaXMubG9jYWxOYW1lfHwiZGl2IjtiPXRoaXMubmFtZXNwYWNlVVJJJiZ0aGlzLm5hbWVzcGFjZVVSSSE9PUtjLm5hbWVzcGFjZVVSST9LYy5jcmVhdGVFbGVtZW50TlModGhpcy5uYW1lc3BhY2VVUkksYik6S2MuY3JlYXRlRWxlbWVudChiKTtmb3Iody5tP2IuX19zaGFkeV9uYXRpdmVfaW5uZXJIVE1MPWE6Yi5pbm5lckhUTUw9CmE7YT1iLl9fc2hhZHlfZmlyc3RDaGlsZDspdGhpcy5fX3NoYWR5X2luc2VydEJlZm9yZShhKX19fSk7dmFyIE1jPUIoe2FkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiLGMpeyJvYmplY3QiIT09dHlwZW9mIGMmJihjPXtjYXB0dXJlOiEhY30pO2MuJD10aGlzO3RoaXMuaG9zdC5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYixjKXsib2JqZWN0IiE9PXR5cGVvZiBjJiYoYz17Y2FwdHVyZTohIWN9KTtjLiQ9dGhpczt0aGlzLmhvc3QuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX19KTtmdW5jdGlvbiBOYyhhLGIpe0EoYSxNYyxiKTtBKGEsSmMsYik7QShhLExjLGIpO0EoYSxGYyxiKTt3LkomJiFiPyhBKGEsQ2MsYiksQShhLEljLGIpKTp3Lm18fChBKGEsQWIpLEEoYSx6YikpfTt2YXIgT2M9e30sUGM9dy5kZWZlckNvbm5lY3Rpb25DYWxsYmFja3MmJiJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUsUWM7ZnVuY3Rpb24gUmMoYSl7dmFyIGI9W107ZG8gYi51bnNoaWZ0KGEpO3doaWxlKGE9YS5fX3NoYWR5X3BhcmVudE5vZGUpO3JldHVybiBifQpmdW5jdGlvbiBTYyhhLGIsYyl7aWYoYSE9PU9jKXRocm93IG5ldyBUeXBlRXJyb3IoIklsbGVnYWwgY29uc3RydWN0b3IiKTt0aGlzLnphPSJTaGFkeVJvb3QiO3RoaXMuaG9zdD1iO3RoaXMubW9kZT1jJiZjLm1vZGU7amMoYik7YT11KGIpO2Eucm9vdD10aGlzO2EucGE9ImNsb3NlZCIhPT10aGlzLm1vZGU/dGhpczpudWxsO2E9dSh0aGlzKTthLmZpcnN0Q2hpbGQ9YS5sYXN0Q2hpbGQ9YS5wYXJlbnROb2RlPWEubmV4dFNpYmxpbmc9YS5wcmV2aW91c1NpYmxpbmc9bnVsbDthLmNoaWxkTm9kZXM9W107dGhpcy5iYT10aGlzLkI9ITE7dGhpcy5jPXRoaXMuYj10aGlzLmE9bnVsbDtpZih3LnByZWZlclBlcmZvcm1hbmNlKWZvcig7YT1iLl9fc2hhZHlfbmF0aXZlX2ZpcnN0Q2hpbGQ7KWIuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQ2hpbGQoYSk7ZWxzZSBBYyh0aGlzKX1mdW5jdGlvbiBBYyhhKXthLkJ8fChhLkI9ITAsWWEoZnVuY3Rpb24oKXtyZXR1cm4gVGMoYSl9KSl9CmZ1bmN0aW9uIFRjKGEpe3ZhciBiO2lmKGI9YS5CKXtmb3IodmFyIGM7YTspYTp7YS5CJiYoYz1hKSxiPWE7YT1iLmhvc3QuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKHooYSkmJihiPXYoYi5ob3N0KSkmJjA8Yi5OKWJyZWFrIGE7YT12b2lkIDB9Yj1jfShjPWIpJiZjLl9yZW5kZXJTZWxmKCl9ClNjLnByb3RvdHlwZS5fcmVuZGVyU2VsZj1mdW5jdGlvbigpe3ZhciBhPVBjO1BjPSEwO3RoaXMuQj0hMTtpZih0aGlzLmEpe1VjKHRoaXMpO2Zvcih2YXIgYj0wLGM7Yjx0aGlzLmEubGVuZ3RoO2IrKyl7Yz10aGlzLmFbYl07dmFyIGQ9dihjKSxlPWQuYXNzaWduZWROb2RlcztkLmFzc2lnbmVkTm9kZXM9W107ZC5EPVtdO2lmKGQuY2E9ZSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj12KGVbZF0pO2YuUD1mLmFzc2lnbmVkU2xvdDtmLmFzc2lnbmVkU2xvdD09PWMmJihmLmFzc2lnbmVkU2xvdD1udWxsKX19Zm9yKGI9dGhpcy5ob3N0Ll9fc2hhZHlfZmlyc3RDaGlsZDtiO2I9Yi5fX3NoYWR5X25leHRTaWJsaW5nKVZjKHRoaXMsYik7Zm9yKGI9MDtiPHRoaXMuYS5sZW5ndGg7YisrKXtjPXRoaXMuYVtiXTtlPXYoYyk7aWYoIWUuYXNzaWduZWROb2Rlcy5sZW5ndGgpZm9yKGQ9Yy5fX3NoYWR5X2ZpcnN0Q2hpbGQ7ZDtkPWQuX19zaGFkeV9uZXh0U2libGluZylWYyh0aGlzLApkLGMpOyhkPShkPXYoYy5fX3NoYWR5X3BhcmVudE5vZGUpKSYmZC5yb290KSYmKE1hKGQpfHxkLkIpJiZkLl9yZW5kZXJTZWxmKCk7V2ModGhpcyxlLkQsZS5hc3NpZ25lZE5vZGVzKTtpZihkPWUuY2Epe2ZvcihmPTA7ZjxkLmxlbmd0aDtmKyspdihkW2ZdKS5QPW51bGw7ZS5jYT1udWxsO2QubGVuZ3RoPmUuYXNzaWduZWROb2Rlcy5sZW5ndGgmJihlLlQ9ITApfWUuVCYmKGUuVD0hMSxYYyh0aGlzLGMpKX1jPXRoaXMuYTtiPVtdO2ZvcihlPTA7ZTxjLmxlbmd0aDtlKyspZD1jW2VdLl9fc2hhZHlfcGFyZW50Tm9kZSwoZj12KGQpKSYmZi5yb290fHwhKDA+Yi5pbmRleE9mKGQpKXx8Yi5wdXNoKGQpO2ZvcihjPTA7YzxiLmxlbmd0aDtjKyspe2Y9YltjXTtlPWY9PT10aGlzP3RoaXMuaG9zdDpmO2Q9W107Zj1mLl9fc2hhZHlfY2hpbGROb2Rlcztmb3IodmFyIGc9MDtnPGYubGVuZ3RoO2crKyl7dmFyIGg9ZltnXTtpZigic2xvdCI9PWgubG9jYWxOYW1lKXtoPXYoaCkuRDtmb3IodmFyIGs9CjA7azxoLmxlbmd0aDtrKyspZC5wdXNoKGhba10pfWVsc2UgZC5wdXNoKGgpfWY9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZS5fX3NoYWR5X25hdGl2ZV9jaGlsZE5vZGVzKTtnPWVjKGQsZC5sZW5ndGgsZixmLmxlbmd0aCk7az1oPTA7Zm9yKHZhciBsPXZvaWQgMDtoPGcubGVuZ3RoJiYobD1nW2hdKTtoKyspe2Zvcih2YXIgbT0wLHE9dm9pZCAwO208bC5MLmxlbmd0aCYmKHE9bC5MW21dKTttKyspcS5fX3NoYWR5X25hdGl2ZV9wYXJlbnROb2RlPT09ZSYmZS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChxKSxmLnNwbGljZShsLmluZGV4K2ssMSk7ay09bC5SfWs9MDtmb3IobD12b2lkIDA7azxnLmxlbmd0aCYmKGw9Z1trXSk7aysrKWZvcihoPWZbbC5pbmRleF0sbT1sLmluZGV4O208bC5pbmRleCtsLlI7bSsrKXE9ZFttXSxlLl9fc2hhZHlfbmF0aXZlX2luc2VydEJlZm9yZShxLGgpLGYuc3BsaWNlKG0sMCxxKX19aWYoIXcucHJlZmVyUGVyZm9ybWFuY2UmJiF0aGlzLmJhKWZvcihiPQp0aGlzLmhvc3QuX19zaGFkeV9jaGlsZE5vZGVzLGM9MCxlPWIubGVuZ3RoO2M8ZTtjKyspZD1iW2NdLGY9dihkKSxkLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGUhPT10aGlzLmhvc3R8fCJzbG90IiE9PWQubG9jYWxOYW1lJiZmLmFzc2lnbmVkU2xvdHx8dGhpcy5ob3N0Ll9fc2hhZHlfbmF0aXZlX3JlbW92ZUNoaWxkKGQpO3RoaXMuYmE9ITA7UGM9YTtRYyYmUWMoKX07ZnVuY3Rpb24gVmMoYSxiLGMpe3ZhciBkPXUoYiksZT1kLlA7ZC5QPW51bGw7Y3x8KGM9KGE9YS5iW2IuX19zaGFkeV9zbG90fHwiX19jYXRjaGFsbCJdKSYmYVswXSk7Yz8odShjKS5hc3NpZ25lZE5vZGVzLnB1c2goYiksZC5hc3NpZ25lZFNsb3Q9Yyk6ZC5hc3NpZ25lZFNsb3Q9dm9pZCAwO2UhPT1kLmFzc2lnbmVkU2xvdCYmZC5hc3NpZ25lZFNsb3QmJih1KGQuYXNzaWduZWRTbG90KS5UPSEwKX0KZnVuY3Rpb24gV2MoYSxiLGMpe2Zvcih2YXIgZD0wLGU9dm9pZCAwO2Q8Yy5sZW5ndGgmJihlPWNbZF0pO2QrKylpZigic2xvdCI9PWUubG9jYWxOYW1lKXt2YXIgZj12KGUpLmFzc2lnbmVkTm9kZXM7ZiYmZi5sZW5ndGgmJldjKGEsYixmKX1lbHNlIGIucHVzaChjW2RdKX1mdW5jdGlvbiBYYyhhLGIpe2IuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoInNsb3RjaGFuZ2UiKSk7Yj12KGIpO2IuYXNzaWduZWRTbG90JiZYYyhhLGIuYXNzaWduZWRTbG90KX0KZnVuY3Rpb24gVWMoYSl7aWYoYS5jJiZhLmMubGVuZ3RoKXtmb3IodmFyIGI9YS5jLGMsZD0wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgZT1iW2RdO2pjKGUpO3ZhciBmPWUuX19zaGFkeV9wYXJlbnROb2RlO2pjKGYpO2Y9dihmKTtmLk49KGYuTnx8MCkrMTtmPVljKGUpO2EuYltmXT8oYz1jfHx7fSxjW2ZdPSEwLGEuYltmXS5wdXNoKGUpKTphLmJbZl09W2VdO2EuYS5wdXNoKGUpfWlmKGMpZm9yKHZhciBnIGluIGMpYS5iW2ddPVpjKGEuYltnXSk7YS5jPVtdfX1mdW5jdGlvbiBZYyhhKXt2YXIgYj1hLm5hbWV8fGEuZ2V0QXR0cmlidXRlKCJuYW1lIil8fCJfX2NhdGNoYWxsIjtyZXR1cm4gYS53YT1ifQpmdW5jdGlvbiBaYyhhKXtyZXR1cm4gYS5zb3J0KGZ1bmN0aW9uKGEsYyl7YT1SYyhhKTtmb3IodmFyIGI9UmMoYyksZT0wO2U8YS5sZW5ndGg7ZSsrKXtjPWFbZV07dmFyIGY9YltlXTtpZihjIT09ZilyZXR1cm4gYT1BcnJheS5mcm9tKGMuX19zaGFkeV9wYXJlbnROb2RlLl9fc2hhZHlfY2hpbGROb2RlcyksYS5pbmRleE9mKGMpLWEuaW5kZXhPZihmKX19KX0KZnVuY3Rpb24gQmMoYSxiKXtpZihhLmEpe1VjKGEpO3ZhciBjPWEuYixkO2ZvcihkIGluIGMpZm9yKHZhciBlPWNbZF0sZj0wO2Y8ZS5sZW5ndGg7ZisrKXt2YXIgZz1lW2ZdO2lmKFVhKGIsZykpe2Uuc3BsaWNlKGYsMSk7dmFyIGg9YS5hLmluZGV4T2YoZyk7MDw9aCYmKGEuYS5zcGxpY2UoaCwxKSwoaD12KGcuX19zaGFkeV9wYXJlbnROb2RlKSkmJmguTiYmaC5OLS0pO2YtLTtnPXYoZyk7aWYoaD1nLkQpZm9yKHZhciBrPTA7azxoLmxlbmd0aDtrKyspe3ZhciBsPWhba10sbT1sLl9fc2hhZHlfbmF0aXZlX3BhcmVudE5vZGU7bSYmbS5fX3NoYWR5X25hdGl2ZV9yZW1vdmVDaGlsZChsKX1nLkQ9W107Zy5hc3NpZ25lZE5vZGVzPVtdO2g9ITB9fXJldHVybiBofX1mdW5jdGlvbiBNYShhKXtVYyhhKTtyZXR1cm4hKCFhLmF8fCFhLmEubGVuZ3RoKX0KKGZ1bmN0aW9uKGEpe2EuX19wcm90b19fPURvY3VtZW50RnJhZ21lbnQucHJvdG90eXBlO05jKGEsIl9fc2hhZHlfIik7TmMoYSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoYSx7bm9kZVR5cGU6e3ZhbHVlOk5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSxjb25maWd1cmFibGU6ITB9LG5vZGVOYW1lOnt2YWx1ZToiI2RvY3VtZW50LWZyYWdtZW50Iixjb25maWd1cmFibGU6ITB9LG5vZGVWYWx1ZTp7dmFsdWU6bnVsbCxjb25maWd1cmFibGU6ITB9fSk7WyJsb2NhbE5hbWUiLCJuYW1lc3BhY2VVUkkiLCJwcmVmaXgiXS5mb3JFYWNoKGZ1bmN0aW9uKGIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLGIse3ZhbHVlOnZvaWQgMCxjb25maWd1cmFibGU6ITB9KX0pO1sib3duZXJEb2N1bWVudCIsImJhc2VVUkkiLCJpc0Nvbm5lY3RlZCJdLmZvckVhY2goZnVuY3Rpb24oYil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGEsYix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaG9zdFtiXX0sCmNvbmZpZ3VyYWJsZTohMH0pfSl9KShTYy5wcm90b3R5cGUpOwppZih3aW5kb3cuY3VzdG9tRWxlbWVudHMmJncuZWEmJiF3LnByZWZlclBlcmZvcm1hbmNlKXt2YXIgJGM9bmV3IE1hcDtRYz1mdW5jdGlvbigpe3ZhciBhPVtdOyRjLmZvckVhY2goZnVuY3Rpb24oYixjKXthLnB1c2goW2MsYl0pfSk7JGMuY2xlYXIoKTtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXVswXTthW2JdWzFdP2MudWEoKTpjLnZhKCl9fTtQYyYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZnVuY3Rpb24oKXtQYz0hMTtRYygpfSx7b25jZTohMH0pO3ZhciBhZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9MCxlPSJfX2lzQ29ubmVjdGVkIitkKys7aWYoYnx8YylhLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaz1hLnByb3RvdHlwZS51YT1mdW5jdGlvbigpe1BjPyRjLnNldCh0aGlzLCEwKTp0aGlzW2VdfHwodGhpc1tlXT0hMCxiJiZiLmNhbGwodGhpcykpfSxhLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaz0KYS5wcm90b3R5cGUudmE9ZnVuY3Rpb24oKXtQYz90aGlzLmlzQ29ubmVjdGVkfHwkYy5zZXQodGhpcywhMSk6dGhpc1tlXSYmKHRoaXNbZV09ITEsYyYmYy5jYWxsKHRoaXMpKX07cmV0dXJuIGF9LGJkPXdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5DdXN0b21FbGVtZW50UmVnaXN0cnkucHJvdG90eXBlLCJkZWZpbmUiLHt2YWx1ZTpmdW5jdGlvbihhLGIpe3ZhciBjPWIucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrLGQ9Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s7YmQuY2FsbCh3aW5kb3cuY3VzdG9tRWxlbWVudHMsYSxhZChiLGMsZCkpO2IucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWM7Yi5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2s9ZH19KX1mdW5jdGlvbiB4YyhhKXthPWEuX19zaGFkeV9nZXRSb290Tm9kZSgpO2lmKHooYSkpcmV0dXJuIGF9O2Z1bmN0aW9uIGNkKGEpe3RoaXMubm9kZT1hfW49Y2QucHJvdG90eXBlO24uYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FkZEV2ZW50TGlzdGVuZXIoYSxiLGMpfTtuLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVFdmVudExpc3RlbmVyKGEsYixjKX07bi5hcHBlbmRDaGlsZD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXBwZW5kQ2hpbGQoYSl9O24uaW5zZXJ0QmVmb3JlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2luc2VydEJlZm9yZShhLGIpfTtuLnJlbW92ZUNoaWxkPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVDaGlsZChhKX07bi5yZXBsYWNlQ2hpbGQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcmVwbGFjZUNoaWxkKGEsYil9OwpuLmNsb25lTm9kZT1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2xvbmVOb2RlKGEpfTtuLmdldFJvb3ROb2RlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRSb290Tm9kZShhKX07bi5jb250YWlucz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY29udGFpbnMoYSl9O24uZGlzcGF0Y2hFdmVudD1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZGlzcGF0Y2hFdmVudChhKX07bi5zZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxiKXt0aGlzLm5vZGUuX19zaGFkeV9zZXRBdHRyaWJ1dGUoYSxiKX07bi5nZXRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25hdGl2ZV9nZXRBdHRyaWJ1dGUoYSl9O24uaGFzQXR0cmlidXRlPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9uYXRpdmVfaGFzQXR0cmlidXRlKGEpfTtuLnJlbW92ZUF0dHJpYnV0ZT1mdW5jdGlvbihhKXt0aGlzLm5vZGUuX19zaGFkeV9yZW1vdmVBdHRyaWJ1dGUoYSl9OwpuLmF0dGFjaFNoYWRvdz1mdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfYXR0YWNoU2hhZG93KGEpfTtuLmZvY3VzPWZ1bmN0aW9uKCl7dGhpcy5ub2RlLl9fc2hhZHlfbmF0aXZlX2ZvY3VzKCl9O24uYmx1cj1mdW5jdGlvbigpe3RoaXMubm9kZS5fX3NoYWR5X2JsdXIoKX07bi5pbXBvcnROb2RlPWZ1bmN0aW9uKGEsYil7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9pbXBvcnROb2RlKGEsYil9O24uZ2V0RWxlbWVudEJ5SWQ9ZnVuY3Rpb24oYSl7aWYodGhpcy5ub2RlLm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9OT0RFKXJldHVybiB0aGlzLm5vZGUuX19zaGFkeV9nZXRFbGVtZW50QnlJZChhKX07bi5xdWVyeVNlbGVjdG9yPWZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9xdWVyeVNlbGVjdG9yKGEpfTsKbi5xdWVyeVNlbGVjdG9yQWxsPWZ1bmN0aW9uKGEsYil7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3F1ZXJ5U2VsZWN0b3JBbGwoYSxiKX07bi5hc3NpZ25lZE5vZGVzPWZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubm9kZS5sb2NhbE5hbWUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2Fzc2lnbmVkTm9kZXMoYSl9OwpwLk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGNkLnByb3RvdHlwZSx7YWN0aXZlRWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7aWYoeih0aGlzLm5vZGUpfHx0aGlzLm5vZGUubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX05PREUpcmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2FjdGl2ZUVsZW1lbnR9fSxfYWN0aXZlRWxlbWVudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYWN0aXZlRWxlbWVudH19LGhvc3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe2lmKHoodGhpcy5ub2RlKSlyZXR1cm4gdGhpcy5ub2RlLmhvc3R9fSxwYXJlbnROb2RlOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcGFyZW50Tm9kZX19LGZpcnN0Q2hpbGQ6e2NvbmZpZ3VyYWJsZTohMCwKZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RDaGlsZH19LGxhc3RDaGlsZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2xhc3RDaGlsZH19LG5leHRTaWJsaW5nOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbmV4dFNpYmxpbmd9fSxwcmV2aW91c1NpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c1NpYmxpbmd9fSxjaGlsZE5vZGVzOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGROb2Rlc319LHBhcmVudEVsZW1lbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLApnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfcGFyZW50RWxlbWVudH19LGZpcnN0RWxlbWVudENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfZmlyc3RFbGVtZW50Q2hpbGR9fSxsYXN0RWxlbWVudENoaWxkOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfbGFzdEVsZW1lbnRDaGlsZH19LG5leHRFbGVtZW50U2libGluZzp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X25leHRFbGVtZW50U2libGluZ319LHByZXZpb3VzRWxlbWVudFNpYmxpbmc6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfX0sCmNoaWxkcmVuOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfY2hpbGRyZW59fSxjaGlsZEVsZW1lbnRDb3VudDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2NoaWxkRWxlbWVudENvdW50fX0sc2hhZG93Um9vdDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X3NoYWRvd1Jvb3R9fSxhc3NpZ25lZFNsb3Q6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV9hc3NpZ25lZFNsb3R9fSxpc0Nvbm5lY3RlZDp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lzQ29ubmVjdGVkfX0saW5uZXJIVE1MOntjb25maWd1cmFibGU6ITAsCmVudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X2lubmVySFRNTD1hfX0sdGV4dENvbnRlbnQ6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGUuX19zaGFkeV90ZXh0Q29udGVudH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3RleHRDb250ZW50PWF9fSxzbG90Ontjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlLl9fc2hhZHlfc2xvdH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMubm9kZS5fX3NoYWR5X3Nsb3Q9YX19fSk7CmNjLmZvckVhY2goZnVuY3Rpb24oYSl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNkLnByb3RvdHlwZSxhLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlWyJfX3NoYWR5XyIrYV19LHNldDpmdW5jdGlvbihiKXt0aGlzLm5vZGVbIl9fc2hhZHlfIithXT1ifSxjb25maWd1cmFibGU6ITB9KX0pO3ZhciBkZD1uZXcgV2Vha01hcDtmdW5jdGlvbiBlZChhKXtpZih6KGEpfHxhIGluc3RhbmNlb2YgY2QpcmV0dXJuIGE7dmFyIGI9ZGQuZ2V0KGEpO2J8fChiPW5ldyBjZChhKSxkZC5zZXQoYSxiKSk7cmV0dXJuIGJ9O3ZhciBmZD1CKHtkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGEpe1phKCk7cmV0dXJuIHRoaXMuX19zaGFkeV9uYXRpdmVfZGlzcGF0Y2hFdmVudChhKX0sYWRkRXZlbnRMaXN0ZW5lcjpVYixyZW1vdmVFdmVudExpc3RlbmVyOldifSk7dmFyIGdkPUIoe2dldCBhc3NpZ25lZFNsb3QoKXt2YXIgYT10aGlzLl9fc2hhZHlfcGFyZW50Tm9kZTsoYT1hJiZhLl9fc2hhZHlfc2hhZG93Um9vdCkmJlRjKGEpO3JldHVybihhPXYodGhpcykpJiZhLmFzc2lnbmVkU2xvdHx8bnVsbH19KTt2YXIgaGQ9d2luZG93LmRvY3VtZW50O2Z1bmN0aW9uIGlkKGEsYil7aWYoInNsb3QiPT09YilhPWEuX19zaGFkeV9wYXJlbnROb2RlLExhKGEpJiZBYyh2KGEpLnJvb3QpO2Vsc2UgaWYoInNsb3QiPT09YS5sb2NhbE5hbWUmJiJuYW1lIj09PWImJihiPXhjKGEpKSl7aWYoYi5hKXtVYyhiKTt2YXIgYz1hLndhLGQ9WWMoYSk7aWYoZCE9PWMpe2M9Yi5iW2NdO3ZhciBlPWMuaW5kZXhPZihhKTswPD1lJiZjLnNwbGljZShlLDEpO2M9Yi5iW2RdfHwoYi5iW2RdPVtdKTtjLnB1c2goYSk7MTxjLmxlbmd0aCYmKGIuYltkXT1aYyhjKSl9fUFjKGIpfX0KdmFyIGpkPUIoe2dldCBwcmV2aW91c0VsZW1lbnRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLnByZXZpb3VzU2libGluZyl7Zm9yKGE9dGhpcy5fX3NoYWR5X3ByZXZpb3VzU2libGluZzthJiZhLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREU7KWE9YS5fX3NoYWR5X3ByZXZpb3VzU2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9wcmV2aW91c0VsZW1lbnRTaWJsaW5nfSxnZXQgbmV4dEVsZW1lbnRTaWJsaW5nKCl7dmFyIGE9dih0aGlzKTtpZihhJiZ2b2lkIDAhPT1hLm5leHRTaWJsaW5nKXtmb3IoYT10aGlzLl9fc2hhZHlfbmV4dFNpYmxpbmc7YSYmYS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFOylhPWEuX19zaGFkeV9uZXh0U2libGluZztyZXR1cm4gYX1yZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9uZXh0RWxlbWVudFNpYmxpbmd9LGdldCBzbG90KCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJzbG90Iil9LApzZXQgc2xvdChhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJzbG90IixhKX0sZ2V0IHNoYWRvd1Jvb3QoKXt2YXIgYT12KHRoaXMpO3JldHVybiBhJiZhLnBhfHxudWxsfSxnZXQgY2xhc3NOYW1lKCl7cmV0dXJuIHRoaXMuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn0sc2V0IGNsYXNzTmFtZShhKXt0aGlzLl9fc2hhZHlfc2V0QXR0cmlidXRlKCJjbGFzcyIsYSl9LHNldEF0dHJpYnV0ZTpmdW5jdGlvbihhLGIpe2lmKHRoaXMub3duZXJEb2N1bWVudCE9PWhkKXRoaXMuX19zaGFkeV9uYXRpdmVfc2V0QXR0cmlidXRlKGEsYik7ZWxzZXt2YXIgYzsoYz1HKCkpJiYiY2xhc3MiPT09YT8oYy5zZXRFbGVtZW50Q2xhc3ModGhpcyxiKSxjPSEwKTpjPSExO2N8fCh0aGlzLl9fc2hhZHlfbmF0aXZlX3NldEF0dHJpYnV0ZShhLGIpLGlkKHRoaXMsYSkpfX0scmVtb3ZlQXR0cmlidXRlOmZ1bmN0aW9uKGEpe3RoaXMuX19zaGFkeV9uYXRpdmVfcmVtb3ZlQXR0cmlidXRlKGEpO2lkKHRoaXMsCmEpfSxhdHRhY2hTaGFkb3c6ZnVuY3Rpb24oYSl7aWYoIXRoaXMpdGhyb3cgRXJyb3IoIk11c3QgcHJvdmlkZSBhIGhvc3QuIik7aWYoIWEpdGhyb3cgRXJyb3IoIk5vdCBlbm91Z2ggYXJndW1lbnRzLiIpO3JldHVybiBuZXcgU2MoT2MsdGhpcyxhKX19KTt2YXIga2Q9Qih7Ymx1cjpmdW5jdGlvbigpe3ZhciBhPXYodGhpcyk7KGE9KGE9YSYmYS5yb290KSYmYS5hY3RpdmVFbGVtZW50KT9hLl9fc2hhZHlfYmx1cigpOnRoaXMuX19zaGFkeV9uYXRpdmVfYmx1cigpfX0pO2NjLmZvckVhY2goZnVuY3Rpb24oYSl7a2RbYV09e3NldDpmdW5jdGlvbihiKXt2YXIgYz11KHRoaXMpLGQ9YS5zdWJzdHJpbmcoMik7Yy5PW2FdJiZ0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZCxjLk9bYV0pO3RoaXMuX19zaGFkeV9hZGRFdmVudExpc3RlbmVyKGQsYik7Yy5PW2FdPWJ9LGdldDpmdW5jdGlvbigpe3ZhciBiPXYodGhpcyk7cmV0dXJuIGImJmIuT1thXX0sY29uZmlndXJhYmxlOiEwfX0pO3ZhciBsZD1CKHthc3NpZ25lZE5vZGVzOmZ1bmN0aW9uKGEpe2lmKCJzbG90Ij09PXRoaXMubG9jYWxOYW1lKXt2YXIgYj10aGlzLl9fc2hhZHlfZ2V0Um9vdE5vZGUoKTtiJiZ6KGIpJiZUYyhiKTtyZXR1cm4oYj12KHRoaXMpKT8oYSYmYS5mbGF0dGVuP2IuRDpiLmFzc2lnbmVkTm9kZXMpfHxbXTpbXX19fSk7dmFyIG1kPXdpbmRvdy5kb2N1bWVudCxuZD1CKHtpbXBvcnROb2RlOmZ1bmN0aW9uKGEsYil7aWYoYS5vd25lckRvY3VtZW50IT09bWR8fCJ0ZW1wbGF0ZSI9PT1hLmxvY2FsTmFtZSlyZXR1cm4gdGhpcy5fX3NoYWR5X25hdGl2ZV9pbXBvcnROb2RlKGEsYik7dmFyIGM9dGhpcy5fX3NoYWR5X25hdGl2ZV9pbXBvcnROb2RlKGEsITEpO2lmKGIpe2E9YS5fX3NoYWR5X2NoaWxkTm9kZXM7Yj0wO2Zvcih2YXIgZDtiPGEubGVuZ3RoO2IrKylkPXRoaXMuX19zaGFkeV9pbXBvcnROb2RlKGFbYl0sITApLGMuX19zaGFkeV9hcHBlbmRDaGlsZChkKX1yZXR1cm4gY319KTt2YXIgb2Q9Qih7YWRkRXZlbnRMaXN0ZW5lcjpVYi5iaW5kKHdpbmRvdykscmVtb3ZlRXZlbnRMaXN0ZW5lcjpXYi5iaW5kKHdpbmRvdyl9KTt2YXIgcGQ9e307T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsInBhcmVudEVsZW1lbnQiKSYmKHBkLnBhcmVudEVsZW1lbnQ9Q2MucGFyZW50RWxlbWVudCk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNvbnRhaW5zIikmJihwZC5jb250YWlucz1DYy5jb250YWlucyk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNoaWxkcmVuIikmJihwZC5jaGlsZHJlbj1GYy5jaGlsZHJlbik7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpJiYocGQuaW5uZXJIVE1MPUxjLmlubmVySFRNTCk7T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsImNsYXNzTmFtZSIpJiYocGQuY2xhc3NOYW1lPWpkLmNsYXNzTmFtZSk7CnZhciBxZD17RXZlbnRUYXJnZXQ6W2ZkXSxOb2RlOltDYyx3aW5kb3cuRXZlbnRUYXJnZXQ/bnVsbDpmZF0sVGV4dDpbZ2RdLEVsZW1lbnQ6W2pkLEZjLGdkLCF3Lm18fCJpbm5lckhUTUwiaW4gRWxlbWVudC5wcm90b3R5cGU/TGM6bnVsbCx3aW5kb3cuSFRNTFNsb3RFbGVtZW50P251bGw6bGRdLEhUTUxFbGVtZW50OltrZCxwZF0sSFRNTFNsb3RFbGVtZW50OltsZF0sRG9jdW1lbnRGcmFnbWVudDpbSGMsSWNdLERvY3VtZW50OltuZCxIYyxJYyxKY10sV2luZG93OltvZF19LHJkPXcubT9udWxsOlsiaW5uZXJIVE1MIiwidGV4dENvbnRlbnQiXTtmdW5jdGlvbiBzZChhKXt2YXIgYj1hP251bGw6cmQsYz17fSxkO2ZvcihkIGluIHFkKWMuVz13aW5kb3dbZF0mJndpbmRvd1tkXS5wcm90b3R5cGUscWRbZF0uZm9yRWFjaChmdW5jdGlvbihjKXtyZXR1cm4gZnVuY3Rpb24oZCl7cmV0dXJuIGMuVyYmZCYmQShjLlcsZCxhLGIpfX0oYykpLGM9e1c6Yy5XfX07aWYody5lYSl7dmFyIFNoYWR5RE9NPXtpblVzZTp3LmVhLHBhdGNoOmZ1bmN0aW9uKGEpe0ZiKGEpO0ViKGEpO3JldHVybiBhfSxpc1NoYWR5Um9vdDp6LGVucXVldWU6WWEsZmx1c2g6WmEsZmx1c2hJbml0aWFsOmZ1bmN0aW9uKGEpeyFhLmJhJiZhLkImJlRjKGEpfSxzZXR0aW5nczp3LGZpbHRlck11dGF0aW9uczpkYixvYnNlcnZlQ2hpbGRyZW46YmIsdW5vYnNlcnZlQ2hpbGRyZW46Y2IsZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzOncuZGVmZXJDb25uZWN0aW9uQ2FsbGJhY2tzLHByZWZlclBlcmZvcm1hbmNlOncucHJlZmVyUGVyZm9ybWFuY2UsaGFuZGxlc0R5bmFtaWNTY29waW5nOiEwLHdyYXA6dy5KP2VkOmZ1bmN0aW9uKGEpe3JldHVybiBhfSxXcmFwcGVyOmNkLGNvbXBvc2VkUGF0aDpNYixub1BhdGNoOncuSixuYXRpdmVNZXRob2RzOnFiLG5hdGl2ZVRyZWU6cmJ9O3dpbmRvdy5TaGFkeURPTT1TaGFkeURPTTt5YigpO3NkKCJfX3NoYWR5XyIpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShkb2N1bWVudCwKIl9hY3RpdmVFbGVtZW50IixKYy5hY3RpdmVFbGVtZW50KTtBKFdpbmRvdy5wcm90b3R5cGUsb2QsIl9fc2hhZHlfIik7dy5KfHwoc2QoKSxiYygpKTtYYigpO3dpbmRvdy5FdmVudD1aYjt3aW5kb3cuQ3VzdG9tRXZlbnQ9JGI7d2luZG93Lk1vdXNlRXZlbnQ9YWM7d2luZG93LlNoYWRvd1Jvb3Q9U2N9O3ZhciB0ZD1uZXcgU2V0KCJhbm5vdGF0aW9uLXhtbCBjb2xvci1wcm9maWxlIGZvbnQtZmFjZSBmb250LWZhY2Utc3JjIGZvbnQtZmFjZS11cmkgZm9udC1mYWNlLWZvcm1hdCBmb250LWZhY2UtbmFtZSBtaXNzaW5nLWdseXBoIi5zcGxpdCgiICIpKTtmdW5jdGlvbiB1ZChhKXt2YXIgYj10ZC5oYXMoYSk7YT0vXlthLXpdWy4wLTlfYS16XSotW1wtLjAtOV9hLXpdKiQvLnRlc3QoYSk7cmV0dXJuIWImJmF9ZnVuY3Rpb24gSChhKXt2YXIgYj1hLmlzQ29ubmVjdGVkO2lmKHZvaWQgMCE9PWIpcmV0dXJuIGI7Zm9yKDthJiYhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpOylhPWEucGFyZW50Tm9kZXx8KHdpbmRvdy5TaGFkb3dSb290JiZhIGluc3RhbmNlb2YgU2hhZG93Um9vdD9hLmhvc3Q6dm9pZCAwKTtyZXR1cm4hKCFhfHwhKGEuX19DRV9pc0ltcG9ydERvY3VtZW50fHxhIGluc3RhbmNlb2YgRG9jdW1lbnQpKX0KZnVuY3Rpb24gdmQoYSxiKXtmb3IoO2ImJmIhPT1hJiYhYi5uZXh0U2libGluZzspYj1iLnBhcmVudE5vZGU7cmV0dXJuIGImJmIhPT1hP2IubmV4dFNpYmxpbmc6bnVsbH0KZnVuY3Rpb24gd2QoYSxiLGMpe2M9dm9pZCAwPT09Yz9uZXcgU2V0OmM7Zm9yKHZhciBkPWE7ZDspe2lmKGQubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7dmFyIGU9ZDtiKGUpO3ZhciBmPWUubG9jYWxOYW1lO2lmKCJsaW5rIj09PWYmJiJpbXBvcnQiPT09ZS5nZXRBdHRyaWJ1dGUoInJlbCIpKXtkPWUuaW1wb3J0O2lmKGQgaW5zdGFuY2VvZiBOb2RlJiYhYy5oYXMoZCkpZm9yKGMuYWRkKGQpLGQ9ZC5maXJzdENoaWxkO2Q7ZD1kLm5leHRTaWJsaW5nKXdkKGQsYixjKTtkPXZkKGEsZSk7Y29udGludWV9ZWxzZSBpZigidGVtcGxhdGUiPT09Zil7ZD12ZChhLGUpO2NvbnRpbnVlfWlmKGU9ZS5fX0NFX3NoYWRvd1Jvb3QpZm9yKGU9ZS5maXJzdENoaWxkO2U7ZT1lLm5leHRTaWJsaW5nKXdkKGUsYixjKX1kPWQuZmlyc3RDaGlsZD9kLmZpcnN0Q2hpbGQ6dmQoYSxkKX19ZnVuY3Rpb24gSShhLGIsYyl7YVtiXT1jfTtmdW5jdGlvbiB4ZCgpe3RoaXMuYT1uZXcgTWFwO3RoaXMuZz1uZXcgTWFwO3RoaXMuZj1bXTt0aGlzLmM9ITF9ZnVuY3Rpb24geWQoYSxiLGMpe2EuYS5zZXQoYixjKTthLmcuc2V0KGMuY29uc3RydWN0b3JGdW5jdGlvbixjKX1mdW5jdGlvbiB6ZChhLGIpe2EuYz0hMDthLmYucHVzaChiKX1mdW5jdGlvbiBBZChhLGIpe2EuYyYmd2QoYixmdW5jdGlvbihiKXtyZXR1cm4gYS5iKGIpfSl9eGQucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSl7aWYodGhpcy5jJiYhYS5fX0NFX3BhdGNoZWQpe2EuX19DRV9wYXRjaGVkPSEwO2Zvcih2YXIgYj0wO2I8dGhpcy5mLmxlbmd0aDtiKyspdGhpcy5mW2JdKGEpfX07ZnVuY3Rpb24gSihhLGIpe3ZhciBjPVtdO3dkKGIsZnVuY3Rpb24oYSl7cmV0dXJuIGMucHVzaChhKX0pO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspe3ZhciBkPWNbYl07MT09PWQuX19DRV9zdGF0ZT9hLmNvbm5lY3RlZENhbGxiYWNrKGQpOkJkKGEsZCl9fQpmdW5jdGlvbiBLKGEsYil7dmFyIGM9W107d2QoYixmdW5jdGlvbihhKXtyZXR1cm4gYy5wdXNoKGEpfSk7Zm9yKGI9MDtiPGMubGVuZ3RoO2IrKyl7dmFyIGQ9Y1tiXTsxPT09ZC5fX0NFX3N0YXRlJiZhLmRpc2Nvbm5lY3RlZENhbGxiYWNrKGQpfX0KZnVuY3Rpb24gTChhLGIsYyl7Yz12b2lkIDA9PT1jP3t9OmM7dmFyIGQ9Yy5YYXx8bmV3IFNldCxlPWMuWXx8ZnVuY3Rpb24oYil7cmV0dXJuIEJkKGEsYil9LGY9W107d2QoYixmdW5jdGlvbihiKXtpZigibGluayI9PT1iLmxvY2FsTmFtZSYmImltcG9ydCI9PT1iLmdldEF0dHJpYnV0ZSgicmVsIikpe3ZhciBjPWIuaW1wb3J0O2MgaW5zdGFuY2VvZiBOb2RlJiYoYy5fX0NFX2lzSW1wb3J0RG9jdW1lbnQ9ITAsYy5fX0NFX2hhc1JlZ2lzdHJ5PSEwKTtjJiYiY29tcGxldGUiPT09Yy5yZWFkeVN0YXRlP2MuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwOmIuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsZnVuY3Rpb24oKXt2YXIgYz1iLmltcG9ydDtpZighYy5fX0NFX2RvY3VtZW50TG9hZEhhbmRsZWQpe2MuX19DRV9kb2N1bWVudExvYWRIYW5kbGVkPSEwO3ZhciBmPW5ldyBTZXQoZCk7Zi5kZWxldGUoYyk7TChhLGMse1hhOmYsWTplfSl9fSl9ZWxzZSBmLnB1c2goYil9LGQpO2lmKGEuYylmb3IoYj0KMDtiPGYubGVuZ3RoO2IrKylhLmIoZltiXSk7Zm9yKGI9MDtiPGYubGVuZ3RoO2IrKyllKGZbYl0pfQpmdW5jdGlvbiBCZChhLGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGM9Yi5vd25lckRvY3VtZW50O2lmKGMuZGVmYXVsdFZpZXd8fGMuX19DRV9pc0ltcG9ydERvY3VtZW50JiZjLl9fQ0VfaGFzUmVnaXN0cnkpaWYoYz1hLmEuZ2V0KGIubG9jYWxOYW1lKSl7Yy5jb25zdHJ1Y3Rpb25TdGFjay5wdXNoKGIpO3ZhciBkPWMuY29uc3RydWN0b3JGdW5jdGlvbjt0cnl7dHJ5e2lmKG5ldyBkIT09Yil0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yIGRpZCBub3QgcHJvZHVjZSB0aGUgZWxlbWVudCBiZWluZyB1cGdyYWRlZC4iKTt9ZmluYWxseXtjLmNvbnN0cnVjdGlvblN0YWNrLnBvcCgpfX1jYXRjaChnKXt0aHJvdyBiLl9fQ0Vfc3RhdGU9MixnO31iLl9fQ0Vfc3RhdGU9MTtiLl9fQ0VfZGVmaW5pdGlvbj1jO2lmKGMuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKWZvcihjPWMub2JzZXJ2ZWRBdHRyaWJ1dGVzLGQ9MDtkPGMubGVuZ3RoO2QrKyl7dmFyIGU9CmNbZF0sZj1iLmdldEF0dHJpYnV0ZShlKTtudWxsIT09ZiYmYS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soYixlLG51bGwsZixudWxsKX1IKGIpJiZhLmNvbm5lY3RlZENhbGxiYWNrKGIpfX19eGQucHJvdG90eXBlLmNvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuX19DRV9kZWZpbml0aW9uO2IuY29ubmVjdGVkQ2FsbGJhY2smJmIuY29ubmVjdGVkQ2FsbGJhY2suY2FsbChhKX07eGQucHJvdG90eXBlLmRpc2Nvbm5lY3RlZENhbGxiYWNrPWZ1bmN0aW9uKGEpe3ZhciBiPWEuX19DRV9kZWZpbml0aW9uO2IuZGlzY29ubmVjdGVkQ2FsbGJhY2smJmIuZGlzY29ubmVjdGVkQ2FsbGJhY2suY2FsbChhKX07CnhkLnByb3RvdHlwZS5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s9ZnVuY3Rpb24oYSxiLGMsZCxlKXt2YXIgZj1hLl9fQ0VfZGVmaW5pdGlvbjtmLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayYmLTE8Zi5vYnNlcnZlZEF0dHJpYnV0ZXMuaW5kZXhPZihiKSYmZi5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2suY2FsbChhLGIsYyxkLGUpfTtmdW5jdGlvbiBDZChhKXt2YXIgYj1kb2N1bWVudDt0aGlzLmI9YTt0aGlzLmE9Yjt0aGlzLkY9dm9pZCAwO0wodGhpcy5iLHRoaXMuYSk7ImxvYWRpbmciPT09dGhpcy5hLnJlYWR5U3RhdGUmJih0aGlzLkY9bmV3IE11dGF0aW9uT2JzZXJ2ZXIodGhpcy5jLmJpbmQodGhpcykpLHRoaXMuRi5vYnNlcnZlKHRoaXMuYSx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSl9ZnVuY3Rpb24gRGQoYSl7YS5GJiZhLkYuZGlzY29ubmVjdCgpfUNkLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMuYS5yZWFkeVN0YXRlOyJpbnRlcmFjdGl2ZSIhPT1iJiYiY29tcGxldGUiIT09Ynx8RGQodGhpcyk7Zm9yKGI9MDtiPGEubGVuZ3RoO2IrKylmb3IodmFyIGM9YVtiXS5hZGRlZE5vZGVzLGQ9MDtkPGMubGVuZ3RoO2QrKylMKHRoaXMuYixjW2RdKX07ZnVuY3Rpb24gRWQoKXt2YXIgYT10aGlzO3RoaXMuYT10aGlzLmg9dm9pZCAwO3RoaXMuYj1uZXcgUHJvbWlzZShmdW5jdGlvbihiKXthLmE9YjthLmgmJmIoYS5oKX0pfUVkLnByb3RvdHlwZS5yZXNvbHZlPWZ1bmN0aW9uKGEpe2lmKHRoaXMuaCl0aHJvdyBFcnJvcigiQWxyZWFkeSByZXNvbHZlZC4iKTt0aGlzLmg9YTt0aGlzLmEmJnRoaXMuYShhKX07ZnVuY3Rpb24gTihhKXt0aGlzLmM9ITE7dGhpcy5hPWE7dGhpcy5sPW5ldyBNYXA7dGhpcy5mPWZ1bmN0aW9uKGEpe3JldHVybiBhKCl9O3RoaXMuYj0hMTt0aGlzLmc9W107dGhpcy5kYT1uZXcgQ2QoYSl9bj1OLnByb3RvdHlwZTsKbi5zYT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXM7aWYoIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IG5ldyBUeXBlRXJyb3IoIkN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9ycyBtdXN0IGJlIGZ1bmN0aW9ucy4iKTtpZighdWQoYSkpdGhyb3cgbmV3IFN5bnRheEVycm9yKCJUaGUgZWxlbWVudCBuYW1lICciK2ErIicgaXMgbm90IHZhbGlkLiIpO2lmKHRoaXMuYS5hLmdldChhKSl0aHJvdyBFcnJvcigiQSBjdXN0b20gZWxlbWVudCB3aXRoIG5hbWUgJyIrYSsiJyBoYXMgYWxyZWFkeSBiZWVuIGRlZmluZWQuIik7aWYodGhpcy5jKXRocm93IEVycm9yKCJBIGN1c3RvbSBlbGVtZW50IGlzIGFscmVhZHkgYmVpbmcgZGVmaW5lZC4iKTt0aGlzLmM9ITA7dHJ5e3ZhciBkPWZ1bmN0aW9uKGEpe3ZhciBiPWVbYV07aWYodm9pZCAwIT09YiYmIShiIGluc3RhbmNlb2YgRnVuY3Rpb24pKXRocm93IEVycm9yKCJUaGUgJyIrYSsiJyBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24uIik7CnJldHVybiBifSxlPWIucHJvdG90eXBlO2lmKCEoZSBpbnN0YW5jZW9mIE9iamVjdCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGNvbnN0cnVjdG9yJ3MgcHJvdG90eXBlIGlzIG5vdCBhbiBvYmplY3QuIik7dmFyIGY9ZCgiY29ubmVjdGVkQ2FsbGJhY2siKTt2YXIgZz1kKCJkaXNjb25uZWN0ZWRDYWxsYmFjayIpO3ZhciBoPWQoImFkb3B0ZWRDYWxsYmFjayIpO3ZhciBrPWQoImF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayIpO3ZhciBsPWIub2JzZXJ2ZWRBdHRyaWJ1dGVzfHxbXX1jYXRjaChtKXtyZXR1cm59ZmluYWxseXt0aGlzLmM9ITF9Yj17bG9jYWxOYW1lOmEsY29uc3RydWN0b3JGdW5jdGlvbjpiLGNvbm5lY3RlZENhbGxiYWNrOmYsZGlzY29ubmVjdGVkQ2FsbGJhY2s6ZyxhZG9wdGVkQ2FsbGJhY2s6aCxhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2s6ayxvYnNlcnZlZEF0dHJpYnV0ZXM6bCxjb25zdHJ1Y3Rpb25TdGFjazpbXX07eWQodGhpcy5hLAphLGIpO3RoaXMuZy5wdXNoKGIpO3RoaXMuYnx8KHRoaXMuYj0hMCx0aGlzLmYoZnVuY3Rpb24oKXtyZXR1cm4gRmQoYyl9KSl9O24uWT1mdW5jdGlvbihhKXtMKHRoaXMuYSxhKX07CmZ1bmN0aW9uIEZkKGEpe2lmKCExIT09YS5iKXthLmI9ITE7Zm9yKHZhciBiPWEuZyxjPVtdLGQ9bmV3IE1hcCxlPTA7ZTxiLmxlbmd0aDtlKyspZC5zZXQoYltlXS5sb2NhbE5hbWUsW10pO0woYS5hLGRvY3VtZW50LHtZOmZ1bmN0aW9uKGIpe2lmKHZvaWQgMD09PWIuX19DRV9zdGF0ZSl7dmFyIGU9Yi5sb2NhbE5hbWUsZj1kLmdldChlKTtmP2YucHVzaChiKTphLmEuYS5nZXQoZSkmJmMucHVzaChiKX19fSk7Zm9yKGU9MDtlPGMubGVuZ3RoO2UrKylCZChhLmEsY1tlXSk7Zm9yKDswPGIubGVuZ3RoOyl7dmFyIGY9Yi5zaGlmdCgpO2U9Zi5sb2NhbE5hbWU7Zj1kLmdldChmLmxvY2FsTmFtZSk7Zm9yKHZhciBnPTA7ZzxmLmxlbmd0aDtnKyspQmQoYS5hLGZbZ10pOyhlPWEubC5nZXQoZSkpJiZlLnJlc29sdmUodm9pZCAwKX19fW4uZ2V0PWZ1bmN0aW9uKGEpe2lmKGE9dGhpcy5hLmEuZ2V0KGEpKXJldHVybiBhLmNvbnN0cnVjdG9yRnVuY3Rpb259OwpuLnRhPWZ1bmN0aW9uKGEpe2lmKCF1ZChhKSlyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IFN5bnRheEVycm9yKCInIithKyInIGlzIG5vdCBhIHZhbGlkIGN1c3RvbSBlbGVtZW50IG5hbWUuIikpO3ZhciBiPXRoaXMubC5nZXQoYSk7aWYoYilyZXR1cm4gYi5iO2I9bmV3IEVkO3RoaXMubC5zZXQoYSxiKTt0aGlzLmEuYS5nZXQoYSkmJiF0aGlzLmcuc29tZShmdW5jdGlvbihiKXtyZXR1cm4gYi5sb2NhbE5hbWU9PT1hfSkmJmIucmVzb2x2ZSh2b2lkIDApO3JldHVybiBiLmJ9O24uUGE9ZnVuY3Rpb24oYSl7RGQodGhpcy5kYSk7dmFyIGI9dGhpcy5mO3RoaXMuZj1mdW5jdGlvbihjKXtyZXR1cm4gYShmdW5jdGlvbigpe3JldHVybiBiKGMpfSl9fTt3aW5kb3cuQ3VzdG9tRWxlbWVudFJlZ2lzdHJ5PU47Ti5wcm90b3R5cGUuZGVmaW5lPU4ucHJvdG90eXBlLnNhO04ucHJvdG90eXBlLnVwZ3JhZGU9Ti5wcm90b3R5cGUuWTtOLnByb3RvdHlwZS5nZXQ9Ti5wcm90b3R5cGUuZ2V0OwpOLnByb3RvdHlwZS53aGVuRGVmaW5lZD1OLnByb3RvdHlwZS50YTtOLnByb3RvdHlwZS5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrPU4ucHJvdG90eXBlLlBhO3ZhciBHZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmNyZWF0ZUVsZW1lbnQsSGQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5jcmVhdGVFbGVtZW50TlMsSWQ9d2luZG93LkRvY3VtZW50LnByb3RvdHlwZS5pbXBvcnROb2RlLEpkPXdpbmRvdy5Eb2N1bWVudC5wcm90b3R5cGUucHJlcGVuZCxLZD13aW5kb3cuRG9jdW1lbnQucHJvdG90eXBlLmFwcGVuZCxMZD13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUucHJlcGVuZCxNZD13aW5kb3cuRG9jdW1lbnRGcmFnbWVudC5wcm90b3R5cGUuYXBwZW5kLE5kPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5jbG9uZU5vZGUsT2Q9d2luZG93Lk5vZGUucHJvdG90eXBlLmFwcGVuZENoaWxkLFBkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5pbnNlcnRCZWZvcmUsUWQ9d2luZG93Lk5vZGUucHJvdG90eXBlLnJlbW92ZUNoaWxkLFJkPXdpbmRvdy5Ob2RlLnByb3RvdHlwZS5yZXBsYWNlQ2hpbGQsU2Q9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuTm9kZS5wcm90b3R5cGUsCiJ0ZXh0Q29udGVudCIpLFRkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hdHRhY2hTaGFkb3csVWQ9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUsImlubmVySFRNTCIpLFZkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGUsV2Q9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnNldEF0dHJpYnV0ZSxYZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlLFlkPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5nZXRBdHRyaWJ1dGVOUyxaZD13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuc2V0QXR0cmlidXRlTlMsJGQ9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZUF0dHJpYnV0ZU5TLGFlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5pbnNlcnRBZGphY2VudEVsZW1lbnQsYmU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTCxjZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucHJlcGVuZCwKZGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFwcGVuZCxlZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYmVmb3JlLGZlPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hZnRlcixnZT13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUucmVwbGFjZVdpdGgsaGU9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLnJlbW92ZSxpZT13aW5kb3cuSFRNTEVsZW1lbnQsamU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih3aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLCJpbm5lckhUTUwiKSxrZT13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50RWxlbWVudCxsZT13aW5kb3cuSFRNTEVsZW1lbnQucHJvdG90eXBlLmluc2VydEFkamFjZW50SFRNTDt2YXIgbWU9bmV3IGZ1bmN0aW9uKCl7fTtmdW5jdGlvbiBuZSgpe3ZhciBhPW9lO3dpbmRvdy5IVE1MRWxlbWVudD1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt2YXIgYj10aGlzLmNvbnN0cnVjdG9yLGQ9YS5nLmdldChiKTtpZighZCl0aHJvdyBFcnJvcigiVGhlIGN1c3RvbSBlbGVtZW50IGJlaW5nIGNvbnN0cnVjdGVkIHdhcyBub3QgcmVnaXN0ZXJlZCB3aXRoIGBjdXN0b21FbGVtZW50c2AuIik7dmFyIGU9ZC5jb25zdHJ1Y3Rpb25TdGFjaztpZigwPT09ZS5sZW5ndGgpcmV0dXJuIGU9R2QuY2FsbChkb2N1bWVudCxkLmxvY2FsTmFtZSksT2JqZWN0LnNldFByb3RvdHlwZU9mKGUsYi5wcm90b3R5cGUpLGUuX19DRV9zdGF0ZT0xLGUuX19DRV9kZWZpbml0aW9uPWQsYS5iKGUpLGU7ZD1lLmxlbmd0aC0xO3ZhciBmPWVbZF07aWYoZj09PW1lKXRocm93IEVycm9yKCJUaGUgSFRNTEVsZW1lbnQgY29uc3RydWN0b3Igd2FzIGVpdGhlciBjYWxsZWQgcmVlbnRyYW50bHkgZm9yIHRoaXMgY29uc3RydWN0b3Igb3IgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiIpOwplW2RdPW1lO09iamVjdC5zZXRQcm90b3R5cGVPZihmLGIucHJvdG90eXBlKTthLmIoZik7cmV0dXJuIGZ9Yi5wcm90b3R5cGU9aWUucHJvdG90eXBlO09iamVjdC5kZWZpbmVQcm9wZXJ0eShiLnByb3RvdHlwZSwiY29uc3RydWN0b3IiLHt3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpifSk7cmV0dXJuIGJ9KCl9O2Z1bmN0aW9uIHBlKGEsYixjKXtmdW5jdGlvbiBkKGIpe3JldHVybiBmdW5jdGlvbihjKXtmb3IodmFyIGQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDsrK2UpZFtlXT1hcmd1bWVudHNbZV07ZT1bXTtmb3IodmFyIGY9W10sbD0wO2w8ZC5sZW5ndGg7bCsrKXt2YXIgbT1kW2xdO20gaW5zdGFuY2VvZiBFbGVtZW50JiZIKG0pJiZmLnB1c2gobSk7aWYobSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpZm9yKG09bS5maXJzdENoaWxkO207bT1tLm5leHRTaWJsaW5nKWUucHVzaChtKTtlbHNlIGUucHVzaChtKX1iLmFwcGx5KHRoaXMsZCk7Zm9yKGQ9MDtkPGYubGVuZ3RoO2QrKylLKGEsZltkXSk7aWYoSCh0aGlzKSlmb3IoZD0wO2Q8ZS5sZW5ndGg7ZCsrKWY9ZVtkXSxmIGluc3RhbmNlb2YgRWxlbWVudCYmSihhLGYpfX12b2lkIDAhPT1jLlYmJihiLnByZXBlbmQ9ZChjLlYpKTt2b2lkIDAhPT1jLmFwcGVuZCYmKGIuYXBwZW5kPWQoYy5hcHBlbmQpKX07ZnVuY3Rpb24gcWUoKXt2YXIgYT1vZTtJKERvY3VtZW50LnByb3RvdHlwZSwiY3JlYXRlRWxlbWVudCIsZnVuY3Rpb24oYil7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5KXt2YXIgYz1hLmEuZ2V0KGIpO2lmKGMpcmV0dXJuIG5ldyBjLmNvbnN0cnVjdG9yRnVuY3Rpb259Yj1HZC5jYWxsKHRoaXMsYik7YS5iKGIpO3JldHVybiBifSk7SShEb2N1bWVudC5wcm90b3R5cGUsImltcG9ydE5vZGUiLGZ1bmN0aW9uKGIsYyl7Yj1JZC5jYWxsKHRoaXMsYiwhIWMpO3RoaXMuX19DRV9oYXNSZWdpc3RyeT9MKGEsYik6QWQoYSxiKTtyZXR1cm4gYn0pO0koRG9jdW1lbnQucHJvdG90eXBlLCJjcmVhdGVFbGVtZW50TlMiLGZ1bmN0aW9uKGIsYyl7aWYodGhpcy5fX0NFX2hhc1JlZ2lzdHJ5JiYobnVsbD09PWJ8fCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj09PWIpKXt2YXIgZD1hLmEuZ2V0KGMpO2lmKGQpcmV0dXJuIG5ldyBkLmNvbnN0cnVjdG9yRnVuY3Rpb259Yj1IZC5jYWxsKHRoaXMsCmIsYyk7YS5iKGIpO3JldHVybiBifSk7cGUoYSxEb2N1bWVudC5wcm90b3R5cGUse1Y6SmQsYXBwZW5kOktkfSl9O2Z1bmN0aW9uIHJlKCl7ZnVuY3Rpb24gYShhLGQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShhLCJ0ZXh0Q29udGVudCIse2VudW1lcmFibGU6ZC5lbnVtZXJhYmxlLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZC5nZXQsc2V0OmZ1bmN0aW9uKGEpe2lmKHRoaXMubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSlkLnNldC5jYWxsKHRoaXMsYSk7ZWxzZXt2YXIgYz12b2lkIDA7aWYodGhpcy5maXJzdENoaWxkKXt2YXIgZT10aGlzLmNoaWxkTm9kZXMsaD1lLmxlbmd0aDtpZigwPGgmJkgodGhpcykpe2M9QXJyYXkoaCk7Zm9yKHZhciBrPTA7azxoO2srKyljW2tdPWVba119fWQuc2V0LmNhbGwodGhpcyxhKTtpZihjKWZvcihhPTA7YTxjLmxlbmd0aDthKyspSyhiLGNbYV0pfX19KX12YXIgYj1vZTtJKE5vZGUucHJvdG90eXBlLCJpbnNlcnRCZWZvcmUiLGZ1bmN0aW9uKGEsZCl7aWYoYSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpe3ZhciBjPUFycmF5LnByb3RvdHlwZS5zbGljZS5hcHBseShhLmNoaWxkTm9kZXMpOwphPVBkLmNhbGwodGhpcyxhLGQpO2lmKEgodGhpcykpZm9yKGQ9MDtkPGMubGVuZ3RoO2QrKylKKGIsY1tkXSk7cmV0dXJuIGF9Yz1IKGEpO2Q9UGQuY2FsbCh0aGlzLGEsZCk7YyYmSyhiLGEpO0godGhpcykmJkooYixhKTtyZXR1cm4gZH0pO0koTm9kZS5wcm90b3R5cGUsImFwcGVuZENoaWxkIixmdW5jdGlvbihhKXtpZihhIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCl7dmFyIGM9QXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGEuY2hpbGROb2Rlcyk7YT1PZC5jYWxsKHRoaXMsYSk7aWYoSCh0aGlzKSlmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKylKKGIsY1tlXSk7cmV0dXJuIGF9Yz1IKGEpO2U9T2QuY2FsbCh0aGlzLGEpO2MmJksoYixhKTtIKHRoaXMpJiZKKGIsYSk7cmV0dXJuIGV9KTtJKE5vZGUucHJvdG90eXBlLCJjbG9uZU5vZGUiLGZ1bmN0aW9uKGEpe2E9TmQuY2FsbCh0aGlzLCEhYSk7dGhpcy5vd25lckRvY3VtZW50Ll9fQ0VfaGFzUmVnaXN0cnk/TChiLGEpOgpBZChiLGEpO3JldHVybiBhfSk7SShOb2RlLnByb3RvdHlwZSwicmVtb3ZlQ2hpbGQiLGZ1bmN0aW9uKGEpe3ZhciBjPUgoYSksZT1RZC5jYWxsKHRoaXMsYSk7YyYmSyhiLGEpO3JldHVybiBlfSk7SShOb2RlLnByb3RvdHlwZSwicmVwbGFjZUNoaWxkIixmdW5jdGlvbihhLGQpe2lmKGEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KXt2YXIgYz1BcnJheS5wcm90b3R5cGUuc2xpY2UuYXBwbHkoYS5jaGlsZE5vZGVzKTthPVJkLmNhbGwodGhpcyxhLGQpO2lmKEgodGhpcykpZm9yKEsoYixkKSxkPTA7ZDxjLmxlbmd0aDtkKyspSihiLGNbZF0pO3JldHVybiBhfWM9SChhKTt2YXIgZj1SZC5jYWxsKHRoaXMsYSxkKSxnPUgodGhpcyk7ZyYmSyhiLGQpO2MmJksoYixhKTtnJiZKKGIsYSk7cmV0dXJuIGZ9KTtTZCYmU2QuZ2V0P2EoTm9kZS5wcm90b3R5cGUsU2QpOnpkKGIsZnVuY3Rpb24oYil7YShiLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CltdLGI9MDtiPHRoaXMuY2hpbGROb2Rlcy5sZW5ndGg7YisrKWEucHVzaCh0aGlzLmNoaWxkTm9kZXNbYl0udGV4dENvbnRlbnQpO3JldHVybiBhLmpvaW4oIiIpfSxzZXQ6ZnVuY3Rpb24oYSl7Zm9yKDt0aGlzLmZpcnN0Q2hpbGQ7KVFkLmNhbGwodGhpcyx0aGlzLmZpcnN0Q2hpbGQpO09kLmNhbGwodGhpcyxkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhKSl9fSl9KX07ZnVuY3Rpb24gc2UoYSl7ZnVuY3Rpb24gYihiKXtyZXR1cm4gZnVuY3Rpb24oYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7KytlKWRbZV09YXJndW1lbnRzW2VdO2U9W107Zm9yKHZhciBoPVtdLGs9MDtrPGQubGVuZ3RoO2srKyl7dmFyIGw9ZFtrXTtsIGluc3RhbmNlb2YgRWxlbWVudCYmSChsKSYmaC5wdXNoKGwpO2lmKGwgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50KWZvcihsPWwuZmlyc3RDaGlsZDtsO2w9bC5uZXh0U2libGluZyllLnB1c2gobCk7ZWxzZSBlLnB1c2gobCl9Yi5hcHBseSh0aGlzLGQpO2ZvcihkPTA7ZDxoLmxlbmd0aDtkKyspSyhhLGhbZF0pO2lmKEgodGhpcykpZm9yKGQ9MDtkPGUubGVuZ3RoO2QrKyloPWVbZF0saCBpbnN0YW5jZW9mIEVsZW1lbnQmJkooYSxoKX19dmFyIGM9RWxlbWVudC5wcm90b3R5cGU7dm9pZCAwIT09ZWUmJihjLmJlZm9yZT1iKGVlKSk7dm9pZCAwIT09ZWUmJihjLmFmdGVyPWIoZmUpKTt2b2lkIDAhPT1nZSYmCkkoYywicmVwbGFjZVdpdGgiLGZ1bmN0aW9uKGIpe2Zvcih2YXIgYz1bXSxkPTA7ZDxhcmd1bWVudHMubGVuZ3RoOysrZCljW2RdPWFyZ3VtZW50c1tkXTtkPVtdO2Zvcih2YXIgZz1bXSxoPTA7aDxjLmxlbmd0aDtoKyspe3ZhciBrPWNbaF07ayBpbnN0YW5jZW9mIEVsZW1lbnQmJkgoaykmJmcucHVzaChrKTtpZihrIGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudClmb3Ioaz1rLmZpcnN0Q2hpbGQ7aztrPWsubmV4dFNpYmxpbmcpZC5wdXNoKGspO2Vsc2UgZC5wdXNoKGspfWg9SCh0aGlzKTtnZS5hcHBseSh0aGlzLGMpO2ZvcihjPTA7YzxnLmxlbmd0aDtjKyspSyhhLGdbY10pO2lmKGgpZm9yKEsoYSx0aGlzKSxjPTA7YzxkLmxlbmd0aDtjKyspZz1kW2NdLGcgaW5zdGFuY2VvZiBFbGVtZW50JiZKKGEsZyl9KTt2b2lkIDAhPT1oZSYmSShjLCJyZW1vdmUiLGZ1bmN0aW9uKCl7dmFyIGI9SCh0aGlzKTtoZS5jYWxsKHRoaXMpO2ImJksoYSx0aGlzKX0pfTtmdW5jdGlvbiB0ZSgpe2Z1bmN0aW9uIGEoYSxiKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoYSwiaW5uZXJIVE1MIix7ZW51bWVyYWJsZTpiLmVudW1lcmFibGUsY29uZmlndXJhYmxlOiEwLGdldDpiLmdldCxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcyxlPXZvaWQgMDtIKHRoaXMpJiYoZT1bXSx3ZCh0aGlzLGZ1bmN0aW9uKGEpe2EhPT1jJiZlLnB1c2goYSl9KSk7Yi5zZXQuY2FsbCh0aGlzLGEpO2lmKGUpZm9yKHZhciBmPTA7ZjxlLmxlbmd0aDtmKyspe3ZhciBnPWVbZl07MT09PWcuX19DRV9zdGF0ZSYmZC5kaXNjb25uZWN0ZWRDYWxsYmFjayhnKX10aGlzLm93bmVyRG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT9MKGQsdGhpcyk6QWQoZCx0aGlzKTtyZXR1cm4gYX19KX1mdW5jdGlvbiBiKGEsYil7SShhLCJpbnNlcnRBZGphY2VudEVsZW1lbnQiLGZ1bmN0aW9uKGEsYyl7dmFyIGU9SChjKTthPWIuY2FsbCh0aGlzLGEsYyk7ZSYmSyhkLGMpO0goYSkmJkooZCxjKTtyZXR1cm4gYX0pfQpmdW5jdGlvbiBjKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2Zvcih2YXIgYz1bXTthIT09YjthPWEubmV4dFNpYmxpbmcpYy5wdXNoKGEpO2ZvcihiPTA7YjxjLmxlbmd0aDtiKyspTChkLGNbYl0pfUkoYSwiaW5zZXJ0QWRqYWNlbnRIVE1MIixmdW5jdGlvbihhLGQpe2E9YS50b0xvd2VyQ2FzZSgpO2lmKCJiZWZvcmViZWdpbiI9PT1hKXt2YXIgZT10aGlzLnByZXZpb3VzU2libGluZztiLmNhbGwodGhpcyxhLGQpO2MoZXx8dGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQsdGhpcyl9ZWxzZSBpZigiYWZ0ZXJiZWdpbiI9PT1hKWU9dGhpcy5maXJzdENoaWxkLGIuY2FsbCh0aGlzLGEsZCksYyh0aGlzLmZpcnN0Q2hpbGQsZSk7ZWxzZSBpZigiYmVmb3JlZW5kIj09PWEpZT10aGlzLmxhc3RDaGlsZCxiLmNhbGwodGhpcyxhLGQpLGMoZXx8dGhpcy5maXJzdENoaWxkLG51bGwpO2Vsc2UgaWYoImFmdGVyZW5kIj09PWEpZT10aGlzLm5leHRTaWJsaW5nLGIuY2FsbCh0aGlzLGEsZCksYyh0aGlzLm5leHRTaWJsaW5nLAplKTtlbHNlIHRocm93IG5ldyBTeW50YXhFcnJvcigiVGhlIHZhbHVlIHByb3ZpZGVkICgiK1N0cmluZyhhKSsiKSBpcyBub3Qgb25lIG9mICdiZWZvcmViZWdpbicsICdhZnRlcmJlZ2luJywgJ2JlZm9yZWVuZCcsIG9yICdhZnRlcmVuZCcuIik7fSl9dmFyIGQ9b2U7VGQmJkkoRWxlbWVudC5wcm90b3R5cGUsImF0dGFjaFNoYWRvdyIsZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX19DRV9zaGFkb3dSb290PWE9VGQuY2FsbCh0aGlzLGEpfSk7VWQmJlVkLmdldD9hKEVsZW1lbnQucHJvdG90eXBlLFVkKTpqZSYmamUuZ2V0P2EoSFRNTEVsZW1lbnQucHJvdG90eXBlLGplKTp6ZChkLGZ1bmN0aW9uKGIpe2EoYix7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIE5kLmNhbGwodGhpcywhMCkuaW5uZXJIVE1MfSxzZXQ6ZnVuY3Rpb24oYSl7dmFyIGI9InRlbXBsYXRlIj09PXRoaXMubG9jYWxOYW1lLGM9Yj90aGlzLmNvbnRlbnQ6dGhpcyxkPUhkLmNhbGwoZG9jdW1lbnQsCnRoaXMubmFtZXNwYWNlVVJJLHRoaXMubG9jYWxOYW1lKTtmb3IoZC5pbm5lckhUTUw9YTswPGMuY2hpbGROb2Rlcy5sZW5ndGg7KVFkLmNhbGwoYyxjLmNoaWxkTm9kZXNbMF0pO2ZvcihhPWI/ZC5jb250ZW50OmQ7MDxhLmNoaWxkTm9kZXMubGVuZ3RoOylPZC5jYWxsKGMsYS5jaGlsZE5vZGVzWzBdKX19KX0pO0koRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZSIsZnVuY3Rpb24oYSxiKXtpZigxIT09dGhpcy5fX0NFX3N0YXRlKXJldHVybiBXZC5jYWxsKHRoaXMsYSxiKTt2YXIgYz1WZC5jYWxsKHRoaXMsYSk7V2QuY2FsbCh0aGlzLGEsYik7Yj1WZC5jYWxsKHRoaXMsYSk7ZC5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodGhpcyxhLGMsYixudWxsKX0pO0koRWxlbWVudC5wcm90b3R5cGUsInNldEF0dHJpYnV0ZU5TIixmdW5jdGlvbihhLGIsYyl7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gWmQuY2FsbCh0aGlzLGEsYixjKTt2YXIgZT1ZZC5jYWxsKHRoaXMsYSwKYik7WmQuY2FsbCh0aGlzLGEsYixjKTtjPVlkLmNhbGwodGhpcyxhLGIpO2QuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixlLGMsYSl9KTtJKEVsZW1lbnQucHJvdG90eXBlLCJyZW1vdmVBdHRyaWJ1dGUiLGZ1bmN0aW9uKGEpe2lmKDEhPT10aGlzLl9fQ0Vfc3RhdGUpcmV0dXJuIFhkLmNhbGwodGhpcyxhKTt2YXIgYj1WZC5jYWxsKHRoaXMsYSk7WGQuY2FsbCh0aGlzLGEpO251bGwhPT1iJiZkLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0aGlzLGEsYixudWxsLG51bGwpfSk7SShFbGVtZW50LnByb3RvdHlwZSwicmVtb3ZlQXR0cmlidXRlTlMiLGZ1bmN0aW9uKGEsYil7aWYoMSE9PXRoaXMuX19DRV9zdGF0ZSlyZXR1cm4gJGQuY2FsbCh0aGlzLGEsYik7dmFyIGM9WWQuY2FsbCh0aGlzLGEsYik7JGQuY2FsbCh0aGlzLGEsYik7dmFyIGU9WWQuY2FsbCh0aGlzLGEsYik7YyE9PWUmJmQuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHRoaXMsYixjLGUsYSl9KTtrZT9iKEhUTUxFbGVtZW50LnByb3RvdHlwZSwKa2UpOmFlP2IoRWxlbWVudC5wcm90b3R5cGUsYWUpOmNvbnNvbGUud2FybigiQ3VzdG9tIEVsZW1lbnRzOiBgRWxlbWVudCNpbnNlcnRBZGphY2VudEVsZW1lbnRgIHdhcyBub3QgcGF0Y2hlZC4iKTtsZT9jKEhUTUxFbGVtZW50LnByb3RvdHlwZSxsZSk6YmU/YyhFbGVtZW50LnByb3RvdHlwZSxiZSk6Y29uc29sZS53YXJuKCJDdXN0b20gRWxlbWVudHM6IGBFbGVtZW50I2luc2VydEFkamFjZW50SFRNTGAgd2FzIG5vdCBwYXRjaGVkLiIpO3BlKGQsRWxlbWVudC5wcm90b3R5cGUse1Y6Y2UsYXBwZW5kOmRlfSk7c2UoZCl9O3ZhciB1ZT13aW5kb3cuY3VzdG9tRWxlbWVudHM7aWYoIXVlfHx1ZS5mb3JjZVBvbHlmaWxsfHwiZnVuY3Rpb24iIT10eXBlb2YgdWUuZGVmaW5lfHwiZnVuY3Rpb24iIT10eXBlb2YgdWUuZ2V0KXt2YXIgb2U9bmV3IHhkO25lKCk7cWUoKTtwZShvZSxEb2N1bWVudEZyYWdtZW50LnByb3RvdHlwZSx7VjpMZCxhcHBlbmQ6TWR9KTtyZSgpO3RlKCk7ZG9jdW1lbnQuX19DRV9oYXNSZWdpc3RyeT0hMDt2YXIgY3VzdG9tRWxlbWVudHM9bmV3IE4ob2UpO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3csImN1c3RvbUVsZW1lbnRzIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Y3VzdG9tRWxlbWVudHN9KX07ZnVuY3Rpb24gdmUoKXt0aGlzLmVuZD10aGlzLnN0YXJ0PTA7dGhpcy5ydWxlcz10aGlzLnBhcmVudD10aGlzLnByZXZpb3VzPW51bGw7dGhpcy5jc3NUZXh0PXRoaXMucGFyc2VkQ3NzVGV4dD0iIjt0aGlzLmF0UnVsZT0hMTt0aGlzLnR5cGU9MDt0aGlzLnBhcnNlZFNlbGVjdG9yPXRoaXMuc2VsZWN0b3I9dGhpcy5rZXlmcmFtZXNOYW1lPSIifQpmdW5jdGlvbiB3ZShhKXthPWEucmVwbGFjZSh4ZSwiIikucmVwbGFjZSh5ZSwiIik7dmFyIGI9emUsYz1hLGQ9bmV3IHZlO2Quc3RhcnQ9MDtkLmVuZD1jLmxlbmd0aDtmb3IodmFyIGU9ZCxmPTAsZz1jLmxlbmd0aDtmPGc7ZisrKWlmKCJ7Ij09PWNbZl0pe2UucnVsZXN8fChlLnJ1bGVzPVtdKTt2YXIgaD1lLGs9aC5ydWxlc1toLnJ1bGVzLmxlbmd0aC0xXXx8bnVsbDtlPW5ldyB2ZTtlLnN0YXJ0PWYrMTtlLnBhcmVudD1oO2UucHJldmlvdXM9aztoLnJ1bGVzLnB1c2goZSl9ZWxzZSJ9Ij09PWNbZl0mJihlLmVuZD1mKzEsZT1lLnBhcmVudHx8ZCk7cmV0dXJuIGIoZCxhKX0KZnVuY3Rpb24gemUoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPUFlKGMpLGM9Yy5yZXBsYWNlKEJlLCIgIiksYz1jLnN1YnN0cmluZyhjLmxhc3RJbmRleE9mKCI7IikrMSksYz1hLnBhcnNlZFNlbGVjdG9yPWEuc2VsZWN0b3I9Yy50cmltKCksYS5hdFJ1bGU9MD09PWMuaW5kZXhPZigiQCIpLGEuYXRSdWxlPzA9PT1jLmluZGV4T2YoIkBtZWRpYSIpP2EudHlwZT1DZTpjLm1hdGNoKERlKSYmKGEudHlwZT1FZSxhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdChCZSkucG9wKCkpOmEudHlwZT0wPT09Yy5pbmRleE9mKCItLSIpP0ZlOkdlKTtpZihjPWEucnVsZXMpZm9yKHZhciBkPTAsZT1jLmxlbmd0aCxmPXZvaWQgMDtkPGUmJihmPWNbZF0pO2QrKyl6ZShmLApiKTtyZXR1cm4gYX1mdW5jdGlvbiBBZShhKXtyZXR1cm4gYS5yZXBsYWNlKC9cXChbMC05YS1mXXsxLDZ9KVxzL2dpLGZ1bmN0aW9uKGEsYyl7YT1jO2ZvcihjPTYtYS5sZW5ndGg7Yy0tOylhPSIwIithO3JldHVybiJcXCIrYX0pfQpmdW5jdGlvbiBIZShhLGIsYyl7Yz12b2lkIDA9PT1jPyIiOmM7dmFyIGQ9IiI7aWYoYS5jc3NUZXh0fHxhLnJ1bGVzKXt2YXIgZT1hLnJ1bGVzLGY7aWYoZj1lKWY9ZVswXSxmPSEoZiYmZi5zZWxlY3RvciYmMD09PWYuc2VsZWN0b3IuaW5kZXhPZigiLS0iKSk7aWYoZil7Zj0wO2Zvcih2YXIgZz1lLmxlbmd0aCxoPXZvaWQgMDtmPGcmJihoPWVbZl0pO2YrKylkPUhlKGgsYixkKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKEllLCIiKS5yZXBsYWNlKEplLCIiKSxiPWIucmVwbGFjZShLZSwiIikucmVwbGFjZShMZSwiIikpLChkPWIudHJpbSgpKSYmKGQ9IiAgIitkKyJcbiIpfWQmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWQsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEdlPTEsRWU9NyxDZT00LEZlPTFFMyx4ZT0vXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvL2dpbSx5ZT0vQGltcG9ydFteO10qOy9naW0sSWU9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/KD86Wztcbl18JCkvZ2ltLEplPS8oPzpeW147XC1cc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qP3tbXn1dKj99KD86Wztcbl18JCk/L2dpbSxLZT0vQGFwcGx5XHMqXCg/W14pO10qXCk/XHMqKD86Wztcbl18JCk/L2dpbSxMZT0vW147Ol0qPzpbXjtdKj92YXJcKFteO10qXCkoPzpbO1xuXXwkKT8vZ2ltLERlPS9eQFteXHNdKmtleWZyYW1lcy8sQmU9L1xzKy9nO3ZhciBPPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLE1lO2Z1bmN0aW9uIE5lKGEpe01lPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6T3x8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgT2U7d2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQmJihPZT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciBQZT0hKCF3aW5kb3cuU2hhZHlDU1N8fCF3aW5kb3cuU2hhZHlDU1MuZGlzYWJsZVJ1bnRpbWUpOwp3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M/TWU9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KE5lKHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6TmUod2luZG93LldlYkNvbXBvbmVudHMmJndpbmRvdy5XZWJDb21wb25lbnRzLmZsYWdzKTt2YXIgUT1NZSxRZT1PZTt2YXIgUmU9Lyg/Ol58Wztcc3tdXHMqKSgtLVtcdy1dKj8pXHMqOlxzKig/OigoPzonKD86XFwnfC4pKj8nfCIoPzpcXCJ8LikqPyJ8XChbXildKj9cKXxbXn07e10pKyl8XHsoW159XSopXH0oPzooPz1bO1xzfV0pfCQpKS9naSxTZT0vKD86XnxcVyspQGFwcGx5XHMqXCg/KFteKTtcbl0qKVwpPy9naSxUZT0vKC0tW1x3LV0rKVxzKihbOiw7KV18JCkvZ2ksVWU9LyhhbmltYXRpb25ccyo6KXwoYW5pbWF0aW9uLW5hbWVccyo6KS8sJGU9L0BtZWRpYVxzKC4qKS8sYWY9L1x7W159XSpcfS9nO3ZhciBiZj1uZXcgU2V0O2Z1bmN0aW9uIGNmKGEsYil7aWYoIWEpcmV0dXJuIiI7InN0cmluZyI9PT10eXBlb2YgYSYmKGE9d2UoYSkpO2ImJmRmKGEsYik7cmV0dXJuIEhlKGEsUSl9ZnVuY3Rpb24gZWYoYSl7IWEuX19jc3NSdWxlcyYmYS50ZXh0Q29udGVudCYmKGEuX19jc3NSdWxlcz13ZShhLnRleHRDb250ZW50KSk7cmV0dXJuIGEuX19jc3NSdWxlc3x8bnVsbH1mdW5jdGlvbiBmZihhKXtyZXR1cm4hIWEucGFyZW50JiZhLnBhcmVudC50eXBlPT09RWV9ZnVuY3Rpb24gZGYoYSxiLGMsZCl7aWYoYSl7dmFyIGU9ITEsZj1hLnR5cGU7aWYoZCYmZj09PUNlKXt2YXIgZz1hLnNlbGVjdG9yLm1hdGNoKCRlKTtnJiYod2luZG93Lm1hdGNoTWVkaWEoZ1sxXSkubWF0Y2hlc3x8KGU9ITApKX1mPT09R2U/YihhKTpjJiZmPT09RWU/YyhhKTpmPT09RmUmJihlPSEwKTtpZigoYT1hLnJ1bGVzKSYmIWUpZm9yKGU9MCxmPWEubGVuZ3RoLGc9dm9pZCAwO2U8ZiYmKGc9YVtlXSk7ZSsrKWRmKGcsYixjLGQpfX0KZnVuY3Rpb24gZ2YoYSxiLGMsZCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtiJiZlLnNldEF0dHJpYnV0ZSgic2NvcGUiLGIpO2UudGV4dENvbnRlbnQ9YTtoZihlLGMsZCk7cmV0dXJuIGV9dmFyIGpmPW51bGw7ZnVuY3Rpb24ga2YoYSl7YT1kb2N1bWVudC5jcmVhdGVDb21tZW50KCIgU2hhZHkgRE9NIHN0eWxlcyBmb3IgIithKyIgIik7dmFyIGI9ZG9jdW1lbnQuaGVhZDtiLmluc2VydEJlZm9yZShhLChqZj9qZi5uZXh0U2libGluZzpudWxsKXx8Yi5maXJzdENoaWxkKTtyZXR1cm4gamY9YX1mdW5jdGlvbiBoZihhLGIsYyl7Yj1ifHxkb2N1bWVudC5oZWFkO2IuaW5zZXJ0QmVmb3JlKGEsYyYmYy5uZXh0U2libGluZ3x8Yi5maXJzdENoaWxkKTtqZj9hLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGpmKT09PU5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HJiYoamY9YSk6amY9YX0KZnVuY3Rpb24gbGYoYSxiKXtmb3IodmFyIGM9MCxkPWEubGVuZ3RoO2I8ZDtiKyspaWYoIigiPT09YVtiXSljKys7ZWxzZSBpZigiKSI9PT1hW2JdJiYwPT09LS1jKXJldHVybiBiO3JldHVybi0xfWZ1bmN0aW9uIG1mKGEsYil7dmFyIGM9YS5pbmRleE9mKCJ2YXIoIik7aWYoLTE9PT1jKXJldHVybiBiKGEsIiIsIiIsIiIpO3ZhciBkPWxmKGEsYyszKSxlPWEuc3Vic3RyaW5nKGMrNCxkKTtjPWEuc3Vic3RyaW5nKDAsYyk7YT1tZihhLnN1YnN0cmluZyhkKzEpLGIpO2Q9ZS5pbmRleE9mKCIsIik7cmV0dXJuLTE9PT1kP2IoYyxlLnRyaW0oKSwiIixhKTpiKGMsZS5zdWJzdHJpbmcoMCxkKS50cmltKCksZS5zdWJzdHJpbmcoZCsxKS50cmltKCksYSl9ZnVuY3Rpb24gbmYoYSxiKXtPP2Euc2V0QXR0cmlidXRlKCJjbGFzcyIsYik6d2luZG93LlNoYWR5RE9NLm5hdGl2ZU1ldGhvZHMuc2V0QXR0cmlidXRlLmNhbGwoYSwiY2xhc3MiLGIpfQp2YXIgb2Y9d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00ud3JhcHx8ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2Z1bmN0aW9uIHBmKGEpe3ZhciBiPWEubG9jYWxOYW1lLGM9IiI7Yj8tMTxiLmluZGV4T2YoIi0iKXx8KGM9YixiPWEuZ2V0QXR0cmlidXRlJiZhLmdldEF0dHJpYnV0ZSgiaXMiKXx8IiIpOihiPWEuaXMsYz1hLmV4dGVuZHMpO3JldHVybntpczpiLE06Y319ZnVuY3Rpb24gcWYoYSl7Zm9yKHZhciBiPVtdLGM9IiIsZD0wOzA8PWQmJmQ8YS5sZW5ndGg7ZCsrKWlmKCIoIj09PWFbZF0pe3ZhciBlPWxmKGEsZCk7Yys9YS5zbGljZShkLGUrMSk7ZD1lfWVsc2UiLCI9PT1hW2RdPyhiLnB1c2goYyksYz0iIik6Yys9YVtkXTtjJiZiLnB1c2goYyk7cmV0dXJuIGJ9CmZ1bmN0aW9uIHJmKGEpe2lmKHZvaWQgMCE9PVFlKXJldHVybiBRZTtpZih2b2lkIDA9PT1hLl9fY3NzQnVpbGQpe3ZhciBiPWEuZ2V0QXR0cmlidXRlKCJjc3MtYnVpbGQiKTtpZihiKWEuX19jc3NCdWlsZD1iO2Vsc2V7YTp7Yj0idGVtcGxhdGUiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2lmKGIgaW5zdGFuY2VvZiBDb21tZW50JiYoYj1iLnRleHRDb250ZW50LnRyaW0oKS5zcGxpdCgiOiIpLCJjc3MtYnVpbGQiPT09YlswXSkpe2I9YlsxXTticmVhayBhfWI9IiJ9aWYoIiIhPT1iKXt2YXIgYz0idGVtcGxhdGUiPT09YS5sb2NhbE5hbWU/YS5jb250ZW50LmZpcnN0Q2hpbGQ6YS5maXJzdENoaWxkO2MucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChjKX1hLl9fY3NzQnVpbGQ9Yn19cmV0dXJuIGEuX19jc3NCdWlsZHx8IiJ9CmZ1bmN0aW9uIHNmKGEpe2E9dm9pZCAwPT09YT8iIjphO3JldHVybiIiIT09YSYmUT9PPyJzaGFkb3ciPT09YToic2hhZHkiPT09YTohMX07ZnVuY3Rpb24gdGYoKXt9ZnVuY3Rpb24gdWYoYSxiKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxifHwiIil9KX1mdW5jdGlvbiB2ZihhLGIsYyl7Yi5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFJiZjKGIpO3ZhciBkOyJ0ZW1wbGF0ZSI9PT1iLmxvY2FsTmFtZT9kPShiLmNvbnRlbnR8fGIuX2NvbnRlbnR8fGIpLmNoaWxkTm9kZXM6ZD1iLmNoaWxkcmVufHxiLmNoaWxkTm9kZXM7aWYoZClmb3IoYj0wO2I8ZC5sZW5ndGg7YisrKXZmKGEsZFtiXSxjKX0KZnVuY3Rpb24gd2YoYSxiLGMpe2lmKGIpaWYoYS5jbGFzc0xpc3QpYz8oYS5jbGFzc0xpc3QucmVtb3ZlKCJzdHlsZS1zY29wZSIpLGEuY2xhc3NMaXN0LnJlbW92ZShiKSk6KGEuY2xhc3NMaXN0LmFkZCgic3R5bGUtc2NvcGUiKSxhLmNsYXNzTGlzdC5hZGQoYikpO2Vsc2UgaWYoYS5nZXRBdHRyaWJ1dGUpe3ZhciBkPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpO2M/ZCYmKGI9ZC5yZXBsYWNlKCJzdHlsZS1zY29wZSIsIiIpLnJlcGxhY2UoYiwiIiksbmYoYSxiKSk6bmYoYSwoZD9kKyIgIjoiIikrInN0eWxlLXNjb3BlICIrYil9fWZ1bmN0aW9uIHhmKGEsYixjKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxiLCEwKTt3ZihhLGMpfSl9ZnVuY3Rpb24geWYoYSxiKXt2ZihSLGEsZnVuY3Rpb24oYSl7d2YoYSxifHwiIiwhMCl9KX0KZnVuY3Rpb24gemYoYSxiLGMsZCxlKXt2YXIgZj1SO2U9dm9pZCAwPT09ZT8iIjplOyIiPT09ZSYmKE98fCJzaGFkeSI9PT0odm9pZCAwPT09ZD8iIjpkKT9lPWNmKGIsYyk6KGE9cGYoYSksZT1BZihmLGIsYS5pcyxhLk0sYykrIlxuXG4iKSk7cmV0dXJuIGUudHJpbSgpfWZ1bmN0aW9uIEFmKGEsYixjLGQsZSl7dmFyIGY9QmYoYyxkKTtjPWM/Ii4iK2M6IiI7cmV0dXJuIGNmKGIsZnVuY3Rpb24oYil7Yi5jfHwoYi5zZWxlY3Rvcj1iLmo9Q2YoYSxiLGEuYixjLGYpLGIuYz0hMCk7ZSYmZShiLGMsZil9KX1mdW5jdGlvbiBCZihhLGIpe3JldHVybiBiPyJbaXM9IithKyJdIjphfQpmdW5jdGlvbiBDZihhLGIsYyxkLGUpe3ZhciBmPXFmKGIuc2VsZWN0b3IpO2lmKCFmZihiKSl7Yj0wO2Zvcih2YXIgZz1mLmxlbmd0aCxoPXZvaWQgMDtiPGcmJihoPWZbYl0pO2IrKylmW2JdPWMuY2FsbChhLGgsZCxlKX1yZXR1cm4gZi5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuISFhfSkuam9pbigiLCIpfWZ1bmN0aW9uIERmKGEpe3JldHVybiBhLnJlcGxhY2UoRWYsZnVuY3Rpb24oYSxjLGQpey0xPGQuaW5kZXhPZigiKyIpP2Q9ZC5yZXBsYWNlKC9cKy9nLCJfX18iKTotMTxkLmluZGV4T2YoIl9fXyIpJiYoZD1kLnJlcGxhY2UoL19fXy9nLCIrIikpO3JldHVybiI6IitjKyIoIitkKyIpIn0pfQpmdW5jdGlvbiBGZihhKXtmb3IodmFyIGI9W10sYztjPWEubWF0Y2goR2YpOyl7dmFyIGQ9Yy5pbmRleCxlPWxmKGEsZCk7aWYoLTE9PT1lKXRocm93IEVycm9yKGMuaW5wdXQrIiBzZWxlY3RvciBtaXNzaW5nICcpJyIpO2M9YS5zbGljZShkLGUrMSk7YT1hLnJlcGxhY2UoYywiXHVlMDAwIik7Yi5wdXNoKGMpfXJldHVybntoYTphLG1hdGNoZXM6Yn19ZnVuY3Rpb24gSGYoYSxiKXt2YXIgYz1hLnNwbGl0KCJcdWUwMDAiKTtyZXR1cm4gYi5yZWR1Y2UoZnVuY3Rpb24oYSxiLGYpe3JldHVybiBhK2IrY1tmKzFdfSxjWzBdKX0KdGYucHJvdG90eXBlLmI9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPSExO2E9YS50cmltKCk7dmFyIGU9RWYudGVzdChhKTtlJiYoYT1hLnJlcGxhY2UoRWYsZnVuY3Rpb24oYSxiLGMpe3JldHVybiI6IitiKyIoIitjLnJlcGxhY2UoL1xzL2csIiIpKyIpIn0pLGE9RGYoYSkpO3ZhciBmPUdmLnRlc3QoYSk7aWYoZil7dmFyIGc9RmYoYSk7YT1nLmhhO2c9Zy5tYXRjaGVzfWE9YS5yZXBsYWNlKElmLCI6aG9zdCAkMSIpO2E9YS5yZXBsYWNlKEpmLGZ1bmN0aW9uKGEsZSxmKXtkfHwoYT1LZihmLGUsYixjKSxkPWR8fGEuc3RvcCxlPWEuQ2EsZj1hLnZhbHVlKTtyZXR1cm4gZStmfSk7ZiYmKGE9SGYoYSxnKSk7ZSYmKGE9RGYoYSkpO3JldHVybiBhfTsKZnVuY3Rpb24gS2YoYSxiLGMsZCl7dmFyIGU9YS5pbmRleE9mKCI6OnNsb3R0ZWQiKTswPD1hLmluZGV4T2YoIjpob3N0Iik/YT1MZihhLGQpOjAhPT1lJiYoYT1jP01mKGEsYyk6YSk7Yz0hMTswPD1lJiYoYj0iIixjPSEwKTtpZihjKXt2YXIgZj0hMDtjJiYoYT1hLnJlcGxhY2UoTmYsZnVuY3Rpb24oYSxiKXtyZXR1cm4iID4gIitifSkpfWE9YS5yZXBsYWNlKE9mLGZ1bmN0aW9uKGEsYixjKXtyZXR1cm4nW2Rpcj0iJytjKyciXSAnK2IrIiwgIitiKydbZGlyPSInK2MrJyJdJ30pO3JldHVybnt2YWx1ZTphLENhOmIsc3RvcDpmfX0KZnVuY3Rpb24gTWYoYSxiKXthPWEuc3BsaXQoLyhcWy4rP1xdKS8pO2Zvcih2YXIgYz1bXSxkPTA7ZDxhLmxlbmd0aDtkKyspaWYoMT09PWQlMiljLnB1c2goYVtkXSk7ZWxzZXt2YXIgZT1hW2RdO2lmKCIiIT09ZXx8ZCE9PWEubGVuZ3RoLTEpZT1lLnNwbGl0KCI6IiksZVswXSs9YixjLnB1c2goZS5qb2luKCI6IikpfXJldHVybiBjLmpvaW4oIiIpfWZ1bmN0aW9uIExmKGEsYil7dmFyIGM9YS5tYXRjaChQZik7cmV0dXJuKGM9YyYmY1syXS50cmltKCl8fCIiKT9jWzBdLm1hdGNoKFFmKT9hLnJlcGxhY2UoUGYsZnVuY3Rpb24oYSxjLGYpe3JldHVybiBiK2Z9KTpjLnNwbGl0KFFmKVswXT09PWI/Yzoic2hvdWxkX25vdF9tYXRjaCI6YS5yZXBsYWNlKCI6aG9zdCIsYil9ZnVuY3Rpb24gUmYoYSl7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSJodG1sIil9CnRmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe3JldHVybiBhLm1hdGNoKCI6aG9zdCIpPyIiOmEubWF0Y2goIjo6c2xvdHRlZCIpP3RoaXMuYihhLCI6bm90KC5zdHlsZS1zY29wZSkiKTpNZihhLnRyaW0oKSwiOm5vdCguc3R5bGUtc2NvcGUpIil9O3AuT2JqZWN0LmRlZmluZVByb3BlcnRpZXModGYucHJvdG90eXBlLHthOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4ic3R5bGUtc2NvcGUifX19KTsKdmFyIEVmPS86KG50aFstXHddKylcKChbXildKylcKS8sSmY9LyhefFtccz4rfl0rKSgoPzpcWy4rP1xdfFteXHM+K349W10pKykvZyxRZj0vW1suOiMqXS8sSWY9L14oOjpzbG90dGVkKS8sUGY9Lyg6aG9zdCkoPzpcKCgoPzpcKFteKShdKlwpfFteKShdKikrPylcKSkvLE5mPS8oPzo6OnNsb3R0ZWQpKD86XCgoKD86XChbXikoXSpcKXxbXikoXSopKz8pXCkpLyxPZj0vKC4qKTpkaXJcKCg/OihsdHJ8cnRsKSlcKS8sR2Y9LzooPzptYXRjaGVzfGFueXwtKD86d2Via2l0fG1veiktYW55KS8sUj1uZXcgdGY7ZnVuY3Rpb24gU2YoYSxiLGMsZCxlKXt0aGlzLkE9YXx8bnVsbDt0aGlzLmI9Ynx8bnVsbDt0aGlzLmZhPWN8fFtdO3RoaXMubz1udWxsO3RoaXMuY3NzQnVpbGQ9ZXx8IiI7dGhpcy5NPWR8fCIiO3RoaXMuYT10aGlzLnM9dGhpcy53PW51bGx9ZnVuY3Rpb24gVChhKXtyZXR1cm4gYT9hLl9fc3R5bGVJbmZvOm51bGx9ZnVuY3Rpb24gVGYoYSxiKXtyZXR1cm4gYS5fX3N0eWxlSW5mbz1ifVNmLnByb3RvdHlwZS5jPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuQX07U2YucHJvdG90eXBlLl9nZXRTdHlsZVJ1bGVzPVNmLnByb3RvdHlwZS5jO2Z1bmN0aW9uIFVmKGEpe3ZhciBiPXRoaXMubWF0Y2hlc3x8dGhpcy5tYXRjaGVzU2VsZWN0b3J8fHRoaXMubW96TWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm1zTWF0Y2hlc1NlbGVjdG9yfHx0aGlzLm9NYXRjaGVzU2VsZWN0b3J8fHRoaXMud2Via2l0TWF0Y2hlc1NlbGVjdG9yO3JldHVybiBiJiZiLmNhbGwodGhpcyxhKX12YXIgVmY9bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgiVHJpZGVudCIpO2Z1bmN0aW9uIFdmKCl7fWZ1bmN0aW9uIFhmKGEpe3ZhciBiPXt9LGM9W10sZD0wO2RmKGEsZnVuY3Rpb24oYSl7WWYoYSk7YS5pbmRleD1kKys7YT1hLmkuY3NzVGV4dDtmb3IodmFyIGM7Yz1UZS5leGVjKGEpOyl7dmFyIGU9Y1sxXTsiOiIhPT1jWzJdJiYoYltlXT0hMCl9fSxmdW5jdGlvbihhKXtjLnB1c2goYSl9KTthLmI9YzthPVtdO2Zvcih2YXIgZSBpbiBiKWEucHVzaChlKTtyZXR1cm4gYX0KZnVuY3Rpb24gWWYoYSl7aWYoIWEuaSl7dmFyIGI9e30sYz17fTtaZihhLGMpJiYoYi52PWMsYS5ydWxlcz1udWxsKTtiLmNzc1RleHQ9YS5wYXJzZWRDc3NUZXh0LnJlcGxhY2UoYWYsIiIpLnJlcGxhY2UoUmUsIiIpO2EuaT1ifX1mdW5jdGlvbiBaZihhLGIpe3ZhciBjPWEuaTtpZihjKXtpZihjLnYpcmV0dXJuIE9iamVjdC5hc3NpZ24oYixjLnYpLCEwfWVsc2V7Yz1hLnBhcnNlZENzc1RleHQ7Zm9yKHZhciBkO2E9UmUuZXhlYyhjKTspe2Q9KGFbMl18fGFbM10pLnRyaW0oKTtpZigiaW5oZXJpdCIhPT1kfHwidW5zZXQiIT09ZCliW2FbMV0udHJpbSgpXT1kO2Q9ITB9cmV0dXJuIGR9fQpmdW5jdGlvbiAkZihhLGIsYyl7YiYmKGI9MDw9Yi5pbmRleE9mKCI7Iik/YWcoYSxiLGMpOm1mKGIsZnVuY3Rpb24oYixlLGYsZyl7aWYoIWUpcmV0dXJuIGIrZzsoZT0kZihhLGNbZV0sYykpJiYiaW5pdGlhbCIhPT1lPyJhcHBseS1zaGltLWluaGVyaXQiPT09ZSYmKGU9ImluaGVyaXQiKTplPSRmKGEsY1tmXXx8ZixjKXx8ZjtyZXR1cm4gYisoZXx8IiIpK2d9KSk7cmV0dXJuIGImJmIudHJpbSgpfHwiIn0KZnVuY3Rpb24gYWcoYSxiLGMpe2I9Yi5zcGxpdCgiOyIpO2Zvcih2YXIgZD0wLGUsZjtkPGIubGVuZ3RoO2QrKylpZihlPWJbZF0pe1NlLmxhc3RJbmRleD0wO2lmKGY9U2UuZXhlYyhlKSllPSRmKGEsY1tmWzFdXSxjKTtlbHNlIGlmKGY9ZS5pbmRleE9mKCI6IiksLTEhPT1mKXt2YXIgZz1lLnN1YnN0cmluZyhmKTtnPWcudHJpbSgpO2c9JGYoYSxnLGMpfHxnO2U9ZS5zdWJzdHJpbmcoMCxmKStnfWJbZF09ZSYmZS5sYXN0SW5kZXhPZigiOyIpPT09ZS5sZW5ndGgtMT9lLnNsaWNlKDAsLTEpOmV8fCIifXJldHVybiBiLmpvaW4oIjsiKX0KZnVuY3Rpb24gYmcoYSxiKXt2YXIgYz17fSxkPVtdO2RmKGEsZnVuY3Rpb24oYSl7YS5pfHxZZihhKTt2YXIgZT1hLmp8fGEucGFyc2VkU2VsZWN0b3I7YiYmYS5pLnYmJmUmJlVmLmNhbGwoYixlKSYmKFpmKGEsYyksYT1hLmluZGV4LGU9cGFyc2VJbnQoYS8zMiwxMCksZFtlXT0oZFtlXXx8MCl8MTw8YSUzMil9LG51bGwsITApO3JldHVybnt2OmMsa2V5OmR9fQpmdW5jdGlvbiBjZyhhLGIsYyxkKXtiLml8fFlmKGIpO2lmKGIuaS52KXt2YXIgZT1wZihhKTthPWUuaXM7ZT1lLk07ZT1hP0JmKGEsZSk6Imh0bWwiO3ZhciBmPWIucGFyc2VkU2VsZWN0b3IsZz0iOmhvc3QgPiAqIj09PWZ8fCJodG1sIj09PWYsaD0wPT09Zi5pbmRleE9mKCI6aG9zdCIpJiYhZzsic2hhZHkiPT09YyYmKGc9Zj09PWUrIiA+ICouIitlfHwtMSE9PWYuaW5kZXhPZigiaHRtbCIpLGg9IWcmJjA9PT1mLmluZGV4T2YoZSkpO2lmKGd8fGgpYz1lLGgmJihiLmp8fChiLmo9Q2YoUixiLFIuYixhPyIuIithOiIiLGUpKSxjPWIuanx8ZSksZCh7aGE6YyxJYTpoLFphOmd9KX19ZnVuY3Rpb24gZGcoYSxiLGMpe3ZhciBkPXt9LGU9e307ZGYoYixmdW5jdGlvbihiKXtjZyhhLGIsYyxmdW5jdGlvbihjKXtVZi5jYWxsKGEuX2VsZW1lbnR8fGEsYy5oYSkmJihjLklhP1pmKGIsZCk6WmYoYixlKSl9KX0sbnVsbCwhMCk7cmV0dXJue1JhOmUsSGE6ZH19CmZ1bmN0aW9uIGVnKGEsYixjLGQpe3ZhciBlPXBmKGIpLGY9QmYoZS5pcyxlLk0pLGc9bmV3IFJlZ0V4cCgiKD86XnxbXi4jWzpdKSIrKGIuZXh0ZW5kcz8iXFwiK2Yuc2xpY2UoMCwtMSkrIlxcXSI6ZikrIigkfFsuOltcXHM+K35dKSIpLGg9VChiKTtlPWguQTtoPWguY3NzQnVpbGQ7dmFyIGs9ZmcoZSxkKTtyZXR1cm4gemYoYixlLGZ1bmN0aW9uKGIpe3ZhciBlPSIiO2IuaXx8WWYoYik7Yi5pLmNzc1RleHQmJihlPWFnKGEsYi5pLmNzc1RleHQsYykpO2IuY3NzVGV4dD1lO2lmKCFPJiYhZmYoYikmJmIuY3NzVGV4dCl7dmFyIGg9ZT1iLmNzc1RleHQ7bnVsbD09Yi5uYSYmKGIubmE9VWUudGVzdChlKSk7aWYoYi5uYSlpZihudWxsPT1iLlUpe2IuVT1bXTtmb3IodmFyIGwgaW4gayloPWtbbF0saD1oKGUpLGUhPT1oJiYoZT1oLGIuVS5wdXNoKGwpKX1lbHNle2ZvcihsPTA7bDxiLlUubGVuZ3RoOysrbCloPWtbYi5VW2xdXSxlPWgoZSk7aD1lfWIuY3NzVGV4dD1oO2Iuaj1iLmp8fApiLnNlbGVjdG9yO2U9Ii4iK2Q7bD1xZihiLmopO2g9MDtmb3IodmFyIE09bC5sZW5ndGgsVT12b2lkIDA7aDxNJiYoVT1sW2hdKTtoKyspbFtoXT1VLm1hdGNoKGcpP1UucmVwbGFjZShmLGUpOmUrIiAiK1U7Yi5zZWxlY3Rvcj1sLmpvaW4oIiwiKX19LGgpfWZ1bmN0aW9uIGZnKGEsYil7YT1hLmI7dmFyIGM9e307aWYoIU8mJmEpZm9yKHZhciBkPTAsZT1hW2RdO2Q8YS5sZW5ndGg7ZT1hWysrZF0pe3ZhciBmPWUsZz1iO2YuZj1uZXcgUmVnRXhwKCJcXGIiK2Yua2V5ZnJhbWVzTmFtZSsiKD8hXFxCfC0pIiwiZyIpO2YuYT1mLmtleWZyYW1lc05hbWUrIi0iK2c7Zi5qPWYuanx8Zi5zZWxlY3RvcjtmLnNlbGVjdG9yPWYuai5yZXBsYWNlKGYua2V5ZnJhbWVzTmFtZSxmLmEpO2NbZS5rZXlmcmFtZXNOYW1lXT1nZyhlKX1yZXR1cm4gY31mdW5jdGlvbiBnZyhhKXtyZXR1cm4gZnVuY3Rpb24oYil7cmV0dXJuIGIucmVwbGFjZShhLmYsYS5hKX19CmZ1bmN0aW9uIGhnKGEsYil7dmFyIGM9aWcsZD1lZihhKTthLnRleHRDb250ZW50PWNmKGQsZnVuY3Rpb24oYSl7dmFyIGQ9YS5jc3NUZXh0PWEucGFyc2VkQ3NzVGV4dDthLmkmJmEuaS5jc3NUZXh0JiYoZD1kLnJlcGxhY2UoSWUsIiIpLnJlcGxhY2UoSmUsIiIpLGEuY3NzVGV4dD1hZyhjLGQsYikpfSl9cC5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhXZi5wcm90b3R5cGUse2E6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiJ4LXNjb3BlIn19fSk7dmFyIGlnPW5ldyBXZjt2YXIgamc9e30sa2c9d2luZG93LmN1c3RvbUVsZW1lbnRzO2lmKGtnJiYhTyYmIVBlKXt2YXIgbGc9a2cuZGVmaW5lO2tnLmRlZmluZT1mdW5jdGlvbihhLGIsYyl7amdbYV18fChqZ1thXT1rZihhKSk7bGcuY2FsbChrZyxhLGIsYyl9fTtmdW5jdGlvbiBtZygpe3RoaXMuY2FjaGU9e319bWcucHJvdG90eXBlLnN0b3JlPWZ1bmN0aW9uKGEsYixjLGQpe3ZhciBlPXRoaXMuY2FjaGVbYV18fFtdO2UucHVzaCh7djpiLHN0eWxlRWxlbWVudDpjLHM6ZH0pOzEwMDxlLmxlbmd0aCYmZS5zaGlmdCgpO3RoaXMuY2FjaGVbYV09ZX07ZnVuY3Rpb24gbmcoKXt9dmFyIG9nPW5ldyBSZWdFeHAoUi5hKyJcXHMqKFteXFxzXSopIik7ZnVuY3Rpb24gcGcoYSl7cmV0dXJuKGE9KGEuY2xhc3NMaXN0JiZhLmNsYXNzTGlzdC52YWx1ZT9hLmNsYXNzTGlzdC52YWx1ZTphLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpLm1hdGNoKG9nKSk/YVsxXToiIn1mdW5jdGlvbiBxZyhhKXt2YXIgYj1vZihhKS5nZXRSb290Tm9kZSgpO3JldHVybiBiPT09YXx8Yj09PWEub3duZXJEb2N1bWVudD8iIjooYT1iLmhvc3QpP3BmKGEpLmlzOiIifQpmdW5jdGlvbiByZyhhKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9YVtiXTtpZihjLnRhcmdldCE9PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCYmYy50YXJnZXQhPT1kb2N1bWVudC5oZWFkKWZvcih2YXIgZD0wO2Q8Yy5hZGRlZE5vZGVzLmxlbmd0aDtkKyspe3ZhciBlPWMuYWRkZWROb2Rlc1tkXTtpZihlLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBmPWUuZ2V0Um9vdE5vZGUoKSxnPXBnKGUpO2lmKGcmJmY9PT1lLm93bmVyRG9jdW1lbnQmJigic3R5bGUiIT09ZS5sb2NhbE5hbWUmJiJ0ZW1wbGF0ZSIhPT1lLmxvY2FsTmFtZXx8IiI9PT1yZihlKSkpeWYoZSxnKTtlbHNlIGlmKGYgaW5zdGFuY2VvZiBTaGFkb3dSb290KWZvcihmPXFnKGUpLGYhPT1nJiZ4ZihlLGcsZiksZT13aW5kb3cuU2hhZHlET00ubmF0aXZlTWV0aG9kcy5xdWVyeVNlbGVjdG9yQWxsLmNhbGwoZSwiOm5vdCguIitSLmErIikiKSxnPTA7ZzxlLmxlbmd0aDtnKyspe2Y9ZVtnXTsKdmFyIGg9cWcoZik7aCYmd2YoZixoKX19fX19CmlmKCEoT3x8d2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaGFuZGxlc0R5bmFtaWNTY29waW5nKSl7dmFyIHNnPW5ldyBNdXRhdGlvbk9ic2VydmVyKHJnKSx0Zz1mdW5jdGlvbihhKXtzZy5vYnNlcnZlKGEse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSl9O2lmKHdpbmRvdy5jdXN0b21FbGVtZW50cyYmIXdpbmRvdy5jdXN0b21FbGVtZW50cy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXRnKGRvY3VtZW50KTtlbHNle3ZhciB1Zz1mdW5jdGlvbigpe3RnKGRvY3VtZW50LmJvZHkpfTt3aW5kb3cuSFRNTEltcG9ydHM/d2luZG93LkhUTUxJbXBvcnRzLndoZW5SZWFkeSh1Zyk6cmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCl7aWYoImxvYWRpbmciPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSl7dmFyIGE9ZnVuY3Rpb24oKXt1ZygpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGEpfTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIiwKYSl9ZWxzZSB1ZygpfSl9bmc9ZnVuY3Rpb24oKXtyZyhzZy50YWtlUmVjb3JkcygpKX19dmFyIHZnPW5nO3ZhciB3Zz17fTt2YXIgeGc9UHJvbWlzZS5yZXNvbHZlKCk7ZnVuY3Rpb24geWcoYSl7aWYoYT13Z1thXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gemcoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gQWcoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAseGcudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBCZz17fSxDZz1uZXcgbWc7ZnVuY3Rpb24gWSgpe3RoaXMubD17fTt0aGlzLmM9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O3ZhciBhPW5ldyB2ZTthLnJ1bGVzPVtdO3RoaXMuZj1UZih0aGlzLmMsbmV3IFNmKGEpKTt0aGlzLmc9ITE7dGhpcy5iPXRoaXMuYT1udWxsfW49WS5wcm90b3R5cGU7bi5mbHVzaD1mdW5jdGlvbigpe3ZnKCl9O24uRmE9ZnVuY3Rpb24oYSl7cmV0dXJuIGVmKGEpfTtuLlZhPWZ1bmN0aW9uKGEpe3JldHVybiBjZihhKX07bi5wcmVwYXJlVGVtcGxhdGU9ZnVuY3Rpb24oYSxiLGMpe3RoaXMucHJlcGFyZVRlbXBsYXRlRG9tKGEsYik7dGhpcy5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfTsKbi5wcmVwYXJlVGVtcGxhdGVTdHlsZXM9ZnVuY3Rpb24oYSxiLGMpe2lmKCFhLl9wcmVwYXJlZCYmIVBlKXtPfHxqZ1tiXXx8KGpnW2JdPWtmKGIpKTthLl9wcmVwYXJlZD0hMDthLm5hbWU9YjthLmV4dGVuZHM9Yzt3Z1tiXT1hO3ZhciBkPXJmKGEpLGU9c2YoZCk7Yz17aXM6YixleHRlbmRzOmN9O2Zvcih2YXIgZj1bXSxnPWEuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZSIpLGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihrLmhhc0F0dHJpYnV0ZSgic2hhZHktdW5zY29wZWQiKSl7aWYoIU8pe3ZhciBsPWsudGV4dENvbnRlbnQ7YmYuaGFzKGwpfHwoYmYuYWRkKGwpLGw9ay5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobCkpO2sucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChrKX19ZWxzZSBmLnB1c2goay50ZXh0Q29udGVudCksay5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGspfWY9Zi5qb2luKCIiKS50cmltKCkrKEJnW2JdfHwiIik7CkRnKHRoaXMpO2lmKCFlKXtpZihnPSFkKWc9U2UudGVzdChmKXx8UmUudGVzdChmKSxTZS5sYXN0SW5kZXg9MCxSZS5sYXN0SW5kZXg9MDtoPXdlKGYpO2cmJlEmJnRoaXMuYSYmdGhpcy5hLnRyYW5zZm9ybVJ1bGVzKGgsYik7YS5fc3R5bGVBc3Q9aH1nPVtdO1F8fChnPVhmKGEuX3N0eWxlQXN0KSk7aWYoIWcubGVuZ3RofHxRKWg9Tz9hLmNvbnRlbnQ6bnVsbCxiPWpnW2JdfHxudWxsLGQ9emYoYyxhLl9zdHlsZUFzdCxudWxsLGQsZT9mOiIiKSxkPWQubGVuZ3RoP2dmKGQsYy5pcyxoLGIpOm51bGwsYS5fc3R5bGU9ZDthLmE9Z319O24uUWE9ZnVuY3Rpb24oYSxiKXtCZ1tiXT1hLmpvaW4oIiAiKX07bi5wcmVwYXJlVGVtcGxhdGVEb209ZnVuY3Rpb24oYSxiKXtpZighUGUpe3ZhciBjPXJmKGEpO098fCJzaGFkeSI9PT1jfHxhLl9kb21QcmVwYXJlZHx8KGEuX2RvbVByZXBhcmVkPSEwLHVmKGEuY29udGVudCxiKSl9fTsKZnVuY3Rpb24gRWcoYSl7dmFyIGI9cGYoYSksYz1iLmlzO2I9Yi5NO3ZhciBkPWpnW2NdfHxudWxsLGU9d2dbY107aWYoZSl7Yz1lLl9zdHlsZUFzdDt2YXIgZj1lLmE7ZT1yZihlKTtiPW5ldyBTZihjLGQsZixiLGUpO1RmKGEsYik7cmV0dXJuIGJ9fWZ1bmN0aW9uIEZnKGEpeyFhLmImJndpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlJiYoYS5iPXdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSxhLmIudHJhbnNmb3JtQ2FsbGJhY2s9ZnVuY3Rpb24oYil7YS5yYShiKX0sYS5iLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXsoYS5iLmVucXVldWVkfHxhLmcpJiZhLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX0pfQpmdW5jdGlvbiBEZyhhKXshYS5hJiZ3aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0mJihhLmE9d2luZG93LlNoYWR5Q1NTLkFwcGx5U2hpbSxhLmEuaW52YWxpZENhbGxiYWNrPXlnKTtGZyhhKX0Kbi5mbHVzaEN1c3RvbVN0eWxlcz1mdW5jdGlvbigpe2lmKCFQZSYmKERnKHRoaXMpLHRoaXMuYikpe3ZhciBhPXRoaXMuYi5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5iLmVucXVldWVkJiYhc2YodGhpcy5mLmNzc0J1aWxkKSl7aWYoUSl7aWYoIXRoaXMuZi5jc3NCdWlsZClmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5iLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7aWYoYyYmUSYmdGhpcy5hKXt2YXIgZD1lZihjKTtEZyh0aGlzKTt0aGlzLmEudHJhbnNmb3JtUnVsZXMoZCk7Yy50ZXh0Q29udGVudD1jZihkKX19fWVsc2V7R2codGhpcyx0aGlzLmMsdGhpcy5mKTtmb3IoYj0wO2I8YS5sZW5ndGg7YisrKShjPXRoaXMuYi5nZXRTdHlsZUZvckN1c3RvbVN0eWxlKGFbYl0pKSYmaGcoYyx0aGlzLmYudyk7dGhpcy5nJiZ0aGlzLnN0eWxlRG9jdW1lbnQoKX10aGlzLmIuZW5xdWV1ZWQ9ITF9fX07Cm4uc3R5bGVFbGVtZW50PWZ1bmN0aW9uKGEsYil7aWYoUGUpe2lmKGIpe1QoYSl8fFRmKGEsbmV3IFNmKG51bGwpKTt2YXIgYz1UKGEpO2Mubz1jLm98fHt9O09iamVjdC5hc3NpZ24oYy5vLGIpO0hnKHRoaXMsYSxjKX19ZWxzZSBpZihjPVQoYSl8fEVnKGEpKWlmKGEhPT10aGlzLmMmJih0aGlzLmc9ITApLGImJihjLm89Yy5vfHx7fSxPYmplY3QuYXNzaWduKGMubyxiKSksUSlIZyh0aGlzLGEsYyk7ZWxzZSBpZih0aGlzLmZsdXNoKCksR2codGhpcyxhLGMpLGMuZmEmJmMuZmEubGVuZ3RoKXtiPXBmKGEpLmlzO3ZhciBkO2E6e2lmKGQ9Q2cuY2FjaGVbYl0pZm9yKHZhciBlPWQubGVuZ3RoLTE7MDw9ZTtlLS0pe3ZhciBmPWRbZV07Yjp7dmFyIGc9Yy5mYTtmb3IodmFyIGg9MDtoPGcubGVuZ3RoO2grKyl7dmFyIGs9Z1toXTtpZihmLnZba10hPT1jLndba10pe2c9ITE7YnJlYWsgYn19Zz0hMH1pZihnKXtkPWY7YnJlYWsgYX19ZD12b2lkIDB9Zz1kP2Quc3R5bGVFbGVtZW50Om51bGw7CmU9Yy5zOyhmPWQmJmQucyl8fChmPXRoaXMubFtiXT0odGhpcy5sW2JdfHwwKSsxLGY9YisiLSIrZik7Yy5zPWY7Zj1jLnM7aD1pZztoPWc/Zy50ZXh0Q29udGVudHx8IiI6ZWcoaCxhLGMudyxmKTtrPVQoYSk7dmFyIGw9ay5hO2wmJiFPJiZsIT09ZyYmKGwuX3VzZUNvdW50LS0sMD49bC5fdXNlQ291bnQmJmwucGFyZW50Tm9kZSYmbC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGwpKTtPP2suYT8oay5hLnRleHRDb250ZW50PWgsZz1rLmEpOmgmJihnPWdmKGgsZixhLnNoYWRvd1Jvb3Qsay5iKSk6Zz9nLnBhcmVudE5vZGV8fChWZiYmLTE8aC5pbmRleE9mKCJAbWVkaWEiKSYmKGcudGV4dENvbnRlbnQ9aCksaGYoZyxudWxsLGsuYikpOmgmJihnPWdmKGgsZixudWxsLGsuYikpO2cmJihnLl91c2VDb3VudD1nLl91c2VDb3VudHx8MCxrLmEhPWcmJmcuX3VzZUNvdW50Kyssay5hPWcpO2Y9ZztPfHwoZz1jLnMsaz1oPWEuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIixlJiYoaz1oLnJlcGxhY2UobmV3IFJlZ0V4cCgiXFxzKngtc2NvcGVcXHMqIisKZSsiXFxzKiIsImciKSwiICIpKSxrKz0oaz8iICI6IiIpKyJ4LXNjb3BlICIrZyxoIT09ayYmbmYoYSxrKSk7ZHx8Q2cuc3RvcmUoYixjLncsZixjLnMpfX07CmZ1bmN0aW9uIEhnKGEsYixjKXt2YXIgZD1wZihiKS5pcztpZihjLm8pe3ZhciBlPWMubyxmO2ZvcihmIGluIGUpbnVsbD09PWY/Yi5zdHlsZS5yZW1vdmVQcm9wZXJ0eShmKTpiLnN0eWxlLnNldFByb3BlcnR5KGYsZVtmXSl9ZT13Z1tkXTtpZighKCFlJiZiIT09YS5jfHxlJiYiIiE9PXJmKGUpKSYmZSYmZS5fc3R5bGUmJiF6ZyhlKSl7aWYoemcoZSl8fGUuX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uIT09ZS5fYXBwbHlTaGltTmV4dFZlcnNpb24pRGcoYSksYS5hJiZhLmEudHJhbnNmb3JtUnVsZXMoZS5fc3R5bGVBc3QsZCksZS5fc3R5bGUudGV4dENvbnRlbnQ9emYoYixjLkEpLEFnKGUpO08mJihhPWIuc2hhZG93Um9vdCkmJihhPWEucXVlcnlTZWxlY3Rvcigic3R5bGUiKSkmJihhLnRleHRDb250ZW50PXpmKGIsYy5BKSk7Yy5BPWUuX3N0eWxlQXN0fX0KZnVuY3Rpb24gSWcoYSxiKXtyZXR1cm4oYj1vZihiKS5nZXRSb290Tm9kZSgpLmhvc3QpP1QoYil8fEVnKGIpP2I6SWcoYSxiKTphLmN9ZnVuY3Rpb24gR2coYSxiLGMpe3ZhciBkPUlnKGEsYiksZT1UKGQpLGY9ZS53O2Q9PT1hLmN8fGZ8fChHZyhhLGQsZSksZj1lLncpO2E9T2JqZWN0LmNyZWF0ZShmfHxudWxsKTtkPWRnKGIsYy5BLGMuY3NzQnVpbGQpO2I9YmcoZS5BLGIpLnY7T2JqZWN0LmFzc2lnbihhLGQuSGEsYixkLlJhKTtiPWMubztmb3IodmFyIGcgaW4gYilpZigoZT1iW2ddKXx8MD09PWUpYVtnXT1lO2c9aWc7Yj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhhKTtmb3IoZT0wO2U8Yi5sZW5ndGg7ZSsrKWQ9YltlXSxhW2RdPSRmKGcsYVtkXSxhKTtjLnc9YX1uLnN0eWxlRG9jdW1lbnQ9ZnVuY3Rpb24oYSl7dGhpcy5zdHlsZVN1YnRyZWUodGhpcy5jLGEpfTsKbi5zdHlsZVN1YnRyZWU9ZnVuY3Rpb24oYSxiKXt2YXIgYz1vZihhKSxkPWMuc2hhZG93Um9vdDsoZHx8YT09PXRoaXMuYykmJnRoaXMuc3R5bGVFbGVtZW50KGEsYik7aWYoYT1kJiYoZC5jaGlsZHJlbnx8ZC5jaGlsZE5vZGVzKSlmb3IoYz0wO2M8YS5sZW5ndGg7YysrKXRoaXMuc3R5bGVTdWJ0cmVlKGFbY10pO2Vsc2UgaWYoYz1jLmNoaWxkcmVufHxjLmNoaWxkTm9kZXMpZm9yKGE9MDthPGMubGVuZ3RoO2ErKyl0aGlzLnN0eWxlU3VidHJlZShjW2FdKX07Cm4ucmE9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcyxjPXJmKGEpO2MhPT10aGlzLmYuY3NzQnVpbGQmJih0aGlzLmYuY3NzQnVpbGQ9Yyk7aWYoIXNmKGMpKXt2YXIgZD1lZihhKTtkZihkLGZ1bmN0aW9uKGEpe2lmKE8pUmYoYSk7ZWxzZXt2YXIgZD1SO2Euc2VsZWN0b3I9YS5wYXJzZWRTZWxlY3RvcjtSZihhKTthLnNlbGVjdG9yPWEuaj1DZihkLGEsZC5jLHZvaWQgMCx2b2lkIDApfVEmJiIiPT09YyYmKERnKGIpLGIuYSYmYi5hLnRyYW5zZm9ybVJ1bGUoYSkpfSk7UT9hLnRleHRDb250ZW50PWNmKGQpOnRoaXMuZi5BLnJ1bGVzLnB1c2goZCl9fTtuLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1mdW5jdGlvbihhLGIpe3ZhciBjO1F8fChjPShUKGEpfHxUKElnKHRoaXMsYSkpKS53W2JdKTtyZXR1cm4oYz1jfHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9jLnRyaW0oKToiIn07Cm4uVWE9ZnVuY3Rpb24oYSxiKXt2YXIgYz1vZihhKS5nZXRSb290Tm9kZSgpO2I9Yj9iLnNwbGl0KC9ccy8pOltdO2M9Yy5ob3N0JiZjLmhvc3QubG9jYWxOYW1lO2lmKCFjKXt2YXIgZD1hLmdldEF0dHJpYnV0ZSgiY2xhc3MiKTtpZihkKXtkPWQuc3BsaXQoL1xzLyk7Zm9yKHZhciBlPTA7ZTxkLmxlbmd0aDtlKyspaWYoZFtlXT09PVIuYSl7Yz1kW2UrMV07YnJlYWt9fX1jJiZiLnB1c2goUi5hLGMpO1F8fChjPVQoYSkpJiZjLnMmJmIucHVzaChpZy5hLGMucyk7bmYoYSxiLmpvaW4oIiAiKSl9O24uQmE9ZnVuY3Rpb24oYSl7cmV0dXJuIFQoYSl9O24uVGE9ZnVuY3Rpb24oYSxiKXt3ZihhLGIpfTtuLldhPWZ1bmN0aW9uKGEsYil7d2YoYSxiLCEwKX07bi5TYT1mdW5jdGlvbihhKXtyZXR1cm4gcWcoYSl9O24uRGE9ZnVuY3Rpb24oYSl7cmV0dXJuIHBnKGEpfTtZLnByb3RvdHlwZS5mbHVzaD1ZLnByb3RvdHlwZS5mbHVzaDtZLnByb3RvdHlwZS5wcmVwYXJlVGVtcGxhdGU9WS5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlOwpZLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVFbGVtZW50O1kucHJvdG90eXBlLnN0eWxlRG9jdW1lbnQ9WS5wcm90b3R5cGUuc3R5bGVEb2N1bWVudDtZLnByb3RvdHlwZS5zdHlsZVN1YnRyZWU9WS5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlO1kucHJvdG90eXBlLmdldENvbXB1dGVkU3R5bGVWYWx1ZT1ZLnByb3RvdHlwZS5nZXRDb21wdXRlZFN0eWxlVmFsdWU7WS5wcm90b3R5cGUuc2V0RWxlbWVudENsYXNzPVkucHJvdG90eXBlLlVhO1kucHJvdG90eXBlLl9zdHlsZUluZm9Gb3JOb2RlPVkucHJvdG90eXBlLkJhO1kucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlRm9yRG9jdW1lbnQ9WS5wcm90b3R5cGUucmE7WS5wcm90b3R5cGUuZ2V0U3R5bGVBc3Q9WS5wcm90b3R5cGUuRmE7WS5wcm90b3R5cGUuc3R5bGVBc3RUb1N0cmluZz1ZLnByb3RvdHlwZS5WYTtZLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlcz1ZLnByb3RvdHlwZS5mbHVzaEN1c3RvbVN0eWxlczsKWS5wcm90b3R5cGUuc2NvcGVOb2RlPVkucHJvdG90eXBlLlRhO1kucHJvdG90eXBlLnVuc2NvcGVOb2RlPVkucHJvdG90eXBlLldhO1kucHJvdG90eXBlLnNjb3BlRm9yTm9kZT1ZLnByb3RvdHlwZS5TYTtZLnByb3RvdHlwZS5jdXJyZW50U2NvcGVGb3JOb2RlPVkucHJvdG90eXBlLkRhO1kucHJvdG90eXBlLnByZXBhcmVBZG9wdGVkQ3NzVGV4dD1ZLnByb3RvdHlwZS5RYTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhZLnByb3RvdHlwZSx7bmF0aXZlU2hhZG93OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gT319LG5hdGl2ZUNzczp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9fX0pO3ZhciBaPW5ldyBZLEpnLEtnO3dpbmRvdy5TaGFkeUNTUyYmKEpnPXdpbmRvdy5TaGFkeUNTUy5BcHBseVNoaW0sS2c9d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlKTsKd2luZG93LlNoYWR5Q1NTPXtTY29waW5nU2hpbTpaLHByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIsYyl7Wi5mbHVzaEN1c3RvbVN0eWxlcygpO1oucHJlcGFyZVRlbXBsYXRlKGEsYixjKX0scHJlcGFyZVRlbXBsYXRlRG9tOmZ1bmN0aW9uKGEsYil7Wi5wcmVwYXJlVGVtcGxhdGVEb20oYSxiKX0scHJlcGFyZVRlbXBsYXRlU3R5bGVzOmZ1bmN0aW9uKGEsYixjKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoYSxiLGMpfSxzdHlsZVN1YnRyZWU6ZnVuY3Rpb24oYSxiKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZVN1YnRyZWUoYSxiKX0sc3R5bGVFbGVtZW50OmZ1bmN0aW9uKGEpe1ouZmx1c2hDdXN0b21TdHlsZXMoKTtaLnN0eWxlRWxlbWVudChhKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXtaLmZsdXNoQ3VzdG9tU3R5bGVzKCk7Wi5zdHlsZURvY3VtZW50KGEpfSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe1ouZmx1c2hDdXN0b21TdHlsZXMoKX0sCmdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybiBaLmdldENvbXB1dGVkU3R5bGVWYWx1ZShhLGIpfSxuYXRpdmVDc3M6USxuYXRpdmVTaGFkb3c6Tyxjc3NCdWlsZDpRZSxkaXNhYmxlUnVudGltZTpQZX07SmcmJih3aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPUpnKTtLZyYmKHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZT1LZyk7dmFyIExnPXdpbmRvdy5jdXN0b21FbGVtZW50cyxNZz13aW5kb3cuSFRNTEltcG9ydHMsTmc9d2luZG93LkhUTUxUZW1wbGF0ZUVsZW1lbnQ7d2luZG93LldlYkNvbXBvbmVudHM9d2luZG93LldlYkNvbXBvbmVudHN8fHt9O2lmKExnJiZMZy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrKXt2YXIgT2csUGc9ZnVuY3Rpb24oKXtpZihPZyl7TmcuQyYmTmcuQyh3aW5kb3cuZG9jdW1lbnQpO3ZhciBhPU9nO09nPW51bGw7YSgpO3JldHVybiEwfX0sUWc9TWcud2hlblJlYWR5O0xnLnBvbHlmaWxsV3JhcEZsdXNoQ2FsbGJhY2soZnVuY3Rpb24oYSl7T2c9YTtRZyhQZyl9KTtNZy53aGVuUmVhZHk9ZnVuY3Rpb24oYSl7UWcoZnVuY3Rpb24oKXtQZygpP01nLndoZW5SZWFkeShhKTphKCl9KX19Ck1nLndoZW5SZWFkeShmdW5jdGlvbigpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3dpbmRvdy5XZWJDb21wb25lbnRzLnJlYWR5PSEwO2RvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJXZWJDb21wb25lbnRzUmVhZHkiLHtidWJibGVzOiEwfSkpfSl9KTt2YXIgUmc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtSZy50ZXh0Q29udGVudD0iYm9keSB7dHJhbnNpdGlvbjogb3BhY2l0eSBlYXNlLWluIDAuMnM7IH0gXG5ib2R5W3VucmVzb2x2ZWRdIHtvcGFjaXR5OiAwOyBkaXNwbGF5OiBibG9jazsgb3ZlcmZsb3c6IGhpZGRlbjsgcG9zaXRpb246IHJlbGF0aXZlOyB9IFxuIjt2YXIgU2c9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigiaGVhZCIpO1NnLmluc2VydEJlZm9yZShSZyxTZy5maXJzdENoaWxkKTt9KS5jYWxsKHRoaXMpOwoKCgooZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBsPSEod2luZG93LlNoYWR5RE9NJiZ3aW5kb3cuU2hhZHlET00uaW5Vc2UpLHA7ZnVuY3Rpb24gcihhKXtwPWEmJmEuc2hpbWNzc3Byb3BlcnRpZXM/ITE6bHx8IShuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9BcHBsZVdlYktpdFwvNjAxfEVkZ2VcLzE1Lyl8fCF3aW5kb3cuQ1NTfHwhQ1NTLnN1cHBvcnRzfHwhQ1NTLnN1cHBvcnRzKCJib3gtc2hhZG93IiwiMCAwIDAgdmFyKC0tZm9vKSIpKX12YXIgdDt3aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCYmKHQ9d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkKTt2YXIgYWE9ISghd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLmRpc2FibGVSdW50aW1lKTsKd2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzP3A9d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzczp3aW5kb3cuU2hhZHlDU1M/KHIod2luZG93LlNoYWR5Q1NTKSx3aW5kb3cuU2hhZHlDU1M9dm9pZCAwKTpyKHdpbmRvdy5XZWJDb21wb25lbnRzJiZ3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncyk7dmFyIHU9cCx2PXQ7ZnVuY3Rpb24gdygpe3RoaXMuZW5kPXRoaXMuc3RhcnQ9MDt0aGlzLnJ1bGVzPXRoaXMucGFyZW50PXRoaXMucHJldmlvdXM9bnVsbDt0aGlzLmNzc1RleHQ9dGhpcy5wYXJzZWRDc3NUZXh0PSIiO3RoaXMuYXRSdWxlPSExO3RoaXMudHlwZT0wO3RoaXMucGFyc2VkU2VsZWN0b3I9dGhpcy5zZWxlY3Rvcj10aGlzLmtleWZyYW1lc05hbWU9IiJ9CmZ1bmN0aW9uIHgoYSl7YT1hLnJlcGxhY2UoYmEsIiIpLnJlcGxhY2UoY2EsIiIpO3ZhciBiPXksYz1hLGU9bmV3IHc7ZS5zdGFydD0wO2UuZW5kPWMubGVuZ3RoO2Zvcih2YXIgZD1lLGY9MCxnPWMubGVuZ3RoO2Y8ZztmKyspaWYoInsiPT09Y1tmXSl7ZC5ydWxlc3x8KGQucnVsZXM9W10pO3ZhciBoPWQsaz1oLnJ1bGVzW2gucnVsZXMubGVuZ3RoLTFdfHxudWxsO2Q9bmV3IHc7ZC5zdGFydD1mKzE7ZC5wYXJlbnQ9aDtkLnByZXZpb3VzPWs7aC5ydWxlcy5wdXNoKGQpfWVsc2UifSI9PT1jW2ZdJiYoZC5lbmQ9ZisxLGQ9ZC5wYXJlbnR8fGUpO3JldHVybiBiKGUsYSl9CmZ1bmN0aW9uIHkoYSxiKXt2YXIgYz1iLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kLTEpO2EucGFyc2VkQ3NzVGV4dD1hLmNzc1RleHQ9Yy50cmltKCk7YS5wYXJlbnQmJihjPWIuc3Vic3RyaW5nKGEucHJldmlvdXM/YS5wcmV2aW91cy5lbmQ6YS5wYXJlbnQuc3RhcnQsYS5zdGFydC0xKSxjPWRhKGMpLGM9Yy5yZXBsYWNlKHosIiAiKSxjPWMuc3Vic3RyaW5nKGMubGFzdEluZGV4T2YoIjsiKSsxKSxjPWEucGFyc2VkU2VsZWN0b3I9YS5zZWxlY3Rvcj1jLnRyaW0oKSxhLmF0UnVsZT0wPT09Yy5pbmRleE9mKCJAIiksYS5hdFJ1bGU/MD09PWMuaW5kZXhPZigiQG1lZGlhIik/YS50eXBlPUE6Yy5tYXRjaChlYSkmJihhLnR5cGU9QixhLmtleWZyYW1lc05hbWU9YS5zZWxlY3Rvci5zcGxpdCh6KS5wb3AoKSk6YS50eXBlPTA9PT1jLmluZGV4T2YoIi0tIik/QzpEKTtpZihjPWEucnVsZXMpZm9yKHZhciBlPTAsZD1jLmxlbmd0aCxmPXZvaWQgMDtlPGQmJihmPWNbZV0pO2UrKyl5KGYsYik7CnJldHVybiBhfWZ1bmN0aW9uIGRhKGEpe3JldHVybiBhLnJlcGxhY2UoL1xcKFswLTlhLWZdezEsNn0pXHMvZ2ksZnVuY3Rpb24oYSxjKXthPWM7Zm9yKGM9Ni1hLmxlbmd0aDtjLS07KWE9IjAiK2E7cmV0dXJuIlxcIithfSl9CmZ1bmN0aW9uIEUoYSxiLGMpe2M9dm9pZCAwPT09Yz8iIjpjO3ZhciBlPSIiO2lmKGEuY3NzVGV4dHx8YS5ydWxlcyl7dmFyIGQ9YS5ydWxlcyxmO2lmKGY9ZClmPWRbMF0sZj0hKGYmJmYuc2VsZWN0b3ImJjA9PT1mLnNlbGVjdG9yLmluZGV4T2YoIi0tIikpO2lmKGYpe2Y9MDtmb3IodmFyIGc9ZC5sZW5ndGgsaD12b2lkIDA7ZjxnJiYoaD1kW2ZdKTtmKyspZT1FKGgsYixlKX1lbHNlIGI/Yj1hLmNzc1RleHQ6KGI9YS5jc3NUZXh0LGI9Yi5yZXBsYWNlKGZhLCIiKS5yZXBsYWNlKGhhLCIiKSxiPWIucmVwbGFjZShpYSwiIikucmVwbGFjZShqYSwiIikpLChlPWIudHJpbSgpKSYmKGU9IiAgIitlKyJcbiIpfWUmJihhLnNlbGVjdG9yJiYoYys9YS5zZWxlY3RvcisiIHtcbiIpLGMrPWUsYS5zZWxlY3RvciYmKGMrPSJ9XG5cbiIpKTtyZXR1cm4gY30KdmFyIEQ9MSxCPTcsQT00LEM9MUUzLGJhPS9cL1wqW14qXSpcKisoW14vKl1bXipdKlwqKykqXC8vZ2ltLGNhPS9AaW1wb3J0W147XSo7L2dpbSxmYT0vKD86XlteO1wtXHN9XSspPy0tW147e31dKj86W157fTtdKj8oPzpbO1xuXXwkKS9naW0saGE9Lyg/Ol5bXjtcLVxzfV0rKT8tLVteO3t9XSo/Oltee307XSo/e1tefV0qP30oPzpbO1xuXXwkKT8vZ2ltLGlhPS9AYXBwbHlccypcKD9bXik7XSpcKT9ccyooPzpbO1xuXXwkKT8vZ2ltLGphPS9bXjs6XSo/OlteO10qP3ZhclwoW147XSpcKSg/Ols7XG5dfCQpPy9naW0sZWE9L15AW15cc10qa2V5ZnJhbWVzLyx6PS9ccysvZzt2YXIgRz0vKD86XnxbO1xze11ccyopKC0tW1x3LV0qPylccyo6XHMqKD86KCg/OicoPzpcXCd8LikqPyd8Iig/OlxcInwuKSo/InxcKFteKV0qP1wpfFtefTt7XSkrKXxceyhbXn1dKilcfSg/Oig/PVs7XHN9XSl8JCkpL2dpLEg9Lyg/Ol58XFcrKUBhcHBseVxzKlwoPyhbXik7XG5dKilcKT8vZ2ksa2E9L0BtZWRpYVxzKC4qKS87dmFyIEk9bmV3IFNldDtmdW5jdGlvbiBKKGEpe2lmKCFhKXJldHVybiIiOyJzdHJpbmciPT09dHlwZW9mIGEmJihhPXgoYSkpO3JldHVybiBFKGEsdSl9ZnVuY3Rpb24gSyhhKXshYS5fX2Nzc1J1bGVzJiZhLnRleHRDb250ZW50JiYoYS5fX2Nzc1J1bGVzPXgoYS50ZXh0Q29udGVudCkpO3JldHVybiBhLl9fY3NzUnVsZXN8fG51bGx9ZnVuY3Rpb24gTChhLGIsYyxlKXtpZihhKXt2YXIgZD0hMSxmPWEudHlwZTtpZihlJiZmPT09QSl7dmFyIGc9YS5zZWxlY3Rvci5tYXRjaChrYSk7ZyYmKHdpbmRvdy5tYXRjaE1lZGlhKGdbMV0pLm1hdGNoZXN8fChkPSEwKSl9Zj09PUQ/YihhKTpjJiZmPT09Qj9jKGEpOmY9PT1DJiYoZD0hMCk7aWYoKGE9YS5ydWxlcykmJiFkKWZvcihkPTAsZj1hLmxlbmd0aCxnPXZvaWQgMDtkPGYmJihnPWFbZF0pO2QrKylMKGcsYixjLGUpfX0KZnVuY3Rpb24gTShhLGIpe3ZhciBjPWEuaW5kZXhPZigidmFyKCIpO2lmKC0xPT09YylyZXR1cm4gYihhLCIiLCIiLCIiKTthOnt2YXIgZT0wO3ZhciBkPWMrMztmb3IodmFyIGY9YS5sZW5ndGg7ZDxmO2QrKylpZigiKCI9PT1hW2RdKWUrKztlbHNlIGlmKCIpIj09PWFbZF0mJjA9PT0tLWUpYnJlYWsgYTtkPS0xfWU9YS5zdWJzdHJpbmcoYys0LGQpO2M9YS5zdWJzdHJpbmcoMCxjKTthPU0oYS5zdWJzdHJpbmcoZCsxKSxiKTtkPWUuaW5kZXhPZigiLCIpO3JldHVybi0xPT09ZD9iKGMsZS50cmltKCksIiIsYSk6YihjLGUuc3Vic3RyaW5nKDAsZCkudHJpbSgpLGUuc3Vic3RyaW5nKGQrMSkudHJpbSgpLGEpfQpmdW5jdGlvbiBOKGEpe2lmKHZvaWQgMCE9PXYpcmV0dXJuIHY7aWYodm9pZCAwPT09YS5fX2Nzc0J1aWxkKXt2YXIgYj1hLmdldEF0dHJpYnV0ZSgiY3NzLWJ1aWxkIik7aWYoYilhLl9fY3NzQnVpbGQ9YjtlbHNle2E6e2I9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtpZihiIGluc3RhbmNlb2YgQ29tbWVudCYmKGI9Yi50ZXh0Q29udGVudC50cmltKCkuc3BsaXQoIjoiKSwiY3NzLWJ1aWxkIj09PWJbMF0pKXtiPWJbMV07YnJlYWsgYX1iPSIifWlmKCIiIT09Yil7dmFyIGM9InRlbXBsYXRlIj09PWEubG9jYWxOYW1lP2EuY29udGVudC5maXJzdENoaWxkOmEuZmlyc3RDaGlsZDtjLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYyl9YS5fX2Nzc0J1aWxkPWJ9fXJldHVybiBhLl9fY3NzQnVpbGR8fCIifTt2YXIgbGE9LztccyovbSxtYT0vXlxzKihpbml0aWFsKXwoaW5oZXJpdClccyokLyxPPS9ccyohaW1wb3J0YW50LztmdW5jdGlvbiBQKCl7dGhpcy5hPXt9fVAucHJvdG90eXBlLnNldD1mdW5jdGlvbihhLGIpe2E9YS50cmltKCk7dGhpcy5hW2FdPXtoOmIsaTp7fX19O1AucHJvdG90eXBlLmdldD1mdW5jdGlvbihhKXthPWEudHJpbSgpO3JldHVybiB0aGlzLmFbYV18fG51bGx9O3ZhciBRPW51bGw7ZnVuY3Rpb24gUigpe3RoaXMuYj10aGlzLmM9bnVsbDt0aGlzLmE9bmV3IFB9Ui5wcm90b3R5cGUubz1mdW5jdGlvbihhKXthPUgudGVzdChhKXx8Ry50ZXN0KGEpO0gubGFzdEluZGV4PTA7Ry5sYXN0SW5kZXg9MDtyZXR1cm4gYX07ClIucHJvdG90eXBlLm09ZnVuY3Rpb24oYSxiKXtpZih2b2lkIDA9PT1hLl9nYXRoZXJlZFN0eWxlKXt2YXIgYz1bXTtmb3IodmFyIGU9YS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIiksZD0wO2Q8ZS5sZW5ndGg7ZCsrKXt2YXIgZj1lW2RdO2lmKGYuaGFzQXR0cmlidXRlKCJzaGFkeS11bnNjb3BlZCIpKXtpZighbCl7dmFyIGc9Zi50ZXh0Q29udGVudDtJLmhhcyhnKXx8KEkuYWRkKGcpLGc9Zi5jbG9uZU5vZGUoITApLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoZykpO2YucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChmKX19ZWxzZSBjLnB1c2goZi50ZXh0Q29udGVudCksZi5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGYpfShjPWMuam9pbigiIikudHJpbSgpKT8oZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpLGUudGV4dENvbnRlbnQ9YyxhLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKGUsYS5jb250ZW50LmZpcnN0Q2hpbGQpLGM9ZSk6Yz1udWxsO2EuX2dhdGhlcmVkU3R5bGU9CmN9cmV0dXJuKGE9YS5fZ2F0aGVyZWRTdHlsZSk/dGhpcy5qKGEsYik6bnVsbH07Ui5wcm90b3R5cGUuaj1mdW5jdGlvbihhLGIpe2I9dm9pZCAwPT09Yj8iIjpiO3ZhciBjPUsoYSk7dGhpcy5sKGMsYik7YS50ZXh0Q29udGVudD1KKGMpO3JldHVybiBjfTtSLnByb3RvdHlwZS5mPWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMsYz1LKGEpO0woYyxmdW5jdGlvbihhKXsiOnJvb3QiPT09YS5zZWxlY3RvciYmKGEuc2VsZWN0b3I9Imh0bWwiKTtiLmcoYSl9KTthLnRleHRDb250ZW50PUooYyk7cmV0dXJuIGN9O1IucHJvdG90eXBlLmw9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzO3RoaXMuYz1iO0woYSxmdW5jdGlvbihhKXtjLmcoYSl9KTt0aGlzLmM9bnVsbH07Ui5wcm90b3R5cGUuZz1mdW5jdGlvbihhKXthLmNzc1RleHQ9bmEodGhpcyxhLnBhcnNlZENzc1RleHQsYSk7Ijpyb290Ij09PWEuc2VsZWN0b3ImJihhLnNlbGVjdG9yPSI6aG9zdCA+ICoiKX07CmZ1bmN0aW9uIG5hKGEsYixjKXtiPWIucmVwbGFjZShHLGZ1bmN0aW9uKGIsZCxmLGcpe3JldHVybiBvYShhLGIsZCxmLGcsYyl9KTtyZXR1cm4gUyhhLGIsYyl9ZnVuY3Rpb24gcGEoYSxiKXtmb3IodmFyIGM9YjtjLnBhcmVudDspYz1jLnBhcmVudDt2YXIgZT17fSxkPSExO0woYyxmdW5jdGlvbihjKXsoZD1kfHxjPT09Yil8fGMuc2VsZWN0b3I9PT1iLnNlbGVjdG9yJiZPYmplY3QuYXNzaWduKGUsVChhLGMucGFyc2VkQ3NzVGV4dCkpfSk7cmV0dXJuIGV9CmZ1bmN0aW9uIFMoYSxiLGMpe2Zvcih2YXIgZTtlPUguZXhlYyhiKTspe3ZhciBkPWVbMF0sZj1lWzFdO2U9ZS5pbmRleDt2YXIgZz1iLnNsaWNlKDAsZStkLmluZGV4T2YoIkBhcHBseSIpKTtiPWIuc2xpY2UoZStkLmxlbmd0aCk7dmFyIGg9Yz9wYShhLGMpOnt9O09iamVjdC5hc3NpZ24oaCxUKGEsZykpO2Q9dm9pZCAwO3ZhciBrPWE7Zj1mLnJlcGxhY2UobGEsIiIpO3ZhciBuPVtdO3ZhciBtPWsuYS5nZXQoZik7bXx8KGsuYS5zZXQoZix7fSksbT1rLmEuZ2V0KGYpKTtpZihtKXtrLmMmJihtLmlbay5jXT0hMCk7dmFyIHE9bS5oO2ZvcihkIGluIHEpaz1oJiZoW2RdLG09W2QsIjogdmFyKCIsZiwiXy1fIixkXSxrJiZtLnB1c2goIiwiLGsucmVwbGFjZShPLCIiKSksbS5wdXNoKCIpIiksTy50ZXN0KHFbZF0pJiZtLnB1c2goIiAhaW1wb3J0YW50Iiksbi5wdXNoKG0uam9pbigiIikpfWQ9bi5qb2luKCI7ICIpO2I9ZytkK2I7SC5sYXN0SW5kZXg9ZStkLmxlbmd0aH1yZXR1cm4gYn0KZnVuY3Rpb24gVChhLGIsYyl7Yz12b2lkIDA9PT1jPyExOmM7Yj1iLnNwbGl0KCI7Iik7Zm9yKHZhciBlLGQsZj17fSxnPTAsaDtnPGIubGVuZ3RoO2crKylpZihlPWJbZ10paWYoaD1lLnNwbGl0KCI6IiksMTxoLmxlbmd0aCl7ZT1oWzBdLnRyaW0oKTtkPWguc2xpY2UoMSkuam9pbigiOiIpO2lmKGMpe3ZhciBrPWE7aD1lO3ZhciBuPW1hLmV4ZWMoZCk7biYmKG5bMV0/KGsuYnx8KGsuYj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJtZXRhIiksay5iLnNldEF0dHJpYnV0ZSgiYXBwbHktc2hpbS1tZWFzdXJlIiwiIiksay5iLnN0eWxlLmFsbD0iaW5pdGlhbCIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChrLmIpKSxoPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGsuYikuZ2V0UHJvcGVydHlWYWx1ZShoKSk6aD0iYXBwbHktc2hpbS1pbmhlcml0IixkPWgpfWZbZV09ZH1yZXR1cm4gZn1mdW5jdGlvbiBxYShhLGIpe2lmKFEpZm9yKHZhciBjIGluIGIuaSljIT09YS5jJiZRKGMpfQpmdW5jdGlvbiBvYShhLGIsYyxlLGQsZil7ZSYmTShlLGZ1bmN0aW9uKGIsYyl7YyYmYS5hLmdldChjKSYmKGQ9IkBhcHBseSAiK2MrIjsiKX0pO2lmKCFkKXJldHVybiBiO3ZhciBnPVMoYSwiIitkLGYpO2Y9Yi5zbGljZSgwLGIuaW5kZXhPZigiLS0iKSk7dmFyIGg9Zz1UKGEsZywhMCksaz1hLmEuZ2V0KGMpLG49ayYmay5oO24/aD1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUobiksZyk6YS5hLnNldChjLGgpO3ZhciBtPVtdLHEsWj0hMTtmb3IocSBpbiBoKXt2YXIgRj1nW3FdO3ZvaWQgMD09PUYmJihGPSJpbml0aWFsIik7IW58fHEgaW4gbnx8KFo9ITApO20ucHVzaChjKyJfLV8iK3ErIjogIitGKX1aJiZxYShhLGspO2smJihrLmg9aCk7ZSYmKGY9YisiOyIrZik7cmV0dXJuIGYrbS5qb2luKCI7ICIpKyI7In1SLnByb3RvdHlwZS5kZXRlY3RNaXhpbj1SLnByb3RvdHlwZS5vO1IucHJvdG90eXBlLnRyYW5zZm9ybVN0eWxlPVIucHJvdG90eXBlLmo7ClIucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlPVIucHJvdG90eXBlLmY7Ui5wcm90b3R5cGUudHJhbnNmb3JtUnVsZXM9Ui5wcm90b3R5cGUubDtSLnByb3RvdHlwZS50cmFuc2Zvcm1SdWxlPVIucHJvdG90eXBlLmc7Ui5wcm90b3R5cGUudHJhbnNmb3JtVGVtcGxhdGU9Ui5wcm90b3R5cGUubTtSLnByb3RvdHlwZS5fc2VwYXJhdG9yPSJfLV8iO09iamVjdC5kZWZpbmVQcm9wZXJ0eShSLnByb3RvdHlwZSwiaW52YWxpZENhbGxiYWNrIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIFF9LHNldDpmdW5jdGlvbihhKXtRPWF9fSk7dmFyIFU9e307dmFyIHJhPVByb21pc2UucmVzb2x2ZSgpO2Z1bmN0aW9uIHNhKGEpe2lmKGE9VVthXSlhLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbj1hLl9hcHBseVNoaW1DdXJyZW50VmVyc2lvbnx8MCxhLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbj1hLl9hcHBseVNoaW1WYWxpZGF0aW5nVmVyc2lvbnx8MCxhLl9hcHBseVNoaW1OZXh0VmVyc2lvbj0oYS5fYXBwbHlTaGltTmV4dFZlcnNpb258fDApKzF9ZnVuY3Rpb24gdGEoYSl7cmV0dXJuIGEuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPT09YS5fYXBwbHlTaGltTmV4dFZlcnNpb259ZnVuY3Rpb24gdWEoYSl7YS5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb249YS5fYXBwbHlTaGltTmV4dFZlcnNpb247YS5fdmFsaWRhdGluZ3x8KGEuX3ZhbGlkYXRpbmc9ITAscmEudGhlbihmdW5jdGlvbigpe2EuX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uPWEuX2FwcGx5U2hpbU5leHRWZXJzaW9uO2EuX3ZhbGlkYXRpbmc9ITF9KSl9O3ZhciBWPW5ldyBSO2Z1bmN0aW9uIFcoKXt0aGlzLmE9bnVsbDtWLmludmFsaWRDYWxsYmFjaz1zYX1mdW5jdGlvbiBYKGEpeyFhLmEmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSYmKGEuYT13aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UsYS5hLnRyYW5zZm9ybUNhbGxiYWNrPWZ1bmN0aW9uKGEpe1YuZihhKX0sYS5hLnZhbGlkYXRlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXthLmEuZW5xdWV1ZWQmJmEuZmx1c2hDdXN0b21TdHlsZXMoKX0pfSl9Vy5wcm90b3R5cGUucHJlcGFyZVRlbXBsYXRlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTsiIj09PU4oYSkmJihVW2JdPWEsYj1WLm0oYSxiKSxhLl9zdHlsZUFzdD1iKX07ClcucHJvdG90eXBlLmZsdXNoQ3VzdG9tU3R5bGVzPWZ1bmN0aW9uKCl7WCh0aGlzKTtpZih0aGlzLmEpe3ZhciBhPXRoaXMuYS5wcm9jZXNzU3R5bGVzKCk7aWYodGhpcy5hLmVucXVldWVkKXtmb3IodmFyIGI9MDtiPGEubGVuZ3RoO2IrKyl7dmFyIGM9dGhpcy5hLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoYVtiXSk7YyYmVi5mKGMpfXRoaXMuYS5lbnF1ZXVlZD0hMX19fTsKVy5wcm90b3R5cGUuc3R5bGVTdWJ0cmVlPWZ1bmN0aW9uKGEsYil7WCh0aGlzKTtpZihiKWZvcih2YXIgYyBpbiBiKW51bGw9PT1jP2Euc3R5bGUucmVtb3ZlUHJvcGVydHkoYyk6YS5zdHlsZS5zZXRQcm9wZXJ0eShjLGJbY10pO2lmKGEuc2hhZG93Um9vdClmb3IodGhpcy5zdHlsZUVsZW1lbnQoYSksYT1hLnNoYWRvd1Jvb3QuY2hpbGRyZW58fGEuc2hhZG93Um9vdC5jaGlsZE5vZGVzLGI9MDtiPGEubGVuZ3RoO2IrKyl0aGlzLnN0eWxlU3VidHJlZShhW2JdKTtlbHNlIGZvcihhPWEuY2hpbGRyZW58fGEuY2hpbGROb2RlcyxiPTA7YjxhLmxlbmd0aDtiKyspdGhpcy5zdHlsZVN1YnRyZWUoYVtiXSl9OwpXLnByb3RvdHlwZS5zdHlsZUVsZW1lbnQ9ZnVuY3Rpb24oYSl7WCh0aGlzKTt2YXIgYj1hLmxvY2FsTmFtZSxjO2I/LTE8Yi5pbmRleE9mKCItIik/Yz1iOmM9YS5nZXRBdHRyaWJ1dGUmJmEuZ2V0QXR0cmlidXRlKCJpcyIpfHwiIjpjPWEuaXM7Yj1VW2NdO2lmKCEoYiYmIiIhPT1OKGIpfHwhYnx8dGEoYikpKXtpZih0YShiKXx8Yi5fYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb24hPT1iLl9hcHBseVNoaW1OZXh0VmVyc2lvbil0aGlzLnByZXBhcmVUZW1wbGF0ZShiLGMpLHVhKGIpO2lmKGE9YS5zaGFkb3dSb290KWlmKGE9YS5xdWVyeVNlbGVjdG9yKCJzdHlsZSIpKWEuX19jc3NSdWxlcz1iLl9zdHlsZUFzdCxhLnRleHRDb250ZW50PUooYi5fc3R5bGVBc3QpfX07Vy5wcm90b3R5cGUuc3R5bGVEb2N1bWVudD1mdW5jdGlvbihhKXtYKHRoaXMpO3RoaXMuc3R5bGVTdWJ0cmVlKGRvY3VtZW50LmJvZHksYSl9OwppZighd2luZG93LlNoYWR5Q1NTfHwhd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKXt2YXIgWT1uZXcgVyx2YT13aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZTt3aW5kb3cuU2hhZHlDU1M9e3ByZXBhcmVUZW1wbGF0ZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnByZXBhcmVUZW1wbGF0ZShhLGIpfSxwcmVwYXJlVGVtcGxhdGVTdHlsZXM6ZnVuY3Rpb24oYSxiLGMpe3dpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGUoYSxiLGMpfSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHN0eWxlU3VidHJlZTpmdW5jdGlvbihhLGIpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTtZLnN0eWxlU3VidHJlZShhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oYSl7WS5mbHVzaEN1c3RvbVN0eWxlcygpO1kuc3R5bGVFbGVtZW50KGEpfSxzdHlsZURvY3VtZW50OmZ1bmN0aW9uKGEpe1kuZmx1c2hDdXN0b21TdHlsZXMoKTsKWS5zdHlsZURvY3VtZW50KGEpfSxnZXRDb21wdXRlZFN0eWxlVmFsdWU6ZnVuY3Rpb24oYSxiKXtyZXR1cm4oYT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShhKS5nZXRQcm9wZXJ0eVZhbHVlKGIpKT9hLnRyaW0oKToiIn0sZmx1c2hDdXN0b21TdHlsZXM6ZnVuY3Rpb24oKXtZLmZsdXNoQ3VzdG9tU3R5bGVzKCl9LG5hdGl2ZUNzczp1LG5hdGl2ZVNoYWRvdzpsLGNzc0J1aWxkOnYsZGlzYWJsZVJ1bnRpbWU6YWF9O3ZhJiYod2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXZhKX13aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltPVY7fSkuY2FsbCh0aGlzKTsKCgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IHVzZXJQb2x5bWVyID0gd2luZG93LlBvbHltZXI7CgogIC8qKgogICAqIEBuYW1lc3BhY2UgUG9seW1lcgogICAqIEBzdW1tYXJ5IFBvbHltZXIgaXMgYSBsaWdodHdlaWdodCBsaWJyYXJ5IGJ1aWx0IG9uIHRvcCBvZiB0aGUgd2ViCiAgICogICBzdGFuZGFyZHMtYmFzZWQgV2ViIENvbXBvbmVudHMgQVBJJ3MsIGFuZCBtYWtlcyBpdCBlYXN5IHRvIGJ1aWxkIHlvdXIKICAgKiAgIG93biBjdXN0b20gSFRNTCBlbGVtZW50cy4KICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBQcm90b3R5cGUgZm9yIHRoZSBjdXN0b20gZWxlbWVudC4gSXQgbXVzdCBjb250YWluCiAgICogICBhbiBgaXNgIHByb3BlcnR5IHRvIHNwZWNpZnkgdGhlIGVsZW1lbnQgbmFtZS4gT3RoZXIgcHJvcGVydGllcyBwb3B1bGF0ZQogICAqICAgdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGUgYHByb3BlcnRpZXNgLCBgb2JzZXJ2ZXJzYCwgYGhvc3RBdHRyaWJ1dGVzYCwKICAgKiAgIGFuZCBgbGlzdGVuZXJzYCBwcm9wZXJ0aWVzIGFyZSBwcm9jZXNzZWQgdG8gY3JlYXRlIGVsZW1lbnQgZmVhdHVyZXMuCiAgICogQHJldHVybiB7IU9iamVjdH0gUmV0dXJucyBhIGN1c3RvbSBlbGVtZW50IGNsYXNzIGZvciB0aGUgZ2l2ZW4gcHJvdmlkZWQKICAgKiAgIHByb3RvdHlwZSBgaW5mb2Agb2JqZWN0LiBUaGUgbmFtZSBvZiB0aGUgZWxlbWVudCBpZiBnaXZlbiBieSBgaW5mby5pc2AuCiAgICovCiAgd2luZG93LlBvbHltZXIgPSBmdW5jdGlvbihpbmZvKSB7CiAgICByZXR1cm4gd2luZG93LlBvbHltZXIuX3BvbHltZXJGbihpbmZvKTsKICB9OwoKICAvLyBzdXBwb3J0IHVzZXIgc2V0dGluZ3Mgb24gdGhlIFBvbHltZXIgb2JqZWN0CiAgaWYgKHVzZXJQb2x5bWVyKSB7CiAgICBPYmplY3QuYXNzaWduKFBvbHltZXIsIHVzZXJQb2x5bWVyKTsKICB9CgogIC8vIFRvIGJlIHBsdWdnZWQgYnkgbGVnYWN5IGltcGxlbWVudGF0aW9uIGlmIGxvYWRlZAogIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgLyoqCiAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUHJvdG90eXBlIGZvciB0aGUgY3VzdG9tIGVsZW1lbnQuIEl0IG11c3QgY29udGFpbgogICAqICAgYW4gYGlzYCBwcm9wZXJ0eSB0byBzcGVjaWZ5IHRoZSBlbGVtZW50IG5hbWUuIE90aGVyIHByb3BlcnRpZXMgcG9wdWxhdGUKICAgKiAgIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhlIGBwcm9wZXJ0aWVzYCwgYG9ic2VydmVyc2AsIGBob3N0QXR0cmlidXRlc2AsCiAgICogICBhbmQgYGxpc3RlbmVyc2AgcHJvcGVydGllcyBhcmUgcHJvY2Vzc2VkIHRvIGNyZWF0ZSBlbGVtZW50IGZlYXR1cmVzLgogICAqIEByZXR1cm4geyFPYmplY3R9IFJldHVybnMgYSBjdXN0b20gZWxlbWVudCBjbGFzcyBmb3IgdGhlIGdpdmVuIHByb3ZpZGVkCiAgICogICBwcm90b3R5cGUgYGluZm9gIG9iamVjdC4gVGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaWYgZ2l2ZW4gYnkgYGluZm8uaXNgLgogICAqLwogIHdpbmRvdy5Qb2x5bWVyLl9wb2x5bWVyRm4gPSBmdW5jdGlvbihpbmZvKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgIHRocm93IG5ldyBFcnJvcignTG9hZCBwb2x5bWVyLmh0bWwgdG8gdXNlIHRoZSBQb2x5bWVyKCkgZnVuY3Rpb24uJyk7CiAgfTsKICAvKiBlc2xpbnQtZW5hYmxlICovCgogIHdpbmRvdy5Qb2x5bWVyLnZlcnNpb24gPSAnMi43LjAnOwoKICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogIC8qCiAgV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzIHJlcGxhY2VkIGJ5IHRoZSBtdW5nZWQgbmFtZSBmb3Igb2JqZWN0W3Byb3BlcnR5XQogIFdlIGNhbm5vdCBhbGlhcyB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvIHVzZSBhIHNtYWxsIHNoaW0gdGhhdCBoYXMgdGhlIHNhbWUgYmVoYXZpb3Igd2hlbiBub3QgY29tcGlsaW5nLgogICovCiAgd2luZG93LkpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkgPSBmdW5jdGlvbihwcm9wLCBvYmopIHsKICAgIHJldHVybiBwcm9wOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSAqLwoKfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IENTU19VUkxfUlggPSAvKHVybFwoKShbXildKikoXCkpL2c7CiAgICBsZXQgQUJTX1VSTCA9IC8oXlwvKXwoXiMpfCheW1x3LVxkXSo6KS87CiAgICBsZXQgd29ya2luZ1VSTDsKICAgIGxldCByZXNvbHZlRG9jOwogICAgLyoqCiAgICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gVVJMIGFnYWluc3QgdGhlIHByb3ZpZGVkIGBiYXNlVXJpJy4KICAgICAqIAogICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgKiB3aXRoIGAvYCAoYWJzb2x1dGUgVVJMcykgb3IgYCNgIChoYXNoIGlkZW50aWZpZXJzKS4gIEZvciBnZW5lcmFsIHB1cnBvc2UKICAgICAqIFVSTCByZXNvbHV0aW9uLCB1c2UgYHdpbmRvdy5VUkxgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSW5wdXQgVVJMIHRvIHJlc29sdmUKICAgICAqIEBwYXJhbSB7P3N0cmluZz19IGJhc2VVUkkgQmFzZSBVUkkgdG8gcmVzb2x2ZSB0aGUgVVJMIGFnYWluc3QKICAgICAqIEByZXR1cm4ge3N0cmluZ30gcmVzb2x2ZWQgVVJMCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVVcmwodXJsLCBiYXNlVVJJKSB7CiAgICAgIGlmICh1cmwgJiYgQUJTX1VSTC50ZXN0KHVybCkpIHsKICAgICAgICByZXR1cm4gdXJsOwogICAgICB9CiAgICAgIC8vIExhenkgZmVhdHVyZSBkZXRlY3Rpb24uCiAgICAgIGlmICh3b3JraW5nVVJMID09PSB1bmRlZmluZWQpIHsKICAgICAgICB3b3JraW5nVVJMID0gZmFsc2U7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGNvbnN0IHUgPSBuZXcgVVJMKCdiJywgJ2h0dHA6Ly9hJyk7CiAgICAgICAgICB1LnBhdGhuYW1lID0gJ2MlMjBkJzsKICAgICAgICAgIHdvcmtpbmdVUkwgPSAodS5ocmVmID09PSAnaHR0cDovL2EvYyUyMGQnKTsKICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAvLyBzaWxlbnRseSBmYWlsCiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICghYmFzZVVSSSkgewogICAgICAgIGJhc2VVUkkgPSBkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICB9CiAgICAgIGlmICh3b3JraW5nVVJMKSB7CiAgICAgICAgcmV0dXJuIChuZXcgVVJMKHVybCwgYmFzZVVSSSkpLmhyZWY7CiAgICAgIH0KICAgICAgLy8gRmFsbGJhY2sgdG8gY3JlYXRpbmcgYW4gYW5jaG9yIGludG8gYSBkaXNjb25uZWN0ZWQgZG9jdW1lbnQuCiAgICAgIGlmICghcmVzb2x2ZURvYykgewogICAgICAgIHJlc29sdmVEb2MgPSBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJ3RlbXAnKTsKICAgICAgICByZXNvbHZlRG9jLmJhc2UgPSByZXNvbHZlRG9jLmNyZWF0ZUVsZW1lbnQoJ2Jhc2UnKTsKICAgICAgICByZXNvbHZlRG9jLmhlYWQuYXBwZW5kQ2hpbGQocmVzb2x2ZURvYy5iYXNlKTsKICAgICAgICByZXNvbHZlRG9jLmFuY2hvciA9IHJlc29sdmVEb2MuY3JlYXRlRWxlbWVudCgnYScpOwogICAgICAgIHJlc29sdmVEb2MuYm9keS5hcHBlbmRDaGlsZChyZXNvbHZlRG9jLmFuY2hvcik7CiAgICAgIH0KICAgICAgcmVzb2x2ZURvYy5iYXNlLmhyZWYgPSBiYXNlVVJJOwogICAgICByZXNvbHZlRG9jLmFuY2hvci5ocmVmID0gdXJsOwogICAgICByZXR1cm4gcmVzb2x2ZURvYy5hbmNob3IuaHJlZiB8fCB1cmw7CgogICAgfQoKICAgIC8qKgogICAgICogUmVzb2x2ZXMgYW55IHJlbGF0aXZlIFVSTCdzIGluIHRoZSBnaXZlbiBDU1MgdGV4dCBhZ2FpbnN0IHRoZSBwcm92aWRlZAogICAgICogYG93bmVyRG9jdW1lbnRgJ3MgYGJhc2VVUklgLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjc3NUZXh0IENTUyB0ZXh0IHRvIHByb2Nlc3MKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFByb2Nlc3NlZCBDU1MgdGV4dCB3aXRoIHJlc29sdmVkIFVSTCdzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICByZXR1cm4gY3NzVGV4dC5yZXBsYWNlKENTU19VUkxfUlgsIGZ1bmN0aW9uKG0sIHByZSwgdXJsLCBwb3N0KSB7CiAgICAgICAgcmV0dXJuIHByZSArICdcJycgKwogICAgICAgICAgcmVzb2x2ZVVybCh1cmwucmVwbGFjZSgvWyInXS9nLCAnJyksIGJhc2VVUkkpICsKICAgICAgICAgICdcJycgKyBwb3N0OwogICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYSBwYXRoIGZyb20gYSBnaXZlbiBgdXJsYC4gVGhlIHBhdGggaW5jbHVkZXMgdGhlIHRyYWlsaW5nCiAgICAgKiBgL2AgZnJvbSB0aGUgdXJsLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlc29sdmVVcmwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgSW5wdXQgVVJMIHRvIHRyYW5zZm9ybQogICAgICogQHJldHVybiB7c3RyaW5nfSByZXNvbHZlZCBwYXRoCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhdGhGcm9tVXJsKHVybCkgewogICAgICByZXR1cm4gdXJsLnN1YnN0cmluZygwLCB1cmwubGFzdEluZGV4T2YoJy8nKSArIDEpOwogICAgfQoKICAgIC8qKgogICAgICogTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciByZXNvbHZpbmcgcmVsYXRpdmUgVVJMJ3MuCiAgICAgKgogICAgICogQG5hbWVzcGFjZQogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdW1tYXJ5IE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgcmVzb2x2aW5nIHJlbGF0aXZlIFVSTCdzLgogICAgICovCiAgICBQb2x5bWVyLlJlc29sdmVVcmwgPSB7CiAgICAgIHJlc29sdmVDc3M6IHJlc29sdmVDc3MsCiAgICAgIHJlc29sdmVVcmw6IHJlc29sdmVVcmwsCiAgICAgIHBhdGhGcm9tVXJsOiBwYXRoRnJvbVVybAogICAgfTsKCiAgfSkoKTsKCgoKLyoqIEBzdXBwcmVzcyB7ZGVwcmVjYXRlZH0gKi8KKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsLCBsZWdhY3kgc2V0dGluZ3MuCiAgICoKICAgKiBAZGVwcmVjYXRlZAogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqLwogIFBvbHltZXIuU2V0dGluZ3MgPSBQb2x5bWVyLlNldHRpbmdzIHx8IHt9OwoKICBQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdyA9ICEod2luZG93LlNoYWR5RE9NKTsKICBQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZUNTU1Byb3BlcnRpZXMgPQogICAgQm9vbGVhbighd2luZG93LlNoYWR5Q1NTIHx8IHdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3MpOwogIFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlQ3VzdG9tRWxlbWVudHMgPQogICAgISh3aW5kb3cuY3VzdG9tRWxlbWVudHMucG9seWZpbGxXcmFwRmx1c2hDYWxsYmFjayk7CgoKICAvKioKICAgKiBHbG9iYWxseSBzZXR0YWJsZSBwcm9wZXJ0eSB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdG8KICAgKiBgUG9seW1lci5FbGVtZW50TWl4aW5gIGluc3RhbmNlcywgdXNlZnVsIGZvciBiaW5kaW5nIGluIHRlbXBsYXRlcyB0bwogICAqIG1ha2UgVVJMJ3MgcmVsYXRpdmUgdG8gYW4gYXBwbGljYXRpb24ncyByb290LiAgRGVmYXVsdHMgdG8gdGhlIG1haW4KICAgKiBkb2N1bWVudCBVUkwsIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiBieSB1c2Vycy4gIEl0IG1heSBiZSB1c2VmdWwgdG8gc2V0CiAgICogYFBvbHltZXIucm9vdFBhdGhgIHRvIHByb3ZpZGUgYSBzdGFibGUgYXBwbGljYXRpb24gbW91bnQgcGF0aCB3aGVuCiAgICogdXNpbmcgY2xpZW50IHNpZGUgcm91dGluZy4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5yb290UGF0aCA9IFBvbHltZXIucm9vdFBhdGggfHwKICAgIFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChkb2N1bWVudC5iYXNlVVJJIHx8IHdpbmRvdy5sb2NhdGlvbi5ocmVmKTsKCiAgLyoqCiAgICogU2V0cyB0aGUgZ2xvYmFsIHJvb3RQYXRoIHByb3BlcnR5IHVzZWQgYnkgYFBvbHltZXIuRWxlbWVudE1peGluYCBhbmQKICAgKiBhdmFpbGFibGUgdmlhIGBQb2x5bWVyLnJvb3RQYXRoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIG5ldyByb290IHBhdGgKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuc2V0Um9vdFBhdGggPSBmdW5jdGlvbihwYXRoKSB7CiAgICBQb2x5bWVyLnJvb3RQYXRoID0gcGF0aDsKICB9OwoKICAvKioKICAgKiBBIGdsb2JhbCBjYWxsYmFjayB1c2VkIHRvIHNhbml0aXplIGFueSB2YWx1ZSBiZWZvcmUgaW5zZXJ0aW5nIGl0IGludG8gdGhlIERPTS4gVGhlIGNhbGxiYWNrIHNpZ25hdHVyZSBpczoKICAgKgogICAqICAgICBQb2x5bWVyID0gewogICAqICAgICAgIHNhbml0aXplRE9NVmFsdWU6IGZ1bmN0aW9uKHZhbHVlLCBuYW1lLCB0eXBlLCBub2RlKSB7IC4uLiB9CiAgICogICAgIH0KICAgKgogICAqIFdoZXJlOgogICAqCiAgICogYHZhbHVlYCBpcyB0aGUgdmFsdWUgdG8gc2FuaXRpemUuCiAgICogYG5hbWVgIGlzIHRoZSBuYW1lIG9mIGFuIGF0dHJpYnV0ZSBvciBwcm9wZXJ0eSAoZm9yIGV4YW1wbGUsIGhyZWYpLgogICAqIGB0eXBlYCBpbmRpY2F0ZXMgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkOiBvbmUgb2YgcHJvcGVydHksIGF0dHJpYnV0ZSwgb3IgdGV4dC4KICAgKiBgbm9kZWAgaXMgdGhlIG5vZGUgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkLgogICAqCiAgICogQHR5cGUgeyhmdW5jdGlvbigqLHN0cmluZyxzdHJpbmcsTm9kZSk6Kil8dW5kZWZpbmVkfQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlIHx8IG51bGw7CgogIC8qKgogICAqIFNldHMgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGF2YWlsYWJsZSB2aWEgYFBvbHltZXIuc2FuaXRpemVET01WYWx1ZWAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KGZ1bmN0aW9uKCosc3RyaW5nLHN0cmluZyxOb2RlKToqKXx1bmRlZmluZWR9IG5ld1Nhbml0aXplRE9NVmFsdWUgdGhlIGdsb2JhbCBzYW5pdGl6ZURPTVZhbHVlIGNhbGxiYWNrCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFNhbml0aXplRE9NVmFsdWUgPSBmdW5jdGlvbihuZXdTYW5pdGl6ZURPTVZhbHVlKSB7CiAgICBQb2x5bWVyLnNhbml0aXplRE9NVmFsdWUgPSBuZXdTYW5pdGl6ZURPTVZhbHVlOwogIH07CgogIC8qKgogICAqIEdsb2JhbGx5IHNldHRhYmxlIHByb3BlcnR5IHRvIG1ha2UgUG9seW1lciBHZXN0dXJlcyB1c2UgcGFzc2l2ZSBUb3VjaEV2ZW50IGxpc3RlbmVycyB3aGVuIHJlY29nbml6aW5nIGdlc3R1cmVzLgogICAqIFdoZW4gc2V0IHRvIGB0cnVlYCwgZ2VzdHVyZXMgbWFkZSBmcm9tIHRvdWNoIHdpbGwgbm90IGJlIGFibGUgdG8gcHJldmVudCBzY3JvbGxpbmcsIGFsbG93aW5nIGZvciBzbW9vdGhlcgogICAqIHNjcm9sbGluZyBwZXJmb3JtYW5jZS4KICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IFBvbHltZXIucGFzc2l2ZVRvdWNoR2VzdHVyZXMgfHwgZmFsc2U7CgogIC8qKgogICAqIFNldHMgYHBhc3NpdmVUb3VjaEdlc3R1cmVzYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzIHVzaW5nIFBvbHltZXIgR2VzdHVyZXMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7Ym9vbGVhbn0gdXNlUGFzc2l2ZSBlbmFibGUgb3IgZGlzYWJsZSBwYXNzaXZlIHRvdWNoIGdlc3R1cmVzIGdsb2JhbGx5CiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnNldFBhc3NpdmVUb3VjaEdlc3R1cmVzID0gZnVuY3Rpb24odXNlUGFzc2l2ZSkgewogICAgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcyA9IHVzZVBhc3NpdmU7CiAgfTsKCiAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zIHx8CiAgICAgIHdpbmRvdy5Qb2x5bWVyU2V0dGluZ3MgJiYgd2luZG93LlBvbHltZXJTZXR0aW5ncy5sZWdhY3lPcHRpbWl6YXRpb25zIHx8IGZhbHNlOwoKICAvKioKICAgKiBTZXRzIGBsZWdhY3lPcHRpbWl6YXRpb25zYCBnbG9iYWxseSBmb3IgYWxsIGVsZW1lbnRzLiBFbmFibGVzCiAgICogb3B0aW1pemF0aW9ucyB3aGVuIG9ubHkgbGVnYWN5IFBvbHltZXIoKSBzdHlsZSBlbGVtZW50cyBhcmUgdXNlZC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHBhcmFtIHtib29sZWFufSB1c2VMZWdhY3lPcHRpbWl6YXRpb25zIGVuYWJsZSBvciBkaXNhYmxlIGxlZ2FjeSBvcHRpbWl6YXRpb25zIGdsb2JhbGx5LgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgUG9seW1lci5zZXRMZWdhY3lPcHRpbWl6YXRpb25zID0gZnVuY3Rpb24odXNlTGVnYWN5T3B0aW1pemF0aW9ucykgewogICAgUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zID0gdXNlTGVnYWN5T3B0aW1pemF0aW9uczsKICB9Owp9KSgpOwoKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gdW5pcXVlIGdsb2JhbCBpZCBmb3IgZGVkdXBpbmcgbWl4aW5zLgogIGxldCBkZWR1cGVJZCA9IDA7CgogIC8qKgogICAqIEBjb25zdHJ1Y3RvcgogICAqIEBleHRlbmRzIHtGdW5jdGlvbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIE1peGluRnVuY3Rpb24oKXt9CiAgLyoqIEB0eXBlIHsoV2Vha01hcCB8IHVuZGVmaW5lZCl9ICovCiAgTWl4aW5GdW5jdGlvbi5wcm90b3R5cGUuX19taXhpbkFwcGxpY2F0aW9uczsKICAvKiogQHR5cGUgeyhPYmplY3QgfCB1bmRlZmluZWQpfSAqLwogIE1peGluRnVuY3Rpb24ucHJvdG90eXBlLl9fbWl4aW5TZXQ7CgogIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgLyoqCiAgICogV3JhcHMgYW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gc3VjaCB0aGF0IHRoZSBtaXhpbiBpcyBvbmx5IGFwcGxpZWQKICAgKiBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhcHBsaWVkIGl0cyBiYXNlIGFyZ3VtZW50LiBBbHNvIG1lbW9pemVzIG1peGluCiAgICogYXBwbGljYXRpb25zLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAdGVtcGxhdGUgVAogICAqIEBwYXJhbSB7VH0gbWl4aW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gdG8gd3JhcAogICAqIEByZXR1cm4ge1R9CiAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICovCiAgUG9seW1lci5kZWR1cGluZ01peGluID0gZnVuY3Rpb24obWl4aW4pIHsKICAgIGxldCBtaXhpbkFwcGxpY2F0aW9ucyA9IC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKG1peGluKS5fX21peGluQXBwbGljYXRpb25zOwogICAgaWYgKCFtaXhpbkFwcGxpY2F0aW9ucykgewogICAgICBtaXhpbkFwcGxpY2F0aW9ucyA9IG5ldyBXZWFrTWFwKCk7CiAgICAgIC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKG1peGluKS5fX21peGluQXBwbGljYXRpb25zID0gbWl4aW5BcHBsaWNhdGlvbnM7CiAgICB9CiAgICAvLyBtYWludGFpbiBhIHVuaXF1ZSBpZCBmb3IgZWFjaCBtaXhpbgogICAgbGV0IG1peGluRGVkdXBlSWQgPSBkZWR1cGVJZCsrOwogICAgZnVuY3Rpb24gZGVkdXBpbmdNaXhpbihiYXNlKSB7CiAgICAgIGxldCBiYXNlU2V0ID0gLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oYmFzZSkuX19taXhpblNldDsKICAgICAgaWYgKGJhc2VTZXQgJiYgYmFzZVNldFttaXhpbkRlZHVwZUlkXSkgewogICAgICAgIHJldHVybiBiYXNlOwogICAgICB9CiAgICAgIGxldCBtYXAgPSBtaXhpbkFwcGxpY2F0aW9uczsKICAgICAgbGV0IGV4dGVuZGVkID0gbWFwLmdldChiYXNlKTsKICAgICAgaWYgKCFleHRlbmRlZCkgewogICAgICAgIGV4dGVuZGVkID0gLyoqIEB0eXBlIHshRnVuY3Rpb259ICovKG1peGluKShiYXNlKTsKICAgICAgICBtYXAuc2V0KGJhc2UsIGV4dGVuZGVkKTsKICAgICAgfQogICAgICAvLyBjb3B5IGluaGVyaXRlZCBtaXhpbiBzZXQgZnJvbSB0aGUgZXh0ZW5kZWQgY2xhc3MsIG9yIHRoZSBiYXNlIGNsYXNzCiAgICAgIC8vIE5PVEU6IHdlIGF2b2lkIHVzZSBvZiBTZXQgaGVyZSBiZWNhdXNlIHNvbWUgYnJvd3NlciAoSUUxMSkKICAgICAgLy8gY2Fubm90IGV4dGVuZCBhIGJhc2UgU2V0IHZpYSB0aGUgY29uc3RydWN0b3IuCiAgICAgIGxldCBtaXhpblNldCA9IE9iamVjdC5jcmVhdGUoLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oZXh0ZW5kZWQpLl9fbWl4aW5TZXQgfHwgYmFzZVNldCB8fCBudWxsKTsKICAgICAgbWl4aW5TZXRbbWl4aW5EZWR1cGVJZF0gPSB0cnVlOwogICAgICAvKiogQHR5cGUgeyFNaXhpbkZ1bmN0aW9ufSAqLyhleHRlbmRlZCkuX19taXhpblNldCA9IG1peGluU2V0OwogICAgICByZXR1cm4gZXh0ZW5kZWQ7CiAgICB9CgogICAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKGRlZHVwaW5nTWl4aW4pOwogIH07CiAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgTU9EVUxFX1NUWUxFX0xJTktfU0VMRUNUT1IgPSAnbGlua1tyZWw9aW1wb3J0XVt0eXBlfj1jc3NdJzsKICBjb25zdCBJTkNMVURFX0FUVFIgPSAnaW5jbHVkZSc7CiAgY29uc3QgU0hBRFlfVU5TQ09QRURfQVRUUiA9ICdzaGFkeS11bnNjb3BlZCc7CgogIGZ1bmN0aW9uIGltcG9ydE1vZHVsZShtb2R1bGVJZCkgewogICAgY29uc3QgLyoqIFBvbHltZXIuRG9tTW9kdWxlICovIFBvbHltZXJEb21Nb2R1bGUgPSBjdXN0b21FbGVtZW50cy5nZXQoJ2RvbS1tb2R1bGUnKTsKICAgIGlmICghUG9seW1lckRvbU1vZHVsZSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBQb2x5bWVyRG9tTW9kdWxlLmltcG9ydChtb2R1bGVJZCk7CiAgfQoKICBmdW5jdGlvbiBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpIHsKICAgIC8vIE5PVEU6IHBvbHlmaWxsIGFmZm9yZGFuY2UuCiAgICAvLyB1bmRlciB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwsIHRoZXJlIHdpbGwgYmUgbm8gJ2JvZHknLAogICAgLy8gYnV0IHRoZSBpbXBvcnQgcHNldWRvLWRvYyBjYW4gYmUgdXNlZCBkaXJlY3RseS4KICAgIGxldCBjb250YWluZXIgPSBpbXBvcnREb2MuYm9keSA/IGltcG9ydERvYy5ib2R5IDogaW1wb3J0RG9jOwogICAgY29uc3QgaW1wb3J0Q3NzID0gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoY29udGFpbmVyLnRleHRDb250ZW50LAogICAgICBpbXBvcnREb2MuYmFzZVVSSSk7CiAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICBzdHlsZS50ZXh0Q29udGVudCA9IGltcG9ydENzczsKICAgIHJldHVybiBzdHlsZTsKICB9CgogIC8qKiBAdHlwZWRlZiB7e2Fzc2V0cGF0aDogc3RyaW5nfX0gKi8KICBsZXQgdGVtcGxhdGVXaXRoQXNzZXRQYXRoOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29sbGVjdGlvbiBDU1MgdGV4dCBmcm9tIGA8dGVtcGxhdGVzPmAsIGV4dGVybmFsCiAgICogc3R5bGVzaGVldHMsIGFuZCBgZG9tLW1vZHVsZWBzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHdpdGggdXRpbGl0aWVzIGZvciBjb2xsZWN0aW9uIENTUyB0ZXh0IGZyb20gdmFyaW91cyBzb3VyY2VzLgogICAqLwogIGNvbnN0IFN0eWxlR2F0aGVyID0gewoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZHMgTGlzdCBvZiBkb20tbW9kdWxlIGlkJ3Mgd2l0aGluIHdoaWNoIHRvCiAgICAgKiBzZWFyY2ggZm9yIGNzcy4KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCA8c3R5bGU+IGVsZW1lbnRzCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBzdHlsZXNGcm9tTW9kdWxlcyhtb2R1bGVJZHMpIHsKICAgICAgY29uc3QgbW9kdWxlcyA9IG1vZHVsZUlkcy50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgICBjb25zdCBzdHlsZXMgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbW9kdWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuc3R5bGVzRnJvbU1vZHVsZShtb2R1bGVzW2ldKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlczsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiA8c3R5bGU+IGVsZW1lbnRzIGluIGEgZ2l2ZW4gYGRvbS1tb2R1bGVgLgogICAgICogU3R5bGVzIGluIGEgYGRvbS1tb2R1bGVgIGNhbiBjb21lIGVpdGhlciBmcm9tIGA8c3R5bGU+YHMgd2l0aGluIHRoZQogICAgICogZmlyc3QgYDx0ZW1wbGF0ZT5gLCBvciBlbHNlIGZyb20gb25lIG9yIG1vcmUKICAgICAqIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIG91dHNpZGUgdGhlIHRlbXBsYXRlLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgZG9tLW1vZHVsZSBpZCB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIHN0eWxlc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgY29uc3QgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CgogICAgICBpZiAoIW0pIHsKICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBmaW5kIHN0eWxlIGRhdGEgaW4gbW9kdWxlIG5hbWVkJywgbW9kdWxlSWQpOwogICAgICAgIHJldHVybiBbXTsKICAgICAgfQoKICAgICAgaWYgKG0uX3N0eWxlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29uc3Qgc3R5bGVzID0gW107CiAgICAgICAgLy8gbW9kdWxlIGltcG9ydHM6IDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPgogICAgICAgIHN0eWxlcy5wdXNoKC4uLnRoaXMuX3N0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzKG0pKTsKICAgICAgICAvLyBpbmNsdWRlIGNzcyBmcm9tIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbW9kdWxlCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBtLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgICAgICBzdHlsZXMucHVzaCguLi50aGlzLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCkpOwogICAgICAgIH0KCiAgICAgICAgbS5fc3R5bGVzID0gc3R5bGVzOwogICAgICB9CgogICAgICByZXR1cm4gbS5fc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGA8c3R5bGU+YCBlbGVtZW50cyB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gZ2F0aGVyIHN0eWxlcyBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBiYXNlVVJJIGZvciBzdHlsZSBjb250ZW50CiAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxTdHlsZUVsZW1lbnQ+fSBBcnJheSBvZiBzdHlsZXMKICAgICAqIEB0aGlzIHtTdHlsZUdhdGhlcn0KICAgICAqLwogICAgc3R5bGVzRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBiYXNlVVJJKSB7CiAgICAgIGlmICghdGVtcGxhdGUuX3N0eWxlcykgewogICAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgICBjb25zdCBlJCA9IHRlbXBsYXRlLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc3R5bGUnKTsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBlJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGUgPSBlJFtpXTsKICAgICAgICAgIC8vIHN1cHBvcnQgc3R5bGUgc2hhcmluZyBieSBhbGxvd2luZyBzdHlsZXMgdG8gImluY2x1ZGUiCiAgICAgICAgICAvLyBvdGhlciBkb20tbW9kdWxlcyB0aGF0IGNvbnRhaW4gc3R5bGluZwogICAgICAgICAgbGV0IGluY2x1ZGUgPSBlLmdldEF0dHJpYnV0ZShJTkNMVURFX0FUVFIpOwogICAgICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICAgICAgc3R5bGVzLnB1c2goLi4udGhpcy5zdHlsZXNGcm9tTW9kdWxlcyhpbmNsdWRlKS5maWx0ZXIoZnVuY3Rpb24oaXRlbSwgaW5kZXgsIHNlbGYpIHsKICAgICAgICAgICAgICByZXR1cm4gc2VsZi5pbmRleE9mKGl0ZW0pID09PSBpbmRleDsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGJhc2VVUkkpIHsKICAgICAgICAgICAgZS50ZXh0Q29udGVudCA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlQ3NzKGUudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgICAgfQogICAgICAgICAgc3R5bGVzLnB1c2goZSk7CiAgICAgICAgfQogICAgICAgIHRlbXBsYXRlLl9zdHlsZXMgPSBzdHlsZXM7CiAgICAgIH0KICAgICAgcmV0dXJuIHRlbXBsYXRlLl9zdHlsZXM7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyAgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIElkIG9mIGBkb20tbW9kdWxlYCB0byBnYXRoZXIgQ1NTIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgICBzdHlsZXNGcm9tTW9kdWxlSW1wb3J0cyhtb2R1bGVJZCkgewogICAgICBsZXQgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CiAgICAgIHJldHVybiBtID8gdGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobSkgOiBbXTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU3R5bGVFbGVtZW50Pn0gQXJyYXkgb2YgY29udGFpbmVkIHN0eWxlcwogICAgICovCiAgICBfc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKSB7CiAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICBjb25zdCBwJCA9IG1vZHVsZS5xdWVyeVNlbGVjdG9yQWxsKE1PRFVMRV9TVFlMRV9MSU5LX1NFTEVDVE9SKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgcCQubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgcCA9IHAkW2ldOwogICAgICAgIGlmIChwLmltcG9ydCkgewogICAgICAgICAgY29uc3QgaW1wb3J0RG9jID0gcC5pbXBvcnQ7CiAgICAgICAgICBjb25zdCB1bnNjb3BlZCA9IHAuaGFzQXR0cmlidXRlKFNIQURZX1VOU0NPUEVEX0FUVFIpOwogICAgICAgICAgaWYgKHVuc2NvcGVkICYmICFpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUpIHsKICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpOwogICAgICAgICAgICBzdHlsZS5zZXRBdHRyaWJ1dGUoU0hBRFlfVU5TQ09QRURfQVRUUiwgJycpOwogICAgICAgICAgICBpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUgPSBzdHlsZTsKICAgICAgICAgIH0gZWxzZSBpZiAoIWltcG9ydERvYy5fc3R5bGUpIHsKICAgICAgICAgICAgaW1wb3J0RG9jLl9zdHlsZSA9IHN0eWxlRm9ySW1wb3J0KGltcG9ydERvYyk7CiAgICAgICAgICB9CiAgICAgICAgICBzdHlsZXMucHVzaCh1bnNjb3BlZCA/IGltcG9ydERvYy5fdW5zY29wZWRTdHlsZSA6IGltcG9ydERvYy5fc3R5bGUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gc3R5bGVzOwogICAgfSwKCiAgICAvKioKICAgICAqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlc0Zyb21Nb2R1bGVzYCBpbnN0ZWFkLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkcyBMaXN0IG9mIGRvbS1tb2R1bGUgaWQncyB3aXRoaW4gd2hpY2ggdG8KICAgICAqIHNlYXJjaCBmb3IgY3NzLgogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgcwogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICAgY3NzRnJvbU1vZHVsZXMobW9kdWxlSWRzKSB7CiAgICAgIGxldCBtb2R1bGVzID0gbW9kdWxlSWRzLnRyaW0oKS5zcGxpdCgvXHMrLyk7CiAgICAgIGxldCBjc3NUZXh0ID0gJyc7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBjc3NUZXh0ICs9IHRoaXMuY3NzRnJvbU1vZHVsZShtb2R1bGVzW2ldKTsKICAgICAgfQogICAgICByZXR1cm4gY3NzVGV4dDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIGdpdmVuIGBkb20tbW9kdWxlYC4gIENTUyBpbiBhIGBkb20tbW9kdWxlYAogICAgICogY2FuIGNvbWUgZWl0aGVyIGZyb20gYDxzdHlsZT5gcyB3aXRoaW4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCwgb3IgZWxzZQogICAgICogZnJvbSBvbmUgb3IgbW9yZSBgPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+YCBsaW5rcyBvdXRzaWRlIHRoZQogICAgICogdGVtcGxhdGUuCiAgICAgKgogICAgICogQW55IGA8c3R5bGVzPmAgcHJvY2Vzc2VkIGFyZSByZW1vdmVkIGZyb20gdGhlaXIgb3JpZ2luYWwgbG9jYXRpb24uCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlRnJvbU1vZHVsZWAgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICogQG1lbWJlcm9mIFBvbHltZXIuU3R5bGVHYXRoZXIKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZCBkb20tbW9kdWxlIGlkIHRvIGdhdGhlciBzdHlsZXMgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgbGV0IG0gPSBpbXBvcnRNb2R1bGUobW9kdWxlSWQpOwogICAgICBpZiAobSAmJiBtLl9jc3NUZXh0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBtb2R1bGUgaW1wb3J0czogPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+CiAgICAgICAgbGV0IGNzc1RleHQgPSB0aGlzLl9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtKTsKICAgICAgICAvLyBpbmNsdWRlIGNzcyBmcm9tIHRoZSBmaXJzdCB0ZW1wbGF0ZSBpbiB0aGUgbW9kdWxlCiAgICAgICAgbGV0IHQgPSBtLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJyk7CiAgICAgICAgaWYgKHQpIHsKICAgICAgICAgIGNzc1RleHQgKz0gdGhpcy5jc3NGcm9tVGVtcGxhdGUodCwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCk7CiAgICAgICAgfQogICAgICAgIG0uX2Nzc1RleHQgPSBjc3NUZXh0IHx8IG51bGw7CiAgICAgIH0KICAgICAgaWYgKCFtKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmluZCBzdHlsZSBkYXRhIGluIG1vZHVsZSBuYW1lZCcsIG1vZHVsZUlkKTsKICAgICAgfQogICAgICByZXR1cm4gbSAmJiBtLl9jc3NUZXh0IHx8ICcnOwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgb2YgYDxzdHlsZXM+YCB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBBbnkgYDxzdHlsZXM+YCBwcm9jZXNzZWQgYXJlIHJlbW92ZWQgZnJvbSB0aGVpciBvcmlnaW5hbCBsb2NhdGlvbi4KICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQsIHVzZSBgc3R5bGVGcm9tVGVtcGxhdGVgIGluc3RlYWQuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlc29sdmUgdGhlIFVSTCBhZ2FpbnN0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbmNhdGVuYXRlZCBDU1MgY29udGVudCBmcm9tIHNwZWNpZmllZCB0ZW1wbGF0ZQogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICovCiAgICBjc3NGcm9tVGVtcGxhdGUodGVtcGxhdGUsIGJhc2VVUkkpIHsKICAgICAgbGV0IGNzc1RleHQgPSAnJzsKICAgICAgY29uc3QgZSQgPSB0aGlzLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSwgYmFzZVVSSSk7CiAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgZSQubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZSA9IGUkW2ldOwogICAgICAgIGlmIChlLnBhcmVudE5vZGUpIHsKICAgICAgICAgIGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKTsKICAgICAgICB9CiAgICAgICAgY3NzVGV4dCArPSBlLnRleHRDb250ZW50OwogICAgICB9CiAgICAgIHJldHVybiBjc3NUZXh0OwogICAgfSwKCiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIHRleHQgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gCiAgICAgKiBsaW5rcyB3aXRoaW4gdGhlIHNwZWNpZmllZCBgZG9tLW1vZHVsZWAuCiAgICAgKgogICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCwgdXNlIGBzdHlsZXNGcm9tTW9kdWxlSW1wb3J0c2AgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlN0eWxlR2F0aGVyCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgSWQgb2YgYGRvbS1tb2R1bGVgIHRvIGdhdGhlciBDU1MgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKiBAdGhpcyB7U3R5bGVHYXRoZXJ9CiAgICAgKi8KICAgIGNzc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZUlkKSB7CiAgICAgIGxldCBtID0gaW1wb3J0TW9kdWxlKG1vZHVsZUlkKTsKICAgICAgcmV0dXJuIG0gPyB0aGlzLl9jc3NGcm9tTW9kdWxlSW1wb3J0cyhtKSA6ICcnOwogICAgfSwKCiAgICAvKioKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5TdHlsZUdhdGhlcgogICAgICogQHRoaXMge1N0eWxlR2F0aGVyfQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiB0aGUgZG9tLW1vZHVsZQogICAgICovCiAgICAgX2Nzc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZSkgewogICAgICBsZXQgY3NzVGV4dCA9ICcnOwogICAgICBsZXQgc3R5bGVzID0gdGhpcy5fc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY3NzVGV4dCArPSBzdHlsZXNbaV0udGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGNzc1RleHQ7CiAgICB9CiAgfTsKCiAgUG9seW1lci5TdHlsZUdhdGhlciA9IFN0eWxlR2F0aGVyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBtb2R1bGVzID0ge307CiAgbGV0IGxjTW9kdWxlcyA9IHt9OwogIGZ1bmN0aW9uIHNldE1vZHVsZShpZCwgbW9kdWxlKSB7CiAgICAvLyBzdG9yZSBpZCBzZXBhcmF0ZSBmcm9tIGxvd2VyY2FzZWQgaWQgc28gdGhhdAogICAgLy8gaW4gYWxsIGNhc2VzIG1peGVkQ2FzZSBpZCB3aWxsIHN0b3JlZCBkaXN0aW5jdGx5CiAgICAvLyBhbmQgbG93ZXJjYXNlIHZlcnNpb24gaXMgYSBmYWxsYmFjawogICAgbW9kdWxlc1tpZF0gPSBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV0gPSBtb2R1bGU7CiAgfQogIGZ1bmN0aW9uIGZpbmRNb2R1bGUoaWQpIHsKICAgIHJldHVybiBtb2R1bGVzW2lkXSB8fCBsY01vZHVsZXNbaWQudG9Mb3dlckNhc2UoKV07CiAgfQoKICBmdW5jdGlvbiBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKGluc3QpIHsKICAgIGlmIChpbnN0LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpIHsKICAgICAgY29uc29sZS53YXJuKCdkb20tbW9kdWxlICVzIGhhcyBzdHlsZSBvdXRzaWRlIHRlbXBsYXRlJywgaW5zdC5pZCk7CiAgICB9CiAgfQoKICAvKioKICAgKiBUaGUgYGRvbS1tb2R1bGVgIGVsZW1lbnQgcmVnaXN0ZXJzIHRoZSBkb20gaXQgY29udGFpbnMgdG8gdGhlIG5hbWUgZ2l2ZW4KICAgKiBieSB0aGUgbW9kdWxlJ3MgaWQgYXR0cmlidXRlLiBJdCBwcm92aWRlcyBhIHVuaWZpZWQgZGF0YWJhc2Ugb2YgZG9tCiAgICogYWNjZXNzaWJsZSB2aWEgaXRzIHN0YXRpYyBgaW1wb3J0YCBBUEkuCiAgICoKICAgKiBBIGtleSB1c2UgY2FzZSBvZiBgZG9tLW1vZHVsZWAgaXMgZm9yIHByb3ZpZGluZyBjdXN0b20gZWxlbWVudCBgPHRlbXBsYXRlPmBzCiAgICogdmlhIEhUTUwgaW1wb3J0cyB0aGF0IGFyZSBwYXJzZWQgYnkgdGhlIG5hdGl2ZSBIVE1MIHBhcnNlciwgdGhhdCBjYW4gYmUKICAgKiByZWxvY2F0ZWQgZHVyaW5nIGEgYnVuZGxpbmcgcGFzcyBhbmQgc3RpbGwgbG9va2VkIHVwIGJ5IGBpZGAuCiAgICoKICAgKiBFeGFtcGxlOgogICAqCiAgICogICAgIDxkb20tbW9kdWxlIGlkPSJmb28iPgogICAqICAgICAgIDxpbWcgc3JjPSJzdHVmZi5wbmciPgogICAqICAgICA8L2RvbS1tb2R1bGU+CiAgICoKICAgKiBUaGVuIGluIGNvZGUgaW4gc29tZSBvdGhlciBsb2NhdGlvbiB0aGF0IGNhbm5vdCBhY2Nlc3MgdGhlIGRvbS1tb2R1bGUgYWJvdmUKICAgKgogICAqICAgICBsZXQgaW1nID0gY3VzdG9tRWxlbWVudHMuZ2V0KCdkb20tbW9kdWxlJykuaW1wb3J0KCdmb28nLCAnaW1nJyk7CiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IHByb3ZpZGVzIGEgcmVnaXN0cnkgb2YgcmVsb2NhdGFibGUgRE9NIGNvbnRlbnQKICAgKiAgIGJ5IGBpZGAgdGhhdCBpcyBhZ25vc3RpYyB0byBidW5kbGluZy4KICAgKiBAdW5yZXN0cmljdGVkCiAgICovCiAgY2xhc3MgRG9tTW9kdWxlIGV4dGVuZHMgSFRNTEVsZW1lbnQgewoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydpZCddOyB9CgogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGVsZW1lbnQgc3BlY2lmaWVkIGJ5IHRoZSBjc3MgYHNlbGVjdG9yYCBpbiB0aGUgbW9kdWxlCiAgICAgKiByZWdpc3RlcmVkIGJ5IGBpZGAuIEZvciBleGFtcGxlLCB0aGlzLmltcG9ydCgnZm9vJywgJ2ltZycpOwogICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBvZiB0aGUgZG9tLW1vZHVsZSBpbiB3aGljaCB0byBzZWFyY2guCiAgICAgKiBAcGFyYW0ge3N0cmluZz19IHNlbGVjdG9yIFRoZSBjc3Mgc2VsZWN0b3IgYnkgd2hpY2ggdG8gZmluZCB0aGUgZWxlbWVudC4KICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IFJldHVybnMgdGhlIGVsZW1lbnQgd2hpY2ggbWF0Y2hlcyBgc2VsZWN0b3JgIGluIHRoZQogICAgICogbW9kdWxlIHJlZ2lzdGVyZWQgYXQgdGhlIHNwZWNpZmllZCBgaWRgLgogICAgICovCiAgICBzdGF0aWMgaW1wb3J0KGlkLCBzZWxlY3RvcikgewogICAgICBpZiAoaWQpIHsKICAgICAgICBsZXQgbSA9IGZpbmRNb2R1bGUoaWQpOwogICAgICAgIGlmIChtICYmIHNlbGVjdG9yKSB7CiAgICAgICAgICByZXR1cm4gbS5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG07CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBDdXJyZW50IHZhbHVlIG9mIGF0dHJpYnV0ZS4KICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSwgbmFtZXNwYWNlKSB7CiAgICAgIGlmIChvbGQgIT09IHZhbHVlKSB7CiAgICAgICAgdGhpcy5yZWdpc3RlcigpOwogICAgICB9CiAgICB9CiAgICAvKiBlc2xpbnQtZW5hYmxlIG5vLXVudXNlZC1hcmdzICovCgogICAgLyoqCiAgICAgKiBUaGUgYWJzb2x1dGUgVVJMIG9mIHRoZSBvcmlnaW5hbCBsb2NhdGlvbiBvZiB0aGlzIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBUaGlzIHZhbHVlIHdpbGwgZGlmZmVyIGZyb20gdGhpcyBlbGVtZW50J3MgYG93bmVyRG9jdW1lbnRgIGluIHRoZQogICAgICogZm9sbG93aW5nIHdheXM6CiAgICAgKiAtIFRha2VzIGludG8gYWNjb3VudCBhbnkgYGFzc2V0cGF0aGAgYXR0cmlidXRlIGFkZGVkIGR1cmluZyBidW5kbGluZwogICAgICogICB0byBpbmRpY2F0ZSB0aGUgb3JpZ2luYWwgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIGJ1bmRsZWQgbG9jYXRpb24KICAgICAqIC0gVXNlcyB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwncyBgaW1wb3J0Rm9yRWxlbWVudGAgQVBJIHRvIGVuc3VyZQogICAgICogICB0aGUgcGF0aCBpcyByZWxhdGl2ZSB0byB0aGUgaW1wb3J0IGRvY3VtZW50J3MgbG9jYXRpb24gc2luY2UKICAgICAqICAgYG93bmVyRG9jdW1lbnRgIGlzIG5vdCBjdXJyZW50bHkgcG9seWZpbGxlZAogICAgICovCiAgICBnZXQgYXNzZXRwYXRoKCkgewogICAgICAvLyBEb24ndCBvdmVycmlkZSBleGlzdGluZyBhc3NldHBhdGguCiAgICAgIGlmICghdGhpcy5fX2Fzc2V0cGF0aCkgewogICAgICAgIC8vIG5vdGU6IGFzc2V0cGF0aCBzZXQgdmlhIGFuIGF0dHJpYnV0ZSBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoaXMKICAgICAgICAvLyBlbGVtZW50J3MgbG9jYXRpb247IGFjY29tb2RhdGUgcG9seWZpbGxlZCBIVE1MSW1wb3J0cwogICAgICAgIGNvbnN0IG93bmVyID0gd2luZG93LkhUTUxJbXBvcnRzICYmIEhUTUxJbXBvcnRzLmltcG9ydEZvckVsZW1lbnQgPwogICAgICAgICAgSFRNTEltcG9ydHMuaW1wb3J0Rm9yRWxlbWVudCh0aGlzKSB8fCBkb2N1bWVudCA6IHRoaXMub3duZXJEb2N1bWVudDsKICAgICAgICBjb25zdCB1cmwgPSBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCgKICAgICAgICAgIHRoaXMuZ2V0QXR0cmlidXRlKCdhc3NldHBhdGgnKSB8fCAnJywgb3duZXIuYmFzZVVSSSk7CiAgICAgICAgdGhpcy5fX2Fzc2V0cGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybCh1cmwpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzLl9fYXNzZXRwYXRoOwogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIHRoZSBkb20tbW9kdWxlIGF0IGEgZ2l2ZW4gaWQuIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAogICAgICogd2hlbiBhIGRvbS1tb2R1bGUgaXMgaW1wZXJhdGl2ZWx5IGNyZWF0ZWQuIEZvcgogICAgICogZXhhbXBsZSwgYGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RvbS1tb2R1bGUnKS5yZWdpc3RlcignZm9vJylgLgogICAgICogQHBhcmFtIHtzdHJpbmc9fSBpZCBUaGUgaWQgYXQgd2hpY2ggdG8gcmVnaXN0ZXIgdGhlIGRvbS1tb2R1bGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZWdpc3RlcihpZCkgewogICAgICBpZCA9IGlkIHx8IHRoaXMuaWQ7CiAgICAgIGlmIChpZCkgewogICAgICAgIC8vIFVuZGVyIHN0cmljdFRlbXBsYXRlUG9saWN5LCByZWplY3QgYW5kIG51bGwgb3V0IGFueSByZS1yZWdpc3RlcmVkCiAgICAgICAgLy8gZG9tLW1vZHVsZSBzaW5jZSBpdCBpcyBhbWJpZ3VvdXMgd2hldGhlciBmaXJzdC1pbiBvciBsYXN0LWluIGlzIHRydXN0ZWQgCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgZmluZE1vZHVsZShpZCkgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgc2V0TW9kdWxlKGlkLCBudWxsKTsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc3RyaWN0VGVtcGxhdGVQb2xpY3k6IGRvbS1tb2R1bGUgJHtpZH0gcmUtcmVnaXN0ZXJlZGApOwogICAgICAgIH0KICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgc2V0TW9kdWxlKGlkLCB0aGlzKTsKICAgICAgICBzdHlsZU91dHNpZGVUZW1wbGF0ZUNoZWNrKHRoaXMpOwogICAgICB9CiAgICB9CiAgfQoKICBEb21Nb2R1bGUucHJvdG90eXBlWydtb2R1bGVzJ10gPSBtb2R1bGVzOwoKICBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ2RvbS1tb2R1bGUnLCBEb21Nb2R1bGUpOwoKICAvKiogQGNvbnN0ICovCiAgUG9seW1lci5Eb21Nb2R1bGUgPSBEb21Nb2R1bGU7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgbWFuaXB1bGF0aW5nIHN0cnVjdHVyZWQgZGF0YSBwYXRoIHN0cmluZ3MuCiAgICoKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCBzdHJpbmdzLgogICAqLwogIGNvbnN0IFBhdGggPSB7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHN0cnVjdHVyZWQgZGF0YSBwYXRoIChoYXMgZG90cykuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5pc1BhdGgoJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzUGF0aCgnZm9vJykgICAgICAgICAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBjb250YWluZWQgb25lIG9yIG1vcmUgZG90cwogICAgICovCiAgICBpc1BhdGg6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZignLicpID49IDA7CiAgICB9LAoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcm9vdCBwcm9wZXJ0eSBuYW1lIGZvciB0aGUgZ2l2ZW4gcGF0aC4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogUG9seW1lci5QYXRoLnJvb3QoJ2Zvby5iYXIuYmF6JykgLy8gJ2ZvbycKICAgICAqIFBvbHltZXIuUGF0aC5yb290KCdmb28nKSAgICAgICAgIC8vICdmb28nCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5QYXRoCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHN0cmluZwogICAgICogQHJldHVybiB7c3RyaW5nfSBSb290IHByb3BlcnR5IG5hbWUKICAgICAqLwogICAgcm9vdDogZnVuY3Rpb24ocGF0aCkgewogICAgICBsZXQgZG90SW5kZXggPSBwYXRoLmluZGV4T2YoJy4nKTsKICAgICAgaWYgKGRvdEluZGV4ID09PSAtMSkgewogICAgICAgIHJldHVybiBwYXRoOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoLnNsaWNlKDAsIGRvdEluZGV4KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBHaXZlbiBgYmFzZWAgaXMgYGZvby5iYXJgLCBgZm9vYCBpcyBhbiBhbmNlc3RvciwgYGZvby5iYXJgIGlzIG5vdAogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwYXRoIGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBiYXNlIHBhdGguCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5pc0FuY2VzdG9yKCdmb28uYmFyJywgJ2ZvbycpICAgICAgICAgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhcicpICAgICAvLyBmYWxzZQogICAgICogUG9seW1lci5QYXRoLmlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhci5iYXonKSAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgUGF0aCBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdC4KICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYHBhdGhgIGlzIGFuIGFuY2VzdG9yIG9mIGBiYXNlYC4KICAgICAqLwogICAgaXNBbmNlc3RvcjogZnVuY3Rpb24oYmFzZSwgcGF0aCkgewogICAgICAvLyAgICAgYmFzZS5zdGFydHNXaXRoKHBhdGggKyAnLicpOwogICAgICByZXR1cm4gYmFzZS5pbmRleE9mKHBhdGggKyAnLicpID09PSAwOwogICAgfSwKCiAgICAvKioKICAgICAqIEdpdmVuIGBiYXNlYCBpcyBgZm9vLmJhcmAsIGBmb28uYmFyLmJhemAgaXMgYW4gZGVzY2VuZGFudAogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogUG9seW1lci5QYXRoLmlzRGVzY2VuZGFudCgnZm9vLmJhcicsICdmb28uYmFyJykgICAgIC8vIGZhbHNlCiAgICAgKiBQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgICAqIGBgYAogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nIHRvIHRlc3QuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBwYXRoYCBpcyBhIGRlc2NlbmRhbnQgb2YgYGJhc2VgLgogICAgICovCiAgICBpc0Rlc2NlbmRhbnQ6IGZ1bmN0aW9uKGJhc2UsIHBhdGgpIHsKICAgICAgLy8gICAgIHBhdGguc3RhcnRzV2l0aChiYXNlICsgJy4nKTsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZihiYXNlICsgJy4nKSA9PT0gMDsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZXBsYWNlcyBhIHByZXZpb3VzIGJhc2UgcGF0aCB3aXRoIGEgbmV3IGJhc2UgcGF0aCwgcHJlc2VydmluZyB0aGUKICAgICAqIHJlbWFpbmRlciBvZiB0aGUgcGF0aC4KICAgICAqCiAgICAgKiBVc2VyIG11c3QgZW5zdXJlIGBwYXRoYCBoYXMgYSBwcmVmaXggb2YgYGJhc2VgLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGgudHJhbnNsYXRlKCdmb28uYmFyJywgJ3pvdCcsICdmb28uYmFyLmJheicpIC8vICd6b3QuYmF6JwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgQ3VycmVudCBiYXNlIHN0cmluZyB0byByZW1vdmUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdCYXNlIE5ldyBiYXNlIHN0cmluZyB0byByZXBsYWNlIHdpdGgKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdG8gdHJhbnNsYXRlCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRyYW5zbGF0ZWQgc3RyaW5nCiAgICAgKi8KICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24oYmFzZSwgbmV3QmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gbmV3QmFzZSArIHBhdGguc2xpY2UoYmFzZS5sZW5ndGgpOwogICAgfSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFBhdGggc3RyaW5nIHRvIHRlc3QgYWdhaW5zdAogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdAogICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgcGF0aGAgaXMgZXF1YWwgdG8gYGJhc2VgCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqLwogICAgbWF0Y2hlczogZnVuY3Rpb24oYmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gKGJhc2UgPT09IHBhdGgpIHx8CiAgICAgICAgICAgICB0aGlzLmlzQW5jZXN0b3IoYmFzZSwgcGF0aCkgfHwKICAgICAgICAgICAgIHRoaXMuaXNEZXNjZW5kYW50KGJhc2UsIHBhdGgpOwogICAgfSwKCiAgICAvKioKICAgICAqIENvbnZlcnRzIGFycmF5LWJhc2VkIHBhdGhzIHRvIGZsYXR0ZW5lZCBwYXRoLiAgU3RyaW5nLWJhc2VkIHBhdGhzCiAgICAgKiBhcmUgcmV0dXJuZWQgYXMtaXMuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIFBvbHltZXIuUGF0aC5ub3JtYWxpemUoWydmb28uYmFyJywgMCwgJ2JheiddKSAgLy8gJ2Zvby5iYXIuMC5iYXonCiAgICAgKiBQb2x5bWVyLlBhdGgubm9ybWFsaXplKCdmb28uYmFyLjAuYmF6JykgICAgICAgIC8vICdmb28uYmFyLjAuYmF6JwogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7c3RyaW5nfSBGbGF0dGVuZWQgcGF0aAogICAgICovCiAgICBub3JtYWxpemU6IGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpPTA7IGk8cGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGFyZ3MgPSBwYXRoW2ldLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgICAgICAgIGZvciAobGV0IGo9MDsgajxhcmdzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHBhcnRzLnB1c2goYXJnc1tqXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBTcGxpdHMgYSBwYXRoIGludG8gYW4gYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuIEFjY2VwdHMgZWl0aGVyIGFycmF5cwogICAgICogb2YgcGF0aCBwYXJ0cyBvciBzdHJpbmdzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBQb2x5bWVyLlBhdGguc3BsaXQoWydmb28uYmFyJywgMCwgJ2JheiddKSAgLy8gWydmb28nLCAnYmFyJywgJzAnLCAnYmF6J10KICAgICAqIFBvbHltZXIuUGF0aC5zcGxpdCgnZm9vLmJhci4wLmJheicpICAgICAgICAvLyBbJ2ZvbycsICdiYXInLCAnMCcsICdiYXonXQogICAgICogYGBgCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7IUFycmF5PHN0cmluZz59IEFycmF5IG9mIHBhdGggcGFydHMKICAgICAqIEB0aGlzIHtQYXRofQogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzfQogICAgICovCiAgICBzcGxpdDogZnVuY3Rpb24ocGF0aCkgewogICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZShwYXRoKS5zcGxpdCgnLicpOwogICAgICB9CiAgICAgIHJldHVybiBwYXRoLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBSZWFkcyBhIHZhbHVlIGZyb20gYSBwYXRoLiAgSWYgYW55IHN1Yi1wcm9wZXJ0eSBpbiB0aGUgcGF0aCBpcyBgdW5kZWZpbmVkYCwKICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAgKHdpbGwgbmV2ZXIgdGhyb3cuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAgICogQHBhcmFtIHtPYmplY3R9IHJvb3QgT2JqZWN0IGZyb20gd2hpY2ggdG8gZGVyZWZlcmVuY2UgcGF0aCBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIHJlYWQKICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaW5mbyBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgdG8gYGluZm9gLCB0aGUgbm9ybWFsaXplZAogICAgICogIChmbGF0dGVuZWQpIHBhdGggd2lsbCBiZSBzZXQgdG8gYGluZm8ucGF0aGAuCiAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSBhdCBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgcGF0aCBjb3VsZCBub3QgYmUKICAgICAqICBmdWxseSBkZXJlZmVyZW5jZWQuCiAgICAgKiBAdGhpcyB7UGF0aH0KICAgICAqLwogICAgZ2V0OiBmdW5jdGlvbihyb290LCBwYXRoLCBpbmZvKSB7CiAgICAgIGxldCBwcm9wID0gcm9vdDsKICAgICAgbGV0IHBhcnRzID0gdGhpcy5zcGxpdChwYXRoKTsKICAgICAgLy8gTG9vcCBvdmVyIHBhdGggcGFydHNbMC4ubi0xXSBhbmQgZGVyZWZlcmVuY2UKICAgICAgZm9yIChsZXQgaT0wOyBpPHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKCFwcm9wKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCBwYXJ0ID0gcGFydHNbaV07CiAgICAgICAgcHJvcCA9IHByb3BbcGFydF07CiAgICAgIH0KICAgICAgaWYgKGluZm8pIHsKICAgICAgICBpbmZvLnBhdGggPSBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHByb3A7CiAgICB9LAoKICAgIC8qKgogICAgICogU2V0cyBhIHZhbHVlIHRvIGEgcGF0aC4gIElmIGFueSBzdWItcHJvcGVydHkgaW4gdGhlIHBhdGggaXMgYHVuZGVmaW5lZGAsCiAgICAgKiB0aGlzIG1ldGhvZCB3aWxsIG5vLW9wLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlBhdGgKICAgICAqIEBwYXJhbSB7T2JqZWN0fSByb290IE9iamVjdCBmcm9tIHdoaWNoIHRvIGRlcmVmZXJlbmNlIHBhdGggZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBzZXQKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IHRvIHBhdGgKICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gVGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgaW5wdXQgcGF0aAogICAgICogQHRoaXMge1BhdGh9CiAgICAgKi8KICAgIHNldDogZnVuY3Rpb24ocm9vdCwgcGF0aCwgdmFsdWUpIHsKICAgICAgbGV0IHByb3AgPSByb290OwogICAgICBsZXQgcGFydHMgPSB0aGlzLnNwbGl0KHBhdGgpOwogICAgICBsZXQgbGFzdCA9IHBhcnRzW3BhcnRzLmxlbmd0aC0xXTsKICAgICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAvLyBMb29wIG92ZXIgcGF0aCBwYXJ0c1swLi5uLTJdIGFuZCBkZXJlZmVyZW5jZQogICAgICAgIGZvciAobGV0IGk9MDsgaTxwYXJ0cy5sZW5ndGgtMTsgaSsrKSB7CiAgICAgICAgICBsZXQgcGFydCA9IHBhcnRzW2ldOwogICAgICAgICAgcHJvcCA9IHByb3BbcGFydF07CiAgICAgICAgICBpZiAoIXByb3ApIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBTZXQgdmFsdWUgdG8gb2JqZWN0IGF0IGVuZCBvZiBwYXRoCiAgICAgICAgcHJvcFtsYXN0XSA9IHZhbHVlOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIFNpbXBsZSBwcm9wZXJ0eSBzZXQKICAgICAgICBwcm9wW3BhdGhdID0gdmFsdWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHBhcnRzLmpvaW4oJy4nKTsKICAgIH0KCiAgfTsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCAoaGFzIGRvdHMpLgogICAqCiAgICogVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkLiAgVXNlIGBQb2x5bWVyLlBhdGguaXNQYXRoYCBpbnN0ZWFkLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYAogICAqIFBvbHltZXIuUGF0aC5pc0RlZXAoJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAqIFBvbHltZXIuUGF0aC5pc0RlZXAoJ2ZvbycpICAgICAgICAgLy8gZmFsc2UKICAgKiBgYGAKICAgKgogICAqIEBkZXByZWNhdGVkCiAgICogQG1lbWJlcm9mIFBvbHltZXIuUGF0aAogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyaW5nIGNvbnRhaW5lZCBvbmUgb3IgbW9yZSBkb3RzCiAgICovCiAgUGF0aC5pc0RlZXAgPSBQYXRoLmlzUGF0aDsKCiAgUG9seW1lci5QYXRoID0gUGF0aDsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgY2FzZU1hcCA9IHt9OwogIGNvbnN0IERBU0hfVE9fQ0FNRUwgPSAvLVthLXpdL2c7CiAgY29uc3QgQ0FNRUxfVE9fREFTSCA9IC8oW0EtWl0pL2c7CgogIC8qKgogICAqIE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29udmVydGluZyBiZXR3ZWVuICJkYXNoLWNhc2UiIGFuZCAiY2FtZWxDYXNlIgogICAqIGlkZW50aWZpZXJzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIHRoYXQgcHJvdmlkZXMgdXRpbGl0aWVzIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gImRhc2gtY2FzZSIKICAgKiAgIGFuZCAiY2FtZWxDYXNlIi4KICAgKi8KICBjb25zdCBDYXNlTWFwID0gewoKICAgIC8qKgogICAgICogQ29udmVydHMgImRhc2gtY2FzZSIgaWRlbnRpZmllciAoZS5nLiBgZm9vLWJhci1iYXpgKSB0byAiY2FtZWxDYXNlIgogICAgICogKGUuZy4gYGZvb0JhckJhemApLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkNhc2VNYXAKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkYXNoIERhc2gtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENhbWVsLWNhc2UgcmVwcmVzZW50YXRpb24gb2YgdGhlIGlkZW50aWZpZXIKICAgICAqLwogICAgZGFzaFRvQ2FtZWxDYXNlKGRhc2gpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbZGFzaF0gfHwgKAogICAgICAgIGNhc2VNYXBbZGFzaF0gPSBkYXNoLmluZGV4T2YoJy0nKSA8IDAgPyBkYXNoIDogZGFzaC5yZXBsYWNlKERBU0hfVE9fQ0FNRUwsCiAgICAgICAgICAobSkgPT4gbVsxXS50b1VwcGVyQ2FzZSgpCiAgICAgICAgKQogICAgICApOwogICAgfSwKCiAgICAvKioKICAgICAqIENvbnZlcnRzICJjYW1lbENhc2UiIGlkZW50aWZpZXIgKGUuZy4gYGZvb0JhckJhemApIHRvICJkYXNoLWNhc2UiCiAgICAgKiAoZS5nLiBgZm9vLWJhci1iYXpgKS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5DYXNlTWFwCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2FtZWwgQ2FtZWwtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IERhc2gtY2FzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaWRlbnRpZmllcgogICAgICovCiAgICBjYW1lbFRvRGFzaENhc2UoY2FtZWwpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbY2FtZWxdIHx8ICgKICAgICAgICBjYXNlTWFwW2NhbWVsXSA9IGNhbWVsLnJlcGxhY2UoQ0FNRUxfVE9fREFTSCwgJy0kMScpLnRvTG93ZXJDYXNlKCkKICAgICAgKTsKICAgIH0KCiAgfTsKCiAgUG9seW1lci5DYXNlTWFwID0gQ2FzZU1hcDsKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgLy8gTWljcm90YXNrIGltcGxlbWVudGVkIHVzaW5nIE11dGF0aW9uIE9ic2VydmVyCiAgbGV0IG1pY3JvdGFza0N1cnJIYW5kbGUgPSAwOwogIGxldCBtaWNyb3Rhc2tMYXN0SGFuZGxlID0gMDsKICBsZXQgbWljcm90YXNrQ2FsbGJhY2tzID0gW107CiAgbGV0IG1pY3JvdGFza05vZGVDb250ZW50ID0gMDsKICBsZXQgbWljcm90YXNrTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTsKICBuZXcgd2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIobWljcm90YXNrRmx1c2gpLm9ic2VydmUobWljcm90YXNrTm9kZSwge2NoYXJhY3RlckRhdGE6IHRydWV9KTsKCiAgZnVuY3Rpb24gbWljcm90YXNrRmx1c2goKSB7CiAgICBjb25zdCBsZW4gPSBtaWNyb3Rhc2tDYWxsYmFja3MubGVuZ3RoOwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICBsZXQgY2IgPSBtaWNyb3Rhc2tDYWxsYmFja3NbaV07CiAgICAgIGlmIChjYikgewogICAgICAgIHRyeSB7CiAgICAgICAgICBjYigpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aHJvdyBlOyB9KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIG1pY3JvdGFza0NhbGxiYWNrcy5zcGxpY2UoMCwgbGVuKTsKICAgIG1pY3JvdGFza0xhc3RIYW5kbGUgKz0gbGVuOwogIH0KCiAgLyoqCiAgICogTW9kdWxlIHRoYXQgcHJvdmlkZXMgYSBudW1iZXIgb2Ygc3RyYXRlZ2llcyBmb3IgZW5xdWV1aW5nIGFzeW5jaHJvbm91cwogICAqIHRhc2tzLiAgRWFjaCBzdWItbW9kdWxlIHByb3ZpZGVzIGEgc3RhbmRhcmQgYHJ1bihmbilgIGludGVyZmFjZSB0aGF0IHJldHVybnMgYQogICAqIGhhbmRsZSwgYW5kIGEgYGNhbmNlbChoYW5kbGUpYCBpbnRlcmZhY2UgZm9yIGNhbmNlbGluZyBhc3luYyB0YXNrcyBiZWZvcmUKICAgKiB0aGV5IHJ1bi4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSB0aGF0IHByb3ZpZGVzIGEgbnVtYmVyIG9mIHN0cmF0ZWdpZXMgZm9yIGVucXVldWluZyBhc3luY2hyb25vdXMKICAgKiB0YXNrcy4KICAgKi8KICBQb2x5bWVyLkFzeW5jID0gewoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqLwogICAgdGltZU91dDogewogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIHN1Yi1tb2R1bGUgd2l0aCB0aGUgYXN5bmMgaW50ZXJmYWNlIHByb3ZpZGluZyB0aGUgcHJvdmlkZWQKICAgICAgICogZGVsYXkuCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jLnRpbWVPdXQKICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgY2FsbGJhY2tzIGluIG1zCiAgICAgICAqIEByZXR1cm4geyFBc3luY0ludGVyZmFjZX0gQW4gYXN5bmMgdGltZW91dCBpbnRlcmZhY2UKICAgICAgICovCiAgICAgIGFmdGVyKGRlbGF5KSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJ1bihmbikgeyByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsgfSwKICAgICAgICAgIGNhbmNlbChoYW5kbGUpIHsKICAgICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyBhIGZ1bmN0aW9uIGNhbGxlZCBpbiB0aGUgbmV4dCB0YXNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy50aW1lT3V0CiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9ufSBmbiBDYWxsYmFjayB0byBydW4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBEZWxheSBpbiBtaWxsaXNlY29uZHMKICAgICAgICogQHJldHVybiB7bnVtYmVyfSBIYW5kbGUgdXNlZCBmb3IgY2FuY2VsaW5nIHRhc2sKICAgICAgICovCiAgICAgIHJ1bihmbiwgZGVsYXkpIHsKICAgICAgICByZXR1cm4gd2luZG93LnNldFRpbWVvdXQoZm4sIGRlbGF5KTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYSBwcmV2aW91c2x5IGVucXVldWVkIGB0aW1lT3V0YCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMudGltZU91dAogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaGFuZGxlKTsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICovCiAgICBhbmltYXRpb25GcmFtZTogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAgdGltaW5nLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG51bWJlcik6dm9pZH0gZm4gQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oZm4pIHsKICAgICAgICByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmbik7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgYW5pbWF0aW9uRnJhbWVgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5hbmltYXRpb25GcmFtZQogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZShoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4gIEZhbGxzIGJhY2sgdG8KICAgICAqIGBzZXRUaW1lb3V0YCBvbiBicm93c2VycyB0aGF0IGRvIG5vdCBzdXBwb3J0IGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYwogICAgICogQHN1bW1hcnkgQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGByZXF1ZXN0SWRsZUNhbGxiYWNrYC4KICAgICAqLwogICAgaWRsZVBlcmlvZDogewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RJZGxlQ2FsbGJhY2tgIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMuaWRsZVBlcmlvZAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFJZGxlRGVhZGxpbmUpOnZvaWR9IGZuIENhbGxiYWNrIHRvIHJ1bgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB1c2VkIGZvciBjYW5jZWxpbmcgdGFzawogICAgICAgKi8KICAgICAgcnVuKGZuKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrID8KICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZuKSA6CiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmbiwgMTYpOwogICAgICB9LAogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhIHByZXZpb3VzbHkgZW5xdWV1ZWQgYGlkbGVQZXJpb2RgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5Bc3luYy5pZGxlUGVyaW9kCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgd2luZG93LmNhbmNlbElkbGVDYWxsYmFjayA/CiAgICAgICAgICB3aW5kb3cuY2FuY2VsSWRsZUNhbGxiYWNrKGhhbmRsZSkgOgogICAgICAgICAgd2luZG93LmNsZWFyVGltZW91dChoYW5kbGUpOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIGZvciBlbnF1ZXVpbmcgY2FsbGJhY2tzIHRoYXQgcnVuIGF0IG1pY3JvdGFzayB0aW1pbmcuCiAgICAgKgogICAgICogTm90ZSB0aGF0IG1pY3JvdGFzayB0aW1pbmcgaXMgYWNoaWV2ZWQgdmlhIGEgc2luZ2xlIGBNdXRhdGlvbk9ic2VydmVyYCwKICAgICAqIGFuZCB0aHVzIGNhbGxiYWNrcyBlbnF1ZXVlZCB3aXRoIHRoaXMgQVBJIHdpbGwgYWxsIHJ1biBpbiBhIHNpbmdsZQogICAgICogYmF0Y2gsIGFuZCBub3QgaW50ZXJsZWF2ZWQgd2l0aCBvdGhlciBtaWNyb3Rhc2tzIHN1Y2ggYXMgcHJvbWlzZXMuCiAgICAgKiBQcm9taXNlcyBhcmUgYXZvaWRlZCBhcyBhbiBpbXBsZW1lbnRhdGlvbiBjaG9pY2UgZm9yIHRoZSB0aW1lIGJlaW5nCiAgICAgKiBkdWUgdG8gU2FmYXJpIGJ1Z3MgdGhhdCBjYXVzZSBQcm9taXNlcyB0byBsYWNrIG1pY3JvdGFzayBndWFyYW50ZWVzLgogICAgICoKICAgICAqIEBuYW1lc3BhY2UKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkFzeW5jCiAgICAgKiBAc3VtbWFyeSBBc3luYyBpbnRlcmZhY2UgZm9yIGVucXVldWluZyBjYWxsYmFja3MgdGhhdCBydW4gYXQgbWljcm90YXNrCiAgICAgKiAgIHRpbWluZy4KICAgICAqLwogICAgbWljcm9UYXNrOiB7CgogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgbWljcm90YXNrIHRpbWluZy4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7IUZ1bmN0aW9uPX0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gcnVuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHVzZWQgZm9yIGNhbmNlbGluZyB0YXNrCiAgICAgICAqLwogICAgICBydW4oY2FsbGJhY2spIHsKICAgICAgICBtaWNyb3Rhc2tOb2RlLnRleHRDb250ZW50ID0gbWljcm90YXNrTm9kZUNvbnRlbnQrKzsKICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3MucHVzaChjYWxsYmFjayk7CiAgICAgICAgcmV0dXJuIG1pY3JvdGFza0N1cnJIYW5kbGUrKzsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGEgcHJldmlvdXNseSBlbnF1ZXVlZCBgbWljcm9UYXNrYCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgY29uc3QgaWR4ID0gaGFuZGxlIC0gbWljcm90YXNrTGFzdEhhbmRsZTsKICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgIGlmICghbWljcm90YXNrQ2FsbGJhY2tzW2lkeF0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFzeW5jIGhhbmRsZTogJyArIGhhbmRsZSk7CiAgICAgICAgICB9CiAgICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3NbaWR4XSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CgogICAgfQogIH07Cgp9KSgpOwoKCiAgKGZ1bmN0aW9uICgpIHsKCiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqIEBjb25zdCB7IUFzeW5jSW50ZXJmYWNlfSAqLwogICAgY29uc3QgbWljcm90YXNrID0gUG9seW1lci5Bc3luYy5taWNyb1Rhc2s7CgogICAgLyoqCiAgICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgbWV0YS1wcm9ncmFtbWluZyBmb3IgY3JlYXRpbmcgb25lCiAgICAgKiBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycyAoZ2V0dGVyL3NldHRlciBwYWlyKSB0aGF0IGVucXVldWUgYW4gYXN5bmMKICAgICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAqCiAgICAgKiBGb3IgYmFzaWMgdXNhZ2Ugb2YgdGhpcyBtaXhpbiwgY2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzKHByb3BzKWAKICAgICAqIG9uY2UgYXQgY2xhc3MgZGVmaW5pdGlvbiB0aW1lIHRvIGNyZWF0ZSBwcm9wZXJ0eSBhY2Nlc3NvcnMgZm9yIHByb3BlcnRpZXMKICAgICAqIG5hbWVkIGluIHByb3BzLCBpbXBsZW1lbnQgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgdG8gcmVhY3QgYXMgZGVzaXJlZCB0bwogICAgICogcHJvcGVydHkgY2hhbmdlcywgYW5kIGltcGxlbWVudCBgc3RhdGljIGdldCBvYnNlcnZlZEF0dHJpYnV0ZXMoKWAgYW5kCiAgICAgKiBpbmNsdWRlIGxvd2VyY2FzZSB2ZXJzaW9ucyBvZiBhbnkgcHJvcGVydHkgbmFtZXMgdGhhdCBzaG91bGQgYmUgc2V0IGZyb20KICAgICAqIGF0dHJpYnV0ZXMuIExhc3QsIGNhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncwogICAgICogYGNvbm5lY3RlZENhbGxiYWNrYCB0byBlbmFibGUgdGhlIGFjY2Vzc29ycy4KICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIGZvciByZWFjdGluZyB0byBwcm9wZXJ0eSBjaGFuZ2VzIGZyb20KICAgICAqICAgZ2VuZXJhdGVkIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAqLwogICAgUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAgIC8qKgogICAgICAgKiBAcG9seW1lcgogICAgICAgKiBAbWl4aW5DbGFzcwogICAgICAgKiBAZXh0ZW5kcyB7c3VwZXJDbGFzc30KICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAgICovCiAgICAgIGNsYXNzIFByb3BlcnRpZXNDaGFuZ2VkIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgcHJvcGVydHkgYWNjZXNzb3JzIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZXMuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBwcm9wcyBPYmplY3Qgd2hvc2Uga2V5cyBhcmUgbmFtZXMgb2YgYWNjZXNzb3JzLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBwcm9wcykgewogICAgICAgICAgICAvLyBkb24ndCBzdG9tcCBhbiBleGlzdGluZyBhY2Nlc3NvcgogICAgICAgICAgICBpZiAoIShwcm9wIGluIHByb3RvKSkgewogICAgICAgICAgICAgIHByb3RvLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIGF0dHJpYnV0ZSBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIFRoZSBhdHRyaWJ1dGUgbmFtZSBpcyB0aGUgbG93ZXJjYXNlZCBwcm9wZXJ0eSBuYW1lLiBPdmVycmlkZSB0bwogICAgICAgICAqIGN1c3RvbWl6ZSB0aGlzIG1hcHBpbmcuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRvIGNvbnZlcnQKICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEF0dHJpYnV0ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBhdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiBwcm9wZXJ0eS50b0xvd2VyQ2FzZSgpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGUgcG9pbnQgdG8gcHJvdmlkZSBhIHR5cGUgdG8gd2hpY2ggdG8gZGVzZXJpYWxpemUgYSB2YWx1ZSB0bwogICAgICAgICAqIGEgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgICAqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIHN0YXRpYyB0eXBlRm9yUHJvcGVydHkobmFtZSkgeyB9IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgc2V0dGVyL2dldHRlciBwYWlyIGZvciB0aGUgbmFtZWQgcHJvcGVydHkgd2l0aCBpdHMgb3duCiAgICAgICAgICogbG9jYWwgc3RvcmFnZS4gIFRoZSBnZXR0ZXIgcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlIGxvY2FsIHN0b3JhZ2UsCiAgICAgICAgICogYW5kIHRoZSBzZXR0ZXIgY2FsbHMgYF9zZXRQcm9wZXJ0eWAsIHdoaWNoIHVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UKICAgICAgICAgKiBmb3IgdGhlIHByb3BlcnR5IGFuZCBlbnF1ZXVlcyBhIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBvbiBhIHByb3RvdHlwZSBvciBhbiBpbnN0YW5jZS4gIENhbGxpbmcKICAgICAgICAgKiB0aGlzIG1ldGhvZCBtYXkgb3ZlcndyaXRlIGEgcHJvcGVydHkgdmFsdWUgdGhhdCBhbHJlYWR5IGV4aXN0cyBvbgogICAgICAgICAqIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgYnkgY3JlYXRpbmcgdGhlIGFjY2Vzc29yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcmVhZE9ubHkgV2hlbiB0cnVlLCBubyBzZXR0ZXIgaXMgY3JlYXRlZDsgdGhlCiAgICAgICAgICogICBwcm90ZWN0ZWQgYF9zZXRQcm9wZXJ0eWAgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIHNldCB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAocHJvcGVydHkpOwogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFIYXNBY2Nlc3NvcicpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0pIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0gPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIHRoZSBnaXZlbiBgcHJvcGVydHlgIHRvIGEgbWFwIG1hdGNoaW5nIGF0dHJpYnV0ZSBuYW1lcwogICAgICAgICAqIHRvIHByb3BlcnR5IG5hbWVzLCB1c2luZyBgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5YC4gVGhpcyBtYXAgaXMKICAgICAgICAgKiB1c2VkIHdoZW4gZGVzZXJpYWxpemluZyBhdHRyaWJ1dGUgdmFsdWVzIHRvIHByb3BlcnRpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKi8KICAgICAgICBfYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcChwcm9wZXJ0eSkgewogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KCdfX2RhdGFBdHRyaWJ1dGVzJykpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFBdHRyaWJ1dGVzW3Byb3BlcnR5XSkgewogICAgICAgICAgICBjb25zdCBhdHRyID0gdGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpOwogICAgICAgICAgICB0aGlzLl9fZGF0YUF0dHJpYnV0ZXNbYXR0cl0gPSBwcm9wZXJ0eTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmluZXMgYSBwcm9wZXJ0eSBhY2Nlc3NvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHJlYWRPbmx5IFdoZW4gdHJ1ZSwgbm8gc2V0dGVyIGlzIGNyZWF0ZWQKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgICBfZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCBwcm9wZXJ0eSwgewogICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICAgICAgICAvKiogQHRoaXMge1Byb3BlcnRpZXNDaGFuZ2VkfSAqLwogICAgICAgICAgICBnZXQoKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByb3BlcnR5KHByb3BlcnR5KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLyoqIEB0aGlzIHtQcm9wZXJ0aWVzQ2hhbmdlZH0gKi8KICAgICAgICAgICAgc2V0OiByZWFkT25seSA/IGZ1bmN0aW9uICgpIHt9IDogZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgIHRoaXMuX19kYXRhRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFJbnZhbGlkID0gZmFsc2U7CiAgICAgICAgICB0aGlzLl9fZGF0YSA9IHt9OwogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBMaWZlY3ljbGUgY2FsbGJhY2sgY2FsbGVkIHdoZW4gcHJvcGVydGllcyBhcmUgZW5hYmxlZCB2aWEKICAgICAgICAgKiBgX2VuYWJsZVByb3BlcnRpZXNgLgogICAgICAgICAqCiAgICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gaW1wbGVtZW50IGJlaGF2aW9yIHRoYXQgaXMKICAgICAgICAgKiBkZXBlbmRlbnQgb24gdGhlIGVsZW1lbnQgaGF2aW5nIGl0cyBwcm9wZXJ0eSBkYXRhIGluaXRpYWxpemVkLCBlLmcuCiAgICAgICAgICogZnJvbSBkZWZhdWx0cyAoaW5pdGlhbGl6ZWQgZnJvbSBgY29uc3RydWN0b3JgLCBgX2luaXRpYWxpemVQcm9wZXJ0aWVzYCksCiAgICAgICAgICogYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AsIG9yIHZhbHVlcyBwcm9wYWdhdGVkIGZyb20gaG9zdCBlLmcuIHZpYQogICAgICAgICAqIGJpbmRpbmdzLiAgYHN1cGVyLnJlYWR5KClgIG11c3QgYmUgY2FsbGVkIHRvIGVuc3VyZSB0aGUgZGF0YSBzeXN0ZW0KICAgICAgICAgKiBiZWNvbWVzIGVuYWJsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHRoaXMuX19kYXRhUmVhZHkgPSB0cnVlOwogICAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbml0aWFsaXplcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgcHJvcGVydHkgYWNjZXNzb3JzLgogICAgICAgICAqCiAgICAgICAgICogUHJvdmlkZWQgYXMgYW4gb3ZlcnJpZGUgcG9pbnQgZm9yIHBlcmZvcm1pbmcgYW55IHNldHVwIHdvcmsgcHJpb3IKICAgICAgICAgKiB0byBpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5IGFjY2Vzc29yIHN5c3RlbS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICAgIC8vIENhcHR1cmUgaW5zdGFuY2UgcHJvcGVydGllczsgdGhlc2Ugd2lsbCBiZSBzZXQgaW50byBhY2Nlc3NvcnMKICAgICAgICAgIC8vIGR1cmluZyBmaXJzdCBmbHVzaC4gRG9uJ3Qgc2V0IHRoZW0gaGVyZSwgc2luY2Ugd2Ugd2FudAogICAgICAgICAgLy8gdGhlc2UgdG8gb3ZlcndyaXRlIGRlZmF1bHRzL2NvbnN0cnVjdG9yIGFzc2lnbm1lbnRzCiAgICAgICAgICBmb3IgKGxldCBwIGluIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgPSB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgfHwge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzW3BdID0gdGhpc1twXTsKICAgICAgICAgICAgICBkZWxldGUgdGhpc1twXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGVkIGF0IHJlYWR5IHRpbWUgd2l0aCBiYWcgb2YgaW5zdGFuY2UgcHJvcGVydGllcyB0aGF0IG92ZXJ3cm90ZQogICAgICAgICAqIGFjY2Vzc29ycyB3aGVuIHRoZSBlbGVtZW50IHVwZ3JhZGVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICAgKiBzZXR0ZXIgYXQgcmVhZHkgdGltZS4gIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGFuIG92ZXJyaWRlCiAgICAgICAgICogcG9pbnQgZm9yIGN1c3RvbWl6aW5nIG9yIHByb3ZpZGluZyBtb3JlIGVmZmljaWVudCBpbml0aWFsaXphdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgcHJvcGVydHkgdmFsdWVzIHRoYXQgd2VyZSBvdmVyd3JpdHRlbgogICAgICAgICAqICAgd2hlbiBjcmVhdGluZyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgcHJvcHMpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgYSBwcm9wZXJ0eSAodmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YCkKICAgICAgICAgKiBhbmQgZW5xdWV1ZXMgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSkgewogICAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpKSB7CiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICAgICAgICogQHJldHVybiB7Kn0gVmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfZ2V0UHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgfQoKICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UgZm9yIGEgcHJvcGVydHksIHJlY29yZHMgdGhlIHByZXZpb3VzIHZhbHVlLAogICAgICAgICAqIGFuZCBhZGRzIGl0IHRvIHRoZSBzZXQgb2YgInBlbmRpbmcgY2hhbmdlcyIgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUKICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4gIFRoaXMgbWV0aG9kIGRvZXMgbm90IGVucXVldWUgdGhlCiAgICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGV4dCBOb3QgdXNlZCBoZXJlOyBhZmZvcmRhbmNlIGZvciBjbG9zdXJlCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlLCBleHQpIHsKICAgICAgICAgIGxldCBvbGQgPSB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgICBsZXQgY2hhbmdlZCA9IHRoaXMuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgb2xkKTsKICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFQZW5kaW5nKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0ge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFbnN1cmUgb2xkIGlzIGNhcHR1cmVkIGZyb20gdGhlIGxhc3QgdHVybgogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFPbGQgJiYgIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YU9sZFtwcm9wZXJ0eV0gPSBvbGQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjaGFuZ2VkOwogICAgICAgIH0KICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCgogICAgICAgIC8qKgogICAgICAgICAqIE1hcmtzIHRoZSBwcm9wZXJ0aWVzIGFzIGludmFsaWQsIGFuZCBlbnF1ZXVlcyBhbiBhc3luYwogICAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkgewogICAgICAgICAgaWYgKCF0aGlzLl9fZGF0YUludmFsaWQgJiYgdGhpcy5fX2RhdGFSZWFkeSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSB0cnVlOwogICAgICAgICAgICBtaWNyb3Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnZhbGlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9fZGF0YUludmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsIHRvIGVuYWJsZSBwcm9wZXJ0eSBhY2Nlc3NvciBwcm9jZXNzaW5nLiBCZWZvcmUgdGhpcyBtZXRob2QgaXMKICAgICAgICAgKiBjYWxsZWQgYWNjZXNzb3IgdmFsdWVzIHdpbGwgYmUgc2V0IGJ1dCBzaWRlIGVmZmVjdHMgYXJlCiAgICAgICAgICogcXVldWVkLiBXaGVuIGNhbGxlZCwgYW55IHBlbmRpbmcgc2lkZSBlZmZlY3RzIG9jY3VyIGltbWVkaWF0ZWx5LgogICAgICAgICAqIEZvciBlbGVtZW50cywgZ2VuZXJhbGx5IGBjb25uZWN0ZWRDYWxsYmFja2AgaXMgYSBub3JtYWwgc3BvdCB0byBkbyBzby4KICAgICAgICAgKiBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBtZXRob2QgbXVsdGlwbGUgdGltZXMgYXMgaXQgb25seSB0dXJucyBvbgogICAgICAgICAqIHByb3BlcnR5IGFjY2Vzc29ycyBvbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2VuYWJsZVByb3BlcnRpZXMoKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhRW5hYmxlZCkgewogICAgICAgICAgICB0aGlzLl9fZGF0YUVuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzKSB7CiAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZUluc3RhbmNlUHJvcGVydGllcyh0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMpOwogICAgICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZWFkeSgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbHMgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIHdpdGggdGhlIGN1cnJlbnQgc2V0IG9mCiAgICAgICAgICogcGVuZGluZyBjaGFuZ2VzIChhbmQgb2xkIHZhbHVlcyByZWNvcmRlZCB3aGVuIHBlbmRpbmcgY2hhbmdlcyB3ZXJlCiAgICAgICAgICogc2V0KSwgYW5kIHJlc2V0cyB0aGUgcGVuZGluZyBzZXQgb2YgY2hhbmdlcy4gR2VuZXJhbGx5LCB0aGlzIG1ldGhvZAogICAgICAgICAqIHNob3VsZCBub3QgYmUgY2FsbGVkIGluIHVzZXIgY29kZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7CiAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuX19kYXRhOwogICAgICAgICAgY29uc3QgY2hhbmdlZFByb3BzID0gdGhpcy5fX2RhdGFQZW5kaW5nOwogICAgICAgICAgY29uc3Qgb2xkID0gdGhpcy5fX2RhdGFPbGQ7CiAgICAgICAgICBpZiAodGhpcy5fc2hvdWxkUHJvcGVydGllc0NoYW5nZShwcm9wcywgY2hhbmdlZFByb3BzLCBvbGQpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc0NoYW5nZWQocHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBpbiBgX2ZsdXNoUHJvcGVydGllc2AgdG8gZGV0ZXJtaW5lIGlmIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogc2hvdWxkIGJlIGNhbGxlZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGlmCiAgICAgICAgICogcHJvcGVydGllcyBhcmUgcGVuZGluZy4gT3ZlcnJpZGUgdG8gY3VzdG9taXplIHdoZW4KICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBpcyBjYWxsZWQuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBjdXJyZW50UHJvcHMgQmFnIG9mIGFsbCBjdXJyZW50IGFjY2Vzc29yIHZhbHVlcwogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICAgKiAgIGNhbGwgdG8gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBjaGFuZ2VkUHJvcHMgaXMgdHJ1dGh5CiAgICAgICAgICovCiAgICAgICAgX3Nob3VsZFByb3BlcnRpZXNDaGFuZ2UoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICAgIHJldHVybiBCb29sZWFuKGNoYW5nZWRQcm9wcyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayBjYWxsZWQgd2hlbiBhbnkgcHJvcGVydGllcyB3aXRoIGFjY2Vzc29ycyBjcmVhdGVkIHZpYQogICAgICAgICAqIGBfY3JlYXRlUHJvcGVydHlBY2Nlc3NvcmAgaGF2ZSBiZWVuIHNldC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY3VycmVudFByb3BzIEJhZyBvZiBhbGwgY3VycmVudCBhY2Nlc3NvciB2YWx1ZXMKICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgcHJvcGVydGllcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0CiAgICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBlYWNoIHByb3BlcnR5CiAgICAgICAgICogICBpbiBgY2hhbmdlZFByb3BzYAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9wcm9wZXJ0aWVzQ2hhbmdlZChjdXJyZW50UHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogTWV0aG9kIGNhbGxlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHByb3BlcnR5IHZhbHVlIHNob3VsZCBiZQogICAgICAgICAqIGNvbnNpZGVyZWQgYXMgYSBjaGFuZ2UgYW5kIGNhdXNlIHRoZSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjawogICAgICAgICAqIHRvIGJlIGVucXVldWVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyBgdHJ1ZWAgaWYgYSBzdHJpY3QgZXF1YWxpdHkKICAgICAgICAgKiBjaGVjayBmYWlscy4gVGhlIG1ldGhvZCBhbHdheXMgcmV0dXJucyBmYWxzZSBmb3IgYE5hTmAuCiAgICAgICAgICoKICAgICAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBlLmcuIHByb3ZpZGUgc3RyaWN0ZXIgY2hlY2tpbmcgZm9yCiAgICAgICAgICogT2JqZWN0cy9BcnJheXMgd2hlbiB1c2luZyBpbW11dGFibGUgcGF0dGVybnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAgICogQHBhcmFtIHsqfSBvbGQgUHJldmlvdXMgcHJvcGVydHkgdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgICAqICAgYW5kIGVucXVldWUgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjawogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICAgIHJldHVybiAoCiAgICAgICAgICAgIC8vIFN0cmljdCBlcXVhbGl0eSBjaGVjawogICAgICAgICAgICAob2xkICE9PSB2YWx1ZSAmJgogICAgICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyAob2xkPT1OYU4sIHZhbHVlPT1OYU4pIGFsd2F5cyByZXR1cm5zIGZhbHNlCiAgICAgICAgICAgICAgKG9sZCA9PT0gb2xkIHx8IHZhbHVlID09PSB2YWx1ZSkpCiAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvCiAgICAgICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSkgewogICAgICAgICAgaWYgKG9sZCAhPT0gdmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fYXR0cmlidXRlVG9Qcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKSB7CiAgICAgICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVzZXJpYWxpemVzIGFuIGF0dHJpYnV0ZSB0byBpdHMgYXNzb2NpYXRlZCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbGxzIHRoZSBgX2Rlc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSBzdHJpbmcgdG8KICAgICAgICAgKiBhIHR5cGVkIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBOYW1lIG9mIGF0dHJpYnV0ZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAgICogQHBhcmFtIHsqPX0gdHlwZSB0eXBlIHRvIGRlc2VyaWFsaXplIHRvLCBkZWZhdWx0cyB0byB0aGUgdmFsdWUKICAgICAgICAgKiByZXR1cm5lZCBmcm9tIGB0eXBlRm9yUHJvcGVydHlgCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfYXR0cmlidXRlVG9Qcm9wZXJ0eShhdHRyaWJ1dGUsIHZhbHVlLCB0eXBlKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19zZXJpYWxpemluZykgewogICAgICAgICAgICBjb25zdCBtYXAgPSB0aGlzLl9fZGF0YUF0dHJpYnV0ZXM7CiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gbWFwICYmIG1hcFthdHRyaWJ1dGVdIHx8IGF0dHJpYnV0ZTsKICAgICAgICAgICAgdGhpc1twcm9wZXJ0eV0gPSB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlIHx8CiAgICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci50eXBlRm9yUHJvcGVydHkocHJvcGVydHkpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBpdHMgYXNzb2NpYXRlZCBhdHRyaWJ1dGUuCiAgICAgICAgICoKICAgICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gQ2xvc3VyZSBjYW4ndCBmaWd1cmUgb3V0IGB0aGlzYCBpcyBhbiBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUgdG8gcmVmbGVjdC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byByZWZsZWN0IHRvLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHJlZmVjdC4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKSB7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSB0cnVlOwogICAgICAgICAgdmFsdWUgPSAoYXJndW1lbnRzLmxlbmd0aCA8IDMpID8gdGhpc1twcm9wZXJ0eV0gOiB2YWx1ZTsKICAgICAgICAgIHRoaXMuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKSwgdmFsdWUsCiAgICAgICAgICAgIGF0dHJpYnV0ZSB8fCB0aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSkpOwogICAgICAgICAgdGhpcy5fX3NlcmlhbGl6aW5nID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIGEgdHlwZWQgdmFsdWUgdG8gYW4gSFRNTCBhdHRyaWJ1dGUgb24gYSBub2RlLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgY2FsbHMgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCB0byBjb252ZXJ0IHRoZSB0eXBlZAogICAgICAgICAqIHZhbHVlIHRvIGEgc3RyaW5nLiAgSWYgdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLAogICAgICAgICAqIHRoZSBhdHRyaWJ1dGUgd2lsbCBiZSByZW1vdmVkICh0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBib29sZWFuCiAgICAgICAgICogdHlwZSBgZmFsc2VgKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfdmFsdWVUb05vZGVBdHRyaWJ1dGUobm9kZSwgdmFsdWUsIGF0dHJpYnV0ZSkgewogICAgICAgICAgY29uc3Qgc3RyID0gdGhpcy5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgICAgaWYgKHN0ciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyaWJ1dGUsIHN0cik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUgdG8gYSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBzZXR0aW5nIEpTIHByb3BlcnR5IHZhbHVlcyB0bwogICAgICAgICAqIEhUTUwgYXR0cmlidXRlcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCiAgICAgICAgICogc2VyaWFsaXphdGlvbiBmb3IgY3VzdG9tIHR5cGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byBzZXJpYWxpemUuCiAgICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTdHJpbmcgc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZAogICAgICAgICAqIHByb3BlcnR5ICB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBfc2VyaWFsaXplVmFsdWUodmFsdWUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7CiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/ICcnIDogdW5kZWZpbmVkOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUudG9TdHJpbmcoKSA6IHVuZGVmaW5lZDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHJlYWRpbmcgSFRNTCBhdHRyaWJ1dGUgdmFsdWVzIHRvCiAgICAgICAgICogSlMgcHJvcGVydGllcy4gIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlCiAgICAgICAgICogZGVzZXJpYWxpemF0aW9uIGZvciBjdXN0b20gYHR5cGVgcy4gVHlwZXMgZm9yIGBCb29sZWFuYCwgYFN0cmluZ2AsCiAgICAgICAgICogYW5kIGBOdW1iZXJgIGNvbnZlcnQgYXR0cmlidXRlcyB0byB0aGUgZXhwZWN0ZWQgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvLgogICAgICAgICAqIEByZXR1cm4geyp9IFR5cGVkIHZhbHVlIGRlc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBzdHJpbmcuCiAgICAgICAgICovCiAgICAgICAgX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpIHsKICAgICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICBjYXNlIEJvb2xlYW46CiAgICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSAhPT0gbnVsbCk7CiAgICAgICAgICAgIGNhc2UgTnVtYmVyOgogICAgICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICB9CgogICAgICByZXR1cm4gUHJvcGVydGllc0NoYW5nZWQ7CiAgICB9KTsKCgogIH0pKCk7CgoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgY2FzZU1hcCA9IFBvbHltZXIuQ2FzZU1hcDsKCiAgLy8gU2F2ZSBtYXAgb2YgbmF0aXZlIHByb3BlcnRpZXM7IHRoaXMgZm9ybXMgYSBibGFja2xpc3Qgb3IgcHJvcGVydGllcwogIC8vIHRoYXQgd29uJ3QgaGF2ZSB0aGVpciB2YWx1ZXMgInNhdmVkIiBieSBgc2F2ZUFjY2Vzc29yVmFsdWVgLCBzaW5jZQogIC8vIHJlYWRpbmcgZnJvbSBhbiBIVE1MRWxlbWVudCBhY2Nlc3NvciBmcm9tIHRoZSBjb250ZXh0IG9mIGEgcHJvdG90eXBlIHRocm93cwogIGNvbnN0IG5hdGl2ZVByb3BlcnRpZXMgPSB7fTsKICBsZXQgcHJvdG8gPSBIVE1MRWxlbWVudC5wcm90b3R5cGU7CiAgd2hpbGUgKHByb3RvKSB7CiAgICBsZXQgcHJvcHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhwcm90byk7CiAgICBmb3IgKGxldCBpPTA7IGk8cHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgbmF0aXZlUHJvcGVydGllc1twcm9wc1tpXV0gPSB0cnVlOwogICAgfQogICAgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocHJvdG8pOwogIH0KCiAgLyoqCiAgICogVXNlZCB0byBzYXZlIHRoZSB2YWx1ZSBvZiBhIHByb3BlcnR5IHRoYXQgd2lsbCBiZSBvdmVycmlkZGVuIHdpdGgKICAgKiBhbiBhY2Nlc3Nvci4gSWYgdGhlIGBtb2RlbGAgaXMgYSBwcm90b3R5cGUsIHRoZSB2YWx1ZXMgd2lsbCBiZSBzYXZlZAogICAqIGluIGBfX2RhdGFQcm90b2AsIGFuZCBpdCdzIHVwIHRvIHRoZSB1c2VyIChvciBkb3duc3RyZWFtIG1peGluKSB0bwogICAqIGRlY2lkZSBob3cvd2hlbiB0byBzZXQgdGhlc2UgdmFsdWVzIGJhY2sgaW50byB0aGUgYWNjZXNzb3JzLgogICAqIElmIGBtb2RlbGAgaXMgYWxyZWFkeSBhbiBpbnN0YW5jZSAoaXQgaGFzIGEgYF9fZGF0YWAgcHJvcGVydHkpLCB0aGVuCiAgICogdGhlIHZhbHVlIHdpbGwgYmUgc2V0IGFzIGEgcGVuZGluZyBwcm9wZXJ0eSwgbWVhbmluZyB0aGUgdXNlciBzaG91bGQKICAgKiBjYWxsIGBfaW52YWxpZGF0ZVByb3BlcnRpZXNgIG9yIGBfZmx1c2hQcm9wZXJ0aWVzYCB0byB0YWtlIGVmZmVjdAogICAqCiAgICogQHBhcmFtIHtPYmplY3R9IG1vZGVsIFByb3RvdHlwZSBvciBpbnN0YW5jZQogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNhdmVBY2Nlc3NvclZhbHVlKG1vZGVsLCBwcm9wZXJ0eSkgewogICAgLy8gRG9uJ3QgcmVhZC9zdG9yZSB2YWx1ZSBmb3IgYW55IG5hdGl2ZSBwcm9wZXJ0aWVzIHNpbmNlIHRoZXkgY291bGQgdGhyb3cKICAgIGlmICghbmF0aXZlUHJvcGVydGllc1twcm9wZXJ0eV0pIHsKICAgICAgbGV0IHZhbHVlID0gbW9kZWxbcHJvcGVydHldOwogICAgICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgIGlmIChtb2RlbC5fX2RhdGEpIHsKICAgICAgICAgIC8vIEFkZGluZyBhY2Nlc3NvciB0byBpbnN0YW5jZTsgdXBkYXRlIHRoZSBwcm9wZXJ0eQogICAgICAgICAgLy8gSXQgaXMgdGhlIHVzZXIncyByZXNwb25zaWJpbGl0eSB0byBjYWxsIF9mbHVzaFByb3BlcnRpZXMKICAgICAgICAgIG1vZGVsLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQWRkaW5nIGFjY2Vzc29yIHRvIHByb3RvOyBzYXZlIHByb3RvJ3MgdmFsdWUgZm9yIGluc3RhbmNlLXRpbWUgdXNlCiAgICAgICAgICBpZiAoIW1vZGVsLl9fZGF0YVByb3RvKSB7CiAgICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvID0ge307CiAgICAgICAgICB9IGVsc2UgaWYgKCFtb2RlbC5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX2RhdGFQcm90bycsIG1vZGVsKSkpIHsKICAgICAgICAgICAgbW9kZWwuX19kYXRhUHJvdG8gPSBPYmplY3QuY3JlYXRlKG1vZGVsLl9fZGF0YVByb3RvKTsKICAgICAgICAgIH0KICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvW3Byb3BlcnR5XSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIGJhc2ljIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIGNyZWF0aW5nIG9uZQogICAqIG9yIG1vcmUgcHJvcGVydHkgYWNjZXNzb3JzIChnZXR0ZXIvc2V0dGVyIHBhaXIpIHRoYXQgZW5xdWV1ZSBhbiBhc3luYwogICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgKgogICAqIEZvciBiYXNpYyB1c2FnZSBvZiB0aGlzIG1peGluOgogICAqIAogICAqIC0gICBEZWNsYXJlIGF0dHJpYnV0ZXMgdG8gb2JzZXJ2ZSB2aWEgdGhlIHN0YW5kYXJkIGBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpYC4gVXNlCiAgICogICAgIGBkYXNoLWNhc2VgIGF0dHJpYnV0ZSBuYW1lcyB0byByZXByZXNlbnQgYGNhbWVsQ2FzZWAgcHJvcGVydHkgbmFtZXMuIAogICAqIC0gICBJbXBsZW1lbnQgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIG9uIHRoZSBjbGFzcy4KICAgKiAtICAgQ2FsbCBgTXlDbGFzcy5jcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpYCAqKm9uY2UqKiBvbiB0aGUgY2xhc3MgdG8gZ2VuZXJhdGUgCiAgICogICAgIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgZWFjaCBvYnNlcnZlZCBhdHRyaWJ1dGUuIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCAKICAgKiAgICAgaW5zdGFuY2UgaXMgY3JlYXRlZCwgZm9yIGV4YW1wbGUsIGJ5IGNhbGxpbmcgaXQgYmVmb3JlIGNhbGxpbmcgYGN1c3RvbUVsZW1lbnRzLmRlZmluZWAuCiAgICogICAgIEl0IGNhbiBhbHNvIGJlIGNhbGxlZCBsYXppbHkgZnJvbSB0aGUgZWxlbWVudCdzIGBjb25zdHJ1Y3RvcmAsIGFzIGxvbmcgYXMgaXQncyBndWFyZGVkIHNvCiAgICogICAgIHRoYXQgdGhlIGNhbGwgaXMgb25seSBtYWRlIG9uY2UsIHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIGlzIGNyZWF0ZWQuCiAgICogLSAgIENhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncyBgY29ubmVjdGVkQ2FsbGJhY2tgIHRvIGVuYWJsZSAKICAgKiAgICAgdGhlIGFjY2Vzc29ycy4KICAgKgogICAqIEFueSBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUKICAgKiBkZXNlcmlhbGl6ZWQgdmlhIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIGFuZCBzZXQgdG8gdGhlIGFzc29jaWF0ZWQKICAgKiBwcm9wZXJ0eSB1c2luZyBgZGFzaC1jYXNlYC10by1gY2FtZWxDYXNlYCBjb252ZW50aW9uLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0aWVzQ2hhbmdlZAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiBmb3IgcmVhY3RpbmcgdG8gcHJvcGVydHkgY2hhbmdlcyBmcm9tCiAgICogICBnZW5lcmF0ZWQgcHJvcGVydHkgYWNjZXNzb3JzLgogICAqLwogIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtzdXBlckNsYXNzfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICAgY29uc3QgYmFzZSA9IFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQoc3VwZXJDbGFzcyk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnR5QWNjZXNzb3JzIGV4dGVuZHMgYmFzZSB7CgogICAgICAvKioKICAgICAgICogR2VuZXJhdGVzIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIHN0YW5kYXJkCiAgICAgICAqIHN0YXRpYyBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBhcnJheS4KICAgICAgICoKICAgICAgICogQXR0cmlidXRlIG5hbWVzIGFyZSBtYXBwZWQgdG8gcHJvcGVydHkgbmFtZXMgdXNpbmcgdGhlIGBkYXNoLWNhc2VgIHRvCiAgICAgICAqIGBjYW1lbENhc2VgIGNvbnZlbnRpb24KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpIHsKICAgICAgICBsZXQgYSQgPSB0aGlzLm9ic2VydmVkQXR0cmlidXRlczsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBhJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3IoY2FzZU1hcC5kYXNoVG9DYW1lbENhc2UoYSRbaV0pKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGFuIGF0dHJpYnV0ZSBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKiBCeSBkZWZhdWx0LCBjb252ZXJ0cyBjYW1lbCB0byBkYXNoIGNhc2UsIGUuZy4gYGZvb0JhcmAgdG8gYGZvby1iYXJgLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdG8gY29udmVydAogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEF0dHJpYnV0ZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIGNhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBQcm9wZXJ0aWVzQ2hhbmdlZCBpbXBsZW1lbnRhdGlvbiB0byBpbml0aWFsaXplIHZhbHVlcyBmb3IKICAgICAgICogYWNjZXNzb3JzIGNyZWF0ZWQgZm9yIHZhbHVlcyB0aGF0IGFscmVhZHkgZXhpc3RlZCBvbiB0aGUgZWxlbWVudAogICAgICAgKiBwcm90b3R5cGUuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBpZiAodGhpcy5fX2RhdGFQcm90bykgewogICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyh0aGlzLl9fZGF0YVByb3RvKTsKICAgICAgICAgIHRoaXMuX19kYXRhUHJvdG8gPSBudWxsOwogICAgICAgIH0KICAgICAgICBzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCBhdCBpbnN0YW5jZSB0aW1lIHdpdGggYmFnIG9mIHByb3BlcnRpZXMgdGhhdCB3ZXJlIG92ZXJ3cml0dGVuCiAgICAgICAqIGJ5IGFjY2Vzc29ycyBvbiB0aGUgcHJvdG90eXBlIHdoZW4gYWNjZXNzb3JzIHdlcmUgY3JlYXRlZC4KICAgICAgICoKICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICogc2V0dGVyIGF0IGluc3RhbmNlIHRpbWUuICBUaGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBhbiBvdmVycmlkZQogICAgICAgKiBwb2ludCBmb3IgY3VzdG9taXppbmcgb3IgcHJvdmlkaW5nIG1vcmUgZWZmaWNpZW50IGluaXRpYWxpemF0aW9uLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIHByb3BlcnR5IHZhbHVlcyB0aGF0IHdlcmUgb3ZlcndyaXR0ZW4KICAgICAgICogICB3aGVuIGNyZWF0aW5nIHByb3BlcnR5IGFjY2Vzc29ycy4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm90b1Byb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9zZXRQcm9wZXJ0eShwLCBwcm9wc1twXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRW5zdXJlcyB0aGUgZWxlbWVudCBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4gSWYgaXQgZG9lcyBub3QsCiAgICAgICAqIGFzc2lnbnMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAqCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGNhbid0IGZpZ3VyZSBvdXQgYHRoaXNgIGlzIGluZmFjdCBhbiBlbGVtZW50CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGUgTmFtZSBvZiBhdHRyaWJ1dGUgdG8gZW5zdXJlIGlzIHNldC4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZW5zdXJlQXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICBjb25zdCBlbCA9IC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKTsKICAgICAgICBpZiAoIWVsLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSB7CiAgICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZShlbCwgdmFsdWUsIGF0dHJpYnV0ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIFByb3BlcnRpZXNDaGFuZ2VkIGltcGxlbWVudGlvbiB0byBzZXJpYWxpemUgb2JqZWN0cyBhcyBKU09OLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTdHJpbmcgc2VyaWFsaXplZCBmcm9tIHRoZSBwcm92aWRlZCBwcm9wZXJ0eSB2YWx1ZS4KICAgICAgICovCiAgICAgIF9zZXJpYWxpemVWYWx1ZSh2YWx1ZSkgewogICAgICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLWZhbGx0aHJvdWdoICovCiAgICAgICAgc3dpdGNoICh0eXBlb2YgdmFsdWUpIHsKICAgICAgICAgIGNhc2UgJ29iamVjdCc6CiAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIERhdGUpIHsKICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUpOwogICAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBzdXBlci5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IFBvbHltZXIgd2hlbiByZWFkaW5nIEhUTUwgYXR0cmlidXRlIHZhbHVlcyB0bwogICAgICAgKiBKUyBwcm9wZXJ0aWVzLiAgVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9uIFBvbHltZXIgZWxlbWVudAogICAgICAgKiBwcm90b3R5cGVzIHRvIHByb3ZpZGUgZGVzZXJpYWxpemF0aW9uIGZvciBjdXN0b20gYHR5cGVgcy4gIE5vdGUsCiAgICAgICAqIHRoZSBgdHlwZWAgYXJndW1lbnQgaXMgdGhlIHZhbHVlIG9mIHRoZSBgdHlwZWAgZmllbGQgcHJvdmlkZWQgaW4gdGhlCiAgICAgICAqIGBwcm9wZXJ0aWVzYCBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgYSBnaXZlbiBwcm9wZXJ0eSwgYW5kIGlzCiAgICAgICAqIGJ5IGNvbnZlbnRpb24gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgdHlwZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICoKICAgICAgICoKICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUgdG8gZGVzZXJpYWxpemUuCiAgICAgICAqIEBwYXJhbSB7Kj19IHR5cGUgVHlwZSB0byBkZXNlcmlhbGl6ZSB0aGUgc3RyaW5nIHRvLgogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlZCB2YWx1ZSBkZXNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgc3RyaW5nLgogICAgICAgKi8KICAgICAgX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAdHlwZSB7Kn0KICAgICAgICAgKi8KICAgICAgICBsZXQgb3V0VmFsdWU7CiAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICBjYXNlIE9iamVjdDoKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICBvdXRWYWx1ZSA9IEpTT04ucGFyc2UoLyoqIEB0eXBlIHtzdHJpbmd9ICovKHZhbHVlKSk7CiAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgIC8vIGFsbG93IG5vbi1KU09OIGxpdGVyYWxzIGxpa2UgU3RyaW5ncyBhbmQgTnVtYmVycwogICAgICAgICAgICAgIG91dFZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIEFycmF5OgogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIG91dFZhbHVlID0gSlNPTi5wYXJzZSgvKiogQHR5cGUge3N0cmluZ30gKi8odmFsdWUpKTsKICAgICAgICAgICAgfSBjYXRjaCh4KSB7CiAgICAgICAgICAgICAgb3V0VmFsdWUgPSBudWxsOwogICAgICAgICAgICAgIGNvbnNvbGUud2FybihgUG9seW1lcjo6QXR0cmlidXRlczogY291bGRuJ3QgZGVjb2RlIEFycmF5IGFzIEpTT046ICR7dmFsdWV9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIERhdGU6CiAgICAgICAgICAgIG91dFZhbHVlID0gaXNOYU4odmFsdWUpID8gU3RyaW5nKHZhbHVlKSA6IE51bWJlcih2YWx1ZSk7CiAgICAgICAgICAgIG91dFZhbHVlID0gbmV3IERhdGUob3V0VmFsdWUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIG91dFZhbHVlID0gc3VwZXIuX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dFZhbHVlOwogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tZmFsbHRocm91Z2ggKi8KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgUHJvcGVydGllc0NoYW5nZWQgaW1wbGVtZW50YXRpb24gdG8gc2F2ZSBleGlzdGluZyBwcm90b3R5cGUKICAgICAgICogcHJvcGVydHkgdmFsdWUgc28gdGhhdCBpdCBjYW4gYmUgcmVzZXQuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSByZWFkT25seSBXaGVuIHRydWUsIG5vIHNldHRlciBpcyBjcmVhdGVkCiAgICAgICAqCiAgICAgICAqIFdoZW4gY2FsbGluZyBvbiBhIHByb3RvdHlwZSwgYW55IG92ZXJ3cml0dGVuIHZhbHVlcyBhcmUgc2F2ZWQgaW4KICAgICAgICogYF9fZGF0YVByb3RvYCwgYW5kIGl0IGlzIHVwIHRvIHRoZSBzdWJjbGFzc2VyIHRvIGRlY2lkZSBob3cvd2hlbgogICAgICAgKiB0byBzZXQgdGhvc2UgcHJvcGVydGllcyBiYWNrIGludG8gdGhlIGFjY2Vzc29yLiAgV2hlbiBjYWxsaW5nIG9uIGFuCiAgICAgICAqIGluc3RhbmNlLCB0aGUgb3ZlcndyaXR0ZW4gdmFsdWUgaXMgc2V0IHZpYSBgX3NldFBlbmRpbmdQcm9wZXJ0eWAsCiAgICAgICAqIGFuZCB0aGUgdXNlciBzaG91bGQgY2FsbCBgX2ludmFsaWRhdGVQcm9wZXJ0aWVzYCBvciBgX2ZsdXNoUHJvcGVydGllc2AKICAgICAgICogZm9yIHRoZSB2YWx1ZXMgdG8gdGFrZSBlZmZlY3QuCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSkgewogICAgICAgIHNhdmVBY2Nlc3NvclZhbHVlKHRoaXMsIHByb3BlcnR5KTsKICAgICAgICBzdXBlci5fZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgbGlicmFyeSBjcmVhdGVkIGFuIGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYW4gYWNjZXNzb3Igd2FzIGNyZWF0ZWQKICAgICAgICovCiAgICAgIF9oYXNBY2Nlc3Nvcihwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yICYmIHRoaXMuX19kYXRhSGFzQWNjZXNzb3JbcHJvcGVydHldOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaGFzIGEgcGVuZGluZyBjaGFuZ2UuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBwcm9wZXJ0eSBoYXMgYSBwZW5kaW5nIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaXNQcm9wZXJ0eVBlbmRpbmcocHJvcCkgewogICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuX19kYXRhUGVuZGluZyAmJiAocHJvcCBpbiB0aGlzLl9fZGF0YVBlbmRpbmcpKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gUHJvcGVydHlBY2Nlc3NvcnM7CgogIH0pOwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3Qgd2Fsa2VyID0gZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihkb2N1bWVudCwgTm9kZUZpbHRlci5TSE9XX0FMTCwKICAgICAgbnVsbCwgZmFsc2UpOwoKICAvLyAxLnggYmFja3dhcmRzLWNvbXBhdGlibGUgYXV0by13cmFwcGVyIGZvciB0ZW1wbGF0ZSB0eXBlIGV4dGVuc2lvbnMKICAvLyBUaGlzIGlzIGEgY2xlYXIgbGF5ZXJpbmcgdmlvbGF0aW9uIGFuZCBnaXZlcyBmYXZvcmVkLW5hdGlvbiBzdGF0dXMgdG8KICAvLyBkb20taWYgYW5kIGRvbS1yZXBlYXQgdGVtcGxhdGVzLiAgVGhpcyBpcyBhIGNvbmNlaXQgd2UncmUgY2hvb3NpbmcgdG8ga2VlcAogIC8vIGEuKSB0byBlYXNlIDEueCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBkdWUgdG8gbG9zcyBvZiBgaXNgLCBhbmQKICAvLyBiLikgdG8gbWFpbnRhaW4gaWYvcmVwZWF0IGNhcGFiaWxpdHkgaW4gcGFyc2VyLWNvbnN0cmFpbmVkIGVsZW1lbnRzCiAgLy8gICAgIChlLmcuIHRhYmxlLCBzZWxlY3QpIGluIGxpZXUgb2YgbmF0aXZlIENFIHR5cGUgZXh0ZW5zaW9ucyB3aXRob3V0CiAgLy8gICAgIG1hc3NpdmUgbmV3IGludmVudGlvbiBpbiB0aGlzIHNwYWNlIChlLmcuIGRpcmVjdGl2ZSBzeXN0ZW0pCiAgY29uc3QgdGVtcGxhdGVFeHRlbnNpb25zID0gewogICAgJ2RvbS1pZic6IHRydWUsCiAgICAnZG9tLXJlcGVhdCc6IHRydWUKICB9OwogIGZ1bmN0aW9uIHdyYXBUZW1wbGF0ZUV4dGVuc2lvbihub2RlKSB7CiAgICBsZXQgaXMgPSBub2RlLmdldEF0dHJpYnV0ZSgnaXMnKTsKICAgIGlmIChpcyAmJiB0ZW1wbGF0ZUV4dGVuc2lvbnNbaXNdKSB7CiAgICAgIGxldCB0ID0gbm9kZTsKICAgICAgdC5yZW1vdmVBdHRyaWJ1dGUoJ2lzJyk7CiAgICAgIG5vZGUgPSB0Lm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChpcyk7CiAgICAgIHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobm9kZSwgdCk7CiAgICAgIG5vZGUuYXBwZW5kQ2hpbGQodCk7CiAgICAgIHdoaWxlKHQuYXR0cmlidXRlcy5sZW5ndGgpIHsKICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSwgdC5hdHRyaWJ1dGVzWzBdLnZhbHVlKTsKICAgICAgICB0LnJlbW92ZUF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgZnVuY3Rpb24gZmluZFRlbXBsYXRlTm9kZShyb290LCBub2RlSW5mbykgewogICAgLy8gcmVjdXJzaXZlbHkgYXNjZW5kIHRyZWUgdW50aWwgd2UgaGl0IHJvb3QKICAgIGxldCBwYXJlbnQgPSBub2RlSW5mby5wYXJlbnRJbmZvICYmIGZpbmRUZW1wbGF0ZU5vZGUocm9vdCwgbm9kZUluZm8ucGFyZW50SW5mbyk7CiAgICAvLyB1bndpbmQgdGhlIHN0YWNrLCByZXR1cm5pbmcgdGhlIGluZGV4ZWQgbm9kZSBhdCBlYWNoIGxldmVsCiAgICBpZiAocGFyZW50KSB7CiAgICAgIC8vIG5vdGU6IG1hcmdpbmFsbHkgZmFzdGVyIHRoYW4gaW5kZXhpbmcgdmlhIGNoaWxkTm9kZXMKICAgICAgLy8gKGh0dHA6Ly9qc3BlcmYuY29tL2NoaWxkbm9kZXMtbG9va3VwKQogICAgICB3YWxrZXIuY3VycmVudE5vZGUgPSBwYXJlbnQ7CiAgICAgIGZvciAobGV0IG49d2Fsa2VyLmZpcnN0Q2hpbGQoKSwgaT0wOyBuOyBuPXdhbGtlci5uZXh0U2libGluZygpKSB7CiAgICAgICAgaWYgKG5vZGVJbmZvLnBhcmVudEluZGV4ID09PSBpKyspIHsKICAgICAgICAgIHJldHVybiBuOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHJvb3Q7CiAgICB9CiAgfQoKICAvLyBjb25zdHJ1Y3QgYCRgIG1hcCAoZnJvbSBpZCBhbm5vdGF0aW9ucykKICBmdW5jdGlvbiBhcHBseUlkVG9NYXAoaW5zdCwgbWFwLCBub2RlLCBub2RlSW5mbykgewogICAgaWYgKG5vZGVJbmZvLmlkKSB7CiAgICAgIG1hcFtub2RlSW5mby5pZF0gPSBub2RlOwogICAgfQogIH0KCiAgLy8gaW5zdGFsbCBldmVudCBsaXN0ZW5lcnMgKGZyb20gZXZlbnQgYW5ub3RhdGlvbnMpCiAgZnVuY3Rpb24gYXBwbHlFdmVudExpc3RlbmVyKGluc3QsIG5vZGUsIG5vZGVJbmZvKSB7CiAgICBpZiAobm9kZUluZm8uZXZlbnRzICYmIG5vZGVJbmZvLmV2ZW50cy5sZW5ndGgpIHsKICAgICAgZm9yIChsZXQgaj0wLCBlJD1ub2RlSW5mby5ldmVudHMsIGU7IChqPGUkLmxlbmd0aCkgJiYgKGU9ZSRbal0pOyBqKyspIHsKICAgICAgICBpbnN0Ll9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGUubmFtZSwgZS52YWx1ZSwgaW5zdCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIHB1c2ggY29uZmlndXJhdGlvbiByZWZlcmVuY2VzIGF0IGNvbmZpZ3VyZSB0aW1lCiAgZnVuY3Rpb24gYXBwbHlUZW1wbGF0ZUNvbnRlbnQoaW5zdCwgbm9kZSwgbm9kZUluZm8pIHsKICAgIGlmIChub2RlSW5mby50ZW1wbGF0ZUluZm8pIHsKICAgICAgbm9kZS5fdGVtcGxhdGVJbmZvID0gbm9kZUluZm8udGVtcGxhdGVJbmZvOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY3JlYXRlTm9kZUV2ZW50SGFuZGxlcihjb250ZXh0LCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgIC8vIEluc3RhbmNlcyBjYW4gb3B0aW9uYWxseSBoYXZlIGEgX21ldGhvZEhvc3Qgd2hpY2ggYWxsb3dzIHJlZGlyZWN0aW5nIHdoZXJlCiAgICAvLyB0byBmaW5kIG1ldGhvZHMuIEN1cnJlbnRseSB1c2VkIGJ5IGB0ZW1wbGF0aXplYC4KICAgIGNvbnRleHQgPSBjb250ZXh0Ll9tZXRob2RIb3N0IHx8IGNvbnRleHQ7CiAgICBsZXQgaGFuZGxlciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGNvbnRleHRbbWV0aG9kTmFtZV0pIHsKICAgICAgICBjb250ZXh0W21ldGhvZE5hbWVdKGUsIGUuZGV0YWlsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2xpc3RlbmVyIG1ldGhvZCBgJyArIG1ldGhvZE5hbWUgKyAnYCBub3QgZGVmaW5lZCcpOwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGhhbmRsZXI7CiAgfQoKICAvKioKICAgKiBFbGVtZW50IG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgdGVtcGxhdGUgcGFyc2luZyBhbmQgc3RhbXBpbmcsIGluY2x1ZGluZwogICAqIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUtcmVsYXRlZCBmZWF0dXJlcyBmb3Igc3RhbXBlZCB0ZW1wbGF0ZXM6CiAgICoKICAgKiAtIERlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyAoYG9uLWV2ZW50bmFtZT0ibGlzdGVuZXIiYCkKICAgKiAtIE1hcCBvZiBub2RlIGlkJ3MgdG8gc3RhbXBlZCBub2RlIGluc3RhbmNlcyAoYHRoaXMuJC5pZGApCiAgICogLSBOZXN0ZWQgdGVtcGxhdGUgY29udGVudCBjYWNoaW5nL3JlbW92YWwgYW5kIHJlLWluc3RhbGxhdGlvbiAocGVyZm9ybWFuY2UKICAgKiAgIG9wdGltaXphdGlvbikKICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBiYXNpYyB0ZW1wbGF0ZSBwYXJzaW5nIGFuZCBzdGFtcGluZwogICAqLwogIFBvbHltZXIuVGVtcGxhdGVTdGFtcCA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfVGVtcGxhdGVTdGFtcH0KICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVTdGFtcCBleHRlbmRzIHN1cGVyQ2xhc3MgewoKICAgICAgLyoqCiAgICAgICAqIFNjYW5zIGEgdGVtcGxhdGUgdG8gcHJvZHVjZSB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGUtc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiB0aGUgb2JqZWN0IHJldHVybmVkLCBhbmQgbm9kZS0KICAgICAgICogc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiBvYmplY3RzIGluIGl0cyBmbGF0dGVuZWQgYG5vZGVJbmZvTGlzdGAKICAgICAgICogYXJyYXkuICBPbmx5IG5vZGVzIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IHdlcmUgcGFyc2VkIGFzIG5vZGVzIG9mCiAgICAgICAqIGludGVyZXN0IGNvbnRhaW4gYW4gb2JqZWN0IGluIGBub2RlSW5mb0xpc3RgLiAgRWFjaCBgbm9kZUluZm9gIG9iamVjdAogICAgICAgKiBjb250YWlucyBhbiBgaW5kZXhgIChgY2hpbGROb2Rlc2AgaW5kZXggaW4gcGFyZW50KSBhbmQgb3B0aW9uYWxseQogICAgICAgKiBgcGFyZW50YCwgd2hpY2ggcG9pbnRzIHRvIG5vZGUgaW5mbyBvZiBpdHMgcGFyZW50IChpbmNsdWRpbmcgaXRzIGluZGV4KS4KICAgICAgICoKICAgICAgICogVGhlIHRlbXBsYXRlIG1ldGFkYXRhIG9iamVjdCByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIGhhcyB0aGUgZm9sbG93aW5nCiAgICAgICAqIHN0cnVjdHVyZSAobWFueSBmaWVsZHMgb3B0aW9uYWwpOgogICAgICAgKgogICAgICAgKiBgYGBqcwogICAgICAgKiAgIHsKICAgICAgICogICAgIC8vIEZsYXR0ZW5lZCBsaXN0IG9mIG5vZGUgbWV0YWRhdGEgKGZvciBub2RlcyB0aGF0IGdlbmVyYXRlZCBtZXRhZGF0YSkKICAgICAgICogICAgIG5vZGVJbmZvTGlzdDogWwogICAgICAgKiAgICAgICB7CiAgICAgICAqICAgICAgICAgLy8gYGlkYCBhdHRyaWJ1dGUgZm9yIGFueSBub2RlcyB3aXRoIGlkJ3MgZm9yIGdlbmVyYXRpbmcgYCRgIG1hcAogICAgICAgKiAgICAgICAgIGlkOiB7c3RyaW5nfSwKICAgICAgICogICAgICAgICAvLyBgb24tZXZlbnQ9ImhhbmRsZXIiYCBtZXRhZGF0YQogICAgICAgKiAgICAgICAgIGV2ZW50czogWwogICAgICAgKiAgICAgICAgICAgewogICAgICAgKiAgICAgICAgICAgICBuYW1lOiB7c3RyaW5nfSwgICAvLyBldmVudCBuYW1lCiAgICAgICAqICAgICAgICAgICAgIHZhbHVlOiB7c3RyaW5nfSwgIC8vIGhhbmRsZXIgbWV0aG9kIG5hbWUKICAgICAgICogICAgICAgICAgIH0sIC4uLgogICAgICAgKiAgICAgICAgIF0sCiAgICAgICAqICAgICAgICAgLy8gTm90ZXMgd2hlbiB0aGUgdGVtcGxhdGUgY29udGFpbmVkIGEgYDxzbG90PmAgZm9yIHNoYWR5IERPTQogICAgICAgKiAgICAgICAgIC8vIG9wdGltaXphdGlvbiBwdXJwb3NlcwogICAgICAgKiAgICAgICAgIGhhc0luc2VydGlvblBvaW50OiB7Ym9vbGVhbn0sCiAgICAgICAqICAgICAgICAgLy8gRm9yIG5lc3RlZCBgPHRlbXBsYXRlPmBgIG5vZGVzLCBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICB0ZW1wbGF0ZUluZm86IHtvYmplY3R9LCAvLyBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogICAgICAgICAvLyBNZXRhZGF0YSB0byBhbGxvdyBlZmZpY2llbnQgcmV0cmlldmFsIG9mIGluc3RhbmNlZCBub2RlCiAgICAgICAqICAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGlzIG1ldGFkYXRhCiAgICAgICAqICAgICAgICAgcGFyZW50SW5mbzoge251bWJlcn0sICAgLy8gcmVmZXJlbmNlIHRvIHBhcmVudCBub2RlSW5mbz4KICAgICAgICogICAgICAgICBwYXJlbnRJbmRleDoge251bWJlcn0sICAvLyBpbmRleCBpbiBwYXJlbnQncyBgY2hpbGROb2Rlc2AgY29sbGVjdGlvbgogICAgICAgKiAgICAgICAgIGluZm9JbmRleDoge251bWJlcn0sICAgIC8vIGluZGV4IG9mIHRoaXMgYG5vZGVJbmZvYCBpbiBgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdGAKICAgICAgICogICAgICAgfSwKICAgICAgICogICAgICAgLi4uCiAgICAgICAqICAgICBdLAogICAgICAgKiAgICAgLy8gV2hlbiB0cnVlLCB0aGUgdGVtcGxhdGUgaGFkIHRoZSBgc3RyaXAtd2hpdGVzcGFjZWAgYXR0cmlidXRlCiAgICAgICAqICAgICAvLyBvciB3YXMgbmVzdGVkIGluIGEgdGVtcGxhdGUgd2l0aCB0aGF0IHNldHRpbmcKICAgICAgICogICAgIHN0cmlwV2hpdGVzcGFjZToge2Jvb2xlYW59LAogICAgICAgKiAgICAgLy8gRm9yIG5lc3RlZCB0ZW1wbGF0ZXMsIG5lc3RlZCB0ZW1wbGF0ZSBjb250ZW50IGlzIG1vdmVkIGludG8KICAgICAgICogICAgIC8vIGEgZG9jdW1lbnQgZnJhZ21lbnQgc3RvcmVkIGhlcmU7IHRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIHRvCiAgICAgICAqICAgICAvLyBhdm9pZCB0aGUgY29zdCBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xvbmluZwogICAgICAgKiAgICAgY29udGVudDoge0RvY3VtZW50RnJhZ21lbnR9CiAgICAgICAqICAgfQogICAgICAgKiBgYGAKICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qga2lja3Mgb2ZmIGEgcmVjdXJzaXZlIHRyZWV3YWxrIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKiAgICBfcGFyc2VUZW1wbGF0ZSA8LS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgICAgKiAgICAgIF9wYXJzZVRlbXBsYXRlQ29udGVudCAgICAgICAgICAgICAgfAogICAgICAgKiAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlICA8LS0tLS0tLS0tLS0tfC0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlIC0tKyAgfAogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMgLS0tLS0tLS0tKwogICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzCiAgICAgICAqICAgICAgICAgICAgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlCiAgICAgICAqCiAgICAgICAqIGBgYAogICAgICAgKgogICAgICAgKiBUaGVzZSBtZXRob2RzIG1heSBiZSBvdmVycmlkZGVuIHRvIGFkZCBjdXN0b20gbWV0YWRhdGEgYWJvdXQgdGVtcGxhdGVzCiAgICAgICAqIHRvIGVpdGhlciBgdGVtcGxhdGVJbmZvYCBvciBgbm9kZUluZm9gLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGRlc3RydWN0aXZlIHRvIHRoZSB0ZW1wbGF0ZSwgaW4gdGhhdAogICAgICAgKiBlLmcuIGV2ZW50IGFubm90YXRpb25zIG1heSBiZSByZW1vdmVkIGFmdGVyIGJlaW5nIG5vdGVkIGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gcGFyc2UKICAgICAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm89fSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmcm9tIHRoZSBvdXRlcgogICAgICAgKiAgIHRlbXBsYXRlLCBmb3IgcGFyc2luZyBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgICAqIEByZXR1cm4geyFUZW1wbGF0ZUluZm99IFBhcnNlZCB0ZW1wbGF0ZSBtZXRhZGF0YQogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlKHRlbXBsYXRlLCBvdXRlclRlbXBsYXRlSW5mbykgewogICAgICAgIC8vIHNpbmNlIGEgdGVtcGxhdGUgbWF5IGJlIHJlLXVzZWQsIG1lbW8taXplIG1ldGFkYXRhCiAgICAgICAgaWYgKCF0ZW1wbGF0ZS5fdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGUuX3RlbXBsYXRlSW5mbyA9IHt9OwogICAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdCA9IFtdOwogICAgICAgICAgdGVtcGxhdGVJbmZvLnN0cmlwV2hpdGVTcGFjZSA9IFBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucyB8fAogICAgICAgICAgICAob3V0ZXJUZW1wbGF0ZUluZm8gJiYgb3V0ZXJUZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlKSB8fAogICAgICAgICAgICB0ZW1wbGF0ZS5oYXNBdHRyaWJ1dGUoJ3N0cmlwLXdoaXRlc3BhY2UnKTsKICAgICAgICAgIHRoaXMuX3BhcnNlVGVtcGxhdGVDb250ZW50KHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIHtwYXJlbnQ6IG51bGx9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRlbXBsYXRlLl90ZW1wbGF0ZUluZm87CiAgICAgIH0KCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGUodGVtcGxhdGUuY29udGVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgbm9kZSBhbmQgYWRkcyB0ZW1wbGF0ZSBhbmQgbm9kZSBtZXRhZGF0YSBiYXNlZCBvbgogICAgICAgKiB0aGUgY3VycmVudCBub2RlLCBhbmQgaXRzIGBjaGlsZE5vZGVzYCBhbmQgYGF0dHJpYnV0ZXNgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhZGQgY3VzdG9tIG5vZGUgb3IgdGVtcGxhdGUgc3BlY2lmaWMKICAgICAgICogbWV0YWRhdGEgYmFzZWQgb24gdGhpcyBub2RlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCBub3RlZDsKICAgICAgICBsZXQgZWxlbWVudCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSk7CiAgICAgICAgaWYgKGVsZW1lbnQubG9jYWxOYW1lID09ICd0ZW1wbGF0ZScgJiYgIWVsZW1lbnQuaGFzQXR0cmlidXRlKCdwcmVzZXJ2ZS1jb250ZW50JykpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5sb2NhbE5hbWUgPT09ICdzbG90JykgewogICAgICAgICAgLy8gRm9yIFNoYWR5RG9tIG9wdGltaXphdGlvbiwgaW5kaWNhdGluZyB0aGVyZSBpcyBhbiBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgIHRlbXBsYXRlSW5mby5oYXNJbnNlcnRpb25Qb2ludCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IGVsZW1lbnQ7CiAgICAgICAgaWYgKHdhbGtlci5maXJzdENoaWxkKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMoZWxlbWVudCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZXMgJiYgZWxlbWVudC5oYXNBdHRyaWJ1dGVzKCkpIHsKICAgICAgICAgIG5vdGVkID0gdGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHx8IG5vdGVkOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgY2hpbGQgbm9kZXMgZm9yIHRoZSBnaXZlbiByb290IG5vZGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGFsc28gd3JhcHMgd2hpdGVsaXN0ZWQgbGVnYWN5IHRlbXBsYXRlIGV4dGVuc2lvbnMKICAgICAgICogKGBpcz0iZG9tLWlmImAgYW5kIGBpcz0iZG9tLXJlcGVhdCJgKSB3aXRoIHRoZWlyIGVxdWl2YWxlbnQgZWxlbWVudAogICAgICAgKiB3cmFwcGVycywgY29sbGFwc2VzIHRleHQgbm9kZXMsIGFuZCBzdHJpcHMgd2hpdGVzcGFjZSBmcm9tIHRoZSB0ZW1wbGF0ZQogICAgICAgKiBpZiB0aGUgYHRlbXBsYXRlSW5mby5zdHJpcFdoaXRlc3BhY2VgIHNldHRpbmcgd2FzIHByb3ZpZGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge05vZGV9IHJvb3QgUm9vdCBub2RlIHdob3NlIGBjaGlsZE5vZGVzYCB3aWxsIGJlIHBhcnNlZAogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMocm9vdCwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGlmIChyb290LmxvY2FsTmFtZSA9PT0gJ3NjcmlwdCcgfHwgcm9vdC5sb2NhbE5hbWUgPT09ICdzdHlsZScpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gcm9vdDsKICAgICAgICBmb3IgKGxldCBub2RlPXdhbGtlci5maXJzdENoaWxkKCksIHBhcmVudEluZGV4PTAsIG5leHQ7IG5vZGU7IG5vZGU9bmV4dCkgewogICAgICAgICAgLy8gV3JhcCB0ZW1wbGF0ZXMKICAgICAgICAgIGlmIChub2RlLmxvY2FsTmFtZSA9PSAndGVtcGxhdGUnKSB7CiAgICAgICAgICAgIG5vZGUgPSB3cmFwVGVtcGxhdGVFeHRlbnNpb24obm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBjb2xsYXBzZSBhZGphY2VudCB0ZXh0Tm9kZXM6IGZpeGVzIGFuIElFIGlzc3VlIHRoYXQgY2FuIGNhdXNlCiAgICAgICAgICAvLyB0ZXh0IG5vZGVzIHRvIGJlIGluZXhwbGljYWJseSBzcGxpdCA9KAogICAgICAgICAgLy8gbm90ZSB0aGF0IHJvb3Qubm9ybWFsaXplKCkgc2hvdWxkIHdvcmsgYnV0IGRvZXMgbm90IHNvIHdlIGRvIHRoaXMKICAgICAgICAgIC8vIG1hbnVhbGx5LgogICAgICAgICAgd2Fsa2VyLmN1cnJlbnROb2RlID0gbm9kZTsKICAgICAgICAgIG5leHQgPSB3YWxrZXIubmV4dFNpYmxpbmcoKTsKICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICBsZXQgLyoqIE5vZGUgKi8gbiA9IG5leHQ7CiAgICAgICAgICAgIHdoaWxlIChuICYmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkpIHsKICAgICAgICAgICAgICBub2RlLnRleHRDb250ZW50ICs9IG4udGV4dENvbnRlbnQ7CiAgICAgICAgICAgICAgbmV4dCA9IHdhbGtlci5uZXh0U2libGluZygpOwogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobik7CiAgICAgICAgICAgICAgbiA9IG5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gb3B0aW9uYWxseSBzdHJpcCB3aGl0ZXNwYWNlCiAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlICYmICFub2RlLnRleHRDb250ZW50LnRyaW0oKSkgewogICAgICAgICAgICAgIHJvb3QucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGxldCBjaGlsZEluZm8gPSB7IHBhcmVudEluZGV4LCBwYXJlbnRJbmZvOiBub2RlSW5mbyB9OwogICAgICAgICAgaWYgKHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgY2hpbGRJbmZvKSkgewogICAgICAgICAgICBjaGlsZEluZm8uaW5mb0luZGV4ID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdC5wdXNoKC8qKiBAdHlwZSB7IU5vZGVJbmZvfSAqLyhjaGlsZEluZm8pKSAtIDE7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbmNyZW1lbnQgaWYgbm90IHJlbW92ZWQKICAgICAgICAgIHdhbGtlci5jdXJyZW50Tm9kZSA9IG5vZGU7CiAgICAgICAgICBpZiAod2Fsa2VyLnBhcmVudE5vZGUoKSkgewogICAgICAgICAgICBwYXJlbnRJbmRleCsrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyB0ZW1wbGF0ZSBjb250ZW50IGZvciB0aGUgZ2l2ZW4gbmVzdGVkIGA8dGVtcGxhdGU+YC4KICAgICAgICoKICAgICAgICogTmVzdGVkIHRlbXBsYXRlIGluZm8gaXMgc3RvcmVkIGFzIGB0ZW1wbGF0ZUluZm9gIGluIHRoZSBjdXJyZW50IG5vZGUncwogICAgICAgKiBgbm9kZUluZm9gLiBgdGVtcGxhdGUuY29udGVudGAgaXMgcmVtb3ZlZCBhbmQgc3RvcmVkIGluIGB0ZW1wbGF0ZUluZm9gLgogICAgICAgKiBJdCB3aWxsIHRoZW4gYmUgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBob3N0IHRvIHNldCBpdCBiYWNrIHRvIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBhbmQgZm9yIHVzZXJzIHN0YW1waW5nIG5lc3RlZCB0ZW1wbGF0ZXMgdG8gdXNlIHRoZQogICAgICAgKiBgX2NvbnRlbnRGb3JUZW1wbGF0ZWAgbWV0aG9kIHRvIHJldHJpZXZlIHRoZSBjb250ZW50IGZvciB0aGlzIHRlbXBsYXRlCiAgICAgICAqIChhbiBvcHRpbWl6YXRpb24gdG8gYXZvaWQgdGhlIGNvc3Qgb2YgY2xvbmluZyBuZXN0ZWQgdGVtcGxhdGUgY29udGVudCkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlIChhIDx0ZW1wbGF0ZT4pCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSBvdXRlclRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiAgIHRoYXQgaW5jbHVkZXMgdGhlIHRlbXBsYXRlIGBub2RlYAogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgIGxldCB0ZW1wbGF0ZUluZm8gPSB0aGlzLl9wYXJzZVRlbXBsYXRlKG5vZGUsIG91dGVyVGVtcGxhdGVJbmZvKTsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50ID0KICAgICAgICAgIG5vZGUuY29udGVudC5vd25lckRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKICAgICAgICBjb250ZW50LmFwcGVuZENoaWxkKG5vZGUuY29udGVudCk7CiAgICAgICAgbm9kZUluZm8udGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRlbXBsYXRlIG5vZGUgYXR0cmlidXRlcyBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogZm9yIG5vZGVzIG9mIGludGVyZXN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlcyhub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgLy8gTWFrZSBjb3B5IG9mIG9yaWdpbmFsIGF0dHJpYnV0ZSBsaXN0LCBzaW5jZSB0aGUgb3JkZXIgbWF5IGNoYW5nZQogICAgICAgIC8vIGFzIGF0dHJpYnV0ZXMgYXJlIGFkZGVkIGFuZCByZW1vdmVkCiAgICAgICAgbGV0IG5vdGVkID0gZmFsc2U7CiAgICAgICAgbGV0IGF0dHJzID0gQXJyYXkuZnJvbShub2RlLmF0dHJpYnV0ZXMpOwogICAgICAgIGZvciAobGV0IGk9YXR0cnMubGVuZ3RoLTEsIGE7IChhPWF0dHJzW2ldKTsgaS0tKSB7CiAgICAgICAgICBub3RlZCA9IHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIGEubmFtZSwgYS52YWx1ZSkgfHwgbm90ZWQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub3RlZDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFBhcnNlcyBhIHNpbmdsZSB0ZW1wbGF0ZSBub2RlIGF0dHJpYnV0ZSBhbmQgYWRkcyBub2RlIG1ldGFkYXRhIHRvCiAgICAgICAqIGBub2RlSW5mb2AgZm9yIGF0dHJpYnV0ZXMgb2YgaW50ZXJlc3QuCiAgICAgICAqCiAgICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gYWRkcyBtZXRhZGF0YSBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiBhbmQgYGlkYCBhdHRyaWJ1dGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBuYW1lLCB2YWx1ZSkgewogICAgICAgIC8vIGV2ZW50cyAob24tKikKICAgICAgICBpZiAobmFtZS5zbGljZSgwLCAzKSA9PT0gJ29uLScpIHsKICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzID0gbm9kZUluZm8uZXZlbnRzIHx8IFtdOwogICAgICAgICAgbm9kZUluZm8uZXZlbnRzLnB1c2goewogICAgICAgICAgICBuYW1lOiBuYW1lLnNsaWNlKDMpLAogICAgICAgICAgICB2YWx1ZQogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gc3RhdGljIGlkCiAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gJ2lkJykgewogICAgICAgICAgbm9kZUluZm8uaWQgPSB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBgY29udGVudGAgZG9jdW1lbnQgZnJhZ21lbnQgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEZvciBuZXN0ZWQgdGVtcGxhdGVzLCBQb2x5bWVyIHBlcmZvcm1zIGFuIG9wdGltaXphdGlvbiB0byBjYWNoZSBuZXN0ZWQKICAgICAgICogdGVtcGxhdGUgY29udGVudCB0byBhdm9pZCB0aGUgY29zdCBvZiBjbG9uaW5nIGRlZXBseSBuZXN0ZWQgdGVtcGxhdGVzLgogICAgICAgKiBUaGlzIG1ldGhvZCByZXRyaWV2ZXMgdGhlIGNhY2hlZCBjb250ZW50IGZvciBhIGdpdmVuIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHJldHJpZXZlIGBjb250ZW50YCBmb3IKICAgICAgICogQHJldHVybiB7RG9jdW1lbnRGcmFnbWVudH0gQ29udGVudCBmcmFnbWVudAogICAgICAgKi8KICAgICAgc3RhdGljIF9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50V2l0aEluZm99ICovICh0ZW1wbGF0ZSkuX3RlbXBsYXRlSW5mbzsKICAgICAgICByZXR1cm4gKHRlbXBsYXRlSW5mbyAmJiB0ZW1wbGF0ZUluZm8uY29udGVudCkgfHwgdGVtcGxhdGUuY29udGVudDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsb25lcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgY29udGVudCBhbmQgcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50CiAgICAgICAqIGNvbnRhaW5pbmcgdGhlIGNsb25lZCBkb20uCiAgICAgICAqCiAgICAgICAqIFRoZSB0ZW1wbGF0ZSBpcyBwYXJzZWQgKG9uY2UgYW5kIG1lbW9pemVkKSB1c2luZyB0aGlzIGxpYnJhcnkncwogICAgICAgKiB0ZW1wbGF0ZSBwYXJzaW5nIGZlYXR1cmVzLCBhbmQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyB2YWx1ZS1hZGRlZAogICAgICAgKiBmZWF0dXJlczoKICAgICAgICogKiBBZGRzIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgKiAqIEdlbmVyYXRlcyBhbiAiaWQgbWFwIiBmb3IgYWxsIG5vZGVzIHdpdGggaWQncyB1bmRlciBgJGAgb24gcmV0dXJuZWQKICAgICAgICogICBkb2N1bWVudCBmcmFnbWVudAogICAgICAgKiAqIFBhc3NlcyB0ZW1wbGF0ZSBpbmZvIGluY2x1ZGluZyBgY29udGVudGAgYmFjayB0byB0ZW1wbGF0ZXMgYXMKICAgICAgICogICBgX3RlbXBsYXRlSW5mb2AgKGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRvIGF2b2lkIGRlZXAgdGVtcGxhdGUKICAgICAgICogICBjbG9uaW5nKQogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgdGhlIG1lbW9pemVkIHRlbXBsYXRlIHBhcnNpbmcgcHJvY2VzcyBpcyBkZXN0cnVjdGl2ZSB0byB0aGUKICAgICAgICogdGVtcGxhdGU6IGF0dHJpYnV0ZXMgZm9yIGJpbmRpbmdzIGFuZCBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgYXJlCiAgICAgICAqIHJlbW92ZWQgYWZ0ZXIgYmVpbmcgbm90ZWQgaW4gbm90ZXMsIGFuZCBhbnkgbmVzdGVkIGA8dGVtcGxhdGU+LmNvbnRlbnRgCiAgICAgICAqIGlzIHJlbW92ZWQgYW5kIHN0b3JlZCBpbiBub3RlcyBhcyB3ZWxsLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBQb2x5ZmlsbCBzdXBwb3J0OiBib290c3RyYXAgdGhlIHRlbXBsYXRlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuCiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5jb250ZW50ICYmCiAgICAgICAgICAgIHdpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50ICYmIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUpIHsKICAgICAgICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUodGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IG5vZGVJbmZvID0gdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdDsKICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50IHx8IHRlbXBsYXRlLmNvbnRlbnQ7CiAgICAgICAgbGV0IGRvbSA9IC8qKiBAdHlwZSB7RG9jdW1lbnRGcmFnbWVudH0gKi8gKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIC8vIE5PVEU6IFNoYWR5RG9tIG9wdGltaXphdGlvbiBpbmRpY2F0aW5nIHRoZXJlIGlzIGFuIGluc2VydGlvbiBwb2ludAogICAgICAgIGRvbS5fX25vSW5zZXJ0aW9uUG9pbnQgPSAhdGVtcGxhdGVJbmZvLmhhc0luc2VydGlvblBvaW50OwogICAgICAgIGxldCBub2RlcyA9IGRvbS5ub2RlTGlzdCA9IG5ldyBBcnJheShub2RlSW5mby5sZW5ndGgpOwogICAgICAgIGRvbS4kID0ge307CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPW5vZGVJbmZvLmxlbmd0aCwgaW5mbzsgKGk8bCkgJiYgKGluZm89bm9kZUluZm9baV0pOyBpKyspIHsKICAgICAgICAgIGxldCBub2RlID0gbm9kZXNbaV0gPSBmaW5kVGVtcGxhdGVOb2RlKGRvbSwgaW5mbyk7CiAgICAgICAgICBhcHBseUlkVG9NYXAodGhpcywgZG9tLiQsIG5vZGUsIGluZm8pOwogICAgICAgICAgYXBwbHlUZW1wbGF0ZUNvbnRlbnQodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgICBhcHBseUV2ZW50TGlzdGVuZXIodGhpcywgbm9kZSwgaW5mbyk7CiAgICAgICAgfQogICAgICAgIGRvbSA9IC8qKiBAdHlwZSB7IVN0YW1wZWRUZW1wbGF0ZX0gKi8oZG9tKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIGJ5IG1ldGhvZCBuYW1lIGZvciB0aGUgZXZlbnQgcHJvdmlkZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyBhIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBsb29rcyB1cCB0aGUgbWV0aG9kCiAgICAgICAqIG5hbWUgYXQgaGFuZGxpbmcgdGltZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBtZXRob2QKICAgICAgICogQHBhcmFtIHsqPX0gY29udGV4dCBDb250ZXh0IHRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gKGRlZmF1bHRzCiAgICAgICAqICAgdG8gYG5vZGVgKQogICAgICAgKiBAcmV0dXJuIHtGdW5jdGlvbn0gR2VuZXJhdGVkIGhhbmRsZXIgZnVuY3Rpb24KICAgICAgICovCiAgICAgIF9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSwgY29udGV4dCkgewogICAgICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IG5vZGU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBjcmVhdGVOb2RlRXZlbnRIYW5kbGVyKGNvbnRleHQsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSk7CiAgICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIHJldHVybiBoYW5kbGVyOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byBhZGQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIHJlbW92ZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3JlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gVGVtcGxhdGVTdGFtcDsKCiAgfSk7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvKiogQGNvbnN0IHtPYmplY3R9ICovCiAgY29uc3QgQ2FzZU1hcCA9IFBvbHltZXIuQ2FzZU1hcDsKCiAgLy8gTW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIHVuaXF1ZSBJRCB1c2VkIGZvciBkZS1kdXBpbmcgZWZmZWN0cyB0cmlnZ2VyZWQKICAvLyBmcm9tIG11bHRpcGxlIHByb3BlcnRpZXMgaW4gdGhlIHNhbWUgdHVybgogIGxldCBkZWR1cGVJZCA9IDA7CgogIC8qKgogICAqIFByb3BlcnR5IGVmZmVjdCB0eXBlczsgZWZmZWN0cyBhcmUgc3RvcmVkIG9uIHRoZSBwcm90b3R5cGUgdXNpbmcgdGhlc2Uga2V5cwogICAqIEBlbnVtIHtzdHJpbmd9CiAgICovCiAgY29uc3QgVFlQRVMgPSB7CiAgICBDT01QVVRFOiAnX19jb21wdXRlRWZmZWN0cycsCiAgICBSRUZMRUNUOiAnX19yZWZsZWN0RWZmZWN0cycsCiAgICBOT1RJRlk6ICdfX25vdGlmeUVmZmVjdHMnLAogICAgUFJPUEFHQVRFOiAnX19wcm9wYWdhdGVFZmZlY3RzJywKICAgIE9CU0VSVkU6ICdfX29ic2VydmVFZmZlY3RzJywKICAgIFJFQURfT05MWTogJ19fcmVhZE9ubHknCiAgfTsKCiAgLyoqIEBjb25zdCB7UmVnRXhwfSAqLwogIGNvbnN0IGNhcGl0YWxBdHRyaWJ1dGVSZWdleCA9IC9bQS1aXS87CgogIC8qKgogICAqIEB0eXBlZGVmIHt7CiAgICogbmFtZTogKHN0cmluZyB8IHVuZGVmaW5lZCksCiAgICogc3RydWN0dXJlZDogKGJvb2xlYW4gfCB1bmRlZmluZWQpLAogICAqIHdpbGRjYXJkOiAoYm9vbGVhbiB8IHVuZGVmaW5lZCkKICAgKiB9fQogICAqLwogIGxldCBEYXRhVHJpZ2dlcjsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogIC8qKgogICAqIEB0eXBlZGVmIHt7CiAgICogaW5mbzogPywKICAgKiB0cmlnZ2VyOiAoIURhdGFUcmlnZ2VyIHwgdW5kZWZpbmVkKSwKICAgKiBmbjogKCFGdW5jdGlvbiB8IHVuZGVmaW5lZCkKICAgKiB9fQogICAqLwogIGxldCBEYXRhRWZmZWN0OyAvL2VzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgbGV0IFByb3BlcnR5RWZmZWN0c1R5cGU7IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAvKioKICAgKiBFbnN1cmVzIHRoYXQgdGhlIG1vZGVsIGhhcyBhbiBvd24tcHJvcGVydHkgbWFwIG9mIGVmZmVjdHMgZm9yIHRoZSBnaXZlbiB0eXBlLgogICAqIFRoZSBtb2RlbCBtYXkgYmUgYSBwcm90b3R5cGUgb3IgYW4gaW5zdGFuY2UuCiAgICoKICAgKiBQcm9wZXJ0eSBlZmZlY3RzIGFyZSBzdG9yZWQgYXMgYXJyYXlzIG9mIGVmZmVjdHMgYnkgcHJvcGVydHkgaW4gYSBtYXAsCiAgICogYnkgbmFtZWQgdHlwZSBvbiB0aGUgbW9kZWwuIGUuZy4KICAgKgogICAqICAgX19jb21wdXRlRWZmZWN0czogewogICAqICAgICBmb286IFsgLi4uIF0sCiAgICogICAgIGJhcjogWyAuLi4gXQogICAqICAgfQogICAqCiAgICogSWYgdGhlIG1vZGVsIGRvZXMgbm90IHlldCBoYXZlIGFuIGVmZmVjdCBtYXAgZm9yIHRoZSB0eXBlLCBvbmUgaXMgY3JlYXRlZAogICAqIGFuZCByZXR1cm5lZC4gIElmIGl0IGRvZXMsIGJ1dCBpdCBpcyBub3QgYW4gb3duIHByb3BlcnR5IChpLmUuIHRoZQogICAqIHByb3RvdHlwZSBoYWQgZWZmZWN0cyksIHRoZSB0aGUgbWFwIGlzIGRlZXBseSBjbG9uZWQgYW5kIHRoZSBjb3B5IGlzCiAgICogc2V0IG9uIHRoZSBtb2RlbCBhbmQgcmV0dXJuZWQsIHJlYWR5IGZvciBuZXcgZWZmZWN0cyB0byBiZSBhZGRlZC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBQcm9wZXJ0eSBlZmZlY3QgdHlwZQogICAqIEByZXR1cm4ge09iamVjdH0gVGhlIG93bi1wcm9wZXJ0eSBtYXAgb2YgZWZmZWN0cyBmb3IgdGhlIGdpdmVuIHR5cGUKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGVuc3VyZU93bkVmZmVjdE1hcChtb2RlbCwgdHlwZSkgewogICAgbGV0IGVmZmVjdHMgPSBtb2RlbFt0eXBlXTsKICAgIGlmICghZWZmZWN0cykgewogICAgICBlZmZlY3RzID0gbW9kZWxbdHlwZV0gPSB7fTsKICAgIH0gZWxzZSBpZiAoIW1vZGVsLmhhc093blByb3BlcnR5KHR5cGUpKSB7CiAgICAgIGVmZmVjdHMgPSBtb2RlbFt0eXBlXSA9IE9iamVjdC5jcmVhdGUobW9kZWxbdHlwZV0pOwogICAgICBmb3IgKGxldCBwIGluIGVmZmVjdHMpIHsKICAgICAgICBsZXQgcHJvdG9GeCA9IGVmZmVjdHNbcF07CiAgICAgICAgbGV0IGluc3RGeCA9IGVmZmVjdHNbcF0gPSBBcnJheShwcm90b0Z4Lmxlbmd0aCk7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHByb3RvRngubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGluc3RGeFtpXSA9IHByb3RvRnhbaV07CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gZWZmZWN0czsKICB9CgogIC8vIC0tIGVmZmVjdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBSdW5zIGFsbCBlZmZlY3RzIG9mIGEgZ2l2ZW4gdHlwZSBmb3IgdGhlIGdpdmVuIHNldCBvZiBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogb24gYW4gaW5zdGFuY2UuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB3aXRoIGVmZmVjdHMgdG8gcnVuCiAgICogQHBhcmFtIHtPYmplY3R9IGVmZmVjdHMgT2JqZWN0IG1hcCBvZiBwcm9wZXJ0eS10by1BcnJheSBvZiBlZmZlY3RzCiAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgKiBAcGFyYW0ge09iamVjdD19IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHBhcmFtIHsqPX0gZXh0cmFBcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byBlZmZlY3QgZnVuY3Rpb24KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkVmZmVjdHMoaW5zdCwgZWZmZWN0cywgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICBpZiAoZWZmZWN0cykgewogICAgICBsZXQgcmFuID0gZmFsc2U7CiAgICAgIGxldCBpZCA9IGRlZHVwZUlkKys7CiAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICBpZiAocnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGVmZmVjdHMsIGlkLCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzLCBleHRyYUFyZ3MpKSB7CiAgICAgICAgICByYW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmFuOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgLyoqCiAgICogUnVucyBhIGxpc3Qgb2YgZWZmZWN0cyBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHdpdGggZWZmZWN0cyB0byBydW4KICAgKiBAcGFyYW0ge09iamVjdH0gZWZmZWN0cyBPYmplY3QgbWFwIG9mIHByb3BlcnR5LXRvLUFycmF5IG9mIGVmZmVjdHMKICAgKiBAcGFyYW0ge251bWJlcn0gZGVkdXBlSWQgQ291bnRlciB1c2VkIGZvciBkZS1kdXBpbmcgZWZmZWN0cwogICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIE5hbWUgb2YgY2hhbmdlZCBwcm9wZXJ0eQogICAqIEBwYXJhbSB7Kn0gcHJvcHMgQ2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHsqfSBvbGRQcm9wcyBPbGQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHBhcmFtIHsqPX0gZXh0cmFBcmdzIEFkZGl0aW9uYWwgbWV0YWRhdGEgdG8gcGFzcyB0byBlZmZlY3QgZnVuY3Rpb24KICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkVmZmVjdHNGb3JQcm9wZXJ0eShpbnN0LCBlZmZlY3RzLCBkZWR1cGVJZCwgcHJvcCwgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICBsZXQgcmFuID0gZmFsc2U7CiAgICBsZXQgcm9vdFByb3BlcnR5ID0gaGFzUGF0aHMgPyBQb2x5bWVyLlBhdGgucm9vdChwcm9wKSA6IHByb3A7CiAgICBsZXQgZnhzID0gZWZmZWN0c1tyb290UHJvcGVydHldOwogICAgaWYgKGZ4cykgewogICAgICBmb3IgKGxldCBpPTAsIGw9ZnhzLmxlbmd0aCwgZng7IChpPGwpICYmIChmeD1meHNbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKCFmeC5pbmZvIHx8IGZ4LmluZm8ubGFzdFJ1biAhPT0gZGVkdXBlSWQpICYmCiAgICAgICAgICAgICghaGFzUGF0aHMgfHwgcGF0aE1hdGNoZXNUcmlnZ2VyKHByb3AsIGZ4LnRyaWdnZXIpKSkgewogICAgICAgICAgaWYgKGZ4LmluZm8pIHsKICAgICAgICAgICAgZnguaW5mby5sYXN0UnVuID0gZGVkdXBlSWQ7CiAgICAgICAgICB9CiAgICAgICAgICBmeC5mbihpbnN0LCBwcm9wLCBwcm9wcywgb2xkUHJvcHMsIGZ4LmluZm8sIGhhc1BhdGhzLCBleHRyYUFyZ3MpOwogICAgICAgICAgcmFuID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiByYW47CiAgfQoKICAvKioKICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBwcm9wZXJ0eS9wYXRoIHRoYXQgaGFzIGNoYW5nZWQgbWF0Y2hlcyB0aGUgdHJpZ2dlcgogICAqIGNyaXRlcmlhIGZvciBhbiBlZmZlY3QuICBBIHRyaWdnZXIgaXMgYSBkZXNjcmlwdG9yIHdpdGggdGhlIGZvbGxvd2luZwogICAqIHN0cnVjdHVyZSwgd2hpY2ggbWF0Y2hlcyB0aGUgZGVzY3JpcHRvcnMgcmV0dXJuZWQgZnJvbSBgcGFyc2VBcmdgLgogICAqIGUuZy4gZm9yIGBmb28uYmFyLipgOgogICAqIGBgYAogICAqIHRyaWdnZXI6IHsKICAgKiAgIG5hbWU6ICdhLmInLAogICAqICAgc3RydWN0dXJlZDogdHJ1ZSwKICAgKiAgIHdpbGRjYXJkOiB0cnVlCiAgICogfQogICAqIGBgYAogICAqIElmIG5vIHRyaWdnZXIgaXMgZ2l2ZW4sIHRoZSBwYXRoIGlzIGRlZW1lZCB0byBtYXRjaC4KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggb3IgcHJvcGVydHkgdGhhdCBjaGFuZ2VkCiAgICogQHBhcmFtIHtEYXRhVHJpZ2dlcn0gdHJpZ2dlciBEZXNjcmlwdG9yCiAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcGF0aCBtYXRjaGVkIHRoZSB0cmlnZ2VyCiAgICovCiAgZnVuY3Rpb24gcGF0aE1hdGNoZXNUcmlnZ2VyKHBhdGgsIHRyaWdnZXIpIHsKICAgIGlmICh0cmlnZ2VyKSB7CiAgICAgIGxldCB0cmlnZ2VyUGF0aCA9IHRyaWdnZXIubmFtZTsKICAgICAgcmV0dXJuICh0cmlnZ2VyUGF0aCA9PSBwYXRoKSB8fAogICAgICAgICh0cmlnZ2VyLnN0cnVjdHVyZWQgJiYgUG9seW1lci5QYXRoLmlzQW5jZXN0b3IodHJpZ2dlclBhdGgsIHBhdGgpKSB8fAogICAgICAgICh0cmlnZ2VyLndpbGRjYXJkICYmIFBvbHltZXIuUGF0aC5pc0Rlc2NlbmRhbnQodHJpZ2dlclBhdGgsIHBhdGgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgLyoqCiAgICogSW1wbGVtZW50cyB0aGUgIm9ic2VydmVyIiBlZmZlY3QuCiAgICoKICAgKiBDYWxscyB0aGUgbWV0aG9kIHdpdGggYGluZm8ubWV0aG9kTmFtZWAgb24gdGhlIGluc3RhbmNlLCBwYXNzaW5nIHRoZQogICAqIG5ldyBhbmQgb2xkIHZhbHVlcy4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuT2JzZXJ2ZXJFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgbGV0IGZuID0gdHlwZW9mIGluZm8ubWV0aG9kID09PSAic3RyaW5nIiA/IGluc3RbaW5mby5tZXRob2RdIDogaW5mby5tZXRob2Q7CiAgICBsZXQgY2hhbmdlZFByb3AgPSBpbmZvLnByb3BlcnR5OwogICAgaWYgKGZuKSB7CiAgICAgIGZuLmNhbGwoaW5zdCwgaW5zdC5fX2RhdGFbY2hhbmdlZFByb3BdLCBvbGRQcm9wc1tjaGFuZ2VkUHJvcF0pOwogICAgfSBlbHNlIGlmICghaW5mby5keW5hbWljRm4pIHsKICAgICAgY29uc29sZS53YXJuKCdvYnNlcnZlciBtZXRob2QgYCcgKyBpbmZvLm1ldGhvZCArICdgIG5vdCBkZWZpbmVkJyk7CiAgICB9CiAgfQoKICAvKioKICAgKiBSdW5zICJub3RpZnkiIGVmZmVjdHMgZm9yIGEgc2V0IG9mIGNoYW5nZWQgcHJvcGVydGllcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSB0aGUgZ2VuZXJpYyBgcnVuRWZmZWN0c2AgbWV0aG9kIGluIHRoYXQgaXQKICAgKiB3aWxsIGRpc3BhdGNoIHBhdGggbm90aWZpY2F0aW9uIGV2ZW50cyBpbiB0aGUgY2FzZSB0aGF0IHRoZSBwcm9wZXJ0eQogICAqIGNoYW5nZWQgd2FzIGEgcGF0aCBhbmQgdGhlIHJvb3QgcHJvcGVydHkgZm9yIHRoYXQgcGF0aCBkaWRuJ3QgaGF2ZSBhCiAgICogIm5vdGlmeSIgZWZmZWN0LiAgVGhpcyBpcyB0byBtYWludGFpbiAxLjAgYmVoYXZpb3IgdGhhdCBkaWQgbm90IHJlcXVpcmUKICAgKiBgbm90aWZ5OiB0cnVlYCB0byBlbnN1cmUgb2JqZWN0IHN1Yi1wcm9wZXJ0eSBub3RpZmljYXRpb25zIHdlcmUKICAgKiBzZW50LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2l0aCBlZmZlY3RzIHRvIHJ1bgogICAqIEBwYXJhbSB7T2JqZWN0fSBub3RpZnlQcm9wcyBCYWcgb2YgcHJvcGVydGllcyB0byBub3RpZnkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bk5vdGlmeUVmZmVjdHMoaW5zdCwgbm90aWZ5UHJvcHMsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgIC8vIE5vdGlmeQogICAgbGV0IGZ4cyA9IGluc3RbVFlQRVMuTk9USUZZXTsKICAgIGxldCBub3RpZmllZDsKICAgIGxldCBpZCA9IGRlZHVwZUlkKys7CiAgICAvLyBUcnkgbm9ybWFsIG5vdGlmeSBlZmZlY3RzOyBpZiBub25lLCBmYWxsIGJhY2sgdG8gdHJ5IHBhdGggbm90aWZpY2F0aW9uCiAgICBmb3IgKGxldCBwcm9wIGluIG5vdGlmeVByb3BzKSB7CiAgICAgIGlmIChub3RpZnlQcm9wc1twcm9wXSkgewogICAgICAgIGlmIChmeHMgJiYgcnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGZ4cywgaWQsIHByb3AsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpKSB7CiAgICAgICAgICBub3RpZmllZCA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmIChoYXNQYXRocyAmJiBub3RpZnlQYXRoKGluc3QsIHByb3AsIHByb3BzKSkgewogICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLy8gRmx1c2ggaG9zdCBpZiB3ZSBhY3R1YWxseSBub3RpZmllZCBhbmQgaG9zdCB3YXMgYmF0Y2hpbmcKICAgIC8vIEFuZCB0aGUgaG9zdCBoYXMgYWxyZWFkeSBpbml0aWFsaXplZCBjbGllbnRzOyB0aGlzIHByZXZlbnRzCiAgICAvLyBhbiBpc3N1ZSB3aXRoIGEgaG9zdCBvYnNlcnZpbmcgZGF0YSBjaGFuZ2VzIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgIGxldCBob3N0OwogICAgaWYgKG5vdGlmaWVkICYmIChob3N0ID0gaW5zdC5fX2RhdGFIb3N0KSAmJiBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcykgewogICAgICBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgfQogIH0KCiAgLyoqCiAgICogRGlzcGF0Y2hlcyB7cHJvcGVydHl9LWNoYW5nZWQgZXZlbnRzIHdpdGggcGF0aCBpbmZvcm1hdGlvbiBpbiB0aGUgZGV0YWlsCiAgICogb2JqZWN0IHRvIGluZGljYXRlIGEgc3ViLXBhdGggb2YgdGhlIHByb3BlcnR5IHdhcyBjaGFuZ2VkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggdGhhdCB3YXMgY2hhbmdlZAogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwYXRoIHdhcyBub3RpZmllZAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5UGF0aChpbnN0LCBwYXRoLCBwcm9wcykgewogICAgbGV0IHJvb3RQcm9wZXJ0eSA9IFBvbHltZXIuUGF0aC5yb290KHBhdGgpOwogICAgaWYgKHJvb3RQcm9wZXJ0eSAhPT0gcGF0aCkgewogICAgICBsZXQgZXZlbnROYW1lID0gUG9seW1lci5DYXNlTWFwLmNhbWVsVG9EYXNoQ2FzZShyb290UHJvcGVydHkpICsgJy1jaGFuZ2VkJzsKICAgICAgZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHByb3BzW3BhdGhdLCBwYXRoKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICAvKioKICAgKiBEaXNwYXRjaGVzIHtwcm9wZXJ0eX0tY2hhbmdlZCBldmVudHMgdG8gaW5kaWNhdGUgYSBwcm9wZXJ0eSAob3IgcGF0aCkKICAgKiBjaGFuZ2VkLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50CiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gc2VuZCAoJ3twcm9wZXJ0eX0tY2hhbmdlZCcpCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIGNoYW5nZWQgcHJvcGVydHkKICAgKiBAcGFyYW0ge3N0cmluZyB8IG51bGwgfCB1bmRlZmluZWR9IHBhdGggSWYgYSBzdWItcGF0aCBvZiB0aGlzIHByb3BlcnR5IGNoYW5nZWQsIHRoZSBwYXRoCiAgICogICB0aGF0IGNoYW5nZWQgKG9wdGlvbmFsKS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICovCiAgZnVuY3Rpb24gZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHZhbHVlLCBwYXRoKSB7CiAgICBsZXQgZGV0YWlsID0gewogICAgICB2YWx1ZTogdmFsdWUsCiAgICAgIHF1ZXVlUHJvcGVydHk6IHRydWUKICAgIH07CiAgICBpZiAocGF0aCkgewogICAgICBkZXRhaWwucGF0aCA9IHBhdGg7CiAgICB9CiAgICAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oaW5zdCkuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGRldGFpbCB9KSk7CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAibm90aWZ5IiBlZmZlY3QuCiAgICoKICAgKiBEaXNwYXRjaGVzIGEgbm9uLWJ1YmJsaW5nIGV2ZW50IG5hbWVkIGBpbmZvLmV2ZW50TmFtZWAgb24gdGhlIGluc3RhbmNlCiAgICogd2l0aCBhIGRldGFpbCBvYmplY3QgY29udGFpbmluZyB0aGUgbmV3IGB2YWx1ZWAuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5Ob3RpZnlFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMpIHsKICAgIGxldCByb290UHJvcGVydHkgPSBoYXNQYXRocyA/IFBvbHltZXIuUGF0aC5yb290KHByb3BlcnR5KSA6IHByb3BlcnR5OwogICAgbGV0IHBhdGggPSByb290UHJvcGVydHkgIT0gcHJvcGVydHkgPyBwcm9wZXJ0eSA6IG51bGw7CiAgICBsZXQgdmFsdWUgPSBwYXRoID8gUG9seW1lci5QYXRoLmdldChpbnN0LCBwYXRoKSA6IGluc3QuX19kYXRhW3Byb3BlcnR5XTsKICAgIGlmIChwYXRoICYmIHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgdmFsdWUgPSBwcm9wc1twcm9wZXJ0eV07ICAvLyBzcGVjaWZpY2FsbHkgZm9yIC5zcGxpY2VzCiAgICB9CiAgICBkaXNwYXRjaE5vdGlmeUV2ZW50KGluc3QsIGluZm8uZXZlbnROYW1lLCB2YWx1ZSwgcGF0aCk7CiAgfQoKICAvKioKICAgKiBIYW5kbGVyIGZ1bmN0aW9uIGZvciAyLXdheSBub3RpZmljYXRpb24gZXZlbnRzLiBSZWNlaXZlcyBjb250ZXh0CiAgICogaW5mb3JtYXRpb24gY2FwdHVyZWQgaW4gdGhlIGBhZGROb3RpZnlMaXN0ZW5lcmAgY2xvc3VyZSBmcm9tIHRoZQogICAqIGBfX25vdGlmeUxpc3RlbmVyc2AgbWV0YWRhdGEuCiAgICoKICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbm90aWZpZWQgcHJvcGVydHkgdG8gdGhlIGhvc3QgcHJvcGVydHkgb3IgcGF0aC4gIElmCiAgICogdGhlIGV2ZW50IGNvbnRhaW5lZCBwYXRoIGluZm9ybWF0aW9uLCB0cmFuc2xhdGUgdGhhdCBwYXRoIHRvIHRoZSBob3N0CiAgICogc2NvcGUncyBuYW1lIGZvciB0aGF0IHBhdGggZmlyc3QuCiAgICoKICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCBOb3RpZmljYXRpb24gZXZlbnQgKGUuZy4gJzxwcm9wZXJ0eT4tY2hhbmdlZCcpCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBIb3N0IGVsZW1lbnQgaW5zdGFuY2UgaGFuZGxpbmcgdGhlIG5vdGlmaWNhdGlvbiBldmVudAogICAqIEBwYXJhbSB7c3RyaW5nfSBmcm9tUHJvcCBDaGlsZCBlbGVtZW50IHByb3BlcnR5IHRoYXQgd2FzIGJvdW5kCiAgICogQHBhcmFtIHtzdHJpbmd9IHRvUGF0aCBIb3N0IHByb3BlcnR5L3BhdGggdGhhdCB3YXMgYm91bmQKICAgKiBAcGFyYW0ge2Jvb2xlYW59IG5lZ2F0ZSBXaGV0aGVyIHRoZSBiaW5kaW5nIHdhcyBuZWdhdGVkCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGhhbmRsZU5vdGlmaWNhdGlvbihldmVudCwgaW5zdCwgZnJvbVByb3AsIHRvUGF0aCwgbmVnYXRlKSB7CiAgICBsZXQgdmFsdWU7CiAgICBsZXQgZGV0YWlsID0gLyoqIEB0eXBlIHtPYmplY3R9ICovKGV2ZW50LmRldGFpbCk7CiAgICBsZXQgZnJvbVBhdGggPSBkZXRhaWwgJiYgZGV0YWlsLnBhdGg7CiAgICBpZiAoZnJvbVBhdGgpIHsKICAgICAgdG9QYXRoID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShmcm9tUHJvcCwgdG9QYXRoLCBmcm9tUGF0aCk7CiAgICAgIHZhbHVlID0gZGV0YWlsICYmIGRldGFpbC52YWx1ZTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbHVlID0gZXZlbnQuY3VycmVudFRhcmdldFtmcm9tUHJvcF07CiAgICB9CiAgICB2YWx1ZSA9IG5lZ2F0ZSA/ICF2YWx1ZSA6IHZhbHVlOwogICAgaWYgKCFpbnN0W1RZUEVTLlJFQURfT05MWV0gfHwgIWluc3RbVFlQRVMuUkVBRF9PTkxZXVt0b1BhdGhdKSB7CiAgICAgIGlmIChpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgodG9QYXRoLCB2YWx1ZSwgdHJ1ZSwgQm9vbGVhbihmcm9tUGF0aCkpCiAgICAgICAgJiYgKCFkZXRhaWwgfHwgIWRldGFpbC5xdWV1ZVByb3BlcnR5KSkgewogICAgICAgIGluc3QuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIEltcGxlbWVudHMgdGhlICJyZWZsZWN0IiBlZmZlY3QuCiAgICoKICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYGluZm8uYXR0ck5hbWVgIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSB2YWx1ZS4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcnVuUmVmbGVjdEVmZmVjdChpbnN0LCBwcm9wZXJ0eSwgcHJvcHMsIG9sZFByb3BzLCBpbmZvKSB7CiAgICBsZXQgdmFsdWUgPSBpbnN0Ll9fZGF0YVtwcm9wZXJ0eV07CiAgICBpZiAoUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlKSB7CiAgICAgIHZhbHVlID0gUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlKHZhbHVlLCBpbmZvLmF0dHJOYW1lLCAnYXR0cmlidXRlJywgLyoqIEB0eXBlIHtOb2RlfSAqLyhpbnN0KSk7CiAgICB9CiAgICBpbnN0Ll9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBpbmZvLmF0dHJOYW1lLCB2YWx1ZSk7CiAgfQoKICAvKioKICAgKiBSdW5zICJjb21wdXRlZCIgZWZmZWN0cyBmb3IgYSBzZXQgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzLgogICAqCiAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIHRoZSBnZW5lcmljIGBydW5FZmZlY3RzYCBtZXRob2QgaW4gdGhhdCBpdAogICAqIGNvbnRpbnVlcyB0byBydW4gY29tcHV0ZWQgZWZmZWN0cyBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIGVhY2ggcGFzcyB1bnRpbAogICAqIHRoZXJlIGFyZSBubyBtb3JlIG5ld2x5IGNvbXB1dGVkIHByb3BlcnRpZXMuICBUaGlzIGVuc3VyZXMgdGhhdCBhbGwKICAgKiBwcm9wZXJ0aWVzIHRoYXQgd2lsbCBiZSBjb21wdXRlZCBieSB0aGUgaW5pdGlhbCBzZXQgb2YgY2hhbmdlcyBhcmUKICAgKiBjb21wdXRlZCBiZWZvcmUgb3RoZXIgZWZmZWN0cyAoYmluZGluZyBwcm9wYWdhdGlvbiwgb2JzZXJ2ZXJzLCBhbmQgbm90aWZ5KQogICAqIHJ1bi4KICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgKiBAcGFyYW0geyFPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICogQHBhcmFtIHshT2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0cyhpbnN0LCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykgewogICAgbGV0IGNvbXB1dGVFZmZlY3RzID0gaW5zdFtUWVBFUy5DT01QVVRFXTsKICAgIGlmIChjb21wdXRlRWZmZWN0cykgewogICAgICBsZXQgaW5wdXRQcm9wcyA9IGNoYW5nZWRQcm9wczsKICAgICAgd2hpbGUgKHJ1bkVmZmVjdHMoaW5zdCwgY29tcHV0ZUVmZmVjdHMsIGlucHV0UHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykpIHsKICAgICAgICBPYmplY3QuYXNzaWduKG9sZFByb3BzLCBpbnN0Ll9fZGF0YU9sZCk7CiAgICAgICAgT2JqZWN0LmFzc2lnbihjaGFuZ2VkUHJvcHMsIGluc3QuX19kYXRhUGVuZGluZyk7CiAgICAgICAgaW5wdXRQcm9wcyA9IGluc3QuX19kYXRhUGVuZGluZzsKICAgICAgICBpbnN0Ll9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAiY29tcHV0ZWQgcHJvcGVydHkiIGVmZmVjdCBieSBydW5uaW5nIHRoZSBtZXRob2Qgd2l0aCB0aGUKICAgKiB2YWx1ZXMgb2YgdGhlIGFyZ3VtZW50cyBzcGVjaWZpZWQgaW4gdGhlIGBpbmZvYCBvYmplY3QgYW5kIHNldHRpbmcgdGhlCiAgICogcmV0dXJuIHZhbHVlIHRvIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBzcGVjaWZpZWQuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8pIHsKICAgIGxldCByZXN1bHQgPSBydW5NZXRob2RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbyk7CiAgICBsZXQgY29tcHV0ZWRQcm9wID0gaW5mby5tZXRob2RJbmZvOwogICAgaWYgKGluc3QuX19kYXRhSGFzQWNjZXNzb3IgJiYgaW5zdC5fX2RhdGFIYXNBY2Nlc3Nvcltjb21wdXRlZFByb3BdKSB7CiAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eShjb21wdXRlZFByb3AsIHJlc3VsdCwgdHJ1ZSk7CiAgICB9IGVsc2UgewogICAgICBpbnN0W2NvbXB1dGVkUHJvcF0gPSByZXN1bHQ7CiAgICB9CiAgfQoKICAvKioKICAgKiBDb21wdXRlcyBwYXRoIGNoYW5nZXMgYmFzZWQgb24gcGF0aCBsaW5rcyBzZXQgdXAgdXNpbmcgdGhlIGBsaW5rUGF0aHNgCiAgICogQVBJLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugd2hvc2UgcHJvcHMgYXJlIGNoYW5naW5nCiAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8KHN0cmluZ3xudW1iZXIpPn0gcGF0aCBQYXRoIHRoYXQgaGFzIGNoYW5nZWQKICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIGNoYW5nZWQgcGF0aAogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBjb21wdXRlTGlua2VkUGF0aHMoaW5zdCwgcGF0aCwgdmFsdWUpIHsKICAgIGxldCBsaW5rcyA9IGluc3QuX19kYXRhTGlua2VkUGF0aHM7CiAgICBpZiAobGlua3MpIHsKICAgICAgbGV0IGxpbms7CiAgICAgIGZvciAobGV0IGEgaW4gbGlua3MpIHsKICAgICAgICBsZXQgYiA9IGxpbmtzW2FdOwogICAgICAgIGlmIChQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KGEsIHBhdGgpKSB7CiAgICAgICAgICBsaW5rID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShhLCBiLCBwYXRoKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfSBlbHNlIGlmIChQb2x5bWVyLlBhdGguaXNEZXNjZW5kYW50KGIsIHBhdGgpKSB7CiAgICAgICAgICBsaW5rID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZShiLCBhLCBwYXRoKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyAtLSBiaW5kaW5ncyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogIC8qKgogICAqIEFkZHMgYmluZGluZyBtZXRhZGF0YSB0byB0aGUgY3VycmVudCBgbm9kZUluZm9gLCBhbmQgYmluZGluZyBlZmZlY3RzCiAgICogZm9yIGFsbCBwYXJ0IGRlcGVuZGVuY2llcyB0byBgdGVtcGxhdGVJbmZvYC4KICAgKgogICAqIEBwYXJhbSB7RnVuY3Rpb259IGNvbnN0cnVjdG9yIENsYXNzIHRoYXQgYF9wYXJzZVRlbXBsYXRlYCBpcyBjdXJyZW50bHkKICAgKiAgIHJ1bm5pbmcgb24KICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICogQHBhcmFtIHtzdHJpbmd9IGtpbmQgQmluZGluZyBraW5kLCBlaXRoZXIgJ3Byb3BlcnR5JywgJ2F0dHJpYnV0ZScsIG9yICd0ZXh0JwogICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgVGFyZ2V0IHByb3BlcnR5IG5hbWUKICAgKiBAcGFyYW0geyFBcnJheTwhQmluZGluZ1BhcnQ+fSBwYXJ0cyBBcnJheSBvZiBiaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0ge3N0cmluZz19IGxpdGVyYWwgTGl0ZXJhbCB0ZXh0IHN1cnJvdW5kaW5nIGJpbmRpbmcgcGFydHMgKHNwZWNpZmllZAogICAqICAgb25seSBmb3IgJ3Byb3BlcnR5JyBiaW5kaW5ncywgc2luY2UgdGhlc2UgbXVzdCBiZSBpbml0aWFsaXplZCBhcyBwYXJ0CiAgICogICBvZiBib290LXVwKQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhZGRCaW5kaW5nKGNvbnN0cnVjdG9yLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBraW5kLCB0YXJnZXQsIHBhcnRzLCBsaXRlcmFsKSB7CiAgICAvLyBDcmVhdGUgYmluZGluZyBtZXRhZGF0YSBhbmQgYWRkIHRvIG5vZGVJbmZvCiAgICBub2RlSW5mby5iaW5kaW5ncyA9IG5vZGVJbmZvLmJpbmRpbmdzIHx8IFtdOwogICAgbGV0IC8qKiBCaW5kaW5nICovIGJpbmRpbmcgPSB7IGtpbmQsIHRhcmdldCwgcGFydHMsIGxpdGVyYWwsIGlzQ29tcG91bmQ6IChwYXJ0cy5sZW5ndGggIT09IDEpIH07CiAgICBub2RlSW5mby5iaW5kaW5ncy5wdXNoKGJpbmRpbmcpOwogICAgLy8gQWRkIGxpc3RlbmVyIGluZm8gdG8gYmluZGluZyBtZXRhZGF0YQogICAgaWYgKHNob3VsZEFkZExpc3RlbmVyKGJpbmRpbmcpKSB7CiAgICAgIGxldCB7ZXZlbnQsIG5lZ2F0ZX0gPSBiaW5kaW5nLnBhcnRzWzBdOwogICAgICBiaW5kaW5nLmxpc3RlbmVyRXZlbnQgPSBldmVudCB8fCAoQ2FzZU1hcC5jYW1lbFRvRGFzaENhc2UodGFyZ2V0KSArICctY2hhbmdlZCcpOwogICAgICBiaW5kaW5nLmxpc3RlbmVyTmVnYXRlID0gbmVnYXRlOwogICAgfQogICAgLy8gQWRkICJwcm9wYWdhdGUiIHByb3BlcnR5IGVmZmVjdHMgdG8gdGVtcGxhdGVJbmZvCiAgICBsZXQgaW5kZXggPSB0ZW1wbGF0ZUluZm8ubm9kZUluZm9MaXN0Lmxlbmd0aDsKICAgIGZvciAobGV0IGk9MDsgaTxiaW5kaW5nLnBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1tpXTsKICAgICAgcGFydC5jb21wb3VuZEluZGV4ID0gaTsKICAgICAgYWRkRWZmZWN0Rm9yQmluZGluZ1BhcnQoY29uc3RydWN0b3IsIHRlbXBsYXRlSW5mbywgYmluZGluZywgcGFydCwgaW5kZXgpOwogICAgfQogIH0KCiAgLyoqCiAgICogQWRkcyBwcm9wZXJ0eSBlZmZlY3RzIHRvIHRoZSBnaXZlbiBgdGVtcGxhdGVJbmZvYCBmb3IgdGhlIGdpdmVuIGJpbmRpbmcKICAgKiBwYXJ0LgogICAqCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgQ2xhc3MgdGhhdCBgX3BhcnNlVGVtcGxhdGVgIGlzIGN1cnJlbnRseQogICAqICAgcnVubmluZyBvbgogICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggaW50byBgbm9kZUluZm9MaXN0YCBmb3IgdGhpcyBub2RlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBmdW5jdGlvbiBhZGRFZmZlY3RGb3JCaW5kaW5nUGFydChjb25zdHJ1Y3RvciwgdGVtcGxhdGVJbmZvLCBiaW5kaW5nLCBwYXJ0LCBpbmRleCkgewogICAgaWYgKCFwYXJ0LmxpdGVyYWwpIHsKICAgICAgaWYgKGJpbmRpbmcua2luZCA9PT0gJ2F0dHJpYnV0ZScgJiYgYmluZGluZy50YXJnZXRbMF0gPT09ICctJykgewogICAgICAgIGNvbnNvbGUud2FybignQ2Fubm90IHNldCBhdHRyaWJ1dGUgJyArIGJpbmRpbmcudGFyZ2V0ICsKICAgICAgICAgICcgYmVjYXVzZSAiLSIgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlIHN0YXJ0aW5nIGNoYXJhY3RlcicpOwogICAgICB9IGVsc2UgewogICAgICAgIGxldCBkZXBlbmRlbmNpZXMgPSBwYXJ0LmRlcGVuZGVuY2llczsKICAgICAgICBsZXQgaW5mbyA9IHsgaW5kZXgsIGJpbmRpbmcsIHBhcnQsIGV2YWx1YXRvcjogY29uc3RydWN0b3IgfTsKICAgICAgICBmb3IgKGxldCBqPTA7IGo8ZGVwZW5kZW5jaWVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBsZXQgdHJpZ2dlciA9IGRlcGVuZGVuY2llc1tqXTsKICAgICAgICAgIGlmICh0eXBlb2YgdHJpZ2dlciA9PSAnc3RyaW5nJykgewogICAgICAgICAgICB0cmlnZ2VyID0gcGFyc2VBcmcodHJpZ2dlcik7CiAgICAgICAgICAgIHRyaWdnZXIud2lsZGNhcmQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3RydWN0b3IuX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QodGVtcGxhdGVJbmZvLCB0cmlnZ2VyLnJvb3RQcm9wZXJ0eSwgewogICAgICAgICAgICBmbjogcnVuQmluZGluZ0VmZmVjdCwKICAgICAgICAgICAgaW5mbywgdHJpZ2dlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbXBsZW1lbnRzIHRoZSAiYmluZGluZyIgKHByb3BlcnR5L3BhdGggYmluZGluZykgZWZmZWN0LgogICAqCiAgICogTm90ZSB0aGF0IGJpbmRpbmcgc3ludGF4IGlzIG92ZXJyaWRhYmxlIHZpYSBgX3BhcnNlQmluZGluZ3NgIGFuZAogICAqIGBfZXZhbHVhdGVCaW5kaW5nYC4gIFRoaXMgbWV0aG9kIHdpbGwgY2FsbCBgX2V2YWx1YXRlQmluZGluZ2AgZm9yIGFueQogICAqIG5vbi1saXRlcmFsIHBhcnRzIHJldHVybmVkIGZyb20gYF9wYXJzZUJpbmRpbmdzYC4gIEhvd2V2ZXIsCiAgICogdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgX3BhdGhfIGJpbmRpbmdzIHZpYSBjdXN0b20gYmluZGluZyBwYXJ0cywKICAgKiBhcyB0aGlzIGlzIHNwZWNpZmljIHRvIFBvbHltZXIncyBwYXRoIGJpbmRpbmcgc3ludGF4LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2UgdGhlIGVmZmVjdCB3aWxsIGJlIHJ1biBvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAqIEBwYXJhbSB7QXJyYXl9IG5vZGVMaXN0IExpc3Qgb2Ygbm9kZXMgYXNzb2NpYXRlZCB3aXRoIGBub2RlSW5mb0xpc3RgIHRlbXBsYXRlCiAgICogICBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5CaW5kaW5nRWZmZWN0KGluc3QsIHBhdGgsIHByb3BzLCBvbGRQcm9wcywgaW5mbywgaGFzUGF0aHMsIG5vZGVMaXN0KSB7CiAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2luZm8uaW5kZXhdOwogICAgbGV0IGJpbmRpbmcgPSBpbmZvLmJpbmRpbmc7CiAgICBsZXQgcGFydCA9IGluZm8ucGFydDsKICAgIC8vIFN1YnBhdGggbm90aWZpY2F0aW9uOiB0cmFuc2Zvcm0gcGF0aCBhbmQgc2V0IHRvIGNsaWVudAogICAgLy8gZS5nLjogZm9vPSJ7e29iai5zdWJ9fSIsIHBhdGg6ICdvYmouc3ViLnByb3AnLCBzZXQgJ2Zvby5wcm9wJz1vYmouc3ViLnByb3AKICAgIGlmIChoYXNQYXRocyAmJiBwYXJ0LnNvdXJjZSAmJiAocGF0aC5sZW5ndGggPiBwYXJ0LnNvdXJjZS5sZW5ndGgpICYmCiAgICAgICAgKGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSAmJiAhYmluZGluZy5pc0NvbXBvdW5kICYmCiAgICAgICAgbm9kZS5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ICYmCiAgICAgICAgbm9kZS5fX2RhdGFIYXNBY2Nlc3NvciAmJiBub2RlLl9fZGF0YUhhc0FjY2Vzc29yW2JpbmRpbmcudGFyZ2V0XSkgewogICAgICBsZXQgdmFsdWUgPSBwcm9wc1twYXRoXTsKICAgICAgcGF0aCA9IFBvbHltZXIuUGF0aC50cmFuc2xhdGUocGFydC5zb3VyY2UsIGJpbmRpbmcudGFyZ2V0LCBwYXRoKTsKICAgICAgaWYgKG5vZGUuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChwYXRoLCB2YWx1ZSwgZmFsc2UsIHRydWUpKSB7CiAgICAgICAgaW5zdC5fZW5xdWV1ZUNsaWVudChub2RlKTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbGV0IHZhbHVlID0gaW5mby5ldmFsdWF0b3IuX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgLy8gUHJvcGFnYXRlIHZhbHVlIHRvIGNoaWxkCiAgICAgIGFwcGx5QmluZGluZ1ZhbHVlKGluc3QsIG5vZGUsIGJpbmRpbmcsIHBhcnQsIHZhbHVlKTsKICAgIH0KICB9CgogIC8qKgogICAqIFNldHMgdGhlIHZhbHVlIGZvciBhbiAiYmluZGluZyIgKGJpbmRpbmcpIGVmZmVjdCB0byBhIG5vZGUsCiAgICogZWl0aGVyIGFzIGEgcHJvcGVydHkgb3IgYXR0cmlidXRlLgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBUaGUgaW5zdGFuY2Ugb3duaW5nIHRoZSBiaW5kaW5nIGVmZmVjdAogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBUYXJnZXQgbm9kZSBmb3IgYmluZGluZwogICAqIEBwYXJhbSB7IUJpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEBwYXJhbSB7IUJpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGFwcGx5QmluZGluZ1ZhbHVlKGluc3QsIG5vZGUsIGJpbmRpbmcsIHBhcnQsIHZhbHVlKSB7CiAgICB2YWx1ZSA9IGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpOwogICAgaWYgKFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSkgewogICAgICB2YWx1ZSA9IFBvbHltZXIuc2FuaXRpemVET01WYWx1ZSh2YWx1ZSwgYmluZGluZy50YXJnZXQsIGJpbmRpbmcua2luZCwgbm9kZSk7CiAgICB9CiAgICBpZiAoYmluZGluZy5raW5kID09ICdhdHRyaWJ1dGUnKSB7CiAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5nCiAgICAgIGluc3QuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKC8qKiBAdHlwZSB7RWxlbWVudH0gKi8obm9kZSksIHZhbHVlLCBiaW5kaW5nLnRhcmdldCk7CiAgICB9IGVsc2UgewogICAgICAvLyBQcm9wZXJ0eSBiaW5kaW5nCiAgICAgIGxldCBwcm9wID0gYmluZGluZy50YXJnZXQ7CiAgICAgIGlmIChub2RlLl9faXNQcm9wZXJ0eUVmZmVjdHNDbGllbnQgJiYKICAgICAgICAgIG5vZGUuX19kYXRhSGFzQWNjZXNzb3IgJiYgbm9kZS5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wXSkgewogICAgICAgIGlmICghbm9kZVtUWVBFUy5SRUFEX09OTFldIHx8ICFub2RlW1RZUEVTLlJFQURfT05MWV1bcHJvcF0pIHsKICAgICAgICAgIGlmIChub2RlLl9zZXRQZW5kaW5nUHJvcGVydHkocHJvcCwgdmFsdWUpKSB7CiAgICAgICAgICAgIGluc3QuX2VucXVldWVDbGllbnQobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgIHsKICAgICAgICBpbnN0Ll9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qKgogICAqIFRyYW5zZm9ybXMgYW4gImJpbmRpbmciIGVmZmVjdCB2YWx1ZSBiYXNlZCBvbiBjb21wb3VuZCAmIG5lZ2F0aW9uCiAgICogZWZmZWN0IG1ldGFkYXRhLCBhcyB3ZWxsIGFzIGhhbmRsaW5nIGZvciBzcGVjaWFsLWNhc2UgcHJvcGVydGllcwogICAqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvCiAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcGFyYW0geyFCaW5kaW5nUGFydH0gcGFydCBCaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHsqfSBUcmFuc2Zvcm1lZCB2YWx1ZSB0byBzZXQKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpIHsKICAgIGlmIChiaW5kaW5nLmlzQ29tcG91bmQpIHsKICAgICAgbGV0IHN0b3JhZ2UgPSBub2RlLl9fZGF0YUNvbXBvdW5kU3RvcmFnZVtiaW5kaW5nLnRhcmdldF07CiAgICAgIHN0b3JhZ2VbcGFydC5jb21wb3VuZEluZGV4XSA9IHZhbHVlOwogICAgICB2YWx1ZSA9IHN0b3JhZ2Uuam9pbignJyk7CiAgICB9CiAgICBpZiAoYmluZGluZy5raW5kICE9PSAnYXR0cmlidXRlJykgewogICAgICAvLyBTb21lIGJyb3dzZXJzIHNlcmlhbGl6ZSBgdW5kZWZpbmVkYCB0byBgInVuZGVmaW5lZCJgCiAgICAgIGlmIChiaW5kaW5nLnRhcmdldCA9PT0gJ3RleHRDb250ZW50JyB8fAogICAgICAgICAgKGJpbmRpbmcudGFyZ2V0ID09PSAndmFsdWUnICYmCiAgICAgICAgICAgIChub2RlLmxvY2FsTmFtZSA9PT0gJ2lucHV0JyB8fCBub2RlLmxvY2FsTmFtZSA9PT0gJ3RleHRhcmVhJykpKSB7CiAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PSB1bmRlZmluZWQgPyAnJyA6IHZhbHVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gdmFsdWU7CiAgfQoKICAvKioKICAgKiBSZXR1cm5zIHRydWUgaWYgYSBiaW5kaW5nJ3MgbWV0YWRhdGEgbWVldHMgYWxsIHRoZSByZXF1aXJlbWVudHMgdG8gYWxsb3cKICAgKiAyLXdheSBiaW5kaW5nLCBhbmQgdGhlcmVmb3JlIGEgYDxwcm9wZXJ0eT4tY2hhbmdlZGAgZXZlbnQgbGlzdGVuZXIgc2hvdWxkIGJlCiAgICogYWRkZWQ6CiAgICogLSB1c2VkIGN1cmx5IGJyYWNlcwogICAqIC0gaXMgYSBwcm9wZXJ0eSAobm90IGF0dHJpYnV0ZSkgYmluZGluZwogICAqIC0gaXMgbm90IGEgdGV4dENvbnRlbnQgYmluZGluZwogICAqIC0gaXMgbm90IGNvbXBvdW5kCiAgICoKICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIDItd2F5IGxpc3RlbmVyIHNob3VsZCBiZSBhZGRlZAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gc2hvdWxkQWRkTGlzdGVuZXIoYmluZGluZykgewogICAgcmV0dXJuIEJvb2xlYW4oYmluZGluZy50YXJnZXQpICYmCiAgICAgICAgICAgYmluZGluZy5raW5kICE9ICdhdHRyaWJ1dGUnICYmCiAgICAgICAgICAgYmluZGluZy5raW5kICE9ICd0ZXh0JyAmJgogICAgICAgICAgICFiaW5kaW5nLmlzQ29tcG91bmQgJiYKICAgICAgICAgICBiaW5kaW5nLnBhcnRzWzBdLm1vZGUgPT09ICd7JzsKICB9CgogIC8qKgogICAqIFNldHVwIGNvbXBvdW5kIGJpbmRpbmcgc3RvcmFnZSBzdHJ1Y3R1cmVzLCBub3RpZnkgbGlzdGVuZXJzLCBhbmQgZGF0YUhvc3QKICAgKiByZWZlcmVuY2VzIG9udG8gdGhlIGJvdW5kIG5vZGVMaXN0LgogICAqCiAgICogQHBhcmFtIHshUHJvcGVydHlFZmZlY3RzVHlwZX0gaW5zdCBJbnN0YW5jZSB0aGF0IGJhcyBiZWVuIHByZXZpb3VzbHkgYm91bmQKICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNldHVwQmluZGluZ3MoaW5zdCwgdGVtcGxhdGVJbmZvKSB7CiAgICAvLyBTZXR1cCBjb21wb3VuZCBzdG9yYWdlLCBkYXRhSG9zdCwgYW5kIG5vdGlmeSBsaXN0ZW5lcnMKICAgIGxldCB7bm9kZUxpc3QsIG5vZGVJbmZvTGlzdH0gPSB0ZW1wbGF0ZUluZm87CiAgICBpZiAobm9kZUluZm9MaXN0Lmxlbmd0aCkgewogICAgICBmb3IgKGxldCBpPTA7IGkgPCBub2RlSW5mb0xpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgaW5mbyA9IG5vZGVJbmZvTGlzdFtpXTsKICAgICAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2ldOwogICAgICAgIGxldCBiaW5kaW5ncyA9IGluZm8uYmluZGluZ3M7CiAgICAgICAgaWYgKGJpbmRpbmdzKSB7CiAgICAgICAgICBmb3IgKGxldCBpPTA7IGk8YmluZGluZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGJpbmRpbmcgPSBiaW5kaW5nc1tpXTsKICAgICAgICAgICAgc2V0dXBDb21wb3VuZFN0b3JhZ2Uobm9kZSwgYmluZGluZyk7CiAgICAgICAgICAgIGFkZE5vdGlmeUxpc3RlbmVyKG5vZGUsIGluc3QsIGJpbmRpbmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBub2RlLl9fZGF0YUhvc3QgPSBpbnN0OwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBJbml0aWFsaXplcyBgX19kYXRhQ29tcG91bmRTdG9yYWdlYCBsb2NhbCBzdG9yYWdlIG9uIGEgYm91bmQgbm9kZSB3aXRoCiAgICogaW5pdGlhbCBsaXRlcmFsIGRhdGEgZm9yIGNvbXBvdW5kIGJpbmRpbmdzLCBhbmQgc2V0cyB0aGUgam9pbmVkCiAgICogbGl0ZXJhbCBwYXJ0cyB0byB0aGUgYm91bmQgcHJvcGVydHkuCiAgICoKICAgKiBXaGVuIGNoYW5nZXMgdG8gY29tcG91bmQgcGFydHMgb2NjdXIsIHRoZXkgYXJlIGZpcnN0IHNldCBpbnRvIHRoZSBjb21wb3VuZAogICAqIHN0b3JhZ2UgYXJyYXkgZm9yIHRoYXQgcHJvcGVydHksIGFuZCB0aGVuIHRoZSBhcnJheSBpcyBqb2luZWQgdG8gcmVzdWx0IGluCiAgICogdGhlIGZpbmFsIHZhbHVlIHNldCB0byB0aGUgcHJvcGVydHkvYXR0cmlidXRlLgogICAqCiAgICogQHBhcmFtIHtOb2RlfSBub2RlIEJvdW5kIG5vZGUgdG8gaW5pdGlhbGl6ZQogICAqIEBwYXJhbSB7QmluZGluZ30gYmluZGluZyBCaW5kaW5nIG1ldGFkYXRhCiAgICogQHJldHVybiB7dm9pZH0KICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHNldHVwQ29tcG91bmRTdG9yYWdlKG5vZGUsIGJpbmRpbmcpIHsKICAgIGlmIChiaW5kaW5nLmlzQ29tcG91bmQpIHsKICAgICAgLy8gQ3JlYXRlIGNvbXBvdW5kIHN0b3JhZ2UgbWFwCiAgICAgIGxldCBzdG9yYWdlID0gbm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgfHwKICAgICAgICAobm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgPSB7fSk7CiAgICAgIGxldCBwYXJ0cyA9IGJpbmRpbmcucGFydHM7CiAgICAgIC8vIENvcHkgbGl0ZXJhbHMgZnJvbSBwYXJ0cyBpbnRvIHN0b3JhZ2UgZm9yIHRoaXMgYmluZGluZwogICAgICBsZXQgbGl0ZXJhbHMgPSBuZXcgQXJyYXkocGFydHMubGVuZ3RoKTsKICAgICAgZm9yIChsZXQgaj0wOyBqPHBhcnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgbGl0ZXJhbHNbal0gPSBwYXJ0c1tqXS5saXRlcmFsOwogICAgICB9CiAgICAgIGxldCB0YXJnZXQgPSBiaW5kaW5nLnRhcmdldDsKICAgICAgc3RvcmFnZVt0YXJnZXRdID0gbGl0ZXJhbHM7CiAgICAgIC8vIENvbmZpZ3VyZSBwcm9wZXJ0aWVzIHdpdGggdGhlaXIgbGl0ZXJhbCBwYXJ0cwogICAgICBpZiAoYmluZGluZy5saXRlcmFsICYmIGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSB7CiAgICAgICAgbm9kZVt0YXJnZXRdID0gYmluZGluZy5saXRlcmFsOwogICAgICB9CiAgICB9CiAgfQoKICAvKioKICAgKiBBZGRzIGEgMi13YXkgYmluZGluZyBub3RpZmljYXRpb24gZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUgc3BlY2lmaWVkCiAgICoKICAgKiBAcGFyYW0ge09iamVjdH0gbm9kZSBDaGlsZCBlbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0bwogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSG9zdCBlbGVtZW50IGluc3RhbmNlIHRvIGhhbmRsZSBub3RpZmljYXRpb24gZXZlbnQKICAgKiBAcGFyYW0ge0JpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAqIEByZXR1cm4ge3ZvaWR9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBhZGROb3RpZnlMaXN0ZW5lcihub2RlLCBpbnN0LCBiaW5kaW5nKSB7CiAgICBpZiAoYmluZGluZy5saXN0ZW5lckV2ZW50KSB7CiAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1swXTsKICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGJpbmRpbmcubGlzdGVuZXJFdmVudCwgZnVuY3Rpb24oZSkgewogICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihlLCBpbnN0LCBiaW5kaW5nLnRhcmdldCwgcGFydC5zb3VyY2UsIHBhcnQubmVnYXRlKTsKICAgICAgfSk7CiAgICB9CiAgfQoKICAvLyAtLSBmb3IgbWV0aG9kLWJhc2VkIGVmZmVjdHMgKGNvbXBsZXhPYnNlcnZlciAmIGNvbXB1dGVkKSAtLS0tLS0tLS0tLS0tLQoKICAvKioKICAgKiBBZGRzIHByb3BlcnR5IGVmZmVjdHMgZm9yIGVhY2ggYXJndW1lbnQgaW4gdGhlIG1ldGhvZCBzaWduYXR1cmUgKGFuZAogICAqIG9wdGlvbmFsbHksIGZvciB0aGUgbWV0aG9kIG5hbWUgaWYgYGR5bmFtaWNgIGlzIHRydWUpIHRoYXQgY2FsbHMgdGhlCiAgICogcHJvdmlkZWQgZWZmZWN0IGZ1bmN0aW9uLgogICAqCiAgICogQHBhcmFtIHtFbGVtZW50IHwgT2JqZWN0fSBtb2RlbCBQcm90b3R5cGUgb3IgaW5zdGFuY2UKICAgKiBAcGFyYW0geyFNZXRob2RTaWduYXR1cmV9IHNpZyBNZXRob2Qgc2lnbmF0dXJlIG1ldGFkYXRhCiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVHlwZSBvZiBwcm9wZXJ0eSBlZmZlY3QgdG8gYWRkCiAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWZmZWN0Rm4gRnVuY3Rpb24gdG8gcnVuIHdoZW4gYXJndW1lbnRzIGNoYW5nZQogICAqIEBwYXJhbSB7Kj19IG1ldGhvZEluZm8gRWZmZWN0LXNwZWNpZmljIGluZm9ybWF0aW9uIHRvIGJlIGluY2x1ZGVkIGluCiAgICogICBtZXRob2QgZWZmZWN0IG1ldGFkYXRhCiAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICogICBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LiBOb3RlLAogICAqICAgZGVmYXVsdHMgdG8gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIGlzIHN0YXRpYyAoc2lnLnN0YXRpYyBpcyB0cnVlKS4KICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gY3JlYXRlTWV0aG9kRWZmZWN0KG1vZGVsLCBzaWcsIHR5cGUsIGVmZmVjdEZuLCBtZXRob2RJbmZvLCBkeW5hbWljRm4pIHsKICAgIGR5bmFtaWNGbiA9IHNpZy5zdGF0aWMgfHwgKGR5bmFtaWNGbiAmJgogICAgICAodHlwZW9mIGR5bmFtaWNGbiAhPT0gJ29iamVjdCcgfHwgZHluYW1pY0ZuW3NpZy5tZXRob2ROYW1lXSkpOwogICAgbGV0IGluZm8gPSB7CiAgICAgIG1ldGhvZE5hbWU6IHNpZy5tZXRob2ROYW1lLAogICAgICBhcmdzOiBzaWcuYXJncywKICAgICAgbWV0aG9kSW5mbywKICAgICAgZHluYW1pY0ZuCiAgICB9OwogICAgZm9yIChsZXQgaT0wLCBhcmc7IChpPHNpZy5hcmdzLmxlbmd0aCkgJiYgKGFyZz1zaWcuYXJnc1tpXSk7IGkrKykgewogICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgbW9kZWwuX2FkZFByb3BlcnR5RWZmZWN0KGFyZy5yb290UHJvcGVydHksIHR5cGUsIHsKICAgICAgICAgIGZuOiBlZmZlY3RGbiwgaW5mbzogaW5mbywgdHJpZ2dlcjogYXJnCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChkeW5hbWljRm4pIHsKICAgICAgbW9kZWwuX2FkZFByb3BlcnR5RWZmZWN0KHNpZy5tZXRob2ROYW1lLCB0eXBlLCB7CiAgICAgICAgZm46IGVmZmVjdEZuLCBpbmZvOiBpbmZvCiAgICAgIH0pOwogICAgfQogIH0KCiAgLyoqCiAgICogQ2FsbHMgYSBtZXRob2Qgd2l0aCBhcmd1bWVudHMgbWFyc2hhbGVkIGZyb20gcHJvcGVydGllcyBvbiB0aGUgaW5zdGFuY2UKICAgKiBiYXNlZCBvbiB0aGUgbWV0aG9kIHNpZ25hdHVyZSBjb250YWluZWQgaW4gdGhlIGVmZmVjdCBtZXRhZGF0YS4KICAgKgogICAqIE11bHRpLXByb3BlcnR5IG9ic2VydmVycywgY29tcHV0ZWQgcHJvcGVydGllcywgYW5kIGlubGluZSBjb21wdXRpbmcKICAgKiBmdW5jdGlvbnMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGludm9rZSB0aGUgbWV0aG9kLCB0aGVuIHVzZSB0aGUgcmV0dXJuCiAgICogdmFsdWUgYWNjb3JkaW5nbHkuCiAgICoKICAgKiBAcGFyYW0geyFQcm9wZXJ0eUVmZmVjdHNUeXBlfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIG1ldGhvZCBpbnZvY2F0aW9uCiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBydW5NZXRob2RFZmZlY3QoaW5zdCwgcHJvcGVydHksIHByb3BzLCBvbGRQcm9wcywgaW5mbykgewogICAgLy8gSW5zdGFuY2VzIGNhbiBvcHRpb25hbGx5IGhhdmUgYSBfbWV0aG9kSG9zdCB3aGljaCBhbGxvd3MgcmVkaXJlY3Rpbmcgd2hlcmUKICAgIC8vIHRvIGZpbmQgbWV0aG9kcy4gQ3VycmVudGx5IHVzZWQgYnkgYHRlbXBsYXRpemVgLgogICAgbGV0IGNvbnRleHQgPSBpbnN0Ll9tZXRob2RIb3N0IHx8IGluc3Q7CiAgICBsZXQgZm4gPSBjb250ZXh0W2luZm8ubWV0aG9kTmFtZV07CiAgICBpZiAoZm4pIHsKICAgICAgbGV0IGFyZ3MgPSBpbnN0Ll9tYXJzaGFsQXJncyhpbmZvLmFyZ3MsIHByb3BlcnR5LCBwcm9wcyk7CiAgICAgIHJldHVybiBmbi5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgIH0gZWxzZSBpZiAoIWluZm8uZHluYW1pY0ZuKSB7CiAgICAgIGNvbnNvbGUud2FybignbWV0aG9kIGAnICsgaW5mby5tZXRob2ROYW1lICsgJ2Agbm90IGRlZmluZWQnKTsKICAgIH0KICB9CgogIGNvbnN0IGVtcHR5QXJyYXkgPSBbXTsKCiAgLy8gUmVndWxhciBleHByZXNzaW9ucyB1c2VkIGZvciBiaW5kaW5nCiAgY29uc3QgSURFTlQgID0gJyg/OicgKyAnW2EtekEtWl8kXVtcXHcuOiRcXC0qXSonICsgJyknOwogIGNvbnN0IE5VTUJFUiA9ICcoPzonICsgJ1stK10/WzAtOV0qXFwuP1swLTldKyg/OltlRV1bLStdP1swLTldKyk/JyArICcpJzsKICBjb25zdCBTUVVPVEVfU1RSSU5HID0gJyg/OicgKyAnXCcoPzpbXlwnXFxcXF18XFxcXC4pKlwnJyArICcpJzsKICBjb25zdCBEUVVPVEVfU1RSSU5HID0gJyg/OicgKyAnIig/OlteIlxcXFxdfFxcXFwuKSoiJyArICcpJzsKICBjb25zdCBTVFJJTkcgPSAnKD86JyArIFNRVU9URV9TVFJJTkcgKyAnfCcgKyBEUVVPVEVfU1RSSU5HICsgJyknOwogIGNvbnN0IEFSR1VNRU5UID0gJyg/OignICsgSURFTlQgKyAnfCcgKyBOVU1CRVIgKyAnfCcgKyAgU1RSSU5HICsgJylcXHMqJyArICcpJzsKICBjb25zdCBBUkdVTUVOVFMgPSAnKD86JyArIEFSR1VNRU5UICsgJyg/OixcXHMqJyArIEFSR1VNRU5UICsgJykqJyArICcpJzsKICBjb25zdCBBUkdVTUVOVF9MSVNUID0gJyg/OicgKyAnXFwoXFxzKicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcoPzonICsgQVJHVU1FTlRTICsgJz8nICsgJyknICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xcKVxccyonICsgJyknOwogIGNvbnN0IEJJTkRJTkcgPSAnKCcgKyBJREVOVCArICdcXHMqJyArIEFSR1VNRU5UX0xJU1QgKyAnPycgKyAnKSc7IC8vIEdyb3VwIDMKICBjb25zdCBPUEVOX0JSQUNLRVQgPSAnKFxcW1xcW3x7eyknICsgJ1xccyonOwogIGNvbnN0IENMT1NFX0JSQUNLRVQgPSAnKD86XV18fX0pJzsKICBjb25zdCBORUdBVEUgPSAnKD86KCEpXFxzKik/JzsgLy8gR3JvdXAgMgogIGNvbnN0IEVYUFJFU1NJT04gPSBPUEVOX0JSQUNLRVQgKyBORUdBVEUgKyBCSU5ESU5HICsgQ0xPU0VfQlJBQ0tFVDsKICBjb25zdCBiaW5kaW5nUmVnZXggPSBuZXcgUmVnRXhwKEVYUFJFU1NJT04sICJnIik7CgogIC8qKgogICAqIENyZWF0ZSBhIHN0cmluZyBmcm9tIGJpbmRpbmcgcGFydHMgb2YgYWxsIHRoZSBsaXRlcmFsIHBhcnRzCiAgICoKICAgKiBAcGFyYW0geyFBcnJheTxCaW5kaW5nUGFydD59IHBhcnRzIEFsbCBwYXJ0cyB0byBzdHJpbmdpZnkKICAgKiBAcmV0dXJuIHtzdHJpbmd9IFN0cmluZyBtYWRlIGZyb20gdGhlIGxpdGVyYWwgcGFydHMKICAgKi8KICBmdW5jdGlvbiBsaXRlcmFsRnJvbVBhcnRzKHBhcnRzKSB7CiAgICBsZXQgcyA9ICcnOwogICAgZm9yIChsZXQgaT0wOyBpPHBhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBsaXRlcmFsID0gcGFydHNbaV0ubGl0ZXJhbDsKICAgICAgcyArPSBsaXRlcmFsIHx8ICcnOwogICAgfQogICAgcmV0dXJuIHM7CiAgfQoKICAvKioKICAgKiBQYXJzZXMgYW4gZXhwcmVzc2lvbiBzdHJpbmcgZm9yIGEgbWV0aG9kIHNpZ25hdHVyZSwgYW5kIHJldHVybnMgYSBtZXRhZGF0YQogICAqIGRlc2NyaWJpbmcgdGhlIG1ldGhvZCBpbiB0ZXJtcyBvZiBgbWV0aG9kTmFtZWAsIGBzdGF0aWNgICh3aGV0aGVyIGFsbCB0aGUKICAgKiBhcmd1bWVudHMgYXJlIGxpdGVyYWxzKSwgYW5kIGFuIGFycmF5IG9mIGBhcmdzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gVGhlIGV4cHJlc3Npb24gdG8gcGFyc2UKICAgKiBAcmV0dXJuIHs/TWV0aG9kU2lnbmF0dXJlfSBUaGUgbWV0aG9kIG1ldGFkYXRhIG9iamVjdCBpZiBhIG1ldGhvZCBleHByZXNzaW9uIHdhcwogICAqICAgZm91bmQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcGFyc2VNZXRob2QoZXhwcmVzc2lvbikgewogICAgLy8gdHJpZXMgdG8gbWF0Y2ggdmFsaWQgamF2YXNjcmlwdCBwcm9wZXJ0eSBuYW1lcwogICAgbGV0IG0gPSBleHByZXNzaW9uLm1hdGNoKC8oW15cc10rPylcKChbXHNcU10qKVwpLyk7CiAgICBpZiAobSkgewogICAgICBsZXQgbWV0aG9kTmFtZSA9IG1bMV07CiAgICAgIGxldCBzaWcgPSB7IG1ldGhvZE5hbWUsIHN0YXRpYzogdHJ1ZSwgYXJnczogZW1wdHlBcnJheSB9OwogICAgICBpZiAobVsyXS50cmltKCkpIHsKICAgICAgICAvLyByZXBsYWNlIGVzY2FwZWQgY29tbWFzIHdpdGggY29tbWEgZW50aXR5LCBzcGxpdCBvbiB1bi1lc2NhcGVkIGNvbW1hcwogICAgICAgIGxldCBhcmdzID0gbVsyXS5yZXBsYWNlKC9cXCwvZywgJyZjb21tYTsnKS5zcGxpdCgnLCcpOwogICAgICAgIHJldHVybiBwYXJzZUFyZ3MoYXJncywgc2lnKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gc2lnOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnVsbDsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhbiBhcnJheSBvZiBhcmd1bWVudHMgYW5kIHNldHMgdGhlIGBhcmdzYCBwcm9wZXJ0eSBvZiB0aGUgc3VwcGxpZWQKICAgKiBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0LiBTZXRzIHRoZSBgc3RhdGljYCBwcm9wZXJ0eSB0byBmYWxzZSBpZiBhbnkKICAgKiBhcmd1bWVudCBpcyBhIG5vbi1saXRlcmFsLgogICAqCiAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gYXJnTGlzdCBBcnJheSBvZiBhcmd1bWVudCBuYW1lcwogICAqIEBwYXJhbSB7IU1ldGhvZFNpZ25hdHVyZX0gc2lnIE1ldGhvZCBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0CiAgICogQHJldHVybiB7IU1ldGhvZFNpZ25hdHVyZX0gVGhlIHVwZGF0ZWQgc2lnbmF0dXJlIG1ldGFkYXRhIG9iamVjdAogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gcGFyc2VBcmdzKGFyZ0xpc3QsIHNpZykgewogICAgc2lnLmFyZ3MgPSBhcmdMaXN0Lm1hcChmdW5jdGlvbihyYXdBcmcpIHsKICAgICAgbGV0IGFyZyA9IHBhcnNlQXJnKHJhd0FyZyk7CiAgICAgIGlmICghYXJnLmxpdGVyYWwpIHsKICAgICAgICBzaWcuc3RhdGljID0gZmFsc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIGFyZzsKICAgIH0sIHRoaXMpOwogICAgcmV0dXJuIHNpZzsKICB9CgogIC8qKgogICAqIFBhcnNlcyBhbiBpbmRpdmlkdWFsIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhbiBhcmd1bWVudCBtZXRhZGF0YSBvYmplY3QKICAgKiB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOgogICAqCiAgICogICB7CiAgICogICAgIHZhbHVlOiAncHJvcCcsICAgICAgICAvLyBwcm9wZXJ0eS9wYXRoIG9yIGxpdGVyYWwgdmFsdWUKICAgKiAgICAgbGl0ZXJhbDogZmFsc2UsICAgICAgIC8vIHdoZXRoZXIgYXJndW1lbnQgaXMgYSBsaXRlcmFsCiAgICogICAgIHN0cnVjdHVyZWQ6IGZhbHNlLCAgICAvLyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBpcyBhIHBhdGgKICAgKiAgICAgcm9vdFByb3BlcnR5OiAncHJvcCcsIC8vIHRoZSByb290IHByb3BlcnR5IG9mIHRoZSBwYXRoCiAgICogICAgIHdpbGRjYXJkOiBmYWxzZSAgICAgICAvLyB3aGV0aGVyIHRoZSBhcmd1bWVudCB3YXMgYSB3aWxkY2FyZCAnLionIHBhdGgKICAgKiAgIH0KICAgKgogICAqIEBwYXJhbSB7c3RyaW5nfSByYXdBcmcgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYXJndW1lbnQKICAgKiBAcmV0dXJuIHshTWV0aG9kQXJnfSBBcmd1bWVudCBtZXRhZGF0YSBvYmplY3QKICAgKiBAcHJpdmF0ZQogICAqLwogIGZ1bmN0aW9uIHBhcnNlQXJnKHJhd0FyZykgewogICAgLy8gY2xlYW4gdXAgd2hpdGVzcGFjZQogICAgbGV0IGFyZyA9IHJhd0FyZy50cmltKCkKICAgICAgLy8gcmVwbGFjZSBjb21tYSBlbnRpdHkgd2l0aCBjb21tYQogICAgICAucmVwbGFjZSgvJmNvbW1hOy9nLCAnLCcpCiAgICAgIC8vIHJlcGFpciBleHRyYSBlc2NhcGUgc2VxdWVuY2VzOyBub3RlIG9ubHkgY29tbWFzIHN0cmljdGx5IG5lZWQKICAgICAgLy8gZXNjYXBpbmcsIGJ1dCB3ZSBhbGxvdyBhbnkgb3RoZXIgY2hhciB0byBiZSBlc2NhcGVkIHNpbmNlIGl0cwogICAgICAvLyBsaWtlbHkgdXNlcnMgd2lsbCBkbyB0aGlzCiAgICAgIC5yZXBsYWNlKC9cXCguKS9nLCAnXCQxJykKICAgICAgOwogICAgLy8gYmFzaWMgYXJndW1lbnQgZGVzY3JpcHRvcgogICAgbGV0IGEgPSB7CiAgICAgIG5hbWU6IGFyZywKICAgICAgdmFsdWU6ICcnLAogICAgICBsaXRlcmFsOiBmYWxzZQogICAgfTsKICAgIC8vIGRldGVjdCBsaXRlcmFsIHZhbHVlIChtdXN0IGJlIFN0cmluZyBvciBOdW1iZXIpCiAgICBsZXQgZmMgPSBhcmdbMF07CiAgICBpZiAoZmMgPT09ICctJykgewogICAgICBmYyA9IGFyZ1sxXTsKICAgIH0KICAgIGlmIChmYyA+PSAnMCcgJiYgZmMgPD0gJzknKSB7CiAgICAgIGZjID0gJyMnOwogICAgfQogICAgc3dpdGNoKGZjKSB7CiAgICAgIGNhc2UgIiciOgogICAgICBjYXNlICciJzoKICAgICAgICBhLnZhbHVlID0gYXJnLnNsaWNlKDEsIC0xKTsKICAgICAgICBhLmxpdGVyYWwgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlICcjJzoKICAgICAgICBhLnZhbHVlID0gTnVtYmVyKGFyZyk7CiAgICAgICAgYS5saXRlcmFsID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgIH0KICAgIC8vIGlmIG5vdCBsaXRlcmFsLCBsb29rIGZvciBzdHJ1Y3R1cmVkIHBhdGgKICAgIGlmICghYS5saXRlcmFsKSB7CiAgICAgIGEucm9vdFByb3BlcnR5ID0gUG9seW1lci5QYXRoLnJvb3QoYXJnKTsKICAgICAgLy8gZGV0ZWN0IHN0cnVjdHVyZWQgcGF0aCAoaGFzIGRvdHMpCiAgICAgIGEuc3RydWN0dXJlZCA9IFBvbHltZXIuUGF0aC5pc1BhdGgoYXJnKTsKICAgICAgaWYgKGEuc3RydWN0dXJlZCkgewogICAgICAgIGEud2lsZGNhcmQgPSAoYXJnLnNsaWNlKC0yKSA9PSAnLionKTsKICAgICAgICBpZiAoYS53aWxkY2FyZCkgewogICAgICAgICAgYS5uYW1lID0gYXJnLnNsaWNlKDAsIC0yKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBhOwogIH0KCiAgLy8gZGF0YSBhcGkKCiAgLyoqCiAgICogU2VuZHMgYXJyYXkgc3BsaWNlIG5vdGlmaWNhdGlvbnMgKGAuc3BsaWNlc2AgYW5kIGAubGVuZ3RoYCkKICAgKgogICAqIE5vdGU6IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG5vcm1hbGl6ZWQgcGF0aHMKICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byB0aGUgYXJyYXkgdGhhdCB3YXMgbXV0YXRlZAogICAqIEBwYXJhbSB7QXJyYXl9IHNwbGljZXMgQXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgc3BsaWNlcykgewogICAgbGV0IHNwbGljZXNQYXRoID0gcGF0aCArICcuc3BsaWNlcyc7CiAgICBpbnN0Lm5vdGlmeVBhdGgoc3BsaWNlc1BhdGgsIHsgaW5kZXhTcGxpY2VzOiBzcGxpY2VzIH0pOwogICAgaW5zdC5ub3RpZnlQYXRoKHBhdGggKyAnLmxlbmd0aCcsIGFycmF5Lmxlbmd0aCk7CiAgICAvLyBOdWxsIGhlcmUgdG8gYWxsb3cgcG90ZW50aWFsbHkgbGFyZ2Ugc3BsaWNlIHJlY29yZHMgdG8gYmUgR0MnZWQuCiAgICBpbnN0Ll9fZGF0YVtzcGxpY2VzUGF0aF0gPSB7aW5kZXhTcGxpY2VzOiBudWxsfTsKICB9CgogIC8qKgogICAqIENyZWF0ZXMgYSBzcGxpY2UgcmVjb3JkIGFuZCBzZW5kcyBhbiBhcnJheSBzcGxpY2Ugbm90aWZpY2F0aW9uIGZvcgogICAqIHRoZSBkZXNjcmliZWQgbXV0YXRpb24KICAgKgogICAqIE5vdGU6IHRoaXMgaW1wbGVtZW50YXRpb24gb25seSBhY2NlcHRzIG5vcm1hbGl6ZWQgcGF0aHMKICAgKgogICAqIEBwYXJhbSB7IVByb3BlcnR5RWZmZWN0c1R5cGV9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCB0byB0aGUgYXJyYXkgdGhhdCB3YXMgbXV0YXRlZAogICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBJbmRleCBhdCB3aGljaCB0aGUgYXJyYXkgbXV0YXRpb24gb2NjdXJyZWQKICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZWRDb3VudCBOdW1iZXIgb2YgYWRkZWQgaXRlbXMKICAgKiBAcGFyYW0ge0FycmF5fSByZW1vdmVkIEFycmF5IG9mIHJlbW92ZWQgaXRlbXMKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gbm90aWZ5U3BsaWNlKGluc3QsIGFycmF5LCBwYXRoLCBpbmRleCwgYWRkZWRDb3VudCwgcmVtb3ZlZCkgewogICAgbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgW3sKICAgICAgaW5kZXg6IGluZGV4LAogICAgICBhZGRlZENvdW50OiBhZGRlZENvdW50LAogICAgICByZW1vdmVkOiByZW1vdmVkLAogICAgICBvYmplY3Q6IGFycmF5LAogICAgICB0eXBlOiAnc3BsaWNlJwogICAgfV0pOwogIH0KCiAgLyoqCiAgICogUmV0dXJucyBhbiB1cHBlci1jYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuCiAgICoKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBTdHJpbmcgdG8gdXBwZXJjYXNlCiAgICogQHJldHVybiB7c3RyaW5nfSBVcHBlcmNhc2VkIHN0cmluZwogICAqIEBwcml2YXRlCiAgICovCiAgZnVuY3Rpb24gdXBwZXIobmFtZSkgewogICAgcmV0dXJuIG5hbWVbMF0udG9VcHBlckNhc2UoKSArIG5hbWUuc3Vic3RyaW5nKDEpOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIG1ldGEtcHJvZ3JhbW1pbmcgZm9yIFBvbHltZXIncyB0ZW1wbGF0ZQogICAqIGJpbmRpbmcgYW5kIGRhdGEgb2JzZXJ2YXRpb24gKGNvbGxlY3RpdmVseSwgInByb3BlcnR5IGVmZmVjdHMiKSBzeXN0ZW0uCiAgICoKICAgKiBUaGlzIG1peGluIHVzZXMgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBrZXkgc3RhdGljIG1ldGhvZHMgZm9yIGFkZGluZwogICAqIHByb3BlcnR5IGVmZmVjdHMgdG8gYW4gZWxlbWVudCBjbGFzczoKICAgKiAtIGBhZGRQcm9wZXJ0eUVmZmVjdGAKICAgKiAtIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYAogICAqIC0gYGNyZWF0ZU1ldGhvZE9ic2VydmVyYAogICAqIC0gYGNyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5YAogICAqIC0gYGNyZWF0ZVJlYWRPbmx5UHJvcGVydHlgCiAgICogLSBgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHlgCiAgICogLSBgY3JlYXRlQ29tcHV0ZWRQcm9wZXJ0eWAKICAgKiAtIGBiaW5kVGVtcGxhdGVgCiAgICoKICAgKiBFYWNoIG1ldGhvZCBjcmVhdGVzIG9uZSBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycywgYWxvbmcgd2l0aCBtZXRhZGF0YQogICAqIHVzZWQgYnkgdGhpcyBtaXhpbidzIGltcGxlbWVudGF0aW9uIG9mIGBfcHJvcGVydGllc0NoYW5nZWRgIHRvIHBlcmZvcm0KICAgKiB0aGUgcHJvcGVydHkgZWZmZWN0cy4KICAgKgogICAqIFVuZGVyc2NvcmVkIHZlcnNpb25zIG9mIHRoZSBhYm92ZSBtZXRob2RzIGFsc28gZXhpc3Qgb24gdGhlIGVsZW1lbnQKICAgKiBwcm90b3R5cGUgZm9yIGFkZGluZyBwcm9wZXJ0eSBlZmZlY3RzIG9uIGluc3RhbmNlcyBhdCBydW50aW1lLgogICAqCiAgICogTm90ZSB0aGF0IHRoaXMgbWl4aW4gb3ZlcnJpZGVzIHNldmVyYWwgYFByb3BlcnR5QWNjZXNzb3JzYCBtZXRob2RzLCBpbgogICAqIG1hbnkgY2FzZXMgdG8gbWFpbnRhaW4gZ3VhcmFudGVlcyBwcm92aWRlZCBieSB0aGUgUG9seW1lciAxLnggZmVhdHVyZXM7CiAgICogbm90YWJseSBpdCBjaGFuZ2VzIHByb3BlcnR5IGFjY2Vzc29ycyB0byBiZSBzeW5jaHJvbm91cyBieSBkZWZhdWx0CiAgICogd2hlcmVhcyB0aGUgZGVmYXVsdCB3aGVuIHVzaW5nIGBQcm9wZXJ0eUFjY2Vzc29yc2Agc3RhbmRhbG9uZSBpcyB0byBiZQogICAqIGFzeW5jIGJ5IGRlZmF1bHQuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlRlbXBsYXRlU3RhbXAKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBtZXRhLXByb2dyYW1taW5nIGZvciBQb2x5bWVyJ3MKICAgKiB0ZW1wbGF0ZSBiaW5kaW5nIGFuZCBkYXRhIG9ic2VydmF0aW9uIHN5c3RlbS4KICAgKi8KICBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUFjY2Vzc29yc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1RlbXBsYXRlU3RhbXB9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBwcm9wZXJ0eUVmZmVjdHNCYXNlID0gUG9seW1lci5UZW1wbGF0ZVN0YW1wKFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnMoc3VwZXJDbGFzcykpOwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAZXh0ZW5kcyB7cHJvcGVydHlFZmZlY3RzQmFzZX0KICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgUHJvcGVydHlFZmZlY3RzIGV4dGVuZHMgcHJvcGVydHlFZmZlY3RzQmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICAvLyBVc2VkIHRvIGlkZW50aWZ5IHVzZXJzIG9mIHRoaXMgbWl4aW4sIGFsYSBpbnN0YW5jZW9mCiAgICAgICAgdGhpcy5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ID0gdHJ1ZTsKICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8KICAgICAgICAvLyBOT1RFOiB1c2VkIHRvIHRyYWNrIHJlLWVudHJhbnQgY2FsbHMgdG8gYF9mbHVzaFByb3BlcnRpZXNgCiAgICAgICAgLy8gcGF0aCBjaGFuZ2VzIGRpcnR5IGNoZWNrIGFnYWluc3QgYF9fZGF0YVRlbXBgIG9ubHkgZHVyaW5nIG9uZSAidHVybiIKICAgICAgICAvLyBhbmQgYXJlIGNsZWFyZWQgd2hlbiBgX19kYXRhQ291bnRlcmAgcmV0dXJucyB0byAwLgogICAgICAgIHRoaXMuX19kYXRhQ291bnRlciA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5OwogICAgICAgIC8qKiBAdHlwZSB7QXJyYXl9ICovCiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHM7CiAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2U7CiAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gKi8KICAgICAgICB0aGlzLl9fZGF0YUhvc3Q7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhVGVtcDsKICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzSW5pdGlhbGl6ZWQ7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhOwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmc7CiAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19kYXRhT2xkOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19jb21wdXRlRWZmZWN0czsKICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICB0aGlzLl9fcmVmbGVjdEVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX25vdGlmeUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX3Byb3BhZ2F0ZUVmZmVjdHM7CiAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgdGhpcy5fX29ic2VydmVFZmZlY3RzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgIHRoaXMuX19yZWFkT25seTsKICAgICAgICAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovCiAgICAgICAgdGhpcy5fX3RlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgZ2V0IFBST1BFUlRZX0VGRkVDVF9UWVBFUygpIHsKICAgICAgICByZXR1cm4gVFlQRVM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIGhvc3RTdGFjay5yZWdpc3Rlckhvc3QodGhpcyk7CiAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkgPSBmYWxzZTsKICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzID0gbnVsbDsKICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gZmFsc2U7CiAgICAgICAgLy8gTWF5IGJlIHNldCBvbiBpbnN0YW5jZSBwcmlvciB0byB1cGdyYWRlCiAgICAgICAgdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2UgPSB0aGlzLl9fZGF0YUNvbXBvdW5kU3RvcmFnZSB8fCBudWxsOwogICAgICAgIHRoaXMuX19kYXRhSG9zdCA9IHRoaXMuX19kYXRhSG9zdCB8fCBudWxsOwogICAgICAgIHRoaXMuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c0luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIGltcGxlbWVudGF0aW9uIHRvIHByb3ZpZGUgYQogICAgICAgKiBtb3JlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBpbml0aWFsaXppbmcgcHJvcGVydGllcyBmcm9tCiAgICAgICAqIHRoZSBwcm90b3R5cGUgb24gdGhlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBvbiB0aGUgcHJvdG90eXBlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfaW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIHRoaXMuX19kYXRhID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29yc2AgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgc2V0dGluZwogICAgICAgKiBgX3NldFByb3BlcnR5YCdzIGBzaG91bGROb3RpZnk6IHRydWVgLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIFByb3BlcnRpZXMgdG8gaW5pdGlhbGl6ZSBvbiB0aGUgaW5zdGFuY2UKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplSW5zdGFuY2VQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgbGV0IHJlYWRPbmx5ID0gdGhpc1tUWVBFUy5SRUFEX09OTFldOwogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIGlmICghcmVhZE9ubHkgfHwgIXJlYWRPbmx5W3Byb3BdKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IHRoaXMuX19kYXRhUGVuZGluZyB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB0aGlzLl9fZGF0YU9sZCB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcF0gPSB0aGlzLl9fZGF0YVBlbmRpbmdbcHJvcF0gPSBwcm9wc1twcm9wXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIFByb3RvdHlwZSBzZXR1cCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGFkZFByb3BlcnR5RWZmZWN0YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgdGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgdHlwZSA9PSBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgIC8vIGVmZmVjdHMgYXJlIGFjY3VtdWxhdGVkIGludG8gYXJyYXlzIHBlciBwcm9wZXJ0eSBiYXNlZCBvbiB0eXBlCiAgICAgICAgbGV0IGVmZmVjdHMgPSBlbnN1cmVPd25FZmZlY3RNYXAodGhpcywgdHlwZSlbcHJvcGVydHldOwogICAgICAgIGlmICghZWZmZWN0cykgewogICAgICAgICAgZWZmZWN0cyA9IHRoaXNbdHlwZV1bcHJvcGVydHldID0gW107CiAgICAgICAgfQogICAgICAgIGVmZmVjdHMucHVzaChlZmZlY3QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcHJvcGVydHkgZWZmZWN0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdGhlIGVmZmVjdCB3YXMgYXNzb2NpYXRlZCB3aXRoCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIEVmZmVjdCB0eXBlLCBmcm9tIHRoaXMuUFJPUEVSVFlfRUZGRUNUX1RZUEVTCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gZWZmZWN0IEVmZmVjdCBtZXRhZGF0YSBvYmplY3QgdG8gcmVtb3ZlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVtb3ZlUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUsIGVmZmVjdCkgewogICAgICAgIGxldCBlZmZlY3RzID0gZW5zdXJlT3duRWZmZWN0TWFwKHRoaXMsIHR5cGUpW3Byb3BlcnR5XTsKICAgICAgICBsZXQgaWR4ID0gZWZmZWN0cy5pbmRleE9mKGVmZmVjdCk7CiAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICBlZmZlY3RzLnNwbGljZShpZHgsIDEpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgcHJvcGVydHkgZWZmZWN0CiAgICAgICAqIG9mIGEgY2VydGFpbiB0eXBlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IHR5cGUgRWZmZWN0IHR5cGUsIGZyb20gdGhpcy5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSkgewogICAgICAgIGxldCBlZmZlY3RzID0gdGhpc1t0eXBlXTsKICAgICAgICByZXR1cm4gQm9vbGVhbihlZmZlY3RzICYmIGVmZmVjdHNbcHJvcGVydHldKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgInJlYWQgb25seSIKICAgICAgICogYWNjZXNzb3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcyB0eXBlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9oYXNSZWFkT25seUVmZmVjdChwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuUkVBRF9PTkxZKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgIm5vdGlmeSIKICAgICAgICogcHJvcGVydHkgZWZmZWN0IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYW4gZWZmZWN0IG9mIHRoaXMgdHlwZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfaGFzTm90aWZ5RWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5OT1RJRlkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAicmVmbGVjdCB0byBhdHRyaWJ1dGUiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc1JlZmxlY3RFZmZlY3QocHJvcGVydHkpIHsKICAgICAgICByZXR1cm4gdGhpcy5faGFzUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLlJFRkxFQ1QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAiY29tcHV0ZWQiCiAgICAgICAqIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzIHR5cGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2hhc0NvbXB1dGVkRWZmZWN0KHByb3BlcnR5KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5DT01QVVRFKTsKICAgICAgfQoKICAgICAgLy8gUnVudGltZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAvKioKICAgICAgICogU2V0cyBhIHBlbmRpbmcgcHJvcGVydHkgb3IgcGF0aC4gIElmIHRoZSByb290IHByb3BlcnR5IG9mIHRoZSBwYXRoIGluCiAgICAgICAqIHF1ZXN0aW9uIGhhZCBubyBhY2Nlc3NvciwgdGhlIHBhdGggaXMgc2V0LCBvdGhlcndpc2UgaXQgaXMgZW5xdWV1ZWQKICAgICAgICogdmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YC4KICAgICAgICoKICAgICAgICogVGhpcyBmdW5jdGlvbiBpc29sYXRlcyByZWxhdGl2ZWx5IGV4cGVuc2l2ZSBmdW5jdGlvbmFsaXR5IG5lY2Vzc2FyeQogICAgICAgKiBmb3IgdGhlIHB1YmxpYyBBUEkgKGBzZXRgLCBgc2V0UHJvcGVydGllc2AsIGBub3RpZnlQYXRoYCwgYW5kIHByb3BlcnR5CiAgICAgICAqIGNoYW5nZSBsaXN0ZW5lcnMgdmlhIHt7Li4ufX0gYmluZGluZ3MpLCBzdWNoIHRoYXQgaXQgaXMgb25seSBkb25lCiAgICAgICAqIHdoZW4gcGF0aHMgZW50ZXIgdGhlIHN5c3RlbSwgYW5kIG5vdCBhdCBldmVyeSBwcm9wYWdhdGlvbiBzdGVwLiAgSXQKICAgICAgICogYWxzbyBzZXRzIGEgYF9fZGF0YUhhc1BhdGhzYCBmbGFnIG9uIHRoZSBpbnN0YW5jZSB3aGljaCBpcyB1c2VkIHRvCiAgICAgICAqIGZhc3QtcGF0aCBzbG93ZXIgcGF0aC1tYXRjaGluZyBjb2RlIGluIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIGhvc3QgcGF0aHMuCiAgICAgICAqCiAgICAgICAqIGBwYXRoYCBjYW4gYmUgYSBwYXRoIHN0cmluZyBvciBhcnJheSBvZiBwYXRoIHBhcnRzIGFzIGFjY2VwdGVkIGJ5IHRoZQogICAgICAgKiBwdWJsaWMgQVBJLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxudW1iZXJ8c3RyaW5nPn0gcGF0aCBQYXRoIHRvIHNldAogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGROb3RpZnkgU2V0IHRvIHRydWUgaWYgdGhpcyBjaGFuZ2Ugc2hvdWxkCiAgICAgICAqICBjYXVzZSBhIHByb3BlcnR5IG5vdGlmaWNhdGlvbiBldmVudCBkaXNwYXRjaAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBpc1BhdGhOb3RpZmljYXRpb24gSWYgdGhlIHBhdGggYmVpbmcgc2V0IGlzIGEgcGF0aAogICAgICAgKiAgIG5vdGlmaWNhdGlvbiBvZiBhbiBhbHJlYWR5IGNoYW5nZWQgdmFsdWUsIGFzIG9wcG9zZWQgdG8gYSByZXF1ZXN0CiAgICAgICAqICAgdG8gc2V0IGFuZCBub3RpZnkgdGhlIGNoYW5nZS4gIEluIHRoZSBsYXR0ZXIgYGZhbHNlYCBjYXNlLCBhIGRpcnR5CiAgICAgICAqICAgY2hlY2sgaXMgcGVyZm9ybWVkIGFuZCB0aGVuIHRoZSB2YWx1ZSBpcyBzZXQgdG8gdGhlIHBhdGggYmVmb3JlCiAgICAgICAqICAgZW5xdWV1aW5nIHRoZSBwZW5kaW5nIHByb3BlcnR5IGNoYW5nZS4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eS9wYXRoIHdhcyBlbnF1ZXVlZCBpbgogICAgICAgKiAgIHRoZSBwZW5kaW5nIGNoYW5nZXMgYmFnLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHZhbHVlLCBzaG91bGROb3RpZnksIGlzUGF0aE5vdGlmaWNhdGlvbikgewogICAgICAgIGlmIChpc1BhdGhOb3RpZmljYXRpb24gfHwKICAgICAgICAgICAgUG9seW1lci5QYXRoLnJvb3QoQXJyYXkuaXNBcnJheShwYXRoKSA/IHBhdGhbMF0gOiBwYXRoKSAhPT0gcGF0aCkgewogICAgICAgICAgLy8gRGlydHkgY2hlY2sgY2hhbmdlcyBiZWluZyBzZXQgdG8gYSBwYXRoIGFnYWluc3QgdGhlIGFjdHVhbCBvYmplY3QsCiAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgcGF0aHMgaW50byB0aGUgc3lzdGVtOyBmcm9tIGhlcmUKICAgICAgICAgIC8vIHRoZSBvbmx5IGRpcnR5IGNoZWNrcyBhcmUgYWdhaW5zdCB0aGUgYF9fZGF0YVRlbXBgIGNhY2hlIHRvIHByZXZlbnQKICAgICAgICAgIC8vIGR1cGxpY2F0ZSB3b3JrIGluIHRoZSBzYW1lIHR1cm4gb25seS4gTm90ZSwgaWYgdGhpcyB3YXMgYSBub3RpZmljYXRpb24KICAgICAgICAgIC8vIG9mIGEgY2hhbmdlIGFscmVhZHkgc2V0IHRvIGEgcGF0aCAoaXNQYXRoTm90aWZpY2F0aW9uOiB0cnVlKSwKICAgICAgICAgIC8vIHdlIGFsd2F5cyBsZXQgdGhlIGNoYW5nZSB0aHJvdWdoIGFuZCBza2lwIHRoZSBgc2V0YCBzaW5jZSBpdCB3YXMKICAgICAgICAgIC8vIGFscmVhZHkgZGlydHkgY2hlY2tlZCBhdCB0aGUgcG9pbnQgb2YgZW50cnkgYW5kIHRoZSB1bmRlcmx5aW5nCiAgICAgICAgICAvLyBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkCiAgICAgICAgICBpZiAoIWlzUGF0aE5vdGlmaWNhdGlvbikgewogICAgICAgICAgICBsZXQgb2xkID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoKTsKICAgICAgICAgICAgcGF0aCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoUG9seW1lci5QYXRoLnNldCh0aGlzLCBwYXRoLCB2YWx1ZSkpOwogICAgICAgICAgICAvLyBVc2UgcHJvcGVydHktYWNjZXNzb3IncyBzaW1wbGVyIGRpcnR5IGNoZWNrCiAgICAgICAgICAgIGlmICghcGF0aCB8fCAhc3VwZXIuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHBhdGgsIHZhbHVlLCBvbGQpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzID0gdHJ1ZTsKICAgICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoLyoqQHR5cGV7c3RyaW5nfSovKHBhdGgpLCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSkgewogICAgICAgICAgICBjb21wdXRlTGlua2VkUGF0aHModGhpcywgcGF0aCwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgJiYgdGhpcy5fX2RhdGFIYXNBY2Nlc3NvcltwYXRoXSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KC8qKkB0eXBle3N0cmluZ30qLyhwYXRoKSwgdmFsdWUsIHNob3VsZE5vdGlmeSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzW3BhdGhdID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFwcGxpZXMgYSB2YWx1ZSB0byBhIG5vbi1Qb2x5bWVyIGVsZW1lbnQvbm9kZSdzIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gbWFrZXMgYSBiZXN0LWVmZm9ydCBhdCBiaW5kaW5nIGludGVyb3A6CiAgICAgICAqIFNvbWUgbmF0aXZlIGVsZW1lbnQgcHJvcGVydGllcyBoYXZlIHNpZGUtZWZmZWN0cyB3aGVuCiAgICAgICAqIHJlLXNldHRpbmcgdGhlIHNhbWUgdmFsdWUgKGUuZy4gc2V0dGluZyBgPGlucHV0Pi52YWx1ZWAgcmVzZXRzIHRoZQogICAgICAgKiBjdXJzb3IgcG9zaXRpb24pLCBzbyB3ZSBkbyBhIGRpcnR5LWNoZWNrIGJlZm9yZSBzZXR0aW5nIHRoZSB2YWx1ZS4KICAgICAgICogSG93ZXZlciwgZm9yIGJldHRlciBpbnRlcm9wIHdpdGggbm9uLVBvbHltZXIgY3VzdG9tIGVsZW1lbnRzIHRoYXQKICAgICAgICogYWNjZXB0IG9iamVjdHMsIHdlIGV4cGxpY2l0bHkgcmUtc2V0IG9iamVjdCBjaGFuZ2VzIGNvbWluZyBmcm9tIHRoZQogICAgICAgKiBQb2x5bWVyIHdvcmxkICh3aGljaCBtYXkgaW5jbHVkZSBkZWVwIG9iamVjdCBjaGFuZ2VzIHdpdGhvdXQgdGhlCiAgICAgICAqIHRvcCByZWZlcmVuY2UgY2hhbmdpbmcpLCBlcnJpbmcgb24gdGhlIHNpZGUgb2YgcHJvdmlkaW5nIG1vcmUKICAgICAgICogaW5mb3JtYXRpb24uCiAgICAgICAqCiAgICAgICAqIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm92aWRlIGFsdGVybmF0ZSBhcHByb2FjaGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIFRoZSBub2RlIHRvIHNldCBhIHByb3BlcnR5IG9uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFRoZSBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSkgewogICAgICAgIC8vIEl0IGlzIGEganVkZ21lbnQgY2FsbCB0aGF0IHJlc2V0dGluZyBwcmltaXRpdmVzIGlzCiAgICAgICAgLy8gImJhZCIgYW5kIHJlc2V0dGluZ3Mgb2JqZWN0cyBpcyBhbHNvICJnb29kIjsgYWx0ZXJuYXRpdmVseSB3ZSBjb3VsZAogICAgICAgIC8vIGltcGxlbWVudCBhIHdoaXRlbGlzdCBvZiB0YWcgJiBwcm9wZXJ0eSB2YWx1ZXMgdGhhdCBzaG91bGQgbmV2ZXIKICAgICAgICAvLyBiZSByZXNldCAoZS5nLiA8aW5wdXQ+LnZhbHVlICYmIDxzZWxlY3Q+LnZhbHVlKQogICAgICAgIGlmICh2YWx1ZSAhPT0gbm9kZVtwcm9wXSB8fCB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHsKICAgICAgICAgIG5vZGVbcHJvcF0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgaW1wbGVtZW50YXRpb24gdG8gaW50cm9kdWNlIHNwZWNpYWwKICAgICAgICogZGlydHkgY2hlY2sgbG9naWMgZGVwZW5kaW5nIG9uIHRoZSBwcm9wZXJ0eSAmIHZhbHVlIGJlaW5nIHNldDoKICAgICAgICoKICAgICAgICogMS4gQW55IHZhbHVlIHNldCB0byBhIHBhdGggKGUuZy4gJ29iai5wcm9wJzogNDIgb3IgJ29iai5wcm9wJzogey4uLn0pCiAgICAgICAqICAgIFN0b3JlZCBpbiBgX19kYXRhVGVtcGAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBgX19kYXRhVGVtcGAKICAgICAgICogMi4gT2JqZWN0IHNldCB0byBzaW1wbGUgcHJvcGVydHkgKGUuZy4gJ3Byb3AnOiB7Li4ufSkKICAgICAgICogICAgU3RvcmVkIGluIGBfX2RhdGFUZW1wYCBhbmQgYF9fZGF0YWAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdAogICAgICAgKiAgICBgX19kYXRhVGVtcGAgYnkgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBgX3Nob3VsZFByb3BlcnR5Q2hhbmdlYAogICAgICAgKiAzLiBQcmltaXRpdmUgdmFsdWUgc2V0IHRvIHNpbXBsZSBwcm9wZXJ0eSAoZS5nLiAncHJvcCc6IDQyKQogICAgICAgKiAgICBTdG9yZWQgaW4gYF9fZGF0YWAsIGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBgX19kYXRhYAogICAgICAgKgogICAgICAgKiBUaGUgZGlydHktY2hlY2sgaXMgaW1wb3J0YW50IHRvIHByZXZlbnQgY3ljbGVzIGR1ZSB0byB0d28td2F5CiAgICAgICAqIG5vdGlmaWNhdGlvbiwgYnV0IHBhdGhzIGFuZCBvYmplY3RzIGFyZSBvbmx5IGRpcnR5IGNoZWNrZWQgYWdhaW5zdCBhbnkKICAgICAgICogcHJldmlvdXMgdmFsdWUgc2V0IGR1cmluZyB0aGlzIHR1cm4gdmlhIGEgInRlbXBvcmFyeSBjYWNoZSIgdGhhdCBpcwogICAgICAgKiBjbGVhcmVkIHdoZW4gdGhlIGxhc3QgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgZXhpdHMuIFRoaXMgaXMgc286CiAgICAgICAqIGEuIGFueSBjYWNoZWQgYXJyYXkgcGF0aHMgKGUuZy4gJ2FycmF5LjMucHJvcCcpIG1heSBiZSBpbnZhbGlkYXRlZAogICAgICAgKiAgICBkdWUgdG8gYXJyYXkgbXV0YXRpb25zIGxpa2Ugc2hpZnQvdW5zaGlmdC9zcGxpY2U7IHRoaXMgaXMgZmluZQogICAgICAgKiAgICBzaW5jZSBwYXRoIGNoYW5nZXMgYXJlIGRpcnR5LWNoZWNrZWQgYXQgdXNlciBlbnRyeSBwb2ludHMgbGlrZSBgc2V0YAogICAgICAgKiBiLiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBvbmx5IGxhc3RzIG9uZSB0dXJuIHRvIGFsbG93IHRoZSB1c2VyCiAgICAgICAqICAgIHRvIG11dGF0ZSB0aGUgb2JqZWN0IGluLXBsYWNlIGFuZCByZS1zZXQgaXQgd2l0aCB0aGUgc2FtZSBpZGVudGl0eQogICAgICAgKiAgICBhbmQgaGF2ZSBhbGwgc3ViLXByb3BlcnRpZXMgcmUtcHJvcGFnYXRlZCBpbiBhIHN1YnNlcXVlbnQgdHVybi4KICAgICAgICoKICAgICAgICogVGhlIHRlbXAgY2FjaGUgaXMgbm90IG5lY2Vzc2FyaWx5IHN1ZmZpY2llbnQgdG8gcHJldmVudCBpbnZhbGlkIGFycmF5CiAgICAgICAqIHBhdGhzLCBzaW5jZSBhIHNwbGljZSBjYW4gaGFwcGVuIGR1cmluZyB0aGUgc2FtZSB0dXJuICh3aXRoIHBhdGhvbG9naWNhbAogICAgICAgKiB1c2VyIGNvZGUpOyB3ZSBjb3VsZCBpbnRyb2R1Y2UgYSAiZml4dXAiIGZvciB0ZW1wb3JhcmlseSBjYWNoZWQgYXJyYXkKICAgICAgICogcGF0aHMgaWYgbmVlZGVkOiBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lci9wb2x5bWVyL2lzc3Vlcy80MjI3CiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkTm90aWZ5IFRydWUgaWYgcHJvcGVydHkgc2hvdWxkIGZpcmUgbm90aWZpY2F0aW9uCiAgICAgICAqICAgZXZlbnQgKGFwcGxpZXMgb25seSBmb3IgYG5vdGlmeTogdHJ1ZWAgcHJvcGVydGllcykKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAqLwogICAgICBfc2V0UGVuZGluZ1Byb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSB7CiAgICAgICAgbGV0IGlzUGF0aCA9IHRoaXMuX19kYXRhSGFzUGF0aHMgJiYgUG9seW1lci5QYXRoLmlzUGF0aChwcm9wZXJ0eSk7CiAgICAgICAgbGV0IHByZXZQcm9wcyA9IGlzUGF0aCA/IHRoaXMuX19kYXRhVGVtcCA6IHRoaXMuX19kYXRhOwogICAgICAgIGlmICh0aGlzLl9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIHByZXZQcm9wc1twcm9wZXJ0eV0pKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmcgPSB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEVuc3VyZSBvbGQgaXMgY2FwdHVyZWQgZnJvbSB0aGUgbGFzdCB0dXJuCiAgICAgICAgICBpZiAoIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGRbcHJvcGVydHldID0gdGhpcy5fX2RhdGFbcHJvcGVydHldOwogICAgICAgICAgfQogICAgICAgICAgLy8gUGF0aHMgYXJlIHN0b3JlZCBpbiB0ZW1wb3JhcnkgY2FjaGUgKGNsZWFyZWQgYXQgZW5kIG9mIHR1cm4pLAogICAgICAgICAgLy8gd2hpY2ggaXMgdXNlZCBmb3IgZGlydHktY2hlY2tpbmcsIGFsbCBvdGhlcnMgc3RvcmVkIGluIF9fZGF0YQogICAgICAgICAgaWYgKGlzUGF0aCkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl9fZGF0YVtwcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEFsbCBjaGFuZ2VzIGdvIGludG8gcGVuZGluZyBwcm9wZXJ0eSBiYWcsIHBhc3NlZCB0byBfcHJvcGVydGllc0NoYW5nZWQKICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIC8vIFRyYWNrIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgbm90aWZ5IHNlcGFyYXRlbHkKICAgICAgICAgIGlmIChpc1BhdGggfHwgKHRoaXNbVFlQRVMuTk9USUZZXSAmJiB0aGlzW1RZUEVTLk5PVElGWV1bcHJvcGVydHldKSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gdGhpcy5fX2RhdGFUb05vdGlmeSB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFUb05vdGlmeVtwcm9wZXJ0eV0gPSBzaG91bGROb3RpZnk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gZW5zdXJlIGFsbCBhY2Nlc3NvcnMgc2V0IGBzaG91bGROb3RpZnlgCiAgICAgICAqIHRvIHRydWUsIGZvciBwZXItcHJvcGVydHkgbm90aWZpY2F0aW9uIHRyYWNraW5nLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKSB7CiAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUsIHRydWUpKSB7CiAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcmAncyBkZWZhdWx0IGFzeW5jIHF1ZXVpbmcgb2YKICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGA6IGlmIGBfX2RhdGFSZWFkeWAgaXMgZmFsc2UgKGhhcyBub3QgeWV0IGJlZW4KICAgICAgICogbWFudWFsbHkgZmx1c2hlZCksIHRoZSBmdW5jdGlvbiBuby1vcHM7IG90aGVyd2lzZSBmbHVzaGVzCiAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIHN5bmNocm9ub3VzbHkuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCkgewogICAgICAgIGlmICh0aGlzLl9fZGF0YVJlYWR5KSB7CiAgICAgICAgICB0aGlzLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyB0aGUgZ2l2ZW4gY2xpZW50IG9uIGEgbGlzdCBvZiBwZW5kaW5nIGNsaWVudHMsIHdob3NlCiAgICAgICAqIHBlbmRpbmcgcHJvcGVydHkgY2hhbmdlcyBjYW4gbGF0ZXIgYmUgZmx1c2hlZCB2aWEgYSBjYWxsIHRvCiAgICAgICAqIGBfZmx1c2hDbGllbnRzYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNsaWVudCBQcm9wZXJ0eUVmZmVjdHMgY2xpZW50IHRvIGVucXVldWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2VucXVldWVDbGllbnQoY2xpZW50KSB7CiAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cyA9IHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHMgfHwgW107CiAgICAgICAgaWYgKGNsaWVudCAhPT0gdGhpcykgewogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cy5wdXNoKGNsaWVudCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHN1cGVyY2xhc3MgaW1wbGVtZW50YXRpb24uCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9mbHVzaFByb3BlcnRpZXMoKSB7CiAgICAgICAgdGhpcy5fX2RhdGFDb3VudGVyKys7CiAgICAgICAgc3VwZXIuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIHRoaXMuX19kYXRhQ291bnRlci0tOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmx1c2hlcyBhbnkgY2xpZW50cyBwcmV2aW91c2x5IGVucXVldWVkIHZpYSBgX2VucXVldWVDbGllbnRgLCBjYXVzaW5nCiAgICAgICAqIHRoZWlyIGBfZmx1c2hQcm9wZXJ0aWVzYCBtZXRob2QgdG8gcnVuLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfZmx1c2hDbGllbnRzKCkgewogICAgICAgIGlmICghdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkpIHsKICAgICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5ID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX3JlYWR5Q2xpZW50cygpOwogICAgICAgICAgLy8gT3ZlcnJpZGUgcG9pbnQgd2hlcmUgYWNjZXNzb3JzIGFyZSB0dXJuZWQgb247IGltcG9ydGFudGx5LAogICAgICAgICAgLy8gdGhpcyBpcyBhZnRlciBjbGllbnRzIGhhdmUgZnVsbHkgcmVhZGllZCwgcHJvdmlkaW5nIGEgZ3VhcmFudGVlCiAgICAgICAgICAvLyB0aGF0IGFueSBwcm9wZXJ0eSBlZmZlY3RzIG9jY3VyIG9ubHkgYWZ0ZXIgYWxsIGNsaWVudHMgYXJlIHJlYWR5LgogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19lbmFibGVPckZsdXNoQ2xpZW50cygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gTk9URTogV2UgZW5zdXJlIGNsaWVudHMgZWl0aGVyIGVuYWJsZSBvciBmbHVzaCBhcyBhcHByb3ByaWF0ZS4gVGhpcwogICAgICAvLyBoYW5kbGVzIHR3byBjb3JuZXIgY2FzZXM6CiAgICAgIC8vICgxKSBjbGllbnRzIGZsdXNoIHByb3Blcmx5IHdoZW4gY29ubmVjdGVkL2VuYWJsZWQgYmVmb3JlIHRoZSBob3N0CiAgICAgIC8vIGVuYWJsZXM7IGUuZy4KICAgICAgLy8gICAoYSkgVGVtcGxhdGl6ZSBzdGFtcHMgd2l0aCBubyBwcm9wZXJ0aWVzIGFuZCBkb2VzIG5vdCBmbHVzaCBhbmQKICAgICAgLy8gICAoYikgdGhlIGluc3RhbmNlIGlzIGluc2VydGVkIGludG8gZG9tIGFuZAogICAgICAvLyAgIChjKSB0aGVuIHRoZSBpbnN0YW5jZSBmbHVzaGVzLgogICAgICAvLyAoMikgY2xpZW50cyBlbmFibGUgcHJvcGVybHkgd2hlbiBub3QgY29ubmVjdGVkL2VuYWJsZWQgd2hlbiB0aGUgaG9zdAogICAgICAvLyBmbHVzaGVzOyBlLmcuCiAgICAgIC8vICAgKGEpIGEgdGVtcGxhdGUgaXMgcnVudGltZSBzdGFtcGVkIGFuZCBub3QgeWV0IGNvbm5lY3RlZC9lbmFibGVkCiAgICAgIC8vICAgKGIpIGEgaG9zdCBzZXRzIGEgcHJvcGVydHksIGNhdXNpbmcgc3RhbXBlZCBkb20gdG8gZmx1c2gKICAgICAgLy8gICAoYykgdGhlIHN0YW1wZWQgZG9tIGVuYWJsZXMuCiAgICAgIF9fZW5hYmxlT3JGbHVzaENsaWVudHMoKSB7CiAgICAgICAgbGV0IGNsaWVudHMgPSB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzOwogICAgICAgIGlmIChjbGllbnRzKSB7CiAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gbnVsbDsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGNsaWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGNsaWVudCA9IGNsaWVudHNbaV07CiAgICAgICAgICAgIGlmICghY2xpZW50Ll9fZGF0YUVuYWJsZWQpIHsKICAgICAgICAgICAgICBjbGllbnQuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjbGllbnQuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICAgIGNsaWVudC5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQZXJmb3JtIGFueSBpbml0aWFsIHNldHVwIG9uIGNsaWVudCBkb20uIENhbGxlZCBiZWZvcmUgdGhlIGZpcnN0CiAgICAgICAqIGBfZmx1c2hQcm9wZXJ0aWVzYCBjYWxsIG9uIGNsaWVudCBkb20gYW5kIGJlZm9yZSBhbnkgZWxlbWVudAogICAgICAgKiBvYnNlcnZlcnMgYXJlIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICB0aGlzLl9fZW5hYmxlT3JGbHVzaENsaWVudHMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSBiYWcgb2YgcHJvcGVydHkgY2hhbmdlcyB0byB0aGlzIGluc3RhbmNlLCBhbmQKICAgICAgICogc3luY2hyb25vdXNseSBwcm9jZXNzZXMgYWxsIGVmZmVjdHMgb2YgdGhlIHByb3BlcnRpZXMgYXMgYSBiYXRjaC4KICAgICAgICoKICAgICAgICogUHJvcGVydHkgbmFtZXMgbXVzdCBiZSBzaW1wbGUgcHJvcGVydGllcywgbm90IHBhdGhzLiAgQmF0Y2hlZAogICAgICAgKiBwYXRoIHByb3BhZ2F0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2Ygb25lIG9yIG1vcmUga2V5LXZhbHVlIHBhaXJzIHdob3NlIGtleSBpcwogICAgICAgKiAgIGEgcHJvcGVydHkgYW5kIHZhbHVlIGlzIHRoZSBuZXcgdmFsdWUgdG8gc2V0IGZvciB0aGF0IHByb3BlcnR5LgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXRSZWFkT25seSBXaGVuIHRydWUsIGFueSBwcml2YXRlIHZhbHVlcyBzZXQgaW4KICAgICAgICogICBgcHJvcHNgIHdpbGwgYmUgc2V0LiBCeSBkZWZhdWx0LCBgc2V0UHJvcGVydGllc2Agd2lsbCBub3Qgc2V0CiAgICAgICAqICAgYHJlYWRPbmx5OiB0cnVlYCByb290IHByb3BlcnRpZXMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNldFByb3BlcnRpZXMocHJvcHMsIHNldFJlYWRPbmx5KSB7CiAgICAgICAgZm9yIChsZXQgcGF0aCBpbiBwcm9wcykgewogICAgICAgICAgaWYgKHNldFJlYWRPbmx5IHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV0gfHwgIXRoaXNbVFlQRVMuUkVBRF9PTkxZXVtwYXRoXSkgewogICAgICAgICAgICAvL1RPRE8oa3NjaGFhZik6IGV4cGxpY2l0bHkgZGlzYWxsb3cgcGF0aHMgaW4gc2V0UHJvcGVydHk/CiAgICAgICAgICAgIC8vIHdpbGRjYXJkIG9ic2VydmVycyBjdXJyZW50bHkgb25seSBwYXNzIHRoZSBmaXJzdCBjaGFuZ2VkIHBhdGgKICAgICAgICAgICAgLy8gaW4gdGhlIGBpbmZvYCBvYmplY3QsIGFuZCB5b3UgY291bGQgZG8gc29tZSBvZGQgdGhpbmdzIGJhdGNoaW5nCiAgICAgICAgICAgIC8vIHBhdGhzLCBlLmcuIHsnZm9vLmJhcic6IHsuLi59LCAnZm9vJzogbnVsbH0KICAgICAgICAgICAgdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHByb3BzW3BhdGhdLCB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcnNgIHNvIHRoYXQgcHJvcGVydHkgYWNjZXNzb3IKICAgICAgICogc2lkZSBlZmZlY3RzIGFyZSBub3QgZW5hYmxlZCB1bnRpbCBhZnRlciBjbGllbnQgZG9tIGlzIGZ1bGx5IHJlYWR5LgogICAgICAgKiBBbHNvIGNhbGxzIGBfZmx1c2hDbGllbnRzYCBjYWxsYmFjayB0byBlbnN1cmUgY2xpZW50IGRvbSBpcyBlbmFibGVkCiAgICAgICAqIHRoYXQgd2FzIG5vdCBlbmFibGVkIGFzIGEgcmVzdWx0IG9mIGZsdXNoaW5nIHByb3BlcnRpZXMuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVhZHkoKSB7CiAgICAgICAgLy8gSXQgaXMgaW1wb3J0YW50IHRoYXQgYHN1cGVyLnJlYWR5KClgIGlzIG5vdCBjYWxsZWQgaGVyZSBhcyBpdAogICAgICAgIC8vIGltbWVkaWF0ZWx5IHR1cm5zIG9uIGFjY2Vzc29ycy4gSW5zdGVhZCwgd2Ugd2FpdCB1bnRpbCBgcmVhZHlDbGllbnRzYAogICAgICAgIC8vIHRvIGVuYWJsZSBhY2Nlc3NvcnMgdG8gcHJvdmlkZSBhIGd1YXJhbnRlZSB0aGF0IGNsaWVudHMgYXJlIHJlYWR5CiAgICAgICAgLy8gYmVmb3JlIHByb2Nlc3NpbmcgYW55IGFjY2Vzc29ycyBzaWRlIGVmZmVjdHMuCiAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gSWYgbm8gZGF0YSB3YXMgcGVuZGluZywgYF9mbHVzaFByb3BlcnRpZXNgIHdpbGwgbm90IGBmbHVzaENsaWVudHNgCiAgICAgICAgLy8gc28gZW5zdXJlIHRoaXMgaXMgZG9uZS4KICAgICAgICBpZiAoIXRoaXMuX19kYXRhQ2xpZW50c1JlYWR5KSB7CiAgICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICB9CiAgICAgICAgLy8gQmVmb3JlIHJlYWR5LCBjbGllbnQgbm90aWZpY2F0aW9ucyBkbyBub3QgdHJpZ2dlciBfZmx1c2hQcm9wZXJ0aWVzLgogICAgICAgIC8vIFRoZXJlZm9yZSBhIGZsdXNoIGlzIG5lY2Vzc2FyeSBoZXJlIGlmIGRhdGEgaGFzIGJlZW4gc2V0LgogICAgICAgIGlmICh0aGlzLl9fZGF0YVBlbmRpbmcpIHsKICAgICAgICAgIHRoaXMuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5QWNjZXNzb3JzYCdzIHByb3BlcnRpZXMgY2hhbmdlZCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogUnVucyBlYWNoIGNsYXNzIG9mIGVmZmVjdHMgZm9yIHRoZSBiYXRjaCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMgaW4KICAgICAgICogYSBzcGVjaWZpYyBvcmRlciAoY29tcHV0ZSwgcHJvcGFnYXRlLCByZWZsZWN0LCBvYnNlcnZlLCBub3RpZnkpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGN1cnJlbnRQcm9wcyBCYWcgb2YgYWxsIGN1cnJlbnQgYWNjZXNzb3IgdmFsdWVzCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgZWFjaCBwcm9wZXJ0eQogICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcHJvcGVydGllc0NoYW5nZWQoY3VycmVudFByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzKSB7CiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgIC8vIGxldCBjID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoY2hhbmdlZFByb3BzIHx8IHt9KTsKICAgICAgICAvLyB3aW5kb3cuZGVidWcgJiYgY29uc29sZS5ncm91cCh0aGlzLmxvY2FsTmFtZSArICcjJyArIHRoaXMuaWQgKyAnOiAnICsgYyk7CiAgICAgICAgLy8gaWYgKHdpbmRvdy5kZWJ1ZykgeyBkZWJ1Z2dlcjsgfQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBsZXQgaGFzUGF0aHMgPSB0aGlzLl9fZGF0YUhhc1BhdGhzOwogICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHMgPSBmYWxzZTsKICAgICAgICAvLyBDb21wdXRlIHByb3BlcnRpZXMKICAgICAgICBydW5Db21wdXRlZEVmZmVjdHModGhpcywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIC8vIENsZWFyIG5vdGlmeSBwcm9wZXJ0aWVzIHByaW9yIHRvIHBvc3NpYmxlIHJlZW50cnkgKHByb3BhZ2F0ZSwgb2JzZXJ2ZSksCiAgICAgICAgLy8gYnV0IGFmdGVyIGNvbXB1dGluZyBlZmZlY3RzIGhhdmUgYSBjaGFuY2UgdG8gYWRkIHRvIHRoZW0KICAgICAgICBsZXQgbm90aWZ5UHJvcHMgPSB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgIHRoaXMuX19kYXRhVG9Ob3RpZnkgPSBudWxsOwogICAgICAgIC8vIFByb3BhZ2F0ZSBwcm9wZXJ0aWVzIHRvIGNsaWVudHMKICAgICAgICB0aGlzLl9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIC8vIEZsdXNoIGNsaWVudHMKICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICAvLyBSZWZsZWN0IHByb3BlcnRpZXMKICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuUkVGTEVDVF0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBPYnNlcnZlIHByb3BlcnRpZXMKICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuT0JTRVJWRV0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBOb3RpZnkgcHJvcGVydGllcyB0byBob3N0CiAgICAgICAgaWYgKG5vdGlmeVByb3BzKSB7CiAgICAgICAgICBydW5Ob3RpZnlFZmZlY3RzKHRoaXMsIG5vdGlmeVByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocyk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIHRlbXBvcmFyeSBjYWNoZSBhdCBlbmQgb2YgdHVybgogICAgICAgIGlmICh0aGlzLl9fZGF0YUNvdW50ZXIgPT0gMSkgewogICAgICAgICAgdGhpcy5fX2RhdGFUZW1wID0ge307CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAvLyB3aW5kb3cuZGVidWcgJiYgY29uc29sZS5ncm91cEVuZCh0aGlzLmxvY2FsTmFtZSArICcjJyArIHRoaXMuaWQgKyAnOiAnICsgYyk7CiAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHRvIHByb3BhZ2F0ZSBhbnkgcHJvcGVydHkgY2hhbmdlcyB0byBzdGFtcGVkIHRlbXBsYXRlIG5vZGVzCiAgICAgICAqIG1hbmFnZWQgYnkgdGhpcyBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgICAgICBpZiAodGhpc1tUWVBFUy5QUk9QQUdBVEVdKSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuUFJPUEFHQVRFXSwgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgIH0KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5fX3RlbXBsYXRlSW5mbzsKICAgICAgICB3aGlsZSAodGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsCiAgICAgICAgICAgIGhhc1BhdGhzLCB0ZW1wbGF0ZUluZm8ubm9kZUxpc3QpOwogICAgICAgICAgdGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm87CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQWxpYXNlcyBvbmUgZGF0YSBwYXRoIGFzIGFub3RoZXIsIHN1Y2ggdGhhdCBwYXRoIG5vdGlmaWNhdGlvbnMgZnJvbSBvbmUKICAgICAgICogYXJlIHJvdXRlZCB0byB0aGUgb3RoZXIuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSB0byBUYXJnZXQgcGF0aCB0byBsaW5rLgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gZnJvbSBTb3VyY2UgcGF0aCB0byBsaW5rLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBsaW5rUGF0aHModG8sIGZyb20pIHsKICAgICAgICB0byA9IFBvbHltZXIuUGF0aC5ub3JtYWxpemUodG8pOwogICAgICAgIGZyb20gPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKGZyb20pOwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzIHx8IHt9OwogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHNbdG9dID0gZnJvbTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYSBkYXRhIHBhdGggYWxpYXMgcHJldmlvdXNseSBlc3RhYmxpc2hlZCB3aXRoIGBfbGlua1BhdGhzYC4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhlIHBhdGggdG8gdW5saW5rIHNob3VsZCBiZSB0aGUgdGFyZ2V0IChgdG9gKSB1c2VkIHdoZW4KICAgICAgICogbGlua2luZyB0aGUgcGF0aHMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFRhcmdldCBwYXRoIHRvIHVubGluay4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgdW5saW5rUGF0aHMocGF0aCkgewogICAgICAgIHBhdGggPSBQb2x5bWVyLlBhdGgubm9ybWFsaXplKHBhdGgpOwogICAgICAgIGlmICh0aGlzLl9fZGF0YUxpbmtlZFBhdGhzKSB7CiAgICAgICAgICBkZWxldGUgdGhpcy5fX2RhdGFMaW5rZWRQYXRoc1twYXRoXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOb3RpZnkgdGhhdCBhbiBhcnJheSBoYXMgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICAgIHRoaXMuaXRlbXMgPSBbIHtuYW1lOiAnSmltJ30sIHtuYW1lOiAnVG9kZCd9LCB7bmFtZTogJ0JpbGwnfSBdOwogICAgICAgKiAgICAgLi4uCiAgICAgICAqICAgICB0aGlzLml0ZW1zLnNwbGljZSgxLCAxLCB7bmFtZTogJ1NhbSd9KTsKICAgICAgICogICAgIHRoaXMuaXRlbXMucHVzaCh7bmFtZTogJ0JvYid9KTsKICAgICAgICogICAgIHRoaXMubm90aWZ5U3BsaWNlcygnaXRlbXMnLCBbCiAgICAgICAqICAgICAgIHsgaW5kZXg6IDEsIHJlbW92ZWQ6IFt7bmFtZTogJ1RvZGQnfV0sIGFkZGVkQ291bnQ6IDEsIG9iamVjdDogdGhpcy5pdGVtcywgdHlwZTogJ3NwbGljZScgfSwKICAgICAgICogICAgICAgeyBpbmRleDogMywgcmVtb3ZlZDogW10sIGFkZGVkQ291bnQ6IDEsIG9iamVjdDogdGhpcy5pdGVtcywgdHlwZTogJ3NwbGljZSd9CiAgICAgICAqICAgICBdKTsKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0aGF0IHNob3VsZCBiZSBub3RpZmllZC4KICAgICAgICogQHBhcmFtIHtBcnJheX0gc3BsaWNlcyBBcnJheSBvZiBzcGxpY2UgcmVjb3JkcyBpbmRpY2F0aW5nIG9yZGVyZWQKICAgICAgICogICBjaGFuZ2VzIHRoYXQgb2NjdXJyZWQgdG8gdGhlIGFycmF5LiBFYWNoIHJlY29yZCBzaG91bGQgaGF2ZSB0aGUKICAgICAgICogICBmb2xsb3dpbmcgZmllbGRzOgogICAgICAgKiAgICAqIGluZGV4OiBpbmRleCBhdCB3aGljaCB0aGUgY2hhbmdlIG9jY3VycmVkCiAgICAgICAqICAgICogcmVtb3ZlZDogYXJyYXkgb2YgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGlzIGluZGV4CiAgICAgICAqICAgICogYWRkZWRDb3VudDogbnVtYmVyIG9mIG5ldyBpdGVtcyBhZGRlZCBhdCB0aGlzIGluZGV4CiAgICAgICAqICAgICogb2JqZWN0OiBhIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgaW4gcXVlc3Rpb24KICAgICAgICogICAgKiB0eXBlOiB0aGUgc3RyaW5nIGxpdGVyYWwgJ3NwbGljZScKICAgICAgICoKICAgICAgICogICBOb3RlIHRoYXQgc3BsaWNlIHJlY29yZHMgX211c3RfIGJlIG5vcm1hbGl6ZWQgc3VjaCB0aGF0IHRoZXkgYXJlCiAgICAgICAqICAgcmVwb3J0ZWQgaW4gaW5kZXggb3JkZXIgKHJhdyByZXN1bHRzIGZyb20gYE9iamVjdC5vYnNlcnZlYCBhcmUgbm90CiAgICAgICAqICAgb3JkZXJlZCBhbmQgbXVzdCBiZSBub3JtYWxpemVkL21lcmdlZCBiZWZvcmUgbm90aWZ5aW5nKS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBub3RpZnlTcGxpY2VzKHBhdGgsIHNwbGljZXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbm90aWZ5U3BsaWNlcyh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBzcGxpY2VzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgcmVhZGluZyBhIHZhbHVlIGZyb20gYSBwYXRoLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiBhbnkgcGFydCBpbiB0aGUgcGF0aCBpcyB1bmRlZmluZWQsIHRoaXMgbWV0aG9kIHJldHVybnMKICAgICAgICogYHVuZGVmaW5lZGAgKHRoaXMgbWV0aG9kIGRvZXMgbm90IHRocm93IHdoZW4gZGVyZWZlcmVuY2luZyB1bmRlZmluZWQKICAgICAgICogcGF0aHMpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8IUFycmF5PChzdHJpbmd8bnVtYmVyKT4pfSBwYXRoIFBhdGggdG8gdGhlIHZhbHVlCiAgICAgICAqICAgdG8gcmVhZC4gIFRoZSBwYXRoIG1heSBiZSBzcGVjaWZpZWQgYXMgYSBzdHJpbmcgKGUuZy4gYGZvby5iYXIuYmF6YCkKICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgKiAgIGJyYWNrZXRlZCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZDsgc3RyaW5nLWJhc2VkIHBhdGggcGFydHMKICAgICAgICogICAqbXVzdCogYmUgc2VwYXJhdGVkIGJ5IGRvdHMuICBOb3RlIHRoYXQgd2hlbiBkZXJlZmVyZW5jaW5nIGFycmF5CiAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICogICAoZS5nLiBgdXNlcnMuMTIubmFtZWAgb3IgYFsndXNlcnMnLCAxMiwgJ25hbWUnXWApLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHJvb3QgUm9vdCBvYmplY3QgZnJvbSB3aGljaCB0aGUgcGF0aCBpcyBldmFsdWF0ZWQuCiAgICAgICAqIEByZXR1cm4geyp9IFZhbHVlIGF0IHRoZSBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBhbnkgcGFydCBvZiB0aGUgcGF0aAogICAgICAgKiAgIGlzIHVuZGVmaW5lZC4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgZ2V0KHBhdGgsIHJvb3QpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5QYXRoLmdldChyb290IHx8IHRoaXMsIHBhdGgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGEgdmFsdWUgdG8gYSBwYXRoIGFuZCBub3RpZnlpbmcgYW55CiAgICAgICAqIGVsZW1lbnRzIGJvdW5kIHRvIHRoZSBzYW1lIHBhdGguCiAgICAgICAqCiAgICAgICAqIE5vdGUsIGlmIGFueSBwYXJ0IGluIHRoZSBwYXRoIGV4Y2VwdCBmb3IgdGhlIGxhc3QgaXMgdW5kZWZpbmVkLAogICAgICAgKiB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcgKHRoaXMgbWV0aG9kIGRvZXMgbm90IHRocm93IHdoZW4KICAgICAgICogZGVyZWZlcmVuY2luZyB1bmRlZmluZWQgcGF0aHMpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyhzdHJpbmd8IUFycmF5PChzdHJpbmd8bnVtYmVyKT4pfSBwYXRoIFBhdGggdG8gdGhlIHZhbHVlCiAgICAgICAqICAgdG8gd3JpdGUuICBUaGUgcGF0aCBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChlLmcuIGAnZm9vLmJhci5iYXonYCkKICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgKiAgIGJyYWNrZXRlZCBleHByZXNzaW9ucyBhcmUgbm90IHN1cHBvcnRlZDsgc3RyaW5nLWJhc2VkIHBhdGggcGFydHMKICAgICAgICogICAqbXVzdCogYmUgc2VwYXJhdGVkIGJ5IGRvdHMuICBOb3RlIHRoYXQgd2hlbiBkZXJlZmVyZW5jaW5nIGFycmF5CiAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICogICAoZS5nLiBgJ3VzZXJzLjEyLm5hbWUnYCBvciBgWyd1c2VycycsIDEyLCAnbmFtZSddYCkuCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IGF0IHRoZSBzcGVjaWZpZWQgcGF0aC4KICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSByb290IFJvb3Qgb2JqZWN0IGZyb20gd2hpY2ggdGhlIHBhdGggaXMgZXZhbHVhdGVkLgogICAgICAgKiAgIFdoZW4gc3BlY2lmaWVkLCBubyBub3RpZmljYXRpb24gd2lsbCBvY2N1ci4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBzZXQocGF0aCwgdmFsdWUsIHJvb3QpIHsKICAgICAgICBpZiAocm9vdCkgewogICAgICAgICAgUG9seW1lci5QYXRoLnNldChyb290LCBwYXRoLCB2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghdGhpc1tUWVBFUy5SRUFEX09OTFldIHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV1bLyoqIEB0eXBlIHtzdHJpbmd9ICovKHBhdGgpXSkgewogICAgICAgICAgICBpZiAodGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHZhbHVlLCB0cnVlKSkgewogICAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBZGRzIGl0ZW1zIG9udG8gdGhlIGVuZCBvZiB0aGUgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wdXNoYC4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgb3RoZXIgcGF0aHMgdG8gdGhlIHNhbWUgYXJyYXkgdGhhdCBhCiAgICAgICAqIHNwbGljZSBvY2N1cnJlZCB0byB0aGUgYXJyYXkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFBhdGggdG8gYXJyYXkuCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gaXRlbXMgSXRlbXMgdG8gcHVzaCBvbnRvIGFycmF5CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHB1c2gocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0qLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICBsZXQgbGVuID0gYXJyYXkubGVuZ3RoOwogICAgICAgIGxldCByZXQgPSBhcnJheS5wdXNoKC4uLml0ZW1zKTsKICAgICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgbGVuLCBpdGVtcy5sZW5ndGgsIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBlbmQgb2YgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgKgogICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wb3BgLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICogc3BsaWNlIG9jY3VycmVkIHRvIHRoZSBhcnJheS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICogQHJldHVybiB7Kn0gSXRlbSB0aGF0IHdhcyByZW1vdmVkLgogICAgICAgKiBAcHVibGljCiAgICAgICAqLwogICAgICBwb3AocGF0aCkgewogICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICBsZXQgYXJyYXkgPSAvKiogQHR5cGUge0FycmF5fSAqLyhQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICBsZXQgaGFkTGVuZ3RoID0gQm9vbGVhbihhcnJheS5sZW5ndGgpOwogICAgICAgIGxldCByZXQgPSBhcnJheS5wb3AoKTsKICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgYXJyYXkubGVuZ3RoLCAwLCBbcmV0XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdGFydGluZyBmcm9tIHRoZSBzdGFydCBpbmRleCBzcGVjaWZpZWQsIHJlbW92ZXMgMCBvciBtb3JlIGl0ZW1zCiAgICAgICAqIGZyb20gdGhlIGFycmF5IGFuZCBpbnNlcnRzIDAgb3IgbW9yZSBuZXcgaXRlbXMgaW4gdGhlaXIgcGxhY2UuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnNwbGljZWAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgSW5kZXggZnJvbSB3aGljaCB0byBzdGFydCByZW1vdmluZy9pbnNlcnRpbmcuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZWxldGVDb3VudCBOdW1iZXIgb2YgaXRlbXMgdG8gcmVtb3ZlLgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbnRvIGFycmF5LgogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgb2YgcmVtb3ZlZCBpdGVtcy4KICAgICAgICogQHB1YmxpYwogICAgICAgKi8KICAgICAgc3BsaWNlKHBhdGgsIHN0YXJ0LCBkZWxldGVDb3VudCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoIDogJyd9OwogICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovKFBvbHltZXIuUGF0aC5nZXQodGhpcywgcGF0aCwgaW5mbykpOwogICAgICAgIC8vIE5vcm1hbGl6ZSBmYW5jeSBuYXRpdmUgc3BsaWNlIGhhbmRsaW5nIG9mIGNyYXp5IHN0YXJ0IHZhbHVlcwogICAgICAgIGlmIChzdGFydCA8IDApIHsKICAgICAgICAgIHN0YXJ0ID0gYXJyYXkubGVuZ3RoIC0gTWF0aC5mbG9vcigtc3RhcnQpOwogICAgICAgIH0gZWxzZSBpZiAoc3RhcnQpIHsKICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCk7CiAgICAgICAgfQogICAgICAgIC8vIGFycmF5LnNwbGljZSBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMKICAgICAgICAvLyB5b3UgcGFzcyBpbi4gVGhlcmVmb3JlLCBhcnJheS5zcGxpY2UoMCkgYW5kIGFycmF5LnNwbGljZSgwLCB1bmRlZmluZWQpCiAgICAgICAgLy8gZG8gZGlmZmVyZW50IHRoaW5ncy4gSW4gdGhlIGZvcm1lciwgdGhlIHdob2xlIGFycmF5IGlzIGNsZWFyZWQuIEluIHRoZQogICAgICAgIC8vIGxhdHRlciwgbm8gaXRlbXMgYXJlIHJlbW92ZWQuCiAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIG5lZWQgdG8gZGV0ZWN0IHdoZXRoZXIgMS4gb25lIG9mIHRoZSBhcmd1bWVudHMKICAgICAgICAvLyBpcyBhY3R1YWxseSBwYXNzZWQgaW4gYW5kIHRoZW4gMi4gZGV0ZXJtaW5lIGhvdyBtYW55IGFyZ3VtZW50cwogICAgICAgIC8vIHdlIHNob3VsZCBwYXNzIG9uIHRvIHRoZSBuYXRpdmUgYXJyYXkuc3BsaWNlCiAgICAgICAgLy8KICAgICAgICBsZXQgcmV0OwogICAgICAgIC8vIE9taXQgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGlmIHRoZXkgd2VyZSBub3QgcGFzc2VkIGluCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgICAgICAgIHJldCA9IGFycmF5LnNwbGljZShzdGFydCk7CiAgICAgICAgLy8gRWl0aGVyIHN0YXJ0IHdhcyB1bmRlZmluZWQgYW5kIHRoZSBvdGhlcnMgd2VyZSBkZWZpbmVkLCBidXQgaW4gdGhpcwogICAgICAgIC8vIGNhc2Ugd2UgY2FuIHNhZmVseSBwYXNzIG9uIGFsbCBhcmd1bWVudHMKICAgICAgICAvLwogICAgICAgIC8vIE5vdGU6IHRoaXMgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgbm9uZSBvZiB0aGUgYXJndW1lbnRzIHdlcmUgcGFzc2VkIGluLAogICAgICAgIC8vIGUuZy4gdGhpcy5zcGxpY2UoJ2FycmF5JykuIEhvd2V2ZXIsIGlmIGJvdGggc3RhcnQgYW5kIGRlbGV0ZUNvdW50CiAgICAgICAgLy8gYXJlIHVuZGVmaW5lZCwgYXJyYXkuc3BsaWNlIHdpbGwgbm90IG1vZGlmeSB0aGUgYXJyYXkgKGFzIGV4cGVjdGVkKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXQgPSBhcnJheS5zcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50LCAuLi5pdGVtcyk7CiAgICAgICAgfQogICAgICAgIC8vIEF0IHRoZSBlbmQsIGNoZWNrIHdoZXRoZXIgYW55IGl0ZW1zIHdlcmUgcGFzc2VkIGluIChlLmcuIGluc2VydGlvbnMpCiAgICAgICAgLy8gb3IgaWYgdGhlIHJldHVybiBhcnJheSBjb250YWlucyBpdGVtcyAoZS5nLiBkZWxldGlvbnMpLgogICAgICAgIC8vIE9ubHkgbm90aWZ5IGlmIGl0ZW1zIHdlcmUgYWRkZWQgb3IgZGVsZXRlZC4KICAgICAgICBpZiAoaXRlbXMubGVuZ3RoIHx8IHJldC5sZW5ndGgpIHsKICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBzdGFydCwgaXRlbXMubGVuZ3RoLCByZXQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSBhdCB0aGUgcGF0aCBzcGVjaWZpZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnBvcGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIHRoYXQgd2FzIHJlbW92ZWQuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHNoaWZ0KHBhdGgpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IGhhZExlbmd0aCA9IEJvb2xlYW4oYXJyYXkubGVuZ3RoKTsKICAgICAgICBsZXQgcmV0ID0gYXJyYXkuc2hpZnQoKTsKICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICBub3RpZnlTcGxpY2UodGhpcywgYXJyYXksIGluZm8ucGF0aCwgMCwgMCwgW3JldF0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQWRkcyBpdGVtcyBvbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IGF0IHRoZSBwYXRoIHNwZWNpZmllZC4KICAgICAgICoKICAgICAgICogVGhlIGFyZ3VtZW50cyBhZnRlciBgcGF0aGAgYW5kIHJldHVybiB2YWx1ZSBtYXRjaCB0aGF0IG9mCiAgICAgICAqIGBBcnJheS5wcm90b3R5cGUucHVzaGAuCiAgICAgICAqCiAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbmZvIGFycmF5CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAqIEBwdWJsaWMKICAgICAgICovCiAgICAgIHVuc2hpZnQocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICBsZXQgaW5mbyA9IHtwYXRoOiAnJ307CiAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgbGV0IHJldCA9IGFycmF5LnVuc2hpZnQoLi4uaXRlbXMpOwogICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCAwLCBpdGVtcy5sZW5ndGgsIFtdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJldDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE5vdGlmeSB0aGF0IGEgcGF0aCBoYXMgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogRXhhbXBsZToKICAgICAgICoKICAgICAgICogICAgIHRoaXMuaXRlbS51c2VyLm5hbWUgPSAnQm9iJzsKICAgICAgICogICAgIHRoaXMubm90aWZ5UGF0aCgnaXRlbS51c2VyLm5hbWUnKTsKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCB0aGF0IHNob3VsZCBiZSBub3RpZmllZC4KICAgICAgICogQHBhcmFtIHsqPX0gdmFsdWUgVmFsdWUgYXQgdGhlIHBhdGggKG9wdGlvbmFsKS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHB1YmxpYwogICAgICAqLwogICAgICBub3RpZnlQYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgbGV0IHByb3BQYXRoOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICAgIC8vIEdldCB2YWx1ZSBpZiBub3Qgc3VwcGxpZWQKICAgICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICAgIHZhbHVlID0gUG9seW1lci5QYXRoLmdldCh0aGlzLCBwYXRoLCBpbmZvKTsKICAgICAgICAgIHByb3BQYXRoID0gaW5mby5wYXRoOwogICAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgICAgLy8gTm9ybWFsaXplIHBhdGggaWYgbmVlZGVkCiAgICAgICAgICBwcm9wUGF0aCA9IFBvbHltZXIuUGF0aC5ub3JtYWxpemUocGF0aCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHByb3BQYXRoID0gLyoqIEB0eXBle3N0cmluZ30gKi8ocGF0aCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcFBhdGgsIHZhbHVlLCB0cnVlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eWAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHByb3RlY3RlZFNldHRlciBDcmVhdGVzIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIKICAgICAgICogICB3aGVuIGB0cnVlYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcikgewogICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgIGlmIChwcm90ZWN0ZWRTZXR0ZXIpIHsKICAgICAgICAgIHRoaXNbJ19zZXQnICsgdXBwZXIocHJvcGVydHkpXSA9IC8qKiBAdGhpcyB7UHJvcGVydHlFZmZlY3RzfSAqL2Z1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtzdHJpbmd8ZnVuY3Rpb24oKiwqKX0gbWV0aG9kIEZ1bmN0aW9uIG9yIG5hbWUgb2Ygb2JzZXJ2ZXIgbWV0aG9kIHRvIGNhbGwKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gZHluYW1pY0ZuIFdoZXRoZXIgdGhlIG1ldGhvZCBuYW1lIHNob3VsZCBiZSBpbmNsdWRlZCBhcwogICAgICAgKiAgIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfY3JlYXRlUHJvcGVydHlPYnNlcnZlcihwcm9wZXJ0eSwgbWV0aG9kLCBkeW5hbWljRm4pIHsKICAgICAgICBsZXQgaW5mbyA9IHsgcHJvcGVydHksIG1ldGhvZCwgZHluYW1pY0ZuOiBCb29sZWFuKGR5bmFtaWNGbikgfTsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuT0JTRVJWRSwgewogICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogcHJvcGVydHl9CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGR5bmFtaWNGbikgewogICAgICAgICAgdGhpcy5fYWRkUHJvcGVydHlFZmZlY3QoLyoqIEB0eXBlIHtzdHJpbmd9ICovKG1ldGhvZCksIFRZUEVTLk9CU0VSVkUsIHsKICAgICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogbWV0aG9kfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZU1ldGhvZE9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIGxldCBzaWcgPSBwYXJzZU1ldGhvZChleHByZXNzaW9uKTsKICAgICAgICBpZiAoIXNpZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgb2JzZXJ2ZXIgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVNZXRob2RFZmZlY3QodGhpcywgc2lnLCBUWVBFUy5PQlNFUlZFLCBydW5NZXRob2RFZmZlY3QsIG51bGwsIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlTm90aWZ5aW5nUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuTk9USUZZLCB7CiAgICAgICAgICBmbjogcnVuTm90aWZ5RWZmZWN0LAogICAgICAgICAgaW5mbzogewogICAgICAgICAgICBldmVudE5hbWU6IENhc2VNYXAuY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KSArICctY2hhbmdlZCcsCiAgICAgICAgICAgIHByb3BlcnR5OiBwcm9wZXJ0eQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZVJlZmxlY3RlZFByb3BlcnR5YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgbGV0IGF0dHIgPSB0aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgICAgaWYgKGF0dHJbMF0gPT09ICctJykgewogICAgICAgICAgY29uc29sZS53YXJuKCdQcm9wZXJ0eSAnICsgcHJvcGVydHkgKyAnIGNhbm5vdCBiZSByZWZsZWN0ZWQgdG8gYXR0cmlidXRlICcgKwogICAgICAgICAgICBhdHRyICsgJyBiZWNhdXNlICItIiBpcyBub3QgYSB2YWxpZCBzdGFydGluZyBhdHRyaWJ1dGUgbmFtZS4gVXNlIGEgbG93ZXJjYXNlIGZpcnN0IGxldHRlciBmb3IgdGhlIHByb3BlcnR5IGluc3RlYWQuJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5SRUZMRUNULCB7CiAgICAgICAgICAgIGZuOiBydW5SZWZsZWN0RWZmZWN0LAogICAgICAgICAgICBpbmZvOiB7CiAgICAgICAgICAgICAgYXR0ck5hbWU6IGF0dHIKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZUNvbXB1dGVkUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZwogICAgICAgKiAgIHdoZXRoZXIgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2NyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIGxldCBzaWcgPSBwYXJzZU1ldGhvZChleHByZXNzaW9uKTsKICAgICAgICBpZiAoIXNpZykgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgY29tcHV0ZWQgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgIH0KICAgICAgICBjcmVhdGVNZXRob2RFZmZlY3QodGhpcywgc2lnLCBUWVBFUy5DT01QVVRFLCBydW5Db21wdXRlZEVmZmVjdCwgcHJvcGVydHksIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBHYXRoZXIgdGhlIGFyZ3VtZW50IHZhbHVlcyBmb3IgYSBtZXRob2Qgc3BlY2lmaWVkIGluIHRoZSBwcm92aWRlZCBhcnJheQogICAgICAgKiBvZiBhcmd1bWVudCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogVGhlIGBwYXRoYCBhbmQgYHZhbHVlYCBhcmd1bWVudHMgYXJlIHVzZWQgdG8gZmlsbCBpbiB3aWxkY2FyZCBkZXNjcmlwdG9yCiAgICAgICAqIHdoZW4gdGhlIG1ldGhvZCBpcyBiZWluZyBjYWxsZWQgYXMgYSByZXN1bHQgb2YgYSBwYXRoIG5vdGlmaWNhdGlvbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshQXJyYXk8IU1ldGhvZEFyZz59IGFyZ3MgQXJyYXkgb2YgYXJndW1lbnQgbWV0YWRhdGEKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUHJvcGVydHkvcGF0aCBuYW1lIHRoYXQgdHJpZ2dlcmVkIHRoZSBtZXRob2QgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAqIEByZXR1cm4ge0FycmF5PCo+fSBBcnJheSBvZiBhcmd1bWVudCB2YWx1ZXMKICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9tYXJzaGFsQXJncyhhcmdzLCBwYXRoLCBwcm9wcykgewogICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLl9fZGF0YTsKICAgICAgICBsZXQgdmFsdWVzID0gW107CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPWFyZ3MubGVuZ3RoOyBpPGw7IGkrKykgewogICAgICAgICAgbGV0IGFyZyA9IGFyZ3NbaV07CiAgICAgICAgICBsZXQgbmFtZSA9IGFyZy5uYW1lOwogICAgICAgICAgbGV0IHY7CiAgICAgICAgICBpZiAoYXJnLmxpdGVyYWwpIHsKICAgICAgICAgICAgdiA9IGFyZy52YWx1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChhcmcuc3RydWN0dXJlZCkgewogICAgICAgICAgICAgIHYgPSBQb2x5bWVyLlBhdGguZ2V0KGRhdGEsIG5hbWUpOwogICAgICAgICAgICAgIC8vIHdoZW4gZGF0YSBpcyBub3Qgc3RvcmVkIGUuZy4gYHNwbGljZXNgCiAgICAgICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdiA9IHByb3BzW25hbWVdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2ID0gZGF0YVtuYW1lXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGFyZy53aWxkY2FyZCkgewogICAgICAgICAgICAvLyBPbmx5IHNlbmQgdGhlIGFjdHVhbCBwYXRoIGNoYW5nZWQgaW5mbyBpZiB0aGUgY2hhbmdlIHRoYXQKICAgICAgICAgICAgLy8gY2F1c2VkIHRoZSBvYnNlcnZlciB0byBydW4gbWF0Y2hlZCB0aGUgd2lsZGNhcmQKICAgICAgICAgICAgbGV0IGJhc2VDaGFuZ2VkID0gKG5hbWUuaW5kZXhPZihwYXRoICsgJy4nKSA9PT0gMCk7CiAgICAgICAgICAgIGxldCBtYXRjaGVzID0gKHBhdGguaW5kZXhPZihuYW1lKSA9PT0gMCAmJiAhYmFzZUNoYW5nZWQpOwogICAgICAgICAgICB2YWx1ZXNbaV0gPSB7CiAgICAgICAgICAgICAgcGF0aDogbWF0Y2hlcyA/IHBhdGggOiBuYW1lLAogICAgICAgICAgICAgIHZhbHVlOiBtYXRjaGVzID8gcHJvcHNbcGF0aF0gOiB2LAogICAgICAgICAgICAgIGJhc2U6IHYKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZXM7CiAgICAgIH0KCiAgICAgIC8vIC0tIHN0YXRpYyBjbGFzcyBtZXRob2RzIC0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVuc3VyZXMgYW4gYWNjZXNzb3IgZXhpc3RzIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LCBhbmQgYWRkcwogICAgICAgKiB0byBhIGxpc3Qgb2YgInByb3BlcnR5IGVmZmVjdHMiIHRoYXQgd2lsbCBydW4gd2hlbiB0aGUgYWNjZXNzb3IgZm9yCiAgICAgICAqIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaXMgc2V0LiAgRWZmZWN0cyBhcmUgZ3JvdXBlZCBieSAidHlwZSIsIHdoaWNoCiAgICAgICAqIHJvdWdobHkgY29ycmVzcG9uZHMgdG8gYSBwaGFzZSBpbiBlZmZlY3QgcHJvY2Vzc2luZy4gIFRoZSBlZmZlY3QKICAgICAgICogbWV0YWRhdGEgc2hvdWxkIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybToKICAgICAgICoKICAgICAgICogICAgIHsKICAgICAgICogICAgICAgZm46IGVmZmVjdEZ1bmN0aW9uLCAvLyBSZWZlcmVuY2UgdG8gZnVuY3Rpb24gdG8gY2FsbCB0byBwZXJmb3JtIGVmZmVjdAogICAgICAgKiAgICAgICBpbmZvOiB7IC4uLiB9ICAgICAgIC8vIEVmZmVjdCBtZXRhZGF0YSBwYXNzZWQgdG8gZnVuY3Rpb24KICAgICAgICogICAgICAgdHJpZ2dlcjogeyAgICAgICAgICAvLyBPcHRpb25hbCB0cmlnZ2VyaW5nIG1ldGFkYXRhOyBpZiBub3QgcHJvdmlkZWQKICAgICAgICogICAgICAgICBuYW1lOiBzdHJpbmcgICAgICAvLyB0aGUgcHJvcGVydHkgaXMgdHJlYXRlZCBhcyBhIHdpbGRjYXJkCiAgICAgICAqICAgICAgICAgc3RydWN0dXJlZDogYm9vbGVhbgogICAgICAgKiAgICAgICAgIHdpbGRjYXJkOiBib29sZWFuCiAgICAgICAqICAgICAgIH0KICAgICAgICogICAgIH0KICAgICAgICoKICAgICAgICogRWZmZWN0cyBhcmUgY2FsbGVkIGZyb20gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgaW4gdGhlIGZvbGxvd2luZyBvcmRlciBieQogICAgICAgKiB0eXBlOgogICAgICAgKgogICAgICAgKiAxLiBDT01QVVRFCiAgICAgICAqIDIuIFBST1BBR0FURQogICAgICAgKiAzLiBSRUZMRUNUCiAgICAgICAqIDQuIE9CU0VSVkUKICAgICAgICogNS4gTk9USUZZCiAgICAgICAqCiAgICAgICAqIEVmZmVjdCBmdW5jdGlvbnMgYXJlIGNhbGxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgc2lnbmF0dXJlOgogICAgICAgKgogICAgICAgKiAgICAgZWZmZWN0RnVuY3Rpb24oaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBpbmZvLCBoYXNQYXRocykKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgKiBAcGFyYW0ge09iamVjdD19IGVmZmVjdCBFZmZlY3QgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBhZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCB0eXBlLCBlZmZlY3QpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIHNpbmdsZS1wcm9wZXJ0eSBvYnNlcnZlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ3xmdW5jdGlvbigqLCopfSBtZXRob2QgRnVuY3Rpb24gb3IgbmFtZSBvZiBvYnNlcnZlciBtZXRob2QgdG8gY2FsbAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBkeW5hbWljRm4gV2hldGhlciB0aGUgbWV0aG9kIG5hbWUgc2hvdWxkIGJlIGluY2x1ZGVkIGFzCiAgICAgICAqICAgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgbXVsdGktcHJvcGVydHkgIm1ldGhvZCBvYnNlcnZlciIgYmFzZWQgb24gdGhlIHByb3ZpZGVkCiAgICAgICAqIGV4cHJlc3Npb24sIHdoaWNoIHNob3VsZCBiZSBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiBhIG5vcm1hbCBKYXZhU2NyaXB0CiAgICAgICAqIGZ1bmN0aW9uIHNpZ25hdHVyZTogYCdtZXRob2ROYW1lKGFyZzEsIFsuLi4sIGFyZ25dKSdgLiAgRWFjaCBhcmd1bWVudAogICAgICAgKiBzaG91bGQgY29ycmVzcG9uZCB0byBhIHByb3BlcnR5IG9yIHBhdGggaW4gdGhlIGNvbnRleHQgb2YgdGhpcwogICAgICAgKiBwcm90b3R5cGUgKG9yIGluc3RhbmNlKSwgb3IgbWF5IGJlIGEgbGl0ZXJhbCBzdHJpbmcgb3IgbnVtYmVyLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBNZXRob2QgZXhwcmVzc2lvbgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW58T2JqZWN0PX0gZHluYW1pY0ZuIEJvb2xlYW4gb3Igb2JqZWN0IG1hcCBpbmRpY2F0aW5nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqICAgd2hldGhlciBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlTWV0aG9kT2JzZXJ2ZXIoZXhwcmVzc2lvbiwgZHluYW1pY0ZuKSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYXVzZXMgdGhlIHNldHRlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IHRvIGRpc3BhdGNoIGA8cHJvcGVydHk+LWNoYW5nZWRgCiAgICAgICAqIGV2ZW50cyB0byBub3RpZnkgb2YgY2hhbmdlcyB0byB0aGUgcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBjcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSkgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIFRvIHNldCB0aGUgcHJvcGVydHksIHVzZSB0aGUgcHJvdGVjdGVkIGBfc2V0UHJvcGVydHlgIEFQSS4KICAgICAgICogVG8gY3JlYXRlIGEgY3VzdG9tIHByb3RlY3RlZCBzZXR0ZXIgKGUuZy4gYF9zZXRNeVByb3AoKWAgZm9yCiAgICAgICAqIHByb3BlcnR5IGBteVByb3BgKSwgcGFzcyBgdHJ1ZWAgZm9yIGBwcm90ZWN0ZWRTZXR0ZXJgLgogICAgICAgKgogICAgICAgKiBOb3RlLCBpZiB0aGUgcHJvcGVydHkgd2lsbCBoYXZlIG90aGVyIHByb3BlcnR5IGVmZmVjdHMsIHRoaXMgbWV0aG9kCiAgICAgICAqIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIGJlZm9yZSBhZGRpbmcgb3RoZXIgZWZmZWN0cy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcHJvdGVjdGVkU2V0dGVyIENyZWF0ZXMgYSBjdXN0b20gcHJvdGVjdGVkIHNldHRlcgogICAgICAgKiAgIHdoZW4gYHRydWVgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eShwcm9wZXJ0eSwgcHJvdGVjdGVkU2V0dGVyKSB7CiAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYXVzZXMgdGhlIHNldHRlciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IHRvIHJlZmxlY3QgdGhlIHByb3BlcnR5IHZhbHVlCiAgICAgICAqIHRvIGEgKGRhc2gtY2FzZWQpIGF0dHJpYnV0ZSBvZiB0aGUgc2FtZSBuYW1lLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5IHdob3NlIHZhbHVlIGlzIHNldCB0byB0aGUgcmVzdWx0IG9mIHRoZQogICAgICAgKiBtZXRob2QgZGVzY3JpYmVkIGJ5IHRoZSBnaXZlbiBgZXhwcmVzc2lvbmAgZWFjaCB0aW1lIG9uZSBvciBtb3JlCiAgICAgICAqIGFyZ3VtZW50cyB0byB0aGUgbWV0aG9kIGNoYW5nZXMuICBUaGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgYSBzdHJpbmcKICAgICAgICogaW4gdGhlIGZvcm0gb2YgYSBub3JtYWwgSmF2YVNjcmlwdCBmdW5jdGlvbiBzaWduYXR1cmU6CiAgICAgICAqIGAnbWV0aG9kTmFtZShhcmcxLCBbLi4uLCBhcmduXSknYAogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBjb21wdXRlZCBwcm9wZXJ0eSB0byBzZXQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICAgICAqICAgbWV0aG9kIG5hbWVzIHNob3VsZCBiZSBpbmNsdWRlZCBhcyBhIGRlcGVuZGVuY3kgdG8gdGhlIGVmZmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KHByb3BlcnR5LCBleHByZXNzaW9uLCBkeW5hbWljRm4pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGFyc2VzIHRoZSBwcm92aWRlZCB0ZW1wbGF0ZSB0byBlbnN1cmUgYmluZGluZyBlZmZlY3RzIGFyZSBjcmVhdGVkCiAgICAgICAqIGZvciB0aGVtLCBhbmQgdGhlbiBlbnN1cmVzIHByb3BlcnR5IGFjY2Vzc29ycyBhcmUgY3JlYXRlZCBmb3IgYW55CiAgICAgICAqIGRlcGVuZGVudCBwcm9wZXJ0aWVzIGluIHRoZSB0ZW1wbGF0ZS4gIEJpbmRpbmcgZWZmZWN0cyBmb3IgYm91bmQKICAgICAgICogdGVtcGxhdGVzIGFyZSBzdG9yZWQgaW4gYSBsaW5rZWQgbGlzdCBvbiB0aGUgaW5zdGFuY2Ugc28gdGhhdAogICAgICAgKiB0ZW1wbGF0ZXMgY2FuIGJlIGVmZmljaWVudGx5IHN0YW1wZWQgYW5kIHVuc3RhbXBlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgY29udGFpbmluZyBiaW5kaW5nCiAgICAgICAqICAgYmluZGluZ3MKICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBiaW5kVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgIH0KCiAgICAgIC8vIC0tIGJpbmRpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgLyoqCiAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBiaW5kVGVtcGxhdGVgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG9uIHRoZSBwcm90b3R5cGUgKGZvciBwcm90b3R5cGljYWwgdGVtcGxhdGUKICAgICAgICogYmluZGluZywgdG8gYXZvaWQgY3JlYXRpbmcgYWNjZXNzb3JzIGV2ZXJ5IGluc3RhbmNlKSBvbmNlIHBlciBwcm90b3R5cGUsCiAgICAgICAqIGFuZCB3aWxsIGJlIGNhbGxlZCB3aXRoIGBydW50aW1lQmluZGluZzogdHJ1ZWAgYnkgYF9zdGFtcFRlbXBsYXRlYCB0bwogICAgICAgKiBjcmVhdGUgYW5kIGxpbmsgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBhCiAgICAgICAqIHBhcnRpY3VsYXIgc3RhbXBpbmcuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIGNvbnRhaW5pbmcgYmluZGluZwogICAgICAgKiAgIGJpbmRpbmdzCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGluc3RhbmNlQmluZGluZyBXaGVuIGZhbHNlIChkZWZhdWx0KSwgcGVyZm9ybXMKICAgICAgICogICAicHJvdG90eXBpY2FsIiBiaW5kaW5nIG9mIHRoZSB0ZW1wbGF0ZSBhbmQgb3ZlcndyaXRlcyBhbnkgcHJldmlvdXNseQogICAgICAgKiAgIGJvdW5kIHRlbXBsYXRlIGZvciB0aGUgY2xhc3MuIFdoZW4gdHJ1ZSAoYXMgcGFzc2VkIGZyb20KICAgICAgICogICBgX3N0YW1wVGVtcGxhdGVgKSwgdGhlIHRlbXBsYXRlIGluZm8gaXMgaW5zdGFuY2VkIGFuZCBsaW5rZWQgaW50bwogICAgICAgKiAgIHRoZSBsaXN0IG9mIGJvdW5kIHRlbXBsYXRlcy4KICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0OyBmb3IgYHJ1bnRpbWVCaW5kaW5nYCwKICAgICAgICogICB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBwcm90b3R5cGljYWwgdGVtcGxhdGUgaW5mbwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfYmluZFRlbXBsYXRlKHRlbXBsYXRlLCBpbnN0YW5jZUJpbmRpbmcpIHsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gdGhpcy5jb25zdHJ1Y3Rvci5fcGFyc2VUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgbGV0IHdhc1ByZUJvdW5kID0gdGhpcy5fX3RlbXBsYXRlSW5mbyA9PSB0ZW1wbGF0ZUluZm87CiAgICAgICAgLy8gT3B0aW1pemF0aW9uOiBzaW5jZSB0aGlzIGlzIGNhbGxlZCB0d2ljZSBmb3IgcHJvdG8tYm91bmQgdGVtcGxhdGVzLAogICAgICAgIC8vIGRvbid0IGF0dGVtcHQgdG8gcmVjcmVhdGUgYWNjZXNzb3JzIGlmIHRoaXMgdGVtcGxhdGUgd2FzIHByZS1ib3VuZAogICAgICAgIGlmICghd2FzUHJlQm91bmQpIHsKICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gdGVtcGxhdGVJbmZvLnByb3BlcnR5RWZmZWN0cykgewogICAgICAgICAgICB0aGlzLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHByb3ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaW5zdGFuY2VCaW5kaW5nKSB7CiAgICAgICAgICAvLyBGb3IgaW5zdGFuY2UtdGltZSBiaW5kaW5nLCBjcmVhdGUgaW5zdGFuY2Ugb2YgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICAgIC8vIGFuZCBsaW5rIGludG8gbGlzdCBvZiB0ZW1wbGF0ZXMgaWYgbmVjZXNzYXJ5CiAgICAgICAgICB0ZW1wbGF0ZUluZm8gPSAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovKE9iamVjdC5jcmVhdGUodGVtcGxhdGVJbmZvKSk7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ud2FzUHJlQm91bmQgPSB3YXNQcmVCb3VuZDsKICAgICAgICAgIGlmICghd2FzUHJlQm91bmQgJiYgdGhpcy5fX3RlbXBsYXRlSW5mbykgewogICAgICAgICAgICBsZXQgbGFzdCA9IHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0IHx8IHRoaXMuX190ZW1wbGF0ZUluZm87CiAgICAgICAgICAgIHRoaXMuX190ZW1wbGF0ZUluZm9MYXN0ID0gbGFzdC5uZXh0VGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgICAgICB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm8gPSBsYXN0OwogICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVJbmZvOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX3RlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgYSBwcm9wZXJ0eSBlZmZlY3QgdG8gdGhlIGdpdmVuIHRlbXBsYXRlIG1ldGFkYXRhLCB3aGljaCBpcyBydW4KICAgICAgICogYXQgdGhlICJwcm9wYWdhdGUiIHN0YWdlIG9mIGBfcHJvcGVydGllc0NoYW5nZWRgIHdoZW4gdGhlIHRlbXBsYXRlCiAgICAgICAqIGhhcyBiZWVuIGJvdW5kIHRvIHRoZSBlbGVtZW50IHZpYSBgX2JpbmRUZW1wbGF0ZWAuCiAgICAgICAqCiAgICAgICAqIFRoZSBgZWZmZWN0YCBvYmplY3Qgc2hvdWxkIG1hdGNoIHRoZSBmb3JtYXQgaW4gYF9hZGRQcm9wZXJ0eUVmZmVjdGAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgdG8gYWRkIGVmZmVjdCB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBlZmZlY3QKICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBlZmZlY3QgRWZmZWN0IG1ldGFkYXRhIG9iamVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QodGVtcGxhdGVJbmZvLCBwcm9wLCBlZmZlY3QpIHsKICAgICAgICBsZXQgaG9zdFByb3BzID0gdGVtcGxhdGVJbmZvLmhvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHMgfHwge307CiAgICAgICAgaG9zdFByb3BzW3Byb3BdID0gdHJ1ZTsKICAgICAgICBsZXQgZWZmZWN0cyA9IHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMgPSB0ZW1wbGF0ZUluZm8ucHJvcGVydHlFZmZlY3RzIHx8IHt9OwogICAgICAgIGxldCBwcm9wRWZmZWN0cyA9IGVmZmVjdHNbcHJvcF0gPSBlZmZlY3RzW3Byb3BdIHx8IFtdOwogICAgICAgIHByb3BFZmZlY3RzLnB1c2goZWZmZWN0KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFN0YW1wcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgYW5kIHBlcmZvcm1zIGluc3RhbmNlLXRpbWUgc2V0dXAgZm9yCiAgICAgICAqIFBvbHltZXIgdGVtcGxhdGUgZmVhdHVyZXMsIGluY2x1ZGluZyBkYXRhIGJpbmRpbmdzLCBkZWNsYXJhdGl2ZSBldmVudAogICAgICAgKiBsaXN0ZW5lcnMsIGFuZCB0aGUgYHRoaXMuJGAgbWFwIG9mIGBpZGAncyB0byBub2Rlcy4gIEEgZG9jdW1lbnQgZnJhZ21lbnQKICAgICAgICogaXMgcmV0dXJuZWQgY29udGFpbmluZyB0aGUgc3RhbXBlZCBET00sIHJlYWR5IGZvciBpbnNlcnRpb24gaW50byB0aGUKICAgICAgICogRE9NLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlOyBob3dldmVyIG5vdGUgdGhhdCBkdWUgdG8KICAgICAgICogYHNoYWR5Y3NzYCBwb2x5ZmlsbCBsaW1pdGF0aW9ucywgb25seSBzdHlsZXMgZnJvbSB0ZW1wbGF0ZXMgcHJlcGFyZWQKICAgICAgICogdXNpbmcgYFNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZWAgd2lsbCBiZSBjb3JyZWN0bHkgcG9seWZpbGxlZCAoc2NvcGVkCiAgICAgICAqIHRvIHRoZSBzaGFkb3cgcm9vdCBhbmQgc3VwcG9ydCBDU1MgY3VzdG9tIHByb3BlcnRpZXMpLCBhbmQgbm90ZSB0aGF0CiAgICAgICAqIGBTaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVgIG1heSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBlbGVtZW50LiBBcyBzdWNoLAogICAgICAgKiBhbnkgc3R5bGVzIHJlcXVpcmVkIGJ5IGluIHJ1bnRpbWUtc3RhbXBlZCB0ZW1wbGF0ZXMgbXVzdCBiZSBpbmNsdWRlZAogICAgICAgKiBpbiB0aGUgbWFpbiBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgKiBAcmV0dXJuIHshU3RhbXBlZFRlbXBsYXRlfSBDbG9uZWQgdGVtcGxhdGUgY29udGVudAogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUpIHsKICAgICAgICAvLyBFbnN1cmVzIHRoYXQgY3JlYXRlZCBkb20gaXMgYF9lbnF1ZXVlQ2xpZW50YCdkIHRvIHRoaXMgZWxlbWVudCBzbwogICAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIGZsdXNoZWQgb24gbmV4dCBjYWxsIHRvIGBfZmx1c2hQcm9wZXJ0aWVzYAogICAgICAgIGhvc3RTdGFjay5iZWdpbkhvc3RpbmcodGhpcyk7CiAgICAgICAgbGV0IGRvbSA9IHN1cGVyLl9zdGFtcFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICBob3N0U3RhY2suZW5kSG9zdGluZyh0aGlzKTsKICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHshVGVtcGxhdGVJbmZvfSAqLyh0aGlzLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUsIHRydWUpKTsKICAgICAgICAvLyBBZGQgdGVtcGxhdGUtaW5zdGFuY2Utc3BlY2lmaWMgZGF0YSB0byBpbnN0YW5jZWQgdGVtcGxhdGVJbmZvCiAgICAgICAgdGVtcGxhdGVJbmZvLm5vZGVMaXN0ID0gZG9tLm5vZGVMaXN0OwogICAgICAgIC8vIENhcHR1cmUgY2hpbGQgbm9kZXMgdG8gYWxsb3cgdW5zdGFtcGluZyBvZiBub24tcHJvdG90eXBpY2FsIHRlbXBsYXRlcwogICAgICAgIGlmICghdGVtcGxhdGVJbmZvLndhc1ByZUJvdW5kKSB7CiAgICAgICAgICBsZXQgbm9kZXMgPSB0ZW1wbGF0ZUluZm8uY2hpbGROb2RlcyA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj1kb20uZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIG5vZGVzLnB1c2gobik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRvbS50ZW1wbGF0ZUluZm8gPSB0ZW1wbGF0ZUluZm87CiAgICAgICAgLy8gU2V0dXAgY29tcG91bmQgc3RvcmFnZSwgMi13YXkgbGlzdGVuZXJzLCBhbmQgZGF0YUhvc3QgZm9yIGJpbmRpbmdzCiAgICAgICAgc2V0dXBCaW5kaW5ncyh0aGlzLCB0ZW1wbGF0ZUluZm8pOwogICAgICAgIC8vIEZsdXNoIHByb3BlcnRpZXMgaW50byB0ZW1wbGF0ZSBub2RlcyBpZiBhbHJlYWR5IGJvb3RlZAogICAgICAgIGlmICh0aGlzLl9fZGF0YVJlYWR5KSB7CiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMsIHRoaXMuX19kYXRhLCBudWxsLAogICAgICAgICAgICBmYWxzZSwgdGVtcGxhdGVJbmZvLm5vZGVMaXN0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRvbTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZXMgYW5kIHVuYmluZHMgdGhlIG5vZGVzIHByZXZpb3VzbHkgY29udGFpbmVkIGluIHRoZSBwcm92aWRlZAogICAgICAgKiBEb2N1bWVudEZyYWdtZW50IHJldHVybmVkIGZyb20gYF9zdGFtcFRlbXBsYXRlYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshU3RhbXBlZFRlbXBsYXRlfSBkb20gRG9jdW1lbnRGcmFnbWVudCBwcmV2aW91c2x5IHJldHVybmVkCiAgICAgICAqICAgZnJvbSBgX3N0YW1wVGVtcGxhdGVgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZXMgdG8gYmUgcmVtb3ZlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfcmVtb3ZlQm91bmREb20oZG9tKSB7CiAgICAgICAgLy8gVW5saW5rIHRlbXBsYXRlIGluZm8KICAgICAgICBsZXQgdGVtcGxhdGVJbmZvID0gZG9tLnRlbXBsYXRlSW5mbzsKICAgICAgICBpZiAodGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0ZW1wbGF0ZUluZm8ucHJldmlvdXNUZW1wbGF0ZUluZm8ubmV4dFRlbXBsYXRlSW5mbyA9CiAgICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgICBpZiAodGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8pIHsKICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0VGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0KICAgICAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRlSW5mb0xhc3QgPT0gdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICB0aGlzLl9fdGVtcGxhdGVJbmZvTGFzdCA9IHRlbXBsYXRlSW5mby5wcmV2aW91c1RlbXBsYXRlSW5mbzsKICAgICAgICB9CiAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzVGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvLm5leHRUZW1wbGF0ZUluZm8gPSBudWxsOwogICAgICAgIC8vIFJlbW92ZSBzdGFtcGVkIG5vZGVzCiAgICAgICAgbGV0IG5vZGVzID0gdGVtcGxhdGVJbmZvLmNoaWxkTm9kZXM7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICogcGFyc2luZyBiaW5kaW5ncyBmcm9tIGBUZXh0Tm9kZWAncycgYHRleHRDb250ZW50YC4gIEEgYGJpbmRpbmdzYAogICAgICAgKiBhcnJheSBpcyBhZGRlZCB0byBgbm9kZUluZm9gIGFuZCBwb3B1bGF0ZWQgd2l0aCBiaW5kaW5nIG1ldGFkYXRhCiAgICAgICAqIHdpdGggaW5mb3JtYXRpb24gY2FwdHVyaW5nIHRoZSBiaW5kaW5nIHRhcmdldCwgYW5kIGEgYHBhcnRzYCBhcnJheQogICAgICAgKiB3aXRoIG9uZSBvciBtb3JlIG1ldGFkYXRhIG9iamVjdHMgY2FwdHVyaW5nIHRoZSBzb3VyY2Uocykgb2YgdGhlCiAgICAgICAqIGJpbmRpbmcuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byBwYXJzZQogICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZUluZm99IG5vZGVJbmZvIE5vZGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUgbm9kZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgbGV0IG5vdGVkID0gc3VwZXIuX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pOwogICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgbGV0IHBhcnRzID0gdGhpcy5fcGFyc2VCaW5kaW5ncyhub2RlLnRleHRDb250ZW50LCB0ZW1wbGF0ZUluZm8pOwogICAgICAgICAgaWYgKHBhcnRzKSB7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHRleHRDb250ZW50IHdpdGggYW55IGxpdGVyYWwgcGFydHMKICAgICAgICAgICAgLy8gTk9URTogZGVmYXVsdCB0byBhIHNwYWNlIGhlcmUgc28gdGhlIHRleHROb2RlIHJlbWFpbnM7IHNvbWUgYnJvd3NlcnMKICAgICAgICAgICAgLy8gKElFKSBvbWl0IGFuIGVtcHR5IHRleHROb2RlIGZvbGxvd2luZyBjbG9uZU5vZGUvaW1wb3J0Tm9kZS4KICAgICAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpIHx8ICcgJzsKICAgICAgICAgICAgYWRkQmluZGluZyh0aGlzLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCAndGV4dCcsICd0ZXh0Q29udGVudCcsIHBhcnRzKTsKICAgICAgICAgICAgbm90ZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCBgVGVtcGxhdGVTdGFtcGAgaW1wbGVtZW50YXRpb24gdG8gYWRkIHN1cHBvcnQgZm9yCiAgICAgICAqIHBhcnNpbmcgYmluZGluZ3MgZnJvbSBhdHRyaWJ1dGVzLiAgQSBgYmluZGluZ3NgCiAgICAgICAqIGFycmF5IGlzIGFkZGVkIHRvIGBub2RlSW5mb2AgYW5kIHBvcHVsYXRlZCB3aXRoIGJpbmRpbmcgbWV0YWRhdGEKICAgICAgICogd2l0aCBpbmZvcm1hdGlvbiBjYXB0dXJpbmcgdGhlIGJpbmRpbmcgdGFyZ2V0LCBhbmQgYSBgcGFydHNgIGFycmF5CiAgICAgICAqIHdpdGggb25lIG9yIG1vcmUgbWV0YWRhdGEgb2JqZWN0cyBjYXB0dXJpbmcgdGhlIHNvdXJjZShzKSBvZiB0aGUKICAgICAgICogYmluZGluZy4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEF0dHJpYnV0ZSBuYW1lCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBBdHRyaWJ1dGUgdmFsdWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpIHsKICAgICAgICBsZXQgcGFydHMgPSB0aGlzLl9wYXJzZUJpbmRpbmdzKHZhbHVlLCB0ZW1wbGF0ZUluZm8pOwogICAgICAgIGlmIChwYXJ0cykgewogICAgICAgICAgLy8gQXR0cmlidXRlIG9yIHByb3BlcnR5CiAgICAgICAgICBsZXQgb3JpZ05hbWUgPSBuYW1lOwogICAgICAgICAgbGV0IGtpbmQgPSAncHJvcGVydHknOwogICAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHdlIHNlZSBhIGNhcGl0YWwgbGV0dGVyIGhlcmUgaXMgaWYgdGhlIGF0dHIgaGFzCiAgICAgICAgICAvLyBhIGNhcGl0YWwgbGV0dGVyIGluIGl0IHBlciBzcGVjLiBJbiB0aGlzIGNhc2UsIHRvIG1ha2Ugc3VyZQogICAgICAgICAgLy8gdGhpcyBiaW5kaW5nIHdvcmtzLCB3ZSBnbyBhaGVhZCBhbmQgbWFrZSB0aGUgYmluZGluZyB0byB0aGUgYXR0cmlidXRlLgogICAgICAgICAgaWYgKGNhcGl0YWxBdHRyaWJ1dGVSZWdleC50ZXN0KG5hbWUpKSB7CiAgICAgICAgICAgIGtpbmQgPSAnYXR0cmlidXRlJzsKICAgICAgICAgIH0gZWxzZSBpZiAobmFtZVtuYW1lLmxlbmd0aC0xXSA9PSAnJCcpIHsKICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgLTEpOwogICAgICAgICAgICBraW5kID0gJ2F0dHJpYnV0ZSc7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBJbml0aWFsaXplIGF0dHJpYnV0ZSBiaW5kaW5ncyB3aXRoIGFueSBsaXRlcmFsIHBhcnRzCiAgICAgICAgICBsZXQgbGl0ZXJhbCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpOwogICAgICAgICAgaWYgKGxpdGVyYWwgJiYga2luZCA9PSAnYXR0cmlidXRlJykgewogICAgICAgICAgICAvLyBFbnN1cmUgYSBTaGFkeUNTUyB0ZW1wbGF0ZSBzY29wZWQgc3R5bGUgaXMgbm90IHJlbW92ZWQKICAgICAgICAgICAgLy8gd2hlbiBhIGNsYXNzJCBiaW5kaW5nJ3MgaW5pdGlhbCBsaXRlcmFsIHZhbHVlIGlzIHNldC4KICAgICAgICAgICAgaWYgKG5hbWUgPT0gJ2NsYXNzJyAmJiBub2RlLmhhc0F0dHJpYnV0ZSgnY2xhc3MnKSkgewogICAgICAgICAgICAgIGxpdGVyYWwgKz0gJyAnICsgbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgbGl0ZXJhbCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDbGVhciBhdHRyaWJ1dGUgYmVmb3JlIHJlbW92aW5nLCBzaW5jZSBJRSB3b24ndCBhbGxvdyByZW1vdmluZwogICAgICAgICAgLy8gYHZhbHVlYCBhdHRyaWJ1dGUgaWYgaXQgcHJldmlvdXNseSBoYWQgYSB2YWx1ZSAoY2FuJ3QKICAgICAgICAgIC8vIHVuY29uZGl0aW9uYWxseSBzZXQgJycgYmVmb3JlIHJlbW92aW5nIHNpbmNlIGF0dHJpYnV0ZXMgd2l0aCBgJGAKICAgICAgICAgIC8vIGNhbid0IGJlIHNldCB1c2luZyBzZXRBdHRyaWJ1dGUpCiAgICAgICAgICBpZiAobm9kZS5sb2NhbE5hbWUgPT09ICdpbnB1dCcgJiYgb3JpZ05hbWUgPT09ICd2YWx1ZScpIHsKICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUob3JpZ05hbWUsICcnKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFJlbW92ZSBhbm5vdGF0aW9uCiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShvcmlnTmFtZSk7CiAgICAgICAgICAvLyBDYXNlIGhhY2tlcnk6IGF0dHJpYnV0ZXMgYXJlIGxvd2VyLWNhc2UsIGJ1dCBiaW5kIHRhcmdldHMKICAgICAgICAgIC8vIChwcm9wZXJ0aWVzKSBhcmUgY2FzZSBzZW5zaXRpdmUuIEdhbWJpdCBpcyB0byBtYXAgZGFzaC1jYXNlIHRvCiAgICAgICAgICAvLyBjYW1lbC1jYXNlOiBgZm9vLWJhcmAgYmVjb21lcyBgZm9vQmFyYC4KICAgICAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5ncyBhcmUgZXhjZXB0ZWQuCiAgICAgICAgICBpZiAoa2luZCA9PT0gJ3Byb3BlcnR5JykgewogICAgICAgICAgICBuYW1lID0gUG9seW1lci5DYXNlTWFwLmRhc2hUb0NhbWVsQ2FzZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywga2luZCwgbmFtZSwgcGFydHMsIGxpdGVyYWwpOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBzdXBlci5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICogYmluZGluZyB0aGUgcHJvcGVydGllcyB0aGF0IGEgbmVzdGVkIHRlbXBsYXRlIGRlcGVuZHMgb24gdG8gdGhlIHRlbXBsYXRlCiAgICAgICAqIGFzIGBfaG9zdF88cHJvcGVydHk+YC4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSW50ZXJmYWNlcyBpbiBjbG9zdXJlIGRvIG5vdCBpbmhlcml0IHN0YXRpY3MsIGJ1dCBjbGFzc2VzIGRvCiAgICAgICAqLwogICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgbGV0IG5vdGVkID0gc3VwZXIuX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKTsKICAgICAgICAvLyBNZXJnZSBob3N0IHByb3BzIGludG8gb3V0ZXIgdGVtcGxhdGUgYW5kIGFkZCBiaW5kaW5ncwogICAgICAgIGxldCBob3N0UHJvcHMgPSBub2RlSW5mby50ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgIGxldCBtb2RlID0gJ3snOwogICAgICAgIGZvciAobGV0IHNvdXJjZSBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgIGxldCBwYXJ0cyA9IFt7IG1vZGUsIHNvdXJjZSwgZGVwZW5kZW5jaWVzOiBbc291cmNlXSB9XTsKICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgJ3Byb3BlcnR5JywgJ19ob3N0XycgKyBzb3VyY2UsIHBhcnRzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5vdGVkOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHRvIHBhcnNlIHRleHQgaW4gYSB0ZW1wbGF0ZSAoZWl0aGVyIGF0dHJpYnV0ZSB2YWx1ZXMgb3IKICAgICAgICogdGV4dENvbnRlbnQpIGludG8gYmluZGluZyBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQW55IG92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIGJpbmRpbmcgcGFydAogICAgICAgKiBtZXRhZGF0YSAgcmVwcmVzZW50aW5nIG9uZSBvciBtb3JlIGJpbmRpbmdzIGZvdW5kIGluIHRoZSBwcm92aWRlZCB0ZXh0CiAgICAgICAqIGFuZCBhbnkgImxpdGVyYWwiIHRleHQgaW4gYmV0d2Vlbi4gIEFueSBub24tbGl0ZXJhbCBwYXJ0cyB3aWxsIGJlIHBhc3NlZAogICAgICAgKiB0byBgX2V2YWx1YXRlQmluZGluZ2Agd2hlbiBhbnkgZGVwZW5kZW5jaWVzIGNoYW5nZS4gIFRoZSBvbmx5IHJlcXVpcmVkCiAgICAgICAqIGZpZWxkcyBvZiBlYWNoICJwYXJ0IiBpbiB0aGUgcmV0dXJuZWQgYXJyYXkgYXJlIGFzIGZvbGxvd3M6CiAgICAgICAqCiAgICAgICAqIC0gYGRlcGVuZGVuY2llc2AgLSBBcnJheSBjb250YWluaW5nIHRyaWdnZXIgbWV0YWRhdGEgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICogICB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBiaW5kaW5nIHRvIHVwZGF0ZQogICAgICAgKiAtIGBsaXRlcmFsYCAtIFN0cmluZyBjb250YWluaW5nIHRleHQgaWYgdGhlIHBhcnQgcmVwcmVzZW50cyBhIGxpdGVyYWw7CiAgICAgICAqICAgaW4gdGhpcyBjYXNlIG5vIGBkZXBlbmRlbmNpZXNgIGFyZSBuZWVkZWQKICAgICAgICoKICAgICAgICogQWRkaXRpb25hbCBtZXRhZGF0YSBmb3IgdXNlIGJ5IGBfZXZhbHVhdGVCaW5kaW5nYCBtYXkgYmUgcHJvdmlkZWQgaW4KICAgICAgICogZWFjaCBwYXJ0IG9iamVjdCBhcyBuZWVkZWQuCiAgICAgICAqCiAgICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhhbmRsZXMgdGhlIGZvbGxvd2luZyB0eXBlcyBvZiBiaW5kaW5ncwogICAgICAgKiAob25lIG9yIG1vcmUgbWF5IGJlIGludGVybWl4ZWQgd2l0aCBsaXRlcmFsIHN0cmluZ3MpOgogICAgICAgKiAtIFByb3BlcnR5IGJpbmRpbmc6IGBbW3Byb3BdXWAKICAgICAgICogLSBQYXRoIGJpbmRpbmc6IGBbW29iamVjdC5wcm9wXV1gCiAgICAgICAqIC0gTmVnYXRlZCBwcm9wZXJ0eSBvciBwYXRoIGJpbmRpbmdzOiBgW1shcHJvcF1dYCBvciBgW1shb2JqZWN0LnByb3BdXWAKICAgICAgICogLSBUd28td2F5IHByb3BlcnR5IG9yIHBhdGggYmluZGluZ3MgKHN1cHBvcnRzIG5lZ2F0aW9uKToKICAgICAgICogICBge3twcm9wfX1gLCBge3tvYmplY3QucHJvcH19YCwgYHt7IXByb3B9fWAgb3IgYHt7IW9iamVjdC5wcm9wfX1gCiAgICAgICAqIC0gSW5saW5lIGNvbXB1dGVkIG1ldGhvZCAoc3VwcG9ydHMgbmVnYXRpb24pOgogICAgICAgKiAgIGBbW2NvbXB1dGUoYSwgJ2xpdGVyYWwnLCBiKV1dYCwgYFtbIWNvbXB1dGUoYSwgJ2xpdGVyYWwnLCBiKV1dYAogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgcmVndWxhciBleHByZXNzaW9uIGZvciBiZXN0CiAgICAgICAqIHBlcmZvcm1hbmNlLiBIb3dldmVyLCB0aGUgcmVndWxhciBleHByZXNzaW9uIHVzZXMgYSB3aGl0ZS1saXN0IG9mCiAgICAgICAqIGFsbG93ZWQgY2hhcmFjdGVycyBpbiBhIGRhdGEtYmluZGluZywgd2hpY2ggY2F1c2VzIHByb2JsZW1zIGZvcgogICAgICAgKiBkYXRhLWJpbmRpbmdzIHRoYXQgZG8gdXNlIGNoYXJhY3RlcnMgbm90IGluIHRoaXMgd2hpdGUtbGlzdC4KICAgICAgICoKICAgICAgICogSW5zdGVhZCBvZiB1cGRhdGluZyB0aGUgd2hpdGUtbGlzdCB3aXRoIGFsbCBhbGxvd2VkIGNoYXJhY3RlcnMsCiAgICAgICAqIHRoZXJlIGlzIGEgU3RyaWN0QmluZGluZ1BhcnNlciAoc2VlIGxpYi9taXhpbnMvc3RyaWN0LWJpbmRpbmctcGFyc2VyKQogICAgICAgKiB0aGF0IHVzZXMgYSBzdGF0ZSBtYWNoaW5lIGluc3RlYWQuIFRoaXMgc3RhdGUgbWFjaGluZSBpcyBhYmxlIHRvIGhhbmRsZQogICAgICAgKiBhbGwgY2hhcmFjdGVycy4gSG93ZXZlciwgaXQgaXMgc2xpZ2h0bHkgbGVzcyBwZXJmb3JtYW50LCB0aGVyZWZvcmUgd2UKICAgICAgICogZXh0cmFjdGVkIGl0IGludG8gYSBzZXBhcmF0ZSBvcHRpb25hbCBtaXhpbi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQgVGV4dCB0byBwYXJzZSBmcm9tIGF0dHJpYnV0ZSBvciB0ZXh0Q29udGVudAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGVtcGxhdGVJbmZvIEN1cnJlbnQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICogQHJldHVybiB7QXJyYXk8IUJpbmRpbmdQYXJ0Pn0gQXJyYXkgb2YgYmluZGluZyBwYXJ0IG1ldGFkYXRhCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VCaW5kaW5ncyh0ZXh0LCB0ZW1wbGF0ZUluZm8pIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBsZXQgbGFzdEluZGV4ID0gMDsKICAgICAgICBsZXQgbTsKICAgICAgICAvLyBFeGFtcGxlOiAibGl0ZXJhbDF7e3Byb3B9fWxpdGVyYWwyW1shY29tcHV0ZShmb28sYmFyKV1dZmluYWwiCiAgICAgICAgLy8gUmVnZXggbWF0Y2hlczoKICAgICAgICAvLyAgICAgICAgSXRlcmF0aW9uIDE6ICBJdGVyYXRpb24gMjoKICAgICAgICAvLyBtWzFdOiAne3snICAgICAgICAgICdbWycKICAgICAgICAvLyBtWzJdOiAnJyAgICAgICAgICAgICchJwogICAgICAgIC8vIG1bM106ICdwcm9wJyAgICAgICAgJ2NvbXB1dGUoZm9vLGJhciknCiAgICAgICAgd2hpbGUgKChtID0gYmluZGluZ1JlZ2V4LmV4ZWModGV4dCkpICE9PSBudWxsKSB7CiAgICAgICAgICAvLyBBZGQgbGl0ZXJhbCBwYXJ0CiAgICAgICAgICBpZiAobS5pbmRleCA+IGxhc3RJbmRleCkgewogICAgICAgICAgICBwYXJ0cy5wdXNoKHtsaXRlcmFsOiB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgbS5pbmRleCl9KTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEFkZCBiaW5kaW5nIHBhcnQKICAgICAgICAgIGxldCBtb2RlID0gbVsxXVswXTsKICAgICAgICAgIGxldCBuZWdhdGUgPSBCb29sZWFuKG1bMl0pOwogICAgICAgICAgbGV0IHNvdXJjZSA9IG1bM10udHJpbSgpOwogICAgICAgICAgbGV0IGN1c3RvbUV2ZW50ID0gZmFsc2UsIG5vdGlmeUV2ZW50ID0gJycsIGNvbG9uID0gLTE7CiAgICAgICAgICBpZiAobW9kZSA9PSAneycgJiYgKGNvbG9uID0gc291cmNlLmluZGV4T2YoJzo6JykpID4gMCkgewogICAgICAgICAgICBub3RpZnlFdmVudCA9IHNvdXJjZS5zdWJzdHJpbmcoY29sb24gKyAyKTsKICAgICAgICAgICAgc291cmNlID0gc291cmNlLnN1YnN0cmluZygwLCBjb2xvbik7CiAgICAgICAgICAgIGN1c3RvbUV2ZW50ID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBzaWduYXR1cmUgPSBwYXJzZU1ldGhvZChzb3VyY2UpOwogICAgICAgICAgbGV0IGRlcGVuZGVuY2llcyA9IFtdOwogICAgICAgICAgaWYgKHNpZ25hdHVyZSkgewogICAgICAgICAgICAvLyBJbmxpbmUgY29tcHV0ZWQgZnVuY3Rpb24KICAgICAgICAgICAgbGV0IHthcmdzLCBtZXRob2ROYW1lfSA9IHNpZ25hdHVyZTsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpPGFyZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsZXQgYXJnID0gYXJnc1tpXTsKICAgICAgICAgICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChhcmcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZHluYW1pY0ZucyA9IHRlbXBsYXRlSW5mby5keW5hbWljRm5zOwogICAgICAgICAgICBpZiAoZHluYW1pY0ZucyAmJiBkeW5hbWljRm5zW21ldGhvZE5hbWVdIHx8IHNpZ25hdHVyZS5zdGF0aWMpIHsKICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChtZXRob2ROYW1lKTsKICAgICAgICAgICAgICBzaWduYXR1cmUuZHluYW1pY0ZuID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gUHJvcGVydHkgb3IgcGF0aAogICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChzb3VyY2UpOwogICAgICAgICAgfQogICAgICAgICAgcGFydHMucHVzaCh7CiAgICAgICAgICAgIHNvdXJjZSwgbW9kZSwgbmVnYXRlLCBjdXN0b21FdmVudCwgc2lnbmF0dXJlLCBkZXBlbmRlbmNpZXMsCiAgICAgICAgICAgIGV2ZW50OiBub3RpZnlFdmVudAogICAgICAgICAgfSk7CiAgICAgICAgICBsYXN0SW5kZXggPSBiaW5kaW5nUmVnZXgubGFzdEluZGV4OwogICAgICAgIH0KICAgICAgICAvLyBBZGQgYSBmaW5hbCBsaXRlcmFsIHBhcnQKICAgICAgICBpZiAobGFzdEluZGV4ICYmIGxhc3RJbmRleCA8IHRleHQubGVuZ3RoKSB7CiAgICAgICAgICBsZXQgbGl0ZXJhbCA9IHRleHQuc3Vic3RyaW5nKGxhc3RJbmRleCk7CiAgICAgICAgICBpZiAobGl0ZXJhbCkgewogICAgICAgICAgICBwYXJ0cy5wdXNoKHsKICAgICAgICAgICAgICBsaXRlcmFsOiBsaXRlcmFsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGFydHMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gcGFydHM7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCB0byBldmFsdWF0ZSBhIHByZXZpb3VzbHkgcGFyc2VkIGJpbmRpbmcgcGFydCBiYXNlZCBvbiBhIHNldCBvZgogICAgICAgKiBvbmUgb3IgbW9yZSBjaGFuZ2VkIGRlcGVuZGVuY2llcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHt0aGlzfSBpbnN0IEVsZW1lbnQgdGhhdCBzaG91bGQgYmUgdXNlZCBhcyBzY29wZSBmb3IKICAgICAgICogICBiaW5kaW5nIGRlcGVuZGVuY2llcwogICAgICAgKiBAcGFyYW0ge0JpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQcm9wZXJ0eS9wYXRoIHRoYXQgdHJpZ2dlcmVkIHRoaXMgZWZmZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSB0aGUgYmluZGluZyBwYXJ0IGV2YWx1YXRlZCB0bwogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSB7CiAgICAgICAgbGV0IHZhbHVlOwogICAgICAgIGlmIChwYXJ0LnNpZ25hdHVyZSkgewogICAgICAgICAgdmFsdWUgPSBydW5NZXRob2RFZmZlY3QoaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBwYXJ0LnNpZ25hdHVyZSk7CiAgICAgICAgfSBlbHNlIGlmIChwYXRoICE9IHBhcnQuc291cmNlKSB7CiAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGFydC5zb3VyY2UpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoaGFzUGF0aHMgJiYgUG9seW1lci5QYXRoLmlzUGF0aChwYXRoKSkgewogICAgICAgICAgICB2YWx1ZSA9IFBvbHltZXIuUGF0aC5nZXQoaW5zdCwgcGF0aCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWx1ZSA9IGluc3QuX19kYXRhW3BhdGhdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocGFydC5uZWdhdGUpIHsKICAgICAgICAgIHZhbHVlID0gIXZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KCiAgICB9CgogICAgLy8gbWFrZSBhIHR5cGluZyBmb3IgY2xvc3VyZSA6UAogICAgUHJvcGVydHlFZmZlY3RzVHlwZSA9IFByb3BlcnR5RWZmZWN0czsKCiAgICByZXR1cm4gUHJvcGVydHlFZmZlY3RzOwogIH0pOwoKICAvKioKICAgKiBIZWxwZXIgYXBpIGZvciBlbnF1ZXVpbmcgY2xpZW50IGRvbSBjcmVhdGVkIGJ5IGEgaG9zdCBlbGVtZW50LgogICAqCiAgICogQnkgZGVmYXVsdCBlbGVtZW50cyBhcmUgZmx1c2hlZCB2aWEgYF9mbHVzaFByb3BlcnRpZXNgIHdoZW4KICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgIGlzIGNhbGxlZC4gRWxlbWVudHMgYXR0YWNoIHRoZWlyIGNsaWVudCBkb20gdG8KICAgKiB0aGVtc2VsdmVzIGF0IGByZWFkeWAgdGltZSB3aGljaCByZXN1bHRzIGZyb20gdGhpcyBmaXJzdCBmbHVzaC4KICAgKiBUaGlzIHByb3ZpZGVzIGFuIG9yZGVyaW5nIGd1YXJhbnRlZSB0aGF0IHRoZSBjbGllbnQgZG9tIGFuIGVsZW1lbnQKICAgKiBjcmVhdGVzIGlzIGZsdXNoZWQgYmVmb3JlIHRoZSBlbGVtZW50IGl0c2VsZiAoaS5lLiBjbGllbnQgYHJlYWR5YAogICAqIGZpcmVzIGJlZm9yZSBob3N0IGByZWFkeWApLgogICAqCiAgICogSG93ZXZlciwgaWYgYF9mbHVzaFByb3BlcnRpZXNgIGlzIGNhbGxlZCAqYmVmb3JlKiBhbiBlbGVtZW50IGlzIGNvbm5lY3RlZCwKICAgKiBhcyBmb3IgZXhhbXBsZSBgVGVtcGxhdGl6ZWAgZG9lcywgdGhpcyBvcmRlcmluZyBndWFyYW50ZWUgY2Fubm90IGJlCiAgICogc2F0aXNmaWVkIGJlY2F1c2Ugbm8gZWxlbWVudHMgYXJlIGNvbm5lY3RlZC4gKE5vdGU6IEJvdW5kIGVsZW1lbnRzIHRoYXQKICAgKiByZWNlaXZlIGRhdGEgZG8gYmVjb21lIGVucXVldWVkIGNsaWVudHMgYW5kIGFyZSBwcm9wZXJseSBvcmRlcmVkIGJ1dAogICAqIHVuYm91bmQgZWxlbWVudHMgYXJlIG5vdC4pCiAgICoKICAgKiBUbyBtYWludGFpbiB0aGUgZGVzaXJlZCAiY2xpZW50IGJlZm9yZSBob3N0IiBvcmRlcmluZyBndWFyYW50ZWUgZm9yIHRoaXMKICAgKiBjYXNlIHdlIHJlbHkgb24gdGhlICJob3N0IHN0YWNrLiBDbGllbnQgbm9kZXMgcmVnaXN0ZXJzIHRoZW1zZWx2ZXMgd2l0aAogICAqIHRoZSBjcmVhdGluZyBob3N0IGVsZW1lbnQgd2hlbiBjcmVhdGVkLiBUaGlzIGVuc3VyZXMgdGhhdCBhbGwgY2xpZW50IGRvbQogICAqIGlzIHJlYWRpZWQgaW4gdGhlIHByb3BlciBvcmRlciwgbWFpbnRhaW5pbmcgdGhlIGRlc2lyZWQgZ3VhcmFudGVlLgogICAqCiAgICogQHByaXZhdGUKICAgKi8KICBsZXQgaG9zdFN0YWNrID0gewoKICAgIHN0YWNrOiBbXSwKCiAgICAvKioKICAgICAqIEBwYXJhbSB7Kn0gaW5zdCBJbnN0YW5jZSB0byBhZGQgdG8gaG9zdFN0YWNrCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge2hvc3RTdGFja30KICAgICAqLwogICAgcmVnaXN0ZXJIb3N0KGluc3QpIHsKICAgICAgaWYgKHRoaXMuc3RhY2subGVuZ3RoKSB7CiAgICAgICAgbGV0IGhvc3QgPSB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdOwogICAgICAgIGhvc3QuX2VucXVldWVDbGllbnQoaW5zdCk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gYmVnaW4gaG9zdGluZwogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtob3N0U3RhY2t9CiAgICAgKi8KICAgIGJlZ2luSG9zdGluZyhpbnN0KSB7CiAgICAgIHRoaXMuc3RhY2sucHVzaChpbnN0KTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IGluc3QgSW5zdGFuY2UgdG8gZW5kIGhvc3RpbmcKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7aG9zdFN0YWNrfQogICAgICovCiAgICBlbmRIb3N0aW5nKGluc3QpIHsKICAgICAgbGV0IHN0YWNrTGVuID0gdGhpcy5zdGFjay5sZW5ndGg7CiAgICAgIGlmIChzdGFja0xlbiAmJiB0aGlzLnN0YWNrW3N0YWNrTGVuLTFdID09IGluc3QpIHsKICAgICAgICB0aGlzLnN0YWNrLnBvcCgpOwogICAgICB9CiAgICB9CgogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIFByb3ZpZGVzIGJhc2ljIHRyYWNraW5nIG9mIGVsZW1lbnQgZGVmaW5pdGlvbnMgKHJlZ2lzdHJhdGlvbnMpIGFuZAogICAqIGluc3RhbmNlIGNvdW50cy4KICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAc3VtbWFyeSBQcm92aWRlcyBiYXNpYyB0cmFja2luZyBvZiBlbGVtZW50IGRlZmluaXRpb25zIChyZWdpc3RyYXRpb25zKSBhbmQKICAgKiBpbnN0YW5jZSBjb3VudHMuCiAgICovCiAgUG9seW1lci50ZWxlbWV0cnkgPSB7CiAgICAvKioKICAgICAqIFRvdGFsIG51bWJlciBvZiBQb2x5bWVyIGVsZW1lbnQgaW5zdGFuY2VzIGNyZWF0ZWQuCiAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICovCiAgICBpbnN0YW5jZUNvdW50OiAwLAogICAgLyoqCiAgICAgKiBBcnJheSBvZiBQb2x5bWVyIGVsZW1lbnQgY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBmaW5hbGl6ZWQuCiAgICAgKiBAdHlwZSB7QXJyYXk8UG9seW1lci5FbGVtZW50Pn0KICAgICAqLwogICAgcmVnaXN0cmF0aW9uczogW10sCiAgICAvKioKICAgICAqIEBwYXJhbSB7IVBvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byBsb2cKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3JlZ0xvZzogZnVuY3Rpb24ocHJvdG90eXBlKSB7CiAgICAgIGNvbnNvbGUubG9nKCdbJyArIHByb3RvdHlwZS5pcyArICddOiByZWdpc3RlcmVkJyk7CiAgICB9LAogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBjbGFzcyBwcm90b3R5cGUgZm9yIHRlbGVtZXRyeSBwdXJwb3Nlcy4KICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byByZWdpc3RlcgogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihwcm90b3R5cGUpIHsKICAgICAgdGhpcy5yZWdpc3RyYXRpb25zLnB1c2gocHJvdG90eXBlKTsKICAgICAgUG9seW1lci5sb2cgJiYgdGhpcy5fcmVnTG9nKHByb3RvdHlwZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBMb2dzIGFsbCBlbGVtZW50cyByZWdpc3RlcmVkIHdpdGggYW4gYGlzYCB0byB0aGUgY29uc29sZS4KICAgICAqIEBwdWJsaWMKICAgICAqIEB0aGlzIHt0aGlzfQogICAgICovCiAgICBkdW1wUmVnaXN0cmF0aW9uczogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMucmVnaXN0cmF0aW9ucy5mb3JFYWNoKHRoaXMuX3JlZ0xvZyk7CiAgICB9CiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogQ3JlYXRlcyBhIGNvcHkgb2YgYHByb3BzYCB3aXRoIGVhY2ggcHJvcGVydHkgbm9ybWFsaXplZCBzdWNoIHRoYXQKICAgKiB1cGdyYWRlZCBpdCBpcyBhbiBvYmplY3Qgd2l0aCBhdCBsZWFzdCBhIHR5cGUgcHJvcGVydHkgeyB0eXBlOiBUeXBlfS4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBQcm9wZXJ0aWVzIHRvIG5vcm1hbGl6ZQogICAqIEByZXR1cm4ge09iamVjdH0gQ29weSBvZiBpbnB1dCBgcHJvcHNgIHdpdGggbm9ybWFsaXplZCBwcm9wZXJ0aWVzIHRoYXQKICAgKiBhcmUgaW4gdGhlIGZvcm0ge3R5cGU6IFR5cGV9CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICBjb25zdCBvdXRwdXQgPSB7fTsKICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgY29uc3QgbyA9IHByb3BzW3BdOwogICAgICBvdXRwdXRbcF0gPSAodHlwZW9mIG8gPT09ICdmdW5jdGlvbicpID8ge3R5cGU6IG99IDogbzsKICAgIH0KICAgIHJldHVybiBvdXRwdXQ7CiAgfQoKICAvKioKICAgKiBNaXhpbiB0aGF0IHByb3ZpZGVzIGEgbWluaW1hbCBzdGFydGluZyBwb2ludCB0byB1c2luZyB0aGUgUHJvcGVydGllc0NoYW5nZWQKICAgKiBtaXhpbiBieSBwcm92aWRpbmcgYSBtZWNoYW5pc20gdG8gZGVjbGFyZSBwcm9wZXJ0aWVzIGluIGEgc3RhdGljCiAgICogZ2V0dGVyIChlLmcuIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsgcmV0dXJuIHsgZm9vOiBTdHJpbmcgfSB9KS4gQ2hhbmdlcwogICAqIGFyZSByZXBvcnRlZCB2aWEgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIG1ldGhvZC4KICAgKgogICAqIFRoaXMgbWl4aW4gcHJvdmlkZXMgbm8gc3BlY2lmaWMgc3VwcG9ydCBmb3IgcmVuZGVyaW5nLiBVc2VycyBhcmUgZXhwZWN0ZWQKICAgKiB0byBjcmVhdGUgYSBTaGFkb3dSb290IGFuZCBwdXQgY29udGVudCBpbnRvIGl0IGFuZCB1cGRhdGUgaXQgaW4gd2hhdGV2ZXIKICAgKiB3YXkgbWFrZXMgc2Vuc2UuIFRoaXMgY2FuIGJlIGRvbmUgaW4gcmVhY3Rpb24gdG8gcHJvcGVydGllcyBjaGFuZ2luZyBieQogICAqIGltcGxlbWVudGluZyBgX3Byb3BlcnRpZXNDaGFuZ2VkYC4KICAgKgogICAqIEBtaXhpbkZ1bmN0aW9uCiAgICogQHBvbHltZXIKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc0NoYW5nZWQKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1peGluIHRoYXQgcHJvdmlkZXMgYSBtaW5pbWFsIHN0YXJ0aW5nIHBvaW50IGZvciB1c2luZwogICAqIHRoZSBQcm9wZXJ0aWVzQ2hhbmdlZCBtaXhpbiBieSBwcm92aWRpbmcgYSBkZWNsYXJhdGl2ZSBgcHJvcGVydGllc2Agb2JqZWN0LgogICAqLwogICBQb2x5bWVyLlByb3BlcnRpZXNNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzQ2hhbmdlZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnRpZXNDaGFuZ2VkKHN1cGVyQ2xhc3MpOwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IgZm9yIHRoZSBnaXZlbiBjbGFzcywgaWYgaXQgaXMgYW4KICAgICAqIGluc3RhbmNlIG9mIHRoZSBQcm9wZXJ0aWVzTWl4aW4uCiAgICAgKgogICAgICogQHBhcmFtIHshUHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIFByb3BlcnRpZXNNaXhpbiBjb25zdHJ1Y3RvcgogICAgICogQHJldHVybiB7UHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IFN1cGVyIGNsYXNzIGNvbnN0cnVjdG9yCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN1cGVyUHJvcGVydGllc0NsYXNzKGNvbnN0cnVjdG9yKSB7CiAgICAgIGNvbnN0IHN1cGVyQ3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb25zdHJ1Y3Rvcik7CgogICAgICAvLyBOb3RlLCB0aGUgYFByb3BlcnRpZXNNaXhpbmAgY2xhc3MgYmVsb3cgb25seSByZWZlcnMgdG8gdGhlIGNsYXNzCiAgICAgIC8vIGdlbmVyYXRlZCBieSB0aGlzIGNhbGwgdG8gdGhlIG1peGluOyB0aGUgaW5zdGFuY2VvZiB0ZXN0IG9ubHkgd29ya3MKICAgICAgLy8gYmVjYXVzZSB0aGUgbWl4aW4gaXMgZGVkdXBlZCBhbmQgZ3VhcmFudGVlZCBvbmx5IHRvIGFwcGx5IG9uY2UsIGhlbmNlCiAgICAgIC8vIGFsbCBjb25zdHJ1Y3RvcnMgaW4gYSBwcm90byBjaGFpbiB3aWxsIHNlZSB0aGUgc2FtZSBgUHJvcGVydGllc01peGluYAogICAgICByZXR1cm4gKHN1cGVyQ3Rvci5wcm90b3R5cGUgaW5zdGFuY2VvZiBQcm9wZXJ0aWVzTWl4aW4pID8KICAgICAgICAvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyAoc3VwZXJDdG9yKSA6IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYHByb3BlcnRpZXNgIG9iamVjdCBmb3IgdGhlCiAgICAgKiBnaXZlbiBjbGFzcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvIGF0CiAgICAgKiBsZWFzdCB7dHlwZX0uCiAgICAgKgogICAgICogQHBhcmFtIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgUHJvcGVydGllc01peGluIGNvbnN0cnVjdG9yCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE1lbW9pemVkIHByb3BlcnRpZXMgb2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIG93blByb3BlcnRpZXMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293blByb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgbGV0IHByb3BzID0gbnVsbDsKCiAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3Byb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gY29uc3RydWN0b3IucHJvcGVydGllczsKICAgICAgICAgIAogICAgICAgICAgaWYgKHByb3BlcnRpZXMpIHsKICAgICAgICAgICAgcHJvcHMgPSBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IuX19vd25Qcm9wZXJ0aWVzID0gcHJvcHM7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duUHJvcGVydGllczsKICAgIH0KCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzTWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIFByb3BlcnRpZXNNaXhpbiBleHRlbmRzIGJhc2UgewoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgc3RhbmRhcmQgY3VzdG9tIGVsZW1lbnRzIGdldHRlciB0byBvYnNlcnZlcyB0aGUgYXR0cmlidXRlcwogICAgICAgKiBsaXN0ZWQgaW4gYHByb3BlcnRpZXNgLgogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgewogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eSgnX19vYnNlcnZlZEF0dHJpYnV0ZXMnKSkgewogICAgICAgICAgUG9seW1lci50ZWxlbWV0cnkucmVnaXN0ZXIodGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLl9wcm9wZXJ0aWVzOwogICAgICAgICAgdGhpcy5fX29ic2VydmVkQXR0cmlidXRlcyA9IHByb3BzID8gT2JqZWN0LmtleXMocHJvcHMpLm1hcChwID0+IHRoaXMuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHApKSA6IFtdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX29ic2VydmVkQXR0cmlidXRlczsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZpbmFsaXplcyBhbiBlbGVtZW50IGRlZmluaXRpb24sIGluY2x1ZGluZyBlbnN1cmluZyBhbnkgc3VwZXIgY2xhc3NlcwogICAgICAgKiBhcmUgYWxzbyBmaW5hbGl6ZWQuIFRoaXMgaW5jbHVkZXMgZW5zdXJpbmcgcHJvcGVydHkKICAgICAgICogYWNjZXNzb3JzIGV4aXN0IG9uIHRoZSBlbGVtZW50IHByb3RvdHlwZS4gVGhpcyBtZXRob2QgY2FsbHMKICAgICAgICogYF9maW5hbGl6ZUNsYXNzYCB0byBmaW5hbGl6ZSBlYWNoIGNvbnN0cnVjdG9yIGluIHRoZSBwcm90b3R5cGUgY2hhaW4uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzdGF0aWMgZmluYWxpemUoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19fZmluYWxpemVkJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICBpZiAoc3VwZXJDdG9yKSB7CiAgICAgICAgICAgIHN1cGVyQ3Rvci5maW5hbGl6ZSgpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fX2ZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICB0aGlzLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRmluYWxpemUgYW4gZWxlbWVudCBjbGFzcy4gVGhpcyBpbmNsdWRlcyBlbnN1cmluZyBwcm9wZXJ0eQogICAgICAgKiBhY2Nlc3NvcnMgZXhpc3Qgb24gdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkKICAgICAgICogYGZpbmFsaXplYCBhbmQgZmluYWxpemVzIHRoZSBjbGFzcyBjb25zdHJ1Y3Rvci4KICAgICAgICoKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIGNvbnN0IHByb3BzID0gb3duUHJvcGVydGllcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBtZW1vaXplZCB2ZXJzaW9uIG9mIGFsbCBwcm9wZXJ0aWVzLCBpbmNsdWRpbmcgdGhvc2UgaW5oZXJpdGVkCiAgICAgICAqIGZyb20gc3VwZXIgY2xhc3Nlcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvCiAgICAgICAqIGF0IGxlYXN0IHt0eXBlfS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7T2JqZWN0fSBPYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIGZvciB0aGlzIGNsYXNzCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHN0YXRpYyBnZXQgX3Byb3BlcnRpZXMoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KAogICAgICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19wcm9wZXJ0aWVzJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSk7CiAgICAgICAgICB0aGlzLl9fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sCiAgICAgICAgICAgIHN1cGVyQ3RvciAmJiBzdXBlckN0b3IuX3Byb3BlcnRpZXMsCiAgICAgICAgICAgIG93blByb3BlcnRpZXMoLyoqIEB0eXBlIHtQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8odGhpcykpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX19wcm9wZXJ0aWVzOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0aWVzQ2hhbmdlZGAgbWV0aG9kIHRvIHJldHVybiB0eXBlIHNwZWNpZmllZCBpbiB0aGUKICAgICAgICogc3RhdGljIGBwcm9wZXJ0aWVzYCBvYmplY3QgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlIHRvIHdoaWNoIHRvIGRlc2VyaWFsaXplIGF0dHJpYnV0ZQogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgdHlwZUZvclByb3BlcnR5KG5hbWUpIHsKICAgICAgICBjb25zdCBpbmZvID0gdGhpcy5fcHJvcGVydGllc1tuYW1lXTsKICAgICAgICByZXR1cm4gaW5mbyAmJiBpbmZvLnR5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnRpZXNDaGFuZ2VkYCBtZXRob2QgYW5kIGFkZHMgYSBjYWxsIHRvCiAgICAgICAqIGBmaW5hbGl6ZWAgd2hpY2ggbGF6aWx5IGNvbmZpZ3VyZXMgdGhlIGVsZW1lbnQncyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIFBvbHltZXIudGVsZW1ldHJ5Lmluc3RhbmNlQ291bnQrKzsKICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLmZpbmFsaXplKCk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBhZGRlZCB0byBhIGRvY3VtZW50LgogICAgICAgKiBDYWxscyBgX2VuYWJsZVByb3BlcnRpZXNgIHRvIHR1cm4gb24gcHJvcGVydHkgc3lzdGVtIGZyb20KICAgICAgICogYFByb3BlcnRpZXNDaGFuZ2VkYC4KICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKSB7CiAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgZWxlbWVudCBpcyByZW1vdmVkIGZyb20gYSBkb2N1bWVudAogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBpZiAoc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2spIHsKICAgICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBQcm9wZXJ0aWVzTWl4aW47CgogIH0pOwoKfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgY29uc3QgYnVpbHRDU1MgPSB3aW5kb3cuU2hhZHlDU1MgJiYgd2luZG93LlNoYWR5Q1NTWydjc3NCdWlsZCddOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBTdWJjbGFzc2VycyBtYXkgcHJvdmlkZSB0aGUgZm9sbG93aW5nIHN0YXRpYyBnZXR0ZXJzIHRvIHJldHVybiBtZXRhZGF0YQogICAqIHVzZWQgdG8gY29uZmlndXJlIFBvbHltZXIncyBmZWF0dXJlcyBmb3IgdGhlIGNsYXNzOgogICAqCiAgICogLSBgc3RhdGljIGdldCBpcygpYDogV2hlbiB0aGUgdGVtcGxhdGUgaXMgcHJvdmlkZWQgdmlhIGEgYGRvbS1tb2R1bGVgLAogICAqICAgdXNlcnMgc2hvdWxkIHJldHVybiB0aGUgYGRvbS1tb2R1bGVgIGlkIGZyb20gYSBzdGF0aWMgYGlzYCBnZXR0ZXIuICBJZgogICAqICAgbm8gdGVtcGxhdGUgaXMgbmVlZGVkIG9yIHRoZSB0ZW1wbGF0ZSBpcyBwcm92aWRlZCBkaXJlY3RseSB2aWEgdGhlCiAgICogICBgdGVtcGxhdGVgIGdldHRlciwgdGhlcmUgaXMgbm8gbmVlZCB0byBkZWZpbmUgYGlzYCBmb3IgdGhlIGVsZW1lbnQuCiAgICoKICAgKiAtIGBzdGF0aWMgZ2V0IHRlbXBsYXRlKClgOiBVc2VycyBtYXkgcHJvdmlkZSB0aGUgdGVtcGxhdGUgZGlyZWN0bHkgKGFzCiAgICogICBvcHBvc2VkIHRvIHZpYSBgZG9tLW1vZHVsZWApIGJ5IGltcGxlbWVudGluZyBhIHN0YXRpYyBgdGVtcGxhdGVgIGdldHRlci4KICAgKiAgIFRoZSBnZXR0ZXIgbWF5IHJldHVybiBhbiBgSFRNTFRlbXBsYXRlRWxlbWVudGAgb3IgYSBzdHJpbmcsIHdoaWNoIHdpbGwKICAgKiAgIGF1dG9tYXRpY2FsbHkgYmUgcGFyc2VkIGludG8gYSB0ZW1wbGF0ZS4KICAgKgogICAqIC0gYHN0YXRpYyBnZXQgcHJvcGVydGllcygpYDogU2hvdWxkIHJldHVybiBhbiBvYmplY3QgZGVzY3JpYmluZwogICAqICAgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIgZmVhdHVyZXMgKGtleTogcHJvcGVydHkgbmFtZQogICAqICAgdmFsdWU6IG9iamVjdCBjb250YWluaW5nIHByb3BlcnR5IG1ldGFkYXRhKS4gVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkKICAgKiAgIG1ldGFkYXRhIGluY2x1ZGU6CiAgICogICAtIGB0eXBlYCAoU3RyaW5nfE51bWJlcnxPYmplY3R8QXJyYXl8Li4uKTogVXNlZCBieQogICAqICAgICBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCB0byBkZXRlcm1pbmUgaG93IHN0cmluZy1iYXNlZCBhdHRyaWJ1dGVzCiAgICogICAgIGFyZSBkZXNlcmlhbGl6ZWQgdG8gSmF2YVNjcmlwdCBwcm9wZXJ0eSB2YWx1ZXMuCiAgICogICAtIGBub3RpZnlgIChib29sZWFuKTogQ2F1c2VzIGEgY2hhbmdlIGluIHRoZSBwcm9wZXJ0eSB0byBmaXJlIGEKICAgKiAgICAgbm9uLWJ1YmJsaW5nIGV2ZW50IGNhbGxlZCBgPHByb3BlcnR5Pi1jaGFuZ2VkYC4gRWxlbWVudHMgdGhhdCBoYXZlCiAgICogICAgIGVuYWJsZWQgdHdvLXdheSBiaW5kaW5nIHRvIHRoZSBwcm9wZXJ0eSB1c2UgdGhpcyBldmVudCB0byBvYnNlcnZlIGNoYW5nZXMuCiAgICogICAtIGByZWFkT25seWAgKGJvb2xlYW4pOiBDcmVhdGVzIGEgZ2V0dGVyIGZvciB0aGUgcHJvcGVydHksIGJ1dCBubyBzZXR0ZXIuCiAgICogICAgIFRvIHNldCBhIHJlYWQtb25seSBwcm9wZXJ0eSwgdXNlIHRoZSBwcml2YXRlIHNldHRlciBtZXRob2QKICAgKiAgICAgYF9zZXRQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpYC4KICAgKiAgIC0gYG9ic2VydmVyYCAoc3RyaW5nKTogT2JzZXJ2ZXIgbWV0aG9kIG5hbWUgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCiAgICogICAgIHRoZSBwcm9wZXJ0eSBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlCiAgICogICAgIGAodmFsdWUsIHByZXZpb3VzVmFsdWUpYC4KICAgKiAgIC0gYGNvbXB1dGVkYCAoc3RyaW5nKTogU3RyaW5nIGRlc2NyaWJpbmcgbWV0aG9kIGFuZCBkZXBlbmRlbnQgcHJvcGVydGllcwogICAqICAgICBmb3IgY29tcHV0aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IChlLmcuIGAnY29tcHV0ZUZvbyhiYXIsIHpvdCknYCkuCiAgICogICAgIENvbXB1dGVkIHByb3BlcnRpZXMgYXJlIHJlYWQtb25seSBieSBkZWZhdWx0IGFuZCBjYW4gb25seSBiZSBjaGFuZ2VkCiAgICogICAgIHZpYSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBjb21wdXRpbmcgbWV0aG9kLgogICAqCiAgICogLSBgc3RhdGljIGdldCBvYnNlcnZlcnMoKWA6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eQogICAqICAgb2JzZXJ2ZXIgbWV0aG9kcyBhbmQgdGhlaXIgZGVwZW5kZW50IHByb3BlcnRpZXMgKGUuZy4KICAgKiAgIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgKgogICAqIFRoZSBiYXNlIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgZm9sbG93aW5nIHN0YW5kYXJkCiAgICogY3VzdG9tIGVsZW1lbnQgbGlmZWN5Y2xlIGNhbGxiYWNrczsgdXNlcnMgbWF5IG92ZXJyaWRlIHRoZXNlLCBidXQgc2hvdWxkCiAgICogY2FsbCB0aGUgc3VwZXIgbWV0aG9kIHRvIGVuc3VyZQogICAqIC0gYGNvbnN0cnVjdG9yYDogUnVuIHdoZW4gdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBvciB1cGdyYWRlZAogICAqIC0gYGNvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQgdG8gdGhlCiAgICogICBkb2N1bWVudAogICAqIC0gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBkaXNjb25uZWN0ZWQgZnJvbQogICAqICAgdGhlIGRvY3VtZW50CiAgICogLSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSBhbiBhdHRyaWJ1dGUgaW4KICAgKiAgIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGlzIHNldCBvciByZW1vdmVkIChub3RlOiB0aGlzIGVsZW1lbnQncyBkZWZhdWx0CiAgICogICBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBpbXBsZW1lbnRhdGlvbiB3aWxsIGF1dG9tYXRpY2FsbHkgcmV0dXJuIGFuIGFycmF5CiAgICogICBvZiBkYXNoLWNhc2VkIGF0dHJpYnV0ZXMgYmFzZWQgb24gYHByb3BlcnRpZXNgKQogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuUHJvcGVydGllc01peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcHJvcGVydHkgcm9vdFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiBgUG9seW1lci5yb290UGF0aGAsCiAgICogICB3aGljaCBkZWZhdWx0cyB0byB0aGUgbWFpbiBkb2N1bWVudCBwYXRoCiAgICogQHByb3BlcnR5IGltcG9ydFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgY2xhc3MncyBzdGF0aWMKICAgKiAgIGBpbXBvcnRQYXRoYCBwcm9wZXJ0eSwgd2hpY2ggZGVmYXVsdHMgdG8gdGhlIHBhdGggb2YgdGhpcyBlbGVtZW50J3MKICAgKiAgIGBkb20tbW9kdWxlYCAod2hlbiBgaXNgIGlzIHVzZWQpLCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gZm9yIG90aGVyCiAgICogICBpbXBvcnQgc3RyYXRlZ2llcy4KICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MKICAgKiBtZXRhLXByb2dyYW1taW5nIGZlYXR1cmVzLgogICAqLwogIFBvbHltZXIuRWxlbWVudE1peGluID0gUG9seW1lci5kZWR1cGluZ01peGluKGJhc2UgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnRpZXNNaXhpbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IHBvbHltZXJFbGVtZW50QmFzZSA9IFBvbHltZXIuUHJvcGVydGllc01peGluKFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKGJhc2UpKTsKCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHByb3BlcnRpZXMgd2l0aCBkZWZhdWx0IHZhbHVlcy4KICAgICAqIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGFzIGFuIG9wdGltaXphdGlvbiBzaW5jZSBpdCBpcyBhIHN1YnNldCBvZgogICAgICogdGhlIGxpc3QgcmV0dXJuZWQgZnJvbSBgX3Byb3BlcnRpZXNgLgogICAgICogVGhpcyBsaXN0IGlzIHVzZWQgaW4gYF9pbml0aWFsaXplUHJvcGVydGllc2AgdG8gc2V0IHByb3BlcnR5IGRlZmF1bHRzLgogICAgICoKICAgICAqIEBwYXJhbSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0gY29uc3RydWN0b3IgRWxlbWVudCBjbGFzcwogICAgICogQHJldHVybiB7UG9seW1lckVsZW1lbnRQcm9wZXJ0aWVzfSBGbGF0dGVuZWQgcHJvcGVydGllcyBmb3IgdGhpcyBjbGFzcwogICAgICogICB0aGF0IGhhdmUgZGVmYXVsdCB2YWx1ZXMKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3BlcnR5RGVmYXVsdHMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX3Byb3BlcnR5RGVmYXVsdHMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgY29uc3RydWN0b3IuX19wcm9wZXJ0eURlZmF1bHRzID0gbnVsbDsKICAgICAgICBsZXQgcHJvcHMgPSBjb25zdHJ1Y3Rvci5fcHJvcGVydGllczsKICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICBsZXQgaW5mbyA9IHByb3BzW3BdOwogICAgICAgICAgaWYgKCd2YWx1ZScgaW4gaW5mbykgewogICAgICAgICAgICBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgPSBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgfHwge307CiAgICAgICAgICAgIGNvbnN0cnVjdG9yLl9fcHJvcGVydHlEZWZhdWx0c1twXSA9IGluZm87CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbWVtb2l6ZWQgdmVyc2lvbiBvZiB0aGUgYG9ic2VydmVyc2AgYXJyYXkuCiAgICAgKiBAcGFyYW0ge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIEVsZW1lbnQgY2xhc3MKICAgICAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250YWluaW5nIG93biBvYnNlcnZlcnMgZm9yIHRoZSBnaXZlbiBjbGFzcwogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBmdW5jdGlvbiBvd25PYnNlcnZlcnMoY29uc3RydWN0b3IpIHsKICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293bk9ic2VydmVycycsIGNvbnN0cnVjdG9yKSkpIHsKICAgICAgICAgIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzID0KICAgICAgICAgIGNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ29ic2VydmVycycsIGNvbnN0cnVjdG9yKSkgPwogICAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAoY29uc3RydWN0b3IpLm9ic2VydmVycyA6IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzOwogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBlZmZlY3RzIGZvciBhIHByb3BlcnR5LgogICAgICoKICAgICAqIE5vdGUsIG9uY2UgYSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQgdG8KICAgICAqIGByZWFkT25seWAsIGBjb21wdXRlZGAsIGByZWZsZWN0VG9BdHRyaWJ1dGVgLCBvciBgbm90aWZ5YAogICAgICogdGhlc2UgdmFsdWVzIG1heSBub3QgYmUgY2hhbmdlZC4gRm9yIGV4YW1wbGUsIGEgc3ViY2xhc3MgY2Fubm90CiAgICAgKiBhbHRlciB0aGVzZSBzZXR0aW5ncy4gSG93ZXZlciwgYWRkaXRpb25hbCBgb2JzZXJ2ZXJzYCBtYXkgYmUgYWRkZWQKICAgICAqIGJ5IHN1YmNsYXNzZXMuCiAgICAgKgogICAgICogVGhlIGluZm8gb2JqZWN0IHNob3VsZCBjb250YWluIHByb3BlcnR5IG1ldGFkYXRhIGFzIGZvbGxvd3M6CiAgICAgKgogICAgICogKiBgdHlwZWA6IHtmdW5jdGlvbn0gdHlwZSB0byB3aGljaCBhbiBhdHRyaWJ1dGUgbWF0Y2hpbmcgdGhlIHByb3BlcnR5CiAgICAgKiBpcyBkZXNlcmlhbGl6ZWQuIE5vdGUgdGhlIHByb3BlcnR5IGlzIGNhbWVsLWNhc2VkIGZyb20gYSBkYXNoLWNhc2VkCiAgICAgKiBhdHRyaWJ1dGUuIEZvciBleGFtcGxlLCAnZm9vLWJhcicgYXR0cmlidXRlIGlzIGRlc2VyaWFsaXplZCB0byBhCiAgICAgKiBwcm9wZXJ0eSBuYW1lZCAnZm9vQmFyJy4KICAgICAqCiAgICAgKiAqIGByZWFkT25seWA6IHtib29sZWFufSBjcmVhdGVzIGEgcmVhZE9ubHkgcHJvcGVydHkgYW5kCiAgICAgKiBtYWtlcyBhIHByaXZhdGUgc2V0dGVyIGZvciB0aGUgcHJpdmF0ZSBvZiB0aGUgZm9ybSAnX3NldEZvbycgZm9yIGEKICAgICAqIHByb3BlcnR5ICdmb28nLAogICAgICoKICAgICAqICogYGNvbXB1dGVkYDoge3N0cmluZ30gY3JlYXRlcyBhIGNvbXB1dGVkIHByb3BlcnR5LiBBIGNvbXB1dGVkIHByb3BlcnR5CiAgICAgKiBpcyBhbHNvIGF1dG9tYXRpY2FsbHkgc2V0IHRvIGByZWFkT25seTogdHJ1ZWAuIFRoZSB2YWx1ZSBpcyBjYWxjdWxhdGVkCiAgICAgKiBieSBydW5uaW5nIGEgbWV0aG9kIGFuZCBhcmd1bWVudHMgcGFyc2VkIGZyb20gdGhlIGdpdmVuIHN0cmluZy4gRm9yCiAgICAgKiBleGFtcGxlICdjb21wdXRlKGZvbyknIHdpbGwgY29tcHV0ZSBhIGdpdmVuIHByb3BlcnR5IHdoZW4gdGhlCiAgICAgKiAnZm9vJyBwcm9wZXJ0eSBjaGFuZ2VzIGJ5IGV4ZWN1dGluZyB0aGUgJ2NvbXB1dGUnIG1ldGhvZC4gVGhpcyBtZXRob2QKICAgICAqIG11c3QgcmV0dXJuIHRoZSBjb21wdXRlZCB2YWx1ZS4KICAgICAqCiAgICAgKiAqIGByZWZsZWN0VG9BdHRyaWJ1dGVgOiB7Ym9vbGVhbn0gSWYgdHJ1ZSwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHJlZmxlY3RlZAogICAgICogdG8gYW4gYXR0cmlidXRlIG9mIHRoZSBzYW1lIG5hbWUuIE5vdGUsIHRoZSBhdHRyaWJ1dGUgaXMgZGFzaC1jYXNlZAogICAgICogc28gYSBwcm9wZXJ0eSBuYW1lZCAnZm9vQmFyJyBpcyByZWZsZWN0ZWQgYXMgJ2Zvby1iYXInLgogICAgICoKICAgICAqICogYG5vdGlmeWA6IHtib29sZWFufSBzZW5kcyBhIG5vbi1idWJibGluZyBub3RpZmljYXRpb24gZXZlbnQgd2hlbgogICAgICogdGhlIHByb3BlcnR5IGNoYW5nZXMuIEZvciBleGFtcGxlLCBhIHByb3BlcnR5IG5hbWVkICdmb28nIHNlbmRzIGFuCiAgICAgKiBldmVudCBuYW1lZCAnZm9vLWNoYW5nZWQnIHdpdGggYGV2ZW50LmRldGFpbGAgc2V0IHRvIHRoZSB2YWx1ZSBvZgogICAgICogdGhlIHByb3BlcnR5LgogICAgICoKICAgICAqICogb2JzZXJ2ZXI6IHtzdHJpbmd9IG5hbWUgb2YgYSBtZXRob2QgdGhhdCBydW5zIHdoZW4gdGhlIHByb3BlcnR5CiAgICAgKiBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlICh2YWx1ZSwgcHJldmlvdXNWYWx1ZSkuCiAgICAgKgogICAgICogTm90ZTogVXNlcnMgbWF5IHdhbnQgY29udHJvbCBvdmVyIG1vZGlmeWluZyBwcm9wZXJ0eQogICAgICogZWZmZWN0cyB2aWEgc3ViY2xhc3NpbmcuIEZvciBleGFtcGxlLCBhIHVzZXIgbWlnaHQgd2FudCB0byBtYWtlIGEKICAgICAqIHJlZmxlY3RUb0F0dHJpYnV0ZSBwcm9wZXJ0eSBub3QgZG8gc28gaW4gYSBzdWJjbGFzcy4gV2UndmUgY2hvc2VuIHRvCiAgICAgKiBkaXNhYmxlIHRoaXMgYmVjYXVzZSBpdCBsZWFkcyB0byBhZGRpdGlvbmFsIGNvbXBsaWNhdGlvbi4KICAgICAqIEZvciBleGFtcGxlLCBhIHJlYWRPbmx5IGVmZmVjdCBnZW5lcmF0ZXMgYSBzcGVjaWFsIHNldHRlci4gSWYgYSBzdWJjbGFzcwogICAgICogZGlzYWJsZXMgdGhlIGVmZmVjdCwgdGhlIHNldHRlciB3b3VsZCBmYWlsIHVuZXhwZWN0ZWRseS4KICAgICAqIEJhc2VkIG9uIGZlZWRiYWNrLCB3ZSBtYXkgd2FudCB0byB0cnkgdG8gbWFrZSBlZmZlY3RzIG1vcmUgbWFsbGVhYmxlCiAgICAgKiBhbmQvb3IgcHJvdmlkZSBhbiBhZHZhbmNlZCBhcGkgZm9yIG1hbmlwdWxhdGluZyB0aGVtLgogICAgICogQWxzbyBjb25zaWRlciBhZGRpbmcgd2FybmluZ3Mgd2hlbiBhbiBlZmZlY3QgY2Fubm90IGJlIGNoYW5nZWQuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckVsZW1lbnR9IHByb3RvIEVsZW1lbnQgY2xhc3MgcHJvdG90eXBlIHRvIGFkZCBhY2Nlc3NvcnMKICAgICAqICAgYW5kIGVmZmVjdHMgdG8KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5LgogICAgICogQHBhcmFtIHtPYmplY3R9IGluZm8gSW5mbyBvYmplY3QgZnJvbSB3aGljaCB0byBjcmVhdGUgcHJvcGVydHkgZWZmZWN0cy4KICAgICAqIFN1cHBvcnRlZCBrZXlzOgogICAgICogQHBhcmFtIHtPYmplY3R9IGFsbFByb3BzIEZsYXR0ZW5lZCBtYXAgb2YgYWxsIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGlzCiAgICAgKiAgIGVsZW1lbnQgKGluY2x1ZGluZyBpbmhlcml0ZWQgcHJvcGVydGllcykKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eUZyb21Db25maWcocHJvdG8sIG5hbWUsIGluZm8sIGFsbFByb3BzKSB7CiAgICAgIC8vIGNvbXB1dGVkIGZvcmNlcyByZWFkT25seS4uLgogICAgICBpZiAoaW5mby5jb21wdXRlZCkgewogICAgICAgIGluZm8ucmVhZE9ubHkgPSB0cnVlOwogICAgICB9CiAgICAgIC8vIE5vdGUsIHNpbmNlIGFsbCBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSByZWFkT25seSwgdGhpcyBwcmV2ZW50cwogICAgICAvLyBhZGRpbmcgYWRkaXRpb25hbCBjb21wdXRlZCBwcm9wZXJ0eSBlZmZlY3RzICh3aGljaCBsZWFkcyB0byBhIGNvbmZ1c2luZwogICAgICAvLyBzZXR1cCB3aGVyZSBtdWx0aXBsZSB0cmlnZ2VycyBmb3Igc2V0dGluZyBhIHByb3BlcnR5KQogICAgICAvLyBXaGlsZSB3ZSBkbyBoYXZlIGBoYXNDb21wdXRlZEVmZmVjdGAgdGhpcyBpcyBzZXQgb24gdGhlIHByb3BlcnR5J3MKICAgICAgLy8gZGVwZW5kZW5jaWVzIHJhdGhlciB0aGFuIGl0c2VsZi4KICAgICAgaWYgKGluZm8uY29tcHV0ZWQgJiYgIXByb3RvLl9oYXNSZWFkT25seUVmZmVjdChuYW1lKSkgewogICAgICAgIHByb3RvLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KG5hbWUsIGluZm8uY29tcHV0ZWQsIGFsbFByb3BzKTsKICAgICAgfQogICAgICBpZiAoaW5mby5yZWFkT25seSAmJiAhcHJvdG8uX2hhc1JlYWRPbmx5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkobmFtZSwgIWluZm8uY29tcHV0ZWQpOwogICAgICB9CiAgICAgIGlmIChpbmZvLnJlZmxlY3RUb0F0dHJpYnV0ZSAmJiAhcHJvdG8uX2hhc1JlZmxlY3RFZmZlY3QobmFtZSkpIHsKICAgICAgICBwcm90by5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkobmFtZSk7CiAgICAgIH0KICAgICAgaWYgKGluZm8ubm90aWZ5ICYmICFwcm90by5faGFzTm90aWZ5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgcHJvdG8uX2NyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KG5hbWUpOwogICAgICB9CiAgICAgIC8vIGFsd2F5cyBhZGQgb2JzZXJ2ZXIKICAgICAgaWYgKGluZm8ub2JzZXJ2ZXIpIHsKICAgICAgICBwcm90by5fY3JlYXRlUHJvcGVydHlPYnNlcnZlcihuYW1lLCBpbmZvLm9ic2VydmVyLCBhbGxQcm9wc1tpbmZvLm9ic2VydmVyXSk7CiAgICAgIH0KICAgICAgLy8gYWx3YXlzIGNyZWF0ZSB0aGUgbWFwcGluZyBmcm9tIGF0dHJpYnV0ZSBiYWNrIHRvIHByb3BlcnR5IGZvciBkZXNlcmlhbGl6YXRpb24uCiAgICAgIHByb3RvLl9hZGRQcm9wZXJ0eVRvQXR0cmlidXRlTWFwKG5hbWUpOwogICAgfQoKICAgIC8qKgogICAgICogUHJvY2VzcyBhbGwgc3R5bGUgZWxlbWVudHMgaW4gdGhlIGVsZW1lbnQgdGVtcGxhdGUuIFN0eWxlcyB3aXRoIHRoZQogICAgICogYGluY2x1ZGVgIGF0dHJpYnV0ZSBhcmUgcHJvY2Vzc2VkIHN1Y2ggdGhhdCBhbnkgc3R5bGVzIGluCiAgICAgKiB0aGUgYXNzb2NpYXRlZCAic3R5bGUgbW9kdWxlcyIgYXJlIGluY2x1ZGVkIGluIHRoZSBlbGVtZW50IHRlbXBsYXRlLgogICAgICogQHBhcmFtIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSBrbGFzcyBFbGVtZW50IGNsYXNzCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBwcm9jZXNzCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gaXMgTmFtZSBvZiBlbGVtZW50CiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBCYXNlIFVSSSBmb3IgZWxlbWVudAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gcHJvY2Vzc0VsZW1lbnRTdHlsZXMoa2xhc3MsIHRlbXBsYXRlLCBpcywgYmFzZVVSSSkgewogICAgICBpZiAoIWJ1aWx0Q1NTKSB7CiAgICAgICAgY29uc3QgdGVtcGxhdGVTdHlsZXMgPSB0ZW1wbGF0ZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJyk7CiAgICAgICAgY29uc3Qgc3R5bGVzV2l0aEltcG9ydHMgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLnN0eWxlc0Zyb21UZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgLy8gaW5zZXJ0IHN0eWxlcyBmcm9tIDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPiBhdCB0aGUgdG9wIG9mIHRoZSB0ZW1wbGF0ZQogICAgICAgIGNvbnN0IGxpbmtlZFN0eWxlcyA9IFBvbHltZXIuU3R5bGVHYXRoZXIuc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMoaXMpOwogICAgICAgIGNvbnN0IGZpcnN0VGVtcGxhdGVDaGlsZCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7CiAgICAgICAgZm9yIChsZXQgaWR4ID0gMDsgaWR4IDwgbGlua2VkU3R5bGVzLmxlbmd0aDsgaWR4KyspIHsKICAgICAgICAgIGxldCBzID0gbGlua2VkU3R5bGVzW2lkeF07CiAgICAgICAgICBzLnRleHRDb250ZW50ID0ga2xhc3MuX3Byb2Nlc3NTdHlsZVRleHQocy50ZXh0Q29udGVudCwgYmFzZVVSSSk7CiAgICAgICAgICB0ZW1wbGF0ZS5jb250ZW50Lmluc2VydEJlZm9yZShzLCBmaXJzdFRlbXBsYXRlQ2hpbGQpOwogICAgICAgIH0KICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0ICJjb25jcmV0ZSIgc3R5bGUgaW4gdGhlIHRlbXBsYXRlIHdlIGhhdmUgZW5jb3VudGVyZWQKICAgICAgICBsZXQgdGVtcGxhdGVTdHlsZUluZGV4ID0gMDsKICAgICAgICAvLyBlbnN1cmUgYWxsIGdhdGhlcmVkIHN0eWxlcyBhcmUgYWN0dWFsbHkgaW4gdGhpcyB0ZW1wbGF0ZS4KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0eWxlc1dpdGhJbXBvcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHN0eWxlc1dpdGhJbXBvcnRzW2ldOwogICAgICAgICAgbGV0IHRlbXBsYXRlU3R5bGUgPSB0ZW1wbGF0ZVN0eWxlc1t0ZW1wbGF0ZVN0eWxlSW5kZXhdOwogICAgICAgICAgLy8gaWYgdGhlIHN0eWxlIGlzIG5vdCBpbiB0aGlzIHRlbXBsYXRlLCBpdCdzIGJlZW4gImluY2x1ZGVkIiBhbmQKICAgICAgICAgIC8vIHdlIHB1dCBhIGNsb25lIG9mIGl0IGluIHRoZSB0ZW1wbGF0ZSBiZWZvcmUgdGhlIHN0eWxlIHRoYXQgaW5jbHVkZWQgaXQKICAgICAgICAgIGlmICh0ZW1wbGF0ZVN0eWxlICE9PSBzKSB7CiAgICAgICAgICAgIHMgPSBzLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgdGVtcGxhdGVTdHlsZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzLCB0ZW1wbGF0ZVN0eWxlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRlbXBsYXRlU3R5bGVJbmRleCsrOwogICAgICAgICAgfQogICAgICAgICAgcy50ZXh0Q29udGVudCA9IGtsYXNzLl9wcm9jZXNzU3R5bGVUZXh0KHMudGV4dENvbnRlbnQsIGJhc2VVUkkpOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAod2luZG93LlNoYWR5Q1NTKSB7CiAgICAgICAgd2luZG93LlNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZSh0ZW1wbGF0ZSwgaXMpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBMb29rIHVwIHRlbXBsYXRlIGZyb20gZG9tLW1vZHVsZSBmb3IgZWxlbWVudAogICAgICoKICAgICAqIEBwYXJhbSB7IXN0cmluZ30gaXMgRWxlbWVudCBuYW1lIHRvIGxvb2sgdXAKICAgICAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBUZW1wbGF0ZSBmb3VuZCBpbiBkb20gbW9kdWxlLCBvcgogICAgICogICB1bmRlZmluZWQgaWYgbm90IGZvdW5kCiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRlbXBsYXRlRnJvbURvbU1vZHVsZShpcykgewogICAgICBsZXQgdGVtcGxhdGUgPSBudWxsOwogICAgICBpZiAoaXMgJiYgUG9seW1lci5Eb21Nb2R1bGUpIHsKICAgICAgICB0ZW1wbGF0ZSA9IFBvbHltZXIuRG9tTW9kdWxlLmltcG9ydChpcywgJ3RlbXBsYXRlJyk7CiAgICAgICAgLy8gVW5kZXIgc3RyaWN0VGVtcGxhdGVQb2xpY3ksIHJlcXVpcmUgYW55IGVsZW1lbnQgd2l0aCBhbiBgaXNgCiAgICAgICAgLy8gc3BlY2lmaWVkIHRvIGhhdmUgYSBkb20tbW9kdWxlCiAgICAgICAgaWYgKFBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHN0cmljdFRlbXBsYXRlUG9saWN5OiBleHBlY3RpbmcgZG9tLW1vZHVsZSBvciBudWxsIHRlbXBsYXRlIGZvciAke2lzfWApOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGVtcGxhdGU7CiAgICB9CgogIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKi8KICAgIGNsYXNzIFBvbHltZXJFbGVtZW50IGV4dGVuZHMgcG9seW1lckVsZW1lbnRCYXNlIHsKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZSBvZiBQcm9wZXJ0aWVzTWl4aW4gX2ZpbmFsaXplQ2xhc3MgdG8gY3JlYXRlIG9ic2VydmVycyBhbmQKICAgICAgICogZmluZCB0aGUgdGVtcGxhdGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgKi8KICAgICAgc3RhdGljIF9maW5hbGl6ZUNsYXNzKCkgewogICAgICAgIHN1cGVyLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgY29uc3Qgb2JzZXJ2ZXJzID0gb3duT2JzZXJ2ZXJzKHRoaXMpOwogICAgICAgIGlmIChvYnNlcnZlcnMpIHsKICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKG9ic2VydmVycywgdGhpcy5fcHJvcGVydGllcyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpOwogICAgICB9CgogICAgICBzdGF0aWMgX3ByZXBhcmVUZW1wbGF0ZSgpIHsKICAgICAgICAvLyBub3RlOiBjcmVhdGUgIndvcmtpbmciIHRlbXBsYXRlIHRoYXQgaXMgZmluYWxpemVkIGF0IGluc3RhbmNlIHRpbWUKICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9ICovICh0aGlzKS50ZW1wbGF0ZTsKICAgICAgICBpZiAodGVtcGxhdGUpIHsKICAgICAgICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIGxldCB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTsKICAgICAgICAgICAgdC5pbm5lckhUTUwgPSB0ZW1wbGF0ZTsKICAgICAgICAgICAgdGVtcGxhdGUgPSB0OwogICAgICAgICAgfSBlbHNlIGlmICghUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHRlbXBsYXRlLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMucHJvdG90eXBlLl90ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgb2YgUHJvcGVydGllc0NoYW5nZWQgY3JlYXRlUHJvcGVydGllcyB0byBjcmVhdGUgYWNjZXNzb3JzCiAgICAgICAqIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIGZvciBhbGwgb2YgdGhlIHByb3BlcnRpZXMuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBzdGF0aWMgY3JlYXRlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgICAgIGNyZWF0ZVByb3BlcnR5RnJvbUNvbmZpZyh0aGlzLnByb3RvdHlwZSwgcCwgcHJvcHNbcF0sIHByb3BzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIG9ic2VydmVycyBmb3IgdGhlIGdpdmVuIGBvYnNlcnZlcnNgIGFycmF5LgogICAgICAgKiBMZXZlcmFnZXMgYFByb3BlcnR5RWZmZWN0c2AgdG8gY3JlYXRlIG9ic2VydmVycy4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9ic2VydmVycyBBcnJheSBvZiBvYnNlcnZlciBkZXNjcmlwdG9ycyBmb3IKICAgICAgICogICB0aGlzIGNsYXNzCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkeW5hbWljRm5zIE9iamVjdCBjb250YWluaW5nIGtleXMgZm9yIGFueSBwcm9wZXJ0aWVzCiAgICAgICAqICAgdGhhdCBhcmUgZnVuY3Rpb25zIGFuZCBzaG91bGQgdHJpZ2dlciB0aGUgZWZmZWN0IHdoZW4gdGhlIGZ1bmN0aW9uCiAgICAgICAqICAgcmVmZXJlbmNlIGlzIGNoYW5nZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIGNyZWF0ZU9ic2VydmVycyhvYnNlcnZlcnMsIGR5bmFtaWNGbnMpIHsKICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG9ic2VydmVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgcHJvdG8uX2NyZWF0ZU1ldGhvZE9ic2VydmVyKG9ic2VydmVyc1tpXSwgZHluYW1pY0Zucyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgdGhhdCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGlzIGVsZW1lbnQncyBzaGFkb3cgcm9vdC4KICAgICAgICoKICAgICAgICogSWYgYSBgc3RhdGljIGdldCBpcygpYCBnZXR0ZXIgaXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICAgICogd2lsbCByZXR1cm4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCBpbiBhIGBkb20tbW9kdWxlYCB3aG9zZSBgaWRgCiAgICAgICAqIG1hdGNoZXMgdGhpcyBlbGVtZW50J3MgYGlzYC4KICAgICAgICoKICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZ2V0dGVyIHRvIHJldHVybiBhbiBhcmJpdHJhcnkgdGVtcGxhdGUKICAgICAgICogKGluIHdoaWNoIGNhc2UgdGhlIGBpc2AgZ2V0dGVyIGlzIHVubmVjZXNzYXJ5KS4gVGhlIHRlbXBsYXRlIHJldHVybmVkCiAgICAgICAqIG1heSBiZSBlaXRoZXIgYW4gYEhUTUxUZW1wbGF0ZUVsZW1lbnRgIG9yIGEgc3RyaW5nIHRoYXQgd2lsbCBiZQogICAgICAgKiBhdXRvbWF0aWNhbGx5IHBhcnNlZCBpbnRvIGEgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhhdCB3aGVuIHN1YmNsYXNzaW5nLCBpZiB0aGUgc3VwZXIgY2xhc3Mgb3ZlcnJvZGUgdGhlIGRlZmF1bHQKICAgICAgICogaW1wbGVtZW50YXRpb24gYW5kIHRoZSBzdWJjbGFzcyB3b3VsZCBsaWtlIHRvIHByb3ZpZGUgYW4gYWx0ZXJuYXRlCiAgICAgICAqIHRlbXBsYXRlIHZpYSBhIGBkb20tbW9kdWxlYCwgaXQgc2hvdWxkIG92ZXJyaWRlIHRoaXMgZ2V0dGVyIGFuZAogICAgICAgKiByZXR1cm4gYFBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCh0aGlzLmlzLCAndGVtcGxhdGUnKWAuCiAgICAgICAqCiAgICAgICAqIElmIGEgc3ViY2xhc3Mgd291bGQgbGlrZSB0byBtb2RpZnkgdGhlIHN1cGVyIGNsYXNzIHRlbXBsYXRlLCBpdCBzaG91bGQKICAgICAgICogY2xvbmUgaXQgcmF0aGVyIHRoYW4gbW9kaWZ5IGl0IGluIHBsYWNlLiAgSWYgdGhlIGdldHRlciBkb2VzIGV4cGVuc2l2ZQogICAgICAgKiB3b3JrIHN1Y2ggYXMgY2xvbmluZy9tb2RpZnlpbmcgYSB0ZW1wbGF0ZSwgaXQgc2hvdWxkIG1lbW9pemUgdGhlCiAgICAgICAqIHRlbXBsYXRlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlOgogICAgICAgKgogICAgICAgKiAgIGxldCBtZW1vaXplZFRlbXBsYXRlOwogICAgICAgKiAgIGNsYXNzIE15U3ViQ2xhc3MgZXh0ZW5kcyBNeVN1cGVyQ2xhc3MgewogICAgICAgKiAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsKICAgICAgICogICAgICAgaWYgKCFtZW1vaXplZFRlbXBsYXRlKSB7CiAgICAgICAqICAgICAgICAgbWVtb2l6ZWRUZW1wbGF0ZSA9IE15U3VwZXJDbGFzcy50ZW1wbGF0ZS5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAqICAgICAgICAgbGV0IHN1YkNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICogICAgICAgICBzdWJDb250ZW50LnRleHRDb250ZW50ID0gJ1RoaXMgY2FtZSBmcm9tIE15U3ViQ2xhc3MnOwogICAgICAgKiAgICAgICAgIG1lbW9pemVkVGVtcGxhdGUuY29udGVudC5hcHBlbmRDaGlsZChzdWJDb250ZW50KTsKICAgICAgICogICAgICAgfQogICAgICAgKiAgICAgICByZXR1cm4gbWVtb2l6ZWRUZW1wbGF0ZTsKICAgICAgICogICAgIH0KICAgICAgICogICB9CiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge0hUTUxUZW1wbGF0ZUVsZW1lbnR8c3RyaW5nfSBUZW1wbGF0ZSB0byBiZSBzdGFtcGVkCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICAgIC8vIEV4cGxhbmF0aW9uIG9mIHRlbXBsYXRlLXJlbGF0ZWQgcHJvcGVydGllczoKICAgICAgICAvLyAtIGNvbnN0cnVjdG9yLnRlbXBsYXRlICh0aGlzIGdldHRlcik6IHRoZSB0ZW1wbGF0ZSBmb3IgdGhlIGNsYXNzLgogICAgICAgIC8vICAgICBUaGlzIGNhbiBjb21lIGZyb20gdGhlIHByb3RvdHlwZSAoZm9yIGxlZ2FjeSBlbGVtZW50cyksIGZyb20gYQogICAgICAgIC8vICAgICBkb20tbW9kdWxlLCBvciBmcm9tIHRoZSBzdXBlciBjbGFzcydzIHRlbXBsYXRlIChvciBjYW4gYmUgb3ZlcnJpZGRlbgogICAgICAgIC8vICAgICBhbHRvZ2V0aGVyIGJ5IHRoZSB1c2VyKQogICAgICAgIC8vIC0gY29uc3RydWN0b3IuX3RlbXBsYXRlOiBtZW1vaXplZCB2ZXJzaW9uIG9mIGNvbnN0cnVjdG9yLnRlbXBsYXRlCiAgICAgICAgLy8gLSBwcm90b3R5cGUuX3RlbXBsYXRlOiB3b3JraW5nIHRlbXBsYXRlIGZvciB0aGUgZWxlbWVudCwgd2hpY2ggd2lsbCBiZQogICAgICAgIC8vICAgICBwYXJzZWQgYW5kIG1vZGlmaWVkIGluIHBsYWNlLiBJdCBpcyBhIGNsb25lZCB2ZXJzaW9uIG9mCiAgICAgICAgLy8gICAgIGNvbnN0cnVjdG9yLnRlbXBsYXRlLCBzYXZlZCBpbiBfZmluYWxpemVDbGFzcygpLiBOb3RlIHRoYXQgYmVmb3JlCiAgICAgICAgLy8gICAgIHRoaXMgZ2V0dGVyIGlzIGNhbGxlZCwgZm9yIGxlZ2FjeSBlbGVtZW50cyB0aGlzIGNvdWxkIGJlIGZyb20gYQogICAgICAgIC8vICAgICBfdGVtcGxhdGUgZmllbGQgb24gdGhlIGluZm8gb2JqZWN0IHBhc3NlZCB0byBQb2x5bWVyKCksIGEgYmVoYXZpb3IsCiAgICAgICAgLy8gICAgIG9yIHNldCBpbiByZWdpc3RlcmVkKCk7IG9uY2UgdGhlIHN0YXRpYyBnZXR0ZXIgcnVucywgYSBjbG9uZSBvZiBpdAogICAgICAgIC8vICAgICB3aWxsIG92ZXJ3cml0ZSBpdCBvbiB0aGUgcHJvdG90eXBlIGFzIHRoZSB3b3JraW5nIHRlbXBsYXRlLgogICAgICAgIGlmICghdGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzKSkpIHsKICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0KICAgICAgICAgICAgLy8gSWYgdXNlciBoYXMgcHV0IHRlbXBsYXRlIG9uIHByb3RvdHlwZSAoZS5nLiBpbiBsZWdhY3kgdmlhIHJlZ2lzdGVyZWQKICAgICAgICAgICAgLy8gY2FsbGJhY2sgb3IgaW5mbyBvYmplY3QpLCBwcmVmZXIgdGhhdCBmaXJzdAogICAgICAgICAgICB0aGlzLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzLnByb3RvdHlwZSkpID8KICAgICAgICAgICAgdGhpcy5wcm90b3R5cGUuX3RlbXBsYXRlIDoKICAgICAgICAgICAgLy8gTG9vayBpbiBkb20tbW9kdWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQncyBpcwogICAgICAgICAgICAoZ2V0VGVtcGxhdGVGcm9tRG9tTW9kdWxlKC8qKiBAdHlwZSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0qLyAodGhpcykuaXMpIHx8CiAgICAgICAgICAgIC8vIE5leHQgbG9vayBmb3Igc3VwZXJjbGFzcyB0ZW1wbGF0ZSAoY2FsbCB0aGUgc3VwZXIgaW1wbCB0aGlzCiAgICAgICAgICAgIC8vIHdheSBzbyB0aGF0IGB0aGlzYCBwb2ludHMgdG8gdGhlIHN1cGVyY2xhc3MpCiAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZigvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLnByb3RvdHlwZSkuY29uc3RydWN0b3IudGVtcGxhdGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZXQgdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fHN0cmluZ30gdmFsdWUgVGVtcGxhdGUgdG8gc2V0LgogICAgICAgKi8KICAgICAgc3RhdGljIHNldCB0ZW1wbGF0ZSh2YWx1ZSkgewogICAgICAgIHRoaXMuX3RlbXBsYXRlID0gdmFsdWU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXRoIG1hdGNoaW5nIHRoZSB1cmwgZnJvbSB3aGljaCB0aGUgZWxlbWVudCB3YXMgaW1wb3J0ZWQuCiAgICAgICAqCiAgICAgICAqIFRoaXMgcGF0aCBpcyB1c2VkIHRvIHJlc29sdmUgdXJsJ3MgaW4gdGVtcGxhdGUgc3R5bGUgY3NzVGV4dC4KICAgICAgICogVGhlIGBpbXBvcnRQYXRoYCBwcm9wZXJ0eSBpcyBhbHNvIHNldCBvbiBlbGVtZW50IGluc3RhbmNlcyBhbmQgY2FuIGJlCiAgICAgICAqIHVzZWQgdG8gY3JlYXRlIGJpbmRpbmdzIHJlbGF0aXZlIHRvIHRoZSBpbXBvcnQgcGF0aC4KICAgICAgICoKICAgICAgICogRm9yIGVsZW1lbnRzIGRlZmluZWQgaW4gRVMgbW9kdWxlcywgdXNlcnMgc2hvdWxkIGltcGxlbWVudAogICAgICAgKiBgc3RhdGljIGdldCBpbXBvcnRNZXRhKCkgeyByZXR1cm4gaW1wb3J0Lm1ldGE7IH1gLCBhbmQgdGhlIGRlZmF1bHQKICAgICAgICogaW1wbGVtZW50YXRpb24gb2YgYGltcG9ydFBhdGhgIHdpbGwgIHJldHVybiBgaW1wb3J0Lm1ldGEudXJsYCdzIHBhdGguCiAgICAgICAqIEZvciBlbGVtZW50cyBkZWZpbmVkIGluIEhUTUwgaW1wb3J0cywgdGhpcyBnZXR0ZXIgd2lsbCByZXR1cm4gdGhlIHBhdGgKICAgICAgICogdG8gdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgYSBgZG9tLW1vZHVsZWAgZWxlbWVudCBtYXRjaGluZyB0aGlzCiAgICAgICAqIGVsZW1lbnQncyBzdGF0aWMgYGlzYCBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogTm90ZSwgdGhpcyBwYXRoIHNob3VsZCBjb250YWluIGEgdHJhaWxpbmcgYC9gLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBpbXBvcnQgcGF0aCBmb3IgdGhpcyBlbGVtZW50IGNsYXNzCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9CiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IGltcG9ydFBhdGgoKSB7CiAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19pbXBvcnRQYXRoJywgdGhpcykpKSB7CiAgICAgICAgICBjb25zdCBtZXRhID0gdGhpcy5pbXBvcnRNZXRhOwogICAgICAgICAgaWYgKG1ldGEpIHsKICAgICAgICAgICAgdGhpcy5faW1wb3J0UGF0aCA9IFBvbHltZXIuUmVzb2x2ZVVybC5wYXRoRnJvbVVybChtZXRhLnVybCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBQb2x5bWVyLkRvbU1vZHVsZSAmJiBQb2x5bWVyLkRvbU1vZHVsZS5pbXBvcnQoLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAodGhpcykuaXMpOwogICAgICAgICAgICB0aGlzLl9pbXBvcnRQYXRoID0gKG1vZHVsZSAmJiBtb2R1bGUuYXNzZXRwYXRoKSB8fAogICAgICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZigvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9Ki8gKHRoaXMpLnByb3RvdHlwZSkuY29uc3RydWN0b3IuaW1wb3J0UGF0aDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2ltcG9ydFBhdGg7CiAgICAgIH0KCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLwogICAgICAgIHRoaXMuX3RlbXBsYXRlOwogICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICAgIHRoaXMuX2ltcG9ydFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgdGhpcy5yb290UGF0aDsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLmltcG9ydFBhdGg7CiAgICAgICAgLyoqIEB0eXBlIHtTdGFtcGVkVGVtcGxhdGUgfCBIVE1MRWxlbWVudCB8IFNoYWRvd1Jvb3R9ICovCiAgICAgICAgdGhpcy5yb290OwogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdDxzdHJpbmcsICFFbGVtZW50Pn0gKi8KICAgICAgICB0aGlzLiQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgIHRvIGVuc3VyZSBjbGFzcwogICAgICAgKiBtZXRhcHJvZ3JhbW1pbmcgcmVsYXRlZCB0byBwcm9wZXJ0eSBhY2Nlc3NvcnMgYW5kIGVmZmVjdHMgaGFzCiAgICAgICAqIGNvbXBsZXRlZCAoY2FsbHMgYGZpbmFsaXplYCkuCiAgICAgICAqCiAgICAgICAqIEl0IGFsc28gaW5pdGlhbGl6ZXMgYW55IHByb3BlcnR5IGRlZmF1bHRzIHByb3ZpZGVkIHZpYSBgdmFsdWVgIGluCiAgICAgICAqIGBwcm9wZXJ0aWVzYCBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgIHRoaXMuY29uc3RydWN0b3IuZmluYWxpemUoKTsKICAgICAgICAvLyBub3RlOiBmaW5hbGl6ZSB0ZW1wbGF0ZSB3aGVuIHdlIGhhdmUgYWNjZXNzIHRvIGBsb2NhbE5hbWVgIHRvCiAgICAgICAgLy8gYXZvaWQgZGVwZW5kZW5jZSBvbiBgaXNgIGZvciBwb2x5ZmlsbGluZyBzdHlsaW5nLgogICAgICAgIHRoaXMuY29uc3RydWN0b3IuX2ZpbmFsaXplVGVtcGxhdGUoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpLmxvY2FsTmFtZSk7CiAgICAgICAgc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gc2V0IHBhdGggZGVmYXVsdHMKICAgICAgICB0aGlzLnJvb3RQYXRoID0gUG9seW1lci5yb290UGF0aDsKICAgICAgICB0aGlzLmltcG9ydFBhdGggPSB0aGlzLmNvbnN0cnVjdG9yLmltcG9ydFBhdGg7CiAgICAgICAgLy8gYXBwbHkgcHJvcGVydHkgZGVmYXVsdHMuLi4KICAgICAgICBsZXQgcCQgPSBwcm9wZXJ0eURlZmF1bHRzKHRoaXMuY29uc3RydWN0b3IpOwogICAgICAgIGlmICghcCQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgcCBpbiBwJCkgewogICAgICAgICAgbGV0IGluZm8gPSBwJFtwXTsKICAgICAgICAgIC8vIERvbid0IHNldCBkZWZhdWx0IHZhbHVlIGlmIHRoZXJlIGlzIGFscmVhZHkgYW4gb3duIHByb3BlcnR5LCB3aGljaAogICAgICAgICAgLy8gaGFwcGVucyB3aGVuIGEgYHByb3BlcnRpZXNgIHByb3BlcnR5IHdpdGggZGVmYXVsdCBidXQgbm8gZWZmZWN0cyBoYWQKICAgICAgICAgIC8vIGEgcHJvcGVydHkgc2V0IChlLmcuIGJvdW5kKSBieSBpdHMgaG9zdCBiZWZvcmUgdXBncmFkZQogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KHApKSB7CiAgICAgICAgICAgIGxldCB2YWx1ZSA9IHR5cGVvZiBpbmZvLnZhbHVlID09ICdmdW5jdGlvbicgPwogICAgICAgICAgICAgIGluZm8udmFsdWUuY2FsbCh0aGlzKSA6CiAgICAgICAgICAgICAgaW5mby52YWx1ZTsKICAgICAgICAgICAgLy8gU2V0IHZpYSBgX3NldFByb3BlcnR5YCBpZiB0aGVyZSBpcyBhbiBhY2Nlc3NvciwgdG8gZW5hYmxlCiAgICAgICAgICAgIC8vIGluaXRpYWxpemluZyByZWFkT25seSBwcm9wZXJ0eSBkZWZhdWx0cwogICAgICAgICAgICBpZiAodGhpcy5faGFzQWNjZXNzb3IocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkocCwgdmFsdWUsIHRydWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXNbcF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEdhdGhlciBzdHlsZSB0ZXh0IGZvciBhIHN0eWxlIGVsZW1lbnQgaW4gdGhlIHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3NzVGV4dCBUZXh0IGNvbnRhaW5pbmcgc3R5bGluZyB0byBwcm9jZXNzCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIEJhc2UgVVJJIHRvIHJlYmFzZSBDU1MgcGF0aHMgYWdhaW5zdAogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcm9jZXNzZWQgQ1NTIHRleHQKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgc3RhdGljIF9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpIHsKICAgICAgICByZXR1cm4gUG9seW1lci5SZXNvbHZlVXJsLnJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAqIENvbmZpZ3VyZXMgYW4gZWxlbWVudCBgcHJvdG9gIHRvIGZ1bmN0aW9uIHdpdGggYSBnaXZlbiBgdGVtcGxhdGVgLgogICAgICAqIFRoZSBlbGVtZW50IG5hbWUgYGlzYCBhbmQgZXh0ZW5kcyBgZXh0YCBtdXN0IGJlIHNwZWNpZmllZCBmb3IgU2hhZHlDU1MKICAgICAgKiBzdHlsZSBzY29waW5nLgogICAgICAqCiAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlzIFRhZyBuYW1lIChvciB0eXBlIGV4dGVuc2lvbiBuYW1lKSBmb3IgdGhpcyBlbGVtZW50CiAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICovCiAgICAgIHN0YXRpYyBfZmluYWxpemVUZW1wbGF0ZShpcykgewogICAgICAgIC8qKiBAY29uc3Qge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLnByb3RvdHlwZS5fdGVtcGxhdGU7CiAgICAgICAgaWYgKHRlbXBsYXRlICYmICF0ZW1wbGF0ZS5fX3BvbHltZXJGaW5hbGl6ZWQpIHsKICAgICAgICAgIHRlbXBsYXRlLl9fcG9seW1lckZpbmFsaXplZCA9IHRydWU7CiAgICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gdGhpcy5pbXBvcnRQYXRoOwogICAgICAgICAgY29uc3QgYmFzZVVSSSA9IGltcG9ydFBhdGggPyBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybChpbXBvcnRQYXRoKSA6ICcnOwogICAgICAgICAgLy8gZS5nLiBzdXBwb3J0IGBpbmNsdWRlPSJtb2R1bGUtbmFtZSJgLCBhbmQgU2hhZHlDU1MKICAgICAgICAgIHByb2Nlc3NFbGVtZW50U3R5bGVzKHRoaXMsIHRlbXBsYXRlLCBpcywgYmFzZVVSSSk7CiAgICAgICAgICB0aGlzLnByb3RvdHlwZS5fYmluZFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN0YW5kYXJkIEN1c3RvbSBFbGVtZW50cwogICAgICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgLgogICAgICAgKgogICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBlbmFibGVzIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIHN5c3RlbSBhbmQKICAgICAgICogZmx1c2hlcyBhbnkgcGVuZGluZyBwcm9wZXJ0aWVzLCBhbmQgdXBkYXRlcyBzaGltbWVkIENTUyBwcm9wZXJ0aWVzCiAgICAgICAqIHdoZW4gdXNpbmcgdGhlIFNoYWR5Q1NTIHNjb3BpbmcvY3VzdG9tIHByb3BlcnRpZXMgcG9seWZpbGwuCiAgICAgICAqCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXMsIGludmFsaWRDYXN0c30gU3VwZXIgbWF5IG9yIG1heSBub3QgaW1wbGVtZW50IHRoZSBjYWxsYmFjawogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlRWxlbWVudCgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykpOwogICAgICAgIH0KICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU3RhbXBzIHRoZSBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIHJlYWR5KCkgewogICAgICAgIGlmICh0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0aGlzLl90ZW1wbGF0ZSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICB9CiAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5RWZmZWN0c2AncyBgX3JlYWR5Q2xpZW50c2AgY2FsbC4gQXR0YWNoZXMKICAgICAgICogZWxlbWVudCBkb20gYnkgY2FsbGluZyBgX2F0dGFjaERvbWAgd2l0aCB0aGUgZG9tIHN0YW1wZWQgZnJvbSB0aGUKICAgICAgICogZWxlbWVudCdzIHRlbXBsYXRlIHZpYSBgX3N0YW1wVGVtcGxhdGVgLiBOb3RlIHRoYXQgdGhpcyBhbGxvd3MKICAgICAgICogY2xpZW50IGRvbSB0byBiZSBhdHRhY2hlZCB0byB0aGUgZWxlbWVudCBwcmlvciB0byBhbnkgb2JzZXJ2ZXJzCiAgICAgICAqIHJ1bm5pbmcuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICBpZiAodGhpcy5fdGVtcGxhdGUpIHsKICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX2F0dGFjaERvbSgvKiogQHR5cGUge1N0YW1wZWRUZW1wbGF0ZX0gKi8odGhpcy5yb290KSk7CiAgICAgICAgfQogICAgICAgIC8vIFRoZSBzdXBlci5fcmVhZHlDbGllbnRzIGhlcmUgc2V0cyB0aGUgY2xpZW50cyBpbml0aWFsaXplZCBmbGFnLgogICAgICAgIC8vIFdlIG11c3Qgd2FpdCB0byBkbyB0aGlzIHVudGlsIGFmdGVyIGNsaWVudCBkb20gaXMgY3JlYXRlZC9hdHRhY2hlZAogICAgICAgIC8vIHNvIHRoYXQgdGhpcyBmbGFnIGNhbiBiZSBjaGVja2VkIHRvIHByZXZlbnQgbm90aWZpY2F0aW9ucyBmaXJlZAogICAgICAgIC8vIGR1cmluZyB0aGlzIHByb2Nlc3MgZnJvbSBiZWluZyBoYW5kbGVkIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgICAgICBzdXBlci5fcmVhZHlDbGllbnRzKCk7CiAgICAgIH0KCgogICAgICAvKioKICAgICAgICogQXR0YWNoZXMgYW4gZWxlbWVudCdzIHN0YW1wZWQgZG9tIHRvIGl0c2VsZi4gQnkgZGVmYXVsdCwKICAgICAgICogdGhpcyBtZXRob2QgY3JlYXRlcyBhIGBzaGFkb3dSb290YCBhbmQgYWRkcyB0aGUgZG9tIHRvIGl0LgogICAgICAgKiBIb3dldmVyLCB0aGlzIG1ldGhvZCBtYXkgYmUgb3ZlcnJpZGRlbiB0byBhbGxvdyBhbiBlbGVtZW50CiAgICAgICAqIHRvIHB1dCBpdHMgZG9tIGluIGFub3RoZXIgbG9jYXRpb24uCiAgICAgICAqCiAgICAgICAqIEB0aHJvd3Mge0Vycm9yfQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdSZXR1cm59CiAgICAgICAqIEBwYXJhbSB7U3RhbXBlZFRlbXBsYXRlfSBkb20gdG8gYXR0YWNoIHRvIHRoZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHtTaGFkb3dSb290fSBub2RlIHRvIHdoaWNoIHRoZSBkb20gaGFzIGJlZW4gYXR0YWNoZWQuCiAgICAgICAqLwogICAgICBfYXR0YWNoRG9tKGRvbSkgewogICAgICAgIGlmICh0aGlzLmF0dGFjaFNoYWRvdykgewogICAgICAgICAgaWYgKGRvbSkgewogICAgICAgICAgICBpZiAoIXRoaXMuc2hhZG93Um9vdCkgewogICAgICAgICAgICAgIHRoaXMuYXR0YWNoU2hhZG93KHttb2RlOiAnb3Blbid9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoZG9tKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYWRvd0RPTSBub3QgYXZhaWxhYmxlLiAnICsKICAgICAgICAgICAgLy8gVE9ETyhzb3J2ZWxsKTogbW92ZSB0byBjb21waWxlLXRpbWUgY29uZGl0aW9uYWwgd2hlbiBzdXBwb3J0ZWQKICAgICAgICAgICdQb2x5bWVyLkVsZW1lbnQgY2FuIGNyZWF0ZSBkb20gYXMgY2hpbGRyZW4gaW5zdGVhZCBvZiBpbiAnICsKICAgICAgICAgICdTaGFkb3dET00gYnkgc2V0dGluZyBgdGhpcy5yb290ID0gdGhpcztcYCBiZWZvcmUgXGByZWFkeVxgLicpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFdoZW4gdXNpbmcgdGhlIFNoYWR5Q1NTIHNjb3BpbmcgYW5kIGN1c3RvbSBwcm9wZXJ0eSBzaGltLCBjYXVzZXMgYWxsCiAgICAgICAqIHNoaW1tZWQgc3R5bGVzIGluIHRoaXMgZWxlbWVudCAoYW5kIGl0cyBzdWJ0cmVlKSB0byBiZSB1cGRhdGVkCiAgICAgICAqIGJhc2VkIG9uIGN1cnJlbnQgY3VzdG9tIHByb3BlcnR5IHZhbHVlcy4KICAgICAgICoKICAgICAgICogVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBvdmVycmlkZXMgaW5saW5lIGN1c3RvbSBwcm9wZXJ0eSBzdHlsZXMgd2l0aCBhbgogICAgICAgKiBvYmplY3Qgb2YgcHJvcGVydGllcyB3aGVyZSB0aGUga2V5cyBhcmUgQ1NTIHByb3BlcnRpZXMsIGFuZCB0aGUgdmFsdWVzCiAgICAgICAqIGFyZSBzdHJpbmdzLgogICAgICAgKgogICAgICAgKiBFeGFtcGxlOiBgdGhpcy51cGRhdGVTdHlsZXMoeyctLWNvbG9yJzogJ2JsdWUnfSlgCiAgICAgICAqCiAgICAgICAqIFRoZXNlIHByb3BlcnRpZXMgYXJlIHJldGFpbmVkIHVubGVzcyBhIHZhbHVlIG9mIGBudWxsYCBpcyBzZXQuCiAgICAgICAqCiAgICAgICAqIE5vdGU6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3VwcG9ydCB1cGRhdGluZyBDU1MgbWl4aW5zLgogICAgICAgKiBZb3UgY2FuIG5vdCBkeW5hbWljYWxseSBjaGFuZ2UgdGhlIHZhbHVlIG9mIGFuIGBAYXBwbHlgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BlcnRpZXMgQmFnIG9mIGN1c3RvbSBwcm9wZXJ0eSBrZXkvdmFsdWVzIHRvCiAgICAgICAqICAgYXBwbHkgdG8gdGhpcyBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIHVwZGF0ZVN0eWxlcyhwcm9wZXJ0aWVzKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUykgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlU3VidHJlZSgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnRpZXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJld3JpdGVzIGEgZ2l2ZW4gVVJMIHJlbGF0aXZlIHRvIGEgYmFzZSBVUkwuIFRoZSBiYXNlIFVSTCBkZWZhdWx0cyB0bwogICAgICAgKiB0aGUgb3JpZ2luYWwgbG9jYXRpb24gb2YgdGhlIGRvY3VtZW50IGNvbnRhaW5pbmcgdGhlIGBkb20tbW9kdWxlYCBmb3IKICAgICAgICogdGhpcyBlbGVtZW50LiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc2FtZSBVUkwgYmVmb3JlIGFuZCBhZnRlcgogICAgICAgKiBidW5kbGluZy4KICAgICAgICoKICAgICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgICAqIHdpdGggYC9gIChhYnNvbHV0ZSBVUkxzKSBvciBgI2AgKGhhc2ggaWRlbnRpZmllcnMpLiAgRm9yIGdlbmVyYWwgcHVycG9zZQogICAgICAgKiBVUkwgcmVzb2x1dGlvbiwgdXNlIGB3aW5kb3cuVVJMYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBVUkwgdG8gcmVzb2x2ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBiYXNlIE9wdGlvbmFsIGJhc2UgVVJMIHRvIHJlc29sdmUgYWdhaW5zdCwgZGVmYXVsdHMKICAgICAgICogdG8gdGhlIGVsZW1lbnQncyBgaW1wb3J0UGF0aGAKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBSZXdyaXR0ZW4gVVJMIHJlbGF0aXZlIHRvIGJhc2UKICAgICAgICovCiAgICAgIHJlc29sdmVVcmwodXJsLCBiYXNlKSB7CiAgICAgICAgaWYgKCFiYXNlICYmIHRoaXMuaW1wb3J0UGF0aCkgewogICAgICAgICAgYmFzZSA9IFBvbHltZXIuUmVzb2x2ZVVybC5yZXNvbHZlVXJsKHRoaXMuaW1wb3J0UGF0aCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBQb2x5bWVyLlJlc29sdmVVcmwucmVzb2x2ZVVybCh1cmwsIGJhc2UpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0eUFjY2Vzc29yc2AgdG8gYWRkIG1hcCBvZiBkeW5hbWljIGZ1bmN0aW9ucyBvbgogICAgICAgKiB0ZW1wbGF0ZSBpbmZvLCBmb3IgY29uc3VtcHRpb24gYnkgYFByb3BlcnR5RWZmZWN0c2AgdGVtcGxhdGUgYmluZGluZwogICAgICAgKiBjb2RlLiBUaGlzIG1hcCBkZXRlcm1pbmVzIHdoaWNoIG1ldGhvZCB0ZW1wbGF0ZXMgc2hvdWxkIGhhdmUgYWNjZXNzb3JzCiAgICAgICAqIGNyZWF0ZWQgZm9yIHRoZW0uCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICovCiAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICB0ZW1wbGF0ZUluZm8uZHluYW1pY0ZucyA9IHRlbXBsYXRlSW5mby5keW5hbWljRm5zIHx8IHRoaXMuX3Byb3BlcnRpZXM7CiAgICAgICAgcmV0dXJuIHN1cGVyLl9wYXJzZVRlbXBsYXRlQ29udGVudCh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbyk7CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIFBvbHltZXJFbGVtZW50OwogIH0pOwoKICAvKioKICAgKiBXaGVuIHVzaW5nIHRoZSBTaGFkeUNTUyBzY29waW5nIGFuZCBjdXN0b20gcHJvcGVydHkgc2hpbSwgY2F1c2VzIGFsbAogICAqIHNoaW1tZWQgYHN0eWxlc2AgKHZpYSBgY3VzdG9tLXN0eWxlYCkgaW4gdGhlIGRvY3VtZW50IChhbmQgaXRzIHN1YnRyZWUpCiAgICogdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBjdXJyZW50IGN1c3RvbSBwcm9wZXJ0eSB2YWx1ZXMuCiAgICoKICAgKiBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyIG92ZXJyaWRlcyBpbmxpbmUgY3VzdG9tIHByb3BlcnR5IHN0eWxlcyB3aXRoIGFuCiAgICogb2JqZWN0IG9mIHByb3BlcnRpZXMgd2hlcmUgdGhlIGtleXMgYXJlIENTUyBwcm9wZXJ0aWVzLCBhbmQgdGhlIHZhbHVlcwogICAqIGFyZSBzdHJpbmdzLgogICAqCiAgICogRXhhbXBsZTogYFBvbHltZXIudXBkYXRlU3R5bGVzKHsnLS1jb2xvcic6ICdibHVlJ30pYAogICAqCiAgICogVGhlc2UgcHJvcGVydGllcyBhcmUgcmV0YWluZWQgdW5sZXNzIGEgdmFsdWUgb2YgYG51bGxgIGlzIHNldC4KICAgKgogICAqIEBwYXJhbSB7T2JqZWN0PX0gcHJvcHMgQmFnIG9mIGN1c3RvbSBwcm9wZXJ0eSBrZXkvdmFsdWVzIHRvCiAgICogICBhcHBseSB0byB0aGUgZG9jdW1lbnQuCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLnVwZGF0ZVN0eWxlcyA9IGZ1bmN0aW9uKHByb3BzKSB7CiAgICBpZiAod2luZG93LlNoYWR5Q1NTKSB7CiAgICAgIHdpbmRvdy5TaGFkeUNTUy5zdHlsZURvY3VtZW50KHByb3BzKTsKICAgIH0KICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBAc3VtbWFyeSBDb2xsYXBzZSBtdWx0aXBsZSBjYWxsYmFja3MgaW50byBvbmUgaW52b2NhdGlvbiBhZnRlciBhIHRpbWVyLgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICovCiAgY2xhc3MgRGVib3VuY2VyIHsKICAgIGNvbnN0cnVjdG9yKCkgewogICAgICB0aGlzLl9hc3luY01vZHVsZSA9IG51bGw7CiAgICAgIHRoaXMuX2NhbGxiYWNrID0gbnVsbDsKICAgICAgdGhpcy5fdGltZXIgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBzY2hlZHVsZXI7IHRoYXQgaXMsIGEgbW9kdWxlIHdpdGggdGhlIEFzeW5jIGludGVyZmFjZSwKICAgICAqIGEgY2FsbGJhY2sgYW5kIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHJ1biBmdW5jdGlvbgogICAgICogZnJvbSB0aGUgYXN5bmMgbW9kdWxlLgogICAgICoKICAgICAqIEBwYXJhbSB7IUFzeW5jSW50ZXJmYWNlfSBhc3luY01vZHVsZSBPYmplY3Qgd2l0aCBBc3luYyBpbnRlcmZhY2UuCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bi4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldENvbmZpZyhhc3luY01vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgdGhpcy5fYXN5bmNNb2R1bGUgPSBhc3luY01vZHVsZTsKICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgdGhpcy5fdGltZXIgPSB0aGlzLl9hc3luY01vZHVsZS5ydW4oKCkgPT4gewogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQ2FuY2VscyBhbiBhY3RpdmUgZGVib3VuY2VyIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGl0c2VsZi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBjYW5jZWwoKSB7CiAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHsKICAgICAgICB0aGlzLl9hc3luY01vZHVsZS5jYW5jZWwodGhpcy5fdGltZXIpOwogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBGbHVzaGVzIGFuIGFjdGl2ZSBkZWJvdW5jZXIgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLgogICAgICoKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGZsdXNoKCkgewogICAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB7CiAgICAgICAgdGhpcy5jYW5jZWwoKTsKICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFjdGl2ZS4KICAgICAqLwogICAgaXNBY3RpdmUoKSB7CiAgICAgIHJldHVybiB0aGlzLl90aW1lciAhPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZGVib3VuY2VyIGlmIG5vIGRlYm91bmNlciBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIKICAgICAqIG9yIGl0IGNhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlciBvdGhlcndpc2UuIFRoZSBmb2xsb3dpbmcKICAgICAqIGV4YW1wbGUgc2hvd3MgaG93IGEgZGVib3VuY2VyIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIGEKICAgICAqIG1pY3JvdGFzayBhbmQgImRlYm91bmNlZCIgc3VjaCB0aGF0IHRoZSBwcm92aWRlZCBjYWxsYmFjayBmdW5jdGlvbiBpcwogICAgICogY2FsbGVkIG9uY2UuIEFkZCB0aGlzIG1ldGhvZCB0byBhIGN1c3RvbSBlbGVtZW50OgogICAgICoKICAgICAqIF9kZWJvdW5jZVdvcmsoKSB7CiAgICAgKiAgIHRoaXMuX2RlYm91bmNlSm9iID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UodGhpcy5fZGVib3VuY2VKb2IsCiAgICAgKiAgICAgICBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzaywgKCkgPT4gewogICAgICogICAgIHRoaXMuX2RvV29yaygpOwogICAgICogICB9KTsKICAgICAqIH0KICAgICAqCiAgICAgKiBJZiB0aGUgYF9kZWJvdW5jZVdvcmtgIG1ldGhvZCBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aGluIHRoZSBzYW1lCiAgICAgKiBtaWNyb3Rhc2ssIHRoZSBgX2RvV29ya2AgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgb25seSBvbmNlIGF0IHRoZSBuZXh0CiAgICAgKiBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAqCiAgICAgKiBOb3RlOiBJbiB0ZXN0aW5nIGl0IGlzIG9mdGVuIGNvbnZlbmllbnQgdG8gYXZvaWQgYXN5bmNocm9ueS4gVG8gYWNjb21wbGlzaAogICAgICogdGhpcyB3aXRoIGEgZGVib3VuY2VyLCB5b3UgY2FuIHVzZSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYCBhbmQKICAgICAqIGBQb2x5bWVyLmZsdXNoYC4gRm9yIGV4YW1wbGUsIGV4dGVuZCB0aGUgYWJvdmUgZXhhbXBsZSBieSBhZGRpbmcKICAgICAqIGBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIodGhpcy5fZGVib3VuY2VKb2IpYCBhdCB0aGUgZW5kIG9mIHRoZQogICAgICogYF9kZWJvdW5jZVdvcmtgIG1ldGhvZC4gVGhlbiBpbiBhIHRlc3QsIGNhbGwgYFBvbHltZXIuZmx1c2hgIHRvIGVuc3VyZQogICAgICogdGhlIGRlYm91bmNlciBoYXMgY29tcGxldGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7RGVib3VuY2VyP30gZGVib3VuY2VyIERlYm91bmNlciBvYmplY3QuCiAgICAgKiBAcGFyYW0geyFBc3luY0ludGVyZmFjZX0gYXN5bmNNb2R1bGUgT2JqZWN0IHdpdGggQXN5bmMgaW50ZXJmYWNlCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGNhbGxiYWNrIENhbGxiYWNrIHRvIHJ1bi4KICAgICAqIEByZXR1cm4geyFEZWJvdW5jZXJ9IFJldHVybnMgYSBkZWJvdW5jZXIgb2JqZWN0LgogICAgICovCiAgICBzdGF0aWMgZGVib3VuY2UoZGVib3VuY2VyLCBhc3luY01vZHVsZSwgY2FsbGJhY2spIHsKICAgICAgaWYgKGRlYm91bmNlciBpbnN0YW5jZW9mIERlYm91bmNlcikgewogICAgICAgIGRlYm91bmNlci5jYW5jZWwoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkZWJvdW5jZXIgPSBuZXcgRGVib3VuY2VyKCk7CiAgICAgIH0KICAgICAgZGVib3VuY2VyLnNldENvbmZpZyhhc3luY01vZHVsZSwgY2FsbGJhY2spOwogICAgICByZXR1cm4gZGVib3VuY2VyOwogICAgfQogIH0KCiAgLyoqIEBjb25zdCAqLwogIFBvbHltZXIuRGVib3VuY2VyID0gRGVib3VuY2VyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBkZXRlY3QgbmF0aXZlIHRvdWNoIGFjdGlvbiBzdXBwb3J0CiAgbGV0IEhBU19OQVRJVkVfVEEgPSB0eXBlb2YgZG9jdW1lbnQuaGVhZC5zdHlsZS50b3VjaEFjdGlvbiA9PT0gJ3N0cmluZyc7CiAgbGV0IEdFU1RVUkVfS0VZID0gJ19fcG9seW1lckdlc3R1cmVzJzsKICBsZXQgSEFORExFRF9PQkogPSAnX19wb2x5bWVyR2VzdHVyZXNIYW5kbGVkJzsKICBsZXQgVE9VQ0hfQUNUSU9OID0gJ19fcG9seW1lckdlc3R1cmVzVG91Y2hBY3Rpb24nOwogIC8vIHJhZGl1cyBmb3IgdGFwIGFuZCB0cmFjawogIGxldCBUQVBfRElTVEFOQ0UgPSAyNTsKICBsZXQgVFJBQ0tfRElTVEFOQ0UgPSA1OwogIC8vIG51bWJlciBvZiBsYXN0IE4gdHJhY2sgcG9zaXRpb25zIHRvIGtlZXAKICBsZXQgVFJBQ0tfTEVOR1RIID0gMjsKCiAgLy8gRGlzYWJsaW5nICJtb3VzZSIgaGFuZGxlcnMgZm9yIDI1MDBtcyBpcyBlbm91Z2gKICBsZXQgTU9VU0VfVElNRU9VVCA9IDI1MDA7CiAgbGV0IE1PVVNFX0VWRU5UUyA9IFsnbW91c2Vkb3duJywgJ21vdXNlbW92ZScsICdtb3VzZXVwJywgJ2NsaWNrJ107CiAgLy8gYW4gYXJyYXkgb2YgYml0bWFzayB2YWx1ZXMgZm9yIG1hcHBpbmcgTW91c2VFdmVudC53aGljaCB0byBNb3VzZUV2ZW50LmJ1dHRvbnMKICBsZXQgTU9VU0VfV0hJQ0hfVE9fQlVUVE9OUyA9IFswLCAxLCA0LCAyXTsKICBsZXQgTU9VU0VfSEFTX0JVVFRPTlMgPSAoZnVuY3Rpb24oKSB7CiAgICB0cnkgewogICAgICByZXR1cm4gbmV3IE1vdXNlRXZlbnQoJ3Rlc3QnLCB7YnV0dG9uczogMX0pLmJ1dHRvbnMgPT09IDE7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9KSgpOwoKICAvKioKICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBQb3NzaWJsZSBtb3VzZSBldmVudCBuYW1lCiAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBtb3VzZSBldmVudCwgZmFsc2UgaWYgbm90CiAgICovCiAgZnVuY3Rpb24gaXNNb3VzZUV2ZW50KG5hbWUpIHsKICAgIHJldHVybiBNT1VTRV9FVkVOVFMuaW5kZXhPZihuYW1lKSA+IC0xOwogIH0KCiAgLyogZXNsaW50IG5vLWVtcHR5OiBbImVycm9yIiwgeyAiYWxsb3dFbXB0eUNhdGNoIjogdHJ1ZSB9XSAqLwogIC8vIGNoZWNrIGZvciBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycwogIGxldCBTVVBQT1JUU19QQVNTSVZFID0gZmFsc2U7CiAgKGZ1bmN0aW9uKCkgewogICAgdHJ5IHsKICAgICAgbGV0IG9wdHMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywge2dldCgpIHtTVVBQT1JUU19QQVNTSVZFID0gdHJ1ZTt9fSk7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd0ZXN0JywgbnVsbCwgb3B0cyk7CiAgICB9IGNhdGNoKGUpIHt9CiAgfSkoKTsKCiAgLyoqCiAgICogR2VuZXJhdGUgc2V0dGluZ3MgZm9yIGV2ZW50IGxpc3RlbmVycywgZGVwZW5kYW50IG9uIGBQb2x5bWVyLnBhc3NpdmVUb3VjaEdlc3R1cmVzYAogICAqCiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBFdmVudCBuYW1lIHRvIGRldGVybWluZSBpZiBge3Bhc3NpdmV9YCBvcHRpb24gaXMgbmVlZGVkCiAgICogQHJldHVybiB7e3Bhc3NpdmU6IGJvb2xlYW59IHwgdW5kZWZpbmVkfSBPcHRpb25zIHRvIHVzZSBmb3IgYWRkRXZlbnRMaXN0ZW5lciBhbmQgcmVtb3ZlRXZlbnRMaXN0ZW5lcgogICAqLwogIGZ1bmN0aW9uIFBBU1NJVkVfVE9VQ0goZXZlbnROYW1lKSB7CiAgICBpZiAoaXNNb3VzZUV2ZW50KGV2ZW50TmFtZSkgfHwgZXZlbnROYW1lID09PSAndG91Y2hlbmQnKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGlmIChIQVNfTkFUSVZFX1RBICYmIFNVUFBPUlRTX1BBU1NJVkUgJiYgUG9seW1lci5wYXNzaXZlVG91Y2hHZXN0dXJlcykgewogICAgICByZXR1cm4ge3Bhc3NpdmU6IHRydWV9OwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuOwogICAgfQogIH0KCiAgLy8gQ2hlY2sgZm9yIHRvdWNoLW9ubHkgZGV2aWNlcwogIGxldCBJU19UT1VDSF9PTkxZID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpbb2FdZHxob25lKXxBbmRyb2lkLyk7CgogIGxldCBHZXN0dXJlUmVjb2duaXplciA9IGZ1bmN0aW9uKCl7fTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogIC8qKiBAdHlwZSB7ZnVuY3Rpb24oKTogdm9pZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUucmVzZXQ7CiAgLyoqIEB0eXBlIHtmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZH0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vkb3duOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2Vtb3ZlOwogIC8qKiBAdHlwZSB7KGZ1bmN0aW9uKE1vdXNlRXZlbnQpOiB2b2lkIHwgdW5kZWZpbmVkKX0gKi8KICBHZXN0dXJlUmVjb2duaXplci5wcm90b3R5cGUubW91c2V1cDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihUb3VjaEV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLnRvdWNoc3RhcnQ7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaG1vdmU7CiAgLyoqIEB0eXBlIHsoZnVuY3Rpb24oVG91Y2hFdmVudCk6IHZvaWQgfCB1bmRlZmluZWQpfSAqLwogIEdlc3R1cmVSZWNvZ25pemVyLnByb3RvdHlwZS50b3VjaGVuZDsKICAvKiogQHR5cGUgeyhmdW5jdGlvbihNb3VzZUV2ZW50KTogdm9pZCB8IHVuZGVmaW5lZCl9ICovCiAgR2VzdHVyZVJlY29nbml6ZXIucHJvdG90eXBlLmNsaWNrOwoKICAvLyBrZWVwIHRyYWNrIG9mIGFueSBsYWJlbHMgaGl0IGJ5IHRoZSBtb3VzZUNhbmNlbGxlcgogIC8qKiBAdHlwZSB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gKi8KICBjb25zdCBjbGlja2VkTGFiZWxzID0gW107CgogIC8qKiBAdHlwZSB7IU9iamVjdDxib29sZWFuPn0gKi8KICBjb25zdCBsYWJlbGxhYmxlID0gewogICAgJ2J1dHRvbic6IHRydWUsCiAgICAnaW5wdXQnOiB0cnVlLAogICAgJ2tleWdlbic6IHRydWUsCiAgICAnbWV0ZXInOiB0cnVlLAogICAgJ291dHB1dCc6IHRydWUsCiAgICAndGV4dGFyZWEnOiB0cnVlLAogICAgJ3Byb2dyZXNzJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlCiAgfTsKCiAgLy8gRGVmaW5lZCBhdCBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9mb3JtLWNvbnRyb2wtaW5mcmFzdHJ1Y3R1cmUuaHRtbCNlbmFibGluZy1hbmQtZGlzYWJsaW5nLWZvcm0tY29udHJvbHM6LXRoZS1kaXNhYmxlZC1hdHRyaWJ1dGUKICAvKiogQHR5cGUgeyFPYmplY3Q8Ym9vbGVhbj59ICovCiAgY29uc3QgY2FuQmVEaXNhYmxlZCA9IHsKICAgICdidXR0b24nOiB0cnVlLAogICAgJ2NvbW1hbmQnOiB0cnVlLAogICAgJ2ZpZWxkc2V0JzogdHJ1ZSwKICAgICdpbnB1dCc6IHRydWUsCiAgICAna2V5Z2VuJzogdHJ1ZSwKICAgICdvcHRncm91cCc6IHRydWUsCiAgICAnb3B0aW9uJzogdHJ1ZSwKICAgICdzZWxlY3QnOiB0cnVlLAogICAgJ3RleHRhcmVhJzogdHJ1ZQogIH07CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdG8gY2hlY2sgbGFiZWxsaW5nIHN0YXR1cwogICAqIEByZXR1cm4ge2Jvb2xlYW59IGVsZW1lbnQgY2FuIGhhdmUgbGFiZWxzCiAgICovCiAgZnVuY3Rpb24gY2FuQmVMYWJlbGxlZChlbCkgewogICAgcmV0dXJuIGxhYmVsbGFibGVbZWwubG9jYWxOYW1lXSB8fCBmYWxzZTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdGhhdCBtYXkgYmUgbGFiZWxsZWQuCiAgICogQHJldHVybiB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gUmVsZXZhbnQgbGFiZWwgZm9yIGBlbGAKICAgKi8KICBmdW5jdGlvbiBtYXRjaGluZ0xhYmVscyhlbCkgewogICAgbGV0IGxhYmVscyA9IEFycmF5LmZyb20oLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyhlbCkubGFiZWxzIHx8IFtdKTsKICAgIC8vIElFIGRvZXNuJ3QgaGF2ZSBgbGFiZWxzYCBhbmQgU2FmYXJpIGRvZXNuJ3QgcG9wdWxhdGUgYGxhYmVsc2AKICAgIC8vIGlmIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3dyb290LgogICAgLy8gSW4gdGhpcyBpbnN0YW5jZSwgZmluZGluZyB0aGUgbm9uLWFuY2VzdG9yIGxhYmVscyBpcyBlbm91Z2gsCiAgICAvLyBhcyB0aGUgbW91c2VDYW5jZWxsb3IgY29kZSB3aWxsIGhhbmRsZSBhbmNzdG9yIGxhYmVscwogICAgaWYgKCFsYWJlbHMubGVuZ3RoKSB7CiAgICAgIGxhYmVscyA9IFtdOwogICAgICBsZXQgcm9vdCA9IGVsLmdldFJvb3ROb2RlKCk7CiAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGlkIG9uIGBlbGAsIGNoZWNrIGZvciBhbGwgbGFiZWxzIHdpdGggYSBtYXRjaGluZyBgZm9yYCBhdHRyaWJ1dGUKICAgICAgaWYgKGVsLmlkKSB7CiAgICAgICAgbGV0IG1hdGNoaW5nID0gcm9vdC5xdWVyeVNlbGVjdG9yQWxsKGBsYWJlbFtmb3IgPSAke2VsLmlkfV1gKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsYWJlbHMucHVzaCgvKiogQHR5cGUgeyFIVE1MTGFiZWxFbGVtZW50fSAqLyhtYXRjaGluZ1tpXSkpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGxhYmVsczsKICB9CgogIC8vIHRvdWNoIHdpbGwgbWFrZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgLy8gYHByZXZlbnREZWZhdWx0YCBvbiB0b3VjaGVuZCB3aWxsIGNhbmNlbCB0aGVtLAogIC8vIGJ1dCB0aGlzIGJyZWFrcyBgPGlucHV0PmAgZm9jdXMgYW5kIGxpbmsgY2xpY2tzCiAgLy8gZGlzYWJsZSBtb3VzZSBoYW5kbGVycyBmb3IgTU9VU0VfVElNRU9VVCBtcyBhZnRlcgogIC8vIGEgdG91Y2hlbmQgdG8gaWdub3JlIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICBsZXQgbW91c2VDYW5jZWxsZXIgPSBmdW5jdGlvbihtb3VzZUV2ZW50KSB7CiAgICAvLyBDaGVjayBmb3Igc291cmNlQ2FwYWJpbGl0aWVzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIHN5bnRoZXRpYyBldmVudHMKICAgIC8vIGlmIG1vdXNlRXZlbnQgZGlkIG5vdCBjb21lIGZyb20gYSBkZXZpY2UgdGhhdCBmaXJlcyB0b3VjaCBldmVudHMsCiAgICAvLyBpdCB3YXMgbWFkZSBieSBhIHJlYWwgbW91c2UgYW5kIHNob3VsZCBiZSBjb3VudGVkCiAgICAvLyBodHRwOi8vd2ljZy5naXRodWIuaW8vSW5wdXREZXZpY2VDYXBhYmlsaXRpZXMvI2RvbS1pbnB1dGRldmljZWNhcGFiaWxpdGllcy1maXJlc3RvdWNoZXZlbnRzCiAgICBsZXQgc2MgPSBtb3VzZUV2ZW50LnNvdXJjZUNhcGFiaWxpdGllczsKICAgIGlmIChzYyAmJiAhc2MuZmlyZXNUb3VjaEV2ZW50cykgewogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBza2lwIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICAgIG1vdXNlRXZlbnRbSEFORExFRF9PQkpdID0ge3NraXA6IHRydWV9OwogICAgLy8gZGlzYWJsZSAiZ2hvc3QgY2xpY2tzIgogICAgaWYgKG1vdXNlRXZlbnQudHlwZSA9PT0gJ2NsaWNrJykgewogICAgICBsZXQgY2xpY2tGcm9tTGFiZWwgPSBmYWxzZTsKICAgICAgbGV0IHBhdGggPSBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCAmJiBtb3VzZUV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgICBpZiAocGF0aCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKHBhdGhbaV0ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIGlmIChwYXRoW2ldLmxvY2FsTmFtZSA9PT0gJ2xhYmVsJykgewogICAgICAgICAgICAgIGNsaWNrZWRMYWJlbHMucHVzaChwYXRoW2ldKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjYW5CZUxhYmVsbGVkKHBhdGhbaV0pKSB7CiAgICAgICAgICAgICAgbGV0IG93bmVyTGFiZWxzID0gbWF0Y2hpbmdMYWJlbHMocGF0aFtpXSk7CiAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9mIHRoZSBjbGlja2VkIGxhYmVscyBpcyBsYWJlbGxpbmcgdGhpcyBlbGVtZW50CiAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBvd25lckxhYmVscy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgY2xpY2tGcm9tTGFiZWwgPSBjbGlja0Zyb21MYWJlbCB8fCBjbGlja2VkTGFiZWxzLmluZGV4T2Yob3duZXJMYWJlbHNbal0pID4gLTE7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGF0aFtpXSA9PT0gUE9JTlRFUlNUQVRFLm1vdXNlLnRhcmdldCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIGlmIG9uZSBvZiB0aGUgY2xpY2tlZCBsYWJlbHMgd2FzIGxhYmVsbGluZyB0aGUgdGFyZ2V0IGVsZW1lbnQsCiAgICAgIC8vIHRoaXMgaXMgbm90IGEgZ2hvc3QgY2xpY2sKICAgICAgaWYgKGNsaWNrRnJvbUxhYmVsKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIG1vdXNlRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgbW91c2VFdmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgIH0KICB9OwoKICAvKioKICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzZXR1cCBUcnVlIHRvIGFkZCwgZmFsc2UgdG8gcmVtb3ZlLgogICAqIEByZXR1cm4ge3ZvaWR9CiAgICovCiAgZnVuY3Rpb24gc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHNldHVwKSB7CiAgICBsZXQgZXZlbnRzID0gSVNfVE9VQ0hfT05MWSA/IFsnY2xpY2snXSA6IE1PVVNFX0VWRU5UUzsKICAgIGZvciAobGV0IGkgPSAwLCBlbjsgaSA8IGV2ZW50cy5sZW5ndGg7IGkrKykgewogICAgICBlbiA9IGV2ZW50c1tpXTsKICAgICAgaWYgKHNldHVwKSB7CiAgICAgICAgLy8gcmVzZXQgY2xpY2tMYWJlbHMgYXJyYXkKICAgICAgICBjbGlja2VkTGFiZWxzLmxlbmd0aCA9IDA7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlbiwgbW91c2VDYW5jZWxsZXIsIHRydWUpOwogICAgICB9IGVsc2UgewogICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZW4sIG1vdXNlQ2FuY2VsbGVyLCB0cnVlKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaWdub3JlTW91c2UoZSkgewogICAgaWYgKCFQT0lOVEVSU1RBVEUubW91c2UubW91c2VJZ25vcmVKb2IpIHsKICAgICAgc2V0dXBUZWFyZG93bk1vdXNlQ2FuY2VsbGVyKHRydWUpOwogICAgfQogICAgbGV0IHVuc2V0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHNldHVwVGVhcmRvd25Nb3VzZUNhbmNlbGxlcigpOwogICAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gbnVsbDsKICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iID0gbnVsbDsKICAgIH07CiAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gZS5jb21wb3NlZFBhdGgoKVswXTsKICAgIFBPSU5URVJTVEFURS5tb3VzZS5tb3VzZUlnbm9yZUpvYiA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iCiAgICAgICAgLCBQb2x5bWVyLkFzeW5jLnRpbWVPdXQuYWZ0ZXIoTU9VU0VfVElNRU9VVCkKICAgICAgICAsIHVuc2V0KTsKICB9CgogIC8qKgogICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXYgZXZlbnQgdG8gdGVzdCBmb3IgbGVmdCBtb3VzZSBidXR0b24gZG93bgogICAqIEByZXR1cm4ge2Jvb2xlYW59IGhhcyBsZWZ0IG1vdXNlIGJ1dHRvbiBkb3duCiAgICovCiAgZnVuY3Rpb24gaGFzTGVmdE1vdXNlQnV0dG9uKGV2KSB7CiAgICBsZXQgdHlwZSA9IGV2LnR5cGU7CiAgICAvLyBleGl0IGVhcmx5IGlmIHRoZSBldmVudCBpcyBub3QgYSBtb3VzZSBldmVudAogICAgaWYgKCFpc01vdXNlRXZlbnQodHlwZSkpIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLy8gZXYuYnV0dG9uIGlzIG5vdCByZWxpYWJsZSBmb3IgbW91c2Vtb3ZlICgwIGlzIG92ZXJsb2FkZWQgYXMgYm90aCBsZWZ0IGJ1dHRvbiBhbmQgbm8gYnV0dG9ucykKICAgIC8vIGluc3RlYWQgd2UgdXNlIGV2LmJ1dHRvbnMgKGJpdG1hc2sgb2YgYnV0dG9ucykgb3IgZmFsbCBiYWNrIHRvIGV2LndoaWNoIChkZXByZWNhdGVkLCAwIGZvciBubyBidXR0b25zLCAxIGZvciBsZWZ0IGJ1dHRvbikKICAgIGlmICh0eXBlID09PSAnbW91c2Vtb3ZlJykgewogICAgICAvLyBhbGxvdyB1bmRlZmluZWQgZm9yIHRlc3RpbmcgZXZlbnRzCiAgICAgIGxldCBidXR0b25zID0gZXYuYnV0dG9ucyA9PT0gdW5kZWZpbmVkID8gMSA6IGV2LmJ1dHRvbnM7CiAgICAgIGlmICgoZXYgaW5zdGFuY2VvZiB3aW5kb3cuTW91c2VFdmVudCkgJiYgIU1PVVNFX0hBU19CVVRUT05TKSB7CiAgICAgICAgYnV0dG9ucyA9IE1PVVNFX1dISUNIX1RPX0JVVFRPTlNbZXYud2hpY2hdIHx8IDA7CiAgICAgIH0KICAgICAgLy8gYnV0dG9ucyBpcyBhIGJpdG1hc2ssIGNoZWNrIHRoYXQgdGhlIGxlZnQgYnV0dG9uIGJpdCBpcyBzZXQgKDEpCiAgICAgIHJldHVybiBCb29sZWFuKGJ1dHRvbnMgJiAxKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIGFsbG93IHVuZGVmaW5lZCBmb3IgdGVzdGluZyBldmVudHMKICAgICAgbGV0IGJ1dHRvbiA9IGV2LmJ1dHRvbiA9PT0gdW5kZWZpbmVkID8gMCA6IGV2LmJ1dHRvbjsKICAgICAgLy8gZXYuYnV0dG9uIGlzIDAgaW4gbW91c2Vkb3duL21vdXNldXAvY2xpY2sgZm9yIGxlZnQgYnV0dG9uIGFjdGl2YXRpb24KICAgICAgcmV0dXJuIGJ1dHRvbiA9PT0gMDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzU3ludGhldGljQ2xpY2soZXYpIHsKICAgIGlmIChldi50eXBlID09PSAnY2xpY2snKSB7CiAgICAgIC8vIGV2LmRldGFpbCBpcyAwIGZvciBIVE1MRWxlbWVudC5jbGljayBpbiBtb3N0IGJyb3dzZXJzCiAgICAgIGlmIChldi5kZXRhaWwgPT09IDApIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICAvLyBpbiB0aGUgd29yc3QgY2FzZSwgY2hlY2sgdGhhdCB0aGUgeC95IHBvc2l0aW9uIG9mIHRoZSBjbGljayBpcyB3aXRoaW4KICAgICAgLy8gdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudAogICAgICAvLyBUaGFua3MgSUUgMTAgPjooCiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChldik7CiAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudCBpcyBhbiBlbGVtZW50IHNvIHdlIGNhbiB1c2UgZ2V0Qm91bmRpbmdDbGllbnRSZWN0LAogICAgICAvLyBpZiBub3QsIGp1c3QgYXNzdW1lIGl0IGlzIGEgc3ludGhldGljIGNsaWNrCiAgICAgIGlmICghdC5ub2RlVHlwZSB8fCAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxldCBiY3IgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovKHQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAvLyB1c2UgcGFnZSB4L3kgdG8gYWNjb3VudCBmb3Igc2Nyb2xsaW5nCiAgICAgIGxldCB4ID0gZXYucGFnZVgsIHkgPSBldi5wYWdlWTsKICAgICAgLy8gZXYgaXMgYSBzeW50aGV0aWMgY2xpY2sgaWYgdGhlIHBvc2l0aW9uIGlzIG91dHNpZGUgdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0CiAgICAgIHJldHVybiAhKCh4ID49IGJjci5sZWZ0ICYmIHggPD0gYmNyLnJpZ2h0KSAmJiAoeSA+PSBiY3IudG9wICYmIHkgPD0gYmNyLmJvdHRvbSkpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgbGV0IFBPSU5URVJTVEFURSA9IHsKICAgIG1vdXNlOiB7CiAgICAgIHRhcmdldDogbnVsbCwKICAgICAgbW91c2VJZ25vcmVKb2I6IG51bGwKICAgIH0sCiAgICB0b3VjaDogewogICAgICB4OiAwLAogICAgICB5OiAwLAogICAgICBpZDogLTEsCiAgICAgIHNjcm9sbERlY2lkZWQ6IGZhbHNlCiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gZmlyc3RUb3VjaEFjdGlvbihldikgewogICAgbGV0IHRhID0gJ2F1dG8nOwogICAgbGV0IHBhdGggPSBldi5jb21wb3NlZFBhdGggJiYgZXYuY29tcG9zZWRQYXRoKCk7CiAgICBpZiAocGF0aCkgewogICAgICBmb3IgKGxldCBpID0gMCwgbjsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICBuID0gcGF0aFtpXTsKICAgICAgICBpZiAobltUT1VDSF9BQ1RJT05dKSB7CiAgICAgICAgICB0YSA9IG5bVE9VQ0hfQUNUSU9OXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHRhOwogIH0KCiAgZnVuY3Rpb24gdHJhY2tEb2N1bWVudChzdGF0ZU9iaiwgbW92ZWZuLCB1cGZuKSB7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBtb3ZlZm47CiAgICBzdGF0ZU9iai51cGZuID0gdXBmbjsKICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdmVmbik7CiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdXBmbik7CiAgfQoKICBmdW5jdGlvbiB1bnRyYWNrRG9jdW1lbnQoc3RhdGVPYmopIHsKICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN0YXRlT2JqLm1vdmVmbik7CiAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgc3RhdGVPYmoudXBmbik7CiAgICBzdGF0ZU9iai5tb3ZlZm4gPSBudWxsOwogICAgc3RhdGVPYmoudXBmbiA9IG51bGw7CiAgfQoKICAvLyB1c2UgYSBkb2N1bWVudC13aWRlIHRvdWNoZW5kIGxpc3RlbmVyIHRvIHN0YXJ0IHRoZSBnaG9zdC1jbGljayBwcmV2ZW50aW9uIG1lY2hhbmlzbQogIC8vIFVzZSBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycywgaWYgc3VwcG9ydGVkLCB0byBub3QgYWZmZWN0IHNjcm9sbGluZyBwZXJmb3JtYW5jZQogIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgaWdub3JlTW91c2UsIFNVUFBPUlRTX1BBU1NJVkUgPyB7cGFzc2l2ZTogdHJ1ZX0gOiBmYWxzZSk7CgogIC8qKgogICAqIE1vZHVsZSBmb3IgYWRkaW5nIGxpc3RlbmVycyB0byBhIG5vZGUgZm9yIHRoZSBmb2xsb3dpbmcgbm9ybWFsaXplZAogICAqIGNyb3NzLXBsYXRmb3JtICJnZXN0dXJlIiBldmVudHM6CiAgICogLSBgZG93bmAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IGRvd24KICAgKiAtIGB1cGAgLSBtb3VzZSBvciB0b3VjaCB3ZW50IHVwCiAgICogLSBgdGFwYCAtIG1vdXNlIGNsaWNrIG9yIGZpbmdlciB0YXAKICAgKiAtIGB0cmFja2AgLSBtb3VzZSBkcmFnIG9yIHRvdWNoIG1vdmUKICAgKgogICAqIEBuYW1lc3BhY2UKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IE1vZHVsZSBmb3IgYWRkaW5nIGNyb3NzLXBsYXRmb3JtIGdlc3R1cmUgZXZlbnQgbGlzdGVuZXJzLgogICAqLwogIGNvbnN0IEdlc3R1cmVzID0gewogICAgZ2VzdHVyZXM6IHt9LAogICAgcmVjb2duaXplcnM6IFtdLAoKICAgIC8qKgogICAgICogRmluZHMgdGhlIGVsZW1lbnQgcmVuZGVyZWQgb24gdGhlIHNjcmVlbiBhdCB0aGUgcHJvdmlkZWQgY29vcmRpbmF0ZXMuCiAgICAgKgogICAgICogU2ltaWxhciB0byBgZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludGAsIGJ1dCBwaWVyY2VzIHRocm91Z2gKICAgICAqIHNoYWRvdyByb290cy4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHtudW1iZXJ9IHggSG9yaXpvbnRhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcGFyYW0ge251bWJlcn0geSBWZXJ0aWNhbCBwaXhlbCBjb29yZGluYXRlCiAgICAgKiBAcmV0dXJuIHtFbGVtZW50fSBSZXR1cm5zIHRoZSBkZWVwZXN0IHNoYWRvd1Jvb3QgaW5jbHVzaXZlIGVsZW1lbnQKICAgICAqIGZvdW5kIGF0IHRoZSBzY3JlZW4gcG9zaXRpb24gZ2l2ZW4uCiAgICAgKi8KICAgIGRlZXBUYXJnZXRGaW5kOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGxldCBub2RlID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTsKICAgICAgbGV0IG5leHQgPSBub2RlOwogICAgICAvLyB0aGlzIGNvZGUgcGF0aCBpcyBvbmx5IHRha2VuIHdoZW4gbmF0aXZlIFNoYWRvd0RPTSBpcyB1c2VkCiAgICAgIC8vIGlmIHRoZXJlIGlzIGEgc2hhZG93cm9vdCwgaXQgbWF5IGhhdmUgYSBub2RlIGF0IHgveQogICAgICAvLyBpZiB0aGVyZSBpcyBub3QgYSBzaGFkb3dyb290LCBleGl0IHRoZSBsb29wCiAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQuc2hhZG93Um9vdCAmJiAhd2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBub2RlIGF0IHgveSBpbiB0aGUgc2hhZG93cm9vdCwgbG9vayBkZWVwZXIKICAgICAgICBsZXQgb2xkTmV4dCA9IG5leHQ7CiAgICAgICAgbmV4dCA9IG5leHQuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpOwogICAgICAgIC8vIG9uIFNhZmFyaSwgZWxlbWVudEZyb21Qb2ludCBtYXkgcmV0dXJuIHRoZSBzaGFkb3dSb290IGhvc3QKICAgICAgICBpZiAob2xkTmV4dCA9PT0gbmV4dCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICBub2RlID0gbmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9LAogICAgLyoqCiAgICAgKiBhIGNoZWFwZXIgY2hlY2sgdGhhbiBldi5jb21wb3NlZFBhdGgoKVswXTsKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHtFdmVudFRhcmdldH0gUmV0dXJucyB0aGUgZXZlbnQgdGFyZ2V0LgogICAgICovCiAgICBfZmluZE9yaWdpbmFsVGFyZ2V0OiBmdW5jdGlvbihldikgewogICAgICAvLyBzaGFkb3dkb20KICAgICAgaWYgKGV2LmNvbXBvc2VkUGF0aCkgewogICAgICAgIGNvbnN0IHRhcmdldHMgPSAvKiogQHR5cGUgeyFBcnJheTwhRXZlbnRUYXJnZXQ+fSAqLyhldi5jb21wb3NlZFBhdGgoKSk7CiAgICAgICAgLy8gSXQgc2hvdWxkbid0IGJlLCBidXQgc29tZXRpbWVzIHRhcmdldHMgaXMgZW1wdHkgKHdpbmRvdyBvbiBTYWZhcmkpLgogICAgICAgIHJldHVybiB0YXJnZXRzLmxlbmd0aCA+IDAgPyB0YXJnZXRzWzBdIDogZXYudGFyZ2V0OwogICAgICB9CiAgICAgIC8vIHNoYWR5ZG9tCiAgICAgIHJldHVybiBldi50YXJnZXQ7CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2IEV2ZW50LgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2hhbmRsZU5hdGl2ZTogZnVuY3Rpb24oZXYpIHsKICAgICAgbGV0IGhhbmRsZWQ7CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgbGV0IG5vZGUgPSBldi5jdXJyZW50VGFyZ2V0OwogICAgICBsZXQgZ29iaiA9IG5vZGVbR0VTVFVSRV9LRVldOwogICAgICBpZiAoIWdvYmopIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IGdzID0gZ29ialt0eXBlXTsKICAgICAgaWYgKCFncykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoIWV2W0hBTkRMRURfT0JKXSkgewogICAgICAgIGV2W0hBTkRMRURfT0JKXSA9IHt9OwogICAgICAgIGlmICh0eXBlLnNsaWNlKDAsIDUpID09PSAndG91Y2gnKSB7CiAgICAgICAgICBldiA9IC8qKiBAdHlwZSB7VG91Y2hFdmVudH0gKi8oZXYpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICBsZXQgdCA9IGV2LmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgICAgICAvLyBvbmx5IGhhbmRsZSB0aGUgZmlyc3QgZmluZ2VyCiAgICAgICAgICAgIGlmIChldi50b3VjaGVzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5pZCA9IHQuaWRlbnRpZmllcjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKFBPSU5URVJTVEFURS50b3VjaC5pZCAhPT0gdC5pZGVudGlmaWVyKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghSEFTX05BVElWRV9UQSkgewogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3RvdWNoc3RhcnQnIHx8IHR5cGUgPT09ICd0b3VjaG1vdmUnKSB7CiAgICAgICAgICAgICAgR2VzdHVyZXMuX2hhbmRsZVRvdWNoQWN0aW9uKGV2KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBoYW5kbGVkID0gZXZbSEFORExFRF9PQkpdOwogICAgICAvLyB1c2VkIHRvIGlnbm9yZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgICAgIGlmIChoYW5kbGVkLnNraXApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy8gcmVzZXQgcmVjb2duaXplciBzdGF0ZQogICAgICBmb3IgKGxldCBpID0gMCwgcjsgaSA8IEdlc3R1cmVzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IEdlc3R1cmVzLnJlY29nbml6ZXJzW2ldOwogICAgICAgIGlmIChnc1tyLm5hbWVdICYmICFoYW5kbGVkW3IubmFtZV0pIHsKICAgICAgICAgIGlmIChyLmZsb3cgJiYgci5mbG93LnN0YXJ0LmluZGV4T2YoZXYudHlwZSkgPiAtMSAmJiByLnJlc2V0KSB7CiAgICAgICAgICAgIHIucmVzZXQoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gZW5mb3JjZSBnZXN0dXJlIHJlY29nbml6ZXIgb3JkZXIKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCBHZXN0dXJlcy5yZWNvZ25pemVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHIgPSBHZXN0dXJlcy5yZWNvZ25pemVyc1tpXTsKICAgICAgICBpZiAoZ3Nbci5uYW1lXSAmJiAhaGFuZGxlZFtyLm5hbWVdKSB7CiAgICAgICAgICBoYW5kbGVkW3IubmFtZV0gPSB0cnVlOwogICAgICAgICAgclt0eXBlXShldik7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfaGFuZGxlVG91Y2hBY3Rpb246IGZ1bmN0aW9uKGV2KSB7CiAgICAgIGxldCB0ID0gZXYuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC54ID0gdC5jbGllbnRYOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC55ID0gdC5jbGllbnRZOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5zY3JvbGxEZWNpZGVkID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RvdWNobW92ZScpIHsKICAgICAgICBpZiAoUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQgPSB0cnVlOwogICAgICAgIGxldCB0YSA9IGZpcnN0VG91Y2hBY3Rpb24oZXYpOwogICAgICAgIGxldCBwcmV2ZW50ID0gZmFsc2U7CiAgICAgICAgbGV0IGR4ID0gTWF0aC5hYnMoUE9JTlRFUlNUQVRFLnRvdWNoLnggLSB0LmNsaWVudFgpOwogICAgICAgIGxldCBkeSA9IE1hdGguYWJzKFBPSU5URVJTVEFURS50b3VjaC55IC0gdC5jbGllbnRZKTsKICAgICAgICBpZiAoIWV2LmNhbmNlbGFibGUpIHsKICAgICAgICAgIC8vIHNjcm9sbGluZyBpcyBoYXBwZW5pbmcKICAgICAgICB9IGVsc2UgaWYgKHRhID09PSAnbm9uZScpIHsKICAgICAgICAgIHByZXZlbnQgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teCcpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeSA+IGR4OwogICAgICAgIH0gZWxzZSBpZiAodGEgPT09ICdwYW4teScpIHsKICAgICAgICAgIHByZXZlbnQgPSBkeCA+IGR5OwogICAgICAgIH0KICAgICAgICBpZiAocHJldmVudCkgewogICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndHJhY2snKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIGEgbm9kZSBmb3IgdGhlIGdpdmVuIGdlc3R1cmUgdHlwZS4KICAgICAqCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5HZXN0dXJlcwogICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiB0byBjYWxsCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyBhZGRlZC4KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgYWRkTGlzdGVuZXI6IGZ1bmN0aW9uKG5vZGUsIGV2VHlwZSwgaGFuZGxlcikgewogICAgICBpZiAodGhpcy5nZXN0dXJlc1tldlR5cGVdKSB7CiAgICAgICAgdGhpcy5fYWRkKG5vZGUsIGV2VHlwZSwgaGFuZGxlcik7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhIG5vZGUgZm9yIHRoZSBnaXZlbiBnZXN0dXJlIHR5cGUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byByZW1vdmUgbGlzdGVuZXIgZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBHZXN0dXJlIHR5cGU6IGBkb3duYCwgYHVwYCwgYHRyYWNrYCwgb3IgYHRhcGAKICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBFdmVudCBsaXN0ZW5lciBmdW5jdGlvbiBwcmV2aW91c2x5IHBhc3NlZCB0bwogICAgICogIGBhZGRMaXN0ZW5lcmAuCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBnZXN0dXJlIGV2ZW50IGxpc3RlbmVyIHdhcyByZW1vdmVkLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICByZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGlmICh0aGlzLmdlc3R1cmVzW2V2VHlwZV0pIHsKICAgICAgICB0aGlzLl9yZW1vdmUobm9kZSwgZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgdGhlIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIG5hdGl2ZSBldmVudHMKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG5vZGUgTm9kZSBvbiB3aGljaCB0byBhZGQgdGhlIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IGV2VHlwZSBFdmVudCB0eXBlIHRvIGFkZC4KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KX0gaGFuZGxlciBFdmVudCBoYW5kbGVyIGZ1bmN0aW9uLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEB0aGlzIHtHZXN0dXJlc30KICAgICAqLwogICAgX2FkZDogZnVuY3Rpb24obm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGxldCByZWNvZ25pemVyID0gdGhpcy5nZXN0dXJlc1tldlR5cGVdOwogICAgICBsZXQgZGVwcyA9IHJlY29nbml6ZXIuZGVwczsKICAgICAgbGV0IG5hbWUgPSByZWNvZ25pemVyLm5hbWU7CiAgICAgIGxldCBnb2JqID0gbm9kZVtHRVNUVVJFX0tFWV07CiAgICAgIGlmICghZ29iaikgewogICAgICAgIG5vZGVbR0VTVFVSRV9LRVldID0gZ29iaiA9IHt9OwogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwLCBkZXAsIGdkOyBpIDwgZGVwcy5sZW5ndGg7IGkrKykgewogICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgLy8gZG9uJ3QgYWRkIG1vdXNlIGhhbmRsZXJzIG9uIGlPUyBiZWNhdXNlIHRoZXkgY2F1c2UgZ3JheSBzZWxlY3Rpb24gb3ZlcmxheXMKICAgICAgICBpZiAoSVNfVE9VQ0hfT05MWSAmJiBpc01vdXNlRXZlbnQoZGVwKSAmJiBkZXAgIT09ICdjbGljaycpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICBpZiAoIWdkKSB7CiAgICAgICAgICBnb2JqW2RlcF0gPSBnZCA9IHtfY291bnQ6IDB9OwogICAgICAgIH0KICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZGVwLCB0aGlzLl9oYW5kbGVOYXRpdmUsIFBBU1NJVkVfVE9VQ0goZGVwKSk7CiAgICAgICAgfQogICAgICAgIGdkW25hbWVdID0gKGdkW25hbWVdIHx8IDApICsgMTsKICAgICAgICBnZC5fY291bnQgPSAoZ2QuX2NvdW50IHx8IDApICsgMTsKICAgICAgfQogICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgaWYgKHJlY29nbml6ZXIudG91Y2hBY3Rpb24pIHsKICAgICAgICB0aGlzLnNldFRvdWNoQWN0aW9uKG5vZGUsIHJlY29nbml6ZXIudG91Y2hBY3Rpb24pOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogYXV0b21hdGUgZXZlbnQgbGlzdGVuZXIgcmVtb3ZhbCBmb3IgbmF0aXZlIGV2ZW50cwogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gbm9kZSBOb2RlIG9uIHdoaWNoIHRvIHJlbW92ZSB0aGUgZXZlbnQuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZUeXBlIEV2ZW50IHR5cGUgdG8gcmVtb3ZlLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihFdmVudD8pfSBoYW5kbGVyIEV2ZW50IGhhbmRsZXIgZnVuY3Rpb24uCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfcmVtb3ZlOiBmdW5jdGlvbihub2RlLCBldlR5cGUsIGhhbmRsZXIpIHsKICAgICAgbGV0IHJlY29nbml6ZXIgPSB0aGlzLmdlc3R1cmVzW2V2VHlwZV07CiAgICAgIGxldCBkZXBzID0gcmVjb2duaXplci5kZXBzOwogICAgICBsZXQgbmFtZSA9IHJlY29nbml6ZXIubmFtZTsKICAgICAgbGV0IGdvYmogPSBub2RlW0dFU1RVUkVfS0VZXTsKICAgICAgaWYgKGdvYmopIHsKICAgICAgICBmb3IgKGxldCBpID0gMCwgZGVwLCBnZDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGRlcCA9IGRlcHNbaV07CiAgICAgICAgICBnZCA9IGdvYmpbZGVwXTsKICAgICAgICAgIGlmIChnZCAmJiBnZFtuYW1lXSkgewogICAgICAgICAgICBnZFtuYW1lXSA9IChnZFtuYW1lXSB8fCAxKSAtIDE7CiAgICAgICAgICAgIGdkLl9jb3VudCA9IChnZC5fY291bnQgfHwgMSkgLSAxOwogICAgICAgICAgICBpZiAoZ2QuX2NvdW50ID09PSAwKSB7CiAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGRlcCwgdGhpcy5faGFuZGxlTmF0aXZlLCBQQVNTSVZFX1RPVUNIKGRlcCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldlR5cGUsIGhhbmRsZXIpOwogICAgfSwKCiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIG5ldyBnZXN0dXJlIGV2ZW50IHJlY29nbml6ZXIgZm9yIGFkZGluZyBuZXcgY3VzdG9tCiAgICAgKiBnZXN0dXJlIGV2ZW50IHR5cGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLkdlc3R1cmVzCiAgICAgKiBAcGFyYW0geyFHZXN0dXJlUmVjb2duaXplcn0gcmVjb2cgR2VzdHVyZSByZWNvZ25pemVyIGRlc2NyaXB0b3IKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHJlZ2lzdGVyOiBmdW5jdGlvbihyZWNvZykgewogICAgICB0aGlzLnJlY29nbml6ZXJzLnB1c2gocmVjb2cpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29nLmVtaXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdGhpcy5nZXN0dXJlc1tyZWNvZy5lbWl0c1tpXV0gPSByZWNvZzsKICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZOYW1lIEV2ZW50IG5hbWUuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdlc3R1cmUgZm9yIHRoZSBnaXZlbiBldmVudCBuYW1lLgogICAgICogQHRoaXMge0dlc3R1cmVzfQogICAgICovCiAgICBfZmluZFJlY29nbml6ZXJCeUV2ZW50OiBmdW5jdGlvbihldk5hbWUpIHsKICAgICAgZm9yIChsZXQgaSA9IDAsIHI7IGkgPCB0aGlzLnJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IHRoaXMucmVjb2duaXplcnNbaV07CiAgICAgICAgZm9yIChsZXQgaiA9IDAsIG47IGogPCByLmVtaXRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBuID0gci5lbWl0c1tqXTsKICAgICAgICAgIGlmIChuID09PSBldk5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfSwKCiAgICAvKioKICAgICAqIFNldHMgc2Nyb2xsaW5nIGRpcmVjdGlvbiBvbiBub2RlLgogICAgICoKICAgICAqIFRoaXMgdmFsdWUgaXMgY2hlY2tlZCBvbiBmaXJzdCBtb3ZlLCB0aHVzIGl0IHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8KICAgICAqIGFkZGluZyBldmVudCBsaXN0ZW5lcnMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7IUVsZW1lbnR9IG5vZGUgTm9kZSB0byBzZXQgdG91Y2ggYWN0aW9uIHNldHRpbmcgb24KICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUb3VjaCBhY3Rpb24gdmFsdWUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHNldFRvdWNoQWN0aW9uOiBmdW5jdGlvbihub2RlLCB2YWx1ZSkgewogICAgICBpZiAoSEFTX05BVElWRV9UQSkgewogICAgICAgIC8vIE5PVEU6IGFkZCB0b3VjaEFjdGlvbiBhc3luYyBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYWRkZWQgaW4KICAgICAgICAvLyBjdXN0b20gZWxlbWVudCBjb25zdHJ1Y3RvcnMuIE90aGVyd2lzZSB3ZSBydW4gYWZvdWwgb2YgY3VzdG9tCiAgICAgICAgLy8gZWxlbWVudHMgcmVzdHJpY3Rpb24gYWdhaW5zdCBzZXR0aW5ncyBhdHRyaWJ1dGVzIChzdHlsZSkgaW4gdGhlCiAgICAgICAgLy8gY29uc3RydWN0b3IuCiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgIG5vZGUuc3R5bGUudG91Y2hBY3Rpb24gPSB2YWx1ZTsKICAgICAgICB9KTsKICAgICAgfQogICAgICBub2RlW1RPVUNIX0FDVElPTl0gPSB2YWx1ZTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IG9uIHRoZSBgdGFyZ2V0YCBlbGVtZW50IG9mIGB0eXBlYCB3aXRoIHRoZSBnaXZlbgogICAgICogYGRldGFpbGAuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshRXZlbnRUYXJnZXR9IHRhcmdldCBUaGUgZWxlbWVudCBvbiB3aGljaCB0byBmaXJlIGFuIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgZXZlbnQgdG8gZmlyZS4KICAgICAqIEBwYXJhbSB7IU9iamVjdD19IGRldGFpbCBUaGUgZGV0YWlsIG9iamVjdCB0byBwb3B1bGF0ZSBvbiB0aGUgZXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odGFyZ2V0LCB0eXBlLCBkZXRhaWwpIHsKICAgICAgbGV0IGV2ID0gbmV3IEV2ZW50KHR5cGUsIHsgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUgfSk7CiAgICAgIGV2LmRldGFpbCA9IGRldGFpbDsKICAgICAgdGFyZ2V0LmRpc3BhdGNoRXZlbnQoZXYpOwogICAgICAvLyBmb3J3YXJkIGBwcmV2ZW50RGVmYXVsdGAgaW4gYSBjbGVhbiB3YXkKICAgICAgaWYgKGV2LmRlZmF1bHRQcmV2ZW50ZWQpIHsKICAgICAgICBsZXQgcHJldmVudGVyID0gZGV0YWlsLnByZXZlbnRlciB8fCBkZXRhaWwuc291cmNlRXZlbnQ7CiAgICAgICAgaWYgKHByZXZlbnRlciAmJiBwcmV2ZW50ZXIucHJldmVudERlZmF1bHQpIHsKICAgICAgICAgIHByZXZlbnRlci5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICAvKioKICAgICAqIFByZXZlbnRzIHRoZSBkaXNwYXRjaCBhbmQgZGVmYXVsdCBhY3Rpb24gb2YgdGhlIGdpdmVuIGV2ZW50IG5hbWUuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldk5hbWUgRXZlbnQgbmFtZS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAdGhpcyB7R2VzdHVyZXN9CiAgICAgKi8KICAgIHByZXZlbnQ6IGZ1bmN0aW9uKGV2TmFtZSkgewogICAgICBsZXQgcmVjb2duaXplciA9IHRoaXMuX2ZpbmRSZWNvZ25pemVyQnlFdmVudChldk5hbWUpOwogICAgICBpZiAocmVjb2duaXplci5pbmZvKSB7CiAgICAgICAgcmVjb2duaXplci5pbmZvLnByZXZlbnQgPSB0cnVlOwogICAgICB9CiAgICB9LAoKICAgIC8qKgogICAgICogUmVzZXQgdGhlIDI1MDBtcyB0aW1lb3V0IG9uIHByb2Nlc3NpbmcgbW91c2UgaW5wdXQgYWZ0ZXIgZGV0ZWN0aW5nIHRvdWNoIGlucHV0LgogICAgICoKICAgICAqIFRvdWNoIGlucHV0cyBjcmVhdGUgc3ludGhlc2l6ZWQgbW91c2UgaW5wdXRzIGFueXdoZXJlIGZyb20gMCB0byAyMDAwbXMgYWZ0ZXIgdGhlIHRvdWNoLgogICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGR1cmluZyB0ZXN0aW5nIHdpdGggc2ltdWxhdGVkIHRvdWNoIGlucHV0cy4KICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaW4gcHJvZHVjdGlvbiBtYXkgY2F1c2UgZHVwbGljYXRlIHRhcHMgb3Igb3RoZXIgR2VzdHVyZXMuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuR2VzdHVyZXMKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0TW91c2VDYW5jZWxsZXI6IGZ1bmN0aW9uKCkgewogICAgICBpZiAoUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iKSB7CiAgICAgICAgUE9JTlRFUlNUQVRFLm1vdXNlLm1vdXNlSWdub3JlSm9iLmZsdXNoKCk7CiAgICAgIH0KICAgIH0KICB9OwoKICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAnZG93bnVwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ21vdXNldXAnLCAndG91Y2hlbmQnXQogICAgfSwKICAgIGVtaXRzOiBbJ2Rvd24nLCAndXAnXSwKCiAgICBpbmZvOiB7CiAgICAgIG1vdmVmbjogbnVsbCwKICAgICAgdXBmbjogbnVsbAogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdW50cmFja0RvY3VtZW50KHRoaXMuaW5mbyk7CiAgICB9LAoKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBtb3VzZWRvd246IGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgc2VsZiA9IHRoaXM7CiAgICAgIGxldCBtb3ZlZm4gPSBmdW5jdGlvbiBtb3ZlZm4oZSkgewogICAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgICBzZWxmLl9maXJlKCd1cCcsIHQsIGUpOwogICAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgIHNlbGYuX2ZpcmUoJ3VwJywgdCwgZSk7CiAgICAgICAgfQogICAgICAgIHVudHJhY2tEb2N1bWVudChzZWxmLmluZm8pOwogICAgICB9OwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5fZmlyZSgnZG93bicsIHQsIGUpOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuX2ZpcmUoJ2Rvd24nLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hlbmQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgdGhpcy5fZmlyZSgndXAnLCBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlCiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudAogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJldmVudGVyCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBfZmlyZTogZnVuY3Rpb24odHlwZSwgdGFyZ2V0LCBldmVudCwgcHJldmVudGVyKSB7CiAgICAgIEdlc3R1cmVzLl9maXJlKHRhcmdldCwgdHlwZSwgewogICAgICAgIHg6IGV2ZW50LmNsaWVudFgsCiAgICAgICAgeTogZXZlbnQuY2xpZW50WSwKICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsCiAgICAgICAgcHJldmVudGVyOiBwcmV2ZW50ZXIsCiAgICAgICAgcHJldmVudDogZnVuY3Rpb24oZSkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLnByZXZlbnQoZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KICB9KTsKCiAgR2VzdHVyZXMucmVnaXN0ZXIoewogICAgbmFtZTogJ3RyYWNrJywKICAgIHRvdWNoQWN0aW9uOiAnbm9uZScsCiAgICBkZXBzOiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0JywgJ3RvdWNobW92ZScsICd0b3VjaGVuZCddLAogICAgZmxvdzogewogICAgICBzdGFydDogWydtb3VzZWRvd24nLCAndG91Y2hzdGFydCddLAogICAgICBlbmQ6IFsnbW91c2V1cCcsICd0b3VjaGVuZCddCiAgICB9LAogICAgZW1pdHM6IFsndHJhY2snXSwKCiAgICBpbmZvOiB7CiAgICAgIHg6IDAsCiAgICAgIHk6IDAsCiAgICAgIHN0YXRlOiAnc3RhcnQnLAogICAgICBzdGFydGVkOiBmYWxzZSwKICAgICAgbW92ZXM6IFtdLAogICAgICAvKiogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfSAqLwogICAgICBhZGRNb3ZlOiBmdW5jdGlvbihtb3ZlKSB7CiAgICAgICAgaWYgKHRoaXMubW92ZXMubGVuZ3RoID4gVFJBQ0tfTEVOR1RIKSB7CiAgICAgICAgICB0aGlzLm1vdmVzLnNoaWZ0KCk7CiAgICAgICAgfQogICAgICAgIHRoaXMubW92ZXMucHVzaChtb3ZlKTsKICAgICAgfSwKICAgICAgbW92ZWZuOiBudWxsLAogICAgICB1cGZuOiBudWxsLAogICAgICBwcmV2ZW50OiBmYWxzZQogICAgfSwKCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5pbmZvLnN0YXRlID0gJ3N0YXJ0JzsKICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSBmYWxzZTsKICAgICAgdGhpcy5pbmZvLm1vdmVzID0gW107CiAgICAgIHRoaXMuaW5mby54ID0gMDsKICAgICAgdGhpcy5pbmZvLnkgPSAwOwogICAgICB0aGlzLmluZm8ucHJldmVudCA9IGZhbHNlOwogICAgICB1bnRyYWNrRG9jdW1lbnQodGhpcy5pbmZvKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge251bWJlcn0geAogICAgICogQHBhcmFtIHtudW1iZXJ9IHkKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKi8KICAgIGhhc01vdmVkRW5vdWdoOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgIGlmICh0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAodGhpcy5pbmZvLnN0YXJ0ZWQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgZHggPSBNYXRoLmFicyh0aGlzLmluZm8ueCAtIHgpOwogICAgICBsZXQgZHkgPSBNYXRoLmFicyh0aGlzLmluZm8ueSAtIHkpOwogICAgICByZXR1cm4gKGR4ID49IFRSQUNLX0RJU1RBTkNFIHx8IGR5ID49IFRSQUNLX0RJU1RBTkNFKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbW91c2Vkb3duOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IHNlbGYgPSB0aGlzOwogICAgICBsZXQgbW92ZWZuID0gZnVuY3Rpb24gbW92ZWZuKGUpIHsKICAgICAgICBsZXQgeCA9IGUuY2xpZW50WCwgeSA9IGUuY2xpZW50WTsKICAgICAgICBpZiAoc2VsZi5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgICAgLy8gZmlyc3QgbW92ZSBpcyAnc3RhcnQnLCBzdWJzZXF1ZW50IG1vdmVzIGFyZSAnbW92ZScsIG1vdXNldXAgaXMgJ2VuZCcKICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9IHNlbGYuaW5mby5zdGFydGVkID8gKGUudHlwZSA9PT0gJ21vdXNldXAnID8gJ2VuZCcgOiAndHJhY2snKSA6ICdzdGFydCc7CiAgICAgICAgICBpZiAoc2VsZi5pbmZvLnN0YXRlID09PSAnc3RhcnQnKSB7CiAgICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgICAgR2VzdHVyZXMucHJldmVudCgndGFwJyk7CiAgICAgICAgICB9CiAgICAgICAgICBzZWxmLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgICAgLy8gYWx3YXlzIF9maXJlICJlbmQiCiAgICAgICAgICAgIHNlbGYuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgICAgICB1bnRyYWNrRG9jdW1lbnQoc2VsZi5pbmZvKTsKICAgICAgICAgIH0KICAgICAgICAgIHNlbGYuX2ZpcmUodCwgZSk7CiAgICAgICAgICBzZWxmLmluZm8uc3RhcnRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9OwogICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgIGlmIChzZWxmLmluZm8uc3RhcnRlZCkgewogICAgICAgICAgbW92ZWZuKGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gcmVtb3ZlIHRoZSB0ZW1wb3JhcnkgbGlzdGVuZXJzCiAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgIH07CiAgICAgIC8vIGFkZCB0ZW1wb3JhcnkgZG9jdW1lbnQgbGlzdGVuZXJzIGFzIG1vdXNlIHJldGFyZ2V0cwogICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgdGhpcy5pbmZvLnggPSBlLmNsaWVudFg7CiAgICAgIHRoaXMuaW5mby55ID0gZS5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCBjdCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIHRoaXMuaW5mby54ID0gY3QuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBjdC5jbGllbnRZOwogICAgfSwKICAgIC8qKgogICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB0b3VjaG1vdmU6IGZ1bmN0aW9uKGUpIHsKICAgICAgbGV0IHQgPSBHZXN0dXJlcy5fZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICBsZXQgY3QgPSBlLmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICBsZXQgeCA9IGN0LmNsaWVudFgsIHkgPSBjdC5jbGllbnRZOwogICAgICBpZiAodGhpcy5oYXNNb3ZlZEVub3VnaCh4LCB5KSkgewogICAgICAgIGlmICh0aGlzLmluZm8uc3RhdGUgPT09ICdzdGFydCcpIHsKICAgICAgICAgIC8vIGlmIGFuZCBvbmx5IGlmIHRyYWNraW5nLCBhbHdheXMgcHJldmVudCB0YXAKICAgICAgICAgIEdlc3R1cmVzLnByZXZlbnQoJ3RhcCcpOwogICAgICAgIH0KICAgICAgICB0aGlzLmluZm8uYWRkTW92ZSh7eDogeCwgeTogeX0pOwogICAgICAgIHRoaXMuX2ZpcmUodCwgY3QpOwogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICd0cmFjayc7CiAgICAgICAgdGhpcy5pbmZvLnN0YXJ0ZWQgPSB0cnVlOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIGxldCB0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgbGV0IGN0ID0gZS5jaGFuZ2VkVG91Y2hlc1swXTsKICAgICAgLy8gb25seSB0cmFja2VuZCBpZiB0cmFjayB3YXMgc3RhcnRlZCBhbmQgbm90IGFib3J0ZWQKICAgICAgaWYgKHRoaXMuaW5mby5zdGFydGVkKSB7CiAgICAgICAgLy8gcmVzZXQgc3RhcnRlZCBzdGF0ZSBvbiB1cAogICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgIHRoaXMuaW5mby5hZGRNb3ZlKHt4OiBjdC5jbGllbnRYLCB5OiBjdC5jbGllbnRZfSk7CiAgICAgICAgdGhpcy5fZmlyZSh0LCBjdCwgZSk7CiAgICAgIH0KICAgIH0sCgogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gdGFyZ2V0CiAgICAgKiBAcGFyYW0ge1RvdWNofSB0b3VjaAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgX2ZpcmU6IGZ1bmN0aW9uKHRhcmdldCwgdG91Y2gpIHsKICAgICAgbGV0IHNlY29uZGxhc3QgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDJdOwogICAgICBsZXQgbGFzdG1vdmUgPSB0aGlzLmluZm8ubW92ZXNbdGhpcy5pbmZvLm1vdmVzLmxlbmd0aCAtIDFdOwogICAgICBsZXQgZHggPSBsYXN0bW92ZS54IC0gdGhpcy5pbmZvLng7CiAgICAgIGxldCBkeSA9IGxhc3Rtb3ZlLnkgLSB0aGlzLmluZm8ueTsKICAgICAgbGV0IGRkeCwgZGR5ID0gMDsKICAgICAgaWYgKHNlY29uZGxhc3QpIHsKICAgICAgICBkZHggPSBsYXN0bW92ZS54IC0gc2Vjb25kbGFzdC54OwogICAgICAgIGRkeSA9IGxhc3Rtb3ZlLnkgLSBzZWNvbmRsYXN0Lnk7CiAgICAgIH0KICAgICAgR2VzdHVyZXMuX2ZpcmUodGFyZ2V0LCAndHJhY2snLCB7CiAgICAgICAgc3RhdGU6IHRoaXMuaW5mby5zdGF0ZSwKICAgICAgICB4OiB0b3VjaC5jbGllbnRYLAogICAgICAgIHk6IHRvdWNoLmNsaWVudFksCiAgICAgICAgZHg6IGR4LAogICAgICAgIGR5OiBkeSwKICAgICAgICBkZHg6IGRkeCwKICAgICAgICBkZHk6IGRkeSwKICAgICAgICBzb3VyY2VFdmVudDogdG91Y2gsCiAgICAgICAgaG92ZXI6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIEdlc3R1cmVzLmRlZXBUYXJnZXRGaW5kKHRvdWNoLmNsaWVudFgsIHRvdWNoLmNsaWVudFkpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogIH0pOwoKICBHZXN0dXJlcy5yZWdpc3Rlcih7CiAgICBuYW1lOiAndGFwJywKICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ2NsaWNrJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgIGZsb3c6IHsKICAgICAgc3RhcnQ6IFsnbW91c2Vkb3duJywgJ3RvdWNoc3RhcnQnXSwKICAgICAgZW5kOiBbJ2NsaWNrJywgJ3RvdWNoZW5kJ10KICAgIH0sCiAgICBlbWl0czogWyd0YXAnXSwKICAgIGluZm86IHsKICAgICAgeDogTmFOLAogICAgICB5OiBOYU4sCiAgICAgIHByZXZlbnQ6IGZhbHNlCiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuaW5mby54ID0gTmFOOwogICAgICB0aGlzLmluZm8ueSA9IE5hTjsKICAgICAgdGhpcy5pbmZvLnByZXZlbnQgPSBmYWxzZTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgc2F2ZTogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLmluZm8ueCA9IGUuY2xpZW50WDsKICAgICAgdGhpcy5pbmZvLnkgPSBlLmNsaWVudFk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIG1vdXNlZG93bjogZnVuY3Rpb24oZSkgewogICAgICBpZiAoaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgdGhpcy5zYXZlKGUpOwogICAgICB9CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge01vdXNlRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNsaWNrOiBmdW5jdGlvbihlKSB7CiAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICB0aGlzLmZvcndhcmQoZSk7CiAgICAgIH0KICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgdG91Y2hzdGFydDogZnVuY3Rpb24oZSkgewogICAgICB0aGlzLnNhdmUoZS5jaGFuZ2VkVG91Y2hlc1swXSwgZSk7CiAgICB9LAogICAgLyoqCiAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgIHRoaXMuZm9yd2FyZChlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgIH0sCiAgICAvKioKICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAqIEBwYXJhbSB7RXZlbnQgfCBUb3VjaH0gZQogICAgICogQHBhcmFtIHtFdmVudD19IHByZXZlbnRlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZm9yd2FyZDogZnVuY3Rpb24oZSwgcHJldmVudGVyKSB7CiAgICAgIGxldCBkeCA9IE1hdGguYWJzKGUuY2xpZW50WCAtIHRoaXMuaW5mby54KTsKICAgICAgbGV0IGR5ID0gTWF0aC5hYnMoZS5jbGllbnRZIC0gdGhpcy5pbmZvLnkpOwogICAgICAvLyBmaW5kIG9yaWdpbmFsIHRhcmdldCBmcm9tIGBwcmV2ZW50ZXJgIGZvciBUb3VjaEV2ZW50cywgb3IgYGVgIGZvciBNb3VzZUV2ZW50cwogICAgICBsZXQgdCA9IEdlc3R1cmVzLl9maW5kT3JpZ2luYWxUYXJnZXQoLyoqIEB0eXBlIHtFdmVudH0gKi8ocHJldmVudGVyIHx8IGUpKTsKICAgICAgaWYgKCF0IHx8IChjYW5CZURpc2FibGVkWy8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0KS5sb2NhbE5hbWVdICYmIHQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBkeCxkeSBjYW4gYmUgTmFOIGlmIGBjbGlja2AgaGFzIGJlZW4gc2ltdWxhdGVkIGFuZCB0aGVyZSB3YXMgbm8gYGRvd25gIGZvciBgc3RhcnRgCiAgICAgIGlmIChpc05hTihkeCkgfHwgaXNOYU4oZHkpIHx8IChkeCA8PSBUQVBfRElTVEFOQ0UgJiYgZHkgPD0gVEFQX0RJU1RBTkNFKSB8fCBpc1N5bnRoZXRpY0NsaWNrKGUpKSB7CiAgICAgICAgLy8gcHJldmVudCB0YXBzIGZyb20gYmVpbmcgZ2VuZXJhdGVkIGlmIGFuIGV2ZW50IGhhcyBjYW5jZWxlZCB0aGVtCiAgICAgICAgaWYgKCF0aGlzLmluZm8ucHJldmVudCkgewogICAgICAgICAgR2VzdHVyZXMuX2ZpcmUodCwgJ3RhcCcsIHsKICAgICAgICAgICAgeDogZS5jbGllbnRYLAogICAgICAgICAgICB5OiBlLmNsaWVudFksCiAgICAgICAgICAgIHNvdXJjZUV2ZW50OiBlLAogICAgICAgICAgICBwcmV2ZW50ZXI6IHByZXZlbnRlcgogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSk7CgogIC8qIGVzbGludC1lbmFibGUgdmFsaWQtanNkb2MgKi8KCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuZmluZE9yaWdpbmFsVGFyZ2V0ID0gR2VzdHVyZXMuX2ZpbmRPcmlnaW5hbFRhcmdldDsKCiAgLyoqIEBkZXByZWNhdGVkICovCiAgR2VzdHVyZXMuYWRkID0gR2VzdHVyZXMuYWRkTGlzdGVuZXI7CgogIC8qKiBAZGVwcmVjYXRlZCAqLwogIEdlc3R1cmVzLnJlbW92ZSA9IEdlc3R1cmVzLnJlbW92ZUxpc3RlbmVyOwoKICBQb2x5bWVyLkdlc3R1cmVzID0gR2VzdHVyZXM7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBAY29uc3Qge1BvbHltZXIuR2VzdHVyZXN9CiAgICovCiAgY29uc3QgZ2VzdHVyZXMgPSBQb2x5bWVyLkdlc3R1cmVzOwoKICAvKioKICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgQVBJIGZvciBhZGRpbmcgUG9seW1lcidzIGNyb3NzLXBsYXRmb3JtCiAgICogZ2VzdHVyZSBldmVudHMgdG8gbm9kZXMuCiAgICoKICAgKiBUaGUgQVBJIGlzIGRlc2lnbmVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCBvdmVycmlkZSBwb2ludHMgaW1wbGVtZW50ZWQKICAgKiBpbiBgUG9seW1lci5UZW1wbGF0ZVN0YW1wYCBzdWNoIHRoYXQgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzIGluCiAgICogdGVtcGxhdGVzIHdpbGwgc3VwcG9ydCBnZXN0dXJlIGV2ZW50cyB3aGVuIHRoaXMgbWl4aW4gaXMgYXBwbGllZCBhbG9uZyB3aXRoCiAgICogYFBvbHltZXIuVGVtcGxhdGVTdGFtcGAuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgQVBJIGZvciBhZGRpbmcgUG9seW1lcidzIGNyb3NzLXBsYXRmb3JtCiAgICogZ2VzdHVyZSBldmVudHMgdG8gbm9kZXMKICAgKi8KICBQb2x5bWVyLkdlc3R1cmVFdmVudExpc3RlbmVycyA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfR2VzdHVyZUV2ZW50TGlzdGVuZXJzfQogICAgICovCiAgICBjbGFzcyBHZXN0dXJlRXZlbnRMaXN0ZW5lcnMgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIC8qKgogICAgICAgKiBBZGQgdGhlIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBub2RlIGlmIGl0IGlzIGEgZ2VzdHVyZXMgZXZlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBhZGQgZXZlbnQgbGlzdGVuZXIgdG8KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIGFkZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKCFnZXN0dXJlcy5hZGRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICBzdXBlci5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlbW92ZSB0aGUgZXZlbnQgbGlzdGVuZXIgdG8gdGhlIG5vZGUgaWYgaXQgaXMgYSBnZXN0dXJlcyBldmVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lciBmcm9tCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byByZW1vdmUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgaWYgKCFnZXN0dXJlcy5yZW1vdmVMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICBzdXBlci5fcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgfQogICAgICB9CgogICAgfQoKICAgIHJldHVybiBHZXN0dXJlRXZlbnRMaXN0ZW5lcnM7CgogIH0pOwoKfSkoKTsKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICBjb25zdCBIT1NUX0RJUiA9IC86aG9zdFwoOmRpclwoKGx0cnxydGwpXClcKS9nOwogICAgY29uc3QgSE9TVF9ESVJfUkVQTEFDTUVOVCA9ICc6aG9zdChbZGlyPSIkMSJdKSc7CgogICAgY29uc3QgRUxfRElSID0gLyhbXHNcdy0jXC5cW1xdXCpdKik6ZGlyXCgobHRyfHJ0bClcKS9nOwogICAgY29uc3QgRUxfRElSX1JFUExBQ01FTlQgPSAnOmhvc3QoW2Rpcj0iJDIiXSkgJDEnOwoKICAgIGNvbnN0IERJUl9DSEVDSyA9IC86ZGlyXCgoPzpsdHJ8cnRsKVwpLzsKICAgIAogICAgY29uc3QgU0hJTV9TSEFET1cgPSBCb29sZWFuKHdpbmRvd1snU2hhZHlET00nXSAmJiB3aW5kb3dbJ1NoYWR5RE9NJ11bJ2luVXNlJ10pOwoKICAgIC8qKgogICAgICogQHR5cGUgeyFBcnJheTwhUG9seW1lcl9EaXJNaXhpbj59CiAgICAgKi8KICAgIGNvbnN0IERJUl9JTlNUQU5DRVMgPSBbXTsKCiAgICAvKiogQHR5cGUge011dGF0aW9uT2JzZXJ2ZXJ9ICovCiAgICBsZXQgb2JzZXJ2ZXIgPSBudWxsOwoKICAgIGxldCBET0NVTUVOVF9ESVIgPSAnJzsKCiAgICBmdW5jdGlvbiBnZXRSVEwoKSB7CiAgICAgIERPQ1VNRU5UX0RJUiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lcl9EaXJNaXhpbn0gaW5zdGFuY2UgSW5zdGFuY2UgdG8gc2V0IFJUTCBzdGF0dXMgb24KICAgICAqLwogICAgZnVuY3Rpb24gc2V0UlRMKGluc3RhbmNlKSB7CiAgICAgIGlmICghaW5zdGFuY2UuX19hdXRvRGlyT3B0T3V0KSB7CiAgICAgICAgY29uc3QgZWwgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oaW5zdGFuY2UpOwogICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGlyJywgRE9DVU1FTlRfRElSKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZURpcmVjdGlvbigpIHsKICAgICAgZ2V0UlRMKCk7CiAgICAgIERPQ1VNRU5UX0RJUiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERJUl9JTlNUQU5DRVMubGVuZ3RoOyBpKyspIHsKICAgICAgICBzZXRSVEwoRElSX0lOU1RBTkNFU1tpXSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0YWtlUmVjb3JkcygpIHsKICAgICAgaWYgKG9ic2VydmVyICYmIG9ic2VydmVyLnRha2VSZWNvcmRzKCkubGVuZ3RoKSB7CiAgICAgICAgdXBkYXRlRGlyZWN0aW9uKCk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBhbGxvd3MgZWxlbWVudHMgdG8gdXNlIHRoZSBgOmRpcmAgQ1NTIFNlbGVjdG9yIHRvIGhhdmUKICAgICAqIHRleHQgZGlyZWN0aW9uIHNwZWNpZmljIHN0eWxpbmcuCiAgICAgKgogICAgICogV2l0aCB0aGlzIG1peGluLCBhbnkgc3R5bGVzaGVldCBwcm92aWRlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCB0cmFuc2Zvcm0gYDpkaXJgIGludG8KICAgICAqIGA6aG9zdChbZGlyXSlgIGFuZCBzeW5jIGRpcmVjdGlvbiB3aXRoIHRoZSBwYWdlIHZpYSB0aGUgZWxlbWVudCdzIGBkaXJgIGF0dHJpYnV0ZS4KICAgICAqCiAgICAgKiBFbGVtZW50cyBjYW4gb3B0IG91dCBvZiB0aGUgZ2xvYmFsIHBhZ2UgdGV4dCBkaXJlY3Rpb24gYnkgc2V0dGluZyB0aGUgYGRpcmAgYXR0cmlidXRlCiAgICAgKiBkaXJlY3RseSBpbiBgcmVhZHkoKWAgb3IgaW4gSFRNTC4KICAgICAqCiAgICAgKiBDYXZlYXRzOgogICAgICogLSBBcHBsaWNhdGlvbnMgbXVzdCBzZXQgYDxodG1sIGRpcj0ibHRyIj5gIG9yIGA8aHRtbCBkaXI9InJ0bCI+YCB0byBzeW5jIGRpcmVjdGlvbgogICAgICogLSBBdXRvbWF0aWMgbGVmdC10by1yaWdodCBvciByaWdodC10by1sZWZ0IHN0eWxpbmcgaXMgc3luYydkIHdpdGggdGhlIGA8aHRtbD5gIGVsZW1lbnQgb25seS4KICAgICAqIC0gQ2hhbmdpbmcgYGRpcmAgYXQgcnVudGltZSBpcyBzdXBwb3J0ZWQuCiAgICAgKiAtIE9wdGluZyBvdXQgb2YgdGhlIGdsb2JhbCBkaXJlY3Rpb24gc3R5bGluZyBpcyBwZXJtYW5lbnQKICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29ycwogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqLwogICAgUG9seW1lci5EaXJNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgICAgaWYgKCFTSElNX1NIQURPVykgewogICAgICAgIGlmICghb2JzZXJ2ZXIpIHsKICAgICAgICAgIGdldFJUTCgpOwogICAgICAgICAgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcih1cGRhdGVEaXJlY3Rpb24pOwogICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsIHthdHRyaWJ1dGVzOiB0cnVlLCBhdHRyaWJ1dGVGaWx0ZXI6IFsnZGlyJ119KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQGV4dGVuZHMge2Jhc2V9CiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgY29uc3QgZWxlbWVudEJhc2UgPSBQb2x5bWVyLlByb3BlcnR5QWNjZXNzb3JzKGJhc2UpOwoKICAgICAgLyoqCiAgICAgICAqIEBwb2x5bWVyCiAgICAgICAqIEBtaXhpbkNsYXNzCiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0Rpck1peGlufQogICAgICAgKi8KICAgICAgY2xhc3MgRGlyIGV4dGVuZHMgZWxlbWVudEJhc2UgewoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX3Byb2Nlc3NTdHlsZVRleHQoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICAgICAgY3NzVGV4dCA9IHN1cGVyLl9wcm9jZXNzU3R5bGVUZXh0KGNzc1RleHQsIGJhc2VVUkkpOwogICAgICAgICAgaWYgKCFTSElNX1NIQURPVyAmJiBESVJfQ0hFQ0sudGVzdChjc3NUZXh0KSkgewogICAgICAgICAgICBjc3NUZXh0ID0gdGhpcy5fcmVwbGFjZURpckluQ3NzVGV4dChjc3NUZXh0KTsKICAgICAgICAgICAgdGhpcy5fX2FjdGl2YXRlRGlyID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjc3NUZXh0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZSBgOmRpcmAgaW4gdGhlIGdpdmVuIENTUyB0ZXh0CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBDU1MgdGV4dCB0byByZXBsYWNlIERJUgogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTW9kaWZpZWQgQ1NTCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIF9yZXBsYWNlRGlySW5Dc3NUZXh0KHRleHQpIHsKICAgICAgICAgIGxldCByZXBsYWNlZFRleHQgPSB0ZXh0OwogICAgICAgICAgcmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2UoSE9TVF9ESVIsIEhPU1RfRElSX1JFUExBQ01FTlQpOwogICAgICAgICAgcmVwbGFjZWRUZXh0ID0gcmVwbGFjZWRUZXh0LnJlcGxhY2UoRUxfRElSLCBFTF9ESVJfUkVQTEFDTUVOVCk7CiAgICAgICAgICByZXR1cm4gcmVwbGFjZWRUZXh0OwogICAgICAgIH0KCiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgICAgdGhpcy5fX2F1dG9EaXJPcHRPdXQgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0IGB0aGlzYCBpcyBhbiBIVE1MRWxlbWVudAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICAgICAgdGhpcy5fX2F1dG9EaXJPcHRPdXQgPSAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykuaGFzQXR0cmlidXRlKCdkaXInKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICB0YWtlUmVjb3JkcygpOwogICAgICAgICAgICBESVJfSU5TVEFOQ0VTLnB1c2godGhpcyk7CiAgICAgICAgICAgIHNldFJUTCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5kaXNjb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICBjb25zdCBpZHggPSBESVJfSU5TVEFOQ0VTLmluZGV4T2YodGhpcyk7CiAgICAgICAgICAgIGlmIChpZHggPiAtMSkgewogICAgICAgICAgICAgIERJUl9JTlNUQU5DRVMuc3BsaWNlKGlkeCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIERpci5fX2FjdGl2YXRlRGlyID0gZmFsc2U7CgogICAgICByZXR1cm4gRGlyOwogICAgfSk7CiAgfSkoKTsKCgoKKGZ1bmN0aW9uKCkgewoKICAndXNlIHN0cmljdCc7CgogIC8vIHJ1biBhIGNhbGxiYWNrIHdoZW4gSFRNTEltcG9ydHMgYXJlIHJlYWR5IG9yIGltbWVkaWF0ZWx5IGlmCiAgLy8gdGhpcyBhcGkgaXMgbm90IGF2YWlsYWJsZS4KICBmdW5jdGlvbiB3aGVuSW1wb3J0c1JlYWR5KGNiKSB7CiAgICBpZiAod2luZG93LkhUTUxJbXBvcnRzKSB7CiAgICAgIEhUTUxJbXBvcnRzLndoZW5SZWFkeShjYik7CiAgICB9IGVsc2UgewogICAgICBjYigpOwogICAgfQogIH0KCiAgLyoqCiAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBpbXBvcnRpbmcgYW4gSFRNTCBkb2N1bWVudCBpbXBlcmF0aXZlbHkuCiAgICoKICAgKiBUaGlzIG1ldGhvZCBjcmVhdGVzIGEgbmV3IGA8bGluayByZWw9ImltcG9ydCI+YCBlbGVtZW50IHdpdGgKICAgKiB0aGUgcHJvdmlkZWQgVVJMIGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBkb2N1bWVudCB0byBzdGFydCBsb2FkaW5nLgogICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgKiBlbGVtZW50IHdpbGwgY29udGFpbiB0aGUgaW1wb3J0ZWQgZG9jdW1lbnQgY29udGVudHMuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7c3RyaW5nfSBocmVmIFVSTCB0byBkb2N1bWVudCB0byBsb2FkLgogICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFdmVudCk6dm9pZD19IG9ubG9hZCBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQgc3VjY2Vzc2Z1bGx5CiAgICogICBsb2FkZWQuCiAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUVycm9yRXZlbnQpOnZvaWQ9fSBvbmVycm9yIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydAogICAqICAgdW5zdWNjZXNzZnVsbHkgbG9hZGVkLgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICogICBEZWZhdWx0cyB0byBgZmFsc2VgLgogICAqIEByZXR1cm4geyFIVE1MTGlua0VsZW1lbnR9IFRoZSBsaW5rIGVsZW1lbnQgZm9yIHRoZSBVUkwgdG8gYmUgbG9hZGVkLgogICAqLwogIFBvbHltZXIuaW1wb3J0SHJlZiA9IGZ1bmN0aW9uKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsKICAgIGxldCBsaW5rID0gLyoqIEB0eXBlIHtIVE1MTGlua0VsZW1lbnR9ICovCiAgICAgIChkb2N1bWVudC5oZWFkLnF1ZXJ5U2VsZWN0b3IoJ2xpbmtbaHJlZj0iJyArIGhyZWYgKyAnIl1baW1wb3J0LWhyZWZdJykpOwogICAgaWYgKCFsaW5rKSB7CiAgICAgIGxpbmsgPSAvKiogQHR5cGUge0hUTUxMaW5rRWxlbWVudH0gKi8gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKSk7CiAgICAgIGxpbmsucmVsID0gJ2ltcG9ydCc7CiAgICAgIGxpbmsuaHJlZiA9IGhyZWY7CiAgICAgIGxpbmsuc2V0QXR0cmlidXRlKCdpbXBvcnQtaHJlZicsICcnKTsKICAgIH0KICAgIC8vIGFsd2F5cyBlbnN1cmUgbGluayBoYXMgYGFzeW5jYCBhdHRyaWJ1dGUgaWYgdXNlciBzcGVjaWZpZWQgb25lLAogICAgLy8gZXZlbiBpZiBpdCB3YXMgcHJldmlvdXNseSBub3QgYXN5bmMuIFRoaXMgaXMgY29uc2lkZXJlZCBsZXNzIGNvbmZ1c2luZy4KICAgIGlmIChvcHRBc3luYykgewogICAgICBsaW5rLnNldEF0dHJpYnV0ZSgnYXN5bmMnLCAnJyk7CiAgICB9CiAgICAvLyBOT1RFOiB0aGUgbGluayBtYXkgbm93IGJlIGluIDMgc3RhdGVzOiAoMSkgcGVuZGluZyBpbnNlcnRpb24sCiAgICAvLyAoMikgaW5mbGlnaHQsICgzKSBhbHJlYWR5IGxvYWRlZC4gSW4gZWFjaCBjYXNlLCB3ZSBuZWVkIHRvIGFkZAogICAgLy8gZXZlbnQgbGlzdGVuZXJzIHRvIHByb2Nlc3MgY2FsbGJhY2tzLgogICAgbGV0IGNsZWFudXAgPSBmdW5jdGlvbigpIHsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgbG9hZExpc3RlbmVyKTsKICAgICAgbGluay5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgfTsKICAgIGxldCBsb2FkTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYSBzdWNjZXNzZnVsIGxvYWQsIGNhY2hlIHRoZSBsb2FkIGV2ZW50IG9uIHRoZSBsaW5rIHNvCiAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gc2hvcnQtY2lyY3VpdCB0aGlzIG1ldGhvZCBpbiB0aGUgZnV0dXJlIHdoZW4KICAgICAgLy8gaXQgaXMgY2FsbGVkIHdpdGggdGhlIHNhbWUgaHJlZiBwYXJhbS4KICAgICAgbGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQgPSB0cnVlOwogICAgICBpZiAob25sb2FkKSB7CiAgICAgICAgd2hlbkltcG9ydHNSZWFkeSgoKSA9PiB7CiAgICAgICAgICBvbmxvYWQoZXZlbnQpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9OwogICAgbGV0IGVycm9yTGlzdGVuZXIgPSBmdW5jdGlvbihldmVudCkgewogICAgICBjbGVhbnVwKCk7CiAgICAgIC8vIEluIGNhc2Ugb2YgYW4gZXJyb3IsIHJlbW92ZSB0aGUgbGluayBmcm9tIHRoZSBkb2N1bWVudCBzbyB0aGF0IGl0CiAgICAgIC8vIHdpbGwgYmUgYXV0b21hdGljYWxseSBjcmVhdGVkIGFnYWluIHRoZSBuZXh0IHRpbWUgYGltcG9ydEhyZWZgIGlzCiAgICAgIC8vIGNhbGxlZC4KICAgICAgaWYgKGxpbmsucGFyZW50Tm9kZSkgewogICAgICAgIGxpbmsucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsaW5rKTsKICAgICAgfQogICAgICBpZiAob25lcnJvcikgewogICAgICAgIHdoZW5JbXBvcnRzUmVhZHkoKCkgPT4gewogICAgICAgICAgb25lcnJvcihldmVudCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CiAgICBsaW5rLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBsb2FkTGlzdGVuZXIpOwogICAgbGluay5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGVycm9yTGlzdGVuZXIpOwogICAgaWYgKGxpbmsucGFyZW50Tm9kZSA9PSBudWxsKSB7CiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobGluayk7CiAgICAvLyBpZiB0aGUgbGluayBhbHJlYWR5IGxvYWRlZCwgZGlzcGF0Y2ggYSBmYWtlIGxvYWQgZXZlbnQKICAgIC8vIHNvIHRoYXQgbGlzdGVuZXJzIGFyZSBjYWxsZWQgYW5kIGdldCBhIHByb3BlciBldmVudCBhcmd1bWVudC4KICAgIH0gZWxzZSBpZiAobGluay5fX2R5bmFtaWNJbXBvcnRMb2FkZWQpIHsKICAgICAgbGluay5kaXNwYXRjaEV2ZW50KG5ldyBFdmVudCgnbG9hZCcpKTsKICAgIH0KICAgIHJldHVybiBsaW5rOwogIH07Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgc2NoZWR1bGVkID0gZmFsc2U7CiAgbGV0IGJlZm9yZVJlbmRlclF1ZXVlID0gW107CiAgbGV0IGFmdGVyUmVuZGVyUXVldWUgPSBbXTsKCiAgZnVuY3Rpb24gc2NoZWR1bGUoKSB7CiAgICBzY2hlZHVsZWQgPSB0cnVlOwogICAgLy8gYmVmb3JlIG5leHQgcmVuZGVyCiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7CiAgICAgIHNjaGVkdWxlZCA9IGZhbHNlOwogICAgICBmbHVzaFF1ZXVlKGJlZm9yZVJlbmRlclF1ZXVlKTsKICAgICAgLy8gYWZ0ZXIgdGhlIHJlbmRlcgogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHJ1blF1ZXVlKGFmdGVyUmVuZGVyUXVldWUpOwogICAgICB9KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gZmx1c2hRdWV1ZShxdWV1ZSkgewogICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkgewogICAgICBjYWxsTWV0aG9kKHF1ZXVlLnNoaWZ0KCkpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcnVuUXVldWUocXVldWUpIHsKICAgIGZvciAobGV0IGk9MCwgbD1xdWV1ZS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgY2FsbE1ldGhvZChxdWV1ZS5zaGlmdCgpKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNhbGxNZXRob2QoaW5mbykgewogICAgY29uc3QgY29udGV4dCA9IGluZm9bMF07CiAgICBjb25zdCBjYWxsYmFjayA9IGluZm9bMV07CiAgICBjb25zdCBhcmdzID0gaW5mb1syXTsKICAgIHRyeSB7CiAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpOwogICAgfSBjYXRjaChlKSB7CiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIHRocm93IGU7CiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZmx1c2goKSB7CiAgICB3aGlsZSAoYmVmb3JlUmVuZGVyUXVldWUubGVuZ3RoIHx8IGFmdGVyUmVuZGVyUXVldWUubGVuZ3RoKSB7CiAgICAgIGZsdXNoUXVldWUoYmVmb3JlUmVuZGVyUXVldWUpOwogICAgICBmbHVzaFF1ZXVlKGFmdGVyUmVuZGVyUXVldWUpOwogICAgfQogICAgc2NoZWR1bGVkID0gZmFsc2U7CiAgfQoKICAvKioKICAgKiBNb2R1bGUgZm9yIHNjaGVkdWxpbmcgZmx1c2hhYmxlIHByZS1yZW5kZXIgYW5kIHBvc3QtcmVuZGVyIHRhc2tzLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgTW9kdWxlIGZvciBzY2hlZHVsaW5nIGZsdXNoYWJsZSBwcmUtcmVuZGVyIGFuZCBwb3N0LXJlbmRlciB0YXNrcy4KICAgKi8KICBQb2x5bWVyLlJlbmRlclN0YXR1cyA9IHsKCiAgICAvKioKICAgICAqIEVucXVldWVzIGEgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBydW4gYmVmb3JlIHRoZSBuZXh0IHJlbmRlciwgYXQKICAgICAqIGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgIHRpbWluZy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIGVucXVldWluZyB3b3JrIHRoYXQgcmVxdWlyZXMgRE9NIG1lYXN1cmVtZW50LAogICAgICogc2luY2UgbWVhc3VyZW1lbnQgbWF5IG5vdCBiZSByZWxpYWJsZSBpbiBjdXN0b20gZWxlbWVudCBjYWxsYmFja3MgYmVmb3JlCiAgICAgKiB0aGUgZmlyc3QgcmVuZGVyLCBhcyB3ZWxsIGFzIGZvciBiYXRjaGluZyBtZWFzdXJlbWVudCB0YXNrcyBpbiBnZW5lcmFsLgogICAgICoKICAgICAqIFRhc2tzIGluIHRoaXMgcXVldWUgbWF5IGJlIGZsdXNoZWQgYnkgY2FsbGluZyBgUG9seW1lci5SZW5kZXJTdGF0dXMuZmx1c2goKWAuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVuZGVyU3RhdHVzCiAgICAgKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBvYmplY3QgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgYm91bmQgdG8KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oLi4uKik6dm9pZH0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7IUFycmF5PX0gYXJncyBBbiBhcnJheSBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgYmVmb3JlTmV4dFJlbmRlcjogZnVuY3Rpb24oY29udGV4dCwgY2FsbGJhY2ssIGFyZ3MpIHsKICAgICAgaWYgKCFzY2hlZHVsZWQpIHsKICAgICAgICBzY2hlZHVsZSgpOwogICAgICB9CiAgICAgIGJlZm9yZVJlbmRlclF1ZXVlLnB1c2goW2NvbnRleHQsIGNhbGxiYWNrLCBhcmdzXSk7CiAgICB9LAoKICAgIC8qKgogICAgICogRW5xdWV1ZXMgYSBjYWxsYmFjayB3aGljaCB3aWxsIGJlIHJ1biBhZnRlciB0aGUgbmV4dCByZW5kZXIsIGVxdWl2YWxlbnQKICAgICAqIHRvIG9uZSB0YXNrIChgc2V0VGltZW91dGApIGFmdGVyIHRoZSBuZXh0IGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgdHVuaW5nIHRoZSBmaXJzdC1yZW5kZXIgcGVyZm9ybWFuY2Ugb2YgYW4KICAgICAqIGVsZW1lbnQgb3IgYXBwbGljYXRpb24gYnkgZGVmZXJyaW5nIG5vbi1jcml0aWNhbCB3b3JrIHVudGlsIGFmdGVyIHRoZQogICAgICogZmlyc3QgcGFpbnQuICBUeXBpY2FsIG5vbi1yZW5kZXItY3JpdGljYWwgd29yayBtYXkgaW5jbHVkZSBhZGRpbmcgVUkKICAgICAqIGV2ZW50IGxpc3RlbmVycyBhbmQgYXJpYSBhdHRyaWJ1dGVzLgogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlJlbmRlclN0YXR1cwogICAgICogQHBhcmFtIHsqfSBjb250ZXh0IENvbnRleHQgb2JqZWN0IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGJvdW5kIHRvCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKC4uLiopOnZvaWR9IGNhbGxiYWNrIENhbGxiYWNrIGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0geyFBcnJheT19IGFyZ3MgQW4gYXJyYXkgb2YgYXJndW1lbnRzIHRvIGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGgKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGFmdGVyTmV4dFJlbmRlcjogZnVuY3Rpb24oY29udGV4dCwgY2FsbGJhY2ssIGFyZ3MpIHsKICAgICAgaWYgKCFzY2hlZHVsZWQpIHsKICAgICAgICBzY2hlZHVsZSgpOwogICAgICB9CiAgICAgIGFmdGVyUmVuZGVyUXVldWUucHVzaChbY29udGV4dCwgY2FsbGJhY2ssIGFyZ3NdKTsKICAgIH0sCgogICAgLyoqCiAgICAgKiBGbHVzaGVzIGFsbCBgYmVmb3JlTmV4dFJlbmRlcmAgdGFza3MsIGZvbGxvd2VkIGJ5IGFsbCBgYWZ0ZXJOZXh0UmVuZGVyYAogICAgICogdGFza3MuCiAgICAgKgogICAgICogQG1lbWJlcm9mIFBvbHltZXIuUmVuZGVyU3RhdHVzCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBmbHVzaDogZmx1c2gKCiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLy8gdW5yZXNvbHZlZAoKICBmdW5jdGlvbiByZXNvbHZlKCkgewogICAgZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoJ3VucmVzb2x2ZWQnKTsKICB9CgogIGlmICh3aW5kb3cuV2ViQ29tcG9uZW50cykgewogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ1dlYkNvbXBvbmVudHNSZWFkeScsIHJlc29sdmUpOwogIH0gZWxzZSB7CiAgICBpZiAoZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJyB8fCBkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnY29tcGxldGUnKSB7CiAgICAgIHJlc29sdmUoKTsKICAgIH0gZWxzZSB7CiAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgcmVzb2x2ZSk7CiAgICB9CiAgfQoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CgogICd1c2Ugc3RyaWN0JzsKCiAgZnVuY3Rpb24gbmV3U3BsaWNlKGluZGV4LCByZW1vdmVkLCBhZGRlZENvdW50KSB7CiAgICByZXR1cm4gewogICAgICBpbmRleDogaW5kZXgsCiAgICAgIHJlbW92ZWQ6IHJlbW92ZWQsCiAgICAgIGFkZGVkQ291bnQ6IGFkZGVkQ291bnQKICAgIH07CiAgfQoKICBjb25zdCBFRElUX0xFQVZFID0gMDsKICBjb25zdCBFRElUX1VQREFURSA9IDE7CiAgY29uc3QgRURJVF9BREQgPSAyOwogIGNvbnN0IEVESVRfREVMRVRFID0gMzsKCiAgLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBpcyAqYmFzZWQqIG9uIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgTGV2ZW5zaHRlaW4KICAvLyAiZWRpdCIgZGlzdGFuY2UuIFRoZSBvbmUgY2hhbmdlIGlzIHRoYXQgInVwZGF0ZXMiIGFyZSB0cmVhdGVkIGFzIHR3bwogIC8vIGVkaXRzIC0gbm90IG9uZS4gV2l0aCBBcnJheSBzcGxpY2VzLCBhbiB1cGRhdGUgaXMgcmVhbGx5IGEgZGVsZXRlCiAgLy8gZm9sbG93ZWQgYnkgYW4gYWRkLiBCeSByZXRhaW5pbmcgdGhpcywgd2Ugb3B0aW1pemUgZm9yICJrZWVwaW5nIiB0aGUKICAvLyBtYXhpbXVtIGFycmF5IGl0ZW1zIGluIHRoZSBvcmlnaW5hbCBhcnJheS4gRm9yIGV4YW1wbGU6CiAgLy8KICAvLyAgICd4eHh4MTIzJyAtPiAnMTIzeXl5eScKICAvLwogIC8vIFdpdGggMS1lZGl0IHVwZGF0ZXMsIHRoZSBzaG9ydGVzdCBwYXRoIHdvdWxkIGJlIGp1c3QgdG8gdXBkYXRlIGFsbCBzZXZlbgogIC8vIGNoYXJhY3RlcnMuIFdpdGggMi1lZGl0IHVwZGF0ZXMsIHdlIGRlbGV0ZSA0LCBsZWF2ZSAzLCBhbmQgYWRkIDQuIFRoaXMKICAvLyBsZWF2ZXMgdGhlIHN1YnN0cmluZyAnMTIzJyBpbnRhY3QuCiAgZnVuY3Rpb24gY2FsY0VkaXREaXN0YW5jZXMoY3VycmVudCwgY3VycmVudFN0YXJ0LCBjdXJyZW50RW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpIHsKICAgIC8vICJEZWxldGlvbiIgY29sdW1ucwogICAgbGV0IHJvd0NvdW50ID0gb2xkRW5kIC0gb2xkU3RhcnQgKyAxOwogICAgbGV0IGNvbHVtbkNvdW50ID0gY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCArIDE7CiAgICBsZXQgZGlzdGFuY2VzID0gbmV3IEFycmF5KHJvd0NvdW50KTsKCiAgICAvLyAiQWRkaXRpb24iIHJvd3MuIEluaXRpYWxpemUgbnVsbCBjb2x1bW4uCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd0NvdW50OyBpKyspIHsKICAgICAgZGlzdGFuY2VzW2ldID0gbmV3IEFycmF5KGNvbHVtbkNvdW50KTsKICAgICAgZGlzdGFuY2VzW2ldWzBdID0gaTsKICAgIH0KCiAgICAvLyBJbml0aWFsaXplIG51bGwgcm93CiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbkNvdW50OyBqKyspCiAgICAgIGRpc3RhbmNlc1swXVtqXSA9IGo7CgogICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3dDb3VudDsgaSsrKSB7CiAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewogICAgICAgIGlmIChlcXVhbHMoY3VycmVudFtjdXJyZW50U3RhcnQgKyBqIC0gMV0sIG9sZFtvbGRTdGFydCArIGkgLSAxXSkpCiAgICAgICAgICBkaXN0YW5jZXNbaV1bal0gPSBkaXN0YW5jZXNbaSAtIDFdW2ogLSAxXTsKICAgICAgICBlbHNlIHsKICAgICAgICAgIGxldCBub3J0aCA9IGRpc3RhbmNlc1tpIC0gMV1bal0gKyAxOwogICAgICAgICAgbGV0IHdlc3QgPSBkaXN0YW5jZXNbaV1baiAtIDFdICsgMTsKICAgICAgICAgIGRpc3RhbmNlc1tpXVtqXSA9IG5vcnRoIDwgd2VzdCA/IG5vcnRoIDogd2VzdDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZGlzdGFuY2VzOwogIH0KCiAgLy8gVGhpcyBzdGFydHMgYXQgdGhlIGZpbmFsIHdlaWdodCwgYW5kIHdhbGtzICJiYWNrd2FyZCIgYnkgZmluZGluZwogIC8vIHRoZSBtaW5pbXVtIHByZXZpb3VzIHdlaWdodCByZWN1cnNpdmVseSB1bnRpbCB0aGUgb3JpZ2luIG9mIHRoZSB3ZWlnaHQKICAvLyBtYXRyaXguCiAgZnVuY3Rpb24gc3BsaWNlT3BlcmF0aW9uc0Zyb21FZGl0RGlzdGFuY2VzKGRpc3RhbmNlcykgewogICAgbGV0IGkgPSBkaXN0YW5jZXMubGVuZ3RoIC0gMTsKICAgIGxldCBqID0gZGlzdGFuY2VzWzBdLmxlbmd0aCAtIDE7CiAgICBsZXQgY3VycmVudCA9IGRpc3RhbmNlc1tpXVtqXTsKICAgIGxldCBlZGl0cyA9IFtdOwogICAgd2hpbGUgKGkgPiAwIHx8IGogPiAwKSB7CiAgICAgIGlmIChpID09IDApIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgaWYgKGogPT0gMCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBsZXQgbm9ydGhXZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqIC0gMV07CiAgICAgIGxldCB3ZXN0ID0gZGlzdGFuY2VzW2kgLSAxXVtqXTsKICAgICAgbGV0IG5vcnRoID0gZGlzdGFuY2VzW2ldW2ogLSAxXTsKCiAgICAgIGxldCBtaW47CiAgICAgIGlmICh3ZXN0IDwgbm9ydGgpCiAgICAgICAgbWluID0gd2VzdCA8IG5vcnRoV2VzdCA/IHdlc3QgOiBub3J0aFdlc3Q7CiAgICAgIGVsc2UKICAgICAgICBtaW4gPSBub3J0aCA8IG5vcnRoV2VzdCA/IG5vcnRoIDogbm9ydGhXZXN0OwoKICAgICAgaWYgKG1pbiA9PSBub3J0aFdlc3QpIHsKICAgICAgICBpZiAobm9ydGhXZXN0ID09IGN1cnJlbnQpIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9MRUFWRSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9VUERBVEUpOwogICAgICAgICAgY3VycmVudCA9IG5vcnRoV2VzdDsKICAgICAgICB9CiAgICAgICAgaS0tOwogICAgICAgIGotLTsKICAgICAgfSBlbHNlIGlmIChtaW4gPT0gd2VzdCkgewogICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgIGktLTsKICAgICAgICBjdXJyZW50ID0gd2VzdDsKICAgICAgfSBlbHNlIHsKICAgICAgICBlZGl0cy5wdXNoKEVESVRfQUREKTsKICAgICAgICBqLS07CiAgICAgICAgY3VycmVudCA9IG5vcnRoOwogICAgICB9CiAgICB9CgogICAgZWRpdHMucmV2ZXJzZSgpOwogICAgcmV0dXJuIGVkaXRzOwogIH0KCiAgLyoqCiAgICogU3BsaWNlIFByb2plY3Rpb24gZnVuY3Rpb25zOgogICAqCiAgICogQSBzcGxpY2UgbWFwIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgaG93IGEgcHJldmlvdXMgYXJyYXkgb2YgaXRlbXMKICAgKiB3YXMgdHJhbnNmb3JtZWQgaW50byBhIG5ldyBhcnJheSBvZiBpdGVtcy4gQ29uY2VwdHVhbGx5IGl0IGlzIGEgbGlzdCBvZgogICAqIHR1cGxlcyBvZgogICAqCiAgICogICA8aW5kZXgsIHJlbW92ZWQsIGFkZGVkQ291bnQ+CiAgICoKICAgKiB3aGljaCBhcmUga2VwdCBpbiBhc2NlbmRpbmcgaW5kZXggb3JkZXIgb2YuIFRoZSB0dXBsZSByZXByZXNlbnRzIHRoYXQgYXQKICAgKiB0aGUgfGluZGV4fCwgfHJlbW92ZWR8IHNlcXVlbmNlIG9mIGl0ZW1zIHdlcmUgcmVtb3ZlZCwgYW5kIGNvdW50aW5nIGZvcndhcmQKICAgKiBmcm9tIHxpbmRleHwsIHxhZGRlZENvdW50fCBpdGVtcyB3ZXJlIGFkZGVkLgogICAqLwoKICAvKioKICAgKiBMYWNraW5nIGluZGl2aWR1YWwgc3BsaWNlIG11dGF0aW9uIGluZm9ybWF0aW9uLCB0aGUgbWluaW1hbCBzZXQgb2YKICAgKiBzcGxpY2VzIGNhbiBiZSBzeW50aGVzaXplZCBnaXZlbiB0aGUgcHJldmlvdXMgc3RhdGUgYW5kIGZpbmFsIHN0YXRlIG9mIGFuCiAgICogYXJyYXkuIFRoZSBiYXNpYyBhcHByb2FjaCBpcyB0byBjYWxjdWxhdGUgdGhlIGVkaXQgZGlzdGFuY2UgbWF0cml4IGFuZAogICAqIGNob29zZSB0aGUgc2hvcnRlc3QgcGF0aCB0aHJvdWdoIGl0LgogICAqCiAgICogQ29tcGxleGl0eTogTyhsICogcCkKICAgKiAgIGw6IFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYXJyYXkKICAgKiAgIHA6IFRoZSBsZW5ndGggb2YgdGhlIG9sZCBhcnJheQogICAqCiAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlIGN1cnJlbnQgImNoYW5nZWQiIGFycmF5IGZvciB3aGljaCB0bwogICAqIGNhbGN1bGF0ZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50U3RhcnQgU3RhcnRpbmcgaW5kZXggaW4gdGhlIGBjdXJyZW50YCBhcnJheSBmb3IKICAgKiB3aGljaCBzcGxpY2VzIGFyZSBjYWxjdWxhdGVkLgogICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJyZW50RW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYGN1cnJlbnRgIGFycmF5IGZvcgogICAqIHdoaWNoIHNwbGljZXMgYXJlIGNhbGN1bGF0ZWQuCiAgICogQHBhcmFtIHshQXJyYXl9IG9sZCBUaGUgb3JpZ2luYWwgInVuY2hhbmdlZCIgYXJyYXkgdG8gY29tcGFyZSBgY3VycmVudGAKICAgKiBhZ2FpbnN0IHRvIGRldGVybWluZSBzcGxpY2VzLgogICAqIEBwYXJhbSB7bnVtYmVyfSBvbGRTdGFydCBTdGFydGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcGFyYW0ge251bWJlcn0gb2xkRW5kIEVuZGluZyBpbmRleCBpbiB0aGUgYG9sZGAgYXJyYXkgZm9yCiAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICogY29udGFpbnM6IGBpbmRleGAgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBzcGxpY2Ugb2NjdXJyZWQ7IGByZW1vdmVkYAogICAqIHRoZSBhcnJheSBvZiByZW1vdmVkIGl0ZW1zIGZyb20gdGhpcyBsb2NhdGlvbjsgYGFkZGVkQ291bnRgIHRoZSBudW1iZXIKICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAqLwogIGZ1bmN0aW9uIGNhbGNTcGxpY2VzKGN1cnJlbnQsIGN1cnJlbnRTdGFydCwgY3VycmVudEVuZCwKICAgICAgICAgICAgICAgICAgICAgICAgb2xkLCBvbGRTdGFydCwgb2xkRW5kKSB7CiAgICBsZXQgcHJlZml4Q291bnQgPSAwOwogICAgbGV0IHN1ZmZpeENvdW50ID0gMDsKICAgIGxldCBzcGxpY2U7CgogICAgbGV0IG1pbkxlbmd0aCA9IE1hdGgubWluKGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQsIG9sZEVuZCAtIG9sZFN0YXJ0KTsKICAgIGlmIChjdXJyZW50U3RhcnQgPT0gMCAmJiBvbGRTdGFydCA9PSAwKQogICAgICBwcmVmaXhDb3VudCA9IHNoYXJlZFByZWZpeChjdXJyZW50LCBvbGQsIG1pbkxlbmd0aCk7CgogICAgaWYgKGN1cnJlbnRFbmQgPT0gY3VycmVudC5sZW5ndGggJiYgb2xkRW5kID09IG9sZC5sZW5ndGgpCiAgICAgIHN1ZmZpeENvdW50ID0gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgbWluTGVuZ3RoIC0gcHJlZml4Q291bnQpOwoKICAgIGN1cnJlbnRTdGFydCArPSBwcmVmaXhDb3VudDsKICAgIG9sZFN0YXJ0ICs9IHByZWZpeENvdW50OwogICAgY3VycmVudEVuZCAtPSBzdWZmaXhDb3VudDsKICAgIG9sZEVuZCAtPSBzdWZmaXhDb3VudDsKCiAgICBpZiAoY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCA9PSAwICYmIG9sZEVuZCAtIG9sZFN0YXJ0ID09IDApCiAgICAgIHJldHVybiBbXTsKCiAgICBpZiAoY3VycmVudFN0YXJ0ID09IGN1cnJlbnRFbmQpIHsKICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIDApOwogICAgICB3aGlsZSAob2xkU3RhcnQgPCBvbGRFbmQpCiAgICAgICAgc3BsaWNlLnJlbW92ZWQucHVzaChvbGRbb2xkU3RhcnQrK10pOwoKICAgICAgcmV0dXJuIFsgc3BsaWNlIF07CiAgICB9IGVsc2UgaWYgKG9sZFN0YXJ0ID09IG9sZEVuZCkKICAgICAgcmV0dXJuIFsgbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQpIF07CgogICAgbGV0IG9wcyA9IHNwbGljZU9wZXJhdGlvbnNGcm9tRWRpdERpc3RhbmNlcygKICAgICAgICBjYWxjRWRpdERpc3RhbmNlcyhjdXJyZW50LCBjdXJyZW50U3RhcnQsIGN1cnJlbnRFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpKTsKCiAgICBzcGxpY2UgPSB1bmRlZmluZWQ7CiAgICBsZXQgc3BsaWNlcyA9IFtdOwogICAgbGV0IGluZGV4ID0gY3VycmVudFN0YXJ0OwogICAgbGV0IG9sZEluZGV4ID0gb2xkU3RhcnQ7CiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykgewogICAgICBzd2l0Y2gob3BzW2ldKSB7CiAgICAgICAgY2FzZSBFRElUX0xFQVZFOgogICAgICAgICAgaWYgKHNwbGljZSkgewogICAgICAgICAgICBzcGxpY2VzLnB1c2goc3BsaWNlKTsKICAgICAgICAgICAgc3BsaWNlID0gdW5kZWZpbmVkOwogICAgICAgICAgfQoKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBFRElUX1VQREFURToKICAgICAgICAgIGlmICghc3BsaWNlKQogICAgICAgICAgICBzcGxpY2UgPSBuZXdTcGxpY2UoaW5kZXgsIFtdLCAwKTsKCiAgICAgICAgICBzcGxpY2UuYWRkZWRDb3VudCsrOwogICAgICAgICAgaW5kZXgrKzsKCiAgICAgICAgICBzcGxpY2UucmVtb3ZlZC5wdXNoKG9sZFtvbGRJbmRleF0pOwogICAgICAgICAgb2xkSW5kZXgrKzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgRURJVF9BREQ6CiAgICAgICAgICBpZiAoIXNwbGljZSkKICAgICAgICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGluZGV4LCBbXSwgMCk7CgogICAgICAgICAgc3BsaWNlLmFkZGVkQ291bnQrKzsKICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIEVESVRfREVMRVRFOgogICAgICAgICAgaWYgKCFzcGxpY2UpCiAgICAgICAgICAgIHNwbGljZSA9IG5ld1NwbGljZShpbmRleCwgW10sIDApOwoKICAgICAgICAgIHNwbGljZS5yZW1vdmVkLnB1c2gob2xkW29sZEluZGV4XSk7CiAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoc3BsaWNlKSB7CiAgICAgIHNwbGljZXMucHVzaChzcGxpY2UpOwogICAgfQogICAgcmV0dXJuIHNwbGljZXM7CiAgfQoKICBmdW5jdGlvbiBzaGFyZWRQcmVmaXgoY3VycmVudCwgb2xkLCBzZWFyY2hMZW5ndGgpIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoTGVuZ3RoOyBpKyspCiAgICAgIGlmICghZXF1YWxzKGN1cnJlbnRbaV0sIG9sZFtpXSkpCiAgICAgICAgcmV0dXJuIGk7CiAgICByZXR1cm4gc2VhcmNoTGVuZ3RoOwogIH0KCiAgZnVuY3Rpb24gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgc2VhcmNoTGVuZ3RoKSB7CiAgICBsZXQgaW5kZXgxID0gY3VycmVudC5sZW5ndGg7CiAgICBsZXQgaW5kZXgyID0gb2xkLmxlbmd0aDsKICAgIGxldCBjb3VudCA9IDA7CiAgICB3aGlsZSAoY291bnQgPCBzZWFyY2hMZW5ndGggJiYgZXF1YWxzKGN1cnJlbnRbLS1pbmRleDFdLCBvbGRbLS1pbmRleDJdKSkKICAgICAgY291bnQrKzsKCiAgICByZXR1cm4gY291bnQ7CiAgfQoKICBmdW5jdGlvbiBjYWxjdWxhdGVTcGxpY2VzKGN1cnJlbnQsIHByZXZpb3VzKSB7CiAgICByZXR1cm4gY2FsY1NwbGljZXMoY3VycmVudCwgMCwgY3VycmVudC5sZW5ndGgsIHByZXZpb3VzLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMubGVuZ3RoKTsKICB9CgogIGZ1bmN0aW9uIGVxdWFscyhjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUpIHsKICAgIHJldHVybiBjdXJyZW50VmFsdWUgPT09IHByZXZpb3VzVmFsdWU7CiAgfQoKICAvKioKICAgKiBAbmFtZXNwYWNlCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBNb2R1bGUgdGhhdCBwcm92aWRlcyB1dGlsaXRpZXMgZm9yIGRpZmZpbmcgYXJyYXlzLgogICAqLwogIFBvbHltZXIuQXJyYXlTcGxpY2UgPSB7CiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMgaW5kaWNhdGluZyB0aGUgbWluaW11bSBlZGl0cyByZXF1aXJlZAogICAgICogdG8gdHJhbnNmb3JtIHRoZSBgcHJldmlvdXNgIGFycmF5IGludG8gdGhlIGBjdXJyZW50YCBhcnJheS4KICAgICAqCiAgICAgKiBTcGxpY2UgcmVjb3JkcyBhcmUgb3JkZXJlZCBieSBpbmRleCBhbmQgY29udGFpbiB0aGUgZm9sbG93aW5nIGZpZWxkczoKICAgICAqIC0gYGluZGV4YDogaW5kZXggd2hlcmUgZWRpdCBzdGFydGVkCiAgICAgKiAtIGByZW1vdmVkYDogYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgaW5kZXgKICAgICAqIC0gYGFkZGVkQ291bnRgOiBudW1iZXIgb2YgaXRlbXMgYWRkZWQgYXQgdGhpcyBpbmRleAogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gdGhlIExldmVuc2h0ZWluICJtaW5pbXVtIGVkaXQgZGlzdGFuY2UiCiAgICAgKiBhbGdvcml0aG0uIE5vdGUgdGhhdCB1cGRhdGVzIGFyZSB0cmVhdGVkIGFzIHJlbW92YWwgZm9sbG93ZWQgYnkgYWRkaXRpb24uCiAgICAgKgogICAgICogVGhlIHdvcnN0LWNhc2UgdGltZSBjb21wbGV4aXR5IG9mIHRoaXMgYWxnb3JpdGhtIGlzIGBPKGwgKiBwKWAKICAgICAqICAgbDogVGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBhcnJheQogICAgICogICBwOiBUaGUgbGVuZ3RoIG9mIHRoZSBwcmV2aW91cyBhcnJheQogICAgICoKICAgICAqIEhvd2V2ZXIsIHRoZSB3b3JzdC1jYXNlIGNvbXBsZXhpdHkgaXMgcmVkdWNlZCBieSBhbiBgTyhuKWAgb3B0aW1pemF0aW9uCiAgICAgKiB0byBkZXRlY3QgYW55IHNoYXJlZCBwcmVmaXggJiBzdWZmaXggYmV0d2VlbiB0aGUgdHdvIGFycmF5cyBhbmQgb25seQogICAgICogcGVyZm9ybSB0aGUgbW9yZSBleHBlbnNpdmUgbWluaW11bSBlZGl0IGRpc3RhbmNlIGNhbGN1bGF0aW9uIG92ZXIgdGhlCiAgICAgKiBub24tc2hhcmVkIHBvcnRpb25zIG9mIHRoZSBhcnJheXMuCiAgICAgKgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lci5BcnJheVNwbGljZQogICAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlICJjaGFuZ2VkIiBhcnJheSBmb3Igd2hpY2ggc3BsaWNlcyB3aWxsIGJlCiAgICAgKiBjYWxjdWxhdGVkLgogICAgICogQHBhcmFtIHshQXJyYXl9IHByZXZpb3VzIFRoZSAidW5jaGFuZ2VkIiBvcmlnaW5hbCBhcnJheSB0byBjb21wYXJlCiAgICAgKiBgY3VycmVudGAgYWdhaW5zdCB0byBkZXRlcm1pbmUgdGhlIHNwbGljZXMuCiAgICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICAgKiBjb250YWluczogYGluZGV4YCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHNwbGljZSBvY2N1cnJlZDsgYHJlbW92ZWRgCiAgICAgKiB0aGUgYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgbG9jYXRpb247IGBhZGRlZENvdW50YCB0aGUgbnVtYmVyCiAgICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAgICovCiAgICBjYWxjdWxhdGVTcGxpY2VzCiAgfTsKCn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgLyoqCiAgICogUmV0dXJucyB0cnVlIGlmIGBub2RlYCBpcyBhIHNsb3QgZWxlbWVudAogICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHRlc3QuCiAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBgbm9kZWAgaXMgYSBzbG90CiAgICogQHByaXZhdGUKICAgKi8KICBmdW5jdGlvbiBpc1Nsb3Qobm9kZSkgewogICAgcmV0dXJuIChub2RlLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKTsKICB9CgogIC8qKgogICAqIENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAqICJmbGF0dGVuZWQgbm9kZXMiIG9uIGEgZ2l2ZW4gYG5vZGVgLiBUaGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgY29uc2lzdHMKICAgKiBvZiBhIG5vZGUncyBjaGlsZHJlbiBhbmQsIGZvciBhbnkgY2hpbGRyZW4gdGhhdCBhcmUgYDxzbG90PmAgZWxlbWVudHMsCiAgICogdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgKiBGb3IgZXhhbXBsZSwgaWYgdGhlIG9ic2VydmVkIG5vZGUgaGFzIGNoaWxkcmVuIGA8YT48L2E+PHNsb3Q+PC9zbG90PjxiPjwvYj5gCiAgICogYW5kIHRoZSBgPHNsb3Q+YCBoYXMgb25lIGA8ZGl2PmAgYXNzaWduZWQgdG8gaXQsIHRoZW4gdGhlIGZsYXR0ZW5lZAogICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICogYDxzbG90PmAgZWxlbWVudHMgYXNzaWduZWQgdG8gaXQsIHRoZXNlIGFyZSBmbGF0dGVuZWQgYXMgd2VsbC4KICAgKgogICAqIFRoZSBwcm92aWRlZCBgY2FsbGJhY2tgIGlzIGNhbGxlZCB3aGVuZXZlciBhbnkgY2hhbmdlIHRvIHRoaXMgbGlzdAogICAqIG9mIGZsYXR0ZW5lZCBub2RlcyBvY2N1cnMsIHdoZXJlIGFuIGFkZGl0aW9uIG9yIHJlbW92YWwgb2YgYSBub2RlIGlzCiAgICogY29uc2lkZXJlZCBhIGNoYW5nZS4gVGhlIGBjYWxsYmFja2AgaXMgY2FsbGVkIHdpdGggb25lIGFyZ3VtZW50LCBhbiBvYmplY3QKICAgKiBjb250YWluaW5nIGFuIGFycmF5IG9mIGFueSBgYWRkZWROb2Rlc2AgYW5kIGByZW1vdmVkTm9kZXNgLgogICAqCiAgICogTm90ZTogdGhlIGNhbGxiYWNrIGlzIGNhbGxlZCBhc3luY2hyb25vdXMgdG8gYW55IGNoYW5nZXMKICAgKiBhdCBhIG1pY3JvdGFzayBjaGVja3BvaW50LiBUaGlzIGlzIGJlY2F1c2Ugb2JzZXJ2YXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nCiAgICogYE11dGF0aW9uT2JzZXJ2ZXJgIGFuZCB0aGUgYDxzbG90PmAgZWxlbWVudCdzIGBzbG90Y2hhbmdlYCBldmVudCB3aGljaAogICAqIGFyZSBhc3luY2hyb25vdXMuCiAgICoKICAgKiBBbiBleGFtcGxlOgogICAqIGBgYGpzCiAgICogY2xhc3MgVGVzdFNlbGZPYnNlcnZlIGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAndGVzdC1zZWxmLW9ic2VydmUnO30KICAgKiAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAqICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAqICAgICB0aGlzLl9vYnNlcnZlciA9IG5ldyBQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcywgKGluZm8pID0+IHsKICAgKiAgICAgICB0aGlzLmluZm8gPSBpbmZvOwogICAqICAgICB9KTsKICAgKiAgIH0KICAgKiAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAqICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAqICAgICB0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICogICB9CiAgICogfQogICAqIGN1c3RvbUVsZW1lbnRzLmRlZmluZShUZXN0U2VsZk9ic2VydmUuaXMsIFRlc3RTZWxmT2JzZXJ2ZSk7CiAgICogYGBgCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAqICJmbGF0dGVuZWQgbm9kZXMiIG9uIGEgZ2l2ZW4gYG5vZGVgLgogICAqLwogIGNsYXNzIEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIgewoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgbm9kZXMgZm9yIHRoZSBnaXZlbiBgbm9kZWAuCiAgICAgKiBUaGlzIGxpc3QgY29uc2lzdHMgb2YgYSBub2RlJ3MgY2hpbGRyZW4gYW5kLCBmb3IgYW55IGNoaWxkcmVuCiAgICAgKiB0aGF0IGFyZSBgPHNsb3Q+YCBlbGVtZW50cywgdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgICAqIEZvciBleGFtcGxlLCBpZiB0aGUgb2JzZXJ2ZWQgbm9kZSBoYXMgY2hpbGRyZW4gYDxhPjwvYT48c2xvdD48L3Nsb3Q+PGI+PC9iPmAKICAgICAqIGFuZCB0aGUgYDxzbG90PmAgaGFzIG9uZSBgPGRpdj5gIGFzc2lnbmVkIHRvIGl0LCB0aGVuIHRoZSBmbGF0dGVuZWQKICAgICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICAgKiBgPHNsb3Q+YCBlbGVtZW50cyBhc3NpZ25lZCB0byBpdCwgdGhlc2UgYXJlIGZsYXR0ZW5lZCBhcyB3ZWxsLgogICAgICoKICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8SFRNTFNsb3RFbGVtZW50fSBub2RlIFRoZSBub2RlIGZvciB3aGljaCB0byByZXR1cm4gdGhlIGxpc3Qgb2YgZmxhdHRlbmVkIG5vZGVzLgogICAgICogQHJldHVybiB7QXJyYXl9IFRoZSBsaXN0IG9mIGZsYXR0ZW5lZCBub2RlcyBmb3IgdGhlIGdpdmVuIGBub2RlYC4KICAgICovCiAgICBzdGF0aWMgZ2V0RmxhdHRlbmVkTm9kZXMobm9kZSkgewogICAgICBpZiAoaXNTbG90KG5vZGUpKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7SFRNTFNsb3RFbGVtZW50fSAqLyhub2RlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgIHJldHVybiBub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShub2RlLmNoaWxkTm9kZXMpLm1hcCgobm9kZSkgPT4gewogICAgICAgICAgaWYgKGlzU2xvdChub2RlKSkgewogICAgICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtIVE1MU2xvdEVsZW1lbnR9ICovKG5vZGUpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICAgIHJldHVybiBub2RlLmFzc2lnbmVkTm9kZXMoe2ZsYXR0ZW46IHRydWV9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBbbm9kZV07CiAgICAgICAgICB9CiAgICAgICAgfSkucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCBOb2RlIG9uIHdoaWNoIHRvIGxpc3RlbiBmb3IgY2hhbmdlcy4KICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgYWRkaXRpb25zCiAgICAgKiBvciByZW1vdmFscyBmcm9tIHRoZSB0YXJnZXQncyBsaXN0IG9mIGZsYXR0ZW5lZCBub2Rlcy4KICAgICovCiAgICBjb25zdHJ1Y3Rvcih0YXJnZXQsIGNhbGxiYWNrKSB7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlciA9IG51bGw7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTsKICAgICAgLyoqCiAgICAgICAqIEB0eXBlIHtFbGVtZW50fQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0OwogICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7CiAgICAgIHRoaXMuX2VmZmVjdGl2ZU5vZGVzID0gW107CiAgICAgIHRoaXMuX29ic2VydmVyID0gbnVsbDsKICAgICAgdGhpcy5fc2NoZWR1bGVkID0gZmFsc2U7CiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oKX0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIHRoaXMuX2JvdW5kU2NoZWR1bGUgPSAoKSA9PiB7CiAgICAgICAgdGhpcy5fc2NoZWR1bGUoKTsKICAgICAgfTsKICAgICAgdGhpcy5jb25uZWN0KCk7CiAgICAgIHRoaXMuX3NjaGVkdWxlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBBY3RpdmF0ZXMgYW4gb2JzZXJ2ZXIuIFRoaXMgbWV0aG9kIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIHdoZW4KICAgICAqIGEgYEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJgIGlzIGNyZWF0ZWQuIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCB0bwogICAgICogcmUtYWN0aXZhdGUgYW4gb2JzZXJ2ZXIgdGhhdCBoYXMgYmVlbiBkZWFjdGl2YXRlZCB2aWEgdGhlIGBkaXNjb25uZWN0YCBtZXRob2QuCiAgICAgKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY29ubmVjdCgpIHsKICAgICAgaWYgKGlzU2xvdCh0aGlzLl90YXJnZXQpKSB7CiAgICAgICAgdGhpcy5fbGlzdGVuU2xvdHMoW3RoaXMuX3RhcmdldF0pOwogICAgICB9IGVsc2UgaWYgKHRoaXMuX3RhcmdldC5jaGlsZHJlbikgewogICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKHRoaXMuX3RhcmdldC5jaGlsZHJlbik7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSkgewogICAgICAgICAgdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyID0KICAgICAgICAgICAgU2hhZHlET00ub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3RhcmdldCwgKG11dGF0aW9ucykgPT4gewogICAgICAgICAgICAgIHRoaXMuX3Byb2Nlc3NNdXRhdGlvbnMobXV0YXRpb25zKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPQogICAgICAgICAgICBuZXcgTXV0YXRpb25PYnNlcnZlcigobXV0YXRpb25zKSA9PiB7CiAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc011dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLl90YXJnZXQsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIERlYWN0aXZhdGVzIHRoZSBmbGF0dGVuZWQgbm9kZXMgb2JzZXJ2ZXIuIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QKICAgICAqIHRoZSBvYnNlcnZlciBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiBjaGFuZ2VzIHRvIGZsYXR0ZW5lZCBub2RlcwogICAgICogb2NjdXIuIFRoZSBgY29ubmVjdGAgbWV0aG9kIG1heSBiZSBzdWJzZXF1ZW50bHkgY2FsbGVkIHRvIHJlYWN0aXZhdGUKICAgICAqIHRoZSBvYnNlcnZlci4KICAgICAqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBkaXNjb25uZWN0KCkgewogICAgICBpZiAoaXNTbG90KHRoaXMuX3RhcmdldCkpIHsKICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKFt0aGlzLl90YXJnZXRdKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLl90YXJnZXQuY2hpbGRyZW4pIHsKICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKHRoaXMuX3RhcmdldC5jaGlsZHJlbik7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIpIHsKICAgICAgICAgIFNoYWR5RE9NLnVub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcik7CiAgICAgICAgICB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgICAgdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3NjaGVkdWxlKCkgewogICAgICBpZiAoIXRoaXMuX3NjaGVkdWxlZCkgewogICAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IHRydWU7CiAgICAgICAgUG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKCgpID0+IHRoaXMuZmx1c2goKSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXk8TXV0YXRpb25SZWNvcmQ+fSBtdXRhdGlvbnMgTXV0YXRpb25zIHNpZ25hbGVkIGJ5IHRoZSBtdXRhdGlvbiBvYnNlcnZlcgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIF9wcm9jZXNzTXV0YXRpb25zKG11dGF0aW9ucykgewogICAgICB0aGlzLl9wcm9jZXNzU2xvdE11dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICB0aGlzLmZsdXNoKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0FycmF5PE11dGF0aW9uUmVjb3JkPn0gbXV0YXRpb25zIE11dGF0aW9ucyBzaWduYWxlZCBieSB0aGUgbXV0YXRpb24gb2JzZXJ2ZXIKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfcHJvY2Vzc1Nsb3RNdXRhdGlvbnMobXV0YXRpb25zKSB7CiAgICAgIGlmIChtdXRhdGlvbnMpIHsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBtdXRhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGxldCBtdXRhdGlvbiA9IG11dGF0aW9uc1tpXTsKICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzKSB7CiAgICAgICAgICAgIHRoaXMuX2xpc3RlblNsb3RzKG11dGF0aW9uLmFkZGVkTm9kZXMpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG11dGF0aW9uLnJlbW92ZWROb2RlcykgewogICAgICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKG11dGF0aW9uLnJlbW92ZWROb2Rlcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBGbHVzaGVzIHRoZSBvYnNlcnZlciBjYXVzaW5nIGFueSBwZW5kaW5nIGNoYW5nZXMgdG8gYmUgaW1tZWRpYXRlbHkKICAgICAqIGRlbGl2ZXJlZCB0aGUgb2JzZXJ2ZXIgY2FsbGJhY2suIEJ5IGRlZmF1bHQgdGhlc2UgY2hhbmdlcyBhcmUgZGVsaXZlcmVkCiAgICAgKiBhc3luY2hyb25vdXNseSBhdCB0aGUgbmV4dCBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYW55IHBlbmRpbmcgY2hhbmdlcyBjYXVzZWQgdGhlIG9ic2VydmVyCiAgICAgKiBjYWxsYmFjayB0byBydW4uCiAgICAgKi8KICAgIGZsdXNoKCkgewogICAgICBpZiAoIXRoaXMuX2Nvbm5lY3RlZCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBpZiAod2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgU2hhZHlET00uZmx1c2goKTsKICAgICAgfQogICAgICBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgIHRoaXMuX3Byb2Nlc3NTbG90TXV0YXRpb25zKHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIudGFrZVJlY29yZHMoKSk7CiAgICAgIH0gZWxzZSBpZiAodGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyKSB7CiAgICAgICAgdGhpcy5fcHJvY2Vzc1Nsb3RNdXRhdGlvbnModGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyLnRha2VSZWNvcmRzKCkpOwogICAgICB9CiAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IGZhbHNlOwogICAgICBsZXQgaW5mbyA9IHsKICAgICAgICB0YXJnZXQ6IHRoaXMuX3RhcmdldCwKICAgICAgICBhZGRlZE5vZGVzOiBbXSwKICAgICAgICByZW1vdmVkTm9kZXM6IFtdCiAgICAgIH07CiAgICAgIGxldCBuZXdOb2RlcyA9IHRoaXMuY29uc3RydWN0b3IuZ2V0RmxhdHRlbmVkTm9kZXModGhpcy5fdGFyZ2V0KTsKICAgICAgbGV0IHNwbGljZXMgPSBQb2x5bWVyLkFycmF5U3BsaWNlLmNhbGN1bGF0ZVNwbGljZXMobmV3Tm9kZXMsCiAgICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMpOwogICAgICAvLyBwcm9jZXNzIHJlbW92YWxzCiAgICAgIGZvciAobGV0IGk9MCwgczsgKGk8c3BsaWNlcy5sZW5ndGgpICYmIChzPXNwbGljZXNbaV0pOyBpKyspIHsKICAgICAgICBmb3IgKGxldCBqPTAsIG47IChqIDwgcy5yZW1vdmVkLmxlbmd0aCkgJiYgKG49cy5yZW1vdmVkW2pdKTsgaisrKSB7CiAgICAgICAgICBpbmZvLnJlbW92ZWROb2Rlcy5wdXNoKG4pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBwcm9jZXNzIGFkZHMKICAgICAgZm9yIChsZXQgaT0wLCBzOyAoaTxzcGxpY2VzLmxlbmd0aCkgJiYgKHM9c3BsaWNlc1tpXSk7IGkrKykgewogICAgICAgIGZvciAobGV0IGo9cy5pbmRleDsgaiA8IHMuaW5kZXggKyBzLmFkZGVkQ291bnQ7IGorKykgewogICAgICAgICAgaW5mby5hZGRlZE5vZGVzLnB1c2gobmV3Tm9kZXNbal0pOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyB1cGRhdGUgY2FjaGUKICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMgPSBuZXdOb2RlczsKICAgICAgbGV0IGRpZEZsdXNoID0gZmFsc2U7CiAgICAgIGlmIChpbmZvLmFkZGVkTm9kZXMubGVuZ3RoIHx8IGluZm8ucmVtb3ZlZE5vZGVzLmxlbmd0aCkgewogICAgICAgIGRpZEZsdXNoID0gdHJ1ZTsKICAgICAgICB0aGlzLmNhbGxiYWNrLmNhbGwodGhpcy5fdGFyZ2V0LCBpbmZvKTsKICAgICAgfQogICAgICByZXR1cm4gZGlkRmx1c2g7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyFBcnJheTxFbGVtZW50fE5vZGU+fCFOb2RlTGlzdDxOb2RlPn0gbm9kZUxpc3QgTm9kZXMgdGhhdCBjb3VsZCBjaGFuZ2UKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBfbGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgIG4uYWRkRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHshQXJyYXk8RWxlbWVudHxOb2RlPnwhTm9kZUxpc3Q8Tm9kZT59IG5vZGVMaXN0IE5vZGVzIHRoYXQgY291bGQgY2hhbmdlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgX3VubGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbm9kZUxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgIG4ucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2xvdGNoYW5nZScsIHRoaXMuX2JvdW5kU2NoZWR1bGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICB9CgogIFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlciA9IEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXI7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGxldCBkZWJvdW5jZXJRdWV1ZSA9IFtdOwoKICAvKioKICAgKiBBZGRzIGEgYFBvbHltZXIuRGVib3VuY2VyYCB0byBhIGxpc3Qgb2YgZ2xvYmFsbHkgZmx1c2hhYmxlIHRhc2tzLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLmVucXVldWVEZWJvdW5jZXIgPSBmdW5jdGlvbihkZWJvdW5jZXIpIHsKICAgIGRlYm91bmNlclF1ZXVlLnB1c2goZGVib3VuY2VyKTsKICB9OwoKICBmdW5jdGlvbiBmbHVzaERlYm91bmNlcnMoKSB7CiAgICBjb25zdCBkaWRGbHVzaCA9IEJvb2xlYW4oZGVib3VuY2VyUXVldWUubGVuZ3RoKTsKICAgIHdoaWxlIChkZWJvdW5jZXJRdWV1ZS5sZW5ndGgpIHsKICAgICAgdHJ5IHsKICAgICAgICBkZWJvdW5jZXJRdWV1ZS5zaGlmdCgpLmZsdXNoKCk7CiAgICAgIH0gY2F0Y2goZSkgewogICAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9KTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRpZEZsdXNoOwogIH0KCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgZW5xdWV1ZURlYm91bmNlcmAKICAgKiAtIFNoYWR5RE9NIGRpc3RyaWJ1dGlvbgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAcmV0dXJuIHt2b2lkfQogICAqLwogIFBvbHltZXIuZmx1c2ggPSBmdW5jdGlvbigpIHsKICAgIGxldCBzaGFkeURPTSwgZGVib3VuY2VyczsKICAgIGRvIHsKICAgICAgc2hhZHlET00gPSB3aW5kb3cuU2hhZHlET00gJiYgU2hhZHlET00uZmx1c2goKTsKICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0pIHsKICAgICAgICB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0uZmx1c2goKTsKICAgICAgfQogICAgICBkZWJvdW5jZXJzID0gZmx1c2hEZWJvdW5jZXJzKCk7CiAgICB9IHdoaWxlIChzaGFkeURPTSB8fCBkZWJvdW5jZXJzKTsKICB9OwoKfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICBjb25zdCBwID0gRWxlbWVudC5wcm90b3R5cGU7CiAgLyoqCiAgICogQGNvbnN0IHtmdW5jdGlvbih0aGlzOk5vZGUsIHN0cmluZyk6IGJvb2xlYW59CiAgICovCiAgY29uc3Qgbm9ybWFsaXplZE1hdGNoZXNTZWxlY3RvciA9IHAubWF0Y2hlcyB8fCBwLm1hdGNoZXNTZWxlY3RvciB8fAogICAgcC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgcC5tc01hdGNoZXNTZWxlY3RvciB8fAogICAgcC5vTWF0Y2hlc1NlbGVjdG9yIHx8IHAud2Via2l0TWF0Y2hlc1NlbGVjdG9yOwoKICAvKioKICAgKiBDcm9zcy1wbGF0Zm9ybSBgZWxlbWVudC5tYXRjaGVzYCBzaGltLgogICAqCiAgICogQGZ1bmN0aW9uIG1hdGNoZXNTZWxlY3RvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBjaGVjayBzZWxlY3RvciBhZ2FpbnN0CiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIG1hdGNoCiAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBub2RlIG1hdGNoZWQgc2VsZWN0b3IKICAgKi8KICBjb25zdCBtYXRjaGVzU2VsZWN0b3IgPSBmdW5jdGlvbihub2RlLCBzZWxlY3RvcikgewogICAgcmV0dXJuIG5vcm1hbGl6ZWRNYXRjaGVzU2VsZWN0b3IuY2FsbChub2RlLCBzZWxlY3Rvcik7CiAgfTsKCiAgLyoqCiAgICogTm9kZSBBUEkgd3JhcHBlciBjbGFzcyByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmRvbS4odGFyZ2V0KWAgd2hlbgogICAqIGB0YXJnZXRgIGlzIGEgYE5vZGVgLgogICAqCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKi8KICBjbGFzcyBEb21BcGkgewoKICAgIC8qKgogICAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIGNyZWF0ZSBhIFBvbHltZXIuZG9tIGhlbHBlciBvYmplY3QuCiAgICAgKi8KICAgIGNvbnN0cnVjdG9yKG5vZGUpIHsKICAgICAgdGhpcy5ub2RlID0gbm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcmAgdGhhdAogICAgICogbGlzdGVucyBmb3Igbm9kZSBjaGFuZ2VzIG9uIHRoaXMgZWxlbWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFbGVtZW50LCB7IHRhcmdldDogIUVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBDYWxsZWQgd2hlbiBkaXJlY3Qgb3IgZGlzdHJpYnV0ZWQgY2hpbGRyZW4KICAgICAqICAgb2YgdGhpcyBlbGVtZW50IGNoYW5nZXMKICAgICAqIEByZXR1cm4geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IE9ic2VydmVyIGluc3RhbmNlCiAgICAgKi8KICAgIG9ic2VydmVOb2RlcyhjYWxsYmFjaykgewogICAgICByZXR1cm4gbmV3IFBvbHltZXIuRmxhdHRlbmVkTm9kZXNPYnNlcnZlcih0aGlzLm5vZGUsIGNhbGxiYWNrKTsKICAgIH0KCiAgICAvKioKICAgICAqIERpc2Nvbm5lY3RzIGFuIG9ic2VydmVyIHByZXZpb3VzbHkgY3JlYXRlZCB2aWEgYG9ic2VydmVOb2Rlc2AKICAgICAqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXJ9IG9ic2VydmVySGFuZGxlIE9ic2VydmVyIGluc3RhbmNlCiAgICAgKiAgIHRvIGRpc2Nvbm5lY3QuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICB1bm9ic2VydmVOb2RlcyhvYnNlcnZlckhhbmRsZSkgewogICAgICBvYnNlcnZlckhhbmRsZS5kaXNjb25uZWN0KCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBQcm92aWRlZCBhcyBhIGJhY2t3YXJkcy1jb21wYXRpYmxlIEFQSSBvbmx5LiAgVGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgbm90aWZ5T2JzZXJ2ZXIoKSB7fQoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBub2RlIGlzIGNvbnRhaW5lZCB3aXRoIHRoaXMgZWxlbWVudCdzCiAgICAgKiBsaWdodC1ET00gY2hpbGRyZW4gb3Igc2hhZG93IHJvb3QsIGluY2x1ZGluZyBhbnkgbmVzdGVkIHNoYWRvdyByb290cwogICAgICogb2YgY2hpbGRyZW4gdGhlcmVpbi4KICAgICAqCiAgICAgKiBAcGFyYW0ge05vZGV9IG5vZGUgTm9kZSB0byB0ZXN0CiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGBub2RlYCBpcyBjb250YWluZWQgd2l0aGluCiAgICAgKiAgIHRoaXMgZWxlbWVudCdzIGxpZ2h0IG9yIHNoYWRvdyBET00uCiAgICAgKi8KICAgIGRlZXBDb250YWlucyhub2RlKSB7CiAgICAgIGlmICh0aGlzLm5vZGUuY29udGFpbnMobm9kZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgbiA9IG5vZGU7CiAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7CiAgICAgIC8vIHdhbGsgZnJvbSBub2RlIHRvIGB0aGlzYCBvciBgZG9jdW1lbnRgCiAgICAgIHdoaWxlIChuICYmIG4gIT09IGRvYyAmJiBuICE9PSB0aGlzLm5vZGUpIHsKICAgICAgICAvLyB1c2UgbG9naWNhbCBwYXJlbnRub2RlLCBvciBuYXRpdmUgU2hhZG93Um9vdCBob3N0CiAgICAgICAgbiA9IG4ucGFyZW50Tm9kZSB8fCBuLmhvc3Q7CiAgICAgIH0KICAgICAgcmV0dXJuIG4gPT09IHRoaXMubm9kZTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIG5vZGUuICBFcXVpdmFsZW50IHRvIGBnZXRSb29kTm9kZSgpYC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHtOb2RlfSBUb3AgbW9zdCBlbGVtZW50IGluIHRoZSBkb20gdHJlZSBpbiB3aGljaCB0aGUgbm9kZQogICAgICogZXhpc3RzLiBJZiB0aGUgbm9kZSBpcyBjb25uZWN0ZWQgdG8gYSBkb2N1bWVudCB0aGlzIGlzIGVpdGhlciBhCiAgICAgKiBzaGFkb3dSb290IG9yIHRoZSBkb2N1bWVudDsgb3RoZXJ3aXNlLCBpdCBtYXkgYmUgdGhlIG5vZGUKICAgICAqIGl0c2VsZiBvciBhIG5vZGUgb3IgZG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyBpdC4KICAgICAqLwogICAgZ2V0T3duZXJSb290KCkgewogICAgICByZXR1cm4gdGhpcy5ub2RlLmdldFJvb3ROb2RlKCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBGb3Igc2xvdCBlbGVtZW50cywgcmV0dXJucyB0aGUgbm9kZXMgYXNzaWduZWQgdG8gdGhlIHNsb3Q7IG90aGVyd2lzZQogICAgICogYW4gZW1wdHkgYXJyYXkuIEl0IGlzIGVxdWl2YWxlbnQgdG8gYDxzbG90Pi5hZGRpZ25lZE5vZGVzKHtmbGF0dGVuOnRydWV9KWAuCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gQXJyYXkgb2YgYXNzaWduZWQgbm9kZXMKICAgICAqLwogICAgZ2V0RGlzdHJpYnV0ZWROb2RlcygpIHsKICAgICAgcmV0dXJuICh0aGlzLm5vZGUubG9jYWxOYW1lID09PSAnc2xvdCcpID8KICAgICAgICB0aGlzLm5vZGUuYXNzaWduZWROb2Rlcyh7ZmxhdHRlbjogdHJ1ZX0pIDoKICAgICAgICBbXTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHNsb3RzIHRoaXMgZWxlbWVudCB3YXMgZGlzdHJpYnV0ZWQgdG8uCiAgICAgKgogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU2xvdEVsZW1lbnQ+fSBEZXNjcmlwdGlvbgogICAgICovCiAgICBnZXREZXN0aW5hdGlvbkluc2VydGlvblBvaW50cygpIHsKICAgICAgbGV0IGlwJCA9IFtdOwogICAgICBsZXQgbiA9IHRoaXMubm9kZS5hc3NpZ25lZFNsb3Q7CiAgICAgIHdoaWxlIChuKSB7CiAgICAgICAgaXAkLnB1c2gobik7CiAgICAgICAgbiA9IG4uYXNzaWduZWRTbG90OwogICAgICB9CiAgICAgIHJldHVybiBpcCQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBDYWxscyBgaW1wb3J0Tm9kZWAgb24gdGhlIGBvd25lckRvY3VtZW50YCBmb3IgdGhpcyBub2RlLgogICAgICoKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBpbXBvcnQKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGVlcCBUcnVlIGlmIHRoZSBub2RlIHNob3VsZCBiZSBjbG9uZWQgZGVlcGx5IGR1cmluZwogICAgICogICBpbXBvcnQKICAgICAqIEByZXR1cm4ge05vZGV9IENsb25lIG9mIGdpdmVuIG5vZGUgaW1wb3J0ZWQgdG8gdGhpcyBvd25lciBkb2N1bWVudAogICAgICovCiAgICBpbXBvcnROb2RlKG5vZGUsIGRlZXApIHsKICAgICAgbGV0IGRvYyA9IHRoaXMubm9kZSBpbnN0YW5jZW9mIERvY3VtZW50ID8gdGhpcy5ub2RlIDoKICAgICAgICB0aGlzLm5vZGUub3duZXJEb2N1bWVudDsKICAgICAgcmV0dXJuIGRvYy5pbXBvcnROb2RlKG5vZGUsIGRlZXApOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gUmV0dXJucyBhIGZsYXR0ZW5lZCBsaXN0IG9mIGFsbCBjaGlsZCBub2RlcyBhbmQKICAgICAqIG5vZGVzIGFzc2lnbmVkIHRvIGNoaWxkIHNsb3RzLgogICAgICovCiAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICByZXR1cm4gUG9seW1lci5GbGF0dGVuZWROb2Rlc09ic2VydmVyLmdldEZsYXR0ZW5lZE5vZGVzKHRoaXMubm9kZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgZmlsdGVyZWQgbGlzdCBvZiBmbGF0dGVuZWQgY2hpbGQgZWxlbWVudHMgZm9yIHRoaXMgZWxlbWVudCBiYXNlZAogICAgICogb24gdGhlIGdpdmVuIHNlbGVjdG9yLgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byBmaWx0ZXIgbm9kZXMgYWdhaW5zdAogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MRWxlbWVudD59IExpc3Qgb2YgZmxhdHRlbmVkIGNoaWxkIGVsZW1lbnRzCiAgICAgKi8KICAgIHF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3RvcikgewogICAgICBsZXQgYyQgPSB0aGlzLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgbGV0IGxpc3QgPSBbXTsKICAgICAgZm9yIChsZXQgaT0wLCBsPWMkLmxlbmd0aCwgYzsgKGk8bCkgJiYgKGM9YyRbaV0pOyBpKyspIHsKICAgICAgICBpZiAoKGMubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSAmJgogICAgICAgICAgICBtYXRjaGVzU2VsZWN0b3IoYywgc2VsZWN0b3IpKSB7CiAgICAgICAgICBsaXN0LnB1c2goYyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qKgogICAgICogRm9yIHNoYWRvdyByb290cywgcmV0dXJucyB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCB3aXRoaW4gdGhpcwogICAgICogc2hhZG93IHJvb3QuCiAgICAgKgogICAgICogQHJldHVybiB7Tm9kZXx1bmRlZmluZWR9IEN1cnJlbnRseSBmb2N1c2VkIGVsZW1lbnQKICAgICAqLwogICAgZ2V0IGFjdGl2ZUVsZW1lbnQoKSB7CiAgICAgIGxldCBub2RlID0gdGhpcy5ub2RlOwogICAgICByZXR1cm4gbm9kZS5fYWN0aXZlRWxlbWVudCAhPT0gdW5kZWZpbmVkID8gbm9kZS5fYWN0aXZlRWxlbWVudCA6IG5vZGUuYWN0aXZlRWxlbWVudDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRNZXRob2RzKHByb3RvLCBtZXRob2RzKSB7CiAgICBmb3IgKGxldCBpPTA7IGkgPCBtZXRob2RzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBtZXRob2QgPSBtZXRob2RzW2ldOwogICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICBwcm90b1ttZXRob2RdID0gLyoqIEB0aGlzIHtEb21BcGl9ICovIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm5vZGVbbWV0aG9kXS5hcHBseSh0aGlzLm5vZGUsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICAgIC8qIGVzbGludC1lbmFibGUgKi8KICAgIH0KICB9CgogIGZ1bmN0aW9uIGZvcndhcmRSZWFkT25seVByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgIH0pOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZm9yd2FyZFByb3BlcnRpZXMocHJvdG8sIHByb3BlcnRpZXMpIHsKICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IG5hbWUgPSBwcm9wZXJ0aWVzW2ldOwogICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8sIG5hbWUsIHsKICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtEb21BcGl9ICovKHRoaXMpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5ub2RlW25hbWVdOwogICAgICAgIH0sCiAgICAgICAgc2V0OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgLyoqIEB0eXBlIHtEb21BcGl9ICovICh0aGlzKS5ub2RlW25hbWVdID0gdmFsdWU7CiAgICAgICAgfSwKICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgfSk7CiAgICB9CiAgfQoKICBmb3J3YXJkTWV0aG9kcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAnY2xvbmVOb2RlJywgJ2FwcGVuZENoaWxkJywgJ2luc2VydEJlZm9yZScsICdyZW1vdmVDaGlsZCcsCiAgICAncmVwbGFjZUNoaWxkJywgJ3NldEF0dHJpYnV0ZScsICdyZW1vdmVBdHRyaWJ1dGUnLAogICAgJ3F1ZXJ5U2VsZWN0b3InLCAncXVlcnlTZWxlY3RvckFsbCcKICBdKTsKCiAgZm9yd2FyZFJlYWRPbmx5UHJvcGVydGllcyhEb21BcGkucHJvdG90eXBlLCBbCiAgICAncGFyZW50Tm9kZScsICdmaXJzdENoaWxkJywgJ2xhc3RDaGlsZCcsCiAgICAnbmV4dFNpYmxpbmcnLCAncHJldmlvdXNTaWJsaW5nJywgJ2ZpcnN0RWxlbWVudENoaWxkJywKICAgICdsYXN0RWxlbWVudENoaWxkJywgJ25leHRFbGVtZW50U2libGluZycsICdwcmV2aW91c0VsZW1lbnRTaWJsaW5nJywKICAgICdjaGlsZE5vZGVzJywgJ2NoaWxkcmVuJywgJ2NsYXNzTGlzdCcKICBdKTsKCiAgZm9yd2FyZFByb3BlcnRpZXMoRG9tQXBpLnByb3RvdHlwZSwgWwogICAgJ3RleHRDb250ZW50JywgJ2lubmVySFRNTCcKICBdKTsKCgogIC8qKgogICAqIEV2ZW50IEFQSSB3cmFwcGVyIGNsYXNzIHJldHVybmVkIGZyb20gYFBvbHltZXIuZG9tLih0YXJnZXQpYCB3aGVuCiAgICogYHRhcmdldGAgaXMgYW4gYEV2ZW50YC4KICAgKi8KICBjbGFzcyBFdmVudEFwaSB7CiAgICBjb25zdHJ1Y3RvcihldmVudCkgewogICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBub2RlIG9uIHRoZSBgY29tcG9zZWRQYXRoYCBvZiB0aGlzIGV2ZW50LgogICAgICoKICAgICAqIEByZXR1cm4geyFFdmVudFRhcmdldH0gVGhlIG5vZGUgdGhpcyBldmVudCB3YXMgZGlzcGF0Y2hlZCB0bwogICAgICovCiAgICBnZXQgcm9vdFRhcmdldCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZXZlbnQuY29tcG9zZWRQYXRoKClbMF07CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHshRXZlbnRUYXJnZXR9IFRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAqLwogICAgZ2V0IGxvY2FsVGFyZ2V0KCkgewogICAgICByZXR1cm4gdGhpcy5ldmVudC50YXJnZXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBgY29tcG9zZWRQYXRoYCBmb3IgdGhpcyBldmVudC4KICAgICAqIEByZXR1cm4geyFBcnJheTwhRXZlbnRUYXJnZXQ+fSBUaGUgbm9kZXMgdGhpcyBldmVudCBwcm9wYWdhdGVkIHRocm91Z2gKICAgICAqLwogICAgZ2V0IHBhdGgoKSB7CiAgICAgIHJldHVybiB0aGlzLmV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgfQogIH0KCiAgUG9seW1lci5Eb21BcGkgPSBEb21BcGk7CgogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7Ym9vbGVhbj19IGRlZXAKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuY2xvbmVOb2RlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuYXBwZW5kQ2hpbGQ7CiAgLyoqCiAgICogQGZ1bmN0aW9uCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcGFyYW0ge05vZGV9IHJlZkNoaWxkCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLmluc2VydEJlZm9yZTsKICAvKioKICAgKiBAZnVuY3Rpb24KICAgKiBAcGFyYW0geyFOb2RlfSBub2RlCiAgICogQHJldHVybiB7IU5vZGV9CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnJlbW92ZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7IU5vZGV9IG9sZENoaWxkCiAgICogQHBhcmFtIHshTm9kZX0gbmV3Q2hpbGQKICAgKiBAcmV0dXJuIHshTm9kZX0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVwbGFjZUNoaWxkOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUuc2V0QXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lCiAgICogQHJldHVybiB7dm9pZH0KICAgKi8KICBQb2x5bWVyLkRvbUFwaS5wcm90b3R5cGUucmVtb3ZlQXR0cmlidXRlOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4gez9FbGVtZW50fQogICAqLwogIFBvbHltZXIuRG9tQXBpLnByb3RvdHlwZS5xdWVyeVNlbGVjdG9yOwogIC8qKgogICAqIEBmdW5jdGlvbgogICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvcgogICAqIEByZXR1cm4geyFOb2RlTGlzdDwhRWxlbWVudD59CiAgICovCiAgUG9seW1lci5Eb21BcGkucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGw7CgogIC8qKgogICAqIExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8gYWJzdHJhY3QKICAgKiBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NIiB3aGVuIHBvbHlmaWxsaW5nIG9uCiAgICogb2xkZXIgYnJvd3NlcnMuCiAgICoKICAgKiBOb3RlIHRoYXQgaW4gUG9seW1lciAyLnggdXNlIG9mIGBQb2x5bWVyLmRvbWAgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGFuZAogICAqIGluIHRoZSBtYWpvcml0eSBvZiBjYXNlcyBzaW1wbHkgZmFjYWRlcyBkaXJlY3RseSB0byB0aGUgc3RhbmRhcmQgbmF0aXZlCiAgICogQVBJLgogICAqCiAgICogQG5hbWVzcGFjZQogICAqIEBzdW1tYXJ5IExlZ2FjeSBET00gYW5kIEV2ZW50IG1hbmlwdWxhdGlvbiBBUEkgd3JhcHBlciBmYWN0b3J5IHVzZWQgdG8KICAgKiBhYnN0cmFjdCBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NLiIKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBwYXJhbSB7KE5vZGV8RXZlbnQpPX0gb2JqIE5vZGUgb3IgZXZlbnQgdG8gb3BlcmF0ZSBvbgogICAqIEByZXR1cm4geyFEb21BcGl8IUV2ZW50QXBpfSBXcmFwcGVyIHByb3ZpZGluZyBlaXRoZXIgbm9kZSBBUEkgb3IgZXZlbnQgQVBJCiAgICovCiAgUG9seW1lci5kb20gPSBmdW5jdGlvbihvYmopIHsKICAgIG9iaiA9IG9iaiB8fCBkb2N1bWVudDsKICAgIGlmICghb2JqLl9fZG9tQXBpKSB7CiAgICAgIGxldCBoZWxwZXI7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFdmVudCkgewogICAgICAgIGhlbHBlciA9IG5ldyBFdmVudEFwaShvYmopOwogICAgICB9IGVsc2UgewogICAgICAgIGhlbHBlciA9IG5ldyBEb21BcGkob2JqKTsKICAgICAgfQogICAgICBvYmouX19kb21BcGkgPSBoZWxwZXI7CiAgICB9CiAgICByZXR1cm4gb2JqLl9fZG9tQXBpOwogIH07CgogIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvciA9IG1hdGNoZXNTZWxlY3RvcjsKCiAgLyoqCiAgICogRm9yY2VzIHNldmVyYWwgY2xhc3NlcyBvZiBhc3luY2hyb25vdXNseSBxdWV1ZWQgdGFza3MgdG8gZmx1c2g6CiAgICogLSBEZWJvdW5jZXJzIGFkZGVkIHZpYSBgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyYAogICAqIC0gU2hhZHlET00gZGlzdHJpYnV0aW9uCiAgICoKICAgKiBUaGlzIG1ldGhvZCBmYWNhZGVzIHRvIGBQb2x5bWVyLmZsdXNoYC4KICAgKgogICAqIEBtZW1iZXJvZiBQb2x5bWVyLmRvbQogICAqLwogIFBvbHltZXIuZG9tLmZsdXNoID0gUG9seW1lci5mbHVzaDsKCiAgLyoqCiAgICogQWRkcyBhIGBQb2x5bWVyLkRlYm91bmNlcmAgdG8gYSBsaXN0IG9mIGdsb2JhbGx5IGZsdXNoYWJsZSB0YXNrcy4KICAgKgogICAqIFRoaXMgbWV0aG9kIGZhY2FkZXMgdG8gYFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcmAuCiAgICoKICAgKiBAbWVtYmVyb2YgUG9seW1lci5kb20KICAgKiBAcGFyYW0geyFQb2x5bWVyLkRlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICovCiAgUG9seW1lci5kb20uYWRkRGVib3VuY2VyID0gUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyOwp9KSgpOwoKCihmdW5jdGlvbigpIHsKCiAgJ3VzZSBzdHJpY3QnOwoKICBsZXQgc3R5bGVJbnRlcmZhY2UgPSB3aW5kb3cuU2hhZHlDU1M7CgogIC8qKgogICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBQb2x5bWVyJ3MgImxlZ2FjeSIgQVBJIGludGVuZGVkIHRvIGJlCiAgICogYmFja3dhcmQtY29tcGF0aWJsZSB0byB0aGUgZ3JlYXRlc3QgZXh0ZW50IHBvc3NpYmxlIHdpdGggdGhlIEFQSQogICAqIGZvdW5kIG9uIHRoZSBQb2x5bWVyIDEueCBgUG9seW1lci5CYXNlYCBwcm90b3R5cGUgYXBwbGllZCB0byBhbGwgZWxlbWVudHMKICAgKiBkZWZpbmVkIHVzaW5nIHRoZSBgUG9seW1lcih7Li4ufSlgIGZ1bmN0aW9uLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5FbGVtZW50TWl4aW4KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzCiAgICogQHByb3BlcnR5IGlzQXR0YWNoZWQge2Jvb2xlYW59IFNldCB0byBgdHJ1ZWAgaW4gdGhpcyBlbGVtZW50J3MKICAgKiAgIGBjb25uZWN0ZWRDYWxsYmFja2AgYW5kIGBmYWxzZWAgaW4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIFBvbHltZXIncyAibGVnYWN5IiBBUEkKICAgKi8KICBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0VsZW1lbnRNaXhpbn0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0dlc3R1cmVFdmVudExpc3RlbmVyc30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0Rpck1peGlufQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgbGVnYWN5RWxlbWVudEJhc2UgPSBQb2x5bWVyLkRpck1peGluKFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzKFBvbHltZXIuRWxlbWVudE1peGluKGJhc2UpKSk7CgogICAgLyoqCiAgICAgKiBNYXAgb2Ygc2ltcGxlIG5hbWVzIHRvIHRvdWNoIGFjdGlvbiBuYW1lcwogICAgICogQGRpY3QKICAgICAqLwogICAgY29uc3QgRElSRUNUSU9OX01BUCA9IHsKICAgICAgJ3gnOiAncGFuLXgnLAogICAgICAneSc6ICdwYW4teScsCiAgICAgICdub25lJzogJ25vbmUnLAogICAgICAnYWxsJzogJ2F1dG8nCiAgICB9OwoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBtaXhpbkNsYXNzCiAgICAgKiBAZXh0ZW5kcyB7bGVnYWN5RWxlbWVudEJhc2V9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9MZWdhY3lFbGVtZW50TWl4aW59CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIExlZ2FjeUVsZW1lbnQgZXh0ZW5kcyBsZWdhY3lFbGVtZW50QmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICB0aGlzLmlzQXR0YWNoZWQ7CiAgICAgICAgLyoqIEB0eXBlIHtXZWFrTWFwPCFFbGVtZW50LCAhT2JqZWN0PHN0cmluZywgIUZ1bmN0aW9uPj59ICovCiAgICAgICAgdGhpcy5fX2JvdW5kTGlzdGVuZXJzOwogICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgRnVuY3Rpb24+fSAqLwogICAgICAgIHRoaXMuX2RlYm91bmNlcnM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBgaW1wb3J0TWV0YWAgZnJvbSB0aGUgcHJvdG90eXBlIChpLmUuIGZyb20gdGhlIGluZm8gb2JqZWN0CiAgICAgICAqIHBhc3NlZCB0byBgUG9seW1lcih7Li4ufSlgKSB0byB0aGUgc3RhdGljIEFQSS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IU9iamVjdH0gVGhlIGBpbXBvcnQubWV0YWAgb2JqZWN0IHNldCBvbiB0aGUgcHJvdG90eXBlCiAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGB0aGlzYCBpcyBhbHdheXMgaW4gdGhlIGluc3RhbmNlIGluCiAgICAgICAqICBjbG9zdXJlIGZvciBzb21lIHJlYXNvbiBldmVuIGluIGEgc3RhdGljIG1ldGhvZCwgcmF0aGVyIHRoYW4gdGhlIGNsYXNzCiAgICAgICAqLwogICAgICBzdGF0aWMgZ2V0IGltcG9ydE1ldGEoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLmltcG9ydE1ldGE7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBMZWdhY3kgY2FsbGJhY2sgY2FsbGVkIGR1cmluZyB0aGUgYGNvbnN0cnVjdG9yYCwgZm9yIG92ZXJyaWRpbmcKICAgICAgICogYnkgdGhlIHVzZXIuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjcmVhdGVkKCkge30KCiAgICAgIC8qKgogICAgICAgKiBQcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBgY29ubmVjdGVkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgUG9seW1lciBsZWdhY3kgQVBJJ3MgYGF0dGFjaGVkYCBtZXRob2QuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICB0aGlzLmlzQXR0YWNoZWQgPSB0cnVlOwogICAgICAgIHRoaXMuYXR0YWNoZWQoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBjb25uZWN0ZWRDYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgYXR0YWNoZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAgICogd2hpY2ggYWRkcyBQb2x5bWVyIGxlZ2FjeSBBUEkncyBgZGV0YWNoZWRgIG1ldGhvZC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIHRoaXMuaXNBdHRhY2hlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuZGV0YWNoZWQoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGV0YWNoZWQoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVzIGFuIG92ZXJyaWRlIGltcGxlbWVudGF0aW9uIG9mIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgCiAgICAgICAqIHdoaWNoIGFkZHMgdGhlIFBvbHltZXIgbGVnYWN5IEFQSSdzIGBhdHRyaWJ1dGVDaGFuZ2VkYCBtZXRob2QuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIEN1cnJlbnQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG5hbWVzcGFjZSBBdHRyaWJ1dGUgbmFtZXNwYWNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpIHsKICAgICAgICBpZiAob2xkICE9PSB2YWx1ZSkgewogICAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSk7CiAgICAgICAgICB0aGlzLmF0dHJpYnV0ZUNoYW5nZWQobmFtZSwgb2xkLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogTGVnYWN5IGNhbGxiYWNrIGNhbGxlZCBkdXJpbmcgYGF0dHJpYnV0ZUNoYW5nZWRDaGFsbGJhY2tgLCBmb3Igb3ZlcnJpZGluZwogICAgICAgKiBieSB0aGUgdXNlci4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gb2xkIE9sZCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgQ3VycmVudCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkKG5hbWUsIG9sZCwgdmFsdWUpIHt9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZXMgdGhlIGRlZmF1bHQgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBpbXBsZW1lbnRhdGlvbiB0bwogICAgICAgKiBhZGQgc3VwcG9ydCBmb3IgY2xhc3MgaW5pdGlhbGl6YXRpb24gdmlhIHRoZSBgX3JlZ2lzdGVyZWRgIGNhbGxiYWNrLgogICAgICAgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICovCiAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICBsZXQgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7CiAgICAgICAgaWYgKCFwcm90by5oYXNPd25Qcm9wZXJ0eSgnX19oYXNSZWdpc3RlckZpbmlzaGVkJykpIHsKICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWQoKTsKICAgICAgICAgIC8vIGJhY2tzdG9wIGluIGNhc2UgdGhlIGBfcmVnaXN0ZXJlZGAgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2V0IHRoaXMKICAgICAgICAgIHByb3RvLl9faGFzUmVnaXN0ZXJGaW5pc2hlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgIHRoaXMucm9vdCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovKHRoaXMpOwogICAgICAgIHRoaXMuY3JlYXRlZCgpOwogICAgICAgIC8vIEVuc3VyZSBsaXN0ZW5lcnMgYXJlIGFwcGxpZWQgaW1tZWRpYXRlbHkgc28gdGhhdCB0aGV5IGFyZQogICAgICAgIC8vIGFkZGVkIGJlZm9yZSBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMuIFRoaXMgYWxsb3dzIGFuIGVsZW1lbnQgdG8KICAgICAgICAvLyBkZWNvcmF0ZSBpdHNlbGYgdmlhIGFuIGV2ZW50IHByaW9yIHRvIGFueSBkZWNsYXJhdGl2ZSBsaXN0ZW5lcnMKICAgICAgICAvLyBzZWVpbmcgdGhlIGV2ZW50LiBOb3RlLCB0aGlzIGVuc3VyZXMgY29tcGF0aWJpbGl0eSB3aXRoIDEueCBvcmRlcmluZy4KICAgICAgICB0aGlzLl9hcHBseUxpc3RlbmVycygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiBhbiBlbGVtZW50IGlzIGluaXRpYWxpemluZy4KICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gY2xhc3MgcmVnaXN0cmF0aW9uIHRpbWUKICAgICAgICogd29yay4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBlbnN1cmUgdGhlIHdvcmsgaXMgcGVyZm9ybWVkCiAgICAgICAqIG9ubHkgb25jZSBmb3IgdGhlIGNsYXNzLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfcmVnaXN0ZXJlZCgpIHt9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIHRoZSBkZWZhdWx0IGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgaW1wbGVtZW50YXRpb24gdG8KICAgICAgICogYWRkIHN1cHBvcnQgZm9yIGluc3RhbGxpbmcgYGhvc3RBdHRyaWJ1dGVzYCBhbmQgYGxpc3RlbmVyc2AuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgcmVhZHkoKSB7CiAgICAgICAgdGhpcy5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnN1cmVzIGFuIGVsZW1lbnQgaGFzIHJlcXVpcmVkIGF0dHJpYnV0ZXMuIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50CiAgICAgICAqIGlzIGJlaW5nIHJlYWRpZWQgdmlhIGByZWFkeWAuIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0byBzZXQgdGhlCiAgICAgICAqIGVsZW1lbnQncyByZXF1aXJlZCBhdHRyaWJ1dGVzLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHN1cmUKICAgICAgICogdG8gY2hlY2sgYW5kIG5vdCBvdmVycmlkZSBleGlzdGluZyBhdHRyaWJ1dGVzIGFkZGVkIGJ5CiAgICAgICAqIHRoZSB1c2VyIG9mIHRoZSBlbGVtZW50LiBUeXBpY2FsbHksIHNldHRpbmcgYXR0cmlidXRlcyBzaG91bGQgYmUgbGVmdAogICAgICAgKiB0byB0aGUgZWxlbWVudCB1c2VyIGFuZCBub3QgZG9uZSBoZXJlOyByZWFzb25hYmxlIGV4Y2VwdGlvbnMgaW5jbHVkZQogICAgICAgKiBzZXR0aW5nIGFyaWEgcm9sZXMgYW5kIGZvY3VzYWJpbGl0eS4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2Vuc3VyZUF0dHJpYnV0ZXMoKSB7fQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgZWxlbWVudCBldmVudCBsaXN0ZW5lcnMuIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50CiAgICAgICAqIGlzIGJlaW5nIHJlYWRpZWQgdmlhIGByZWFkeWAuIFVzZXJzIHNob3VsZCBvdmVycmlkZSB0bwogICAgICAgKiBhZGQgYW55IHJlcXVpcmVkIGVsZW1lbnQgZXZlbnQgbGlzdGVuZXJzLgogICAgICAgKiBJbiBwZXJmb3JtYW5jZSBjcml0aWNhbCBlbGVtZW50cywgdGhlIHdvcmsgZG9uZSBoZXJlIHNob3VsZCBiZSBrZXB0CiAgICAgICAqIHRvIGEgbWluaW11bSBzaW5jZSBpdCBpcyBkb25lIGJlZm9yZSB0aGUgZWxlbWVudCBpcyByZW5kZXJlZC4gSW4KICAgICAgICogdGhlc2UgZWxlbWVudHMsIGNvbnNpZGVyIGFkZGluZyBsaXN0ZW5lcnMgYXN5bmNocm9ub3VzbHkgc28gYXMgbm90IHRvCiAgICAgICAqIGJsb2NrIHJlbmRlci4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2FwcGx5TGlzdGVuZXJzKCkge30KCiAgICAgIC8qKgogICAgICAgKiBDb252ZXJ0cyBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUgdG8gYSBzdHJpbmcuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLiBUbyBjdXN0b21pemUKICAgICAgICogaG93IHByb3BlcnRpZXMgYXJlIHNlcmlhbGl6ZWQgdG8gYXR0cmlidXRlcyBmb3IgYXR0cmlidXRlIGJpbmRpbmdzIGFuZAogICAgICAgKiBgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlYCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgdGhpcyBtZXRob2QsIG92ZXJyaWRlCiAgICAgICAqIHRoZSBgX3NlcmlhbGl6ZVZhbHVlYCBtZXRob2QgcHJvdmlkZWQgYnkgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplCiAgICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gU2VyaWFsaXplZCB2YWx1ZQogICAgICAgKi8KICAgICAgc2VyaWFsaXplKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuICBUbyBjdXN0b21pemUKICAgICAgICogaG93IGF0dHJpYnV0ZXMgYXJlIGRlc2VyaWFsaXplZCB0byBwcm9wZXJ0aWVzIGZvciBpbgogICAgICAgKiBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCwgb3ZlcnJpZGUgYF9kZXNlcmlhbGl6ZVZhbHVlYCBtZXRob2QKICAgICAgICogcHJvdmlkZWQgYnkgYFBvbHltZXIuUHJvcGVydHlBY2Nlc3NvcnNgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgU3RyaW5nIHRvIGRlc2VyaWFsaXplCiAgICAgICAqIEBwYXJhbSB7Kn0gdHlwZSBUeXBlIHRvIGRlc2VyaWFsaXplIHRoZSBzdHJpbmcgdG8KICAgICAgICogQHJldHVybiB7Kn0gUmV0dXJucyB0aGUgZGVzZXJpYWxpemVkIHZhbHVlIGluIHRoZSBgdHlwZWAgZ2l2ZW4uCiAgICAgICAqLwogICAgICBkZXNlcmlhbGl6ZSh2YWx1ZSwgdHlwZSkgewogICAgICAgIHJldHVybiB0aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlcmlhbGl6ZXMgYSBwcm9wZXJ0eSB0byBpdHMgYXNzb2NpYXRlZCBhdHRyaWJ1dGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZSB0byByZWZsZWN0LgogICAgICAgKiBAcGFyYW0ge3N0cmluZz19IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byByZWZsZWN0LgogICAgICAgKiBAcGFyYW0geyo9fSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byByZWZsZWN0LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVmbGVjdFByb3BlcnR5VG9BdHRyaWJ1dGUocHJvcGVydHksIGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICB0aGlzLl9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBhdHRyaWJ1dGUsIHZhbHVlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNldHMgYSB0eXBlZCB2YWx1ZSB0byBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBhIG5vZGUuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZSBBdHRyaWJ1dGUgbmFtZSB0byBzZXJpYWxpemUgdG8uCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIHNldCBhdHRyaWJ1dGUgdG8uCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzZXJpYWxpemVWYWx1ZVRvQXR0cmlidXRlKHZhbHVlLCBhdHRyaWJ1dGUsIG5vZGUpIHsKICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZSgvKiogQHR5cGUge0VsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpLCB2YWx1ZSwgYXR0cmlidXRlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvcGllcyBvd24gcHJvcGVydGllcyAoaW5jbHVkaW5nIGFjY2Vzc29yIGRlc2NyaXB0b3JzKSBmcm9tIGEgc291cmNlCiAgICAgICAqIG9iamVjdCB0byBhIHRhcmdldCBvYmplY3QuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcGkgU291cmNlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS4KICAgICAgICogQHJldHVybiB7T2JqZWN0fSBwcm90b3R5cGUgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCBhcyBmaXJzdCBhcmd1bWVudC4KICAgICAgICovCiAgICAgIGV4dGVuZChwcm90b3R5cGUsIGFwaSkgewogICAgICAgIGlmICghKHByb3RvdHlwZSAmJiBhcGkpKSB7CiAgICAgICAgICByZXR1cm4gcHJvdG90eXBlIHx8IGFwaTsKICAgICAgICB9CiAgICAgICAgbGV0IG4kID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoYXBpKTsKICAgICAgICBmb3IgKGxldCBpPTAsIG47IChpPG4kLmxlbmd0aCkgJiYgKG49biRbaV0pOyBpKyspIHsKICAgICAgICAgIGxldCBwZCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoYXBpLCBuKTsKICAgICAgICAgIGlmIChwZCkgewogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBuLCBwZCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwcm90b3R5cGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb3BpZXMgcHJvcHMgZnJvbSBhIHNvdXJjZSBvYmplY3QgdG8gYSB0YXJnZXQgb2JqZWN0LgogICAgICAgKgogICAgICAgKiBOb3RlLCB0aGlzIG1ldGhvZCB1c2VzIGEgc2ltcGxlIGBmb3IuLi5pbmAgc3RyYXRlZ3kgZm9yIGVudW1lcmF0aW5nCiAgICAgICAqIHByb3BlcnRpZXMuICBUbyBlbnN1cmUgb25seSBgb3duUHJvcGVydGllc2AgYXJlIGNvcGllZCBmcm9tIHNvdXJjZQogICAgICAgKiB0byB0YXJnZXQgYW5kIHRoYXQgYWNjZXNzb3IgaW1wbGVtZW50YXRpb25zIGFyZSBjb3BpZWQsIHVzZSBgZXh0ZW5kYC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshT2JqZWN0fSB0YXJnZXQgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gc291cmNlIFNvdXJjZSBvYmplY3QgdG8gY29weSBwcm9wZXJ0aWVzIGZyb20uCiAgICAgICAqIEByZXR1cm4geyFPYmplY3R9IFRhcmdldCBvYmplY3QgdGhhdCB3YXMgcGFzc2VkIGFzIGZpcnN0IGFyZ3VtZW50LgogICAgICAgKi8KICAgICAgbWl4aW4odGFyZ2V0LCBzb3VyY2UpIHsKICAgICAgICBmb3IgKGxldCBpIGluIHNvdXJjZSkgewogICAgICAgICAgdGFyZ2V0W2ldID0gc291cmNlW2ldOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2V0cyB0aGUgcHJvdG90eXBlIG9mIGFuIG9iamVjdC4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCBvbiB3aGljaCB0byBzZXQgdGhlIHByb3RvdHlwZS4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgcHJvdG90eXBlIHRoYXQgd2lsbCBiZSBzZXQgb24gdGhlIGdpdmVuCiAgICAgICAqIGBvYmplY3RgLgogICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdpdmVuIGBvYmplY3RgIHdpdGggaXRzIHByb3RvdHlwZSBzZXQKICAgICAgICogdG8gdGhlIGdpdmVuIGBwcm90b3R5cGVgIG9iamVjdC4KICAgICAgICovCiAgICAgIGNoYWluT2JqZWN0KG9iamVjdCwgcHJvdG90eXBlKSB7CiAgICAgICAgaWYgKG9iamVjdCAmJiBwcm90b3R5cGUgJiYgb2JqZWN0ICE9PSBwcm90b3R5cGUpIHsKICAgICAgICAgIG9iamVjdC5fX3Byb3RvX18gPSBwcm90b3R5cGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgIH0KCiAgICAgIC8qICoqKiogQmVnaW4gVGVtcGxhdGUgKioqKiAqLwoKICAgICAgLyoqCiAgICAgICAqIENhbGxzIGBpbXBvcnROb2RlYCBvbiB0aGUgYGNvbnRlbnRgIG9mIHRoZSBgdGVtcGxhdGVgIHNwZWNpZmllZCBhbmQKICAgICAgICogcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGltcG9ydGVkIGNvbnRlbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgSFRNTCB0ZW1wbGF0ZSBlbGVtZW50IHRvIGluc3RhbmNlLgogICAgICAgKiBAcmV0dXJuIHshRG9jdW1lbnRGcmFnbWVudH0gRG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyB0aGUgaW1wb3J0ZWQKICAgICAgICogICB0ZW1wbGF0ZSBjb250ZW50LgogICAgICAqLwogICAgICBpbnN0YW5jZVRlbXBsYXRlKHRlbXBsYXRlKSB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLmNvbnN0cnVjdG9yLl9jb250ZW50Rm9yVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIGxldCBkb20gPSAvKiogQHR5cGUgeyFEb2N1bWVudEZyYWdtZW50fSAqLwogICAgICAgICAgKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgIHJldHVybiBkb207CiAgICAgIH0KCiAgICAgIC8qICoqKiogQmVnaW4gRXZlbnRzICoqKiogKi8KCgoKICAgICAgLyoqCiAgICAgICAqIERpc3BhdGNoZXMgYSBjdXN0b20gZXZlbnQgd2l0aCBhbiBvcHRpb25hbCBkZXRhaWwgdmFsdWUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIE5hbWUgb2YgZXZlbnQgdHlwZS4KICAgICAgICogQHBhcmFtIHsqPX0gZGV0YWlsIERldGFpbCB2YWx1ZSBjb250YWluaW5nIGV2ZW50LXNwZWNpZmljCiAgICAgICAqICAgcGF5bG9hZC4KICAgICAgICogQHBhcmFtIHt7IGJ1YmJsZXM6IChib29sZWFufHVuZGVmaW5lZCksIGNhbmNlbGFibGU6IChib29sZWFufHVuZGVmaW5lZCksIGNvbXBvc2VkOiAoYm9vbGVhbnx1bmRlZmluZWQpIH09fQogICAgICAgKiAgb3B0aW9ucyBPYmplY3Qgc3BlY2lmeWluZyBvcHRpb25zLiAgVGhlc2UgbWF5IGluY2x1ZGU6CiAgICAgICAqICBgYnViYmxlc2AgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGB0cnVlYCksCiAgICAgICAqICBgY2FuY2VsYWJsZWAgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGZhbHNlKSwgYW5kCiAgICAgICAqICBgbm9kZWAgb24gd2hpY2ggdG8gZmlyZSB0aGUgZXZlbnQgKEhUTUxFbGVtZW50LCBkZWZhdWx0cyB0byBgdGhpc2ApLgogICAgICAgKiBAcmV0dXJuIHshRXZlbnR9IFRoZSBuZXcgZXZlbnQgdGhhdCB3YXMgZmlyZWQuCiAgICAgICAqLwogICAgICBmaXJlKHR5cGUsIGRldGFpbCwgb3B0aW9ucykgewogICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgIGRldGFpbCA9IChkZXRhaWwgPT09IG51bGwgfHwgZGV0YWlsID09PSB1bmRlZmluZWQpID8ge30gOiBkZXRhaWw7CiAgICAgICAgbGV0IGV2ZW50ID0gbmV3IEV2ZW50KHR5cGUsIHsKICAgICAgICAgIGJ1YmJsZXM6IG9wdGlvbnMuYnViYmxlcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMuYnViYmxlcywKICAgICAgICAgIGNhbmNlbGFibGU6IEJvb2xlYW4ob3B0aW9ucy5jYW5jZWxhYmxlKSwKICAgICAgICAgIGNvbXBvc2VkOiBvcHRpb25zLmNvbXBvc2VkID09PSB1bmRlZmluZWQgPyB0cnVlOiBvcHRpb25zLmNvbXBvc2VkCiAgICAgICAgfSk7CiAgICAgICAgZXZlbnQuZGV0YWlsID0gZGV0YWlsOwogICAgICAgIGxldCBub2RlID0gb3B0aW9ucy5ub2RlIHx8IHRoaXM7CiAgICAgICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICByZXR1cm4gZXZlbnQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gYWRkIGFuIGV2ZW50IGxpc3RlbmVyIG9uIGEgZ2l2ZW4gZWxlbWVudCwKICAgICAgICogbGF0ZSBib3VuZCB0byBhIG5hbWVkIG1ldGhvZCBvbiB0aGlzIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBFbGVtZW50IHRvIGFkZCBldmVudCBsaXN0ZW5lciB0by4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50IHRvIGxpc3RlbiBmb3IuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE5hbWUgb2YgaGFuZGxlciBtZXRob2Qgb24gYHRoaXNgIHRvIGNhbGwuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBsaXN0ZW4obm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7IUVsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpOwogICAgICAgIGxldCBoYmwgPSB0aGlzLl9fYm91bmRMaXN0ZW5lcnMgfHwKICAgICAgICAgICh0aGlzLl9fYm91bmRMaXN0ZW5lcnMgPSBuZXcgV2Vha01hcCgpKTsKICAgICAgICBsZXQgYmwgPSBoYmwuZ2V0KG5vZGUpOwogICAgICAgIGlmICghYmwpIHsKICAgICAgICAgIGJsID0ge307CiAgICAgICAgICBoYmwuc2V0KG5vZGUsIGJsKTsKICAgICAgICB9CiAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgaWYgKCFibFtrZXldKSB7CiAgICAgICAgICBibFtrZXldID0gdGhpcy5fYWRkTWV0aG9kRXZlbnRMaXN0ZW5lclRvTm9kZSgKICAgICAgICAgICAgbm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lLCB0aGlzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYSBnaXZlbiBlbGVtZW50LAogICAgICAgKiBsYXRlIGJvdW5kIHRvIGEgbmFtZWQgbWV0aG9kIG9uIHRoaXMgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBub2RlIEVsZW1lbnQgdG8gcmVtb3ZlIGV2ZW50IGxpc3RlbmVyIGZyb20uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudCB0byBzdG9wIGxpc3RlbmluZyB0by4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBoYW5kbGVyIG1ldGhvZCBvbiBgdGhpc2AgdG8gbm90IGNhbGwKICAgICAgIGFueW1vcmUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB1bmxpc3Rlbihub2RlLCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHshRWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgbGV0IGJsID0gdGhpcy5fX2JvdW5kTGlzdGVuZXJzICYmIHRoaXMuX19ib3VuZExpc3RlbmVycy5nZXQobm9kZSk7CiAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgbGV0IGhhbmRsZXIgPSBibCAmJiBibFtrZXldOwogICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICB0aGlzLl9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIGJsW2tleV0gPSBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHNjcm9sbGluZyBiZWhhdmlvciB0byBhbGwgZGlyZWN0aW9uLCBvbmUgZGlyZWN0aW9uLCBvciBub25lLgogICAgICAgKgogICAgICAgKiBWYWxpZCBzY3JvbGwgZGlyZWN0aW9uczoKICAgICAgICogICAtICdhbGwnOiBzY3JvbGwgaW4gYW55IGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ3gnOiBzY3JvbGwgb25seSBpbiB0aGUgJ3gnIGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ3knOiBzY3JvbGwgb25seSBpbiB0aGUgJ3knIGRpcmVjdGlvbgogICAgICAgKiAgIC0gJ25vbmUnOiBkaXNhYmxlIHNjcm9sbGluZyBmb3IgdGhpcyBub2RlCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gZGlyZWN0aW9uIERpcmVjdGlvbiB0byBhbGxvdyBzY3JvbGxpbmcKICAgICAgICogRGVmYXVsdHMgdG8gYGFsbGAuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgRWxlbWVudCB0byBhcHBseSBzY3JvbGwgZGlyZWN0aW9uIHNldHRpbmcuCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNldFNjcm9sbERpcmVjdGlvbihkaXJlY3Rpb24sIG5vZGUpIHsKICAgICAgICBQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyksIERJUkVDVElPTl9NQVBbZGlyZWN0aW9uXSB8fCAnYXV0bycpOwogICAgICB9CiAgICAgIC8qICoqKiogRW5kIEV2ZW50cyAqKioqICovCgogICAgICAvKioKICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIHRvIHJ1biBgcXVlcnlTZWxlY3RvcmAgb24gdGhpcyBsb2NhbCBET00gc2NvcGUuCiAgICAgICAqCiAgICAgICAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgYFBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcihzbGN0cilgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2xjdHIgU2VsZWN0b3IgdG8gcnVuIG9uIHRoaXMgbG9jYWwgRE9NIHNjb3BlCiAgICAgICAqIEByZXR1cm4ge0VsZW1lbnR9IEVsZW1lbnQgZm91bmQgYnkgdGhlIHNlbGVjdG9yLCBvciBudWxsIGlmIG5vdCBmb3VuZC4KICAgICAgICovCiAgICAgICQkKHNsY3RyKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKHNsY3RyKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybiB0aGUgZWxlbWVudCB3aG9zZSBsb2NhbCBkb20gd2l0aGluIHdoaWNoIHRoaXMgZWxlbWVudAogICAgICAgKiBpcyBjb250YWluZWQuIFRoaXMgaXMgYSBzaG9ydGhhbmQgZm9yCiAgICAgICAqIGB0aGlzLmdldFJvb3ROb2RlKCkuaG9zdGAuCiAgICAgICAqIEB0aGlzIHtFbGVtZW50fQogICAgICAgKi8KICAgICAgZ2V0IGRvbUhvc3QoKSB7CiAgICAgICAgbGV0IHJvb3QgPSB0aGlzLmdldFJvb3ROb2RlKCk7CiAgICAgICAgcmV0dXJuIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkgPyAvKiogQHR5cGUge1NoYWRvd1Jvb3R9ICovIChyb290KS5ob3N0IDogcm9vdDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcmNlIHRoaXMgZWxlbWVudCB0byBkaXN0cmlidXRlIGl0cyBjaGlsZHJlbiB0byBpdHMgbG9jYWwgZG9tLgogICAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IGFzIG9mIFBvbHltZXIgMi4wLjIgYW5kIGlzIHByb3ZpZGVkIG9ubHkKICAgICAgICogZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGlzdHJpYnV0ZUNvbnRlbnQoKSB7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLnNoYWRvd1Jvb3QpIHsKICAgICAgICAgIFNoYWR5RE9NLmZsdXNoKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZE5vZGVzLiBUaGUgZWZmZWN0aXZlCiAgICAgICAqIGNoaWxkTm9kZXMgbGlzdCBpcyB0aGUgc2FtZSBhcyB0aGUgZWxlbWVudCdzIGNoaWxkTm9kZXMgZXhjZXB0IHRoYXQKICAgICAgICogYW55IGA8Y29udGVudD5gIGVsZW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBsaXN0IG9mIG5vZGVzIGRpc3RyaWJ1dGVkCiAgICAgICAqIHRvIHRoZSBgPGNvbnRlbnQ+YCwgdGhlIHJlc3VsdCBvZiBpdHMgYGdldERpc3RyaWJ1dGVkTm9kZXNgIG1ldGhvZC4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGQgbm9kZXMuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBMZWdhY3lFbGVtZW50TWl4aW4gbXVzdCBiZSBhcHBsaWVkIHRvIGFuIEhUTUxFbGVtZW50CiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICAgIGNvbnN0IHRoaXNFbCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKHRoaXMpOwogICAgICAgIGNvbnN0IGRvbUFwaSA9IC8qKiBAdHlwZSB7UG9seW1lci5Eb21BcGl9ICovKFBvbHltZXIuZG9tKHRoaXNFbCkpOwogICAgICAgIHJldHVybiBkb21BcGkuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygbm9kZXMgZGlzdHJpYnV0ZWQgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0IG1hdGNoCiAgICAgICAqIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGRyZW4gb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQgdG8KICAgICAgICogY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBkaXN0cmlidXRlZCBlbGVtZW50cyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30gTGVnYWN5RWxlbWVudE1peGluIG11c3QgYmUgYXBwbGllZCB0byBhbiBIVE1MRWxlbWVudAogICAgICAgKi8KICAgICAgcXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKSB7CiAgICAgICAgY29uc3QgdGhpc0VsID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAodGhpcyk7CiAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtQb2x5bWVyLkRvbUFwaX0gKi8oUG9seW1lci5kb20odGhpc0VsKSk7CiAgICAgICAgcmV0dXJuIGRvbUFwaS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZHJlbi4gVGhlIGVmZmVjdGl2ZQogICAgICAgKiBjaGlsZHJlbiBsaXN0IGlzIHRoZSBzYW1lIGFzIHRoZSBlbGVtZW50J3MgY2hpbGRyZW4gZXhjZXB0IHRoYXQKICAgICAgICogYW55IGA8Y29udGVudD5gIGVsZW1lbnRzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBsaXN0IG9mIGVsZW1lbnRzCiAgICAgICAqIGRpc3RyaWJ1dGVkIHRvIHRoZSBgPGNvbnRlbnQ+YC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGRyZW4uCiAgICAgICAqLwogICAgICBnZXRFZmZlY3RpdmVDaGlsZHJlbigpIHsKICAgICAgICBsZXQgbGlzdCA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIHJldHVybiBsaXN0LmZpbHRlcihmdW5jdGlvbigvKiogQHR5cGUgeyFOb2RlfSAqLyBuKSB7CiAgICAgICAgICByZXR1cm4gKG4ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgb2YgdGV4dCBjb250ZW50IHRoYXQgaXMgdGhlIGNvbmNhdGVuYXRpb24gb2YgdGhlCiAgICAgICAqIHRleHQgY29udGVudCdzIG9mIHRoZSBlbGVtZW50J3MgZWZmZWN0aXZlIGNoaWxkTm9kZXMgKHRoZSBlbGVtZW50cwogICAgICAgKiByZXR1cm5lZCBieSA8YSBocmVmPSIjZ2V0RWZmZWN0aXZlQ2hpbGROb2Rlcz5nZXRFZmZlY3RpdmVDaGlsZE5vZGVzPC9hPi4KICAgICAgICoKICAgICAgICogQHJldHVybiB7c3RyaW5nfSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZHJlbi4KICAgICAgICovCiAgICAgIGdldEVmZmVjdGl2ZVRleHRDb250ZW50KCkgewogICAgICAgIGxldCBjbiA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIGxldCB0YyA9IFtdOwogICAgICAgIGZvciAobGV0IGk9MCwgYzsgKGMgPSBjbltpXSk7IGkrKykgewogICAgICAgICAgaWYgKGMubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIHRjLnB1c2goYy50ZXh0Q29udGVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0Yy5qb2luKCcnKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGZpcnN0IGVmZmVjdGl2ZSBjaGlsZE5vZGUgd2l0aGluIHRoaXMgZWxlbWVudCB0aGF0CiAgICAgICAqIG1hdGNoIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGQgbm9kZXMgb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQKICAgICAgICogdG8gY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHJ1bi4KICAgICAgICogQHJldHVybiB7Tm9kZX0gRmlyc3QgZWZmZWN0aXZlIGNoaWxkIG5vZGUgdGhhdCBtYXRjaGVzIHNlbGVjdG9yLgogICAgICAgKi8KICAgICAgcXVlcnlFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgIGxldCBlJCA9IHRoaXMucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKTsKICAgICAgICByZXR1cm4gZSQgJiYgZSRbMF07CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBlZmZlY3RpdmUgY2hpbGROb2RlcyB3aXRoaW4gdGhpcyBlbGVtZW50IHRoYXQKICAgICAgICogbWF0Y2ggYHNlbGVjdG9yYC4gVGhlc2UgY2FuIGJlIGRvbSBjaGlsZCBub2RlcyBvciBlbGVtZW50cyBkaXN0cmlidXRlZAogICAgICAgKiB0byBjaGlsZHJlbiB0aGF0IGFyZSBpbnNlcnRpb24gcG9pbnRzLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgU2VsZWN0b3IgdG8gcnVuLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IU5vZGU+fSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZCBub2RlcyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgKi8KICAgICAgcXVlcnlBbGxFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3Rvcik7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBub2RlcyBkaXN0cmlidXRlZCB0byB0aGlzIGVsZW1lbnQncyBgPHNsb3Q+YC4KICAgICAgICoKICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzIGxvY2FsIERPTSwKICAgICAgICogYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQgY29udGVudC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBzbGN0ciBDU1Mgc2VsZWN0b3IgdG8gY2hvb3NlIHRoZSBkZXNpcmVkCiAgICAgICAqICAgYDxzbG90PmAuICBEZWZhdWx0cyB0byBgY29udGVudGAuCiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IExpc3Qgb2YgZGlzdHJpYnV0ZWQgbm9kZXMgZm9yIHRoZSBgPHNsb3Q+YC4KICAgICAgICovCiAgICAgIGdldENvbnRlbnRDaGlsZE5vZGVzKHNsY3RyKSB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcihzbGN0ciB8fCAnc2xvdCcpOwogICAgICAgIHJldHVybiBjb250ZW50ID8gLyoqIEB0eXBlIHtQb2x5bWVyLkRvbUFwaX0gKi8oUG9seW1lci5kb20oY29udGVudCkpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSA6IFtdOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudCBjaGlsZHJlbiBkaXN0cmlidXRlZCB0byB0aGlzIGVsZW1lbnQncwogICAgICAgKiBgPHNsb3Q+YC4KICAgICAgICoKICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzCiAgICAgICAqIGxvY2FsIERPTSwgYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQKICAgICAgICogY29udGVudC4gIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgZ2V0Q29udGVudENoaWxkTm9kZXNgIGluIHRoYXQgb25seQogICAgICAgKiBlbGVtZW50cyBhcmUgcmV0dXJuZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gc2xjdHIgQ1NTIHNlbGVjdG9yIHRvIGNob29zZSB0aGUgZGVzaXJlZAogICAgICAgKiAgIGA8Y29udGVudD5gLiAgRGVmYXVsdHMgdG8gYGNvbnRlbnRgLgogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gTGlzdCBvZiBkaXN0cmlidXRlZCBub2RlcyBmb3IgdGhlCiAgICAgICAqICAgYDxzbG90PmAuCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgZ2V0Q29udGVudENoaWxkcmVuKHNsY3RyKSB7CiAgICAgICAgbGV0IGNoaWxkcmVuID0gLyoqIEB0eXBlIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gKi8odGhpcy5nZXRDb250ZW50Q2hpbGROb2RlcyhzbGN0cikuZmlsdGVyKGZ1bmN0aW9uKG4pIHsKICAgICAgICAgIHJldHVybiAobi5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gY2hpbGRyZW47CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDaGVja3Mgd2hldGhlciBhbiBlbGVtZW50IGlzIGluIHRoaXMgZWxlbWVudCdzIGxpZ2h0IERPTSB0cmVlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0gez9Ob2RlfSBub2RlIFRoZSBlbGVtZW50IHRvIGJlIGNoZWNrZWQuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgbm9kZSBpcyBpbiB0aGlzIGVsZW1lbnQncyBsaWdodCBET00gdHJlZS4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIGlzTGlnaHREZXNjZW5kYW50KG5vZGUpIHsKICAgICAgICBjb25zdCB0aGlzTm9kZSA9IC8qKiBAdHlwZSB7Tm9kZX0gKi8gKHRoaXMpOwogICAgICAgIHJldHVybiB0aGlzTm9kZSAhPT0gbm9kZSAmJiB0aGlzTm9kZS5jb250YWlucyhub2RlKSAmJgogICAgICAgICAgdGhpc05vZGUuZ2V0Um9vdE5vZGUoKSA9PT0gbm9kZS5nZXRSb290Tm9kZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBpbiB0aGlzIGVsZW1lbnQncyBsb2NhbCBET00gdHJlZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshRWxlbWVudH0gbm9kZSBUaGUgZWxlbWVudCB0byBiZSBjaGVja2VkLgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG5vZGUgaXMgaW4gdGhpcyBlbGVtZW50J3MgbG9jYWwgRE9NIHRyZWUuCiAgICAgICAqLwogICAgICBpc0xvY2FsRGVzY2VuZGFudChub2RlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucm9vdCA9PT0gbm9kZS5nZXRSb290Tm9kZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTm8tb3AgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGlzIHNob3VsZCBub3cgYmUgaGFuZGxlZCBieQogICAgICAgKiBTaGFkeUNzcyBsaWJyYXJ5LgogICAgICAgKiBAcGFyYW0gIHsqfSBjb250YWluZXIgVW51c2VkCiAgICAgICAqIEBwYXJhbSAgeyp9IHNob3VsZE9ic2VydmUgVW51c2VkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBzY29wZVN1YnRyZWUoY29udGFpbmVyLCBzaG91bGRPYnNlcnZlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGNvbXB1dGVkIHN0eWxlIHZhbHVlIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBUaGUgY3NzIHByb3BlcnR5IG5hbWUuCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gUmV0dXJucyB0aGUgY29tcHV0ZWQgY3NzIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgZ2l2ZW4KICAgICAgICogYHByb3BlcnR5YC4KICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4gSFRNTEVsZW1lbnQKICAgICAgICovCiAgICAgIGdldENvbXB1dGVkU3R5bGVWYWx1ZShwcm9wZXJ0eSkgewogICAgICAgIHJldHVybiBzdHlsZUludGVyZmFjZS5nZXRDb21wdXRlZFN0eWxlVmFsdWUoLyoqIEB0eXBlIHshRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnR5KTsKICAgICAgfQoKICAgICAgLy8gZGVib3VuY2UKCiAgICAgIC8qKgogICAgICAgKiBDYWxsIGBkZWJvdW5jZWAgdG8gY29sbGFwc2UgbXVsdGlwbGUgcmVxdWVzdHMgZm9yIGEgbmFtZWQgdGFzayBpbnRvCiAgICAgICAqIG9uZSBpbnZvY2F0aW9uIHdoaWNoIGlzIG1hZGUgYWZ0ZXIgdGhlIHdhaXQgdGltZSBoYXMgZWxhcHNlZCB3aXRoCiAgICAgICAqIG5vIG5ldyByZXF1ZXN0LiAgSWYgbm8gd2FpdCB0aW1lIGlzIGdpdmVuLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQKICAgICAgICogYXQgbWljcm90YXNrIHRpbWluZyAoZ3VhcmFudGVlZCBiZWZvcmUgcGFpbnQpLgogICAgICAgKgogICAgICAgKiAgICAgZGVib3VuY2VkQ2xpY2tBY3Rpb24oZSkgewogICAgICAgKiAgICAgICAvLyB3aWxsIG5vdCBjYWxsIGBwcm9jZXNzQ2xpY2tgIG1vcmUgdGhhbiBvbmNlIHBlciAxMDBtcwogICAgICAgKiAgICAgICB0aGlzLmRlYm91bmNlKCdjbGljaycsIGZ1bmN0aW9uKCkgewogICAgICAgKiAgICAgICAgdGhpcy5wcm9jZXNzQ2xpY2soKTsKICAgICAgICogICAgICAgfSAxMDApOwogICAgICAgKiAgICAgfQogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gam9iTmFtZSBTdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGRlYm91bmNlIGpvYi4KICAgICAgICogQHBhcmFtIHtmdW5jdGlvbigpOnZvaWR9IGNhbGxiYWNrIEZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkICh3aXRoIGB0aGlzYAogICAgICAgKiAgIGNvbnRleHQpIHdoZW4gdGhlIHdhaXQgdGltZSBlbGFwc2VzLgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBPcHRpb25hbCB3YWl0IHRpbWUgaW4gbWlsbGlzZWNvbmRzIChtcykgYWZ0ZXIgdGhlCiAgICAgICAqICAgbGFzdCBzaWduYWwgdGhhdCBtdXN0IGVsYXBzZSBiZWZvcmUgaW52b2tpbmcgYGNhbGxiYWNrYAogICAgICAgKiBAcmV0dXJuIHshT2JqZWN0fSBSZXR1cm5zIGEgZGVib3VuY2VyIG9iamVjdCBvbiB3aGljaCBleGlzdHMgdGhlCiAgICAgICAqIGZvbGxvd2luZyBtZXRob2RzOiBgaXNBY3RpdmUoKWAgcmV0dXJucyB0cnVlIGlmIHRoZSBkZWJvdW5jZXIgaXMKICAgICAgICogYWN0aXZlOyBgY2FuY2VsKClgIGNhbmNlbHMgdGhlIGRlYm91bmNlciBpZiBpdCBpcyBhY3RpdmU7CiAgICAgICAqIGBmbHVzaCgpYCBpbW1lZGlhdGVseSBpbnZva2VzIHRoZSBkZWJvdW5jZWQgY2FsbGJhY2sgaWYgdGhlIGRlYm91bmNlcgogICAgICAgKiBpcyBhY3RpdmUuCiAgICAgICAqLwogICAgICBkZWJvdW5jZShqb2JOYW1lLCBjYWxsYmFjaywgd2FpdCkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIHJldHVybiB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdID0gUG9seW1lci5EZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICAgICAgdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXQogICAgICAgICAgICAsIHdhaXQgPiAwID8gUG9seW1lci5Bc3luYy50aW1lT3V0LmFmdGVyKHdhaXQpIDogUG9seW1lci5Bc3luYy5taWNyb1Rhc2sKICAgICAgICAgICAgLCBjYWxsYmFjay5iaW5kKHRoaXMpKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciBhIG5hbWVkIGRlYm91bmNlciBpcyBhY3RpdmUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqb2JOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZWJvdW5jZXIgc3RhcnRlZCB3aXRoIGBkZWJvdW5jZWAKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZSAoaGFzIG5vdCB5ZXQgZmlyZWQpLgogICAgICAgKi8KICAgICAgaXNEZWJvdW5jZXJBY3RpdmUoam9iTmFtZSkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgIHJldHVybiAhIShkZWJvdW5jZXIgJiYgZGVib3VuY2VyLmlzQWN0aXZlKCkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogSW1tZWRpYXRlbHkgY2FsbHMgdGhlIGRlYm91bmNlciBgY2FsbGJhY2tgIGFuZCBpbmFjdGl2YXRlcyBpdC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRlYm91bmNlciBzdGFydGVkIHdpdGggYGRlYm91bmNlYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZmx1c2hEZWJvdW5jZXIoam9iTmFtZSkgewogICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgIGlmIChkZWJvdW5jZXIpIHsKICAgICAgICAgIGRlYm91bmNlci5mbHVzaCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlci4gIFRoZSBgY2FsbGJhY2tgIHdpbGwgbm90IGJlIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGpvYk5hbWUgVGhlIG5hbWUgb2YgdGhlIGRlYm91bmNlciBzdGFydGVkIHdpdGggYGRlYm91bmNlYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsRGVib3VuY2VyKGpvYk5hbWUpIHsKICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICBsZXQgZGVib3VuY2VyID0gdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXTsKICAgICAgICBpZiAoZGVib3VuY2VyKSB7CiAgICAgICAgICBkZWJvdW5jZXIuY2FuY2VsKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUnVucyBhIGNhbGxiYWNrIGZ1bmN0aW9uIGFzeW5jaHJvbm91c2x5LgogICAgICAgKgogICAgICAgKiBCeSBkZWZhdWx0IChpZiBubyB3YWl0VGltZSBpcyBzcGVjaWZpZWQpLCBhc3luYyBjYWxsYmFja3MgYXJlIHJ1biBhdAogICAgICAgKiBtaWNyb3Rhc2sgdGltaW5nLCB3aGljaCB3aWxsIG9jY3VyIGJlZm9yZSBwYWludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBydW4sIGJvdW5kIHRvIGB0aGlzYC4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSB3YWl0VGltZSBUaW1lIHRvIHdhaXQgYmVmb3JlIGNhbGxpbmcgdGhlCiAgICAgICAqICAgYGNhbGxiYWNrYC4gIElmIHVuc3BlY2lmaWVkIG9yIDAsIHRoZSBjYWxsYmFjayB3aWxsIGJlIHJ1biBhdCBtaWNyb3Rhc2sKICAgICAgICogICB0aW1pbmcgKGJlZm9yZSBwYWludCkuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gSGFuZGxlIHRoYXQgbWF5IGJlIHVzZWQgdG8gY2FuY2VsIHRoZSBhc3luYyBqb2IuCiAgICAgICAqLwogICAgICBhc3luYyhjYWxsYmFjaywgd2FpdFRpbWUpIHsKICAgICAgICByZXR1cm4gd2FpdFRpbWUgPiAwID8gUG9seW1lci5Bc3luYy50aW1lT3V0LnJ1bihjYWxsYmFjay5iaW5kKHRoaXMpLCB3YWl0VGltZSkgOgogICAgICAgICAgICB+UG9seW1lci5Bc3luYy5taWNyb1Rhc2sucnVuKGNhbGxiYWNrLmJpbmQodGhpcykpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhbiBhc3luYyBvcGVyYXRpb24gc3RhcnRlZCB3aXRoIGBhc3luY2AuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gb3JpZ2luYWwgYGFzeW5jYCBjYWxsIHRvCiAgICAgICAqICAgY2FuY2VsLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsQXN5bmMoaGFuZGxlKSB7CiAgICAgICAgaGFuZGxlIDwgMCA/IFBvbHltZXIuQXN5bmMubWljcm9UYXNrLmNhbmNlbCh+aGFuZGxlKSA6CiAgICAgICAgICAgIFBvbHltZXIuQXN5bmMudGltZU91dC5jYW5jZWwoaGFuZGxlKTsKICAgICAgfQoKICAgICAgLy8gb3RoZXIKCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGNyZWF0aW5nIGFuIGVsZW1lbnQgYW5kIGNvbmZpZ3VyaW5nIGl0LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIEhUTUwgZWxlbWVudCB0YWcgdG8gY3JlYXRlLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BzIE9iamVjdCBvZiBwcm9wZXJ0aWVzIHRvIGNvbmZpZ3VyZSBvbiB0aGUKICAgICAgICogICAgaW5zdGFuY2UuCiAgICAgICAqIEByZXR1cm4geyFFbGVtZW50fSBOZXdseSBjcmVhdGVkIGFuZCBjb25maWd1cmVkIGVsZW1lbnQuCiAgICAgICAqLwogICAgICBjcmVhdGUodGFnLCBwcm9wcykgewogICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICBpZiAoZWx0LnNldFByb3BlcnRpZXMpIHsKICAgICAgICAgICAgZWx0LnNldFByb3BlcnRpZXMocHJvcHMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZm9yIChsZXQgbiBpbiBwcm9wcykgewogICAgICAgICAgICAgIGVsdFtuXSA9IHByb3BzW25dOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBlbHQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIGltcG9ydGluZyBhbiBIVE1MIGRvY3VtZW50IGltcGVyYXRpdmVseS4KICAgICAgICoKICAgICAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIG5ldyBgPGxpbmsgcmVsPSJpbXBvcnQiPmAgZWxlbWVudCB3aXRoCiAgICAgICAqIHRoZSBwcm92aWRlZCBVUkwgYW5kIGFwcGVuZHMgaXQgdG8gdGhlIGRvY3VtZW50IHRvIHN0YXJ0IGxvYWRpbmcuCiAgICAgICAqIEluIHRoZSBgb25sb2FkYCBjYWxsYmFjaywgdGhlIGBpbXBvcnRgIHByb3BlcnR5IG9mIHRoZSBgbGlua2AKICAgICAgICogZWxlbWVudCB3aWxsIGNvbnRhaW4gdGhlIGltcG9ydGVkIGRvY3VtZW50IGNvbnRlbnRzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaHJlZiBVUkwgdG8gZG9jdW1lbnQgdG8gbG9hZC4KICAgICAgICogQHBhcmFtIHs/ZnVuY3Rpb24oIUV2ZW50KTp2b2lkPX0gb25sb2FkIENhbGxiYWNrIHRvIG5vdGlmeSB3aGVuIGFuIGltcG9ydCBzdWNjZXNzZnVsbHkKICAgICAgICogICBsb2FkZWQuCiAgICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKCFFcnJvckV2ZW50KTp2b2lkPX0gb25lcnJvciBDYWxsYmFjayB0byBub3RpZnkgd2hlbiBhbiBpbXBvcnQKICAgICAgICogICB1bnN1Y2Nlc3NmdWxseSBsb2FkZWQuCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IG9wdEFzeW5jIFRydWUgaWYgdGhlIGltcG9ydCBzaG91bGQgYmUgbG9hZGVkIGBhc3luY2AuCiAgICAgICAqICAgRGVmYXVsdHMgdG8gYGZhbHNlYC4KICAgICAgICogQHJldHVybiB7IUhUTUxMaW5rRWxlbWVudH0gVGhlIGxpbmsgZWxlbWVudCBmb3IgdGhlIFVSTCB0byBiZSBsb2FkZWQuCiAgICAgICAqLwogICAgICBpbXBvcnRIcmVmKGhyZWYsIG9ubG9hZCwgb25lcnJvciwgb3B0QXN5bmMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgIGxldCBsb2FkRm4gPSBvbmxvYWQgPyBvbmxvYWQuYmluZCh0aGlzKSA6IG51bGw7CiAgICAgICAgbGV0IGVycm9yRm4gPSBvbmVycm9yID8gb25lcnJvci5iaW5kKHRoaXMpIDogbnVsbDsKICAgICAgICByZXR1cm4gUG9seW1lci5pbXBvcnRIcmVmKGhyZWYsIGxvYWRGbiwgZXJyb3JGbiwgb3B0QXN5bmMpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUG9seWZpbGwgZm9yIEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMsIHdoaWNoIGlzIHNvbWV0aW1lcyBzdGlsbAogICAgICAgKiBwcmVmaXhlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIHRlc3QuCiAgICAgICAqIEBwYXJhbSB7IUVsZW1lbnQ9fSBub2RlIEVsZW1lbnQgdG8gdGVzdCB0aGUgc2VsZWN0b3IgYWdhaW5zdC4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZWxlbWVudCBtYXRjaGVzIHRoZSBzZWxlY3Rvci4KICAgICAgICovCiAgICAgIGVsZW1lbnRNYXRjaGVzKHNlbGVjdG9yLCBub2RlKSB7CiAgICAgICAgcmV0dXJuIFBvbHltZXIuZG9tLm1hdGNoZXNTZWxlY3RvcigvKiogQHR5cGUgeyFFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKSwgc2VsZWN0b3IpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBvciBvZmYuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEhUTUwgYXR0cmlidXRlIG5hbWUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gYm9vbCBCb29sZWFuIHRvIGZvcmNlIHRoZSBhdHRyaWJ1dGUgb24gb3Igb2ZmLgogICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGF0dHJpYnV0ZSB3aWxsIGJlIHJldmVyc2VkLgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnQ9fSBub2RlIE5vZGUgdG8gdGFyZ2V0LiAgRGVmYXVsdHMgdG8gYHRoaXNgLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdG9nZ2xlQXR0cmlidXRlKG5hbWUsIGJvb2wsIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICBib29sID0gIW5vZGUuaGFzQXR0cmlidXRlKG5hbWUpOwogICAgICAgIH0KICAgICAgICBpZiAoYm9vbCkgewogICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgJycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICB9CiAgICAgIH0KCgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyBhIENTUyBjbGFzcyBvbiBvciBvZmYuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIENTUyBjbGFzcyBuYW1lCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGJvb2wgQm9vbGVhbiB0byBmb3JjZSB0aGUgY2xhc3Mgb24gb3Igb2ZmLgogICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGNsYXNzIHdpbGwgYmUgcmV2ZXJzZWQuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgTm9kZSB0byB0YXJnZXQuICBEZWZhdWx0cyB0byBgdGhpc2AuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB0b2dnbGVDbGFzcyhuYW1lLCBib29sLCBub2RlKSB7CiAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICAgICAgYm9vbCA9ICFub2RlLmNsYXNzTGlzdC5jb250YWlucyhuYW1lKTsKICAgICAgICB9CiAgICAgICAgaWYgKGJvb2wpIHsKICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LmFkZChuYW1lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKG5hbWUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENyb3NzLXBsYXRmb3JtIGhlbHBlciBmb3Igc2V0dGluZyBhbiBlbGVtZW50J3MgQ1NTIGB0cmFuc2Zvcm1gIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNmb3JtVGV4dCBUcmFuc2Zvcm0gc2V0dGluZy4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm0gdG8uCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdHJhbnNmb3JtKHRyYW5zZm9ybVRleHQsIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICBub2RlLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHRyYW5zZm9ybVRleHQ7CiAgICAgICAgbm9kZS5zdHlsZS50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1UZXh0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3Jvc3MtcGxhdGZvcm0gaGVscGVyIGZvciBzZXR0aW5nIGFuIGVsZW1lbnQncyBDU1MgYHRyYW5zbGF0ZTNkYAogICAgICAgKiBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHggWCBvZmZzZXQuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB5IFkgb2Zmc2V0LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0geiBaIG9mZnNldC4KICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBFbGVtZW50IHRvIGFwcGx5IHRoZSB0cmFuc2Zvcm0gdG8uCiAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHRyYW5zbGF0ZTNkKHgsIHksIHosIG5vZGUpIHsKICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICB0aGlzLnRyYW5zZm9ybSgndHJhbnNsYXRlM2QoJyArIHggKyAnLCcgKyB5ICsgJywnICsgeiArICcpJywgbm9kZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSBhbiBhcnJheSwgaWYgaXQgZXhpc3RzLgogICAgICAgKgogICAgICAgKiBJZiB0aGUgYXJyYXkgaXMgc3BlY2lmaWVkIGJ5IHBhdGgsIGEgY2hhbmdlIG5vdGlmaWNhdGlvbiBpcwogICAgICAgKiBnZW5lcmF0ZWQsIHNvIHRoYXQgb2JzZXJ2ZXJzLCBkYXRhIGJpbmRpbmdzIGFuZCBjb21wdXRlZAogICAgICAgKiBwcm9wZXJ0aWVzIHdhdGNoaW5nIHRoYXQgcGF0aCBjYW4gdXBkYXRlLgogICAgICAgKgogICAgICAgKiBJZiB0aGUgYXJyYXkgaXMgcGFzc2VkIGRpcmVjdGx5LCAqKm5vIGNoYW5nZQogICAgICAgKiBub3RpZmljYXRpb24gaXMgZ2VuZXJhdGVkKiouCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PG51bWJlcnxzdHJpbmc+fSBhcnJheU9yUGF0aCBQYXRoIHRvIGFycmF5IGZyb20gd2hpY2ggdG8gcmVtb3ZlIHRoZSBpdGVtCiAgICAgICAqICAgKG9yIHRoZSBhcnJheSBpdHNlbGYpLgogICAgICAgKiBAcGFyYW0geyp9IGl0ZW0gSXRlbSB0byByZW1vdmUuCiAgICAgICAqIEByZXR1cm4ge0FycmF5fSBBcnJheSBjb250YWluaW5nIGl0ZW0gcmVtb3ZlZC4KICAgICAgICovCiAgICAgIGFycmF5RGVsZXRlKGFycmF5T3JQYXRoLCBpdGVtKSB7CiAgICAgICAgbGV0IGluZGV4OwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5T3JQYXRoKSkgewogICAgICAgICAgaW5kZXggPSBhcnJheU9yUGF0aC5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5T3JQYXRoLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxldCBhcnIgPSBQb2x5bWVyLlBhdGguZ2V0KHRoaXMsIGFycmF5T3JQYXRoKTsKICAgICAgICAgIGluZGV4ID0gYXJyLmluZGV4T2YoaXRlbSk7CiAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zcGxpY2UoYXJyYXlPclBhdGgsIGluZGV4LCAxKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIC8vIGxvZ2dpbmcKCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLmxvZ2AvYHdhcm5gL2BlcnJvcmAgYXMgb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBsZXZlbCBPbmUgb2YgJ2xvZycsICd3YXJuJywgJ2Vycm9yJwogICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9sb2dnZXIobGV2ZWwsIGFyZ3MpIHsKICAgICAgICAvLyBhY2NlcHQgWydmb28nLCAnYmFyJ10gYW5kIFtbJ2ZvbycsICdiYXInXV0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmdzKSAmJiBhcmdzLmxlbmd0aCA9PT0gMSAmJiBBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7CiAgICAgICAgICBhcmdzID0gYXJnc1swXTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoKGxldmVsKSB7CiAgICAgICAgICBjYXNlICdsb2cnOgogICAgICAgICAgY2FzZSAnd2Fybic6CiAgICAgICAgICBjYXNlICdlcnJvcic6CiAgICAgICAgICAgIGNvbnNvbGVbbGV2ZWxdKC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZhY2FkZXMgYGNvbnNvbGUubG9nYCBhcyBhbiBvdmVycmlkZSBwb2ludC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9sb2coLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignbG9nJywgYXJncyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLndhcm5gIGFzIGFuIG92ZXJyaWRlIHBvaW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3dhcm4oLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignd2FybicsIGFyZ3MpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmFjYWRlcyBgY29uc29sZS5lcnJvcmAgYXMgYW4gb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgdG8gbG9nCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfZXJyb3IoLi4uYXJncykgewogICAgICAgIHRoaXMuX2xvZ2dlcignZXJyb3InLCBhcmdzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcm1hdHMgYSBtZXNzYWdlIHVzaW5nIHRoZSBlbGVtZW50IHR5cGUgYW4gYSBtZXRob2QgbmFtZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTWV0aG9kIG5hbWUgdG8gYXNzb2NpYXRlIHdpdGggbWVzc2FnZQogICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgd2l0aCBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIGZvciBgY29uc29sZWAKICAgICAgICogICBsb2dnaW5nLgogICAgICAgKi8KICAgICAgX2xvZ2YobWV0aG9kTmFtZSwgLi4uYXJncykgewogICAgICAgIHJldHVybiBbJ1slczo6JXNdJywgdGhpcy5pcywgbWV0aG9kTmFtZSwgLi4uYXJnc107CiAgICAgIH0KCiAgICB9CgogICAgTGVnYWN5RWxlbWVudC5wcm90b3R5cGUuaXMgPSAnJzsKCiAgICByZXR1cm4gTGVnYWN5RWxlbWVudDsKCiAgfSk7Cgp9KSgpOwoKCgogIChmdW5jdGlvbigpIHsKCiAgICAndXNlIHN0cmljdCc7CgogICAgY29uc3QgbGlmZWN5Y2xlUHJvcHMgPSB7CiAgICAgIGF0dGFjaGVkOiB0cnVlLAogICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgcmVhZHk6IHRydWUsCiAgICAgIGNyZWF0ZWQ6IHRydWUsCiAgICAgIGJlZm9yZVJlZ2lzdGVyOiB0cnVlLAogICAgICByZWdpc3RlcmVkOiB0cnVlLAogICAgICBhdHRyaWJ1dGVDaGFuZ2VkOiB0cnVlLAogICAgICBsaXN0ZW5lcnM6IHRydWUsCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB0cnVlCiAgICB9OwoKICAgIGNvbnN0IGV4Y2x1ZGVPbkluZm8gPSB7CiAgICAgIGF0dGFjaGVkOiB0cnVlLAogICAgICBkZXRhY2hlZDogdHJ1ZSwKICAgICAgcmVhZHk6IHRydWUsCiAgICAgIGNyZWF0ZWQ6IHRydWUsCiAgICAgIGJlZm9yZVJlZ2lzdGVyOiB0cnVlLAogICAgICByZWdpc3RlcmVkOiB0cnVlLAogICAgICBhdHRyaWJ1dGVDaGFuZ2VkOiB0cnVlLAogICAgICBiZWhhdmlvcnM6IHRydWUsCiAgICAgIF9ub0FjY2Vzc29yczogdHJ1ZQogICAgfTsKCiAgICBjb25zdCBleGNsdWRlT25CZWhhdmlvcnMgPSBPYmplY3QuYXNzaWduKHsKICAgICAgbGlzdGVuZXJzOiB0cnVlLAogICAgICBob3N0QXR0cmlidXRlczogdHJ1ZSwKICAgICAgcHJvcGVydGllczogdHJ1ZSwKICAgICAgb2JzZXJ2ZXJzOiB0cnVlLAogICAgfSwgZXhjbHVkZU9uSW5mbyk7CgogICAgZnVuY3Rpb24gY29weVByb3BlcnRpZXMoc291cmNlLCB0YXJnZXQsIGV4Y2x1ZGVQcm9wcykgewogICAgICBjb25zdCBub0FjY2Vzc29ycyA9IHNvdXJjZS5fbm9BY2Nlc3NvcnM7CiAgICAgIGZvciAobGV0IHAgaW4gc291cmNlKSB7CiAgICAgICAgaWYgKCEocCBpbiBleGNsdWRlUHJvcHMpKSB7CiAgICAgICAgICBpZiAobm9BY2Nlc3NvcnMpIHsKICAgICAgICAgICAgdGFyZ2V0W3BdID0gc291cmNlW3BdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGV0IHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHApOwogICAgICAgICAgICBpZiAocGQpIHsKICAgICAgICAgICAgICAvLyBlbnN1cmUgcHJvcGVydHkgaXMgY29uZmlndXJhYmxlIHNvIHRoYXQgYSBsYXRlciBiZWhhdmlvciBjYW4KICAgICAgICAgICAgICAvLyByZS1jb25maWd1cmUgaXQuCiAgICAgICAgICAgICAgcGQuY29uZmlndXJhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwLCBwZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFwcGxpZXMgYSAibGVnYWN5IiBiZWhhdmlvciBvciBhcnJheSBvZiBiZWhhdmlvcnMgdG8gdGhlIHByb3ZpZGVkIGNsYXNzLgogICAgICoKICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBhbHNvIGFwcGx5IHRoZSBgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW5gCiAgICAgKiB0byBlbnN1cmUgdGhhdCBhbnkgbGVnYWN5IGJlaGF2aW9ycyBjYW4gcmVseSBvbiBsZWdhY3kgUG9seW1lciBBUEkgb24KICAgICAqIHRoZSB1bmRlcmx5aW5nIGVsZW1lbnQuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7IU9iamVjdHwhQXJyYXk8IU9iamVjdD59IGJlaGF2aW9ycyBCZWhhdmlvciBvYmplY3Qgb3IgYXJyYXkgb2YgYmVoYXZpb3JzLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6VCl9IGtsYXNzIEVsZW1lbnQgY2xhc3MuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6VCl9IFJldHVybnMgYSBuZXcgRWxlbWVudCBjbGFzcyBleHRlbmRlZCBieSB0aGUKICAgICAqIHBhc3NlZCBpbiBgYmVoYXZpb3JzYCBhbmQgYWxzbyBieSBgUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW5gLgogICAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICBmdW5jdGlvbiBtaXhpbkJlaGF2aW9ycyhiZWhhdmlvcnMsIGtsYXNzKSB7CiAgICAgIHJldHVybiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oe30sIFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKGtsYXNzKSwgYmVoYXZpb3JzKTsKICAgIH0KCiAgICAvLyBOT1RFOgogICAgLy8gMS54CiAgICAvLyBCZWhhdmlvcnMgd2VyZSBtaXhlZCBpbiAqaW4gcmV2ZXJzZSBvcmRlciogYW5kIGRlLWR1cGVkIG9uIHRoZSBmbHkuCiAgICAvLyBUaGUgcnVsZSB3YXMgdGhhdCBiZWhhdmlvciBwcm9wZXJ0aWVzIHdlcmUgY29waWVkIG9udG8gdGhlIGVsZW1lbnQKICAgIC8vIHByb3RvdHlwZSBpZiBhbmQgb25seSBpZiB0aGUgcHJvcGVydHkgZGlkIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgLy8gR2l2ZW46IFBvbHltZXJ7IGJlaGF2aW9yczogW0EsIEIsIEMsIEEsIEJdfSwgcHJvcGVydHkgY29weSBvcmRlciB3YXM6CiAgICAvLyAoMSksIEIsICgyKSwgQSwgKDMpIEMuIFRoaXMgbWVhbnMgcHJvdG90eXBlIHByb3BlcnRpZXMgd2luIG92ZXIKICAgIC8vIEIgcHJvcGVydGllcyB3aW4gb3ZlciBBIHdpbiBvdmVyIEMuIFRoaXMgbWlycm9ycyB3aGF0IHdvdWxkIGhhcHBlbgogICAgLy8gd2l0aCBpbmhlcml0YW5jZSBpZiBlbGVtZW50IGV4dGVuZGVkIEIgZXh0ZW5kZWQgQSBleHRlbmRlZCBDLgogICAgLy8KICAgIC8vIEFnYWluIGdpdmVuLCBQb2x5bWVyeyBiZWhhdmlvcnM6IFtBLCBCLCBDLCBBLCBCXX0sIHRoZSByZXN1bHRpbmcKICAgIC8vIGBiZWhhdmlvcnNgIGFycmF5IHdhcyBbQywgQSwgQl0uCiAgICAvLyBCZWhhdmlvciBsaWZlY3ljbGUgbWV0aG9kcyB3ZXJlIGNhbGxlZCBpbiBiZWhhdmlvciBhcnJheSBvcmRlcgogICAgLy8gZm9sbG93ZWQgYnkgdGhlIGVsZW1lbnQsIGUuZy4gKDEpIEMuY3JlYXRlZCwgKDIpIEEuY3JlYXRlZCwKICAgIC8vICgzKSBCLmNyZWF0ZWQsICg0KSBlbGVtZW50LmNyZWF0ZWQuIFRoZXJlIHdhcyBubyBzdXBwb3J0IGZvcgogICAgLy8gc3VwZXIsIGFuZCAic3VwZXItYmVoYXZpb3IiIG1ldGhvZHMgd2VyZSBjYWxsYWJsZSBvbmx5IGJ5IG5hbWUpLgogICAgLy8KICAgIC8vIDIueAogICAgLy8gQmVoYXZpb3JzIGFyZSBtYWRlIGludG8gcHJvcGVyIG1peGlucyB3aGljaCBsaXZlIGluIHRoZQogICAgLy8gZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbi4gQmVoYXZpb3JzIGFyZSBwbGFjZWQgaW4gdGhlIGVsZW1lbnQgcHJvdG90eXBlCiAgICAvLyBlbGRlc3QgdG8geW91bmdlc3QgYW5kIGRlLWR1cGVkIHlvdW5nZXN0IHRvIG9sZGVzdDoKICAgIC8vIFNvLCBmaXJzdCBbQSwgQiwgQywgQSwgQl0gYmVjb21lcyBbQywgQSwgQl0gdGhlbiwKICAgIC8vIHRoZSBlbGVtZW50IHByb3RvdHlwZSBiZWNvbWVzIChvbGRlc3QpICgxKSBQb2x5bWVyLkVsZW1lbnQsICgyKSBjbGFzcyhDKSwKICAgIC8vICgzKSBjbGFzcyhBKSwgKDQpIGNsYXNzKEIpLCAoNSkgY2xhc3MoUG9seW1lcih7Li4ufSkpLgogICAgLy8gUmVzdWx0OgogICAgLy8gVGhpcyBtZWFucyBlbGVtZW50IHByb3BlcnRpZXMgd2luIG92ZXIgQiBwcm9wZXJ0aWVzIHdpbiBvdmVyIEEgd2luCiAgICAvLyBvdmVyIEMuIChzYW1lIGFzIDEueCkKICAgIC8vIElmIGxpZmVjeWNsZSBpcyBjYWxsZWQgKHN1cGVyIHRoZW4gbWUpLCBvcmRlciBpcwogICAgLy8gKDEpIEMuY3JlYXRlZCwgKDIpIEEuY3JlYXRlZCwgKDMpIEIuY3JlYXRlZCwgKDQpIGVsZW1lbnQuY3JlYXRlZAogICAgLy8gKGFnYWluIHNhbWUgYXMgMS54KQogICAgZnVuY3Rpb24gYXBwbHlCZWhhdmlvcnMocHJvdG8sIGJlaGF2aW9ycywgbGlmZWN5Y2xlKSB7CiAgICAgIGZvciAobGV0IGk9MDsgaTxiZWhhdmlvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBhcHBseUluZm8ocHJvdG8sIGJlaGF2aW9yc1tpXSwgbGlmZWN5Y2xlLCBleGNsdWRlT25CZWhhdmlvcnMpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXBwbHlJbmZvKHByb3RvLCBpbmZvLCBsaWZlY3ljbGUsIGV4Y2x1ZGVQcm9wcykgewogICAgICBjb3B5UHJvcGVydGllcyhpbmZvLCBwcm90bywgZXhjbHVkZVByb3BzKTsKICAgICAgZm9yIChsZXQgcCBpbiBsaWZlY3ljbGVQcm9wcykgewogICAgICAgIGlmIChpbmZvW3BdKSB7CiAgICAgICAgICBsaWZlY3ljbGVbcF0gPSBsaWZlY3ljbGVbcF0gfHwgW107CiAgICAgICAgICBsaWZlY3ljbGVbcF0ucHVzaChpbmZvW3BdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXl9IGJlaGF2aW9ycyBMaXN0IG9mIGJlaGF2aW9ycyB0byBmbGF0dGVuLgogICAgICogQHBhcmFtIHtBcnJheT19IGxpc3QgVGFyZ2V0IGxpc3QgdG8gZmxhdHRlbiBiZWhhdmlvcnMgaW50by4KICAgICAqIEBwYXJhbSB7QXJyYXk9fSBleGNsdWRlIExpc3Qgb2YgYmVoYXZpb3JzIHRvIGV4Y2x1ZGUgZnJvbSB0aGUgbGlzdC4KICAgICAqIEByZXR1cm4geyFBcnJheX0gUmV0dXJucyB0aGUgbGlzdCBvZiBmbGF0dGVuZWQgYmVoYXZpb3JzLgogICAgICovCiAgICBmdW5jdGlvbiBmbGF0dGVuQmVoYXZpb3JzKGJlaGF2aW9ycywgbGlzdCwgZXhjbHVkZSkgewogICAgICBsaXN0ID0gbGlzdCB8fCBbXTsKICAgICAgZm9yIChsZXQgaT1iZWhhdmlvcnMubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgbGV0IGIgPSBiZWhhdmlvcnNbaV07CiAgICAgICAgaWYgKGIpIHsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGIpKSB7CiAgICAgICAgICAgIGZsYXR0ZW5CZWhhdmlvcnMoYiwgbGlzdCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBkZWR1cAogICAgICAgICAgICBpZiAobGlzdC5pbmRleE9mKGIpIDwgMCAmJiAoIWV4Y2x1ZGUgfHwgZXhjbHVkZS5pbmRleE9mKGIpIDwgMCkpIHsKICAgICAgICAgICAgICBsaXN0LnVuc2hpZnQoYik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS53YXJuKCdiZWhhdmlvciBpcyBudWxsLCBjaGVjayBmb3IgbWlzc2luZyBvciA0MDQgaW1wb3J0Jyk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsaXN0OwogICAgfQoKICAgIC8qIE5vdGUgYWJvdXQgY29uc3RydWN0aW9uIGFuZCBleHRlbnNpb24gb2YgbGVnYWN5IGNsYXNzZXMuCiAgICAgIFtDaGFuZ2VkIGluIFE0IDIwMTggdG8gb3B0aW1pemUgcGVyZm9ybWFuY2UuXQoKICAgICAgV2hlbiBjYWxsaW5nIGBQb2x5bWVyYCBvciBgbWl4aW5CZWhhdmlvcnNgLCB0aGUgZ2VuZXJhdGVkIGNsYXNzIGJlbG93IGlzCiAgICAgIG1hZGUuIFRoZSBsaXN0IG9mIGJlaGF2aW9ycyB3YXMgcHJldmlvdXNseSBtYWRlIGludG8gb25lIGdlbmVyYXRlZCBjbGFzcyBwZXIKICAgICAgYmVoYXZpb3IsIGJ1dCB0aGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZSBhcyBiZWhhdmlvcnMgYXJlIG5vdyBjYWxsZWQKICAgICAgbWFudWFsbHkuIE5vdGUsIHRoZXJlIG1heSAqc3RpbGwqIGJlIG11bHRpcGxlIGdlbmVyYXRlZCBjbGFzc2VzIGluIHRoZQogICAgICBlbGVtZW50J3MgcHJvdG90eXBlIGNoYWluIGlmIGV4dGVuc2lvbiBpcyB1c2VkIHdpdGggYG1peGluQmVoYXZpb3JzYC4KCiAgICAgIFRoZSBnZW5lcmF0ZWQgY2xhc3MgaXMgZGlyZWN0bHkgdGllZCB0byB0aGUgaW5mbyBvYmplY3QgYW5kIGJlaGF2aW9ycwogICAgICB1c2VkIHRvIGNyZWF0ZSBpdC4gVGhhdCBsaXN0IG9mIGJlaGF2aW9ycyBpcyBmaWx0ZXJlZCBzbyBpdCdzIG9ubHkgdGhlCiAgICAgIGJlaGF2aW9ycyBub3QgYWN0aXZlIG9uIHRoZSBzdXBlcmNsYXNzLiBJbiBvcmRlciB0byBjYWxsIHRocm91Z2ggdG8gdGhlCiAgICAgIGVudGlyZSBsaXN0IG9mIGxpZmVjeWNsZSBtZXRob2RzLCBpdCdzIGltcG9ydGFudCB0byBjYWxsIGBzdXBlcmAuCgogICAgICBUaGUgZWxlbWVudCdzIGBwcm9wZXJ0aWVzYCBhbmQgYG9ic2VydmVyc2AgYXJlIGNvbnRyb2xsZWQgdmlhIHRoZSBmaW5hbGl6YXRpb24KICAgICAgbWVjaGFuaXNtIHByb3ZpZGVkIGJ5IGBQcm9wZXJ0aWVzTWl4aW5gLiBgUHJvcGVydGllc2AgYW5kIGBvYnNlcnZlcnNgIGFyZQogICAgICBjb2xsZWN0ZWQgYnkgbWFudWFsbHkgdHJhdmVyc2luZyB0aGUgcHJvdG90eXBlIGNoYWluIGFuZCBtZXJnaW5nLgoKICAgICAgVG8gbGltaXQgY2hhbmdlcywgdGhlIGBfcmVnaXN0ZXJlZGAgbWV0aG9kIGlzIGNhbGxlZCB2aWEgYF9pbml0aWFsaXplUHJvcGVydGllc2AKICAgICAgYW5kIG5vdCBgX2ZpbmFsaXplQ2xhc3NgLgogICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gUG9seW1lciBpbmZvIG9iamVjdAogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6SFRNTEVsZW1lbnQpfSBCYXNlIGJhc2UgY2xhc3MgdG8gZXh0ZW5kIHdpdGggaW5mbyBvYmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBiZWhhdmlvcnMgYmVoYXZpb3JzIHRvIGNvcHkgaW50byB0aGUgZWxlbWVudAogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oaW5mbywgQmFzZSwgYmVoYXZpb3JzKSB7CgogICAgICAvLyBtYW5hZ2VzIGJlaGF2aW9yIGFuZCBsaWZlY3ljbGUgcHJvY2Vzc2luZyAoZmlsbGVkIGluIGFmdGVyIGNsYXNzIGRlZmluaXRpb24pCiAgICAgIGxldCBiZWhhdmlvckxpc3Q7CiAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IHt9OwoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIGNsYXNzIFBvbHltZXJHZW5lcmF0ZWQgZXh0ZW5kcyBCYXNlIHsKCiAgICAgICAgLy8gZXhwbGljaXRseSBub3QgY2FsbGluZyBzdXBlci5fZmluYWxpemVDbGFzcwogICAgICAgIHN0YXRpYyBfZmluYWxpemVDbGFzcygpIHsKICAgICAgICAgIC8vIGlmIGNhbGxpbmcgdmlhIGEgc3ViY2xhc3MgdGhhdCBoYXNuJ3QgYmVlbiBnZW5lcmF0ZWQsIHBhc3MgdGhyb3VnaCB0byBzdXBlcgogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KHdpbmRvdy5KU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdnZW5lcmF0ZWRGcm9tJywgdGhpcykpKSB7CiAgICAgICAgICAgIHN1cGVyLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBpbnRlcmxlYXZlIHByb3BlcnRpZXMgYW5kIG9ic2VydmVycyBwZXIgYmVoYXZpb3IgYW5kIGBpbmZvYAogICAgICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBiOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBiID0gYmVoYXZpb3JMaXN0W2ldOwogICAgICAgICAgICAgICAgaWYgKGIucHJvcGVydGllcykgewogICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMoYi5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChiLm9ic2VydmVycykgewogICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU9ic2VydmVycyhiLm9ic2VydmVycywgYi5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGluZm8ucHJvcGVydGllcykgewogICAgICAgICAgICAgIHRoaXMuY3JlYXRlUHJvcGVydGllcyhpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbmZvLm9ic2VydmVycykgewogICAgICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKGluZm8ub2JzZXJ2ZXJzLCBpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBwcmVwYXJlIHRoZSBlbGVtZW50IHRlbXBsYXRlCiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVUZW1wbGF0ZSgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewogICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IHt9OwogICAgICAgICAgaWYgKGJlaGF2aW9yTGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBiZWhhdmlvckxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BlcnRpZXMsIGJlaGF2aW9yTGlzdFtpXS5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzLCBpbmZvLnByb3BlcnRpZXMpOwogICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CiAgICAgICAgfQoKICAgICAgICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHsKICAgICAgICAgIGxldCBvYnNlcnZlcnMgPSBbXTsKICAgICAgICAgIGlmIChiZWhhdmlvckxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBiOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgYiA9IGJlaGF2aW9yTGlzdFtpXTsKICAgICAgICAgICAgICBpZiAoYi5vYnNlcnZlcnMpIHsKICAgICAgICAgICAgICAgIG9ic2VydmVycyA9IG9ic2VydmVycy5jb25jYXQoYi5vYnNlcnZlcnMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGluZm8ub2JzZXJ2ZXJzKSB7CiAgICAgICAgICAgIG9ic2VydmVycyA9IG9ic2VydmVycy5jb25jYXQoaW5mby5vYnNlcnZlcnMpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG9ic2VydmVyczsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlZCgpIHsKICAgICAgICAgIHN1cGVyLmNyZWF0ZWQoKTsKICAgICAgICAgIGNvbnN0IGxpc3QgPSBsaWZlY3ljbGUuY3JlYXRlZDsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX3JlZ2lzdGVyZWQoKSB7CiAgICAgICAgICAvKiBOT1RFOiBgYmVmb3JlUmVnaXN0ZXJgIGlzIGNhbGxlZCBoZXJlIGZvciBiYywgYnV0IHRoZSBiZWhhdmlvcgogICAgICAgICAgICBpcyBkaWZmZXJlbnQgdGhhbiBpbiAxLnguIEluIDEuMCwgdGhlIG1ldGhvZCB3YXMgY2FsbGVkICphZnRlcioKICAgICAgICAgICAgbWl4aW5nIHByb3RvdHlwZXMgdG9nZXRoZXIgYnV0ICpiZWZvcmUqIHByb2Nlc3Npbmcgb2YgbWV0YS1vYmplY3RzLgogICAgICAgICAgICBIb3dldmVyLCBkeW5hbWljIGVmZmVjdHMgY2FuIHN0aWxsIGJlIHNldCBoZXJlIGFuZCBjYW4gYmUgZG9uZSBlaXRoZXIKICAgICAgICAgICAgaW4gYGJlZm9yZVJlZ2lzdGVyYCBvciBgcmVnaXN0ZXJlZGAuIEl0IGlzIG5vIGxvbmdlciBwb3NzaWJsZSB0byBzZXQKICAgICAgICAgICAgYGlzYCBpbiBgYmVmb3JlUmVnaXN0ZXJgIGFzIHlvdSBjb3VsZCBpbiAxLnguCiAgICAgICAgICAqLwogICAgICAgICAgLy8gb25seSBwcm9jZWVkIGlmIHRoZSBnZW5lcmF0ZWQgY2xhc3MnIHByb3RvdHlwZSBoYXMgbm90IGJlZW4gcmVnaXN0ZXJlZC4KICAgICAgICAgIGNvbnN0IGdlbmVyYXRlZFByb3RvID0gUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGU7CiAgICAgICAgICBpZiAoIWdlbmVyYXRlZFByb3RvLmhhc093blByb3BlcnR5KCdfX2hhc1JlZ2lzdGVyRmluaXNoZWQnKSkgewogICAgICAgICAgICBnZW5lcmF0ZWRQcm90by5fX2hhc1JlZ2lzdGVyRmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAvLyBlbnN1cmUgc3VwZXJjbGFzcyBpcyByZWdpc3RlcmVkIGZpcnN0LgogICAgICAgICAgICBzdXBlci5fcmVnaXN0ZXJlZCgpOwogICAgICAgICAgICAvLyBjb3B5IHByb3BlcnRpZXMgb250byB0aGUgZ2VuZXJhdGVkIGNsYXNzIGxhemlseSBpZiB3ZSdyZSBvcHRpbWl6aW5nLAogICAgICAgICAgICBpZiAoUG9seW1lci5sZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICAgY29weVByb3BlcnRpZXNUb1Byb3RvKGdlbmVyYXRlZFByb3RvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBtYWtlIHN1cmUgbGVnYWN5IGxpZmVjeWNsZSBpcyBjYWxsZWQgb24gdGhlICplbGVtZW50KidzIHByb3RvdHlwZQogICAgICAgICAgICAvLyBhbmQgbm90IHRoZSBnZW5lcmF0ZWQgY2xhc3MgcHJvdG90eXBlOyBpZiB0aGUgZWxlbWVudCBoYXMgYmVlbgogICAgICAgICAgICAvLyBleHRlbmRlZCwgdGhlc2UgYXJlICpub3QqIHRoZSBzYW1lLgogICAgICAgICAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTsKICAgICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYmVmb3JlUmVnaXN0ZXI7CiAgICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHByb3RvKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGlzdCA9IGxpZmVjeWNsZS5yZWdpc3RlcmVkOwogICAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGxpc3RbaV0uY2FsbChwcm90byk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9hcHBseUxpc3RlbmVycygpIHsKICAgICAgICAgIHN1cGVyLl9hcHBseUxpc3RlbmVycygpOwogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5saXN0ZW5lcnM7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gbGlzdFtpXTsKICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBsIGluIGxpc3RlbmVycykgewogICAgICAgICAgICAgICAgICB0aGlzLl9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKHRoaXMsIGwsIGxpc3RlbmVyc1tsXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBub3RlOiBleGNlcHRpb24gdG8gInN1cGVyIHRoZW4gbWUiIHJ1bGU7CiAgICAgICAgLy8gZG8gd29yayBiZWZvcmUgY2FsbGluZyBzdXBlciBzbyB0aGF0IHN1cGVyIGF0dHJpYnV0ZXMKICAgICAgICAvLyBvbmx5IGFwcGx5IGlmIG5vdCBhbHJlYWR5IHNldC4KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9lbnN1cmVBdHRyaWJ1dGVzKCkgewogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5ob3N0QXR0cmlidXRlczsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9bGlzdC5sZW5ndGgtMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICBjb25zdCBob3N0QXR0cmlidXRlcyA9IGxpc3RbaV07CiAgICAgICAgICAgICAgZm9yIChsZXQgYSBpbiBob3N0QXR0cmlidXRlcykgewogICAgICAgICAgICAgICAgICB0aGlzLl9lbnN1cmVBdHRyaWJ1dGUoYSwgaG9zdEF0dHJpYnV0ZXNbYV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzdXBlci5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5yZWFkeTsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoZWQoKSB7CiAgICAgICAgICBzdXBlci5hdHRhY2hlZCgpOwogICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYXR0YWNoZWQ7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRldGFjaGVkKCkgewogICAgICAgICAgc3VwZXIuZGV0YWNoZWQoKTsKICAgICAgICAgIGxldCBsaXN0ID0gbGlmZWN5Y2xlLmRldGFjaGVkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50cyBuYXRpdmUgQ3VzdG9tIEVsZW1lbnRzIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvCiAgICAgICAgICogc2V0IGFuIGF0dHJpYnV0ZSB2YWx1ZSB0byBhIHByb3BlcnR5IHZpYSBgX2F0dHJpYnV0ZVRvUHJvcGVydHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUgdGhhdCBjaGFuZ2VkCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgTmV3IGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZChuYW1lLCBvbGQsIHZhbHVlKSB7CiAgICAgICAgICBzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkKCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5hdHRyaWJ1dGVDaGFuZ2VkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzLCBuYW1lLCBvbGQsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gYXBwbHkgYmVoYXZpb3JzLCBub3RlIGFjdHVhbCBjb3B5aW5nIGlzIGRvbmUgbGF6aWx5IGF0IGZpcnN0IGluc3RhbmNlIGNyZWF0aW9uCiAgICAgIGlmIChiZWhhdmlvcnMpIHsKICAgICAgICAvLyBOT1RFOiBlbnN1cmUgdGhlIGJlaGF2aW9yIGlzIGV4dGVuZGluZyBhIGNsYXNzIHdpdGgKICAgICAgICAvLyBsZWdhY3kgZWxlbWVudCBhcGkuIFRoaXMgaXMgbmVjZXNzYXJ5IHNpbmNlIGJlaGF2aW9ycyBleHBlY3QgdG8gYmUgYWJsZQogICAgICAgIC8vIHRvIGFjY2VzcyAxLnggbGVnYWN5IGFwaS4KICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoYmVoYXZpb3JzKSkgewogICAgICAgICAgYmVoYXZpb3JzID0gW2JlaGF2aW9yc107CiAgICAgICAgfQogICAgICAgIGxldCBzdXBlckJlaGF2aW9ycyA9IEJhc2UucHJvdG90eXBlLmJlaGF2aW9yczsKICAgICAgICAvLyBnZXQgZmxhdHRlbmVkLCBkZWR1cGVkIGxpc3Qgb2YgYmVoYXZpb3JzICpub3QqIGFscmVhZHkgb24gc3VwZXIgY2xhc3MKICAgICAgICBiZWhhdmlvckxpc3QgPSBmbGF0dGVuQmVoYXZpb3JzKGJlaGF2aW9ycywgbnVsbCwgc3VwZXJCZWhhdmlvcnMpOwogICAgICAgIFBvbHltZXJHZW5lcmF0ZWQucHJvdG90eXBlLmJlaGF2aW9ycyA9IHN1cGVyQmVoYXZpb3JzID8KICAgICAgICAgIHN1cGVyQmVoYXZpb3JzLmNvbmNhdChiZWhhdmlvcnMpIDogYmVoYXZpb3JMaXN0OwogICAgICB9CgogICAgICBjb25zdCBjb3B5UHJvcGVydGllc1RvUHJvdG8gPSAocHJvdG8pID0+IHsKICAgICAgICBpZiAoYmVoYXZpb3JMaXN0KSB7CiAgICAgICAgICBhcHBseUJlaGF2aW9ycyhwcm90bywgYmVoYXZpb3JMaXN0LCBsaWZlY3ljbGUpOwogICAgICAgIH0KICAgICAgICBhcHBseUluZm8ocHJvdG8sIGluZm8sIGxpZmVjeWNsZSwgZXhjbHVkZU9uSW5mbyk7CiAgICAgIH07CgogICAgICAvLyBjb3B5IHByb3BlcnRpZXMgaWYgd2UncmUgbm90IG9wdGltaXppbmcKICAgICAgaWYgKCFQb2x5bWVyLmxlZ2FjeU9wdGltaXphdGlvbnMpIHsKICAgICAgICBjb3B5UHJvcGVydGllc1RvUHJvdG8oUG9seW1lckdlbmVyYXRlZC5wcm90b3R5cGUpOwogICAgICB9CgogICAgICBQb2x5bWVyR2VuZXJhdGVkLmdlbmVyYXRlZEZyb20gPSBpbmZvOwoKICAgICAgcmV0dXJuIFBvbHltZXJHZW5lcmF0ZWQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZXMgYSBjbGFzcyB0aGF0IGV4dGVuZHMgYFBvbHltZXIuTGVnYWN5RWxlbWVudGAgYmFzZWQgb24gdGhlCiAgICAgKiBwcm92aWRlZCBpbmZvIG9iamVjdC4gIE1ldGFkYXRhIG9iamVjdHMgb24gdGhlIGBpbmZvYCBvYmplY3QKICAgICAqIChgcHJvcGVydGllc2AsIGBvYnNlcnZlcnNgLCBgbGlzdGVuZXJzYCwgYGJlaGF2aW9yc2AsIGBpc2ApIGFyZSB1c2VkCiAgICAgKiBmb3IgUG9seW1lcidzIG1ldGEtcHJvZ3JhbW1pbmcgc3lzdGVtcywgYW5kIGFueSBmdW5jdGlvbnMgYXJlIGNvcGllZAogICAgICogdG8gdGhlIGdlbmVyYXRlZCBjbGFzcy4KICAgICAqCiAgICAgKiBWYWxpZCAibWV0YWRhdGEiIHZhbHVlcyBhcmUgYXMgZm9sbG93czoKICAgICAqCiAgICAgKiBgaXNgOiBTdHJpbmcgcHJvdmlkaW5nIHRoZSB0YWcgbmFtZSB0byByZWdpc3RlciB0aGUgZWxlbWVudCB1bmRlci4gSW4KICAgICAqIGFkZGl0aW9uLCBpZiBhIGBkb20tbW9kdWxlYCB3aXRoIHRoZSBzYW1lIGlkIGV4aXN0cywgdGhlIGZpcnN0IHRlbXBsYXRlCiAgICAgKiBpbiB0aGF0IGBkb20tbW9kdWxlYCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGUgc2hhZG93IHJvb3Qgb2YgdGhpcyBlbGVtZW50LAogICAgICogd2l0aCBzdXBwb3J0IGZvciBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgKGBvbi0uLi5gKSwgUG9seW1lciBkYXRhCiAgICAgKiBiaW5kaW5ncyAoYFtbLi4uXV1gIGFuZCBge3suLi59fWApLCBhbmQgaWQtYmFzZWQgbm9kZSBmaW5kaW5nIGludG8KICAgICAqIGB0aGlzLiRgLgogICAgICoKICAgICAqIGBwcm9wZXJ0aWVzYDogT2JqZWN0IGRlc2NyaWJpbmcgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIKICAgICAqIGZlYXR1cmVzIChrZXk6IHByb3BlcnR5IG5hbWVzLCB2YWx1ZTogb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydHkgbWV0YWRhdGEpLgogICAgICogVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkgbWV0YWRhdGEgaW5jbHVkZToKICAgICAqIC0gYHR5cGVgIChTdHJpbmd8TnVtYmVyfE9iamVjdHxBcnJheXwuLi4pOiBVc2VkIGJ5CiAgICAgKiAgIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvIGRldGVybWluZSBob3cgc3RyaW5nLWJhc2VkIGF0dHJpYnV0ZXMKICAgICAqICAgYXJlIGRlc2VyaWFsaXplZCB0byBKYXZhU2NyaXB0IHByb3BlcnR5IHZhbHVlcy4KICAgICAqIC0gYG5vdGlmeWAgKGJvb2xlYW4pOiBDYXVzZXMgYSBjaGFuZ2UgaW4gdGhlIHByb3BlcnR5IHRvIGZpcmUgYQogICAgICogICBub24tYnViYmxpbmcgZXZlbnQgY2FsbGVkIGA8cHJvcGVydHk+LWNoYW5nZWRgLiBFbGVtZW50cyB0aGF0IGhhdmUKICAgICAqICAgZW5hYmxlZCB0d28td2F5IGJpbmRpbmcgdG8gdGhlIHByb3BlcnR5IHVzZSB0aGlzIGV2ZW50IHRvIG9ic2VydmUgY2hhbmdlcy4KICAgICAqIC0gYHJlYWRPbmx5YCAoYm9vbGVhbik6IENyZWF0ZXMgYSBnZXR0ZXIgZm9yIHRoZSBwcm9wZXJ0eSwgYnV0IG5vIHNldHRlci4KICAgICAqICAgVG8gc2V0IGEgcmVhZC1vbmx5IHByb3BlcnR5LCB1c2UgdGhlIHByaXZhdGUgc2V0dGVyIG1ldGhvZAogICAgICogICBgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSlgLgogICAgICogLSBgb2JzZXJ2ZXJgIChzdHJpbmcpOiBPYnNlcnZlciBtZXRob2QgbmFtZSB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4KICAgICAqICAgdGhlIHByb3BlcnR5IGNoYW5nZXMuIFRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZCBhcmUKICAgICAqICAgYCh2YWx1ZSwgcHJldmlvdXNWYWx1ZSlgLgogICAgICogLSBgY29tcHV0ZWRgIChzdHJpbmcpOiBTdHJpbmcgZGVzY3JpYmluZyBtZXRob2QgYW5kIGRlcGVuZGVudCBwcm9wZXJ0aWVzCiAgICAgKiAgIGZvciBjb21wdXRpbmcgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgKGUuZy4gYCdjb21wdXRlRm9vKGJhciwgem90KSdgKS4KICAgICAqICAgQ29tcHV0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGJ5IGRlZmF1bHQgYW5kIGNhbiBvbmx5IGJlIGNoYW5nZWQKICAgICAqICAgdmlhIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGNvbXB1dGluZyBtZXRob2QuCiAgICAgKgogICAgICogYG9ic2VydmVyc2A6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eSBvYnNlcnZlciBtZXRob2RzCiAgICAgKiAgYW5kIHRoZWlyIGRlcGVuZGVudCBwcm9wZXJ0aWVzIChlLmcuIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgICAqCiAgICAgKiBgbGlzdGVuZXJzYDogT2JqZWN0IGRlc2NyaWJpbmcgZXZlbnQgbGlzdGVuZXJzIHRvIGJlIGFkZGVkIHRvIGVhY2gKICAgICAqICBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQgKGtleTogZXZlbnQgbmFtZSwgdmFsdWU6IG1ldGhvZCBuYW1lKS4KICAgICAqCiAgICAgKiBgYmVoYXZpb3JzYDogQXJyYXkgb2YgYWRkaXRpb25hbCBgaW5mb2Agb2JqZWN0cyBjb250YWluaW5nIG1ldGFkYXRhCiAgICAgKiBhbmQgY2FsbGJhY2tzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgYGluZm9gIG9iamVjdCBoZXJlIHdoaWNoIGFyZQogICAgICogbWVyZ2VkIGludG8gdGhpcyBlbGVtZW50LgogICAgICoKICAgICAqIGBob3N0QXR0cmlidXRlc2A6IE9iamVjdCBsaXN0aW5nIGF0dHJpYnV0ZXMgdG8gYmUgYXBwbGllZCB0byB0aGUgaG9zdAogICAgICogIG9uY2UgY3JlYXRlZCAoa2V5OiBhdHRyaWJ1dGUgbmFtZSwgdmFsdWU6IGF0dHJpYnV0ZSB2YWx1ZSkuICBWYWx1ZXMKICAgICAqICBhcmUgc2VyaWFsaXplZCBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUuICBIb3N0IGF0dHJpYnV0ZXMgc2hvdWxkCiAgICAgKiAgZ2VuZXJhbGx5IGJlIGxpbWl0ZWQgdG8gYXR0cmlidXRlcyBzdWNoIGFzIGB0YWJJbmRleGAgYW5kIGBhcmlhLS4uLmAuCiAgICAgKiAgQXR0cmlidXRlcyBpbiBgaG9zdEF0dHJpYnV0ZXNgIGFyZSBvbmx5IGFwcGxpZWQgaWYgYSB1c2VyLXN1cHBsaWVkCiAgICAgKiAgYXR0cmlidXRlIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgKGF0dHJpYnV0ZXMgaW4gbWFya3VwIG92ZXJyaWRlCiAgICAgKiAgYGhvc3RBdHRyaWJ1dGVzYCkuCiAgICAgKgogICAgICogSW4gYWRkaXRpb24sIHRoZSBmb2xsb3dpbmcgUG9seW1lci1zcGVjaWZpYyBjYWxsYmFja3MgbWF5IGJlIHByb3ZpZGVkOgogICAgICogLSBgcmVnaXN0ZXJlZGA6IGNhbGxlZCBhZnRlciBmaXJzdCBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQsCiAgICAgKiAtIGBjcmVhdGVkYDogY2FsbGVkIGR1cmluZyBgY29uc3RydWN0b3JgCiAgICAgKiAtIGBhdHRhY2hlZGA6IGNhbGxlZCBkdXJpbmcgYGNvbm5lY3RlZENhbGxiYWNrYAogICAgICogLSBgZGV0YWNoZWRgOiBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAqIC0gYHJlYWR5YDogY2FsbGVkIGJlZm9yZSBmaXJzdCBgYXR0YWNoZWRgLCBhZnRlciBhbGwgcHJvcGVydGllcyBvZgogICAgICogICB0aGlzIGVsZW1lbnQgaGF2ZSBiZWVuIHByb3BhZ2F0ZWQgdG8gaXRzIHRlbXBsYXRlIGFuZCBhbGwgb2JzZXJ2ZXJzCiAgICAgKiAgIGhhdmUgcnVuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gT2JqZWN0IGNvbnRhaW5pbmcgUG9seW1lciBtZXRhZGF0YSBhbmQgZnVuY3Rpb25zCiAgICAgKiAgIHRvIGJlY29tZSBjbGFzcyBtZXRob2RzLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oVCk6VH0gbWl4aW4gT3B0aW9uYWwgbWl4aW4gdG8gYXBwbHkgdG8gbGVnYWN5IGJhc2UgY2xhc3MKICAgICAqICAgYmVmb3JlIGV4dGVuZGluZyB3aXRoIFBvbHltZXIgbWV0YXByb2dyYW1taW5nLgogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICovCiAgICBQb2x5bWVyLkNsYXNzID0gZnVuY3Rpb24oaW5mbywgbWl4aW4pIHsKICAgICAgaWYgKCFpbmZvKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdQb2x5bWVyLkNsYXNzIHJlcXVpcmVzIGBpbmZvYCBhcmd1bWVudCcpOwogICAgICB9CiAgICAgIGxldCBrbGFzcyA9IG1peGluID8gbWl4aW4oUG9seW1lci5MZWdhY3lFbGVtZW50TWl4aW4oSFRNTEVsZW1lbnQpKSA6CiAgICAgICAgICBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CiAgICAgIGtsYXNzID0gR2VuZXJhdGVDbGFzc0Zyb21JbmZvKGluZm8sIGtsYXNzLCBpbmZvLmJlaGF2aW9ycyk7CiAgICAgIGlmIChpbmZvLl9lbmFibGVEaXNhYmxlVXBncmFkZSkgewogICAgICAgIGtsYXNzID0gUG9seW1lci5EaXNhYmxlVXBncmFkZU1peGluKGtsYXNzKTsKICAgICAgfQogICAgICAvLyBkZWNvcmF0ZSBrbGFzcyB3aXRoIHJlZ2lzdHJhdGlvbiBpbmZvCiAgICAgIGtsYXNzLmlzID0ga2xhc3MucHJvdG90eXBlLmlzID0gaW5mby5pczsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICBQb2x5bWVyLm1peGluQmVoYXZpb3JzID0gbWl4aW5CZWhhdmlvcnM7CgogIH0pKCk7CgoKCgogIChmdW5jdGlvbigpIHsKICAgICd1c2Ugc3RyaWN0JzsKCiAgICAvKioKICAgICAqIExlZ2FjeSBjbGFzcyBmYWN0b3J5IGFuZCByZWdpc3RyYXRpb24gaGVscGVyIGZvciBkZWZpbmluZyBQb2x5bWVyCiAgICAgKiBlbGVtZW50cy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCiAgICAgKiBgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGluZm8uaXMsIFBvbHltZXIuQ2xhc3MoaW5mbykpO2AKICAgICAqCiAgICAgKiBTZWUgYFBvbHltZXIuQ2xhc3NgIGZvciBkZXRhaWxzIG9uIHZhbGlkIGxlZ2FjeSBtZXRhZGF0YSBmb3JtYXQgZm9yIGBpbmZvYC4KICAgICAqCiAgICAgKiBAZ2xvYmFsCiAgICAgKiBAb3ZlcnJpZGUKICAgICAqIEBmdW5jdGlvbiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBPYmplY3QgY29udGFpbmluZyBQb2x5bWVyIG1ldGFkYXRhIGFuZCBmdW5jdGlvbnMKICAgICAqICAgdG8gYmVjb21lIGNsYXNzIG1ldGhvZHMuCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6IEhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2R1cGxpY2F0ZSwgaW52YWxpZENhc3RzLCBjaGVja1R5cGVzfQogICAgICovCiAgICB3aW5kb3cuUG9seW1lci5fcG9seW1lckZuID0gZnVuY3Rpb24oaW5mbykgewogICAgICAvLyBpZiBpbnB1dCBpcyBhIGBjbGFzc2AgKGFrYSBhIGZ1bmN0aW9uIHdpdGggYSBwcm90b3R5cGUpLCB1c2UgdGhlIHByb3RvdHlwZQogICAgICAvLyByZW1lbWJlciB0aGF0IHRoZSBgY29uc3RydWN0b3JgIHdpbGwgbmV2ZXIgYmUgY2FsbGVkCiAgICAgIGxldCBrbGFzczsKICAgICAgaWYgKHR5cGVvZiBpbmZvID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAga2xhc3MgPSBpbmZvOwogICAgICB9IGVsc2UgewogICAgICAgIGtsYXNzID0gUG9seW1lci5DbGFzcyhpbmZvKTsKICAgICAgfQogICAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoa2xhc3MuaXMsIC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyhrbGFzcykpOwogICAgICByZXR1cm4ga2xhc3M7CiAgICB9OwoKICB9KSgpOwoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvLyBDb21tb24gaW1wbGVtZW50YXRpb24gZm9yIG1peGluICYgYmVoYXZpb3IKICBmdW5jdGlvbiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UoaW5zdCwgcHJvcGVydHksIHZhbHVlLCBvbGQsIG11dGFibGVEYXRhKSB7CiAgICBsZXQgaXNPYmplY3Q7CiAgICBpZiAobXV0YWJsZURhdGEpIHsKICAgICAgaXNPYmplY3QgPSAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCk7CiAgICAgIC8vIFB1bGwgYG9sZGAgZm9yIE9iamVjdHMgZnJvbSB0ZW1wIGNhY2hlLCBidXQgdHJlYXQgYG51bGxgIGFzIGEgcHJpbWl0aXZlCiAgICAgIGlmIChpc09iamVjdCkgewogICAgICAgIG9sZCA9IGluc3QuX19kYXRhVGVtcFtwcm9wZXJ0eV07CiAgICAgIH0KICAgIH0KICAgIC8vIFN0cmljdCBlcXVhbGl0eSBjaGVjaywgYnV0IHJldHVybiBmYWxzZSBmb3IgTmFOPT09TmFOCiAgICBsZXQgc2hvdWxkQ2hhbmdlID0gKG9sZCAhPT0gdmFsdWUgJiYgKG9sZCA9PT0gb2xkIHx8IHZhbHVlID09PSB2YWx1ZSkpOwogICAgLy8gT2JqZWN0cyBhcmUgc3RvcmVkIGluIHRlbXBvcmFyeSBjYWNoZSAoY2xlYXJlZCBhdCBlbmQgb2YKICAgIC8vIHR1cm4pLCB3aGljaCBpcyB1c2VkIGZvciBkaXJ0eS1jaGVja2luZwogICAgaWYgKGlzT2JqZWN0ICYmIHNob3VsZENoYW5nZSkgewogICAgICBpbnN0Ll9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICB9CiAgICByZXR1cm4gc2hvdWxkQ2hhbmdlOwogIH0KCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLCBmb3IgdXNlIG9uIGVsZW1lbnRzIHV0aWxpemluZwogICAqIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AKICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgY2F1c2UgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGFwcGx5IHRoaXMgbWl4aW4gb3IgZW5hYmxlIHRoZQogICAqIGBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFgIG1peGluLgogICAqCiAgICogSW4gb3JkZXIgdG8gbWFrZSB0aGUgZGlydHkgY2hlY2sgc3RyYXRlZ3kgY29uZmlndXJhYmxlLCBzZWUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0byBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cwogICAqICAgYW5kIGFycmF5cwogICAqLwogIFBvbHltZXIuTXV0YWJsZURhdGEgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQG1peGluQ2xhc3MKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICovCiAgICBjbGFzcyBNdXRhYmxlRGF0YSBleHRlbmRzIHN1cGVyQ2xhc3MgewogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBwdWxscyB0aGUgdmFsdWUgdG8gZGlydHkgY2hlY2sgYWdhaW5zdCBmcm9tIHRoZSBgX19kYXRhVGVtcGAKICAgICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAgICogY2FjaGUgaXMgY2xlYXJlZCBhdCB0aGUgZW5kIG9mIGEgdHVybiwgdGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3MKICAgICAgICogc2lkZS1lZmZlY3RzIG9mIGRlZXAgb2JqZWN0IGNoYW5nZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHJlLXNldHRpbmcgdGhlCiAgICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAgICogY3ljbGVzIGR1ZSB0byAyLXdheSBub3RpZmljYXRpb24pLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE5ldyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcGFyYW0geyp9IG9sZCBQcmV2aW91cyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0cnVlKTsKICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gTXV0YWJsZURhdGE7CgogIH0pOwoKCiAgLyoqCiAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBhZGQgdGhlIG9wdGlvbmFsIGFiaWxpdHkgdG8gc2tpcCBzdHJpY3QKICAgKiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZQogICAqICJkaXJ0eSIpIGJ5IHNldHRpbmcgYSBgbXV0YWJsZS1kYXRhYCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCBpbnN0YW5jZS4KICAgKgogICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICogb2JqZWN0cywgd2hpY2ggbWVhbnMgdGhhdCBhbnkgZGVlcCBtb2RpZmljYXRpb25zIHRvIGFuIG9iamVjdCBvciBhcnJheSB3aWxsCiAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgKgogICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgKiBtdXRhdGlvbiBhbmQgbm90aWZpY2F0aW9uIG9mIGRlZXAgY2hhbmdlcyBpbiBhbiBvYmplY3QgZ3JhcGggdG8gYWxsIGVsZW1lbnRzCiAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAqCiAgICogSW4gY2FzZXMgd2hlcmUgbmVpdGhlciBpbW11dGFibGUgcGF0dGVybnMgbm9yIHRoZSBkYXRhIG11dGF0aW9uIEFQSSBjYW4gYmUKICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgYWxsb3cgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICogdXNlciB0byBtYWtlIGEgZGVlcCBtb2RpZmljYXRpb24gdG8gYSBib3VuZCBvYmplY3QgZ3JhcGgsIGFuZCB0aGVuIGVpdGhlcgogICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICogZWxlbWVudHMgdGhhdCB3aXNoIHRvIGJlIHVwZGF0ZWQgYmFzZWQgb24gZGVlcCBtdXRhdGlvbnMgbXVzdCBhcHBseSB0aGlzCiAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICogbXV0YXRpb24gYW5kIHRoZSBjb25zdW1wdGlvbiBvZiBpdCBtdXN0IGVuYWJsZSB0aGlzIG1peGluIG9yIGFwcGx5IHRoZQogICAqIGBQb2x5bWVyLk11dGFibGVEYXRhYCBtaXhpbi4KICAgKgogICAqIFdoaWxlIHRoaXMgbWl4aW4gYWRkcyB0aGUgYWJpbGl0eSB0byBmb3JnbyBPYmplY3QvQXJyYXkgZGlydHkgY2hlY2tpbmcsCiAgICogdGhlIGBtdXRhYmxlRGF0YWAgZmxhZyBkZWZhdWx0cyB0byBmYWxzZSBhbmQgbXVzdCBiZSBzZXQgb24gdGhlIGluc3RhbmNlLgogICAqCiAgICogTm90ZSwgdGhlIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBvZiBwcm9wYWdhdGluZyBsYXJnZSBvYmplY3QgZ3JhcGhzCiAgICogd2lsbCBiZSB3b3JzZSBieSByZWx5aW5nIG9uIGBtdXRhYmxlRGF0YTogdHJ1ZWAgYXMgb3Bwb3NlZCB0byB1c2luZwogICAqIHN0cmljdCBkaXJ0eSBjaGVja2luZyB3aXRoIGltbXV0YWJsZSBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24KICAgKiBBUEkuCiAgICoKICAgKiBAbWl4aW5GdW5jdGlvbgogICAqIEBwb2x5bWVyCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcKICAgKiAgIGZvciBvYmplY3RzIGFuZCBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEgPSBQb2x5bWVyLmRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgLyoqCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQHBvbHltZXIKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKi8KICAgIGNsYXNzIE9wdGlvbmFsTXV0YWJsZURhdGEgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICAgICAqIGZvciB0aGlzIGVsZW1lbnQuICBXaGVuIHRydWUsIE9iamVjdHMgYW5kIEFycmF5cyB3aWxsIHNraXAgZGlydHkKICAgICAgICAgICAqIGNoZWNraW5nLCBvdGhlcndpc2Ugc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nIHdpbGwgYmUgdXNlZC4KICAgICAgICAgICAqLwogICAgICAgICAgbXV0YWJsZURhdGE6IEJvb2xlYW4KICAgICAgICB9OwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICAgKgogICAgICAgKiBXaGVuIGB0aGlzLm11dGFibGVEYXRhYCBpcyB0cnVlIG9uIHRoaXMgaW5zdGFuY2UsIHRoaXMgbWV0aG9kCiAgICAgICAqIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICAgKiAocmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBgX19kYXRhYCBjYWNoZSkgZm9yIE9iamVjdHMuICBTaW5jZSB0aGUgdGVtcAogICAgICAgKiBjYWNoZSBpcyBjbGVhcmVkIGF0IHRoZSBlbmQgb2YgYSB0dXJuLCB0aGlzIGltcGxlbWVudGF0aW9uIGFsbG93cwogICAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAgICogc2FtZSBvYmplY3QgKHVzaW5nIHRoZSB0ZW1wIGNhY2hlIGFzIGFuIGluLXR1cm4gYmFja3N0b3AgdG8gcHJldmVudAogICAgICAgKiBjeWNsZXMgZHVlIHRvIDItd2F5IG5vdGlmaWNhdGlvbikuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGEgY2hhbmdlCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICAgIHJldHVybiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UodGhpcywgcHJvcGVydHksIHZhbHVlLCBvbGQsIHRoaXMubXV0YWJsZURhdGEpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIE9wdGlvbmFsTXV0YWJsZURhdGE7CgogIH0pOwoKICAvLyBFeHBvcnQgZm9yIHVzZSBieSBsZWdhY3kgYmVoYXZpb3IKICBQb2x5bWVyLk11dGFibGVEYXRhLl9tdXRhYmxlUHJvcGVydHlDaGFuZ2UgPSBtdXRhYmxlUHJvcGVydHlDaGFuZ2U7Cgp9KSgpOwoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8vIEJhc2UgY2xhc3MgZm9yIEhUTUxUZW1wbGF0ZUVsZW1lbnQgZXh0ZW5zaW9uIHRoYXQgaGFzIHByb3BlcnR5IGVmZmVjdHMKICAgIC8vIG1hY2hpbmVyeSBmb3IgcHJvcGFnYXRpbmcgaG9zdCBwcm9wZXJ0aWVzIHRvIGNoaWxkcmVuLiBUaGlzIGlzIGFuIEVTNQogICAgLy8gY2xhc3Mgb25seSBiZWNhdXNlIEJhYmVsIChpbmNvcnJlY3RseSkgcmVxdWlyZXMgc3VwZXIoKSBpbiB0aGUgY2xhc3MKICAgIC8vIGNvbnN0cnVjdG9yIGV2ZW4gdGhvdWdoIG5vIGB0aGlzYCBpcyB1c2VkIGFuZCBpdCByZXR1cm5zIGFuIGluc3RhbmNlLgogICAgbGV0IG5ld0luc3RhbmNlID0gbnVsbDsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge0hUTUxUZW1wbGF0ZUVsZW1lbnR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uKCkgeyByZXR1cm4gbmV3SW5zdGFuY2U7IH0KICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24ucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShIVE1MVGVtcGxhdGVFbGVtZW50LnByb3RvdHlwZSwgewogICAgICBjb25zdHJ1Y3RvcjogewogICAgICAgIHZhbHVlOiBIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9uLAogICAgICAgIHdyaXRhYmxlOiB0cnVlCiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAZXh0ZW5kcyB7SFRNTFRlbXBsYXRlRWxlbWVudEV4dGVuc2lvbn0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IERhdGFUZW1wbGF0ZSA9IFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9NdXRhYmxlRGF0YX0KICAgICAqIEBleHRlbmRzIHtEYXRhVGVtcGxhdGV9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBNdXRhYmxlRGF0YVRlbXBsYXRlID0gUG9seW1lci5NdXRhYmxlRGF0YShEYXRhVGVtcGxhdGUpOwoKICAgIC8vIEFwcGxpZXMgYSBEYXRhVGVtcGxhdGUgc3ViY2xhc3MgdG8gYSA8dGVtcGxhdGU+IGluc3RhbmNlCiAgICBmdW5jdGlvbiB1cGdyYWRlVGVtcGxhdGUodGVtcGxhdGUsIGNvbnN0cnVjdG9yKSB7CiAgICAgIG5ld0luc3RhbmNlID0gdGVtcGxhdGU7CiAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0ZW1wbGF0ZSwgY29uc3RydWN0b3IucHJvdG90eXBlKTsKICAgICAgbmV3IGNvbnN0cnVjdG9yKCk7CiAgICAgIG5ld0luc3RhbmNlID0gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEJhc2UgY2xhc3MgZm9yIFRlbXBsYXRlSW5zdGFuY2UuCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGJhc2UgPSBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cyhjbGFzcyB7fSk7CgogICAgLyoqCiAgICAgKiBAcG9seW1lcgogICAgICogQGN1c3RvbUVsZW1lbnQKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHMKICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVJbnN0YW5jZUJhc2UgZXh0ZW5kcyBiYXNlIHsKICAgICAgY29uc3RydWN0b3IocHJvcHMpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX2NvbmZpZ3VyZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX3N0YW1wVGVtcGxhdGUodGhpcy5fX2RhdGFIb3N0KTsKICAgICAgICAvLyBTYXZlIGxpc3Qgb2Ygc3RhbXBlZCBjaGlsZHJlbgogICAgICAgIGxldCBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW4gPSBbXTsKICAgICAgICBmb3IgKGxldCBuID0gdGhpcy5yb290LmZpcnN0Q2hpbGQ7IG47IG49bi5uZXh0U2libGluZykgewogICAgICAgICAgY2hpbGRyZW4ucHVzaChuKTsKICAgICAgICAgIG4uX190ZW1wbGF0aXplSW5zdGFuY2UgPSB0aGlzOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRpemVPd25lciAmJgogICAgICAgICAgdGhpcy5fX3RlbXBsYXRpemVPd25lci5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pIHsKICAgICAgICAgIHRoaXMuX3Nob3dIaWRlQ2hpbGRyZW4odHJ1ZSk7CiAgICAgICAgfQogICAgICAgIC8vIEZsdXNoIHByb3BzIG9ubHkgd2hlbiBwcm9wcyBhcmUgcGFzc2VkIGlmIGluc3RhbmNlIHByb3BzIGV4aXN0CiAgICAgICAgLy8gb3Igd2hlbiB0aGVyZSBpc24ndCBpbnN0YW5jZSBwcm9wcy4KICAgICAgICBsZXQgb3B0aW9ucyA9IHRoaXMuX190ZW1wbGF0aXplT3B0aW9uczsKICAgICAgICBpZiAoKHByb3BzICYmIG9wdGlvbnMuaW5zdGFuY2VQcm9wcykgfHwgIW9wdGlvbnMuaW5zdGFuY2VQcm9wcykgewogICAgICAgICAgdGhpcy5fZW5hYmxlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ29uZmlndXJlIHRoZSBnaXZlbiBgcHJvcHNgIGJ5IGNhbGxpbmcgYF9zZXRQZW5kaW5nUHJvcGVydHlgLiBBbHNvCiAgICAgICAqIHNldHMgYW55IHByb3BlcnRpZXMgc3RvcmVkIGluIGBfX2hvc3RQcm9wc2AuCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBPYmplY3Qgb2YgcHJvcGVydHkgbmFtZS12YWx1ZSBwYWlycyB0byBzZXQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfY29uZmlndXJlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCkgewogICAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gdGhpcy5fX2hvc3RQcm9wcykgewogICAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoaHByb3AsIHRoaXMuX19kYXRhSG9zdFsnX2hvc3RfJyArIGhwcm9wXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEFueSBpbnN0YW5jZSBwcm9wcyBwYXNzZWQgaW4gdGhlIGNvbnN0cnVjdG9yIHdpbGwgb3ZlcndyaXRlIGhvc3QgcHJvcHM7CiAgICAgICAgLy8gbm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBhIHVzZXIgZXJyb3IgYnV0IHdlIGRvbid0IHNwZWNpZmljYWxseSBmaWx0ZXIgdGhlbQogICAgICAgIGZvciAobGV0IGlwcm9wIGluIHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoaXByb3AsIHByb3BzW2lwcm9wXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBhIGhvc3QgcHJvcGVydHkgdG8gdGhpcyBpbnN0YW5jZS4gIFRoaXMgbWV0aG9kIHNob3VsZCBiZQogICAgICAgKiBjYWxsZWQgb24gaW5zdGFuY2VzIGZyb20gdGhlIGBvcHRpb25zLmZvcndhcmRIb3N0UHJvcGAgY2FsbGJhY2sKICAgICAgICogdG8gcHJvcGFnYXRlIGNoYW5nZXMgb2YgaG9zdCBwcm9wZXJ0aWVzIHRvIGVhY2ggaW5zdGFuY2UuCiAgICAgICAqCiAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgZW5xdWV1ZXMgdGhlIGNoYW5nZSwgd2hpY2ggYXJlIGZsdXNoZWQgYXMgYSBiYXRjaC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgb3IgcGF0aCBuYW1lCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIGZvcndhcmQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGZvcndhcmRIb3N0UHJvcChwcm9wLCB2YWx1ZSkgewogICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcCwgdmFsdWUsIGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgdGhpcy5fX2RhdGFIb3N0Ll9lbnF1ZXVlQ2xpZW50KHRoaXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE92ZXJyaWRlIHBvaW50IGZvciBhZGRpbmcgY3VzdG9tIG9yIHNpbXVsYXRlZCBldmVudCBoYW5kbGluZy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBldmVudCBsaXN0ZW5lciB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gYWRkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBpZiAodGhpcy5fbWV0aG9kSG9zdCAmJiB0aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnMucGFyZW50TW9kZWwpIHsKICAgICAgICAgIC8vIElmIHRoaXMgaW5zdGFuY2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBwYXJlbnQgbW9kZWwsIGRlY29yYXRlCiAgICAgICAgICAvLyBldmVudHMgdGhpcyB0ZW1wbGF0ZSBpbnN0YW5jZSBhcyBgbW9kZWxgCiAgICAgICAgICB0aGlzLl9tZXRob2RIb3N0Ll9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgKGUpID0+IHsKICAgICAgICAgICAgZS5tb2RlbCA9IHRoaXM7CiAgICAgICAgICAgIGhhbmRsZXIoZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gT3RoZXJ3aXNlIGRlbGVnYXRlIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QgKHdoaWNoIGNvdWxkIGJlKQogICAgICAgICAgLy8gYW5vdGhlciB0ZW1wbGF0ZSBpbnN0YW5jZQogICAgICAgICAgbGV0IHRlbXBsYXRlSG9zdCA9IHRoaXMuX19kYXRhSG9zdC5fX2RhdGFIb3N0OwogICAgICAgICAgaWYgKHRlbXBsYXRlSG9zdCkgewogICAgICAgICAgICB0ZW1wbGF0ZUhvc3QuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICAgKiB0ZXh0IG5vZGVzLCBgdGV4dENvbnRlbnRgIGlzIHJlbW92ZWQgd2hpbGUgImhpZGRlbiIgYW5kIHJlcGxhY2VkIHdoZW4KICAgICAgICogInNob3duLiIKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoaWRlIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICAgKiBzZXQgdG8gZmFsc2UgdG8gc2hvdyB0aGVtLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvd0hpZGVDaGlsZHJlbihoaWRlKSB7CiAgICAgICAgbGV0IGMgPSB0aGlzLmNoaWxkcmVuOwogICAgICAgIGZvciAobGV0IGk9MDsgaTxjLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbiA9IGNbaV07CiAgICAgICAgICAvLyBJZ25vcmUgbm9uLWNoYW5nZXMKICAgICAgICAgIGlmIChCb29sZWFuKGhpZGUpICE9IEJvb2xlYW4obi5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pKSB7CiAgICAgICAgICAgIGlmIChuLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lclRleHRDb250ZW50X18gPSBuLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgbi50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBuLnRleHRDb250ZW50ID0gbi5fX3BvbHltZXJUZXh0Q29udGVudF9fOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gcmVtb3ZlIGFuZCByZXBsYWNlIHNsb3QKICAgICAgICAgICAgfSBlbHNlIGlmIChuLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKSB7CiAgICAgICAgICAgICAgaWYgKGhpZGUpIHsKICAgICAgICAgICAgICAgIG4uX19wb2x5bWVyUmVwbGFjZWRfXyA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJ2hpZGRlbi1zbG90Jyk7CiAgICAgICAgICAgICAgICBuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4uX19wb2x5bWVyUmVwbGFjZWRfXywgbik7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcGxhY2UgPSBuLl9fcG9seW1lclJlcGxhY2VkX187CiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgewogICAgICAgICAgICAgICAgICByZXBsYWNlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKG4sIHJlcGxhY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgZWxzZSBpZiAobi5zdHlsZSkgewogICAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgICBuLl9fcG9seW1lckRpc3BsYXlfXyA9IG4uc3R5bGUuZGlzcGxheTsKICAgICAgICAgICAgICAgIG4uc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbi5zdHlsZS5kaXNwbGF5ID0gbi5fX3BvbHltZXJEaXNwbGF5X187CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBuLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyA9IGhpZGU7CiAgICAgICAgICBpZiAobi5fc2hvd0hpZGVDaGlsZHJlbikgewogICAgICAgICAgICBuLl9zaG93SGlkZUNoaWxkcmVuKGhpZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgcHJvcGVydHktZWZmZWN0cyBpbXBsZW1lbnRhdGlvbiB0byBpbnRlcmNlcHQKICAgICAgICogdGV4dENvbnRlbnQgYmluZGluZ3Mgd2hpbGUgY2hpbGRyZW4gYXJlICJoaWRkZW4iIGFuZCBjYWNoZSBpbgogICAgICAgKiBwcml2YXRlIHN0b3JhZ2UgZm9yIGxhdGVyIHJldHJpZXZhbC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBUaGUgbm9kZSB0byBzZXQgYSBwcm9wZXJ0eSBvbgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBUaGUgcHJvcGVydHkgdG8gc2V0CiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpIHsKICAgICAgICBpZiAobm9kZS5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18gJiYKICAgICAgICAgICAgbm9kZS5ub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBwcm9wID09ICd0ZXh0Q29udGVudCcpIHsKICAgICAgICAgIG5vZGUuX19wb2x5bWVyVGV4dENvbnRlbnRfXyA9IHZhbHVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdXBlci5fc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUobm9kZSwgcHJvcCwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogRmluZCB0aGUgcGFyZW50IG1vZGVsIG9mIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuICBUaGUgcGFyZW50IG1vZGVsCiAgICAgICAqIGlzIGVpdGhlciBhbm90aGVyIHRlbXBsYXRpemUgaW5zdGFuY2UgdGhhdCBoYWQgb3B0aW9uIGBwYXJlbnRNb2RlbDogdHJ1ZWAsCiAgICAgICAqIG9yIGVsc2UgdGhlIGhvc3QgZWxlbWVudC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBUaGUgcGFyZW50IG1vZGVsIG9mIHRoaXMgaW5zdGFuY2UKICAgICAgICovCiAgICAgIGdldCBwYXJlbnRNb2RlbCgpIHsKICAgICAgICBsZXQgbW9kZWwgPSB0aGlzLl9fcGFyZW50TW9kZWw7CiAgICAgICAgaWYgKCFtb2RlbCkgewogICAgICAgICAgbGV0IG9wdGlvbnM7CiAgICAgICAgICBtb2RlbCA9IHRoaXM7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIC8vIEEgdGVtcGxhdGUgaW5zdGFuY2UncyBgX19kYXRhSG9zdGAgaXMgYSA8dGVtcGxhdGU+CiAgICAgICAgICAgIC8vIGBtb2RlbC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3RgIGlzIHRoZSB0ZW1wbGF0ZSdzIGhvc3QKICAgICAgICAgICAgbW9kZWwgPSBtb2RlbC5fX2RhdGFIb3N0Ll9fZGF0YUhvc3Q7CiAgICAgICAgICB9IHdoaWxlICgob3B0aW9ucyA9IG1vZGVsLl9fdGVtcGxhdGl6ZU9wdGlvbnMpICYmICFvcHRpb25zLnBhcmVudE1vZGVsKTsKICAgICAgICAgIHRoaXMuX19wYXJlbnRNb2RlbCA9IG1vZGVsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbW9kZWw7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTdHViIG9mIEhUTUxFbGVtZW50J3MgYGRpc3BhdGNoRXZlbnRgLCBzbyB0aGF0IGVmZmVjdHMgdGhhdCBtYXkKICAgICAgICogZGlzcGF0Y2ggZXZlbnRzIHNhZmVseSBuby1vcC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFdmVudH0gZXZlbnQgRXZlbnQgdG8gZGlzcGF0Y2gKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gQWx3YXlzIHRydWUuCiAgICAgICAqLwogICAgICAgZGlzcGF0Y2hFdmVudChldmVudCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CgogICAgLyoqIEB0eXBlIHshRGF0YVRlbXBsYXRlfSAqLwogICAgVGVtcGxhdGVJbnN0YW5jZUJhc2UucHJvdG90eXBlLl9fZGF0YUhvc3Q7CiAgICAvKiogQHR5cGUgeyFUZW1wbGF0aXplT3B0aW9uc30gKi8KICAgIFRlbXBsYXRlSW5zdGFuY2VCYXNlLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgLyoqIEB0eXBlIHshUG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX21ldGhvZEhvc3Q7CiAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX190ZW1wbGF0aXplT3duZXI7CiAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICBUZW1wbGF0ZUluc3RhbmNlQmFzZS5wcm90b3R5cGUuX19ob3N0UHJvcHM7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgTXV0YWJsZVRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5NdXRhYmxlRGF0YShUZW1wbGF0ZUluc3RhbmNlQmFzZSk7CgogICAgZnVuY3Rpb24gZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpIHsKICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgdGhlIG93bmVyIG9mIHRoZSBvdXRlcm1vc3QgdGVtcGxhdGUuCiAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAvLyBhcHByb3hpbWF0ZSB0aGlzIHZpYSBjb29wZXJhdGlvbiB3aXRoIG91ciBkYXRhSG9zdCBhbHdheXMgc2V0dGluZwogICAgICAvLyBgX21ldGhvZEhvc3RgIGFzIGxvbmcgYXMgdGhlcmUgd2VyZSBiaW5kaW5ncyAob3IgaWQncykgb24gdGhpcwogICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICBsZXQgdGVtcGxhdGVIb3N0ID0gdGVtcGxhdGUuX19kYXRhSG9zdDsKICAgICAgcmV0dXJuIHRlbXBsYXRlSG9zdCAmJiB0ZW1wbGF0ZUhvc3QuX21ldGhvZEhvc3QgfHwgdGVtcGxhdGVIb3N0OwogICAgfQoKICAgIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgICAvKioKICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGNsYXNzLnByb3RvdHlwZSBpcyBub3QgZGVmaW5lZCBmb3Igc29tZSByZWFzb24KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlVGVtcGxhdGl6ZXJDbGFzcyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIC8vIEFub255bW91cyBjbGFzcyBjcmVhdGVkIGJ5IHRoZSB0ZW1wbGF0aXplCiAgICAgIGxldCBiYXNlID0gb3B0aW9ucy5tdXRhYmxlRGF0YSA/CiAgICAgICAgTXV0YWJsZVRlbXBsYXRlSW5zdGFuY2VCYXNlIDogVGVtcGxhdGVJbnN0YW5jZUJhc2U7CiAgICAgIC8vIEFmZm9yZGFuY2UgZm9yIGdsb2JhbCBtaXhpbnMgb250byBUZW1wbGF0aXplSW5zdGFuY2UKICAgICAgaWYgKFBvbHltZXIuVGVtcGxhdGl6ZS5taXhpbikgewogICAgICAgIGJhc2UgPSBQb2x5bWVyLlRlbXBsYXRpemUubWl4aW4oYmFzZSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIGxldCBrbGFzcyA9IGNsYXNzIGV4dGVuZHMgYmFzZSB7IH07CiAgICAgIGtsYXNzLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zID0gb3B0aW9uczsKICAgICAga2xhc3MucHJvdG90eXBlLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfQoKICAgIC8qKgogICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gY2xhc3MucHJvdG90eXBlIGlzIG5vdCBkZWZpbmVkIGZvciBzb21lIHJlYXNvbgogICAgICovCiAgICBmdW5jdGlvbiBhZGRQcm9wYWdhdGVFZmZlY3RzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpIHsKICAgICAgbGV0IHVzZXJGb3J3YXJkSG9zdFByb3AgPSBvcHRpb25zLmZvcndhcmRIb3N0UHJvcDsKICAgICAgaWYgKHVzZXJGb3J3YXJkSG9zdFByb3ApIHsKICAgICAgICAvLyBQcm92aWRlIGRhdGEgQVBJIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIG9uIG1lbW9pemVkIHRlbXBsYXRlIGNsYXNzCiAgICAgICAgbGV0IGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzOwogICAgICAgIGlmICgha2xhc3MpIHsKICAgICAgICAgIGxldCBiYXNlID0gb3B0aW9ucy5tdXRhYmxlRGF0YSA/IE11dGFibGVEYXRhVGVtcGxhdGUgOiBEYXRhVGVtcGxhdGU7CiAgICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICAgIGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzID0KICAgICAgICAgICAgY2xhc3MgVGVtcGxhdGl6ZWRUZW1wbGF0ZSBleHRlbmRzIGJhc2Uge307CiAgICAgICAgICAvLyBBZGQgdGVtcGxhdGUgLSA+aW5zdGFuY2VzIGVmZmVjdHMKICAgICAgICAgIC8vIGFuZCBob3N0IDwtIHRlbXBsYXRlIGVmZmVjdHMKICAgICAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLl9hZGRQcm9wZXJ0eUVmZmVjdCgnX2hvc3RfJyArIHByb3AsCiAgICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLlBST1BFUlRZX0VGRkVDVF9UWVBFUy5QUk9QQUdBVEUsCiAgICAgICAgICAgICAge2ZuOiBjcmVhdGVGb3J3YXJkSG9zdFByb3BFZmZlY3QocHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCl9KTsKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLl9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eSgnX2hvc3RfJyArIHByb3ApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB1cGdyYWRlVGVtcGxhdGUodGVtcGxhdGUsIGtsYXNzKTsKICAgICAgICAvLyBNaXggYW55IHByZS1ib3VuZCBkYXRhIGludG8gX19kYXRhOyBubyBuZWVkIHRvIGZsdXNoIHRoaXMgdG8KICAgICAgICAvLyBpbnN0YW5jZXMgc2luY2UgdGhleSBwdWxsIGZyb20gdGhlIHRlbXBsYXRlIGF0IGluc3RhbmNlLXRpbWUKICAgICAgICBpZiAodGVtcGxhdGUuX19kYXRhUHJvdG8pIHsKICAgICAgICAgIC8vIE5vdGUsIGdlbmVyYWxseSBgX19kYXRhUHJvdG9gIGNvdWxkIGJlIGNoYWluZWQsIGJ1dCBpdCdzIGd1YXJhbnRlZWQKICAgICAgICAgIC8vIHRvIG5vdCBiZSBzaW5jZSB0aGlzIGlzIGEgdmFuaWxsYSB0ZW1wbGF0ZSB3ZSBqdXN0IGFkZGVkIGVmZmVjdHMgdG8KICAgICAgICAgIE9iamVjdC5hc3NpZ24odGVtcGxhdGUuX19kYXRhLCB0ZW1wbGF0ZS5fX2RhdGFQcm90byk7CiAgICAgICAgfQogICAgICAgIC8vIENsZWFyIGFueSBwZW5kaW5nIGRhdGEgZm9yIHBlcmZvcm1hbmNlCiAgICAgICAgdGVtcGxhdGUuX19kYXRhVGVtcCA9IHt9OwogICAgICAgIHRlbXBsYXRlLl9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICAgIHRlbXBsYXRlLl9fZGF0YU9sZCA9IG51bGw7CiAgICAgICAgdGVtcGxhdGUuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgfQogICAgfQogICAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKICAgIGZ1bmN0aW9uIGNyZWF0ZUZvcndhcmRIb3N0UHJvcEVmZmVjdChob3N0UHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gZm9yd2FyZEhvc3RQcm9wKHRlbXBsYXRlLCBwcm9wLCBwcm9wcykgewogICAgICAgIHVzZXJGb3J3YXJkSG9zdFByb3AuY2FsbCh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIHByb3Auc3Vic3RyaW5nKCdfaG9zdF8nLmxlbmd0aCksIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzIHx8IHt9OwogICAgICBmb3IgKGxldCBpcHJvcCBpbiBvcHRpb25zLmluc3RhbmNlUHJvcHMpIHsKICAgICAgICBkZWxldGUgaG9zdFByb3BzW2lwcm9wXTsKICAgICAgICBsZXQgdXNlck5vdGlmeUluc3RhbmNlUHJvcCA9IG9wdGlvbnMubm90aWZ5SW5zdGFuY2VQcm9wOwogICAgICAgIGlmICh1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGlwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlJbnN0YW5jZVByb3BFZmZlY3QoaXByb3AsIHVzZXJOb3RpZnlJbnN0YW5jZVByb3ApfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCAmJiB0ZW1wbGF0ZS5fX2RhdGFIb3N0KSB7CiAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gaG9zdFByb3BzKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGhwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlIb3N0UHJvcEVmZmVjdCgpfSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlTm90aWZ5SW5zdGFuY2VQcm9wRWZmZWN0KGluc3RQcm9wLCB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBub3RpZnlJbnN0YW5jZVByb3AoaW5zdCwgcHJvcCwgcHJvcHMpIHsKICAgICAgICB1c2VyTm90aWZ5SW5zdGFuY2VQcm9wLmNhbGwoaW5zdC5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIGluc3QsIHByb3AsIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVOb3RpZnlIb3N0UHJvcEVmZmVjdCgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIG5vdGlmeUhvc3RQcm9wKGluc3QsIHByb3AsIHByb3BzKSB7CiAgICAgICAgaW5zdC5fX2RhdGFIb3N0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoJ19ob3N0XycgKyBwcm9wLCBwcm9wc1twcm9wXSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBNb2R1bGUgZm9yIHByZXBhcmluZyBhbmQgc3RhbXBpbmcgaW5zdGFuY2VzIG9mIHRlbXBsYXRlcyB0aGF0IHV0aWxpemUKICAgICAqIFBvbHltZXIncyBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVyIGZlYXR1cmVzLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIC8vIEdldCBhIHRlbXBsYXRlIGZyb20gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIGxldCB0ZW1wbGF0ZSA9IHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKTsKICAgICAqICAgICAvLyBQcmVwYXJlIHRoZSB0ZW1wbGF0ZQogICAgICogICAgIGxldCBUZW1wbGF0ZUNsYXNzID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUpOwogICAgICogICAgIC8vIEluc3RhbmNlIHRoZSB0ZW1wbGF0ZSB3aXRoIGFuIGluaXRpYWwgZGF0YSBtb2RlbAogICAgICogICAgIGxldCBpbnN0YW5jZSA9IG5ldyBUZW1wbGF0ZUNsYXNzKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGVsZW1lbnQncyBzaGFkb3cgRE9NCiAgICAgKiAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVGhlIGBvcHRpb25zYCBkaWN0aW9uYXJ5IHBhc3NlZCB0byBgdGVtcGxhdGl6ZWAgYWxsb3dzIGZvciBjdXN0b21pemluZwogICAgICogZmVhdHVyZXMgb2YgdGhlIGdlbmVyYXRlZCB0ZW1wbGF0ZSBjbGFzcywgaW5jbHVkaW5nIGhvdyBvdXRlci1zY29wZSBob3N0CiAgICAgKiBwcm9wZXJ0aWVzIHNob3VsZCBiZSBmb3J3YXJkZWQgaW50byB0ZW1wbGF0ZSBpbnN0YW5jZXMsIGhvdyBhbnkgaW5zdGFuY2UKICAgICAqIHByb3BlcnRpZXMgYWRkZWQgaW50byB0aGUgdGVtcGxhdGUncyBzY29wZSBzaG91bGQgYmUgbm90aWZpZWQgb3V0IHRvCiAgICAgKiB0aGUgaG9zdCwgYW5kIHdoZXRoZXIgdGhlIGluc3RhbmNlIHNob3VsZCBiZSBkZWNvcmF0ZWQgYXMgYSAicGFyZW50IG1vZGVsIgogICAgICogb2YgYW55IGV2ZW50IGhhbmRsZXJzLgogICAgICoKICAgICAqICAgICAvLyBDdXN0b21pemUgcHJvcGVydHkgZm9yd2FyZGluZyBhbmQgZXZlbnQgbW9kZWwgZGVjb3JhdGlvbgogICAgICogICAgIGxldCBUZW1wbGF0ZUNsYXNzID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAqICAgICAgIHBhcmVudE1vZGVsOiB0cnVlLAogICAgICogICAgICAgZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSkgey4uLn0sCiAgICAgKiAgICAgICBpbnN0YW5jZVByb3BzOiB7Li4ufSwKICAgICAqICAgICAgIG5vdGlmeUluc3RhbmNlUHJvcChpbnN0YW5jZSwgcHJvcGVydHksIHZhbHVlKSB7Li4ufSwKICAgICAqICAgICB9KTsKICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAgICogQHN1bW1hcnkgTW9kdWxlIGZvciBwcmVwYXJpbmcgYW5kIHN0YW1waW5nIGluc3RhbmNlcyBvZiB0ZW1wbGF0ZXMKICAgICAqICAgdXRpbGl6aW5nIFBvbHltZXIgdGVtcGxhdGluZyBmZWF0dXJlcy4KICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplID0gewoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYW4gYW5vbnltb3VzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgY2xhc3MgYm91bmQgdG8gdGhlCiAgICAgICAqIGA8dGVtcGxhdGU+YCBwcm92aWRlZC4gIEluc3RhbmNpbmcgdGhlIGNsYXNzIHdpbGwgcmVzdWx0IGluIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBiZWluZyBzdGFtcGVkIGludG8gYSBkb2N1bWVudCBmcmFnbWVudCBzdG9yZWQgYXMgdGhlIGluc3RhbmNlJ3MKICAgICAgICogYHJvb3RgIHByb3BlcnR5LCBhZnRlciB3aGljaCBpdCBjYW4gYmUgYXBwZW5kZWQgdG8gdGhlIERPTS4KICAgICAgICoKICAgICAgICogVGVtcGxhdGVzIG1heSB1dGlsaXplIGFsbCBQb2x5bWVyIGRhdGEtYmluZGluZyBmZWF0dXJlcyBhcyB3ZWxsIGFzCiAgICAgICAqIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycy4gIEV2ZW50IGxpc3RlbmVycyBhbmQgaW5saW5lIGNvbXB1dGluZwogICAgICAgKiBmdW5jdGlvbnMgaW4gdGhlIHRlbXBsYXRlIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBob3N0IG9mIHRoZSB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogVGhlIGNvbnN0cnVjdG9yIHJldHVybmVkIHRha2VzIGEgc2luZ2xlIGFyZ3VtZW50IGRpY3Rpb25hcnkgb2YgaW5pdGlhbAogICAgICAgKiBwcm9wZXJ0eSB2YWx1ZXMgdG8gcHJvcGFnYXRlIGludG8gdGVtcGxhdGUgYmluZGluZ3MuICBBZGRpdGlvbmFsbHkKICAgICAgICogaG9zdCBwcm9wZXJ0aWVzIGNhbiBiZSBmb3J3YXJkZWQgaW4sIGFuZCBpbnN0YW5jZSBwcm9wZXJ0aWVzIGNhbiBiZQogICAgICAgKiBub3RpZmllZCBvdXQgYnkgcHJvdmlkaW5nIG9wdGlvbmFsIGNhbGxiYWNrcyBpbiB0aGUgYG9wdGlvbnNgIGRpY3Rpb25hcnkuCiAgICAgICAqCiAgICAgICAqIFZhbGlkIGNvbmZpZ3VyYXRpb24gaW4gYG9wdGlvbnNgIGFyZSBhcyBmb2xsb3dzOgogICAgICAgKgogICAgICAgKiAtIGBmb3J3YXJkSG9zdFByb3AocHJvcGVydHksIHZhbHVlKWA6IENhbGxlZCB3aGVuIGEgcHJvcGVydHkgcmVmZXJlbmNlZAogICAgICAgKiAgIGluIHRoZSB0ZW1wbGF0ZSBjaGFuZ2VkIG9uIHRoZSB0ZW1wbGF0ZSdzIGhvc3QuIEFzIHRoaXMgbGlicmFyeSBkb2VzCiAgICAgICAqICAgbm90IHJldGFpbiByZWZlcmVuY2VzIHRvIHRlbXBsYXRlcyBpbnN0YW5jZWQgYnkgdGhlIHVzZXIsIGl0IGlzIHRoZQogICAgICAgKiAgIHRlbXBsYXRpemUgb3duZXIncyByZXNwb25zaWJpbGl0eSB0byBmb3J3YXJkIGhvc3QgcHJvcGVydHkgY2hhbmdlcyBpbnRvCiAgICAgICAqICAgdXNlci1zdGFtcGVkIGluc3RhbmNlcy4gIFRoZSBgaW5zdGFuY2UuZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSlgCiAgICAgICAqICAgIG1ldGhvZCBvbiB0aGUgZ2VuZXJhdGVkIGNsYXNzIHNob3VsZCBiZSBjYWxsZWQgdG8gZm9yd2FyZCBob3N0CiAgICAgICAqICAgcHJvcGVydGllcyBpbnRvIHRoZSB0ZW1wbGF0ZSB0byBwcmV2ZW50IHVubmVjZXNzYXJ5IHByb3BlcnR5LWNoYW5nZWQKICAgICAgICogICBub3RpZmljYXRpb25zLiBBbnkgcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IGFyZSBub3QKICAgICAgICogICBkZWZpbmVkIGluIGBpbnN0YW5jZVByb3BzYCB3aWxsIGJlIG5vdGlmaWVkIHVwIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QKICAgICAgICogICBhdXRvbWF0aWNhbGx5LgogICAgICAgKiAtIGBpbnN0YW5jZVByb3BzYDogRGljdGlvbmFyeSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IHdpbGwgYmUgYWRkZWQKICAgICAgICogICB0byB0aGUgaW5zdGFuY2UgYnkgdGhlIHRlbXBsYXRpemUgb3duZXIuICBUaGVzZSBwcm9wZXJ0aWVzIHNoYWRvdyBhbnkKICAgICAgICogICBob3N0IHByb3BlcnRpZXMsIGFuZCBjaGFuZ2VzIHdpdGhpbiB0aGUgdGVtcGxhdGUgdG8gdGhlc2UgcHJvcGVydGllcwogICAgICAgKiAgIHdpbGwgcmVzdWx0IGluIGBub3RpZnlJbnN0YW5jZVByb3BgIGJlaW5nIGNhbGxlZC4KICAgICAgICogLSBgbXV0YWJsZURhdGFgOiBXaGVuIGB0cnVlYCwgdGhlIGdlbmVyYXRlZCBjbGFzcyB3aWxsIHNraXAgc3RyaWN0CiAgICAgICAqICAgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgICAgICogICAiZGlydHkiKS4KICAgICAgICogLSBgbm90aWZ5SW5zdGFuY2VQcm9wKGluc3RhbmNlLCBwcm9wZXJ0eSwgdmFsdWUpYDogQ2FsbGVkIHdoZW4KICAgICAgICogICBhbiBpbnN0YW5jZSBwcm9wZXJ0eSBjaGFuZ2VzLiAgVXNlcnMgbWF5IGNob29zZSB0byBjYWxsIGBub3RpZnlQYXRoYAogICAgICAgKiAgIG9uIGUuZy4gdGhlIG93bmVyIHRvIG5vdGlmeSB0aGUgY2hhbmdlLgogICAgICAgKiAtIGBwYXJlbnRNb2RlbGA6IFdoZW4gYHRydWVgLCBldmVudHMgaGFuZGxlZCBieSBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMKICAgICAgICogICAoYG9uLWV2ZW50PSJoYW5kbGVyImApIHdpbGwgYmUgZGVjb3JhdGVkIHdpdGggYSBgbW9kZWxgIHByb3BlcnR5IHBvaW50aW5nCiAgICAgICAqICAgdG8gdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRoYXQgc3RhbXBlZCBpdC4gIEl0IHdpbGwgYWxzbyBiZSByZXR1cm5lZAogICAgICAgKiAgIGZyb20gYGluc3RhbmNlLnBhcmVudE1vZGVsYCBpbiBjYXNlcyB3aGVyZSB0ZW1wbGF0ZSBpbnN0YW5jZSBuZXN0aW5nCiAgICAgICAqICAgY2F1c2VzIGFuIGlubmVyIG1vZGVsIHRvIHNoYWRvdyBhbiBvdXRlciBtb2RlbC4KICAgICAgICoKICAgICAgICogQWxsIGNhbGxiYWNrcyBhcmUgY2FsbGVkIGJvdW5kIHRvIHRoZSBgb3duZXJgLiBBbnkgY29udGV4dAogICAgICAgKiBuZWVkZWQgZm9yIHRoZSBjYWxsYmFja3MgKHN1Y2ggYXMgcmVmZXJlbmNlcyB0byBgaW5zdGFuY2VzYCBzdGFtcGVkKQogICAgICAgKiBzaG91bGQgYmUgc3RvcmVkIG9uIHRoZSBgb3duZXJgIHN1Y2ggdGhhdCB0aGV5IGNhbiBiZSByZXRyaWV2ZWQgdmlhCiAgICAgICAqIGB0aGlzYC4KICAgICAgICoKICAgICAgICogV2hlbiBgb3B0aW9ucy5mb3J3YXJkSG9zdFByb3BgIGlzIGRlY2xhcmVkIGFzIGFuIG9wdGlvbiwgYW55IHByb3BlcnRpZXMKICAgICAgICogcmVmZXJlbmNlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZvcndhcmRlZCBmcm9tIHRoZSBob3N0IG9mCiAgICAgICAqIHRoZSBgPHRlbXBsYXRlPmAgdG8gaW5zdGFuY2VzLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYW55IHByb3BlcnRpZXMgbGlzdGVkIGluCiAgICAgICAqIHRoZSBgb3B0aW9ucy5pbnN0YW5jZVByb3BzYCBvYmplY3QuICBgaW5zdGFuY2VQcm9wc2AgYXJlIGFzc3VtZWQgdG8gYmUKICAgICAgICogbWFuYWdlZCBieSB0aGUgb3duZXIgb2YgdGhlIGluc3RhbmNlcywgZWl0aGVyIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvcgogICAgICAgKiBvciBzZXQgYWZ0ZXIgdGhlIGZhY3QuICBOb3RlLCBhbnkgcHJvcGVydGllcyBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igd2lsbAogICAgICAgKiBhbHdheXMgYmUgc2V0IHRvIHRoZSBpbnN0YW5jZSAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgd291bGQgbm9ybWFsbHkKICAgICAgICogYmUgZm9yd2FyZGVkIGZyb20gdGhlIGhvc3QpLgogICAgICAgKgogICAgICAgKiBOb3RlIHRoYXQgYHRlbXBsYXRpemUoKWAgY2FuIGJlIHJ1biBvbmx5IG9uY2UgZm9yIGEgZ2l2ZW4gYDx0ZW1wbGF0ZT5gLgogICAgICAgKiBGdXJ0aGVyIGNhbGxzIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiBBbHNvLCB0aGVyZSBpcyBhIHNwZWNpYWwKICAgICAgICogYmVoYXZpb3IgaWYgdGhlIHRlbXBsYXRlIHdhcyBkdXBsaWNhdGVkIHRocm91Z2ggYSBtZWNoYW5pc20gc3VjaCBhcwogICAgICAgKiBgPGRvbS1yZXBlYXQ+YCBvciBgPHRlc3QtZml4dHVyZT5gLiBJbiB0aGlzIGNhc2UsIGFsbCBjYWxscyB0bwogICAgICAgKiBgdGVtcGxhdGl6ZSgpYCByZXR1cm4gdGhlIHNhbWUgY2xhc3MgZm9yIGFsbCBkdXBsaWNhdGVzIG9mIGEgdGVtcGxhdGUuCiAgICAgICAqIFRoZSBjbGFzcyByZXR1cm5lZCBmcm9tIGB0ZW1wbGF0aXplKClgIGlzIGdlbmVyYXRlZCBvbmx5IG9uY2UgdXNpbmcKICAgICAgICogdGhlIGBvcHRpb25zYCBmcm9tIHRoZSBmaXJzdCBjYWxsLiBUaGlzIG1lYW5zIHRoYXQgYW55IGBvcHRpb25zYAogICAgICAgKiBwcm92aWRlZCB0byBzdWJzZXF1ZW50IGNhbGxzIHdpbGwgYmUgaWdub3JlZC4gVGhlcmVmb3JlLCBpdCBpcyB2ZXJ5CiAgICAgICAqIGltcG9ydGFudCBub3QgdG8gY2xvc2Ugb3ZlciBhbnkgdmFyaWFibGVzIGluc2lkZSB0aGUgY2FsbGJhY2tzLiBBbHNvLAogICAgICAgKiBhcnJvdyBmdW5jdGlvbnMgbXVzdCBiZSBhdm9pZGVkIGJlY2F1c2UgdGhleSBiaW5kIHRoZSBvdXRlciBgdGhpc2AuCiAgICAgICAqIEluc2lkZSB0aGUgY2FsbGJhY2tzLCBhbnkgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBjYW4gYmUgYWNjZXNzZWQKICAgICAgICogdGhyb3VnaCBgdGhpc2AsIHdoaWNoIHBvaW50cyB0byB0aGUgYG93bmVyYC4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIFBvbHltZXIuVGVtcGxhdGl6ZQogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byB0ZW1wbGF0aXplCiAgICAgICAqIEBwYXJhbSB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHM9fSBvd25lciBPd25lciBvZiB0aGUgdGVtcGxhdGUgaW5zdGFuY2VzOwogICAgICAgKiAgIGFueSBvcHRpb25hbCBjYWxsYmFja3Mgd2lsbCBiZSBib3VuZCB0byB0aGlzIG93bmVyLgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG9wdGlvbnMgT3B0aW9ucyBkaWN0aW9uYXJ5IChzZWUgc3VtbWFyeSBmb3IgZGV0YWlscykKICAgICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OlRlbXBsYXRlSW5zdGFuY2VCYXNlKX0gR2VuZXJhdGVkIGNsYXNzIGJvdW5kIHRvIHRoZSB0ZW1wbGF0ZQogICAgICAgKiAgIHByb3ZpZGVkCiAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgb3duZXIsIG9wdGlvbnMpIHsKICAgICAgICAvLyBVbmRlciBzdHJpY3RUZW1wbGF0ZVBvbGljeSwgdGhlIHRlbXBsYXRpemVkIGVsZW1lbnQgbXVzdCBiZSBvd25lZAogICAgICAgIC8vIGJ5IGEgKHRydXN0ZWQpIFBvbHltZXIgZWxlbWVudCwgaW5kaWNhdGVkIGJ5IGV4aXN0ZW5jZSBvZiBfbWV0aG9kSG9zdDsKICAgICAgICAvLyBlLmcuIGZvciBkb20taWYgJiBkb20tcmVwZWF0IGluIG1haW4gZG9jdW1lbnQsIF9tZXRob2RIb3N0IGlzIG51bGwKICAgICAgICBpZiAoUG9seW1lci5zdHJpY3RUZW1wbGF0ZVBvbGljeSAmJiAhZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3N0cmljdFRlbXBsYXRlUG9saWN5OiB0ZW1wbGF0ZSBvd25lciBub3QgdHJ1c3RlZCcpOwogICAgICAgIH0KICAgICAgICBvcHRpb25zID0gLyoqIEB0eXBlIHshVGVtcGxhdGl6ZU9wdGlvbnN9ICovKG9wdGlvbnMgfHwge30pOwogICAgICAgIGlmICh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lcikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIDx0ZW1wbGF0ZT4gY2FuIG9ubHkgYmUgdGVtcGxhdGl6ZWQgb25jZScpOwogICAgICAgIH0KICAgICAgICB0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciA9IG93bmVyOwogICAgICAgIGNvbnN0IGN0b3IgPSBvd25lciA/IG93bmVyLmNvbnN0cnVjdG9yIDogVGVtcGxhdGVJbnN0YW5jZUJhc2U7CiAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IGN0b3IuX3BhcnNlVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIC8vIEdldCBtZW1vaXplZCBiYXNlIGNsYXNzIGZvciB0aGUgcHJvdG90eXBpY2FsIHRlbXBsYXRlLCB3aGljaAogICAgICAgIC8vIGluY2x1ZGVzIHByb3BlcnR5IGVmZmVjdHMgZm9yIGJpbmRpbmcgdGVtcGxhdGUgJiBmb3J3YXJkaW5nCiAgICAgICAgbGV0IGJhc2VDbGFzcyA9IHRlbXBsYXRlSW5mby50ZW1wbGF0aXplSW5zdGFuY2VDbGFzczsKICAgICAgICBpZiAoIWJhc2VDbGFzcykgewogICAgICAgICAgYmFzZUNsYXNzID0gY3JlYXRlVGVtcGxhdGl6ZXJDbGFzcyh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKTsKICAgICAgICAgIHRlbXBsYXRlSW5mby50ZW1wbGF0aXplSW5zdGFuY2VDbGFzcyA9IGJhc2VDbGFzczsKICAgICAgICB9CiAgICAgICAgLy8gSG9zdCBwcm9wZXJ0eSBmb3J3YXJkaW5nIG11c3QgYmUgaW5zdGFsbGVkIG9udG8gdGVtcGxhdGUgaW5zdGFuY2UKICAgICAgICBhZGRQcm9wYWdhdGVFZmZlY3RzKHRlbXBsYXRlLCB0ZW1wbGF0ZUluZm8sIG9wdGlvbnMpOwogICAgICAgIC8vIFN1YmNsYXNzIGJhc2UgY2xhc3MgYW5kIGFkZCByZWZlcmVuY2UgZm9yIHRoaXMgc3BlY2lmaWMgdGVtcGxhdGUKICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICBsZXQga2xhc3MgPSBjbGFzcyBUZW1wbGF0ZUluc3RhbmNlIGV4dGVuZHMgYmFzZUNsYXNzIHt9OwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fbWV0aG9kSG9zdCA9IGZpbmRNZXRob2RIb3N0KHRlbXBsYXRlKTsKICAgICAgICBrbGFzcy5wcm90b3R5cGUuX19kYXRhSG9zdCA9IHRlbXBsYXRlOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPd25lciA9IG93bmVyOwogICAgICAgIGtsYXNzLnByb3RvdHlwZS5fX2hvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHM7CiAgICAgICAga2xhc3MgPSAvKiogQHR5cGUge2Z1bmN0aW9uKG5ldzpUZW1wbGF0ZUluc3RhbmNlQmFzZSl9ICovKGtsYXNzKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgcmV0dXJuIGtsYXNzOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHRlbXBsYXRlICJtb2RlbCIgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCwgd2hpY2gKICAgICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAgICogY29udGFpbmVkIGluLiBBIHRlbXBsYXRlIG1vZGVsIGlzIGFuIGluc3RhbmNlIG9mCiAgICAgICAqIGBUZW1wbGF0ZUluc3RhbmNlQmFzZWAsIGFuZCBzaG91bGQgYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEKICAgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAqCiAgICAgICAqIEV4YW1wbGU6CiAgICAgICAqCiAgICAgICAqICAgbGV0IG1vZGVsID0gbW9kZWxGb3JFbGVtZW50KGVsKTsKICAgICAgICogICBpZiAobW9kZWwuaW5kZXggPCAxMCkgewogICAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAgICogICB9CiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyLlRlbXBsYXRpemUKICAgICAgICogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUaGUgbW9kZWwgd2lsbCBiZSByZXR1cm5lZCBmb3IKICAgICAgICogICBlbGVtZW50cyBzdGFtcGVkIGZyb20gdGhpcyB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0ge05vZGU9fSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIHJldHVybiBhIHRlbXBsYXRlIG1vZGVsLgogICAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0gVGVtcGxhdGUgaW5zdGFuY2UgcmVwcmVzZW50aW5nIHRoZQogICAgICAgKiAgIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBlbGVtZW50CiAgICAgICAqLwogICAgICBtb2RlbEZvckVsZW1lbnQodGVtcGxhdGUsIG5vZGUpIHsKICAgICAgICBsZXQgbW9kZWw7CiAgICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICAgIC8vIEFuIGVsZW1lbnQgd2l0aCBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIG1hcmtzIHRoZSB0b3AgYm91bmRhcnkKICAgICAgICAgIC8vIG9mIGEgc2NvcGU7IHdhbGsgdXAgdW50aWwgd2UgZmluZCBvbmUsIGFuZCB0aGVuIGVuc3VyZSB0aGF0CiAgICAgICAgICAvLyBpdHMgX19kYXRhSG9zdCBtYXRjaGVzIGB0aGlzYCwgbWVhbmluZyB0aGlzIGRvbS1yZXBlYXQgc3RhbXBlZCBpdAogICAgICAgICAgaWYgKChtb2RlbCA9IG5vZGUuX190ZW1wbGF0aXplSW5zdGFuY2UpKSB7CiAgICAgICAgICAgIC8vIEZvdW5kIGFuIGVsZW1lbnQgc3RhbXBlZCBieSBhbm90aGVyIHRlbXBsYXRlOyBrZWVwIHdhbGtpbmcgdXAKICAgICAgICAgICAgLy8gZnJvbSBpdHMgX19kYXRhSG9zdAogICAgICAgICAgICBpZiAobW9kZWwuX19kYXRhSG9zdCAhPSB0ZW1wbGF0ZSkgewogICAgICAgICAgICAgIG5vZGUgPSBtb2RlbC5fX2RhdGFIb3N0OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJldHVybiBtb2RlbDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gU3RpbGwgaW4gYSB0ZW1wbGF0ZSBzY29wZSwga2VlcCBnb2luZyB1cCB1bnRpbAogICAgICAgICAgICAvLyBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIGlzIGZvdW5kCiAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9OwoKICAgIFBvbHltZXIuVGVtcGxhdGVJbnN0YW5jZUJhc2UgPSBUZW1wbGF0ZUluc3RhbmNlQmFzZTsKCiAgfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAgIC8qKgogICAgICogQHR5cGVkZWYge3sKICAgICAqICAgX3RlbXBsYXRpemVyVGVtcGxhdGU6IEhUTUxUZW1wbGF0ZUVsZW1lbnQsCiAgICAgKiAgIF9wYXJlbnRNb2RlbDogYm9vbGVhbiwKICAgICAqICAgX2luc3RhbmNlUHJvcHM6IE9iamVjdCwKICAgICAqICAgX2ZvcndhcmRIb3N0UHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgX25vdGlmeUluc3RhbmNlUHJvcFYyOiBGdW5jdGlvbiwKICAgICAqICAgY3RvcjogVGVtcGxhdGVJbnN0YW5jZUJhc2UKICAgICAqIH19CiAgICAgKi8KICAgIGxldCBUZW1wbGF0aXplclVzZXI7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUKCiAgICAvKioKICAgICAqIFRoZSBgUG9seW1lci5UZW1wbGF0aXplcmAgYmVoYXZpb3IgYWRkcyBtZXRob2RzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZgogICAgICogdGVtcGxhdGVzIHRoYXQgYXJlIGVhY2ggbWFuYWdlZCBieSBhbiBhbm9ueW1vdXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYAogICAgICogaW5zdGFuY2Ugd2hlcmUgZGF0YS1iaW5kaW5ncyBpbiB0aGUgc3RhbXBlZCB0ZW1wbGF0ZSBjb250ZW50IGFyZSBib3VuZCB0bwogICAgICogYWNjZXNzb3JzIG9uIGl0c2VsZi4KICAgICAqCiAgICAgKiBUaGlzIGJlaGF2aW9yIGlzIHByb3ZpZGVkIGluIFBvbHltZXIgMi54IGFzIGEgaHlicmlkLWVsZW1lbnQgY29udmVuaWVuY2UKICAgICAqIG9ubHkuICBGb3Igbm9uLWh5YnJpZCB1c2FnZSwgdGhlIGBQb2x5bWVyLlRlbXBsYXRpemVgIGxpYnJhcnkKICAgICAqIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgLy8gR2V0IGEgdGVtcGxhdGUgZnJvbSBzb21ld2hlcmUsIGUuZy4gbGlnaHQgRE9NCiAgICAgKiAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpOwogICAgICogICAgIC8vIFByZXBhcmUgdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgdGhpcy50ZW1wbGF0aXplKHRlbXBsYXRlKTsKICAgICAqICAgICAvLyBJbnN0YW5jZSB0aGUgdGVtcGxhdGUgd2l0aCBhbiBpbml0aWFsIGRhdGEgbW9kZWwKICAgICAqICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLnN0YW1wKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIFBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGluc3RhbmNlLnJvb3QpOwogICAgICogICAgIC8vIENoYW5naW5nIGEgcHJvcGVydHkgb24gdGhlIGluc3RhbmNlIHdpbGwgcHJvcGFnYXRlIHRvIGJpbmRpbmdzCiAgICAgKiAgICAgLy8gaW4gdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgaW5zdGFuY2UubXlQcm9wID0gJ25ldyB2YWx1ZSc7CiAgICAgKgogICAgICogVXNlcnMgb2YgYFRlbXBsYXRpemVyYCBtYXkgbmVlZCB0byBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBhYnN0cmFjdAogICAgICogQVBJJ3MgdG8gZGV0ZXJtaW5lIGhvdyBwcm9wZXJ0aWVzIGFuZCBwYXRocyBmcm9tIHRoZSBob3N0IHNob3VsZCBiZQogICAgICogZm9yd2FyZGVkIGludG8gdG8gaW5zdGFuY2VzOgogICAgICoKICAgICAqICAgICBfZm9yd2FyZEhvc3RQcm9wVjI6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKQogICAgICoKICAgICAqIExpa2V3aXNlLCB1c2VycyBtYXkgaW1wbGVtZW50IHRoZXNlIGFkZGl0aW9uYWwgYWJzdHJhY3QgQVBJJ3MgdG8gZGV0ZXJtaW5lCiAgICAgKiBob3cgaW5zdGFuY2Utc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGNoYW5nZSBvbiB0aGUgaW5zdGFuY2Ugc2hvdWxkIGJlCiAgICAgKiBmb3J3YXJkZWQgb3V0IHRvIHRoZSBob3N0LCBpZiBuZWNlc3NhcnkuCiAgICAgKgogICAgICogICAgIF9ub3RpZnlJbnN0YW5jZVByb3BWMjogZnVuY3Rpb24oaW5zdCwgcHJvcCwgdmFsdWUpCiAgICAgKgogICAgICogSW4gb3JkZXIgdG8gZGV0ZXJtaW5lIHdoaWNoIHByb3BlcnRpZXMgYXJlIGluc3RhbmNlLXNwZWNpZmljIGFuZCByZXF1aXJlCiAgICAgKiBjdXN0b20gbm90aWZpY2F0aW9uIHZpYSBgX25vdGlmeUluc3RhbmNlUHJvcGAsIGRlZmluZSBhbiBgX2luc3RhbmNlUHJvcHNgCiAgICAgKiBvYmplY3QgY29udGFpbmluZyBrZXlzIGZvciBlYWNoIGluc3RhbmNlIHByb3AsIGZvciBleGFtcGxlOgogICAgICoKICAgICAqICAgICBfaW5zdGFuY2VQcm9wczogewogICAgICogICAgICAgaXRlbTogdHJ1ZSwKICAgICAqICAgICAgIGluZGV4OiB0cnVlCiAgICAgKiAgICAgfQogICAgICoKICAgICAqIEFueSBwcm9wZXJ0aWVzIHVzZWQgaW4gdGhlIHRlbXBsYXRlIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGluIF9pbnN0YW5jZVByb3AKICAgICAqIHdpbGwgYmUgZm9yd2FyZGVkIG91dCB0byB0aGUgVGVtcGxhdGl6ZSBgb3duZXJgIGF1dG9tYXRpY2FsbHkuCiAgICAgKgogICAgICogVXNlcnMgbWF5IGFsc28gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgYWJzdHJhY3QgZnVuY3Rpb24gdG8gc2hvdyBvcgogICAgICogaGlkZSBhbnkgRE9NIGdlbmVyYXRlZCB1c2luZyBgc3RhbXBgOgogICAgICoKICAgICAqICAgICBfc2hvd0hpZGVDaGlsZHJlbjogZnVuY3Rpb24oc2hvdWxkSGlkZSkKICAgICAqCiAgICAgKiBOb3RlIHRoYXQgc29tZSBjYWxsYmFja3MgYXJlIHN1ZmZpeGVkIHdpdGggYFYyYCBpbiB0aGUgUG9seW1lciAyLnggYmVoYXZpb3IKICAgICAqIGFzIHRoZSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBuZWVkIHRvIGRpZmZlciBmcm9tIHRoZSBjYWxsYmFja3MgcmVxdWlyZWQKICAgICAqIGJ5IHRoZSAxLnggVGVtcGxhdGl6ZXIgQVBJIGR1ZSB0byBjaGFuZ2VzIGluIHRoZSBgVGVtcGxhdGVJbnN0YW5jZWAgQVBJCiAgICAgKiBiZXR3ZWVuIHZlcnNpb25zIDEueCBhbmQgMi54LgogICAgICoKICAgICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgICAqLwogICAgUG9seW1lci5UZW1wbGF0aXplciA9IHsKCiAgICAgIC8qKgogICAgICAgKiBHZW5lcmF0ZXMgYW4gYW5vbnltb3VzIGBUZW1wbGF0ZUluc3RhbmNlYCBjbGFzcyAoc3RvcmVkIGFzIGB0aGlzLmN0b3JgKQogICAgICAgKiBmb3IgdGhlIHByb3ZpZGVkIHRlbXBsYXRlLiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIHBlcgogICAgICAgKiB0ZW1wbGF0ZSB0byBwcmVwYXJlIGFuIGVsZW1lbnQgZm9yIHN0YW1waW5nIHRoZSB0ZW1wbGF0ZSwgZm9sbG93ZWQKICAgICAgICogYnkgYHN0YW1wYCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiB0aGUgdGVtcGxhdGUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHByZXBhcmUKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gbXV0YWJsZURhdGEgV2hlbiBgdHJ1ZWAsIHRoZSBnZW5lcmF0ZWQgY2xhc3Mgd2lsbCBza2lwCiAgICAgICAqICAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvCiAgICAgICAqICAgYmUgImRpcnR5IikuIERlZmF1bHRzIHRvIGZhbHNlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAdGhpcyB7VGVtcGxhdGl6ZXJVc2VyfQogICAgICAgKi8KICAgICAgdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgbXV0YWJsZURhdGEpIHsKICAgICAgICB0aGlzLl90ZW1wbGF0aXplclRlbXBsYXRlID0gdGVtcGxhdGU7CiAgICAgICAgdGhpcy5jdG9yID0gUG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGVtcGxhdGUsIHRoaXMsIHsKICAgICAgICAgIG11dGFibGVEYXRhOiBCb29sZWFuKG11dGFibGVEYXRhKSwKICAgICAgICAgIHBhcmVudE1vZGVsOiB0aGlzLl9wYXJlbnRNb2RlbCwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IHRoaXMuX2luc3RhbmNlUHJvcHMsCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IHRoaXMuX2ZvcndhcmRIb3N0UHJvcFYyLAogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiB0aGlzLl9ub3RpZnlJbnN0YW5jZVByb3BWMgogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIHByZXBhcmVkIGJ5IGB0ZW1wbGF0aXplYC4gIFRoZSBvYmplY3QKICAgICAgICogcmV0dXJuZWQgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGFub255bW91cyBjbGFzcyBnZW5lcmF0ZWQgYnkgYHRlbXBsYXRpemVgCiAgICAgICAqIHdob3NlIGByb290YCBwcm9wZXJ0eSBpcyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgbmV3bHkgY2xvbmVkCiAgICAgICAqIHRlbXBsYXRlIGNvbnRlbnQsIGFuZCB3aGljaCBoYXMgcHJvcGVydHkgYWNjZXNzb3JzIGNvcnJlc3BvbmRpbmcgdG8KICAgICAgICogcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRlbXBsYXRlIGJpbmRpbmdzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IG1vZGVsIE9iamVjdCBjb250YWluaW5nIGluaXRpYWwgcHJvcGVydHkgdmFsdWVzIHRvCiAgICAgICAqICAgcG9wdWxhdGUgaW50byB0aGUgdGVtcGxhdGUgYmluZGluZ3MuCiAgICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBSZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlIG9mCiAgICAgICAqIHRoZSB0ZW1wbGF0ZSBwcmVwYXJlZCBieSBgdGVtcGxhdGl6ZWAuCiAgICAgICAqIEB0aGlzIHtUZW1wbGF0aXplclVzZXJ9CiAgICAgICAqLwogICAgICBzdGFtcChtb2RlbCkgewogICAgICAgIHJldHVybiBuZXcgdGhpcy5jdG9yKG1vZGVsKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSAibW9kZWwiIChgVGVtcGxhdGVJbnN0YW5jZWApIGFzc29jaWF0ZWQgd2l0aAogICAgICAgKiBhIGdpdmVuIGVsZW1lbnQsIHdoaWNoIHNlcnZlcyBhcyB0aGUgYmluZGluZyBzY29wZSBmb3IgdGhlIHRlbXBsYXRlCiAgICAgICAqIGluc3RhbmNlIHRoZSBlbGVtZW50IGlzIGNvbnRhaW5lZCBpbi4gIEEgdGVtcGxhdGUgbW9kZWwgc2hvdWxkIGJlIHVzZWQKICAgICAgICogdG8gbWFuaXB1bGF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAgICogQHJldHVybiB7VGVtcGxhdGVJbnN0YW5jZUJhc2V9IE1vZGVsIHJlcHJlc2VudGluZyB0aGUgYmluZGluZyBzY29wZSBmb3IKICAgICAgICogICB0aGUgZWxlbWVudC4KICAgICAgICogQHRoaXMge1RlbXBsYXRpemVyVXNlcn0KICAgICAgICovCiAgICAgIG1vZGVsRm9yRWxlbWVudChlbCkgewogICAgICAgIHJldHVybiBQb2x5bWVyLlRlbXBsYXRpemUubW9kZWxGb3JFbGVtZW50KHRoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGUsIGVsKTsKICAgICAgfQogICAgfTsKCiAgfSkoKTsKCgoKICAoZnVuY3Rpb24oKSB7CiAgICAndXNlIHN0cmljdCc7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9HZXN0dXJlRXZlbnRMaXN0ZW5lcnN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBkb21CaW5kQmFzZSA9CiAgICAgIFBvbHltZXIuR2VzdHVyZUV2ZW50TGlzdGVuZXJzKAogICAgICAgIFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YSgKICAgICAgICAgIFBvbHltZXIuUHJvcGVydHlFZmZlY3RzKEhUTUxFbGVtZW50KSkpOwoKICAgIC8qKgogICAgICogQ3VzdG9tIGVsZW1lbnQgdG8gYWxsb3cgdXNpbmcgUG9seW1lcidzIHRlbXBsYXRlIGZlYXR1cmVzIChkYXRhIGJpbmRpbmcsCiAgICAgKiBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMsIGV0Yy4pIGluIHRoZSBtYWluIGRvY3VtZW50IHdpdGhvdXQgZGVmaW5pbmcKICAgICAqIGEgbmV3IGN1c3RvbSBlbGVtZW50LgogICAgICoKICAgICAqIGA8dGVtcGxhdGU+YCB0YWdzIHV0aWxpemluZyBiaW5kaW5ncyBtYXkgYmUgd3JhcHBlZCB3aXRoIHRoZSBgPGRvbS1iaW5kPmAKICAgICAqIGVsZW1lbnQsIHdoaWNoIHdpbGwgaW1tZWRpYXRlbHkgc3RhbXAgdGhlIHdyYXBwZWQgdGVtcGxhdGUgaW50byB0aGUgbWFpbgogICAgICogZG9jdW1lbnQgYW5kIGJpbmQgZWxlbWVudHMgdG8gdGhlIGBkb20tYmluZGAgZWxlbWVudCBpdHNlbGYgYXMgdGhlCiAgICAgKiBiaW5kaW5nIHNjb3BlLgogICAgICoKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAY3VzdG9tRWxlbWVudAogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLlByb3BlcnR5RWZmZWN0cwogICAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEKICAgICAqIEBhcHBsaWVzTWl4aW4gUG9seW1lci5HZXN0dXJlRXZlbnRMaXN0ZW5lcnMKICAgICAqIEBleHRlbmRzIHtkb21CaW5kQmFzZX0KICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0byBhbGxvdyB1c2luZyBQb2x5bWVyJ3MgdGVtcGxhdGUgZmVhdHVyZXMgKGRhdGEKICAgICAqICAgYmluZGluZywgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzLCBldGMuKSBpbiB0aGUgbWFpbiBkb2N1bWVudC4KICAgICAqLwogICAgY2xhc3MgRG9tQmluZCBleHRlbmRzIGRvbUJpbmRCYXNlIHsKCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgeyByZXR1cm4gWydtdXRhYmxlLWRhdGEnXTsgfQoKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICBpZiAoUG9seW1lci5zdHJpY3RUZW1wbGF0ZVBvbGljeSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBzdHJpY3RUZW1wbGF0ZVBvbGljeTogZG9tLWJpbmQgbm90IGFsbG93ZWRgKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5yb290ID0gbnVsbDsKICAgICAgICB0aGlzLiQgPSBudWxsOwogICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IG51bGw7CiAgICAgIH0KCiAgICAgIC8qKiBAcmV0dXJuIHt2b2lkfSAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2soKSB7CiAgICAgICAgLy8gYXNzdW1lcyBvbmx5IG9uZSBvYnNlcnZlZCBhdHRyaWJ1dGUKICAgICAgICB0aGlzLm11dGFibGVEYXRhID0gdHJ1ZTsKICAgICAgfQoKICAgICAgLyoqIEByZXR1cm4ge3ZvaWR9ICovCiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICB9CgogICAgICAvKiogQHJldHVybiB7dm9pZH0gKi8KICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgdGhpcy5fX3JlbW92ZUNoaWxkcmVuKCk7CiAgICAgIH0KCiAgICAgIF9faW5zZXJ0Q2hpbGRyZW4oKSB7CiAgICAgICAgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLnJvb3QsIHRoaXMpOwogICAgICB9CgogICAgICBfX3JlbW92ZUNoaWxkcmVuKCkgewogICAgICAgIGlmICh0aGlzLl9fY2hpbGRyZW4pIHsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuX19jaGlsZHJlbltpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gVGhpcyBpcyB0eXBpY2FsbHkgb25seQogICAgICAgKiBuZWNlc3NhcnkgdG8gY2FsbCBpZiBIVE1MSW1wb3J0cyB3aXRoIHRoZSBhc3luYyBhdHRyaWJ1dGUgYXJlIHVzZWQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICByZW5kZXIoKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlOwogICAgICAgIGlmICghdGhpcy5fX2NoaWxkcmVuKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGVtcGxhdGUgfHwgdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICAgIGlmICghdGVtcGxhdGUpIHsKICAgICAgICAgICAgLy8gV2FpdCB1bnRpbCBjaGlsZExpc3QgY2hhbmdlcyBhbmQgdGVtcGxhdGUgc2hvdWxkIGJlIHRoZXJlIGJ5IHRoZW4KICAgICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICAgIHRlbXBsYXRlID0gLyoqIEB0eXBlIHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykpOwogICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkb20tYmluZCByZXF1aXJlcyBhIDx0ZW1wbGF0ZT4gY2hpbGQnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj10aGlzLnJvb3QuZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIHRoaXMuX19jaGlsZHJlblt0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoXSA9IG47CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnNlcnRDaGlsZHJlbigpOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0KCiAgICB9CgogICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkb20tYmluZCcsIERvbUJpbmQpOwoKICAgIC8qKiBAY29uc3QgKi8KICAgIFBvbHltZXIuRG9tQmluZCA9IERvbUJpbmQ7CgogIH0pKCk7CgoKCiAgKGZ1bmN0aW9uKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIC8qKgogICAgICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgc3RhdGljIHN0cmluZyB2YWx1ZSB3aGljaCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIKICAgICAqIHN0cmluZ3MgYnkgYXNzZXRpbmcgdGhhdCB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkIHZpYSB0aGlzIGNsYXNzLiBUaGUKICAgICAqIGB2YWx1ZWAgcHJvcGVydHkgcmV0dXJucyB0aGUgc3RyaW5nIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCiAgICAgKi8KICAgIGNsYXNzIExpdGVyYWxTdHJpbmcgewogICAgICBjb25zdHJ1Y3RvcihzdHJpbmcpIHsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLnZhbHVlID0gc3RyaW5nLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTGl0ZXJhbFN0cmluZyBzdHJpbmcgdmFsdWUKICAgICAgICovCiAgICAgIHRvU3RyaW5nKCkgewogICAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIE9iamVjdCB0byBzdHJpbmdpZnkgaW50byBIVE1MCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IEhUTUwgc3RyaW5naWZpZWQgZm9ybSBvZiBgb2JqYAogICAgICovCiAgICBmdW5jdGlvbiBsaXRlcmFsVmFsdWUodmFsdWUpIHsKICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGl0ZXJhbFN0cmluZykgewogICAgICAgIHJldHVybiAvKiogQHR5cGUgeyFMaXRlcmFsU3RyaW5nfSAqLyh2YWx1ZSkudmFsdWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub24tbGl0ZXJhbCB2YWx1ZSBwYXNzZWQgdG8gUG9seW1lci5odG1sTGl0ZXJhbDogJHt2YWx1ZX1gKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBPYmplY3QgdG8gc3RyaW5naWZ5IGludG8gSFRNTAogICAgICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHN0cmluZ2lmaWVkIGZvcm0gb2YgYG9iamAKICAgICAqLwogICAgZnVuY3Rpb24gaHRtbFZhbHVlKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEhUTUxUZW1wbGF0ZUVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudCB9ICovKHZhbHVlKS5pbm5lckhUTUw7CiAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaXRlcmFsU3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIGxpdGVyYWxWYWx1ZSh2YWx1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBub24tdGVtcGxhdGUgdmFsdWUgcGFzc2VkIHRvIFBvbHltZXIuaHRtbDogJHt2YWx1ZX1gKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0aGF0IGNyZWF0ZXMgYW4gSFRNTCA8dGVtcGxhdGU+IGVsZW1lbnQgZnJvbSB0aGUKICAgICAqIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcuCiAgICAgKgogICAgICogVGhpcyBhbGxvd3MgeW91IHRvIHdyaXRlIGEgUG9seW1lciBUZW1wbGF0ZSBpbiBKYXZhU2NyaXB0LgogICAgICoKICAgICAqIFRlbXBsYXRlcyBjYW4gYmUgY29tcG9zZWQgYnkgaW50ZXJwb2xhdGluZyBgSFRNTFRlbXBsYXRlRWxlbWVudGBzIGluCiAgICAgKiBleHByZXNzaW9ucyBpbiB0aGUgSmF2YVNjcmlwdCB0ZW1wbGF0ZSBsaXRlcmFsLiBUaGUgbmVzdGVkIHRlbXBsYXRlJ3MKICAgICAqIGBpbm5lckhUTUxgIGlzIGluY2x1ZGVkIGluIHRoZSBjb250YWluaW5nIHRlbXBsYXRlLiAgVGhlIG9ubHkgb3RoZXIKICAgICAqIHZhbHVlcyBhbGxvd2VkIGluIGV4cHJlc3Npb25zIGFyZSB0aG9zZSByZXR1cm5lZCBmcm9tIGBQb2x5bWVyLmh0bWxMaXRlcmFsYAogICAgICogd2hpY2ggZW5zdXJlcyBvbmx5IGxpdGVyYWwgdmFsdWVzIGZyb20gSlMgc291cmNlIGV2ZXIgcmVhY2ggdGhlIEhUTUwsIHRvCiAgICAgKiBndWFyZCBhZ2FpbnN0IFhTUyByaXNrcy4KICAgICAqCiAgICAgKiBBbGwgb3RoZXIgdmFsdWVzIGFyZSBkaXNhbGxvd2VkIGluIGV4cHJlc3Npb25zIHRvIGhlbHAgcHJldmVudCBYU1MKICAgICAqIGF0dGFja3M7IGhvd2V2ZXIsIGBQb2x5bWVyLmh0bWxMaXRlcmFsYCBjYW4gYmUgdXNlZCB0byBjb21wb3NlIHN0YXRpYwogICAgICogc3RyaW5nIHZhbHVlcyBpbnRvIHRlbXBsYXRlcy4gVGhpcyBpcyB1c2VmdWwgdG8gY29tcG9zZSBzdHJpbmdzIGludG8KICAgICAqIHBsYWNlcyB0aGF0IGRvIG5vdCBhY2NlcHQgaHRtbCwgbGlrZSB0aGUgY3NzIHRleHQgb2YgYSBgc3R5bGVgCiAgICAgKiBlbGVtZW50LgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7CiAgICAgKiAgICAgICByZXR1cm4gUG9seW1lci5odG1sYAogICAgICogICAgICAgICA8c3R5bGU+Omhvc3R7IGNvbnRlbnQ6Ii4uLiIgfTwvc3R5bGU+CiAgICAgKiAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvd2VkIj4ke3RoaXMucGFydGlhbFRlbXBsYXRlfTwvZGl2PgogICAgICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfQogICAgICogICAgICAgYDsKICAgICAqICAgICB9CiAgICAgKiAgICAgc3RhdGljIGdldCBwYXJ0aWFsVGVtcGxhdGUoKSB7IHJldHVybiBQb2x5bWVyLmh0bWxgPHNwYW4+UGFydGlhbCE8L3NwYW4+YDsgfQogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEByZXR1cm4geyFIVE1MVGVtcGxhdGVFbGVtZW50fSBDb25zdHJ1Y3RlZCBIVE1MVGVtcGxhdGVFbGVtZW50CiAgICAgKi8KICAgIFBvbHltZXIuaHRtbCA9IGZ1bmN0aW9uIGh0bWwoc3RyaW5ncywgLi4udmFsdWVzKSB7CiAgICAgIGNvbnN0IHRlbXBsYXRlID0gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gKi8oZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKSk7CiAgICAgIHRlbXBsYXRlLmlubmVySFRNTCA9IHZhbHVlcy5yZWR1Y2UoKGFjYywgdiwgaWR4KSA9PgogICAgICAgICAgYWNjICsgaHRtbFZhbHVlKHYpICsgc3RyaW5nc1tpZHggKyAxXSwgc3RyaW5nc1swXSk7CiAgICAgIHJldHVybiB0ZW1wbGF0ZTsKICAgIH07CgogICAgLyoqCiAgICAgKiBBbiBodG1sIGxpdGVyYWwgdGFnIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBgUG9seW1lci5odG1sYCB0byBjb21wb3NlLgogICAgICogYSBsaXRlcmFsIHN0cmluZy4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICogICAgICAgcmV0dXJuIFBvbHltZXIuaHRtbGAKICAgICAqICAgICAgICAgPHN0eWxlPgogICAgICogICAgICAgICAgIDpob3N0IHsgZGlzcGxheTogYmxvY2s7IH0KICAgICAqICAgICAgICAgICAke3N0eWxlVGVtcGxhdGV9CiAgICAgKiAgICAgICAgIDwvc3R5bGU+CiAgICAgKiAgICAgICAgIDxkaXYgY2xhc3M9InNoYWRvd2VkIj4ke3N0YXRpY1ZhbHVlfTwvZGl2PgogICAgICogICAgICAgICAke3N1cGVyLnRlbXBsYXRlfQogICAgICogICAgICAgYDsKICAgICAqICAgICB9CiAgICAgKiAgICAgc3RhdGljIGdldCBzdHlsZVRlbXBsYXRlKCkgeyByZXR1cm4gUG9seW1lci5odG1sTGl0ZXJhbGAuc2hhZG93ZWQgeyBiYWNrZ3JvdW5kOiBncmF5OyB9YDsgfQogICAgICoKICAgICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICAgKiBAcGFyYW0geyFJVGVtcGxhdGVBcnJheX0gc3RyaW5ncyBDb25zdGFudCBwYXJ0cyBvZiB0YWdnZWQgdGVtcGxhdGUgbGl0ZXJhbAogICAgICogQHBhcmFtIHsuLi4qfSB2YWx1ZXMgVmFyaWFibGUgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEByZXR1cm4geyFMaXRlcmFsU3RyaW5nfSBDb25zdHJ1Y3RlZCBsaXRlcmFsIHN0cmluZwogICAgICovCiAgICBQb2x5bWVyLmh0bWxMaXRlcmFsID0gZnVuY3Rpb24oc3RyaW5ncywgLi4udmFsdWVzKSB7CiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFN0cmluZyh2YWx1ZXMucmVkdWNlKChhY2MsIHYsIGlkeCkgPT4KICAgICAgICAgIGFjYyArIGxpdGVyYWxWYWx1ZSh2KSArIHN0cmluZ3NbaWR4ICsgMV0sIHN0cmluZ3NbMF0pKTsKICAgIH07CiAgfSkoKTsKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBCYXNlIGNsYXNzIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAqIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24uCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGNvbnN0cnVjdG9yCiAgICogQGltcGxlbWVudHMge1BvbHltZXJfRWxlbWVudE1peGlufQogICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgYmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBjb3JlIEFQSSBmb3IgUG9seW1lcidzCiAgICogICBrZXkgbWV0YS1wcm9ncmFtbWluZyBmZWF0dXJlcyBpbmNsdWRpbmcgdGVtcGxhdGUgc3RhbXBpbmcsIGRhdGEtYmluZGluZywKICAgKiAgIGF0dHJpYnV0ZSBkZXNlcmlhbGl6YXRpb24sIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24KICAgKi8KICBQb2x5bWVyLkVsZW1lbnQgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IFRlbXBsYXRlSW5zdGFuY2VCYXNlID0gUG9seW1lci5UZW1wbGF0ZUluc3RhbmNlQmFzZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZQoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9PcHRpb25hbE11dGFibGVEYXRhfQogICAqIEBleHRlbmRzIHtQb2x5bWVyLkVsZW1lbnR9CiAgICogQHByaXZhdGUKICAgKi8KICBjb25zdCBkb21SZXBlYXRCYXNlID0gUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhKFBvbHltZXIuRWxlbWVudCk7CgogIC8qKgogICAqIFRoZSBgPGRvbS1yZXBlYXQ+YCBlbGVtZW50IHdpbGwgYXV0b21hdGljYWxseSBzdGFtcCBhbmQgYmluZHMgb25lIGluc3RhbmNlCiAgICogb2YgdGVtcGxhdGUgY29udGVudCB0byBlYWNoIG9iamVjdCBpbiBhIHVzZXItcHJvdmlkZWQgYXJyYXkuCiAgICogYGRvbS1yZXBlYXRgIGFjY2VwdHMgYW4gYGl0ZW1zYCBwcm9wZXJ0eSwgYW5kIG9uZSBpbnN0YW5jZSBvZiB0aGUgdGVtcGxhdGUKICAgKiBpcyBzdGFtcGVkIGZvciBlYWNoIGl0ZW0gaW50byB0aGUgRE9NIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgYGRvbS1yZXBlYXRgCiAgICogZWxlbWVudC4gIFRoZSBgaXRlbWAgcHJvcGVydHkgd2lsbCBiZSBzZXQgb24gZWFjaCBpbnN0YW5jZSdzIGJpbmRpbmcKICAgKiBzY29wZSwgdGh1cyB0ZW1wbGF0ZXMgc2hvdWxkIGJpbmQgdG8gc3ViLXByb3BlcnRpZXMgb2YgYGl0ZW1gLgogICAqCiAgICogRXhhbXBsZToKICAgKgogICAqIGBgYGh0bWwKICAgKiA8ZG9tLW1vZHVsZSBpZD0iZW1wbG95ZWUtbGlzdCI+CiAgICoKICAgKiAgIDx0ZW1wbGF0ZT4KICAgKgogICAqICAgICA8ZGl2PiBFbXBsb3llZSBsaXN0OiA8L2Rpdj4KICAgKiAgICAgPGRvbS1yZXBlYXQgaXRlbXM9Int7ZW1wbG95ZWVzfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBXaXRoIHRoZSBmb2xsb3dpbmcgY3VzdG9tIGVsZW1lbnQgZGVmaW5pdGlvbjoKICAgKgogICAqIGBgYGpzCiAgICogY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZW1wbG95ZWUtbGlzdCc7IH0KICAgKiAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgKiAgICAgcmV0dXJuIHsKICAgKiAgICAgICBlbXBsb3llZXM6IHsKICAgKiAgICAgICAgIHZhbHVlKCkgewogICAqICAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAgIHtmaXJzdDogJ0JvYicsIGxhc3Q6ICdTbWl0aCd9LAogICAqICAgICAgICAgICAgIHtmaXJzdDogJ1NhbGx5JywgbGFzdDogJ0pvaG5zb24nfSwKICAgKiAgICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICAgXTsKICAgKiAgICAgICAgIH0KICAgKiAgICAgICB9CiAgICogICAgIH07CiAgICogICB9CiAgICogfQogICAqIGBgYAogICAqCiAgICogTm90aWZpY2F0aW9ucyBmb3IgY2hhbmdlcyB0byBpdGVtcyBzdWItcHJvcGVydGllcyB3aWxsIGJlIGZvcndhcmRlZCB0byB0ZW1wbGF0ZQogICAqIGluc3RhbmNlcywgd2hpY2ggd2lsbCB1cGRhdGUgdmlhIHRoZSBub3JtYWwgc3RydWN0dXJlZCBkYXRhIG5vdGlmaWNhdGlvbiBzeXN0ZW0uCiAgICoKICAgKiBNdXRhdGlvbnMgdG8gdGhlIGBpdGVtc2AgYXJyYXkgaXRzZWxmIHNob3VsZCBiZSBtYWRlIHVzaW5nIHRoZSBBcnJheQogICAqIG11dGF0aW9uIEFQSSdzIG9uIGBQb2x5bWVyLkJhc2VgIChgcHVzaGAsIGBwb3BgLCBgc3BsaWNlYCwgYHNoaWZ0YCwKICAgKiBgdW5zaGlmdGApLCBhbmQgdGVtcGxhdGUgaW5zdGFuY2VzIHdpbGwgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGRhdGEgaW4gdGhlCiAgICogYXJyYXkuCiAgICoKICAgKiBFdmVudHMgY2F1Z2h0IGJ5IGV2ZW50IGhhbmRsZXJzIHdpdGhpbiB0aGUgYGRvbS1yZXBlYXRgIHRlbXBsYXRlIHdpbGwgYmUKICAgKiBkZWNvcmF0ZWQgd2l0aCBhIGBtb2RlbGAgcHJvcGVydHksIHdoaWNoIHJlcHJlc2VudHMgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICogZWFjaCB0ZW1wbGF0ZSBpbnN0YW5jZS4gIFRoZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZiBQb2x5bWVyLkJhc2UsIGFuZCBzaG91bGQKICAgKiBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgZGF0YSBvbiB0aGUgaW5zdGFuY2UsIGZvciBleGFtcGxlCiAgICogYGV2ZW50Lm1vZGVsLnNldCgnaXRlbS5jaGVja2VkJywgdHJ1ZSk7YC4KICAgKgogICAqIEFsdGVybmF0aXZlbHksIHRoZSBtb2RlbCBmb3IgYSB0ZW1wbGF0ZSBpbnN0YW5jZSBmb3IgYW4gZWxlbWVudCBzdGFtcGVkIGJ5CiAgICogYSBgZG9tLXJlcGVhdGAgY2FuIGJlIG9idGFpbmVkIHVzaW5nIHRoZSBgbW9kZWxGb3JFbGVtZW50YCBBUEkgb24gdGhlCiAgICogYGRvbS1yZXBlYXRgIHRoYXQgc3RhbXBlZCBpdCwgZm9yIGV4YW1wbGUKICAgKiBgdGhpcy4kLmRvbVJlcGVhdC5tb2RlbEZvckVsZW1lbnQoZXZlbnQudGFyZ2V0KS5zZXQoJ2l0ZW0uY2hlY2tlZCcsIHRydWUpO2AuCiAgICogVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBtYW5pcHVsYXRpbmcgaW5zdGFuY2UgZGF0YSBvZiBldmVudCB0YXJnZXRzIG9idGFpbmVkCiAgICogYnkgZXZlbnQgaGFuZGxlcnMgb24gcGFyZW50cyBvZiB0aGUgYGRvbS1yZXBlYXRgIChldmVudCBkZWxlZ2F0aW9uKS4KICAgKgogICAqIEEgdmlldy1zcGVjaWZpYyBmaWx0ZXIvc29ydCBtYXkgYmUgYXBwbGllZCB0byBlYWNoIGBkb20tcmVwZWF0YCBieSBzdXBwbHlpbmcgYQogICAqIGBmaWx0ZXJgIGFuZC9vciBgc29ydGAgcHJvcGVydHkuICBUaGlzIG1heSBiZSBhIHN0cmluZyB0aGF0IG5hbWVzIGEgZnVuY3Rpb24gb24KICAgKiB0aGUgaG9zdCwgb3IgYSBmdW5jdGlvbiBtYXkgYmUgYXNzaWduZWQgdG8gdGhlIHByb3BlcnR5IGRpcmVjdGx5LiAgVGhlIGZ1bmN0aW9ucwogICAqIHNob3VsZCBpbXBsZW1lbnRlZCBmb2xsb3dpbmcgdGhlIHN0YW5kYXJkIGBBcnJheWAgZmlsdGVyL3NvcnQgQVBJLgogICAqCiAgICogSW4gb3JkZXIgdG8gcmUtcnVuIHRoZSBmaWx0ZXIgb3Igc29ydCBmdW5jdGlvbnMgYmFzZWQgb24gY2hhbmdlcyB0byBzdWItZmllbGRzCiAgICogb2YgYGl0ZW1zYCwgdGhlIGBvYnNlcnZlYCBwcm9wZXJ0eSBtYXkgYmUgc2V0IGFzIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YKICAgKiBgaXRlbWAgc3ViLWZpZWxkcyB0aGF0IHNob3VsZCBjYXVzZSBhIHJlLWZpbHRlci9zb3J0IHdoZW4gbW9kaWZpZWQuICBJZgogICAqIHRoZSBmaWx0ZXIgb3Igc29ydCBmdW5jdGlvbiBkZXBlbmRzIG9uIHByb3BlcnRpZXMgbm90IGNvbnRhaW5lZCBpbiBgaXRlbXNgLAogICAqIHRoZSB1c2VyIHNob3VsZCBvYnNlcnZlIGNoYW5nZXMgdG8gdGhvc2UgcHJvcGVydGllcyBhbmQgY2FsbCBgcmVuZGVyYCB0byB1cGRhdGUKICAgKiB0aGUgdmlldyBiYXNlZCBvbiB0aGUgZGVwZW5kZW5jeSBjaGFuZ2UuCiAgICoKICAgKiBGb3IgZXhhbXBsZSwgZm9yIGFuIGBkb20tcmVwZWF0YCB3aXRoIGEgZmlsdGVyIG9mIHRoZSBmb2xsb3dpbmc6CiAgICoKICAgKiBgYGBqcwogICAqIGlzRW5naW5lZXIoaXRlbSkgewogICAqICAgcmV0dXJuIGl0ZW0udHlwZSA9PSAnZW5naW5lZXInIHx8IGl0ZW0ubWFuYWdlci50eXBlID09ICdlbmdpbmVlcic7CiAgICogfQogICAqIGBgYAogICAqCiAgICogVGhlbiB0aGUgYG9ic2VydmVgIHByb3BlcnR5IHNob3VsZCBiZSBjb25maWd1cmVkIGFzIGZvbGxvd3M6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1yZXBlYXQgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIGZpbHRlcj0iaXNFbmdpbmVlciIgb2JzZXJ2ZT0idHlwZSBtYW5hZ2VyLnR5cGUiPgogICAqIGBgYAogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAcG9seW1lcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQGV4dGVuZHMge2RvbVJlcGVhdEJhc2V9CiAgICogQGFwcGxpZXNNaXhpbiBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGEKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3Igc3RhbXBpbmcgaW5zdGFuY2Ugb2YgYSB0ZW1wbGF0ZSBib3VuZCB0bwogICAqICAgaXRlbXMgaW4gYW4gYXJyYXkuCiAgICovCiAgY2xhc3MgRG9tUmVwZWF0IGV4dGVuZHMgZG9tUmVwZWF0QmFzZSB7CgogICAgLy8gTm90IG5lZWRlZCB0byBmaW5kIHRlbXBsYXRlOyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhbmFseXplcgogICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLXJlcGVhdCc7IH0KCiAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgeyByZXR1cm4gbnVsbDsgfQoKICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKCiAgICAgIC8qKgogICAgICAgKiBGaXJlZCB3aGVuZXZlciBET00gaXMgYWRkZWQgb3IgcmVtb3ZlZCBieSB0aGlzIHRlbXBsYXRlIChieQogICAgICAgKiBkZWZhdWx0LCByZW5kZXJpbmcgb2NjdXJzIGxhemlseSkuICBUbyBmb3JjZSBpbW1lZGlhdGUgcmVuZGVyaW5nLCBjYWxsCiAgICAgICAqIGByZW5kZXJgLgogICAgICAgKgogICAgICAgKiBAZXZlbnQgZG9tLWNoYW5nZQogICAgICAgKi8KICAgICAgcmV0dXJuIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyBpdGVtcyBkZXRlcm1pbmluZyBob3cgbWFueSBpbnN0YW5jZXMgb2YgdGhlIHRlbXBsYXRlCiAgICAgICAgICogdG8gc3RhbXAgYW5kIHRoYXQgdGhhdCBlYWNoIHRlbXBsYXRlIGluc3RhbmNlIHNob3VsZCBiaW5kIHRvLgogICAgICAgICAqLwogICAgICAgIGl0ZW1zOiB7CiAgICAgICAgICB0eXBlOiBBcnJheQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBhZGQgdG8gdGhlIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBhcnJheQogICAgICAgICAqIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgYXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaXRlbScKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYWRkIHRvIHRoZSBiaW5kaW5nIHNjb3BlIHdpdGggdGhlIGluZGV4CiAgICAgICAgICogb2YgdGhlIGluc3RhbmNlIGluIHRoZSBzb3J0ZWQgYW5kIGZpbHRlcmVkIGxpc3Qgb2YgcmVuZGVyZWQgaXRlbXMuCiAgICAgICAgICogTm90ZSwgZm9yIHRoZSBpbmRleCBpbiB0aGUgYHRoaXMuaXRlbXNgIGFycmF5LCB1c2UgdGhlIHZhbHVlIG9mIHRoZQogICAgICAgICAqIGBpdGVtc0luZGV4QXNgIHByb3BlcnR5LgogICAgICAgICAqLwogICAgICAgIGluZGV4QXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaW5kZXgnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGFkZCB0byB0aGUgYmluZGluZyBzY29wZSB3aXRoIHRoZSBpbmRleAogICAgICAgICAqIG9mIHRoZSBpbnN0YW5jZSBpbiB0aGUgYHRoaXMuaXRlbXNgIGFycmF5LiBOb3RlLCBmb3IgdGhlIGluZGV4IG9mCiAgICAgICAgICogdGhpcyBpbnN0YW5jZSBpbiB0aGUgc29ydGVkIGFuZCBmaWx0ZXJlZCBsaXN0IG9mIHJlbmRlcmVkIGl0ZW1zLAogICAgICAgICAqIHVzZSB0aGUgdmFsdWUgb2YgdGhlIGBpbmRleEFzYCBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBpdGVtc0luZGV4QXM6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiAnaXRlbXNJbmRleCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGRldGVybWluZSB0aGUgc29ydCBvcmRlciBvZiB0aGUgaXRlbXMuICBUaGlzCiAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAqIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc29ydCBmdW5jdGlvbiBwYXNzZWQgdG8gYEFycmF5LnNvcnRgLgogICAgICAgICAqIFVzaW5nIGEgc29ydCBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSB1bmRlcmx5aW5nIGBpdGVtc2AgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgc29ydDogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICBvYnNlcnZlcjogJ19fc29ydENoYW5nZWQnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbHRlciBpdGVtcyBvdXQgb2YgdGhlIHZpZXcuICBUaGlzCiAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAqIGZ1bmN0aW9uIHNob3VsZCBtYXRjaCB0aGUgc29ydCBmdW5jdGlvbiBwYXNzZWQgdG8gYEFycmF5LmZpbHRlcmAuCiAgICAgICAgICogVXNpbmcgYSBmaWx0ZXIgZnVuY3Rpb24gaGFzIG5vIGVmZmVjdCBvbiB0aGUgdW5kZXJseWluZyBgaXRlbXNgIGFycmF5LgogICAgICAgICAqLwogICAgICAgIGZpbHRlcjogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICBvYnNlcnZlcjogJ19fZmlsdGVyQ2hhbmdlZCcKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHVzaW5nIGEgYGZpbHRlcmAgb3IgYHNvcnRgIGZ1bmN0aW9uLCB0aGUgYG9ic2VydmVgIHByb3BlcnR5CiAgICAgICAgICogc2hvdWxkIGJlIHNldCB0byBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBuYW1lcyBvZiBpdGVtCiAgICAgICAgICogc3ViLWZpZWxkcyB0aGF0IHNob3VsZCB0cmlnZ2VyIGEgcmUtc29ydCBvciByZS1maWx0ZXIgd2hlbiBjaGFuZ2VkLgogICAgICAgICAqIFRoZXNlIHNob3VsZCBnZW5lcmFsbHkgYmUgZmllbGRzIG9mIGBpdGVtYCB0aGF0IHRoZSBzb3J0IG9yIGZpbHRlcgogICAgICAgICAqIGZ1bmN0aW9uIGRlcGVuZHMgb24uCiAgICAgICAgICovCiAgICAgICAgb2JzZXJ2ZTogewogICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfX29ic2VydmVDaGFuZ2VkJwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gdXNpbmcgYSBgZmlsdGVyYCBvciBgc29ydGAgZnVuY3Rpb24sIHRoZSBgZGVsYXlgIHByb3BlcnR5CiAgICAgICAgICogZGV0ZXJtaW5lcyBhIGRlYm91bmNlIHRpbWUgaW4gbXMgYWZ0ZXIgYSBjaGFuZ2UgdG8gb2JzZXJ2ZWQgaXRlbQogICAgICAgICAqIHByb3BlcnRpZXMgdGhhdCBtdXN0IHBhc3MgYmVmb3JlIHRoZSBmaWx0ZXIgb3Igc29ydCBpcyByZS1ydW4uCiAgICAgICAgICogVGhpcyBpcyB1c2VmdWwgaW4gcmF0ZS1saW1pdGluZyBzaHVmZmxpbmcgb2YgdGhlIHZpZXcgd2hlbgogICAgICAgICAqIGl0ZW0gY2hhbmdlcyBtYXkgYmUgZnJlcXVlbnQuCiAgICAgICAgICovCiAgICAgICAgZGVsYXk6IE51bWJlciwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ291bnQgb2YgY3VycmVudGx5IHJlbmRlcmVkIGl0ZW1zIGFmdGVyIGBmaWx0ZXJgIChpZiBhbnkpIGhhcyBiZWVuIGFwcGxpZWQuCiAgICAgICAgICogSWYgImNodW5raW5nIG1vZGUiIGlzIGVuYWJsZWQsIGByZW5kZXJlZEl0ZW1Db3VudGAgaXMgdXBkYXRlZCBlYWNoIHRpbWUgYQogICAgICAgICAqIHNldCBvZiB0ZW1wbGF0ZSBpbnN0YW5jZXMgaXMgcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICByZW5kZXJlZEl0ZW1Db3VudDogewogICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgICAgcmVhZE9ubHk6IHRydWUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBEZWZpbmVzIGFuIGluaXRpYWwgY291bnQgb2YgdGVtcGxhdGUgaW5zdGFuY2VzIHRvIHJlbmRlciBhZnRlciBzZXR0aW5nCiAgICAgICAgICogdGhlIGBpdGVtc2AgYXJyYXksIGJlZm9yZSB0aGUgbmV4dCBwYWludCwgYW5kIHB1dHMgdGhlIGBkb20tcmVwZWF0YAogICAgICAgICAqIGludG8gImNodW5raW5nIG1vZGUiLiAgVGhlIHJlbWFpbmluZyBpdGVtcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJlbmRlcmVkCiAgICAgICAgICogaW5jcmVtZW50YWxseSBhdCBlYWNoIGFuaW1hdGlvbiBmcmFtZSB0aGVyb2YgdW50aWwgYWxsIGluc3RhbmNlcyBoYXZlCiAgICAgICAgICogYmVlbiByZW5kZXJlZC4KICAgICAgICAgKi8KICAgICAgICBpbml0aWFsQ291bnQ6IHsKICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgIG9ic2VydmVyOiAnX19pbml0aWFsaXplQ2h1bmtpbmcnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiBgaW5pdGlhbENvdW50YCBpcyB1c2VkLCB0aGlzIHByb3BlcnR5IGRlZmluZXMgYSBmcmFtZSByYXRlIChpbgogICAgICAgICAqIGZwcykgdG8gdGFyZ2V0IGJ5IHRocm90dGxpbmcgdGhlIG51bWJlciBvZiBpbnN0YW5jZXMgcmVuZGVyZWQgZWFjaAogICAgICAgICAqIGZyYW1lIHRvIG5vdCBleGNlZWQgdGhlIGJ1ZGdldCBmb3IgdGhlIHRhcmdldCBmcmFtZSByYXRlLiAgVGhlCiAgICAgICAgICogZnJhbWVyYXRlIGlzIGVmZmVjdGl2ZWx5IHRoZSBudW1iZXIgb2YgYHJlcXVlc3RBbmltYXRpb25GcmFtZWBzIHRoYXQKICAgICAgICAgKiBpdCB0cmllcyB0byBhbGxvdyB0byBhY3R1YWxseSBmaXJlIGluIGEgZ2l2ZW4gc2Vjb25kLiBJdCBkb2VzIHRoaXMKICAgICAgICAgKiBieSBtZWFzdXJpbmcgdGhlIHRpbWUgYmV0d2VlbiBgckFGYHMgYW5kIGNvbnRpbnVvdXNseSBhZGp1c3RpbmcgdGhlCiAgICAgICAgICogbnVtYmVyIG9mIGl0ZW1zIGNyZWF0ZWQgZWFjaCBgckFGYCB0byBtYWludGFpbiB0aGUgdGFyZ2V0IGZyYW1lcmF0ZS4KICAgICAgICAgKiBTZXR0aW5nIHRoaXMgdG8gYSBoaWdoZXIgbnVtYmVyIGFsbG93cyBsb3dlciBsYXRlbmN5IGFuZCBoaWdoZXIKICAgICAgICAgKiB0aHJvdWdocHV0IGZvciBldmVudCBoYW5kbGVycyBhbmQgb3RoZXIgdGFza3MsIGJ1dCByZXN1bHRzIGluIGEKICAgICAgICAgKiBsb25nZXIgdGltZSBmb3IgdGhlIHJlbWFpbmluZyBpdGVtcyB0byBjb21wbGV0ZSByZW5kZXJpbmcuCiAgICAgICAgICovCiAgICAgICAgdGFyZ2V0RnJhbWVyYXRlOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICB2YWx1ZTogMjAKICAgICAgICB9LAoKICAgICAgICBfdGFyZ2V0RnJhbWVUaW1lOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICBjb21wdXRlZDogJ19fY29tcHV0ZUZyYW1lVGltZSh0YXJnZXRGcmFtZXJhdGUpJwogICAgICAgIH0KCiAgICAgIH07CgogICAgfQoKICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICByZXR1cm4gWyAnX19pdGVtc0NoYW5nZWQoaXRlbXMuKiknIF07CiAgICB9CgogICAgY29uc3RydWN0b3IoKSB7CiAgICAgIHN1cGVyKCk7CiAgICAgIHRoaXMuX19pbnN0YW5jZXMgPSBbXTsKICAgICAgdGhpcy5fX2xpbWl0ID0gSW5maW5pdHk7CiAgICAgIHRoaXMuX19wb29sID0gW107CiAgICAgIHRoaXMuX19yZW5kZXJEZWJvdW5jZXIgPSBudWxsOwogICAgICB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHggPSB7fTsKICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSBudWxsOwogICAgICB0aGlzLl9fbGFzdENodW5rVGltZSA9IG51bGw7CiAgICAgIHRoaXMuX19zb3J0Rm4gPSBudWxsOwogICAgICB0aGlzLl9fZmlsdGVyRm4gPSBudWxsOwogICAgICB0aGlzLl9fb2JzZXJ2ZVBhdGhzID0gbnVsbDsKICAgICAgdGhpcy5fX2N0b3IgPSBudWxsOwogICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IHRydWU7CiAgICAgIHRoaXMudGVtcGxhdGUgPSBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuX19pc0RldGFjaGVkID0gdHJ1ZTsKICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB0aGlzLl9fZGV0YWNoSW5zdGFuY2UoaSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIC8vIG9ubHkgcGVyZm9ybSBhdHRhY2htZW50IGlmIHRoZSBlbGVtZW50IHdhcyBwcmV2aW91c2x5IGRldGFjaGVkLgogICAgICBpZiAodGhpcy5fX2lzRGV0YWNoZWQpIHsKICAgICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IGZhbHNlOwogICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuX19hdHRhY2hJbnN0YW5jZShpLCBwYXJlbnQpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIF9fZW5zdXJlVGVtcGxhdGl6ZWQoKSB7CiAgICAgIC8vIFRlbXBsYXRpemluZyAoZ2VuZXJhdGluZyB0aGUgaW5zdGFuY2UgY29uc3RydWN0b3IpIG5lZWRzIHRvIHdhaXQKICAgICAgLy8gdW50aWwgcmVhZHksIHNpbmNlIHdvbid0IGhhdmUgaXRzIHRlbXBsYXRlIGNvbnRlbnQgaGFuZGVkIGJhY2sgdG8KICAgICAgLy8gaXQgdW50aWwgdGhlbgogICAgICBpZiAoIXRoaXMuX19jdG9yKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAvLyAvLyBXYWl0IHVudGlsIGNoaWxkTGlzdCBjaGFuZ2VzIGFuZCB0ZW1wbGF0ZSBzaG91bGQgYmUgdGhlcmUgYnkgdGhlbgogICAgICAgICAgbGV0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCkgPT4gewogICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKSB7CiAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgIHRoaXMuX19yZW5kZXIoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RvbS1yZXBlYXQgcmVxdWlyZXMgYSA8dGVtcGxhdGU+IGNoaWxkJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7Y2hpbGRMaXN0OiB0cnVlfSk7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIFRlbXBsYXRlIGluc3RhbmNlIHByb3BzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gZm9yd2FyZGluZwogICAgICAgIGxldCBpbnN0YW5jZVByb3BzID0ge307CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmFzXSA9IHRydWU7CiAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmluZGV4QXNdID0gdHJ1ZTsKICAgICAgICBpbnN0YW5jZVByb3BzW3RoaXMuaXRlbXNJbmRleEFzXSA9IHRydWU7CiAgICAgICAgdGhpcy5fX2N0b3IgPSBQb2x5bWVyLlRlbXBsYXRpemUudGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgdGhpcywgewogICAgICAgICAgbXV0YWJsZURhdGE6IHRoaXMubXV0YWJsZURhdGEsCiAgICAgICAgICBwYXJlbnRNb2RlbDogdHJ1ZSwKICAgICAgICAgIGluc3RhbmNlUHJvcHM6IGluc3RhbmNlUHJvcHMsCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdG8gc2V0CiAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldCBwcm9wZXJ0eSB0bwogICAgICAgICAgICovCiAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKSB7CiAgICAgICAgICAgIGxldCBpJCA9IHRoaXMuX19pbnN0YW5jZXM7CiAgICAgICAgICAgIGZvciAobGV0IGk9MCwgaW5zdDsgKGk8aSQubGVuZ3RoKSAmJiAoaW5zdD1pJFtpXSk7IGkrKykgewogICAgICAgICAgICAgIGluc3QuZm9yd2FyZEhvc3RQcm9wKHByb3AsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgIC8qKgogICAgICAgICAgICogQHRoaXMge3RoaXN9CiAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5zdCBJbnN0YW5jZSB0byBub3RpZnkKICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IHRvIG5vdGlmeQogICAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBub3RpZnkKICAgICAgICAgICAqLwogICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiBmdW5jdGlvbihpbnN0LCBwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICBpZiAoUG9seW1lci5QYXRoLm1hdGNoZXModGhpcy5hcywgcHJvcCkpIHsKICAgICAgICAgICAgICBsZXQgaWR4ID0gaW5zdFt0aGlzLml0ZW1zSW5kZXhBc107CiAgICAgICAgICAgICAgaWYgKHByb3AgPT0gdGhpcy5hcykgewogICAgICAgICAgICAgICAgdGhpcy5pdGVtc1tpZHhdID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGxldCBwYXRoID0gUG9seW1lci5QYXRoLnRyYW5zbGF0ZSh0aGlzLmFzLCAnaXRlbXMuJyArIGlkeCwgcHJvcCk7CiAgICAgICAgICAgICAgdGhpcy5ub3RpZnlQYXRoKHBhdGgsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIF9fZ2V0TWV0aG9kSG9zdCgpIHsKICAgICAgLy8gVGVjaG5pY2FsbHkgdGhpcyBzaG91bGQgYmUgdGhlIG93bmVyIG9mIHRoZSBvdXRlcm1vc3QgdGVtcGxhdGUuCiAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAvLyBhcHByb3hpbWF0ZSB0aGlzIHZpYSBjb29wZXJhdGlvbiB3aXRoIG91ciBkYXRhSG9zdCBhbHdheXMgc2V0dGluZwogICAgICAvLyBgX21ldGhvZEhvc3RgIGFzIGxvbmcgYXMgdGhlcmUgd2VyZSBiaW5kaW5ncyAob3IgaWQncykgb24gdGhpcwogICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICByZXR1cm4gdGhpcy5fX2RhdGFIb3N0Ll9tZXRob2RIb3N0IHx8IHRoaXMuX19kYXRhSG9zdDsKICAgIH0KCiAgICBfX2Z1bmN0aW9uRnJvbVByb3BlcnR5VmFsdWUoZnVuY3Rpb25Pck1ldGhvZE5hbWUpIHsKICAgICAgaWYgKHR5cGVvZiBmdW5jdGlvbk9yTWV0aG9kTmFtZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICBsZXQgbWV0aG9kTmFtZSA9IGZ1bmN0aW9uT3JNZXRob2ROYW1lOwogICAgICAgIGxldCBvYmogPSB0aGlzLl9fZ2V0TWV0aG9kSG9zdCgpOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIG9ialttZXRob2ROYW1lXS5hcHBseShvYmosIGFyZ3VtZW50cyk7IH07CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbk9yTWV0aG9kTmFtZTsKICAgIH0KCiAgICBfX3NvcnRDaGFuZ2VkKHNvcnQpIHsKICAgICAgdGhpcy5fX3NvcnRGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKHNvcnQpOwogICAgICBpZiAodGhpcy5pdGVtcykgeyB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7IH0KICAgIH0KCiAgICBfX2ZpbHRlckNoYW5nZWQoZmlsdGVyKSB7CiAgICAgIHRoaXMuX19maWx0ZXJGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKGZpbHRlcik7CiAgICAgIGlmICh0aGlzLml0ZW1zKSB7IHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsgfQogICAgfQoKICAgIF9fY29tcHV0ZUZyYW1lVGltZShyYXRlKSB7CiAgICAgIHJldHVybiBNYXRoLmNlaWwoMTAwMC9yYXRlKTsKICAgIH0KCiAgICBfX2luaXRpYWxpemVDaHVua2luZygpIHsKICAgICAgaWYgKHRoaXMuaW5pdGlhbENvdW50KSB7CiAgICAgICAgdGhpcy5fX2xpbWl0ID0gdGhpcy5pbml0aWFsQ291bnQ7CiAgICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSB0aGlzLmluaXRpYWxDb3VudDsKICAgICAgICB0aGlzLl9fbGFzdENodW5rVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICB9CiAgICB9CgogICAgX190cnlSZW5kZXJDaHVuaygpIHsKICAgICAgLy8gRGVib3VuY2VkIHNvIHRoYXQgbXVsdGlwbGUgY2FsbHMgdGhyb3VnaCBgX3JlbmRlcmAgYmV0d2VlbiBhbmltYXRpb24KICAgICAgLy8gZnJhbWVzIG9ubHkgcXVldWUgb25lIG5ldyByQUYgKGUuZy4gYXJyYXkgbXV0YXRpb24gJiBjaHVua2VkIHJlbmRlcikKICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgdGhpcy5fX2xpbWl0IDwgdGhpcy5pdGVtcy5sZW5ndGgpIHsKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlcXVlc3RSZW5kZXJDaHVuayk7CiAgICAgIH0KICAgIH0KCiAgICBfX3JlcXVlc3RSZW5kZXJDaHVuaygpIHsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT50aGlzLl9fcmVuZGVyQ2h1bmsoKSk7CiAgICB9CgogICAgX19yZW5kZXJDaHVuaygpIHsKICAgICAgLy8gU2ltcGxlIGF1dG8gY2h1bmtTaXplIHRocm90dGxpbmcgYWxnb3JpdGhtIGJhc2VkIG9uIGZlZWRiYWNrIGxvb3A6CiAgICAgIC8vIG1lYXN1cmUgYWN0dWFsIHRpbWUgYmV0d2VlbiBmcmFtZXMgYW5kIHNjYWxlIGNodW5rIGNvdW50IGJ5IHJhdGlvCiAgICAgIC8vIG9mIHRhcmdldC9hY3R1YWwgZnJhbWUgdGltZQogICAgICBsZXQgY3VyckNodW5rVGltZSA9IHBlcmZvcm1hbmNlLm5vdygpOwogICAgICBsZXQgcmF0aW8gPSB0aGlzLl90YXJnZXRGcmFtZVRpbWUgLyAoY3VyckNodW5rVGltZSAtIHRoaXMuX19sYXN0Q2h1bmtUaW1lKTsKICAgICAgdGhpcy5fX2NodW5rQ291bnQgPSBNYXRoLnJvdW5kKHRoaXMuX19jaHVua0NvdW50ICogcmF0aW8pIHx8IDE7CiAgICAgIHRoaXMuX19saW1pdCArPSB0aGlzLl9fY2h1bmtDb3VudDsKICAgICAgdGhpcy5fX2xhc3RDaHVua1RpbWUgPSBjdXJyQ2h1bmtUaW1lOwogICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7CiAgICB9CgogICAgX19vYnNlcnZlQ2hhbmdlZCgpIHsKICAgICAgdGhpcy5fX29ic2VydmVQYXRocyA9IHRoaXMub2JzZXJ2ZSAmJgogICAgICAgIHRoaXMub2JzZXJ2ZS5yZXBsYWNlKCcuKicsICcuJykuc3BsaXQoJyAnKTsKICAgIH0KCiAgICBfX2l0ZW1zQ2hhbmdlZChjaGFuZ2UpIHsKICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgIUFycmF5LmlzQXJyYXkodGhpcy5pdGVtcykpIHsKICAgICAgICBjb25zb2xlLndhcm4oJ2RvbS1yZXBlYXQgZXhwZWN0ZWQgYXJyYXkgZm9yIGBpdGVtc2AsIGZvdW5kJywgdGhpcy5pdGVtcyk7CiAgICAgIH0KICAgICAgLy8gSWYgcGF0aCB3YXMgdG8gYW4gaXRlbSAoZS5nLiAnaXRlbXMuMycgb3IgJ2l0ZW1zLjMuZm9vJyksIGZvcndhcmQgdGhlCiAgICAgIC8vIHBhdGggdG8gdGhhdCBpbnN0YW5jZSBzeW5jaHJvbm91c2x5IChyZXR1cm5zIGZhbHNlIGZvciBub24taXRlbSBwYXRocykKICAgICAgaWYgKCF0aGlzLl9faGFuZGxlSXRlbVBhdGgoY2hhbmdlLnBhdGgsIGNoYW5nZS52YWx1ZSkpIHsKICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBhcnJheSB3YXMgcmVzZXQgKCdpdGVtcycpIG9yIHNwbGljZWQgKCdpdGVtcy5zcGxpY2VzJyksCiAgICAgICAgLy8gc28gcXVldWUgYSBmdWxsIHJlZnJlc2gKICAgICAgICB0aGlzLl9faW5pdGlhbGl6ZUNodW5raW5nKCk7CiAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpOwogICAgICB9CiAgICB9CgogICAgX19oYW5kbGVPYnNlcnZlZFBhdGhzKHBhdGgpIHsKICAgICAgLy8gSGFuZGxlIGNhc2VzIHdoZXJlIHBhdGggY2hhbmdlcyBzaG91bGQgY2F1c2UgYSByZS1zb3J0L2ZpbHRlcgogICAgICBpZiAodGhpcy5fX3NvcnRGbiB8fCB0aGlzLl9fZmlsdGVyRm4pIHsKICAgICAgICBpZiAoIXBhdGgpIHsKICAgICAgICAgIC8vIEFsd2F5cyByZS1yZW5kZXIgaWYgdGhlIGl0ZW0gaXRzZWxmIGNoYW5nZWQKICAgICAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLCB0aGlzLmRlbGF5KTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX19vYnNlcnZlUGF0aHMpIHsKICAgICAgICAgIC8vIE90aGVyd2lzZSwgcmUtcmVuZGVyIGlmIHRoZSBwYXRoIGNoYW5nZWQgbWF0Y2hlcyBhbiBvYnNlcnZlZCBwYXRoCiAgICAgICAgICBsZXQgcGF0aHMgPSB0aGlzLl9fb2JzZXJ2ZVBhdGhzOwogICAgICAgICAgZm9yIChsZXQgaT0wOyBpPHBhdGhzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChwYXRoLmluZGV4T2YocGF0aHNbaV0pID09PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIsIHRoaXMuZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHRoaXM6RG9tUmVwZWF0KX0gZm4gRnVuY3Rpb24gdG8gZGVib3VuY2UuCiAgICAgKiBAcGFyYW0ge251bWJlcj19IGRlbGF5IERlbGF5IGluIG1zIHRvIGRlYm91bmNlIGJ5LgogICAgICovCiAgICBfX2RlYm91bmNlUmVuZGVyKGZuLCBkZWxheSA9IDApIHsKICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyCiAgICAgICAgICAsIGRlbGF5ID4gMCA/IFBvbHltZXIuQXN5bmMudGltZU91dC5hZnRlcihkZWxheSkgOiBQb2x5bWVyLkFzeW5jLm1pY3JvVGFzawogICAgICAgICAgLCBmbi5iaW5kKHRoaXMpKTsKICAgICAgUG9seW1lci5lbnF1ZXVlRGVib3VuY2VyKHRoaXMuX19yZW5kZXJEZWJvdW5jZXIpOwogICAgfQoKICAgIC8qKgogICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAqIHRoYXQgbXVsdGlwbGUgY2hhbmdlcyB0cmlnZ2VyIG9ubHkgYSBzaW5nbGUgcmVuZGVyLiBUaGUgcmVuZGVyIG1ldGhvZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZW5kZXIoKSB7CiAgICAgIC8vIFF1ZXVlIHRoaXMgcmVwZWF0ZXIsIHRoZW4gZmx1c2ggYWxsIGluIG9yZGVyCiAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsKICAgICAgUG9seW1lci5mbHVzaCgpOwogICAgfQoKICAgIF9fcmVuZGVyKCkgewogICAgICBpZiAoIXRoaXMuX19lbnN1cmVUZW1wbGF0aXplZCgpKSB7CiAgICAgICAgLy8gTm8gdGVtcGxhdGUgZm91bmQgeWV0CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRoaXMuX19hcHBseUZ1bGxSZWZyZXNoKCk7CiAgICAgIC8vIFJlc2V0IHRoZSBwb29sCiAgICAgIC8vIFRPRE8oa3NjaGFhZik6IFJldXNlIHBvb2wgYWNyb3NzIHR1cm5zIGFuZCBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgIC8vIE5vdyB0aGF0IG9iamVjdHMvYXJyYXlzIGFyZSByZS1ldmFsdWF0ZWQgd2hlbiBzZXQsIHdlIGNhbiBzYWZlbHkKICAgICAgLy8gcmV1c2UgcG9vbGVkIGluc3RhbmNlcyBhY3Jvc3MgdHVybnMsIGhvd2V2ZXIgd2Ugc3RpbGwgbmVlZCB0byBkZWNpZGUKICAgICAgLy8gc2VtYW50aWNzIHJlZ2FyZGluZyBob3cgbG9uZyB0byBob2xkLCBob3cgbWFueSB0byBob2xkLCBldGMuCiAgICAgIHRoaXMuX19wb29sLmxlbmd0aCA9IDA7CiAgICAgIC8vIFNldCByZW5kZXJlZCBpdGVtIGNvdW50CiAgICAgIHRoaXMuX3NldFJlbmRlcmVkSXRlbUNvdW50KHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoKTsKICAgICAgLy8gTm90aWZ5IHVzZXJzCiAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICBjb21wb3NlZDogdHJ1ZQogICAgICB9KSk7CiAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIHJlbmRlciBtb3JlIGl0ZW1zCiAgICAgIHRoaXMuX190cnlSZW5kZXJDaHVuaygpOwogICAgfQoKICAgIF9fYXBwbHlGdWxsUmVmcmVzaCgpIHsKICAgICAgbGV0IGl0ZW1zID0gdGhpcy5pdGVtcyB8fCBbXTsKICAgICAgbGV0IGlzbnRJZHhUb0l0ZW1zSWR4ID0gbmV3IEFycmF5KGl0ZW1zLmxlbmd0aCk7CiAgICAgIGZvciAobGV0IGk9MDsgaTxpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlzbnRJZHhUb0l0ZW1zSWR4W2ldID0gaTsKICAgICAgfQogICAgICAvLyBBcHBseSB1c2VyIGZpbHRlcgogICAgICBpZiAodGhpcy5fX2ZpbHRlckZuKSB7CiAgICAgICAgaXNudElkeFRvSXRlbXNJZHggPSBpc250SWR4VG9JdGVtc0lkeC5maWx0ZXIoKGksIGlkeCwgYXJyYXkpID0+CiAgICAgICAgICB0aGlzLl9fZmlsdGVyRm4oaXRlbXNbaV0sIGlkeCwgYXJyYXkpKTsKICAgICAgfQogICAgICAvLyBBcHBseSB1c2VyIHNvcnQKICAgICAgaWYgKHRoaXMuX19zb3J0Rm4pIHsKICAgICAgICBpc250SWR4VG9JdGVtc0lkeC5zb3J0KChhLCBiKSA9PiB0aGlzLl9fc29ydEZuKGl0ZW1zW2FdLCBpdGVtc1tiXSkpOwogICAgICB9CiAgICAgIC8vIGl0ZW1zLT5pbnN0IG1hcCBrZXB0IGZvciBpdGVtIHBhdGggZm9yd2FyZGluZwogICAgICBjb25zdCBpdGVtc0lkeFRvSW5zdElkeCA9IHRoaXMuX19pdGVtc0lkeFRvSW5zdElkeCA9IHt9OwogICAgICBsZXQgaW5zdElkeCA9IDA7CiAgICAgIC8vIEdlbmVyYXRlIGluc3RhbmNlcyBhbmQgYXNzaWduIGl0ZW1zCiAgICAgIGNvbnN0IGxpbWl0ID0gTWF0aC5taW4oaXNudElkeFRvSXRlbXNJZHgubGVuZ3RoLCB0aGlzLl9fbGltaXQpOwogICAgICBmb3IgKDsgaW5zdElkeDxsaW1pdDsgaW5zdElkeCsrKSB7CiAgICAgICAgbGV0IGluc3QgPSB0aGlzLl9faW5zdGFuY2VzW2luc3RJZHhdOwogICAgICAgIGxldCBpdGVtSWR4ID0gaXNudElkeFRvSXRlbXNJZHhbaW5zdElkeF07CiAgICAgICAgbGV0IGl0ZW0gPSBpdGVtc1tpdGVtSWR4XTsKICAgICAgICBpdGVtc0lkeFRvSW5zdElkeFtpdGVtSWR4XSA9IGluc3RJZHg7CiAgICAgICAgaWYgKGluc3QpIHsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmFzLCBpdGVtKTsKICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmluZGV4QXMsIGluc3RJZHgpOwogICAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaXRlbXNJbmRleEFzLCBpdGVtSWR4KTsKICAgICAgICAgIGluc3QuX2ZsdXNoUHJvcGVydGllcygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9faW5zZXJ0SW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIFJlbW92ZSBhbnkgZXh0cmEgaW5zdGFuY2VzIGZyb20gcHJldmlvdXMgc3RhdGUKICAgICAgZm9yIChsZXQgaT10aGlzLl9faW5zdGFuY2VzLmxlbmd0aC0xOyBpPj1pbnN0SWR4OyBpLS0pIHsKICAgICAgICB0aGlzLl9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaSk7CiAgICAgIH0KICAgIH0KCiAgICBfX2RldGFjaEluc3RhbmNlKGlkeCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaWR4XTsKICAgICAgZm9yIChsZXQgaT0wOyBpPGluc3QuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgZWwgPSBpbnN0LmNoaWxkcmVuW2ldOwogICAgICAgIGluc3Qucm9vdC5hcHBlbmRDaGlsZChlbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluc3Q7CiAgICB9CgogICAgX19hdHRhY2hJbnN0YW5jZShpZHgsIHBhcmVudCkgewogICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaWR4XTsKICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShpbnN0LnJvb3QsIHRoaXMpOwogICAgfQoKICAgIF9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaWR4KSB7CiAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2RldGFjaEluc3RhbmNlKGlkeCk7CiAgICAgIGlmIChpbnN0KSB7CiAgICAgICAgdGhpcy5fX3Bvb2wucHVzaChpbnN0KTsKICAgICAgfQogICAgICB0aGlzLl9faW5zdGFuY2VzLnNwbGljZShpZHgsIDEpOwogICAgfQoKICAgIF9fc3RhbXBJbnN0YW5jZShpdGVtLCBpbnN0SWR4LCBpdGVtSWR4KSB7CiAgICAgIGxldCBtb2RlbCA9IHt9OwogICAgICBtb2RlbFt0aGlzLmFzXSA9IGl0ZW07CiAgICAgIG1vZGVsW3RoaXMuaW5kZXhBc10gPSBpbnN0SWR4OwogICAgICBtb2RlbFt0aGlzLml0ZW1zSW5kZXhBc10gPSBpdGVtSWR4OwogICAgICByZXR1cm4gbmV3IHRoaXMuX19jdG9yKG1vZGVsKTsKICAgIH0KCiAgICBfX2luc2VydEluc3RhbmNlKGl0ZW0sIGluc3RJZHgsIGl0ZW1JZHgpIHsKICAgICAgbGV0IGluc3QgPSB0aGlzLl9fcG9vbC5wb3AoKTsKICAgICAgaWYgKGluc3QpIHsKICAgICAgICAvLyBUT0RPKGtzY2hhYWYpOiBJZiB0aGUgcG9vbCBpcyBzaGFyZWQgYWNyb3NzIHR1cm5zLCBob3N0UHJvcHMKICAgICAgICAvLyBuZWVkIHRvIGJlIHJlLXNldCB0byByZXVzZWQgaW5zdGFuY2VzIGluIGFkZGl0aW9uIHRvIGl0ZW0KICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5hcywgaXRlbSk7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaW5kZXhBcywgaW5zdElkeCk7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaXRlbXNJbmRleEFzLCBpdGVtSWR4KTsKICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpbnN0ID0gdGhpcy5fX3N0YW1wSW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCk7CiAgICAgIH0KICAgICAgbGV0IGJlZm9yZVJvdyA9IHRoaXMuX19pbnN0YW5jZXNbaW5zdElkeCArIDFdOwogICAgICBsZXQgYmVmb3JlTm9kZSA9IGJlZm9yZVJvdyA/IGJlZm9yZVJvdy5jaGlsZHJlblswXSA6IHRoaXM7CiAgICAgIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaW5zdC5yb290LCBiZWZvcmVOb2RlKTsKICAgICAgdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XSA9IGluc3Q7CiAgICAgIHJldHVybiBpbnN0OwogICAgfQoKICAgIC8vIEltcGxlbWVudHMgZXh0ZW5zaW9uIHBvaW50IGZyb20gVGVtcGxhdGl6ZSBtaXhpbgogICAgLyoqCiAgICAgKiBTaG93cyBvciBoaWRlcyB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdG9wIGxldmVsIGNoaWxkIGVsZW1lbnRzLiBGb3IKICAgICAqIHRleHQgbm9kZXMsIGB0ZXh0Q29udGVudGAgaXMgcmVtb3ZlZCB3aGlsZSAiaGlkZGVuIiBhbmQgcmVwbGFjZWQgd2hlbgogICAgICogInNob3duLiIKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGlkZGVuIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICogc2V0IHRvIGZhbHNlIHRvIHNob3cgdGhlbS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG93SGlkZUNoaWxkcmVuKGhpZGRlbikgewogICAgICBmb3IgKGxldCBpPTA7IGk8dGhpcy5fX2luc3RhbmNlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHRoaXMuX19pbnN0YW5jZXNbaV0uX3Nob3dIaWRlQ2hpbGRyZW4oaGlkZGVuKTsKICAgICAgfQogICAgfQoKICAgIC8vIENhbGxlZCBhcyBhIHNpZGUgZWZmZWN0IG9mIGEgaG9zdCBpdGVtcy48a2V5Pi48cGF0aD4gcGF0aCBjaGFuZ2UsCiAgICAvLyByZXNwb25zaWJsZSBmb3Igbm90aWZ5aW5nIGl0ZW0uPHBhdGg+IGNoYW5nZXMgdG8gaW5zdCBmb3Iga2V5CiAgICBfX2hhbmRsZUl0ZW1QYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgIGxldCBpdGVtc1BhdGggPSBwYXRoLnNsaWNlKDYpOyAvLyAnaXRlbXMuJy5sZW5ndGggPT0gNgogICAgICBsZXQgZG90ID0gaXRlbXNQYXRoLmluZGV4T2YoJy4nKTsKICAgICAgbGV0IGl0ZW1zSWR4ID0gZG90IDwgMCA/IGl0ZW1zUGF0aCA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoMCwgZG90KTsKICAgICAgLy8gSWYgcGF0aCB3YXMgaW5kZXggaW50byBhcnJheS4uLgogICAgICBpZiAoaXRlbXNJZHggPT0gcGFyc2VJbnQoaXRlbXNJZHgsIDEwKSkgewogICAgICAgIGxldCBpdGVtU3ViUGF0aCA9IGRvdCA8IDAgPyAnJyA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoZG90KzEpOwogICAgICAgIC8vIElmIHRoZSBwYXRoIGlzIG9ic2VydmVkLCBpdCB3aWxsIHRyaWdnZXIgYSBmdWxsIHJlZnJlc2gKICAgICAgICB0aGlzLl9faGFuZGxlT2JzZXJ2ZWRQYXRocyhpdGVtU3ViUGF0aCk7CiAgICAgICAgLy8gTm90ZSwgZXZlbiBpZiBhIHJ1bGwgcmVmcmVzaCBpcyB0cmlnZ2VyZWQsIGFsd2F5cyBkbyB0aGUgcGF0aAogICAgICAgIC8vIG5vdGlmaWNhdGlvbiBiZWNhdXNlIHVubGVzcyBtdXRhYmxlRGF0YSBpcyB1c2VkIGZvciBkb20tcmVwZWF0CiAgICAgICAgLy8gYW5kIGFsbCBlbGVtZW50cyBpbiB0aGUgaW5zdGFuY2Ugc3VidHJlZSwgYSBmdWxsIHJlZnJlc2ggbWF5CiAgICAgICAgLy8gbm90IHRyaWdnZXIgdGhlIHByb3BlciB1cGRhdGUuCiAgICAgICAgbGV0IGluc3RJZHggPSB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHhbaXRlbXNJZHhdOwogICAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4XTsKICAgICAgICBpZiAoaW5zdCkgewogICAgICAgICAgbGV0IGl0ZW1QYXRoID0gdGhpcy5hcyArIChpdGVtU3ViUGF0aCA/ICcuJyArIGl0ZW1TdWJQYXRoIDogJycpOwogICAgICAgICAgLy8gVGhpcyBpcyBlZmZlY3RpdmVseSBgbm90aWZ5UGF0aGAsIGJ1dCBhdm9pZHMgc29tZSBvZiB0aGUgb3ZlcmhlYWQKICAgICAgICAgIC8vIG9mIHRoZSBwdWJsaWMgQVBJCiAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoaXRlbVBhdGgsIHZhbHVlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGl0ZW0gYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCBzdGFtcGVkIGJ5CiAgICAgKiB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAqCiAgICAgKiBOb3RlLCB0byBtb2RpZnkgc3ViLXByb3BlcnRpZXMgb2YgdGhlIGl0ZW0sCiAgICAgKiBgbW9kZWxGb3JFbGVtZW50KGVsKS5zZXQoJ2l0ZW0uPHN1Yi1wcm9wPicsIHZhbHVlKWAKICAgICAqIHNob3VsZCBiZSB1c2VkLgogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gdGhlIGl0ZW0uCiAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudC4KICAgICAqLwogICAgaXRlbUZvckVsZW1lbnQoZWwpIHsKICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5tb2RlbEZvckVsZW1lbnQoZWwpOwogICAgICByZXR1cm4gaW5zdGFuY2UgJiYgaW5zdGFuY2VbdGhpcy5hc107CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbnN0IGluZGV4IGZvciBhIGdpdmVuIGVsZW1lbnQgc3RhbXBlZCBieSB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAqIElmIGBzb3J0YCBpcyBwcm92aWRlZCwgdGhlIGluZGV4IHdpbGwgcmVmbGVjdCB0aGUgc29ydGVkIG9yZGVyIChyYXRoZXIKICAgICAqIHRoYW4gdGhlIG9yaWdpbmFsIGFycmF5IG9yZGVyKS4KICAgICAqCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWwgRWxlbWVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBpbmRleC4KICAgICAqIEByZXR1cm4gez9udW1iZXJ9IFJvdyBpbmRleCBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQgKG5vdGUgdGhpcyBtYXkKICAgICAqICAgbm90IGNvcnJlc3BvbmQgdG8gdGhlIGFycmF5IGluZGV4IGlmIGEgdXNlciBgc29ydGAgaXMgYXBwbGllZCkuCiAgICAgKi8KICAgIGluZGV4Rm9yRWxlbWVudChlbCkgewogICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLm1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVt0aGlzLmluZGV4QXNdOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgIm1vZGVsIiBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBlbGVtZW50LCB3aGljaAogICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAqIGNvbnRhaW5lZCBpbi4gQSB0ZW1wbGF0ZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZiBgUG9seW1lci5CYXNlYCwgYW5kCiAgICAgKiBzaG91bGQgYmUgdXNlZCB0byBtYW5pcHVsYXRlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgIGxldCBtb2RlbCA9IG1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgKiAgIGlmIChtb2RlbC5pbmRleCA8IDEwKSB7CiAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAqICAgfQogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gYSB0ZW1wbGF0ZSBtb2RlbC4KICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBNb2RlbCByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICAgKiAgIHRoZSBlbGVtZW50LgogICAgICovCiAgICBtb2RlbEZvckVsZW1lbnQoZWwpIHsKICAgICAgcmV0dXJuIFBvbHltZXIuVGVtcGxhdGl6ZS5tb2RlbEZvckVsZW1lbnQodGhpcy50ZW1wbGF0ZSwgZWwpOwogICAgfQoKICB9CgogIGN1c3RvbUVsZW1lbnRzLmRlZmluZShEb21SZXBlYXQuaXMsIERvbVJlcGVhdCk7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRvbVJlcGVhdCA9IERvbVJlcGVhdDsKCn0pKCk7CgoKCgooZnVuY3Rpb24oKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICAvKioKICAgKiBUaGUgYDxkb20taWY+YCBlbGVtZW50IHdpbGwgc3RhbXAgYSBsaWdodC1kb20gYDx0ZW1wbGF0ZT5gIGNoaWxkIHdoZW4KICAgKiB0aGUgYGlmYCBwcm9wZXJ0eSBiZWNvbWVzIHRydXRoeSwgYW5kIHRoZSB0ZW1wbGF0ZSBjYW4gdXNlIFBvbHltZXIKICAgKiBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGZlYXR1cmVzIHdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZgogICAqIGEgUG9seW1lciBlbGVtZW50J3MgdGVtcGxhdGUuCiAgICoKICAgKiBXaGVuIGBpZmAgYmVjb21lcyBmYWxzeSwgdGhlIHN0YW1wZWQgY29udGVudCBpcyBoaWRkZW4gYnV0IG5vdAogICAqIHJlbW92ZWQgZnJvbSBkb20uIFdoZW4gYGlmYCBzdWJzZXF1ZW50bHkgYmVjb21lcyB0cnV0aHkgYWdhaW4sIHRoZSBjb250ZW50CiAgICogaXMgc2ltcGx5IHJlLXNob3duLiBUaGlzIGFwcHJvYWNoIGlzIHVzZWQgZHVlIHRvIGl0cyBmYXZvcmFibGUgcGVyZm9ybWFuY2UKICAgKiBjaGFyYWN0ZXJpc3RpY3M6IHRoZSBleHBlbnNlIG9mIGNyZWF0aW5nIHRlbXBsYXRlIGNvbnRlbnQgaXMgcGFpZCBvbmx5CiAgICogb25jZSBhbmQgbGF6aWx5LgogICAqCiAgICogU2V0IHRoZSBgcmVzdGFtcGAgcHJvcGVydHkgdG8gdHJ1ZSB0byBmb3JjZSB0aGUgc3RhbXBlZCBjb250ZW50IHRvIGJlCiAgICogY3JlYXRlZCAvIGRlc3Ryb3llZCB3aGVuIHRoZSBgaWZgIGNvbmRpdGlvbiBjaGFuZ2VzLgogICAqCiAgICogQGN1c3RvbUVsZW1lbnQKICAgKiBAcG9seW1lcgogICAqIEBleHRlbmRzIFBvbHltZXIuRWxlbWVudAogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgdGhhdCBjb25kaXRpb25hbGx5IHN0YW1wcyBhbmQgaGlkZXMgb3IgcmVtb3ZlcwogICAqICAgdGVtcGxhdGUgY29udGVudCBiYXNlZCBvbiBhIGJvb2xlYW4gZmxhZy4KICAgKi8KICBjbGFzcyBEb21JZiBleHRlbmRzIFBvbHltZXIuRWxlbWVudCB7CgogICAgLy8gTm90IG5lZWRlZCB0byBmaW5kIHRlbXBsYXRlOyBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBhbmFseXplcgogICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLWlmJzsgfQoKICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7IHJldHVybiBudWxsOyB9CgogICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewoKICAgICAgcmV0dXJuIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZWQgd2hlbmV2ZXIgRE9NIGlzIGFkZGVkIG9yIHJlbW92ZWQvaGlkZGVuIGJ5IHRoaXMgdGVtcGxhdGUgKGJ5CiAgICAgICAgICogZGVmYXVsdCwgcmVuZGVyaW5nIG9jY3VycyBsYXppbHkpLiAgVG8gZm9yY2UgaW1tZWRpYXRlIHJlbmRlcmluZywgY2FsbAogICAgICAgICAqIGByZW5kZXJgLgogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IGRvbS1jaGFuZ2UKICAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHRlbXBsYXRlIHNob3VsZCBzdGFtcC4KICAgICAgICAgKi8KICAgICAgICBpZjogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHRydWUsIGVsZW1lbnRzIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIERPTSBhbmQgZGlzY2FyZGVkIHdoZW4gYGlmYAogICAgICAgICAqIGJlY29tZXMgZmFsc2UgYW5kIHJlLWNyZWF0ZWQgYW5kIGFkZGVkIGJhY2sgdG8gdGhlIERPTSB3aGVuIGBpZmAKICAgICAgICAgKiBiZWNvbWVzIHRydWUuICBCeSBkZWZhdWx0LCBzdGFtcGVkIGVsZW1lbnRzIHdpbGwgYmUgaGlkZGVuIGJ1dCBsZWZ0CiAgICAgICAgICogaW4gdGhlIERPTSB3aGVuIGBpZmAgYmVjb21lcyBmYWxzZSwgd2hpY2ggaXMgZ2VuZXJhbGx5IHJlc3VsdHMKICAgICAgICAgKiBpbiBiZXR0ZXIgcGVyZm9ybWFuY2UuCiAgICAgICAgICovCiAgICAgICAgcmVzdGFtcDogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICB9CgogICAgICB9OwoKICAgIH0KCiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IG51bGw7CiAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICB0aGlzLl9faW5zdGFuY2UgPSBudWxsOwogICAgICB0aGlzLl9sYXN0SWYgPSBmYWxzZTsKICAgICAgdGhpcy5fX2N0b3IgPSBudWxsOwogICAgfQoKICAgIF9fZGVib3VuY2VSZW5kZXIoKSB7CiAgICAgIC8vIFJlbmRlciBpcyBhc3luYyBmb3IgMiByZWFzb25zOgogICAgICAvLyAxLiBUbyBlbGltaW5hdGUgZG9tIGNyZWF0aW9uIHRyYXNoaW5nIGlmIHVzZXIgY29kZSB0aHJhc2hlcyBgaWZgIGluIHRoZQogICAgICAvLyAgICBzYW1lIHR1cm4uIFRoaXMgd2FzIG1vcmUgY29tbW9uIGluIDEueCB3aGVyZSBhIGNvbXBvdW5kIGNvbXB1dGVkCiAgICAgIC8vICAgIHByb3BlcnR5IGNvdWxkIHJlc3VsdCBpbiB0aGUgcmVzdWx0IGNoYW5naW5nIG11bHRpcGxlIHRpbWVzLCBidXQgaXMKICAgICAgLy8gICAgbWl0aWdhdGVkIHRvIGEgbGFyZ2UgZXh0ZW50IGJ5IGJhdGNoZWQgcHJvcGVydHkgcHJvY2Vzc2luZyBpbiAyLnguCiAgICAgIC8vIDIuIFRvIGF2b2lkIGRvdWJsZSBvYmplY3QgcHJvcGFnYXRpb24gd2hlbiBhIGJhZyBpbmNsdWRpbmcgdmFsdWVzIGJvdW5kCiAgICAgIC8vICAgIHRvIHRoZSBgaWZgIHByb3BlcnR5IGFzIHdlbGwgYXMgb25lIG9yIG1vcmUgaG9zdFByb3BzIGNvdWxkIGVucXVldWUKICAgICAgLy8gICAgdGhlIDxkb20taWY+IHRvIGZsdXNoIGJlZm9yZSB0aGUgPHRlbXBsYXRlPidzIGhvc3QgcHJvcGVydHkKICAgICAgLy8gICAgZm9yd2FyZGluZy4gSW4gdGhhdCBzY2VuYXJpbyBjcmVhdGluZyBhbiBpbnN0YW5jZSB3b3VsZCByZXN1bHQgaW4KICAgICAgLy8gICAgdGhlIGhvc3QgcHJvcHMgYmVpbmcgc2V0IG9uY2UsIGFuZCB0aGVuIHRoZSBlbnF1ZXVlZCBjaGFuZ2VzIG9uIHRoZQogICAgICAvLyAgICB0ZW1wbGF0ZSB3b3VsZCBzZXQgcHJvcGVydGllcyBhIHNlY29uZCB0aW1lLCBwb3RlbnRpYWxseSBjYXVzaW5nIGFuCiAgICAgIC8vICAgIG9iamVjdCB0byBiZSBzZXQgdG8gYW4gaW5zdGFuY2UgbW9yZSB0aGFuIG9uY2UuICBDcmVhdGluZyB0aGUKICAgICAgLy8gICAgaW5zdGFuY2UgYXN5bmMgZnJvbSBmbHVzaGluZyBkYXRhIGVuc3VyZXMgdGhpcyBkb2Vzbid0IGhhcHBlbi4gSWYKICAgICAgLy8gICAgd2Ugd2FudGVkIGEgc3luYyBvcHRpb24gaW4gdGhlIGZ1dHVyZSwgc2ltcGx5IGhhdmluZyA8ZG9tLWlmPiBmbHVzaAogICAgICAvLyAgICAob3IgY2xlYXIpIGl0cyB0ZW1wbGF0ZSdzIHBlbmRpbmcgaG9zdCBwcm9wZXJ0aWVzIGJlZm9yZSBjcmVhdGluZwogICAgICAvLyAgICB0aGUgaW5zdGFuY2Ugd291bGQgYWxzbyBhdm9pZCB0aGUgcHJvYmxlbS4KICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IFBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyCiAgICAgICAgICAsIFBvbHltZXIuQXN5bmMubWljcm9UYXNrCiAgICAgICAgICAsICgpID0+IHRoaXMuX19yZW5kZXIoKSk7CiAgICAgIFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9fcmVuZGVyRGVib3VuY2VyKTsKICAgIH0KCiAgICAvKioKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICBpZiAoIXRoaXMucGFyZW50Tm9kZSB8fAogICAgICAgICAgKHRoaXMucGFyZW50Tm9kZS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgJiYKICAgICAgICAgICAhdGhpcy5wYXJlbnROb2RlLmhvc3QpKSB7CiAgICAgICAgdGhpcy5fX3RlYXJkb3duSW5zdGFuY2UoKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIoKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAqIHRoYXQgbXVsdGlwbGUgY2hhbmdlcyB0cmlnZ2VyIG9ubHkgYSBzaW5nbGUgcmVuZGVyLiBUaGUgcmVuZGVyIG1ldGhvZAogICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICByZW5kZXIoKSB7CiAgICAgIFBvbHltZXIuZmx1c2goKTsKICAgIH0KCiAgICBfX3JlbmRlcigpIHsKICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICBpZiAoIXRoaXMuX19lbnN1cmVJbnN0YW5jZSgpKSB7CiAgICAgICAgICAvLyBObyB0ZW1wbGF0ZSBmb3VuZCB5ZXQKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICB9IGVsc2UgaWYgKHRoaXMucmVzdGFtcCkgewogICAgICAgIHRoaXMuX190ZWFyZG93bkluc3RhbmNlKCk7CiAgICAgIH0KICAgICAgaWYgKCF0aGlzLnJlc3RhbXAgJiYgdGhpcy5fX2luc3RhbmNlKSB7CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICB9CiAgICAgIGlmICh0aGlzLmlmICE9IHRoaXMuX2xhc3RJZikgewogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgICAgdGhpcy5fbGFzdElmID0gdGhpcy5pZjsKICAgICAgfQogICAgfQoKICAgIF9fZW5zdXJlSW5zdGFuY2UoKSB7CiAgICAgIGxldCBwYXJlbnROb2RlID0gdGhpcy5wYXJlbnROb2RlOwogICAgICAvLyBHdWFyZCBhZ2FpbnN0IGVsZW1lbnQgYmVpbmcgZGV0YWNoZWQgd2hpbGUgcmVuZGVyIHdhcyBxdWV1ZWQKICAgICAgaWYgKHBhcmVudE5vZGUpIHsKICAgICAgICBpZiAoIXRoaXMuX19jdG9yKSB7CiAgICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovKHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSk7CiAgICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgY2hpbGRMaXN0IGNoYW5nZXMgYW5kIHRlbXBsYXRlIHNob3VsZCBiZSB0aGVyZSBieSB0aGVuCiAgICAgICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgICBpZiAodGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKSB7CiAgICAgICAgICAgICAgICBvYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9fcmVuZGVyKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZG9tLWlmIHJlcXVpcmVzIGEgPHRlbXBsYXRlPiBjaGlsZCcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywge2NoaWxkTGlzdDogdHJ1ZX0pOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fY3RvciA9IFBvbHltZXIuVGVtcGxhdGl6ZS50ZW1wbGF0aXplKHRlbXBsYXRlLCB0aGlzLCB7CiAgICAgICAgICAgIC8vIGRvbS1pZiB0ZW1wbGF0aXplciBpbnN0YW5jZXMgcmVxdWlyZSBgbXV0YWJsZTogdHJ1ZWAsIGFzCiAgICAgICAgICAgIC8vIGBfX3N5bmNIb3N0UHJvcGVydGllc2AgcmVsaWVzIG9uIHRoYXQgYmVoYXZpb3IgdG8gc3luYyBvYmplY3RzCiAgICAgICAgICAgIG11dGFibGVEYXRhOiB0cnVlLAogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdG8gZm9yd2FyZAogICAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIHByb3BlcnR5CiAgICAgICAgICAgICAqIEB0aGlzIHt0aGlzfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm9yd2FyZEhvc3RQcm9wOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmlmKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuX19pbnN0YW5jZS5mb3J3YXJkSG9zdFByb3AocHJvcCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbnN0YW5jZSBidXQgYXJlIHNxdWVsY2hpbmcgaG9zdCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAvLyBmb3J3YXJkaW5nIGR1ZSB0byBpZiBiZWluZyBmYWxzZSwgbm90ZSB0aGUgaW52YWxpZGF0ZWQKICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydGllcyBzbyBgX19zeW5jSG9zdFByb3BlcnRpZXNgIGNhbiBzeW5jIHRoZW0gdGhlIG5leHQKICAgICAgICAgICAgICAgICAgLy8gdGltZSBgaWZgIGJlY29tZXMgdHJ1ZQogICAgICAgICAgICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzID0gdGhpcy5fX2ludmFsaWRQcm9wcyB8fCBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICAgICAgICB0aGlzLl9faW52YWxpZFByb3BzW1BvbHltZXIuUGF0aC5yb290KHByb3ApXSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG5ldyB0aGlzLl9fY3RvcigpOwogICAgICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5fX2luc3RhbmNlLnJvb3QsIHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9fc3luY0hvc3RQcm9wZXJ0aWVzKCk7CiAgICAgICAgICBsZXQgYyQgPSB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47CiAgICAgICAgICBpZiAoYyQgJiYgYyQubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIERldGVjdCBjYXNlIHdoZXJlIGRvbS1pZiB3YXMgcmUtYXR0YWNoZWQgaW4gbmV3IHBvc2l0aW9uCiAgICAgICAgICAgIGxldCBsYXN0Q2hpbGQgPSB0aGlzLnByZXZpb3VzU2libGluZzsKICAgICAgICAgICAgaWYgKGxhc3RDaGlsZCAhPT0gYyRbYyQubGVuZ3RoLTFdKSB7CiAgICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxjJC5sZW5ndGgpICYmIChuPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgICBwYXJlbnROb2RlLmluc2VydEJlZm9yZShuLCB0aGlzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgX19zeW5jSG9zdFByb3BlcnRpZXMoKSB7CiAgICAgIGxldCBwcm9wcyA9IHRoaXMuX19pbnZhbGlkUHJvcHM7CiAgICAgIGlmIChwcm9wcykgewogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIHRoaXMuX19pbnN0YW5jZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHByb3AsIHRoaXMuX19kYXRhSG9zdFtwcm9wXSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICAgIHRoaXMuX19pbnN0YW5jZS5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgIH0KICAgIH0KCiAgICBfX3RlYXJkb3duSW5zdGFuY2UoKSB7CiAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICBsZXQgYyQgPSB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW47CiAgICAgICAgaWYgKGMkICYmIGMkLmxlbmd0aCkgewogICAgICAgICAgLy8gdXNlIGZpcnN0IGNoaWxkIHBhcmVudCwgZm9yIGNhc2Ugd2hlbiBkb20taWYgbWF5IGhhdmUgYmVlbiBkZXRhY2hlZAogICAgICAgICAgbGV0IHBhcmVudCA9IGMkWzBdLnBhcmVudE5vZGU7CiAgICAgICAgICAvLyBJbnN0YW5jZSBjaGlsZHJlbiBtYXkgYmUgZGlzY29ubmVjdGVkIGZyb20gcGFyZW50cyB3aGVuIGRvbS1pZgogICAgICAgICAgLy8gZGV0YWNoZXMgaWYgYSB0cmVlIHdhcyBpbm5lckhUTUwnZWQKICAgICAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBuOyAoaTxjJC5sZW5ndGgpICYmIChuPWMkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKG4pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG51bGw7CiAgICAgICAgdGhpcy5fX2ludmFsaWRQcm9wcyA9IG51bGw7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICogdGV4dCBub2RlcywgYHRleHRDb250ZW50YCBpcyByZW1vdmVkIHdoaWxlICJoaWRkZW4iIGFuZCByZXBsYWNlZCB3aGVuCiAgICAgKiAic2hvd24uIgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcm90ZWN0ZWQKICAgICAqLwogICAgX3Nob3dIaWRlQ2hpbGRyZW4oKSB7CiAgICAgIGxldCBoaWRkZW4gPSB0aGlzLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyB8fCAhdGhpcy5pZjsKICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZSkgewogICAgICAgIHRoaXMuX19pbnN0YW5jZS5fc2hvd0hpZGVDaGlsZHJlbihoaWRkZW4pOwogICAgICB9CiAgICB9CgogIH0KCiAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKERvbUlmLmlzLCBEb21JZik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkRvbUlmID0gRG9tSWY7Cgp9KSgpOwoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIC8qKgogICAqIEVsZW1lbnQgbWl4aW4gZm9yIHJlY29yZGluZyBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYQogICAqIG1hc3RlciBgaXRlbXNgIGFycmF5IGFuZCBhIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUKICAgKiBtYXN0ZXIgYXJyYXkgKGF0IHRoZSBob3N0KSBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUKICAgKiBjb3JyZWN0bHkgcHJvcGFnYXRlZCB0byBpdGVtcyBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEBwb2x5bWVyCiAgICogQG1peGluRnVuY3Rpb24KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuRWxlbWVudE1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBFbGVtZW50IG1peGluIGZvciByZWNvcmRpbmcgZHluYW1pYyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBpdGVtIHBhdGhzIGluIGEKICAgKiBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYSBgc2VsZWN0ZWRgIGFycmF5CiAgICovCiAgbGV0IEFycmF5U2VsZWN0b3JNaXhpbiA9IFBvbHltZXIuZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge3N1cGVyQ2xhc3N9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9FbGVtZW50TWl4aW59CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBsZXQgZWxlbWVudEJhc2UgPSBQb2x5bWVyLkVsZW1lbnRNaXhpbihzdXBlckNsYXNzKTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5DbGFzcwogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfQXJyYXlTZWxlY3Rvck1peGlufQogICAgICogQHVucmVzdHJpY3RlZAogICAgICovCiAgICBjbGFzcyBBcnJheVNlbGVjdG9yTWl4aW4gZXh0ZW5kcyBlbGVtZW50QmFzZSB7CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CgogICAgICAgIHJldHVybiB7CgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIGl0ZW1zIGZyb20gd2hpY2ggc2VsZWN0aW9uIHdpbGwgYmUgbWFkZS4KICAgICAgICAgICAqLwogICAgICAgICAgaXRlbXM6IHsKICAgICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgdHJ1ZWAsIG11bHRpcGxlIGl0ZW1zIG1heSBiZSBzZWxlY3RlZCBhdCBvbmNlIChpbiB0aGlzIGNhc2UsCiAgICAgICAgICAgKiBgc2VsZWN0ZWRgIGlzIGFuIGFycmF5IG9mIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcykuICBXaGVuIGBmYWxzZWAsCiAgICAgICAgICAgKiBvbmx5IG9uZSBpdGVtIG1heSBiZSBzZWxlY3RlZCBhdCBhIHRpbWUuCiAgICAgICAgICAgKi8KICAgICAgICAgIG11bHRpOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIGBtdWx0aWAgaXMgdHJ1ZSwgdGhpcyBpcyBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIGFueSBzZWxlY3RlZC4KICAgICAgICAgICAqIFdoZW4gYG11bHRpYCBpcyBmYWxzZSwgdGhpcyBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0sIG9yIGBudWxsYAogICAgICAgICAgICogaWYgbm8gaXRlbSBpcyBzZWxlY3RlZC4KICAgICAgICAgICAqIEB0eXBlIHs/KE9iamVjdHxBcnJheTwhT2JqZWN0Pil9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkOiB7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBgbXVsdGlgIGlzIGZhbHNlLCB0aGlzIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgb3IgYG51bGxgCiAgICAgICAgICAgKiBpZiBubyBpdGVtIGlzIHNlbGVjdGVkLgogICAgICAgICAgICogQHR5cGUgez9PYmplY3R9CiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkSXRlbTogewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZQogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFdoZW4gYHRydWVgLCBjYWxsaW5nIGBzZWxlY3RgIG9uIGFuIGl0ZW0gdGhhdCBpcyBhbHJlYWR5IHNlbGVjdGVkCiAgICAgICAgICAgKiB3aWxsIGRlc2VsZWN0IHRoZSBpdGVtLgogICAgICAgICAgICovCiAgICAgICAgICB0b2dnbGU6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IGZhbHNlCiAgICAgICAgICB9CgogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbJ19fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtcy4qKSddOwogICAgICB9CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBudWxsOwogICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBudWxsOwogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG51bGw7CiAgICAgIH0KCiAgICAgIF9fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtc0luZm8pIHsKICAgICAgICBsZXQgcGF0aCA9IGl0ZW1zSW5mby5wYXRoOwogICAgICAgIGlmIChwYXRoID09ICdpdGVtcycpIHsKICAgICAgICAgIC8vIENhc2UgMSAtIGl0ZW1zIGFycmF5IGNoYW5nZWQsIHNvIGRpZmYgYWdhaW5zdCBwcmV2aW91cyBhcnJheSBhbmQKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgbGV0IG5ld0l0ZW1zID0gaXRlbXNJbmZvLmJhc2UgfHwgW107CiAgICAgICAgICBsZXQgbGFzdEl0ZW1zID0gdGhpcy5fX2xhc3RJdGVtczsKICAgICAgICAgIGxldCBsYXN0TXVsdGkgPSB0aGlzLl9fbGFzdE11bHRpOwogICAgICAgICAgaWYgKG11bHRpICE9PSBsYXN0TXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGxhc3RJdGVtcykgewogICAgICAgICAgICBsZXQgc3BsaWNlcyA9IFBvbHltZXIuQXJyYXlTcGxpY2UuY2FsY3VsYXRlU3BsaWNlcyhuZXdJdGVtcywgbGFzdEl0ZW1zKTsKICAgICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhzcGxpY2VzKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19sYXN0SXRlbXMgPSBuZXdJdGVtczsKICAgICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBtdWx0aTsKICAgICAgICB9IGVsc2UgaWYgKGl0ZW1zSW5mby5wYXRoID09ICdpdGVtcy5zcGxpY2VzJykgewogICAgICAgICAgLy8gQ2FzZSAyIC0gZ290IHNwZWNpZmljIHNwbGljZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBhcnJheSBtdXRhdGlvbjoKICAgICAgICAgIC8vIGRlc2VsZWN0IGFueSByZW1vdmVkIGl0ZW1zIGFuZCBhZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcwogICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhpdGVtc0luZm8udmFsdWUuaW5kZXhTcGxpY2VzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQ2FzZSAzIC0gYW4gYXJyYXkgZWxlbWVudCB3YXMgY2hhbmdlZCwgc28gZGVzZWxlY3QgdGhlIHByZXZpb3VzCiAgICAgICAgICAvLyBpdGVtIGZvciB0aGF0IGluZGV4IGlmIGl0IHdhcyBwcmV2aW91c2x5IHNlbGVjdGVkCiAgICAgICAgICBsZXQgcGFydCA9IHBhdGguc2xpY2UoJ2l0ZW1zLicubGVuZ3RoKTsKICAgICAgICAgIGxldCBpZHggPSBwYXJzZUludChwYXJ0LCAxMCk7CiAgICAgICAgICBpZiAoKHBhcnQuaW5kZXhPZignLicpIDwgMCkgJiYgcGFydCA9PSBpZHgpIHsKICAgICAgICAgICAgdGhpcy5fX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX19hcHBseVNwbGljZXMoc3BsaWNlcykgewogICAgICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuX19zZWxlY3RlZE1hcDsKICAgICAgICAvLyBBZGp1c3Qgc2VsZWN0ZWQgaW5kaWNlcyBhbmQgbWFyayByZW1vdmFscwogICAgICAgIGZvciAobGV0IGk9MDsgaTxzcGxpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgcyA9IHNwbGljZXNbaV07CiAgICAgICAgICBzZWxlY3RlZC5mb3JFYWNoKChpZHgsIGl0ZW0pID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA8IHMuaW5kZXgpIHsKICAgICAgICAgICAgICAvLyBubyBjaGFuZ2UKICAgICAgICAgICAgfSBlbHNlIGlmIChpZHggPj0gcy5pbmRleCArIHMucmVtb3ZlZC5sZW5ndGgpIHsKICAgICAgICAgICAgICAvLyBhZGp1c3QgaW5kZXgKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQoaXRlbSwgaWR4ICsgcy5hZGRlZENvdW50IC0gcy5yZW1vdmVkLmxlbmd0aCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gcmVtb3ZlIGluZGV4CiAgICAgICAgICAgICAgc2VsZWN0ZWQuc2V0KGl0ZW0sIC0xKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBmb3IgKGxldCBqPTA7IGo8cy5hZGRlZENvdW50OyBqKyspIHsKICAgICAgICAgICAgbGV0IGlkeCA9IHMuaW5kZXggKyBqOwogICAgICAgICAgICBpZiAoc2VsZWN0ZWQuaGFzKHRoaXMuaXRlbXNbaWR4XSkpIHsKICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQodGhpcy5pdGVtc1tpZHhdLCBpZHgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFVwZGF0ZSBsaW5rZWQgcGF0aHMKICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgaXRlbXMgYXJyYXkKICAgICAgICBsZXQgc2lkeCA9IDA7CiAgICAgICAgc2VsZWN0ZWQuZm9yRWFjaCgoaWR4LCBpdGVtKSA9PiB7CiAgICAgICAgICBpZiAoaWR4IDwgMCkgewogICAgICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkSXRlbSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2VsZWN0ZWQuZGVsZXRlKGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2lkeCsrOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICBfX3VwZGF0ZUxpbmtzKCkgewogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgbGV0IHNpZHggPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goaWR4ID0+IHsKICAgICAgICAgICAgaWYgKGlkeCA+PSAwKSB7CiAgICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ2l0ZW1zLicgKyBpZHgsICdzZWxlY3RlZC4nICsgc2lkeCsrKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5mb3JFYWNoKGlkeCA9PiB7CiAgICAgICAgICAgIHRoaXMubGlua1BhdGhzKCdzZWxlY3RlZCcsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoJ3NlbGVjdGVkSXRlbScsICdpdGVtcy4nICsgaWR4KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENsZWFycyB0aGUgc2VsZWN0aW9uIHN0YXRlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2xlYXJTZWxlY3Rpb24oKSB7CiAgICAgICAgLy8gVW5iaW5kIHByZXZpb3VzIHNlbGVjdGlvbgogICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB7fTsKICAgICAgICAvLyBUaGUgc2VsZWN0ZWQgbWFwIHN0b3JlcyAzIHBpZWNlcyBvZiBpbmZvcm1hdGlvbjoKICAgICAgICAvLyBrZXk6IGl0ZW1zIGFycmF5IG9iamVjdAogICAgICAgIC8vIHZhbHVlOiBpdGVtcyBhcnJheSBpbmRleAogICAgICAgIC8vIG9yZGVyOiBzZWxlY3RlZCBhcnJheSBpbmRleAogICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAvLyBJbml0aWFsaXplIHNlbGVjdGlvbgogICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLm11bHRpID8gW10gOiBudWxsOwogICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaXRlbSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byB0ZXN0CiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGl0ZW0gaXMgc2VsZWN0ZWQKICAgICAgICovCiAgICAgIGlzU2VsZWN0ZWQoaXRlbSkgewogICAgICAgIHJldHVybiB0aGlzLl9fc2VsZWN0ZWRNYXAuaGFzKGl0ZW0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBpdGVtIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGlkeCBJbmRleCBmcm9tIGBpdGVtc2AgYXJyYXkgdG8gdGVzdAogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBpdGVtIGlzIHNlbGVjdGVkCiAgICAgICAqLwogICAgICBpc0luZGV4U2VsZWN0ZWQoaWR4KSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2lkeF0pOwogICAgICB9CgogICAgICBfX2Rlc2VsZWN0Q2hhbmdlZElkeChpZHgpIHsKICAgICAgICBsZXQgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgaWYgKHNpZHggPj0gMCkgewogICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goKGlkeCwgaXRlbSkgPT4gewogICAgICAgICAgICBpZiAoc2lkeCA9PSBpKyspIHsKICAgICAgICAgICAgICB0aGlzLmRlc2VsZWN0KGl0ZW0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fc2VsZWN0ZWRJbmRleEZvckl0ZW1JbmRleChpZHgpIHsKICAgICAgICBsZXQgc2VsZWN0ZWQgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzWydpdGVtcy4nICsgaWR4XTsKICAgICAgICBpZiAoc2VsZWN0ZWQpIHsKICAgICAgICAgIHJldHVybiBwYXJzZUludChzZWxlY3RlZC5zbGljZSgnc2VsZWN0ZWQuJy5sZW5ndGgpLCAxMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRGVzZWxlY3RzIHRoZSBnaXZlbiBpdGVtIGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBkZXNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGVzZWxlY3QoaXRlbSkgewogICAgICAgIGxldCBpZHggPSB0aGlzLl9fc2VsZWN0ZWRNYXAuZ2V0KGl0ZW0pOwogICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmRlbGV0ZShpdGVtKTsKICAgICAgICAgIGxldCBzaWR4OwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fdXBkYXRlTGlua3MoKTsKICAgICAgICAgIGlmICh0aGlzLm11bHRpKSB7CiAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdzZWxlY3RlZCcsIHNpZHgsIDEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBEZXNlbGVjdHMgdGhlIGdpdmVuIGluZGV4IGlmIGl0IGlzIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIGRlc2VsZWN0CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkZXNlbGVjdEluZGV4KGlkeCkgewogICAgICAgIHRoaXMuZGVzZWxlY3QodGhpcy5pdGVtc1tpZHhdKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGVjdHMgdGhlIGdpdmVuIGl0ZW0uICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBzZWxlY3QKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNlbGVjdChpdGVtKSB7CiAgICAgICAgdGhpcy5zZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2VsZWN0cyB0aGUgZ2l2ZW4gaW5kZXguICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIHNlbGVjdAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc2VsZWN0SW5kZXgoaWR4KSB7CiAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLml0ZW1zW2lkeF07CiAgICAgICAgaWYgKCF0aGlzLmlzU2VsZWN0ZWQoaXRlbSkpIHsKICAgICAgICAgIGlmICghdGhpcy5tdWx0aSkgewogICAgICAgICAgICB0aGlzLl9fc2VsZWN0ZWRNYXAuY2xlYXIoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5zZXQoaXRlbSwgaWR4KTsKICAgICAgICAgIHRoaXMuX191cGRhdGVMaW5rcygpOwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgdGhpcy5wdXNoKCdzZWxlY3RlZCcsIGl0ZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRoaXMudG9nZ2xlKSB7CiAgICAgICAgICB0aGlzLmRlc2VsZWN0SW5kZXgoaWR4KTsKICAgICAgICB9CiAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIEFycmF5U2VsZWN0b3JNaXhpbjsKCiAgfSk7CgogIC8vIGV4cG9ydCBtaXhpbgogIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluID0gQXJyYXlTZWxlY3Rvck1peGluOwoKICAvKioKICAgKiBAY29uc3RydWN0b3IKICAgKiBAZXh0ZW5kcyB7UG9seW1lci5FbGVtZW50fQogICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0FycmF5U2VsZWN0b3JNaXhpbn0KICAgKiBAcHJpdmF0ZQogICAqLwogIGxldCBiYXNlQXJyYXlTZWxlY3RvciA9IEFycmF5U2VsZWN0b3JNaXhpbihQb2x5bWVyLkVsZW1lbnQpOwoKICAvKioKICAgKiBFbGVtZW50IGltcGxlbWVudGluZyB0aGUgYFBvbHltZXIuQXJyYXlTZWxlY3RvcmAgbWl4aW4sIHdoaWNoIHJlY29yZHMKICAgKiBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYSBtYXN0ZXIgYGl0ZW1zYCBhcnJheSBhbmQgYQogICAqIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUgbWFzdGVyIGFycmF5IChhdCB0aGUgaG9zdCkKICAgKiBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUgY29ycmVjdGx5IHByb3BhZ2F0ZWQgdG8gaXRlbXMKICAgKiBpbiB0aGUgc2VsZWN0ZWQgYXJyYXkgYW5kIHZpY2UtdmVyc2EuCiAgICoKICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgKiBgc2VsZWN0KGl0ZW0pYCBhbmQgYGRlc2VsZWN0KGl0ZW0pYCBBUEksIHVwZGF0ZXMgdGhlIGBzZWxlY3RlZGAgcHJvcGVydHkKICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAqIGBpdGVtc2AgYXJyYXkuICBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIGBzZWxlY3RlZGAgaXMgYSBwcm9wZXJ0eQogICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgKgogICAqIEV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPGRvbS1tb2R1bGUgaWQ9ImVtcGxveWVlLWxpc3QiPgogICAqCiAgICogICA8dGVtcGxhdGU+CiAgICoKICAgKiAgICAgPGRpdj4gRW1wbG95ZWUgbGlzdDogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGlkPSJlbXBsb3llZUxpc3QiIGl0ZW1zPSJ7e2VtcGxveWVlc319Ij4KICAgKiAgICAgICA8dGVtcGxhdGU+CiAgICogICAgICAgICA8ZGl2PkZpcnN0IG5hbWU6IDxzcGFuPnt7aXRlbS5maXJzdH19PC9zcGFuPjwvZGl2PgogICAqICAgICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICAgICAgPGJ1dHRvbiBvbi1jbGljaz0idG9nZ2xlU2VsZWN0aW9uIj5TZWxlY3Q8L2J1dHRvbj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgICAgPGFycmF5LXNlbGVjdG9yIGlkPSJzZWxlY3RvciIgaXRlbXM9Int7ZW1wbG95ZWVzfX0iIHNlbGVjdGVkPSJ7e3NlbGVjdGVkfX0iIG11bHRpIHRvZ2dsZT48L2FycmF5LXNlbGVjdG9yPgogICAqCiAgICogICAgIDxkaXY+IFNlbGVjdGVkIGVtcGxveWVlczogPC9kaXY+CiAgICogICAgIDxkb20tcmVwZWF0IGl0ZW1zPSJ7e3NlbGVjdGVkfX0iPgogICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgKiAgICAgICAgIDxkaXY+Rmlyc3QgbmFtZTogPHNwYW4+e3tpdGVtLmZpcnN0fX08L3NwYW4+PC9kaXY+CiAgICogICAgICAgICA8ZGl2Pkxhc3QgbmFtZTogPHNwYW4+e3tpdGVtLmxhc3R9fTwvc3Bhbj48L2Rpdj4KICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAqICAgICA8L2RvbS1yZXBlYXQ+CiAgICoKICAgKiAgIDwvdGVtcGxhdGU+CiAgICoKICAgKiA8L2RvbS1tb2R1bGU+CiAgICogYGBgCiAgICoKICAgKiBgYGBqcwogICAqY2xhc3MgRW1wbG95ZWVMaXN0IGV4dGVuZHMgUG9seW1lci5FbGVtZW50IHsKICAgKiAgc3RhdGljIGdldCBpcygpIHsgcmV0dXJuICdlbXBsb3llZS1saXN0JzsgfQogICAqICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICogICAgcmV0dXJuIHsKICAgKiAgICAgIGVtcGxveWVlczogewogICAqICAgICAgICB2YWx1ZSgpIHsKICAgKiAgICAgICAgICByZXR1cm4gWwogICAqICAgICAgICAgICAge2ZpcnN0OiAnQm9iJywgbGFzdDogJ1NtaXRoJ30sCiAgICogICAgICAgICAgICB7Zmlyc3Q6ICdTYWxseScsIGxhc3Q6ICdKb2huc29uJ30sCiAgICogICAgICAgICAgICAuLi4KICAgKiAgICAgICAgICBdOwogICAqICAgICAgICB9CiAgICogICAgICB9CiAgICogICAgfTsKICAgKiAgfQogICAqICB0b2dnbGVTZWxlY3Rpb24oZSkgewogICAqICAgIGxldCBpdGVtID0gdGhpcy4kLmVtcGxveWVlTGlzdC5pdGVtRm9yRWxlbWVudChlLnRhcmdldCk7CiAgICogICAgdGhpcy4kLnNlbGVjdG9yLnNlbGVjdChpdGVtKTsKICAgKiAgfQogICAqfQogICAqIGBgYAogICAqCiAgICogQHBvbHltZXIKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIHtiYXNlQXJyYXlTZWxlY3Rvcn0KICAgKiBAYXBwbGllc01peGluIFBvbHltZXIuQXJyYXlTZWxlY3Rvck1peGluCiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCB0aGF0IGxpbmtzIHBhdGhzIGJldHdlZW4gYW4gaW5wdXQgYGl0ZW1zYCBhcnJheSBhbmQKICAgKiAgIGFuIG91dHB1dCBgc2VsZWN0ZWRgIGl0ZW0gb3IgYXJyYXkgYmFzZWQgb24gY2FsbHMgdG8gaXRzIHNlbGVjdGlvbiBBUEkuCiAgICovCiAgY2xhc3MgQXJyYXlTZWxlY3RvciBleHRlbmRzIGJhc2VBcnJheVNlbGVjdG9yIHsKICAgIC8vIE5vdCBuZWVkZWQgdG8gZmluZCB0ZW1wbGF0ZTsgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgYW5hbHl6ZXIKICAgIC8vIGNhbiBmaW5kIHRoZSB0YWcgbmFtZSBmcm9tIGN1c3RvbUVsZW1lbnRzLmRlZmluZSBjYWxsCiAgICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ2FycmF5LXNlbGVjdG9yJzsgfQogIH0KICBjdXN0b21FbGVtZW50cy5kZWZpbmUoQXJyYXlTZWxlY3Rvci5pcywgQXJyYXlTZWxlY3Rvcik7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkFycmF5U2VsZWN0b3IgPSBBcnJheVNlbGVjdG9yOwoKfSkoKTsKCgooZnVuY3Rpb24oKXsvKgoKQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dApUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28Kc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKKi8KJ3VzZSBzdHJpY3QnO3ZhciBjPW51bGwsZj13aW5kb3cuSFRNTEltcG9ydHMmJndpbmRvdy5IVE1MSW1wb3J0cy53aGVuUmVhZHl8fG51bGwsZztmdW5jdGlvbiBoKGEpe3JlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2Y/ZihhKTooY3x8KGM9bmV3IFByb21pc2UoZnVuY3Rpb24oYSl7Zz1hfSksImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGU/ZygpOmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGZ1bmN0aW9uKCl7ImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGUmJmcoKX0pKSxjLnRoZW4oZnVuY3Rpb24oKXthJiZhKCl9KSl9KX07dmFyIGs9bnVsbCxsPW51bGw7ZnVuY3Rpb24gbSgpe3RoaXMuY3VzdG9tU3R5bGVzPVtdO3RoaXMuZW5xdWV1ZWQ9ITE7aChmdW5jdGlvbigpe3dpbmRvdy5TaGFkeUNTUy5mbHVzaEN1c3RvbVN0eWxlcyYmd2luZG93LlNoYWR5Q1NTLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KX1mdW5jdGlvbiBuKGEpeyFhLmVucXVldWVkJiZsJiYoYS5lbnF1ZXVlZD0hMCxoKGwpKX1tLnByb3RvdHlwZS5jPWZ1bmN0aW9uKGEpe2EuX19zZWVuQnlTaGFkeUNTU3x8KGEuX19zZWVuQnlTaGFkeUNTUz0hMCx0aGlzLmN1c3RvbVN0eWxlcy5wdXNoKGEpLG4odGhpcykpfTttLnByb3RvdHlwZS5iPWZ1bmN0aW9uKGEpe2lmKGEuX19zaGFkeUNTU0NhY2hlZFN0eWxlKXJldHVybiBhLl9fc2hhZHlDU1NDYWNoZWRTdHlsZTt2YXIgYjthLmdldFN0eWxlP2I9YS5nZXRTdHlsZSgpOmI9YTtyZXR1cm4gYn07Cm0ucHJvdG90eXBlLmE9ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5jdXN0b21TdHlsZXMsYj0wO2I8YS5sZW5ndGg7YisrKXt2YXIgZD1hW2JdO2lmKCFkLl9fc2hhZHlDU1NDYWNoZWRTdHlsZSl7dmFyIGU9dGhpcy5iKGQpO2UmJihlPWUuX19hcHBsaWVkRWxlbWVudHx8ZSxrJiZrKGUpLGQuX19zaGFkeUNTU0NhY2hlZFN0eWxlPWUpfX1yZXR1cm4gYX07bS5wcm90b3R5cGUuYWRkQ3VzdG9tU3R5bGU9bS5wcm90b3R5cGUuYzttLnByb3RvdHlwZS5nZXRTdHlsZUZvckN1c3RvbVN0eWxlPW0ucHJvdG90eXBlLmI7bS5wcm90b3R5cGUucHJvY2Vzc1N0eWxlcz1tLnByb3RvdHlwZS5hOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhtLnByb3RvdHlwZSx7dHJhbnNmb3JtQ2FsbGJhY2s6e2dldDpmdW5jdGlvbigpe3JldHVybiBrfSxzZXQ6ZnVuY3Rpb24oYSl7az1hfX0sdmFsaWRhdGVDYWxsYmFjazp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGx9LHNldDpmdW5jdGlvbihhKXt2YXIgYj0hMTtsfHwoYj0hMCk7bD1hO2ImJm4odGhpcyl9fX0pO2Z1bmN0aW9uIHAoYSxiKXtmb3IodmFyIGQgaW4gYiludWxsPT09ZD9hLnN0eWxlLnJlbW92ZVByb3BlcnR5KGQpOmEuc3R5bGUuc2V0UHJvcGVydHkoZCxiW2RdKX07dmFyIHE9ISh3aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5pblVzZSkscjtmdW5jdGlvbiB0KGEpe3I9YSYmYS5zaGltY3NzcHJvcGVydGllcz8hMTpxfHwhKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcGxlV2ViS2l0XC82MDF8RWRnZVwvMTUvKXx8IXdpbmRvdy5DU1N8fCFDU1Muc3VwcG9ydHN8fCFDU1Muc3VwcG9ydHMoImJveC1zaGFkb3ciLCIwIDAgMCB2YXIoLS1mb28pIikpfXZhciB1O3dpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkJiYodT13aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQpO3ZhciB2PSEoIXdpbmRvdy5TaGFkeUNTU3x8IXdpbmRvdy5TaGFkeUNTUy5kaXNhYmxlUnVudGltZSk7CndpbmRvdy5TaGFkeUNTUyYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzcz9yPXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M6d2luZG93LlNoYWR5Q1NTPyh0KHdpbmRvdy5TaGFkeUNTUyksd2luZG93LlNoYWR5Q1NTPXZvaWQgMCk6dCh3aW5kb3cuV2ViQ29tcG9uZW50cyYmd2luZG93LldlYkNvbXBvbmVudHMuZmxhZ3MpO3ZhciB3PXIseD11O3ZhciB5PW5ldyBtO3dpbmRvdy5TaGFkeUNTU3x8KHdpbmRvdy5TaGFkeUNTUz17cHJlcGFyZVRlbXBsYXRlOmZ1bmN0aW9uKCl7fSxwcmVwYXJlVGVtcGxhdGVEb206ZnVuY3Rpb24oKXt9LHByZXBhcmVUZW1wbGF0ZVN0eWxlczpmdW5jdGlvbigpe30sc3R5bGVTdWJ0cmVlOmZ1bmN0aW9uKGEsYil7eS5hKCk7cChhLGIpfSxzdHlsZUVsZW1lbnQ6ZnVuY3Rpb24oKXt5LmEoKX0sc3R5bGVEb2N1bWVudDpmdW5jdGlvbihhKXt5LmEoKTtwKGRvY3VtZW50LmJvZHksYSl9LGdldENvbXB1dGVkU3R5bGVWYWx1ZTpmdW5jdGlvbihhLGIpe3JldHVybihhPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGEpLmdldFByb3BlcnR5VmFsdWUoYikpP2EudHJpbSgpOiIifSxmbHVzaEN1c3RvbVN0eWxlczpmdW5jdGlvbigpe30sbmF0aXZlQ3NzOncsbmF0aXZlU2hhZG93OnEsY3NzQnVpbGQ6eCxkaXNhYmxlUnVudGltZTp2fSk7d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlPXk7fSkuY2FsbCh0aGlzKTsKCgoKCihmdW5jdGlvbigpIHsKICAndXNlIHN0cmljdCc7CgogIGNvbnN0IGF0dHIgPSAnaW5jbHVkZSc7CgogIGNvbnN0IEN1c3RvbVN0eWxlSW50ZXJmYWNlID0gd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlOwoKICAvKioKICAgKiBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuIHRha2UKICAgKiBhZHZhbnRhZ2Ugb2YgW3NoYWR5IERPTV0oaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvc2hhZHljc3MpIHNoaW1zCiAgICogZm9yIHN0eWxlIGVuY2Fwc3VsYXRpb24sIGN1c3RvbSBwcm9wZXJ0aWVzLCBhbmQgY3VzdG9tIG1peGlucy4KICAgKgogICAqIC0gRG9jdW1lbnQgc3R5bGVzIGRlZmluZWQgaW4gYSBgPGN1c3RvbS1zdHlsZT5gIGFyZSBzaGltbWVkIHRvIGVuc3VyZSB0aGV5CiAgICogICBkbyBub3QgbGVhayBpbnRvIGxvY2FsIERPTSB3aGVuIHJ1bm5pbmcgb24gYnJvd3NlcnMgd2l0aG91dCBuYXRpdmUKICAgKiAgIFNoYWRvdyBET00uCiAgICogLSBDdXN0b20gcHJvcGVydGllcyBjYW4gYmUgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAuIFVzZSB0aGUgYGh0bWxgIHNlbGVjdG9yCiAgICogICB0byBkZWZpbmUgY3VzdG9tIHByb3BlcnRpZXMgdGhhdCBhcHBseSB0byBhbGwgY3VzdG9tIGVsZW1lbnRzLgogICAqIC0gQ3VzdG9tIG1peGlucyBjYW4gYmUgZGVmaW5lZCBpbiBhIGA8Y3VzdG9tLXN0eWxlPmAsIGlmIHlvdSBpbXBvcnQgdGhlIG9wdGlvbmFsCiAgICogICBbYXBwbHkgc2hpbV0oaHR0cHM6Ly9naXRodWIuY29tL3dlYmNvbXBvbmVudHMvc2hhZHljc3MjYWJvdXQtYXBwbHlzaGltKQogICAqICAgKGBzaGFkeWNzcy9hcHBseS1zaGltLmh0bWxgKS4KICAgKgogICAqIFRvIHVzZToKICAgKgogICAqIC0gSW1wb3J0IGBjdXN0b20tc3R5bGUuaHRtbGAuCiAgICogLSBQbGFjZSBhIGA8Y3VzdG9tLXN0eWxlPmAgZWxlbWVudCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgd3JhcHBpbmcgYW4gaW5saW5lIGA8c3R5bGU+YCB0YWcgdGhhdAogICAqICAgY29udGFpbnMgdGhlIENTUyBydWxlcyB5b3Ugd2FudCB0byBzaGltLgogICAqCiAgICogRm9yIGV4YW1wbGU6CiAgICoKICAgKiBgYGBodG1sCiAgICogPCEtLSBpbXBvcnQgYXBwbHkgc2hpbS0tb25seSByZXF1aXJlZCBpZiB1c2luZyBtaXhpbnMgLS0+CiAgICogPGxpbmsgcmVsPSJpbXBvcnQiIGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvc2hhZHljc3MvYXBwbHktc2hpbS5odG1sIj4KICAgKiA8IS0tIGltcG9ydCBjdXN0b20tc3R5bGUgZWxlbWVudCAtLT4KICAgKiA8bGluayByZWw9ImltcG9ydCIgaHJlZj0iYm93ZXJfY29tcG9uZW50cy9wb2x5bWVyL2xpYi9lbGVtZW50cy9jdXN0b20tc3R5bGUuaHRtbCI+CiAgICoKICAgKiA8Y3VzdG9tLXN0eWxlPgogICAqICAgPHN0eWxlPgogICAqICAgICBodG1sIHsKICAgKiAgICAgICAtLWN1c3RvbS1jb2xvcjogYmx1ZTsKICAgKiAgICAgICAtLWN1c3RvbS1taXhpbjogewogICAqICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICogICAgICAgICBjb2xvcjogcmVkOwogICAqICAgICAgIH07CiAgICogICAgIH0KICAgKiAgIDwvc3R5bGU+CiAgICogPC9jdXN0b20tc3R5bGU+CiAgICogYGBgCiAgICoKICAgKiBAY3VzdG9tRWxlbWVudAogICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICogQG1lbWJlcm9mIFBvbHltZXIKICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuCiAgICogICB0YWtlIGFkdmFudGFnZSBvZiBQb2x5bWVyJ3Mgc3R5bGUgc2NvcGluZyBhbmQgY3VzdG9tIHByb3BlcnRpZXMgc2hpbXMuCiAgICovCiAgY2xhc3MgQ3VzdG9tU3R5bGUgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgc3VwZXIoKTsKICAgICAgdGhpcy5fc3R5bGUgPSBudWxsOwogICAgICBDdXN0b21TdHlsZUludGVyZmFjZS5hZGRDdXN0b21TdHlsZSh0aGlzKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGlnaHQtRE9NIGA8c3R5bGU+YCBjaGlsZCB0aGlzIGVsZW1lbnQgd3JhcHMuICBVcG9uIGZpcnN0CiAgICAgKiBjYWxsIGFueSBzdHlsZSBtb2R1bGVzIHJlZmVyZW5jZWQgdmlhIHRoZSBgaW5jbHVkZWAgYXR0cmlidXRlIHdpbGwgYmUKICAgICAqIGNvbmNhdGVuYXRlZCB0byB0aGlzIGVsZW1lbnQncyBgPHN0eWxlPmAuCiAgICAgKgogICAgICogQHJldHVybiB7SFRNTFN0eWxlRWxlbWVudH0gVGhpcyBlbGVtZW50J3MgbGlnaHQtRE9NIGA8c3R5bGU+YAogICAgICovCiAgICBnZXRTdHlsZSgpIHsKICAgICAgaWYgKHRoaXMuX3N0eWxlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlOwogICAgICB9CiAgICAgIGNvbnN0IHN0eWxlID0gLyoqIEB0eXBlIHtIVE1MU3R5bGVFbGVtZW50fSAqLyh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpOwogICAgICBpZiAoIXN0eWxlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdGhpcy5fc3R5bGUgPSBzdHlsZTsKICAgICAgY29uc3QgaW5jbHVkZSA9IHN0eWxlLmdldEF0dHJpYnV0ZShhdHRyKTsKICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICBzdHlsZS5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7CiAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSBQb2x5bWVyLlN0eWxlR2F0aGVyLmNzc0Zyb21Nb2R1bGVzKGluY2x1ZGUpICsgc3R5bGUudGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgLyoKICAgICAgSFRNTCBJbXBvcnRzIHN0eWxpbmcgdGhlIG1haW4gZG9jdW1lbnQgYXJlIGRlcHJlY2F0ZWQgaW4gQ2hyb21lCiAgICAgIGh0dHBzOi8vY3JidWcuY29tLzUyMzk1MgoKICAgICAgSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgdGhlbiBpdCBtdXN0IGJlIGluIGFuIEhUTUwgSW1wb3J0IGRvY3VtZW50LgogICAgICBJbiB0aGF0IGNhc2UsIG1vdmUgdGhlIGN1c3RvbSBzdHlsZSB0byB0aGUgbWFpbiBkb2N1bWVudC4KCiAgICAgIFRoZSBvcmRlcmluZyBvZiBgPGN1c3RvbS1zdHlsZT5gIHNob3VsZCBzdGF5IHRoZSBzYW1lIGFzIHdoZW4gbG9hZGVkIGJ5IEhUTUwgSW1wb3J0cywgYnV0IHRoZXJlIG1heSBiZSBvZGQKICAgICAgY2FzZXMgb2Ygb3JkZXJpbmcgdy5yLnQgdGhlIG1haW4gZG9jdW1lbnQgc3R5bGVzLgogICAgICAqLwogICAgICBpZiAodGhpcy5vd25lckRvY3VtZW50ICE9PSB3aW5kb3cuZG9jdW1lbnQpIHsKICAgICAgICB3aW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fc3R5bGU7CiAgICB9CiAgfQoKICB3aW5kb3cuY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdjdXN0b20tc3R5bGUnLCBDdXN0b21TdHlsZSk7CgogIC8qKiBAY29uc3QgKi8KICBQb2x5bWVyLkN1c3RvbVN0eWxlID0gQ3VzdG9tU3R5bGU7Cn0pKCk7CgoKKGZ1bmN0aW9uKCkgewogICd1c2Ugc3RyaWN0JzsKCiAgbGV0IG11dGFibGVQcm9wZXJ0eUNoYW5nZTsKICAvKiogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gKi8KICAoKCkgPT4gewogICAgbXV0YWJsZVByb3BlcnR5Q2hhbmdlID0gUG9seW1lci5NdXRhYmxlRGF0YS5fbXV0YWJsZVByb3BlcnR5Q2hhbmdlOwogIH0pKCk7CgogIC8qKgogICAqIExlZ2FjeSBlbGVtZW50IGJlaGF2aW9yIHRvIHNraXAgc3RyaWN0IGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMsCiAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpIGZvciB1c2Ugb24gbGVnYWN5IEFQSSBQb2x5bWVyIGVsZW1lbnRzLgogICAqCiAgICogQnkgZGVmYXVsdCwgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCBwZXJmb3JtcyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgb24KICAgKiBvYmplY3RzLCB3aGljaCBtZWFucyB0aGF0IGFueSBkZWVwIG1vZGlmaWNhdGlvbnMgdG8gYW4gb2JqZWN0IG9yIGFycmF5IHdpbGwKICAgKiBub3QgYmUgcHJvcGFnYXRlZCB1bmxlc3MgImltbXV0YWJsZSIgZGF0YSBwYXR0ZXJucyBhcmUgdXNlZCAoaS5lLiBhbGwgb2JqZWN0CiAgICogcmVmZXJlbmNlcyBmcm9tIHRoZSByb290IHRvIHRoZSBtdXRhdGlvbiB3ZXJlIGNoYW5nZWQpLgogICAqCiAgICogUG9seW1lciBhbHNvIHByb3ZpZGVzIGEgcHJvcHJpZXRhcnkgZGF0YSBtdXRhdGlvbiBhbmQgcGF0aCBub3RpZmljYXRpb24gQVBJCiAgICogKGUuZy4gYG5vdGlmeVBhdGhgLCBgc2V0YCwgYW5kIGFycmF5IG11dGF0aW9uIEFQSSdzKSB0aGF0IGFsbG93IGVmZmljaWVudAogICAqIG11dGF0aW9uIGFuZCBub3RpZmljYXRpb24gb2YgZGVlcCBjaGFuZ2VzIGluIGFuIG9iamVjdCBncmFwaCB0byBhbGwgZWxlbWVudHMKICAgKiBib3VuZCB0byB0aGUgc2FtZSBvYmplY3QgZ3JhcGguCiAgICoKICAgKiBJbiBjYXNlcyB3aGVyZSBuZWl0aGVyIGltbXV0YWJsZSBwYXR0ZXJucyBub3IgdGhlIGRhdGEgbXV0YXRpb24gQVBJIGNhbiBiZQogICAqIHVzZWQsIGFwcGx5aW5nIHRoaXMgbWl4aW4gd2lsbCBjYXVzZSBQb2x5bWVyIHRvIHNraXAgZGlydHkgY2hlY2tpbmcgZm9yCiAgICogb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZSAiZGlydHkiKS4gIFRoaXMgYWxsb3dzIGEKICAgKiB1c2VyIHRvIG1ha2UgYSBkZWVwIG1vZGlmaWNhdGlvbiB0byBhIGJvdW5kIG9iamVjdCBncmFwaCwgYW5kIHRoZW4gZWl0aGVyCiAgICogc2ltcGx5IHJlLXNldCB0aGUgb2JqZWN0IChlLmcuIGB0aGlzLml0ZW1zID0gdGhpcy5pdGVtc2ApIG9yIGNhbGwgYG5vdGlmeVBhdGhgCiAgICogKGUuZy4gYHRoaXMubm90aWZ5UGF0aCgnaXRlbXMnKWApIHRvIHVwZGF0ZSB0aGUgdHJlZS4gIE5vdGUgdGhhdCBhbGwKICAgKiBlbGVtZW50cyB0aGF0IHdpc2ggdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBkZWVwIG11dGF0aW9ucyBtdXN0IGFwcGx5IHRoaXMKICAgKiBtaXhpbiBvciBvdGhlcndpc2Ugc2tpcCBzdHJpY3QgZGlydHkgY2hlY2tpbmcgZm9yIG9iamVjdHMvYXJyYXlzLgogICAqIFNwZWNpZmljYWxseSwgYW55IGVsZW1lbnRzIGluIHRoZSBiaW5kaW5nIHRyZWUgYmV0d2VlbiB0aGUgc291cmNlIG9mIGEKICAgKiBtdXRhdGlvbiBhbmQgdGhlIGNvbnN1bXB0aW9uIG9mIGl0IG11c3QgYXBwbHkgdGhpcyBiZWhhdmlvciBvciBlbmFibGUgdGhlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIEluIG9yZGVyIHRvIG1ha2UgdGhlIGRpcnR5IGNoZWNrIHN0cmF0ZWd5IGNvbmZpZ3VyYWJsZSwgc2VlCiAgICogYFBvbHltZXIuT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yYC4KICAgKgogICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAqIHdpbGwgYmUgd29yc2UgYXMgb3Bwb3NlZCB0byB1c2luZyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUKICAgKiBwYXR0ZXJucyBvciBQb2x5bWVyJ3MgcGF0aCBub3RpZmljYXRpb24gQVBJLgogICAqCiAgICogQHBvbHltZXJCZWhhdmlvcgogICAqIEBtZW1iZXJvZiBQb2x5bWVyCiAgICogQHN1bW1hcnkgQmVoYXZpb3IgdG8gc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk11dGFibGVEYXRhQmVoYXZpb3IgPSB7CgogICAgLyoqCiAgICAgKiBPdmVycmlkZXMgYFBvbHltZXIuUHJvcGVydHlFZmZlY3RzYCB0byBwcm92aWRlIG9wdGlvbiBmb3Igc2tpcHBpbmcKICAgICAqIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIHB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYAogICAgICogY2FjaGUgKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgcmV0dXJuIG11dGFibGVQcm9wZXJ0eUNoYW5nZSh0aGlzLCBwcm9wZXJ0eSwgdmFsdWUsIG9sZCwgdHJ1ZSk7CiAgICB9CiAgfTsKCiAgLyoqCiAgICogTGVnYWN5IGVsZW1lbnQgYmVoYXZpb3IgdG8gYWRkIHRoZSBvcHRpb25hbCBhYmlsaXR5IHRvIHNraXAgc3RyaWN0CiAgICogZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUKICAgKiAiZGlydHkiKSBieSBzZXR0aW5nIGEgYG11dGFibGUtZGF0YWAgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgaW5zdGFuY2UuCiAgICoKICAgKiBCeSBkZWZhdWx0LCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHBlcmZvcm1zIHN0cmljdCBkaXJ0eSBjaGVja2luZyBvbgogICAqIG9iamVjdHMsIHdoaWNoIG1lYW5zIHRoYXQgYW55IGRlZXAgbW9kaWZpY2F0aW9ucyB0byBhbiBvYmplY3Qgb3IgYXJyYXkgd2lsbAogICAqIG5vdCBiZSBwcm9wYWdhdGVkIHVubGVzcyAiaW1tdXRhYmxlIiBkYXRhIHBhdHRlcm5zIGFyZSB1c2VkIChpLmUuIGFsbCBvYmplY3QKICAgKiByZWZlcmVuY2VzIGZyb20gdGhlIHJvb3QgdG8gdGhlIG11dGF0aW9uIHdlcmUgY2hhbmdlZCkuCiAgICoKICAgKiBQb2x5bWVyIGFsc28gcHJvdmlkZXMgYSBwcm9wcmlldGFyeSBkYXRhIG11dGF0aW9uIGFuZCBwYXRoIG5vdGlmaWNhdGlvbiBBUEkKICAgKiAoZS5nLiBgbm90aWZ5UGF0aGAsIGBzZXRgLCBhbmQgYXJyYXkgbXV0YXRpb24gQVBJJ3MpIHRoYXQgYWxsb3cgZWZmaWNpZW50CiAgICogbXV0YXRpb24gYW5kIG5vdGlmaWNhdGlvbiBvZiBkZWVwIGNoYW5nZXMgaW4gYW4gb2JqZWN0IGdyYXBoIHRvIGFsbCBlbGVtZW50cwogICAqIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdCBncmFwaC4KICAgKgogICAqIEluIGNhc2VzIHdoZXJlIG5laXRoZXIgaW1tdXRhYmxlIHBhdHRlcm5zIG5vciB0aGUgZGF0YSBtdXRhdGlvbiBBUEkgY2FuIGJlCiAgICogdXNlZCwgYXBwbHlpbmcgdGhpcyBtaXhpbiB3aWxsIGFsbG93IFBvbHltZXIgdG8gc2tpcCBkaXJ0eSBjaGVja2luZyBmb3IKICAgKiBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLiAgVGhpcyBhbGxvd3MgYQogICAqIHVzZXIgdG8gbWFrZSBhIGRlZXAgbW9kaWZpY2F0aW9uIHRvIGEgYm91bmQgb2JqZWN0IGdyYXBoLCBhbmQgdGhlbiBlaXRoZXIKICAgKiBzaW1wbHkgcmUtc2V0IHRoZSBvYmplY3QgKGUuZy4gYHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zYCkgb3IgY2FsbCBgbm90aWZ5UGF0aGAKICAgKiAoZS5nLiBgdGhpcy5ub3RpZnlQYXRoKCdpdGVtcycpYCkgdG8gdXBkYXRlIHRoZSB0cmVlLiAgTm90ZSB0aGF0IGFsbAogICAqIGVsZW1lbnRzIHRoYXQgd2lzaCB0byBiZSB1cGRhdGVkIGJhc2VkIG9uIGRlZXAgbXV0YXRpb25zIG11c3QgYXBwbHkgdGhpcwogICAqIG1peGluIG9yIG90aGVyd2lzZSBza2lwIHN0cmljdCBkaXJ0eSBjaGVja2luZyBmb3Igb2JqZWN0cy9hcnJheXMuCiAgICogU3BlY2lmaWNhbGx5LCBhbnkgZWxlbWVudHMgaW4gdGhlIGJpbmRpbmcgdHJlZSBiZXR3ZWVuIHRoZSBzb3VyY2Ugb2YgYQogICAqIG11dGF0aW9uIGFuZCB0aGUgY29uc3VtcHRpb24gb2YgaXQgbXVzdCBlbmFibGUgdGhpcyBiZWhhdmlvciBvciBhcHBseSB0aGUKICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JgLgogICAqCiAgICogV2hpbGUgdGhpcyBiZWhhdmlvciBhZGRzIHRoZSBhYmlsaXR5IHRvIGZvcmdvIE9iamVjdC9BcnJheSBkaXJ0eSBjaGVja2luZywKICAgKiB0aGUgYG11dGFibGVEYXRhYCBmbGFnIGRlZmF1bHRzIHRvIGZhbHNlIGFuZCBtdXN0IGJlIHNldCBvbiB0aGUgaW5zdGFuY2UuCiAgICoKICAgKiBOb3RlLCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mIHByb3BhZ2F0aW5nIGxhcmdlIG9iamVjdCBncmFwaHMKICAgKiB3aWxsIGJlIHdvcnNlIGJ5IHJlbHlpbmcgb24gYG11dGFibGVEYXRhOiB0cnVlYCBhcyBvcHBvc2VkIHRvIHVzaW5nCiAgICogc3RyaWN0IGRpcnR5IGNoZWNraW5nIHdpdGggaW1tdXRhYmxlIHBhdHRlcm5zIG9yIFBvbHltZXIncyBwYXRoIG5vdGlmaWNhdGlvbgogICAqIEFQSS4KICAgKgogICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgKiBAbWVtYmVyb2YgUG9seW1lcgogICAqIEBzdW1tYXJ5IEJlaGF2aW9yIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kCiAgICogICBhcnJheXMKICAgKi8KICBQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvciA9IHsKCiAgICBwcm9wZXJ0aWVzOiB7CiAgICAgIC8qKgogICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICogZm9yIHRoaXMgZWxlbWVudC4gIFdoZW4gdHJ1ZSwgT2JqZWN0cyBhbmQgQXJyYXlzIHdpbGwgc2tpcCBkaXJ0eQogICAgICAgKiBjaGVja2luZywgb3RoZXJ3aXNlIHN0cmljdCBlcXVhbGl0eSBjaGVja2luZyB3aWxsIGJlIHVzZWQuCiAgICAgICAqLwogICAgICBtdXRhYmxlRGF0YTogQm9vbGVhbgogICAgfSwKCiAgICAvKioKICAgICAqIE92ZXJyaWRlcyBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIHRvIHNraXAgc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nCiAgICAgKiBmb3IgT2JqZWN0cyBhbmQgQXJyYXlzLgogICAgICoKICAgICAqIFB1bGxzIHRoZSB2YWx1ZSB0byBkaXJ0eSBjaGVjayBhZ2FpbnN0IGZyb20gdGhlIGBfX2RhdGFUZW1wYCBjYWNoZQogICAgICogKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgKiBzaWRlLWVmZmVjdHMgb2YgZGVlcCBvYmplY3QgY2hhbmdlcyB0byBiZSBwcm9jZXNzZWQgYnkgcmUtc2V0dGluZyB0aGUKICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAqIEBwYXJhbSB7Kn0gb2xkIFByZXZpb3VzIHByb3BlcnR5IHZhbHVlCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICogQHRoaXMge3RoaXN9CiAgICAgKiBAcHJvdGVjdGVkCiAgICAgKi8KICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICByZXR1cm4gbXV0YWJsZVByb3BlcnR5Q2hhbmdlKHRoaXMsIHByb3BlcnR5LCB2YWx1ZSwgb2xkLCB0aGlzLm11dGFibGVEYXRhKTsKICAgIH0KICB9OwoKfSkoKTsKCgoKICAvLyBiYwogIFBvbHltZXIuQmFzZSA9IFBvbHltZXIuTGVnYWN5RWxlbWVudE1peGluKEhUTUxFbGVtZW50KS5wcm90b3R5cGU7CgogIC8vIE5PVEU6IHRoaXMgaXMgaGVyZSBmb3IgbW9kdWxpemVyIHRvIGV4cG9ydCBgaHRtbGAgZm9yIHRoZSBtb2R1bGUgdmVyc2lvbiBvZiB0aGlzIGZpbGUKICBQb2x5bWVyLmh0bWwgPSBQb2x5bWVyLmh0bWw7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1mbGV4LWxheW91dC9pcm9uLWZsZXgtbGF5b3V0Lmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtiLnRleHRDb250ZW50PSJbaGlkZGVuXSB7IGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsgfSI7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChiKX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1hMTF5LWtleXMtYmVoYXZpb3IvaXJvbi1hMTF5LWtleXMtYmVoYXZpb3IuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBiKHcsQyl7dmFyIEc9IiI7aWYodylpZih3PXcudG9Mb3dlckNhc2UoKSwiICI9PT13fHxBLnRlc3QodykpRz0ic3BhY2UiO2Vsc2UgaWYoeS50ZXN0KHcpKUc9ImVzYyI7ZWxzZSBpZigxPT13Lmxlbmd0aCl7aWYoIUN8fHEudGVzdCh3KSlHPXd9ZWxzZSBHPXgudGVzdCh3KT93LnJlcGxhY2UoImFycm93IiwiIik6Im11bHRpcGx5Ij09dz8iKiI6dztyZXR1cm4gR31mdW5jdGlvbiBkKHcpe3ZhciBDPSIiO3cmJih3IGluIHA/Qz1wW3ddOnUudGVzdCh3KT8odz1wYXJzZUludCh3LnJlcGxhY2UoIlUrIiwiMHgiKSwxNiksQz1TdHJpbmcuZnJvbUNoYXJDb2RlKHcpLnRvTG93ZXJDYXNlKCkpOkM9dy50b0xvd2VyQ2FzZSgpKTtyZXR1cm4gQ31mdW5jdGlvbiBmKHcpe3ZhciBDPSIiO051bWJlcih3KSYmKEM9NjU8PXcmJjkwPj13P1N0cmluZy5mcm9tQ2hhckNvZGUoMzIrdyk6MTEyPD13JiYxMjM+PXc/ImYiKyh3LTExMisxKTo0ODw9dyYmNTc+PXc/ClN0cmluZyh3LTQ4KTo5Njw9dyYmMTA1Pj13P1N0cmluZyh3LTk2KTptW3ddKTtyZXR1cm4gQ31mdW5jdGlvbiBoKHcsQyl7cmV0dXJuIHcua2V5P2Iody5rZXksQyk6dy5kZXRhaWwmJncuZGV0YWlsLmtleT9iKHcuZGV0YWlsLmtleSxDKTpkKHcua2V5SWRlbnRpZmllcil8fGYody5rZXlDb2RlKXx8IiJ9ZnVuY3Rpb24gayh3LEMpe3JldHVybiBoKEMsdy5oYXNNb2RpZmllcnMpPT09dy5rZXkmJighdy5oYXNNb2RpZmllcnN8fCEhQy5zaGlmdEtleT09PSEhdy5zaGlmdEtleSYmISFDLmN0cmxLZXk9PT0hIXcuY3RybEtleSYmISFDLmFsdEtleT09PSEhdy5hbHRLZXkmJiEhQy5tZXRhS2V5PT09ISF3Lm1ldGFLZXkpfWZ1bmN0aW9uIHQodyl7cmV0dXJuIDE9PT13Lmxlbmd0aD97Y29tYm86dyxrZXk6dyxldmVudDoia2V5ZG93biJ9Oncuc3BsaXQoIisiKS5yZWR1Y2UoZnVuY3Rpb24oQyxHKXt2YXIgRD1HLnNwbGl0KCI6Iik7Rz1EWzBdO0Q9RFsxXTtHIGluIG4/KENbbltHXV09ITAsCkMuaGFzTW9kaWZpZXJzPSEwKTooQy5rZXk9RyxDLmV2ZW50PUR8fCJrZXlkb3duIik7cmV0dXJuIEN9LHtjb21ibzp3LnNwbGl0KCI6Iikuc2hpZnQoKX0pfWZ1bmN0aW9uIGwodyl7cmV0dXJuIHcudHJpbSgpLnNwbGl0KCIgIikubWFwKGZ1bmN0aW9uKEMpe3JldHVybiB0KEMpfSl9dmFyIHA9eyJVKzAwMDgiOiJiYWNrc3BhY2UiLCJVKzAwMDkiOiJ0YWIiLCJVKzAwMUIiOiJlc2MiLCJVKzAwMjAiOiJzcGFjZSIsIlUrMDA3RiI6ImRlbCJ9LG09ezg6ImJhY2tzcGFjZSIsOToidGFiIiwxMzoiZW50ZXIiLDI3OiJlc2MiLDMzOiJwYWdldXAiLDM0OiJwYWdlZG93biIsMzU6ImVuZCIsMzY6ImhvbWUiLDMyOiJzcGFjZSIsMzc6ImxlZnQiLDM4OiJ1cCIsMzk6InJpZ2h0Iiw0MDoiZG93biIsNDY6ImRlbCIsMTA2OiIqIn0sbj17c2hpZnQ6InNoaWZ0S2V5IixjdHJsOiJjdHJsS2V5IixhbHQ6ImFsdEtleSIsbWV0YToibWV0YUtleSJ9LHE9L1thLXowLTkqXS8sdT0vVVwrLyx4PS9eYXJyb3cvLApBPS9ec3BhY2UoYmFyKT8vLHk9L15lc2NhcGUkLztQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntrZXlFdmVudFRhcmdldDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319LHN0b3BLZXlib2FyZEV2ZW50UHJvcGFnYXRpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2JvdW5kS2V5SGFuZGxlcnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9pbXBlcmF0aXZlS2V5QmluZGluZ3M6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sb2JzZXJ2ZXJzOlsiX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoa2V5RXZlbnRUYXJnZXQsIF9ib3VuZEtleUhhbmRsZXJzKSJdLGtleUJpbmRpbmdzOnt9LHJlZ2lzdGVyZWQ6ZnVuY3Rpb24oKXt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9saXN0ZW5LZXlFdmVudExpc3RlbmVycygpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sCmFkZE93bktleUJpbmRpbmc6ZnVuY3Rpb24odyxDKXt0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3Nbd109Qzt0aGlzLl9wcmVwS2V5QmluZGluZ3MoKTt0aGlzLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzKCl9LHJlbW92ZU93bktleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzPXt9O3RoaXMuX3ByZXBLZXlCaW5kaW5ncygpO3RoaXMuX3Jlc2V0S2V5RXZlbnRMaXN0ZW5lcnMoKX0sa2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzOmZ1bmN0aW9uKHcsQyl7Qz1sKEMpO2Zvcih2YXIgRz0wO0c8Qy5sZW5ndGg7KytHKWlmKGsoQ1tHXSx3KSlyZXR1cm4hMDtyZXR1cm4hMX0sX2NvbGxlY3RLZXlCaW5kaW5nczpmdW5jdGlvbigpe3ZhciB3PXRoaXMuYmVoYXZpb3JzLm1hcChmdW5jdGlvbihDKXtyZXR1cm4gQy5rZXlCaW5kaW5nc30pOy0xPT09dy5pbmRleE9mKHRoaXMua2V5QmluZGluZ3MpJiZ3LnB1c2godGhpcy5rZXlCaW5kaW5ncyk7cmV0dXJuIHd9LApfcHJlcEtleUJpbmRpbmdzOmZ1bmN0aW9uKCl7dGhpcy5fa2V5QmluZGluZ3M9e307dGhpcy5fY29sbGVjdEtleUJpbmRpbmdzKCkuZm9yRWFjaChmdW5jdGlvbihHKXtmb3IodmFyIEQgaW4gRyl0aGlzLl9hZGRLZXlCaW5kaW5nKEQsR1tEXSl9LHRoaXMpO2Zvcih2YXIgdyBpbiB0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3MpdGhpcy5fYWRkS2V5QmluZGluZyh3LHRoaXMuX2ltcGVyYXRpdmVLZXlCaW5kaW5nc1t3XSk7Zm9yKHZhciBDIGluIHRoaXMuX2tleUJpbmRpbmdzKXRoaXMuX2tleUJpbmRpbmdzW0NdLnNvcnQoZnVuY3Rpb24oRyxEKXtHPUdbMF0uaGFzTW9kaWZpZXJzO3JldHVybiBHPT09RFswXS5oYXNNb2RpZmllcnM/MDpHPy0xOjF9KX0sX2FkZEtleUJpbmRpbmc6ZnVuY3Rpb24odyxDKXtsKHcpLmZvckVhY2goZnVuY3Rpb24oRyl7dGhpcy5fa2V5QmluZGluZ3NbRy5ldmVudF09dGhpcy5fa2V5QmluZGluZ3NbRy5ldmVudF18fFtdO3RoaXMuX2tleUJpbmRpbmdzW0cuZXZlbnRdLnB1c2goW0csCkNdKX0sdGhpcyl9LF9yZXNldEtleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdW5saXN0ZW5LZXlFdmVudExpc3RlbmVycygpO3RoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKX0sX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5rZXlFdmVudFRhcmdldCYmT2JqZWN0LmtleXModGhpcy5fa2V5QmluZGluZ3MpLmZvckVhY2goZnVuY3Rpb24odyl7dmFyIEM9dGhpcy5fb25LZXlCaW5kaW5nRXZlbnQuYmluZCh0aGlzLHRoaXMuX2tleUJpbmRpbmdzW3ddKTt0aGlzLl9ib3VuZEtleUhhbmRsZXJzLnB1c2goW3RoaXMua2V5RXZlbnRUYXJnZXQsdyxDXSk7dGhpcy5rZXlFdmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKHcsQyl9LHRoaXMpfSxfdW5saXN0ZW5LZXlFdmVudExpc3RlbmVyczpmdW5jdGlvbigpe2Zvcih2YXIgdyxDLEc7dGhpcy5fYm91bmRLZXlIYW5kbGVycy5sZW5ndGg7KXc9dGhpcy5fYm91bmRLZXlIYW5kbGVycy5wb3AoKSwKQz13WzBdLEc9d1sxXSx3PXdbMl0sQy5yZW1vdmVFdmVudExpc3RlbmVyKEcsdyl9LF9vbktleUJpbmRpbmdFdmVudDpmdW5jdGlvbih3LEMpe3RoaXMuc3RvcEtleWJvYXJkRXZlbnRQcm9wYWdhdGlvbiYmQy5zdG9wUHJvcGFnYXRpb24oKTtpZighQy5kZWZhdWx0UHJldmVudGVkKWZvcih2YXIgRz0wO0c8dy5sZW5ndGg7RysrKXt2YXIgRD13W0ddWzBdLEI9d1tHXVsxXTtpZihrKEQsQykmJih0aGlzLl90cmlnZ2VyS2V5SGFuZGxlcihELEIsQyksQy5kZWZhdWx0UHJldmVudGVkKSlicmVha319LF90cmlnZ2VyS2V5SGFuZGxlcjpmdW5jdGlvbih3LEMsRyl7dmFyIEQ9T2JqZWN0LmNyZWF0ZSh3KTtELmtleWJvYXJkRXZlbnQ9Rzt3PW5ldyBDdXN0b21FdmVudCh3LmV2ZW50LHtkZXRhaWw6RCxjYW5jZWxhYmxlOiEwfSk7dGhpc1tDXS5jYWxsKHRoaXMsdyk7dy5kZWZhdWx0UHJldmVudGVkJiZHLnByZXZlbnREZWZhdWx0KCl9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1iZWhhdmlvcnMvaXJvbi1jb250cm9sLXN0YXRlLmh0bWwuanMKUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlPXtwcm9wZXJ0aWVzOntmb2N1c2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9kaXNhYmxlZENoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX29sZFRhYkluZGV4Ont0eXBlOlN0cmluZ30sX2JvdW5kRm9jdXNCbHVySGFuZGxlcjp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb2N1c0JsdXJIYW5kbGVyLmJpbmQodGhpcyl9fSxfX2hhbmRsZUV2ZW50UmV0YXJnZXRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiF0aGlzLnNoYWRvd1Jvb3QmJiFQb2x5bWVyLkVsZW1lbnR9fX0sb2JzZXJ2ZXJzOlsiX2NoYW5nZWRDb250cm9sU3RhdGUoZm9jdXNlZCwgZGlzYWJsZWQpIl0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIiwKdGhpcy5fYm91bmRGb2N1c0JsdXJIYW5kbGVyLCEwKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuX2JvdW5kRm9jdXNCbHVySGFuZGxlciwhMCl9LF9mb2N1c0JsdXJIYW5kbGVyOmZ1bmN0aW9uKGIpe2lmKFBvbHltZXIuRWxlbWVudCl0aGlzLl9zZXRGb2N1c2VkKCJmb2N1cyI9PT1iLnR5cGUpO2Vsc2UgaWYoYi50YXJnZXQ9PT10aGlzKXRoaXMuX3NldEZvY3VzZWQoImZvY3VzIj09PWIudHlwZSk7ZWxzZSBpZih0aGlzLl9faGFuZGxlRXZlbnRSZXRhcmdldGluZyl7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChkKXx8dGhpcy5maXJlKGIudHlwZSx7c291cmNlRXZlbnQ6Yn0se25vZGU6dGhpcyxidWJibGVzOmIuYnViYmxlcyxjYW5jZWxhYmxlOmIuY2FuY2VsYWJsZX0pfX0sX2Rpc2FibGVkQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsYj8idHJ1ZSI6ImZhbHNlIik7CnRoaXMuc3R5bGUucG9pbnRlckV2ZW50cz1iPyJub25lIjoiIjtiPyh0aGlzLl9vbGRUYWJJbmRleD10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSx0aGlzLl9zZXRGb2N1c2VkKCExKSx0aGlzLnRhYkluZGV4PS0xLHRoaXMuYmx1cigpKTp2b2lkIDAhPT10aGlzLl9vbGRUYWJJbmRleCYmKG51bGw9PT10aGlzLl9vbGRUYWJJbmRleD90aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKTp0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLHRoaXMuX29sZFRhYkluZGV4KSl9LF9jaGFuZ2VkQ29udHJvbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCYmdGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCgpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1iZWhhdmlvcnMvaXJvbi1idXR0b24tc3RhdGUuaHRtbC5qcwpQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGw9e3Byb3BlcnRpZXM6e3ByZXNzZWQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCx2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9wcmVzc2VkQ2hhbmdlZCJ9LHRvZ2dsZXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHBvaW50ZXJEb3duOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAsdmFsdWU6ITF9LHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMH0sYXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtcHJlc3NlZCIsb2JzZXJ2ZXI6Il9hcmlhQWN0aXZlQXR0cmlidXRlQ2hhbmdlZCJ9fSxsaXN0ZW5lcnM6e2Rvd246Il9kb3duSGFuZGxlciIsdXA6Il91cEhhbmRsZXIiLHRhcDoiX3RhcEhhbmRsZXIifSwKb2JzZXJ2ZXJzOlsiX2ZvY3VzQ2hhbmdlZChmb2N1c2VkKSIsIl9hY3RpdmVDaGFuZ2VkKGFjdGl2ZSwgYXJpYUFjdGl2ZUF0dHJpYnV0ZSkiXSxrZXlCaW5kaW5nczp7ImVudGVyOmtleWRvd24iOiJfYXN5bmNDbGljayIsInNwYWNlOmtleWRvd24iOiJfc3BhY2VLZXlEb3duSGFuZGxlciIsInNwYWNlOmtleXVwIjoiX3NwYWNlS2V5VXBIYW5kbGVyIn0sX21vdXNlRXZlbnRSZTovXm1vdXNlLyxfdGFwSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMudG9nZ2xlcz90aGlzLl91c2VyQWN0aXZhdGUoIXRoaXMuYWN0aXZlKTp0aGlzLmFjdGl2ZT0hMX0sX2ZvY3VzQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9kZXRlY3RLZXlib2FyZEZvY3VzKGIpO2J8fHRoaXMuX3NldFByZXNzZWQoITEpfSxfZGV0ZWN0S2V5Ym9hcmRGb2N1czpmdW5jdGlvbihiKXt0aGlzLl9zZXRSZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKCF0aGlzLnBvaW50ZXJEb3duJiZiKX0sX3VzZXJBY3RpdmF0ZTpmdW5jdGlvbihiKXt0aGlzLmFjdGl2ZSE9PQpiJiYodGhpcy5hY3RpdmU9Yix0aGlzLmZpcmUoImNoYW5nZSIpKX0sX2Rvd25IYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0UG9pbnRlckRvd24oITApO3RoaXMuX3NldFByZXNzZWQoITApO3RoaXMuX3NldFJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQoITEpfSxfdXBIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fc2V0UG9pbnRlckRvd24oITEpO3RoaXMuX3NldFByZXNzZWQoITEpfSxfc3BhY2VLZXlEb3duSGFuZGxlcjpmdW5jdGlvbihiKXtiPWIuZGV0YWlsLmtleWJvYXJkRXZlbnQ7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChkKXx8KGIucHJldmVudERlZmF1bHQoKSxiLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLHRoaXMuX3NldFByZXNzZWQoITApKX0sX3NwYWNlS2V5VXBIYW5kbGVyOmZ1bmN0aW9uKGIpe2I9UG9seW1lci5kb20oYi5kZXRhaWwua2V5Ym9hcmRFdmVudCkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChiKXx8Cih0aGlzLnByZXNzZWQmJnRoaXMuX2FzeW5jQ2xpY2soKSx0aGlzLl9zZXRQcmVzc2VkKCExKSl9LF9hc3luY0NsaWNrOmZ1bmN0aW9uKCl7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuY2xpY2soKX0sMSl9LF9wcmVzc2VkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2NoYW5nZWRCdXR0b25TdGF0ZSgpfSxfYXJpYUFjdGl2ZUF0dHJpYnV0ZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXtkJiZkIT1iJiZ0aGlzLmhhc0F0dHJpYnV0ZShkKSYmdGhpcy5yZW1vdmVBdHRyaWJ1dGUoZCl9LF9hY3RpdmVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMudG9nZ2xlcz90aGlzLnNldEF0dHJpYnV0ZSh0aGlzLmFyaWFBY3RpdmVBdHRyaWJ1dGUsYj8idHJ1ZSI6ImZhbHNlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUodGhpcy5hcmlhQWN0aXZlQXR0cmlidXRlKTt0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NvbnRyb2xTdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmRpc2FibGVkP3RoaXMuX3NldFByZXNzZWQoITEpOgp0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NoYW5nZWRCdXR0b25TdGF0ZTpmdW5jdGlvbigpe3RoaXMuX2J1dHRvblN0YXRlQ2hhbmdlZCYmdGhpcy5fYnV0dG9uU3RhdGVDaGFuZ2VkKCl9fTtQb2x5bWVyLklyb25CdXR0b25TdGF0ZT1bUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25CdXR0b25TdGF0ZUltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXJpcHBsZS9wYXBlci1yaXBwbGUuaHRtbC5qcwooZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGgpe3RoaXMuZWxlbWVudD1oO3RoaXMud2lkdGg9dGhpcy5ib3VuZGluZ1JlY3Qud2lkdGg7dGhpcy5oZWlnaHQ9dGhpcy5ib3VuZGluZ1JlY3QuaGVpZ2h0O3RoaXMuc2l6ZT1NYXRoLm1heCh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX1mdW5jdGlvbiBkKGgpe3RoaXMuZWxlbWVudD1oO3RoaXMuY29sb3I9d2luZG93LmdldENvbXB1dGVkU3R5bGUoaCkuY29sb3I7dGhpcy53YXZlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMud2F2ZUNvbnRhaW5lcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLndhdmUuc3R5bGUuYmFja2dyb3VuZENvbG9yPXRoaXMuY29sb3I7dGhpcy53YXZlLmNsYXNzTGlzdC5hZGQoIndhdmUiKTt0aGlzLndhdmVDb250YWluZXIuY2xhc3NMaXN0LmFkZCgid2F2ZS1jb250YWluZXIiKTtQb2x5bWVyLmRvbSh0aGlzLndhdmVDb250YWluZXIpLmFwcGVuZENoaWxkKHRoaXMud2F2ZSk7dGhpcy5yZXNldEludGVyYWN0aW9uU3RhdGUoKX0KdmFyIGY9e2Rpc3RhbmNlOmZ1bmN0aW9uKGgsayx0LGwpe2gtPXQ7ay09bDtyZXR1cm4gTWF0aC5zcXJ0KGgqaCtrKmspfSxub3c6d2luZG93LnBlcmZvcm1hbmNlJiZ3aW5kb3cucGVyZm9ybWFuY2Uubm93P3dpbmRvdy5wZXJmb3JtYW5jZS5ub3cuYmluZCh3aW5kb3cucGVyZm9ybWFuY2UpOkRhdGUubm93fTtiLnByb3RvdHlwZT17Z2V0IGJvdW5kaW5nUmVjdCgpe3JldHVybiB0aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9LGZ1cnRoZXN0Q29ybmVyRGlzdGFuY2VGcm9tOmZ1bmN0aW9uKGgsayl7dmFyIHQ9Zi5kaXN0YW5jZShoLGssMCwwKSxsPWYuZGlzdGFuY2UoaCxrLHRoaXMud2lkdGgsMCkscD1mLmRpc3RhbmNlKGgsaywwLHRoaXMuaGVpZ2h0KTtoPWYuZGlzdGFuY2UoaCxrLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO3JldHVybiBNYXRoLm1heCh0LGwscCxoKX19O2QuTUFYX1JBRElVUz0zMDA7ZC5wcm90b3R5cGU9e2dldCByZWNlbnRlcnMoKXtyZXR1cm4gdGhpcy5lbGVtZW50LnJlY2VudGVyc30sCmdldCBjZW50ZXIoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmNlbnRlcn0sZ2V0IG1vdXNlRG93bkVsYXBzZWQoKXtpZighdGhpcy5tb3VzZURvd25TdGFydClyZXR1cm4gMDt2YXIgaD1mLm5vdygpLXRoaXMubW91c2VEb3duU3RhcnQ7dGhpcy5tb3VzZVVwU3RhcnQmJihoLT10aGlzLm1vdXNlVXBFbGFwc2VkKTtyZXR1cm4gaH0sZ2V0IG1vdXNlVXBFbGFwc2VkKCl7cmV0dXJuIHRoaXMubW91c2VVcFN0YXJ0P2Yubm93KCktdGhpcy5tb3VzZVVwU3RhcnQ6MH0sZ2V0IG1vdXNlRG93bkVsYXBzZWRTZWNvbmRzKCl7cmV0dXJuIHRoaXMubW91c2VEb3duRWxhcHNlZC8xRTN9LGdldCBtb3VzZVVwRWxhcHNlZFNlY29uZHMoKXtyZXR1cm4gdGhpcy5tb3VzZVVwRWxhcHNlZC8xRTN9LGdldCBtb3VzZUludGVyYWN0aW9uU2Vjb25kcygpe3JldHVybiB0aGlzLm1vdXNlRG93bkVsYXBzZWRTZWNvbmRzK3RoaXMubW91c2VVcEVsYXBzZWRTZWNvbmRzfSxnZXQgaW5pdGlhbE9wYWNpdHkoKXtyZXR1cm4gdGhpcy5lbGVtZW50LmluaXRpYWxPcGFjaXR5fSwKZ2V0IG9wYWNpdHlEZWNheVZlbG9jaXR5KCl7cmV0dXJuIHRoaXMuZWxlbWVudC5vcGFjaXR5RGVjYXlWZWxvY2l0eX0sZ2V0IHJhZGl1cygpe3ZhciBoPTEuMSpNYXRoLm1pbihNYXRoLnNxcnQodGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoKnRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aCt0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0KnRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQpLGQuTUFYX1JBRElVUykrNTtyZXR1cm4gTWF0aC5hYnMoaCooMS1NYXRoLnBvdyg4MCwtKHRoaXMubW91c2VJbnRlcmFjdGlvblNlY29uZHMvKDEuMS1oL2QuTUFYX1JBRElVUyouMikpKSkpfSxnZXQgb3BhY2l0eSgpe3JldHVybiB0aGlzLm1vdXNlVXBTdGFydD9NYXRoLm1heCgwLHRoaXMuaW5pdGlhbE9wYWNpdHktdGhpcy5tb3VzZVVwRWxhcHNlZFNlY29uZHMqdGhpcy5vcGFjaXR5RGVjYXlWZWxvY2l0eSk6dGhpcy5pbml0aWFsT3BhY2l0eX0sZ2V0IG91dGVyT3BhY2l0eSgpe3JldHVybiBNYXRoLm1heCgwLApNYXRoLm1pbiguMyp0aGlzLm1vdXNlVXBFbGFwc2VkU2Vjb25kcyx0aGlzLm9wYWNpdHkpKX0sZ2V0IGlzT3BhY2l0eUZ1bGx5RGVjYXllZCgpe3JldHVybi4wMT50aGlzLm9wYWNpdHkmJnRoaXMucmFkaXVzPj1NYXRoLm1pbih0aGlzLm1heFJhZGl1cyxkLk1BWF9SQURJVVMpfSxnZXQgaXNSZXN0aW5nQXRNYXhSYWRpdXMoKXtyZXR1cm4gdGhpcy5vcGFjaXR5Pj10aGlzLmluaXRpYWxPcGFjaXR5JiZ0aGlzLnJhZGl1cz49TWF0aC5taW4odGhpcy5tYXhSYWRpdXMsZC5NQVhfUkFESVVTKX0sZ2V0IGlzQW5pbWF0aW9uQ29tcGxldGUoKXtyZXR1cm4gdGhpcy5tb3VzZVVwU3RhcnQ/dGhpcy5pc09wYWNpdHlGdWxseURlY2F5ZWQ6dGhpcy5pc1Jlc3RpbmdBdE1heFJhZGl1c30sZ2V0IHRyYW5zbGF0aW9uRnJhY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4oMSx0aGlzLnJhZGl1cy90aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSoyL01hdGguc3FydCgyKSl9LGdldCB4Tm93KCl7cmV0dXJuIHRoaXMueEVuZD8KdGhpcy54U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnhFbmQtdGhpcy54U3RhcnQpOnRoaXMueFN0YXJ0fSxnZXQgeU5vdygpe3JldHVybiB0aGlzLnlFbmQ/dGhpcy55U3RhcnQrdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uKih0aGlzLnlFbmQtdGhpcy55U3RhcnQpOnRoaXMueVN0YXJ0fSxnZXQgaXNNb3VzZURvd24oKXtyZXR1cm4gdGhpcy5tb3VzZURvd25TdGFydCYmIXRoaXMubW91c2VVcFN0YXJ0fSxyZXNldEludGVyYWN0aW9uU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLnNsaWRlRGlzdGFuY2U9dGhpcy55RW5kPXRoaXMueEVuZD10aGlzLnlTdGFydD10aGlzLnhTdGFydD10aGlzLm1vdXNlVXBTdGFydD10aGlzLm1vdXNlRG93blN0YXJ0PXRoaXMubWF4UmFkaXVzPTA7dGhpcy5jb250YWluZXJNZXRyaWNzPW5ldyBiKHRoaXMuZWxlbWVudCl9LGRyYXc6ZnVuY3Rpb24oKXt0aGlzLndhdmUuc3R5bGUub3BhY2l0eT10aGlzLm9wYWNpdHk7dmFyIGg9dGhpcy5yYWRpdXMvCih0aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZS8yKTt2YXIgaz10aGlzLnhOb3ctdGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoLzI7dmFyIHQ9dGhpcy55Tm93LXRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQvMjt0aGlzLndhdmVDb250YWluZXIuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJ0cmFuc2xhdGUoIitrKyJweCwgIit0KyJweCkiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS50cmFuc2Zvcm09InRyYW5zbGF0ZTNkKCIraysicHgsICIrdCsicHgsIDApIjt0aGlzLndhdmUuc3R5bGUud2Via2l0VHJhbnNmb3JtPSJzY2FsZSgiK2grIiwiK2grIikiO3RoaXMud2F2ZS5zdHlsZS50cmFuc2Zvcm09InNjYWxlM2QoIitoKyIsIitoKyIsMSkifSxkb3duQWN0aW9uOmZ1bmN0aW9uKGgpe3ZhciBrPXRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC8yLHQ9dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yO3RoaXMucmVzZXRJbnRlcmFjdGlvblN0YXRlKCk7dGhpcy5tb3VzZURvd25TdGFydD0KZi5ub3coKTt0aGlzLmNlbnRlcj8odGhpcy54U3RhcnQ9ayx0aGlzLnlTdGFydD10LHRoaXMuc2xpZGVEaXN0YW5jZT1mLmRpc3RhbmNlKHRoaXMueFN0YXJ0LHRoaXMueVN0YXJ0LHRoaXMueEVuZCx0aGlzLnlFbmQpKToodGhpcy54U3RhcnQ9aD9oLmRldGFpbC54LXRoaXMuY29udGFpbmVyTWV0cmljcy5ib3VuZGluZ1JlY3QubGVmdDp0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgvMix0aGlzLnlTdGFydD1oP2guZGV0YWlsLnktdGhpcy5jb250YWluZXJNZXRyaWNzLmJvdW5kaW5nUmVjdC50b3A6dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yKTt0aGlzLnJlY2VudGVycyYmKHRoaXMueEVuZD1rLHRoaXMueUVuZD10LHRoaXMuc2xpZGVEaXN0YW5jZT1mLmRpc3RhbmNlKHRoaXMueFN0YXJ0LHRoaXMueVN0YXJ0LHRoaXMueEVuZCx0aGlzLnlFbmQpKTt0aGlzLm1heFJhZGl1cz10aGlzLmNvbnRhaW5lck1ldHJpY3MuZnVydGhlc3RDb3JuZXJEaXN0YW5jZUZyb20odGhpcy54U3RhcnQsCnRoaXMueVN0YXJ0KTt0aGlzLndhdmVDb250YWluZXIuc3R5bGUudG9wPSh0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0LXRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplKS8yKyJweCI7dGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLmxlZnQ9KHRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSkvMisicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS53aWR0aD10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSsicHgiO3RoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUrInB4In0sdXBBY3Rpb246ZnVuY3Rpb24oKXt0aGlzLmlzTW91c2VEb3duJiYodGhpcy5tb3VzZVVwU3RhcnQ9Zi5ub3coKSl9LHJlbW92ZTpmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMud2F2ZUNvbnRhaW5lci5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZCh0aGlzLndhdmVDb250YWluZXIpfX07UG9seW1lcih7aXM6InBhcGVyLXJpcHBsZSIsCmJlaGF2aW9yczpbUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcl0scHJvcGVydGllczp7aW5pdGlhbE9wYWNpdHk6e3R5cGU6TnVtYmVyLHZhbHVlOi4yNX0sb3BhY2l0eURlY2F5VmVsb2NpdHk6e3R5cGU6TnVtYmVyLHZhbHVlOi44fSxyZWNlbnRlcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2VudGVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHJpcHBsZXM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LGFuaW1hdGluZzp7dHlwZTpCb29sZWFuLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX0saG9sZERvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2hvbGREb3duQ2hhbmdlZCJ9LG5vaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9hbmltYXRpbmc6e3R5cGU6Qm9vbGVhbn0sX2JvdW5kQW5pbWF0ZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFuaW1hdGUuYmluZCh0aGlzKX19fSwKZ2V0IHRhcmdldCgpe3JldHVybiB0aGlzLmtleUV2ZW50VGFyZ2V0fSxrZXlCaW5kaW5nczp7ImVudGVyOmtleWRvd24iOiJfb25FbnRlcktleWRvd24iLCJzcGFjZTprZXlkb3duIjoiX29uU3BhY2VLZXlkb3duIiwic3BhY2U6a2V5dXAiOiJfb25TcGFjZUtleXVwIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt2YXIgaD10aGlzLmtleUV2ZW50VGFyZ2V0PTExPT10aGlzLnBhcmVudE5vZGUubm9kZVR5cGU/UG9seW1lci5kb20odGhpcykuZ2V0T3duZXJSb290KCkuaG9zdDp0aGlzLnBhcmVudE5vZGU7dGhpcy5saXN0ZW4oaCwidXAiLCJ1aVVwQWN0aW9uIik7dGhpcy5saXN0ZW4oaCwiZG93biIsInVpRG93bkFjdGlvbiIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5rZXlFdmVudFRhcmdldCwidXAiLCJ1aVVwQWN0aW9uIik7dGhpcy51bmxpc3Rlbih0aGlzLmtleUV2ZW50VGFyZ2V0LCJkb3duIiwidWlEb3duQWN0aW9uIik7dGhpcy5rZXlFdmVudFRhcmdldD0KbnVsbH0sZ2V0IHNob3VsZEtlZXBBbmltYXRpbmcoKXtmb3IodmFyIGg9MDtoPHRoaXMucmlwcGxlcy5sZW5ndGg7KytoKWlmKCF0aGlzLnJpcHBsZXNbaF0uaXNBbmltYXRpb25Db21wbGV0ZSlyZXR1cm4hMDtyZXR1cm4hMX0sc2ltdWxhdGVkUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5kb3duQWN0aW9uKG51bGwpO3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLnVwQWN0aW9uKCl9LDEpfSx1aURvd25BY3Rpb246ZnVuY3Rpb24oaCl7dGhpcy5ub2lua3x8dGhpcy5kb3duQWN0aW9uKGgpfSxkb3duQWN0aW9uOmZ1bmN0aW9uKGgpe3RoaXMuaG9sZERvd24mJjA8dGhpcy5yaXBwbGVzLmxlbmd0aHx8KHRoaXMuYWRkUmlwcGxlKCkuZG93bkFjdGlvbihoKSx0aGlzLl9hbmltYXRpbmd8fCh0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpKX0sdWlVcEFjdGlvbjpmdW5jdGlvbihoKXt0aGlzLm5vaW5rfHx0aGlzLnVwQWN0aW9uKGgpfSx1cEFjdGlvbjpmdW5jdGlvbihoKXt0aGlzLmhvbGREb3dufHwKKHRoaXMucmlwcGxlcy5mb3JFYWNoKGZ1bmN0aW9uKGspe2sudXBBY3Rpb24oaCl9KSx0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpfSxvbkFuaW1hdGlvbkNvbXBsZXRlOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW5nPSExO3RoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRDb2xvcj1udWxsO3RoaXMuZmlyZSgidHJhbnNpdGlvbmVuZCIpfSxhZGRSaXBwbGU6ZnVuY3Rpb24oKXt2YXIgaD1uZXcgZCh0aGlzKTtQb2x5bWVyLmRvbSh0aGlzLiQud2F2ZXMpLmFwcGVuZENoaWxkKGgud2F2ZUNvbnRhaW5lcik7dGhpcy4kLmJhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZENvbG9yPWguY29sb3I7dGhpcy5yaXBwbGVzLnB1c2goaCk7dGhpcy5fc2V0QW5pbWF0aW5nKCEwKTtyZXR1cm4gaH0scmVtb3ZlUmlwcGxlOmZ1bmN0aW9uKGgpe3ZhciBrPXRoaXMucmlwcGxlcy5pbmRleE9mKGgpOzA+a3x8KHRoaXMucmlwcGxlcy5zcGxpY2UoaywxKSxoLnJlbW92ZSgpLAp0aGlzLnJpcHBsZXMubGVuZ3RofHx0aGlzLl9zZXRBbmltYXRpbmcoITEpKX0sYW5pbWF0ZTpmdW5jdGlvbigpe2lmKHRoaXMuX2FuaW1hdGluZyl7dmFyIGg7Zm9yKGg9MDtoPHRoaXMucmlwcGxlcy5sZW5ndGg7KytoKXt2YXIgaz10aGlzLnJpcHBsZXNbaF07ay5kcmF3KCk7dGhpcy4kLmJhY2tncm91bmQuc3R5bGUub3BhY2l0eT1rLm91dGVyT3BhY2l0eTtrLmlzT3BhY2l0eUZ1bGx5RGVjYXllZCYmIWsuaXNSZXN0aW5nQXRNYXhSYWRpdXMmJnRoaXMucmVtb3ZlUmlwcGxlKGspfWlmKHRoaXMuc2hvdWxkS2VlcEFuaW1hdGluZ3x8MCE9PXRoaXMucmlwcGxlcy5sZW5ndGgpd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9ib3VuZEFuaW1hdGUpO2Vsc2UgdGhpcy5vbkFuaW1hdGlvbkNvbXBsZXRlKCl9fSxfb25FbnRlcktleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpO3RoaXMuYXN5bmModGhpcy51aVVwQWN0aW9uLDEpfSxfb25TcGFjZUtleWRvd246ZnVuY3Rpb24oKXt0aGlzLnVpRG93bkFjdGlvbigpfSwKX29uU3BhY2VLZXl1cDpmdW5jdGlvbigpe3RoaXMudWlVcEFjdGlvbigpfSxfaG9sZERvd25DaGFuZ2VkOmZ1bmN0aW9uKGgsayl7dm9pZCAwIT09ayYmKGg/dGhpcy5kb3duQWN0aW9uKCk6dGhpcy51cEFjdGlvbigpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYmVoYXZpb3JzL3BhcGVyLXJpcHBsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvcj17cHJvcGVydGllczp7bm9pbms6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX25vaW5rQ2hhbmdlZCJ9LF9yaXBwbGVDb250YWluZXI6e3R5cGU6T2JqZWN0fX0sX2J1dHRvblN0YXRlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZm9jdXNlZCYmdGhpcy5lbnN1cmVSaXBwbGUoKX0sX2Rvd25IYW5kbGVyOmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlSW1wbC5fZG93bkhhbmRsZXIuY2FsbCh0aGlzLGIpO3RoaXMucHJlc3NlZCYmdGhpcy5lbnN1cmVSaXBwbGUoYil9LGVuc3VyZVJpcHBsZTpmdW5jdGlvbihiKXtpZighdGhpcy5oYXNSaXBwbGUoKSl7dGhpcy5fcmlwcGxlPXRoaXMuX2NyZWF0ZVJpcHBsZSgpO3RoaXMuX3JpcHBsZS5ub2luaz10aGlzLm5vaW5rO3ZhciBkPXRoaXMuX3JpcHBsZUNvbnRhaW5lcnx8dGhpcy5yb290O2QmJlBvbHltZXIuZG9tKGQpLmFwcGVuZENoaWxkKHRoaXMuX3JpcHBsZSk7aWYoYil7ZD0KUG9seW1lci5kb20odGhpcy5fcmlwcGxlQ29udGFpbmVyfHx0aGlzKTt2YXIgZj1Qb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0O2QuZGVlcENvbnRhaW5zKGYpJiZ0aGlzLl9yaXBwbGUudWlEb3duQWN0aW9uKGIpfX19LGdldFJpcHBsZTpmdW5jdGlvbigpe3RoaXMuZW5zdXJlUmlwcGxlKCk7cmV0dXJuIHRoaXMuX3JpcHBsZX0saGFzUmlwcGxlOmZ1bmN0aW9uKCl7cmV0dXJuISF0aGlzLl9yaXBwbGV9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItcmlwcGxlIil9LF9ub2lua0NoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuX3JpcHBsZS5ub2luaz1iKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWJlaGF2aW9ycy9wYXBlci1idXR0b24tYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVyQnV0dG9uQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntlbGV2YXRpb246e3R5cGU6TnVtYmVyLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxyZWFkT25seTohMH19LG9ic2VydmVyczpbIl9jYWxjdWxhdGVFbGV2YXRpb24oZm9jdXNlZCwgZGlzYWJsZWQsIGFjdGl2ZSwgcHJlc3NlZCwgcmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiLCJfY29tcHV0ZUtleWJvYXJkQ2xhc3MocmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiXSxob3N0QXR0cmlidXRlczp7cm9sZToiYnV0dG9uIix0YWJpbmRleDoiMCIsYW5pbWF0ZWQ6ITB9LF9jYWxjdWxhdGVFbGV2YXRpb246ZnVuY3Rpb24oKXt2YXIgYj0xO3RoaXMuZGlzYWJsZWQ/Yj0wOnRoaXMuYWN0aXZlfHx0aGlzLnByZXNzZWQ/Yj00OnRoaXMucmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCYmKGI9Myk7dGhpcy5fc2V0RWxldmF0aW9uKGIpfSxfY29tcHV0ZUtleWJvYXJkQ2xhc3M6ZnVuY3Rpb24oYil7dGhpcy50b2dnbGVDbGFzcygia2V5Ym9hcmQtZm9jdXMiLApiKX0sX3NwYWNlS2V5RG93bkhhbmRsZXI6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uQnV0dG9uU3RhdGVJbXBsLl9zcGFjZUtleURvd25IYW5kbGVyLmNhbGwodGhpcyxiKTt0aGlzLmhhc1JpcHBsZSgpJiYxPnRoaXMuZ2V0UmlwcGxlKCkucmlwcGxlcy5sZW5ndGgmJnRoaXMuX3JpcHBsZS51aURvd25BY3Rpb24oKX0sX3NwYWNlS2V5VXBIYW5kbGVyOmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlSW1wbC5fc3BhY2VLZXlVcEhhbmRsZXIuY2FsbCh0aGlzLGIpO3RoaXMuaGFzUmlwcGxlKCkmJnRoaXMuX3JpcHBsZS51aVVwQWN0aW9uKCl9fTtQb2x5bWVyLlBhcGVyQnV0dG9uQmVoYXZpb3I9W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IsUG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYnV0dG9uL3BhcGVyLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1idXR0b24iLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckJ1dHRvbkJlaGF2aW9yXSxwcm9wZXJ0aWVzOntyYWlzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jYWxjdWxhdGVFbGV2YXRpb24ifX0sX2NhbGN1bGF0ZUVsZXZhdGlvbjpmdW5jdGlvbigpe3RoaXMucmFpc2VkP1BvbHltZXIuUGFwZXJCdXR0b25CZWhhdmlvckltcGwuX2NhbGN1bGF0ZUVsZXZhdGlvbi5hcHBseSh0aGlzKTp0aGlzLl9zZXRFbGV2YXRpb24oMCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1tZXRhL2lyb24tbWV0YS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbk1ldGE9ZnVuY3Rpb24oZCl7UG9seW1lci5Jcm9uTWV0YVsiICJdKGQpO3RoaXMudHlwZT1kJiZkLnR5cGV8fCJkZWZhdWx0Ijt0aGlzLmtleT1kJiZkLmtleTtkJiYidmFsdWUiaW4gZCYmKHRoaXMudmFsdWU9ZC52YWx1ZSl9O1BvbHltZXIuSXJvbk1ldGFbIiAiXT1mdW5jdGlvbigpe307UG9seW1lci5Jcm9uTWV0YS50eXBlcz17fTtQb2x5bWVyLklyb25NZXRhLnByb3RvdHlwZT17Z2V0IHZhbHVlKCl7dmFyIGQ9dGhpcy50eXBlLGY9dGhpcy5rZXk7aWYoZCYmZilyZXR1cm4gUG9seW1lci5Jcm9uTWV0YS50eXBlc1tkXSYmUG9seW1lci5Jcm9uTWV0YS50eXBlc1tkXVtmXX0sc2V0IHZhbHVlKGQpe3ZhciBmPXRoaXMudHlwZSxoPXRoaXMua2V5O2YmJmgmJihmPVBvbHltZXIuSXJvbk1ldGEudHlwZXNbZl09UG9seW1lci5Jcm9uTWV0YS50eXBlc1tmXXx8e30sbnVsbD09ZD9kZWxldGUgZltoXTpmW2hdPWQpfSxnZXQgbGlzdCgpe2lmKHRoaXMudHlwZSl7dmFyIGQ9ClBvbHltZXIuSXJvbk1ldGEudHlwZXNbdGhpcy50eXBlXTtyZXR1cm4gZD9PYmplY3Qua2V5cyhkKS5tYXAoZnVuY3Rpb24oZil7cmV0dXJuIGJbdGhpcy50eXBlXVtmXX0sdGhpcyk6W119fSxieUtleTpmdW5jdGlvbihkKXt0aGlzLmtleT1kO3JldHVybiB0aGlzLnZhbHVlfX07dmFyIGI9UG9seW1lci5Jcm9uTWV0YS50eXBlcztQb2x5bWVyKHtpczoiaXJvbi1tZXRhIixwcm9wZXJ0aWVzOnt0eXBlOnt0eXBlOlN0cmluZyx2YWx1ZToiZGVmYXVsdCJ9LGtleTp7dHlwZTpTdHJpbmd9LHZhbHVlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGY6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX3NlbGZDaGFuZ2VkIn0sX19tZXRhOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9fY29tcHV0ZU1ldGEodHlwZSwga2V5LCB2YWx1ZSkifX0saG9zdEF0dHJpYnV0ZXM6e2hpZGRlbjohMH0sX19jb21wdXRlTWV0YTpmdW5jdGlvbihkLGYsaCl7ZD1uZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZTpkLAprZXk6Zn0pO3ZvaWQgMCE9PWgmJmghPT1kLnZhbHVlP2QudmFsdWU9aDp0aGlzLnZhbHVlIT09ZC52YWx1ZSYmKHRoaXMudmFsdWU9ZC52YWx1ZSk7cmV0dXJuIGR9LGdldCBsaXN0KCl7cmV0dXJuIHRoaXMuX19tZXRhJiZ0aGlzLl9fbWV0YS5saXN0fSxfc2VsZkNoYW5nZWQ6ZnVuY3Rpb24oZCl7ZCYmKHRoaXMudmFsdWU9dGhpcyl9LGJ5S2V5OmZ1bmN0aW9uKGQpe3JldHVybihuZXcgUG9seW1lci5Jcm9uTWV0YSh7dHlwZTp0aGlzLnR5cGUsa2V5OmR9KSkudmFsdWV9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tdmFsaWRhdGFibGUtYmVoYXZpb3IvaXJvbi12YWxpZGF0YWJsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhPW51bGw7ClBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3I9e3Byb3BlcnRpZXM6e3ZhbGlkYXRvcjp7dHlwZTpTdHJpbmd9LGludmFsaWQ6e25vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfaW52YWxpZENoYW5nZWQifX0scmVnaXN0ZXJlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhPW5ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJ2YWxpZGF0b3IifSl9LF9pbnZhbGlkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuaW52YWxpZD90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIiwidHJ1ZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWludmFsaWQiKX0sZ2V0IF92YWxpZGF0b3IoKXtyZXR1cm4gUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvck1ldGEmJlBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhLmJ5S2V5KHRoaXMudmFsaWRhdG9yKX0saGFzVmFsaWRhdG9yOmZ1bmN0aW9uKCl7cmV0dXJuIG51bGwhPQp0aGlzLl92YWxpZGF0b3J9LHZhbGlkYXRlOmZ1bmN0aW9uKGIpe3RoaXMuaW52YWxpZD12b2lkIDA9PT1iJiZ2b2lkIDAhPT10aGlzLnZhbHVlPyF0aGlzLl9nZXRWYWxpZGl0eSh0aGlzLnZhbHVlKTohdGhpcy5fZ2V0VmFsaWRpdHkoYik7cmV0dXJuIXRoaXMuaW52YWxpZH0sX2dldFZhbGlkaXR5OmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLmhhc1ZhbGlkYXRvcigpP3RoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZShiKTohMH19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tZm9ybS1lbGVtZW50LWJlaGF2aW9yL2lyb24tZm9ybS1lbGVtZW50LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcj17cHJvcGVydGllczp7bmFtZTp7dHlwZTpTdHJpbmd9LHZhbHVlOntub3RpZnk6ITAsdHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9wYXJlbnRGb3JtOnt0eXBlOk9iamVjdH19LGF0dGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5FbGVtZW50fHx0aGlzLmZpcmUoImlyb24tZm9ybS1lbGVtZW50LXJlZ2lzdGVyIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7IVBvbHltZXIuRWxlbWVudCYmdGhpcy5fcGFyZW50Rm9ybSYmdGhpcy5fcGFyZW50Rm9ybS5maXJlKCJpcm9uLWZvcm0tZWxlbWVudC11bnJlZ2lzdGVyIix7dGFyZ2V0OnRoaXN9KX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tY2hlY2tlZC1lbGVtZW50LWJlaGF2aW9yL2lyb24tY2hlY2tlZC1lbGVtZW50LWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e2NoZWNrZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsbm90aWZ5OiEwLG9ic2VydmVyOiJfY2hlY2tlZENoYW5nZWQifSx0b2dnbGVzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSx2YWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9uIixvYnNlcnZlcjoiX3ZhbHVlQ2hhbmdlZCJ9fSxvYnNlcnZlcnM6WyJfcmVxdWlyZWRDaGFuZ2VkKHJlcXVpcmVkKSJdLGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNJcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcj0hMH0sX2dldFZhbGlkaXR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCF0aGlzLnJlcXVpcmVkfHx0aGlzLmNoZWNrZWR9LF9yZXF1aXJlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnJlcXVpcmVkP3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXJlcXVpcmVkIiwKInRydWUiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1yZXF1aXJlZCIpfSxfY2hlY2tlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZT10aGlzLmNoZWNrZWQ7dGhpcy5maXJlKCJpcm9uLWNoYW5nZSIpfSxfdmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKCl7aWYodm9pZCAwPT09dGhpcy52YWx1ZXx8bnVsbD09PXRoaXMudmFsdWUpdGhpcy52YWx1ZT0ib24ifX07UG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcj1bUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcixQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3JJbXBsXTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1iZWhhdmlvcnMvcGFwZXItaW5reS1mb2N1cy1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvckltcGw9e29ic2VydmVyczpbIl9mb2N1c2VkQ2hhbmdlZChyZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKSJdLF9mb2N1c2VkQ2hhbmdlZDpmdW5jdGlvbihiKXtiJiZ0aGlzLmVuc3VyZVJpcHBsZSgpO3RoaXMuaGFzUmlwcGxlKCkmJih0aGlzLl9yaXBwbGUuaG9sZERvd249Yil9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt2YXIgYj1Qb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IuX2NyZWF0ZVJpcHBsZSgpO2IuaWQ9ImluayI7Yi5zZXRBdHRyaWJ1dGUoImNlbnRlciIsIiIpO2IuY2xhc3NMaXN0LmFkZCgiY2lyY2xlIik7cmV0dXJuIGJ9fTtQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3I9W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IsUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItYmVoYXZpb3JzL3BhcGVyLWNoZWNrZWQtZWxlbWVudC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9ySW1wbD17X2NoZWNrZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGwuX2NoZWNrZWRDaGFuZ2VkLmNhbGwodGhpcyk7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuY2hlY2tlZD90aGlzLl9yaXBwbGUuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiIik6dGhpcy5fcmlwcGxlLnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpKX0sX2J1dHRvblN0YXRlQ2hhbmdlZDpmdW5jdGlvbigpe1BvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvci5fYnV0dG9uU3RhdGVDaGFuZ2VkLmNhbGwodGhpcyk7IXRoaXMuZGlzYWJsZWQmJnRoaXMuaXNBdHRhY2hlZCYmKHRoaXMuY2hlY2tlZD10aGlzLmFjdGl2ZSl9fTsKUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3I9W1BvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcixQb2x5bWVyLklyb25DaGVja2VkRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItY2hlY2tib3gvcGFwZXItY2hlY2tib3guaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItY2hlY2tib3giLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJjaGVja2JveCIsImFyaWEtY2hlY2tlZCI6ITEsdGFiaW5kZXg6MH0scHJvcGVydGllczp7YXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtY2hlY2tlZCJ9fSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLGZ1bmN0aW9uKCl7aWYoIi0xcHgiPT09dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSIpLnRyaW0oKSl7dmFyIGI9dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplIikudHJpbSgpLGQ9InB4IixmPWIubWF0Y2goL1tBLVphLXpdKyQvKTtudWxsIT09ZiYmKGQ9ZlswXSk7Yj1wYXJzZUZsb2F0KGIpOwpmPTgvMypiOyJweCI9PT1kJiYoZj1NYXRoLmZsb29yKGYpLGYlMiE9PWIlMiYmZisrKTt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUiOmYrZH0pfX0pfSxfY29tcHV0ZUNoZWNrYm94Q2xhc3M6ZnVuY3Rpb24oYixkKXt2YXIgZj0iIjtiJiYoZis9ImNoZWNrZWQgIik7ZCYmKGYrPSJpbnZhbGlkIik7cmV0dXJuIGZ9LF9jb21wdXRlQ2hlY2ttYXJrQ2xhc3M6ZnVuY3Rpb24oYil7cmV0dXJuIGI/IiI6ImhpZGRlbiJ9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLmNoZWNrYm94Q29udGFpbmVyO3JldHVybiBQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsLl9jcmVhdGVSaXBwbGUuY2FsbCh0aGlzKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWljb24vaXJvbi1pY29uLmh0bWwuanMKUG9seW1lcih7aXM6Imlyb24taWNvbiIscHJvcGVydGllczp7aWNvbjp7dHlwZTpTdHJpbmd9LHRoZW1lOnt0eXBlOlN0cmluZ30sc3JjOnt0eXBlOlN0cmluZ30sX21ldGE6e3ZhbHVlOlBvbHltZXIuQmFzZS5jcmVhdGUoImlyb24tbWV0YSIse3R5cGU6Imljb25zZXQifSl9fSxvYnNlcnZlcnM6WyJfdXBkYXRlSWNvbihfbWV0YSwgaXNBdHRhY2hlZCkiLCJfdXBkYXRlSWNvbih0aGVtZSwgaXNBdHRhY2hlZCkiLCJfc3JjQ2hhbmdlZChzcmMsIGlzQXR0YWNoZWQpIiwiX2ljb25DaGFuZ2VkKGljb24sIGlzQXR0YWNoZWQpIl0sX0RFRkFVTFRfSUNPTlNFVDoiaWNvbnMiLF9pY29uQ2hhbmdlZDpmdW5jdGlvbihiKXtiPShifHwiIikuc3BsaXQoIjoiKTt0aGlzLl9pY29uTmFtZT1iLnBvcCgpO3RoaXMuX2ljb25zZXROYW1lPWIucG9wKCl8fHRoaXMuX0RFRkFVTFRfSUNPTlNFVDt0aGlzLl91cGRhdGVJY29uKCl9LF9zcmNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWNvbigpfSwKX3VzZXNJY29uc2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaWNvbnx8IXRoaXMuc3JjfSxfdXBkYXRlSWNvbjpmdW5jdGlvbigpe3RoaXMuX3VzZXNJY29uc2V0KCk/KHRoaXMuX2ltZyYmdGhpcy5faW1nLnBhcmVudE5vZGUmJlBvbHltZXIuZG9tKHRoaXMucm9vdCkucmVtb3ZlQ2hpbGQodGhpcy5faW1nKSwiIj09PXRoaXMuX2ljb25OYW1lP3RoaXMuX2ljb25zZXQmJnRoaXMuX2ljb25zZXQucmVtb3ZlSWNvbih0aGlzKTp0aGlzLl9pY29uc2V0TmFtZSYmdGhpcy5fbWV0YSYmKCh0aGlzLl9pY29uc2V0PXRoaXMuX21ldGEuYnlLZXkodGhpcy5faWNvbnNldE5hbWUpKT8odGhpcy5faWNvbnNldC5hcHBseUljb24odGhpcyx0aGlzLl9pY29uTmFtZSx0aGlzLnRoZW1lKSx0aGlzLnVubGlzdGVuKHdpbmRvdywiaXJvbi1pY29uc2V0LWFkZGVkIiwiX3VwZGF0ZUljb24iKSk6dGhpcy5saXN0ZW4od2luZG93LCJpcm9uLWljb25zZXQtYWRkZWQiLCJfdXBkYXRlSWNvbiIpKSk6KHRoaXMuX2ljb25zZXQmJgp0aGlzLl9pY29uc2V0LnJlbW92ZUljb24odGhpcyksdGhpcy5faW1nfHwodGhpcy5faW1nPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImltZyIpLHRoaXMuX2ltZy5zdHlsZS53aWR0aD0iMTAwJSIsdGhpcy5faW1nLnN0eWxlLmhlaWdodD0iMTAwJSIsdGhpcy5faW1nLmRyYWdnYWJsZT0hMSksdGhpcy5faW1nLnNyYz10aGlzLnNyYyxQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLmFwcGVuZENoaWxkKHRoaXMuX2ltZykpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tYTExeS1hbm5vdW5jZXIvaXJvbi1hMTF5LWFubm91bmNlci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXI9ZnVuY3Rpb24oKXt9O1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXI9UG9seW1lcih7aXM6Imlyb24tYTExeS1hbm5vdW5jZXIiLHByb3BlcnRpZXM6e21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwb2xpdGUifSxfdGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7UG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZXx8KFBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2U9dGhpcyk7ZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJpcm9uLWFubm91bmNlIix0aGlzLl9vbklyb25Bbm5vdW5jZS5iaW5kKHRoaXMpKX0sYW5ub3VuY2U6ZnVuY3Rpb24oYil7dGhpcy5fdGV4dD0iIjt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fdGV4dD1ifSwxMDApfSxfb25Jcm9uQW5ub3VuY2U6ZnVuY3Rpb24oYil7Yi5kZXRhaWwmJmIuZGV0YWlsLnRleHQmJnRoaXMuYW5ub3VuY2UoYi5kZXRhaWwudGV4dCl9fSk7ClBvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2U9bnVsbDtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHk9ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlfHwoUG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLWExMXktYW5ub3VuY2VyIikpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoUG9seW1lci5Jcm9uQTExeUFubm91bmNlci5pbnN0YW5jZSl9fSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWlucHV0L2lyb24taW5wdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1pbnB1dCIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntiaW5kVmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSx2YWx1ZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlVmFsdWUoYmluZFZhbHVlKSJ9LGFsbG93ZWRQYXR0ZXJuOnt0eXBlOlN0cmluZ30sYXV0b1ZhbGlkYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pbnB1dEVsZW1lbnQ6T2JqZWN0fSxvYnNlcnZlcnM6WyJfYmluZFZhbHVlQ2hhbmdlZChiaW5kVmFsdWUsIF9pbnB1dEVsZW1lbnQpIl0sbGlzdGVuZXJzOntpbnB1dDoiX29uSW5wdXQiLGtleXByZXNzOiJfb25LZXlwcmVzcyJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHkoKTt0aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQ9IiI7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPSExfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPQpQb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXMoZnVuY3Rpb24oKXt0aGlzLl9pbml0U2xvdHRlZElucHV0KCl9LmJpbmQodGhpcykpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiYoUG9seW1lci5kb20odGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpLHRoaXMuX29ic2VydmVyPW51bGwpfSxnZXQgaW5wdXRFbGVtZW50KCl7cmV0dXJuIHRoaXMuX2lucHV0RWxlbWVudH0sX2luaXRTbG90dGVkSW5wdXQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dEVsZW1lbnQ9dGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpWzBdO3RoaXMuaW5wdXRFbGVtZW50JiZ0aGlzLmlucHV0RWxlbWVudC52YWx1ZSYmKHRoaXMuYmluZFZhbHVlPXRoaXMuaW5wdXRFbGVtZW50LnZhbHVlKTt0aGlzLmZpcmUoImlyb24taW5wdXQtcmVhZHkiKX0sZ2V0IF9wYXR0ZXJuUmVnRXhwKCl7aWYodGhpcy5hbGxvd2VkUGF0dGVybil2YXIgYj1uZXcgUmVnRXhwKHRoaXMuYWxsb3dlZFBhdHRlcm4pOwplbHNlIHN3aXRjaCh0aGlzLmlucHV0RWxlbWVudC50eXBlKXtjYXNlICJudW1iZXIiOmI9L1swLTkuLGUtXS99cmV0dXJuIGJ9LF9iaW5kVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7ZCYmKHZvaWQgMD09PWI/ZC52YWx1ZT1udWxsOmIhPT1kLnZhbHVlJiYodGhpcy5pbnB1dEVsZW1lbnQudmFsdWU9YiksdGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKSx0aGlzLmZpcmUoImJpbmQtdmFsdWUtY2hhbmdlZCIse3ZhbHVlOmJ9KSl9LF9vbklucHV0OmZ1bmN0aW9uKCl7IXRoaXMuYWxsb3dlZFBhdHRlcm58fHRoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZHx8dGhpcy5fY2hlY2tQYXR0ZXJuVmFsaWRpdHkoKXx8KHRoaXMuX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcigiSW52YWxpZCBzdHJpbmcgb2YgY2hhcmFjdGVycyBub3QgZW50ZXJlZC4iKSx0aGlzLmlucHV0RWxlbWVudC52YWx1ZT10aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQpO3RoaXMuYmluZFZhbHVlPXRoaXMuX3ByZXZpb3VzVmFsaWRJbnB1dD0KdGhpcy5pbnB1dEVsZW1lbnQudmFsdWU7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPSExfSxfaXNQcmludGFibGU6ZnVuY3Rpb24oYil7dmFyIGQ9MTk9PWIua2V5Q29kZXx8MjA9PWIua2V5Q29kZXx8NDU9PWIua2V5Q29kZXx8NDY9PWIua2V5Q29kZXx8MTQ0PT1iLmtleUNvZGV8fDE0NT09Yi5rZXlDb2RlfHwzMjxiLmtleUNvZGUmJjQxPmIua2V5Q29kZXx8MTExPGIua2V5Q29kZSYmMTI0PmIua2V5Q29kZTtyZXR1cm4hKDg9PWIua2V5Q29kZXx8OT09Yi5rZXlDb2RlfHwxMz09Yi5rZXlDb2RlfHwyNz09Yi5rZXlDb2RlKSYmISgwPT1iLmNoYXJDb2RlJiZkKX0sX29uS2V5cHJlc3M6ZnVuY3Rpb24oYil7aWYodGhpcy5hbGxvd2VkUGF0dGVybnx8Im51bWJlciI9PT10aGlzLmlucHV0RWxlbWVudC50eXBlKXt2YXIgZD10aGlzLl9wYXR0ZXJuUmVnRXhwO2lmKGQmJiEoYi5tZXRhS2V5fHxiLmN0cmxLZXl8fGIuYWx0S2V5KSl7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPQohMDt2YXIgZj1TdHJpbmcuZnJvbUNoYXJDb2RlKGIuY2hhckNvZGUpO3RoaXMuX2lzUHJpbnRhYmxlKGIpJiYhZC50ZXN0KGYpJiYoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcigiSW52YWxpZCBjaGFyYWN0ZXIgIitmKyIgbm90IGVudGVyZWQuIikpfX19LF9jaGVja1BhdHRlcm5WYWxpZGl0eTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX3BhdHRlcm5SZWdFeHA7aWYoIWIpcmV0dXJuITA7Zm9yKHZhciBkPTA7ZDx0aGlzLmlucHV0RWxlbWVudC52YWx1ZS5sZW5ndGg7ZCsrKWlmKCFiLnRlc3QodGhpcy5pbnB1dEVsZW1lbnQudmFsdWVbZF0pKXJldHVybiExO3JldHVybiEwfSx2YWxpZGF0ZTpmdW5jdGlvbigpe2lmKCF0aGlzLmlucHV0RWxlbWVudClyZXR1cm4gdGhpcy5pbnZhbGlkPSExLCEwO3ZhciBiPXRoaXMuaW5wdXRFbGVtZW50LmNoZWNrVmFsaWRpdHkoKTtiJiYodGhpcy5yZXF1aXJlZCYmIiI9PT10aGlzLmJpbmRWYWx1ZT9iPSExOgp0aGlzLmhhc1ZhbGlkYXRvcigpJiYoYj1Qb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLnZhbGlkYXRlLmNhbGwodGhpcyx0aGlzLmJpbmRWYWx1ZSkpKTt0aGlzLmludmFsaWQ9IWI7dGhpcy5maXJlKCJpcm9uLWlucHV0LXZhbGlkYXRlIik7cmV0dXJuIGJ9LF9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXI6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDpifSl9LF9jb21wdXRlVmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuIGJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXI9e307UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRMYWJlbElEPTE7UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRBZGRvbklEPTE7UG9seW1lci5QYXBlcklucHV0SGVscGVyLk5leHRJbnB1dElEPTE7ClBvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7bGFiZWw6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7bm90aWZ5OiEwLHR5cGU6U3RyaW5nfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbnZhbGlkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxhbGxvd2VkUGF0dGVybjp7dHlwZTpTdHJpbmd9LHR5cGU6e3R5cGU6U3RyaW5nfSxsaXN0Ont0eXBlOlN0cmluZ30scGF0dGVybjp7dHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGVycm9yTWVzc2FnZTp7dHlwZTpTdHJpbmd9LGNoYXJDb3VudGVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vTGFiZWxGbG9hdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx2YWxpZGF0b3I6e3R5cGU6U3RyaW5nfSxhdXRvY29tcGxldGU6e3R5cGU6U3RyaW5nLAp2YWx1ZToib2ZmIn0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9hdXRvZm9jdXNDaGFuZ2VkIn0saW5wdXRtb2RlOnt0eXBlOlN0cmluZ30sbWlubGVuZ3RoOnt0eXBlOk51bWJlcn0sbWF4bGVuZ3RoOnt0eXBlOk51bWJlcn0sbWluOnt0eXBlOlN0cmluZ30sbWF4Ont0eXBlOlN0cmluZ30sc3RlcDp7dHlwZTpTdHJpbmd9LG5hbWU6e3R5cGU6U3RyaW5nfSxwbGFjZWhvbGRlcjp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LHJlYWRvbmx5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNpemU6e3R5cGU6TnVtYmVyfSxhdXRvY2FwaXRhbGl6ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im5vbmUifSxhdXRvY29ycmVjdDp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZiJ9LGF1dG9zYXZlOnt0eXBlOlN0cmluZ30scmVzdWx0czp7dHlwZTpOdW1iZXJ9LGFjY2VwdDp7dHlwZTpTdHJpbmd9LG11bHRpcGxlOnt0eXBlOkJvb2xlYW59LF9hcmlhRGVzY3JpYmVkQnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSwKX2FyaWFMYWJlbGxlZEJ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2lucHV0SWQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sbGlzdGVuZXJzOnsiYWRkb24tYXR0YWNoZWQiOiJfb25BZGRvbkF0dGFjaGVkIn0sa2V5QmluZGluZ3M6eyJzaGlmdCt0YWI6a2V5ZG93biI6Il9vblNoaWZ0VGFiRG93biJ9LGhvc3RBdHRyaWJ1dGVzOnt0YWJpbmRleDowfSxnZXQgaW5wdXRFbGVtZW50KCl7dGhpcy4kfHwodGhpcy4kPXt9KTt0aGlzLiQuaW5wdXR8fCh0aGlzLl9nZW5lcmF0ZUlucHV0SWQoKSx0aGlzLiQuaW5wdXQ9dGhpcy4kJCgiIyIrdGhpcy5faW5wdXRJZCkpO3JldHVybiB0aGlzLiQuaW5wdXR9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudH0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX3R5cGVzVGhhdEhhdmVUZXh0PSJkYXRlIGRhdGV0aW1lIGRhdGV0aW1lLWxvY2FsIG1vbnRoIHRpbWUgd2VlayBmaWxlIi5zcGxpdCgiICIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCk7CiFQb2x5bWVyLkVsZW1lbnQmJnRoaXMuaW5wdXRFbGVtZW50JiYtMSE9PXRoaXMuX3R5cGVzVGhhdEhhdmVUZXh0LmluZGV4T2YodGhpcy5pbnB1dEVsZW1lbnQudHlwZSkmJih0aGlzLmFsd2F5c0Zsb2F0TGFiZWw9ITApfSxfYXBwZW5kU3RyaW5nV2l0aFNwYWNlOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/YisiICIrZDpkfSxfb25BZGRvbkF0dGFjaGVkOmZ1bmN0aW9uKGIpe2I9UG9seW1lci5kb20oYikucm9vdFRhcmdldDtpZihiLmlkKXRoaXMuX2FyaWFEZXNjcmliZWRCeT10aGlzLl9hcHBlbmRTdHJpbmdXaXRoU3BhY2UodGhpcy5fYXJpYURlc2NyaWJlZEJ5LGIuaWQpO2Vsc2V7dmFyIGQ9InBhcGVyLWlucHV0LWFkZC1vbi0iK1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0QWRkb25JRCsrO2IuaWQ9ZDt0aGlzLl9hcmlhRGVzY3JpYmVkQnk9dGhpcy5fYXBwZW5kU3RyaW5nV2l0aFNwYWNlKHRoaXMuX2FyaWFEZXNjcmliZWRCeSxkKX19LHZhbGlkYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50LnZhbGlkYXRlKCl9LApfZm9jdXNCbHVySGFuZGxlcjpmdW5jdGlvbihiKXtQb2x5bWVyLklyb25Db250cm9sU3RhdGUuX2ZvY3VzQmx1ckhhbmRsZXIuY2FsbCh0aGlzLGIpO3RoaXMuZm9jdXNlZCYmIXRoaXMuX3NoaWZ0VGFiUHJlc3NlZCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfSxfb25TaGlmdFRhYkRvd246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKTt0aGlzLl9zaGlmdFRhYlByZXNzZWQ9ITA7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixiKTt0aGlzLl9zaGlmdFRhYlByZXNzZWQ9ITF9LDEpfSxfaGFuZGxlQXV0b1ZhbGlkYXRlOmZ1bmN0aW9uKCl7dGhpcy5hdXRvVmFsaWRhdGUmJnRoaXMudmFsaWRhdGUoKX0sdXBkYXRlVmFsdWVBbmRQcmVzZXJ2ZUNhcmV0OmZ1bmN0aW9uKGIpe3RyeXt2YXIgZD0KdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7dGhpcy52YWx1ZT1iO3RoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0PWQ7dGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kPWR9Y2F0Y2goZil7dGhpcy52YWx1ZT1ifX0sX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGR8fGJ9LF91cGRhdGVBcmlhTGFiZWxsZWRCeTpmdW5jdGlvbigpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvcigibGFiZWwiKTtpZihiKXtpZihiLmlkKXZhciBkPWIuaWQ7ZWxzZSBkPSJwYXBlci1pbnB1dC1sYWJlbC0iK1BvbHltZXIuUGFwZXJJbnB1dEhlbHBlci5OZXh0TGFiZWxJRCsrLGIuaWQ9ZDt0aGlzLl9hcmlhTGFiZWxsZWRCeT1kfWVsc2UgdGhpcy5fYXJpYUxhYmVsbGVkQnk9IiJ9LF9nZW5lcmF0ZUlucHV0SWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dElkJiYiIiE9PXRoaXMuX2lucHV0SWR8fCh0aGlzLl9pbnB1dElkPQoiaW5wdXQtIitQb2x5bWVyLlBhcGVySW5wdXRIZWxwZXIuTmV4dElucHV0SUQrKyl9LF9vbkNoYW5nZTpmdW5jdGlvbihiKXt0aGlzLnNoYWRvd1Jvb3QmJnRoaXMuZmlyZShiLnR5cGUse3NvdXJjZUV2ZW50OmJ9LHtub2RlOnRoaXMsYnViYmxlczpiLmJ1YmJsZXMsY2FuY2VsYWJsZTpiLmNhbmNlbGFibGV9KX0sX2F1dG9mb2N1c0NoYW5nZWQ6ZnVuY3Rpb24oKXtpZih0aGlzLmF1dG9mb2N1cyYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCl7dmFyIGI9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtiIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJmIhPT1kb2N1bWVudC5ib2R5JiZiIT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx0aGlzLl9mb2N1c2FibGVFbGVtZW50LmZvY3VzKCl9fX07UG9seW1lci5QYXBlcklucHV0QmVoYXZpb3I9W1BvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtYWRkb24tYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLlBhcGVySW5wdXRBZGRvbkJlaGF2aW9yPXthdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiYWRkb24tYXR0YWNoZWQiKX0sdXBkYXRlOmZ1bmN0aW9uKCl7fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtY2hhci1jb3VudGVyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLWlucHV0LWNoYXItY291bnRlciIsYmVoYXZpb3JzOltQb2x5bWVyLlBhcGVySW5wdXRBZGRvbkJlaGF2aW9yXSxwcm9wZXJ0aWVzOntfY2hhckNvdW50ZXJTdHI6e3R5cGU6U3RyaW5nLHZhbHVlOiIwIn19LHVwZGF0ZTpmdW5jdGlvbihiKXtpZihiLmlucHV0RWxlbWVudCl7Yi52YWx1ZT1iLnZhbHVlfHwiIjt2YXIgZD1iLnZhbHVlLnRvU3RyaW5nKCkubGVuZ3RoLnRvU3RyaW5nKCk7Yi5pbnB1dEVsZW1lbnQuaGFzQXR0cmlidXRlKCJtYXhsZW5ndGgiKSYmKGQrPSIvIitiLmlucHV0RWxlbWVudC5nZXRBdHRyaWJ1dGUoIm1heGxlbmd0aCIpKTt0aGlzLl9jaGFyQ291bnRlclN0cj1kfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pbnB1dC9wYXBlci1pbnB1dC1jb250YWluZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQtY29udGFpbmVyIixwcm9wZXJ0aWVzOntub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWx3YXlzRmxvYXRMYWJlbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhdHRyRm9yVmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiJiaW5kLXZhbHVlIn0sYXV0b1ZhbGlkYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGludmFsaWQ6e29ic2VydmVyOiJfaW52YWxpZENoYW5nZWQiLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZm9jdXNlZDp7cmVhZE9ubHk6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sX2FkZG9uczp7dHlwZTpBcnJheX0sX2lucHV0SGFzQ29udGVudDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaW5wdXRTZWxlY3Rvcjp7dHlwZTpTdHJpbmcsdmFsdWU6ImlucHV0LGlyb24taW5wdXQsdGV4dGFyZWEsLnBhcGVyLWlucHV0LWlucHV0In0sX2JvdW5kT25Gb2N1czp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbkZvY3VzLmJpbmQodGhpcyl9fSwKX2JvdW5kT25CbHVyOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uQmx1ci5iaW5kKHRoaXMpfX0sX2JvdW5kT25JbnB1dDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbklucHV0LmJpbmQodGhpcyl9fSxfYm91bmRWYWx1ZUNoYW5nZWQ6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25WYWx1ZUNoYW5nZWQuYmluZCh0aGlzKX19fSxsaXN0ZW5lcnM6eyJhZGRvbi1hdHRhY2hlZCI6Il9vbkFkZG9uQXR0YWNoZWQiLCJpcm9uLWlucHV0LXZhbGlkYXRlIjoiX29uSXJvbklucHV0VmFsaWRhdGUifSxnZXQgX3ZhbHVlQ2hhbmdlZEV2ZW50KCl7cmV0dXJuIHRoaXMuYXR0ckZvclZhbHVlKyItY2hhbmdlZCJ9LGdldCBfcHJvcGVydHlGb3JWYWx1ZSgpe3JldHVybiBQb2x5bWVyLkNhc2VNYXAuZGFzaFRvQ2FtZWxDYXNlKHRoaXMuYXR0ckZvclZhbHVlKX0sZ2V0IF9pbnB1dEVsZW1lbnQoKXtyZXR1cm4gUG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3Rvcih0aGlzLl9pbnB1dFNlbGVjdG9yKX0sCmdldCBfaW5wdXRFbGVtZW50VmFsdWUoKXtyZXR1cm4gdGhpcy5faW5wdXRFbGVtZW50W3RoaXMuX3Byb3BlcnR5Rm9yVmFsdWVdfHx0aGlzLl9pbnB1dEVsZW1lbnQudmFsdWV9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZT0hMDt0aGlzLl9hZGRvbnN8fCh0aGlzLl9hZGRvbnM9W10pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2JvdW5kT25Gb2N1cywhMCk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9ib3VuZE9uQmx1ciwhMCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5hdHRyRm9yVmFsdWU/dGhpcy5faW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIodGhpcy5fdmFsdWVDaGFuZ2VkRXZlbnQsdGhpcy5fYm91bmRWYWx1ZUNoYW5nZWQpOnRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHRoaXMuX29uSW5wdXQpO3RoaXMuX2lucHV0RWxlbWVudFZhbHVlJiYiIiE9dGhpcy5faW5wdXRFbGVtZW50VmFsdWU/CnRoaXMuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHRoaXMuX2lucHV0RWxlbWVudCk6dGhpcy5faGFuZGxlVmFsdWUodGhpcy5faW5wdXRFbGVtZW50KX0sX29uQWRkb25BdHRhY2hlZDpmdW5jdGlvbihiKXt0aGlzLl9hZGRvbnN8fCh0aGlzLl9hZGRvbnM9W10pO2I9Yi50YXJnZXQ7LTE9PT10aGlzLl9hZGRvbnMuaW5kZXhPZihiKSYmKHRoaXMuX2FkZG9ucy5wdXNoKGIpLHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faGFuZGxlVmFsdWUodGhpcy5faW5wdXRFbGVtZW50KSl9LF9vbkZvY3VzOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Rm9jdXNlZCghMCl9LF9vbkJsdXI6ZnVuY3Rpb24oKXt0aGlzLl9zZXRGb2N1c2VkKCExKTt0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLl9pbnB1dEVsZW1lbnQpfSxfb25JbnB1dDpmdW5jdGlvbihiKXt0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZShiLnRhcmdldCl9LF9vblZhbHVlQ2hhbmdlZDpmdW5jdGlvbihiKXt2YXIgZD0KYi50YXJnZXQ7aWYodGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZSYmKHRoaXMuX19pc0ZpcnN0VmFsdWVVcGRhdGU9ITEsdm9pZCAwPT09ZC52YWx1ZXx8IiI9PT1kLnZhbHVlKSlyZXR1cm47dGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUoYi50YXJnZXQpfSxfaGFuZGxlVmFsdWU6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5faW5wdXRFbGVtZW50VmFsdWU7ZHx8MD09PWR8fCJudW1iZXIiPT09Yi50eXBlJiYhYi5jaGVja1ZhbGlkaXR5KCk/dGhpcy5faW5wdXRIYXNDb250ZW50PSEwOnRoaXMuX2lucHV0SGFzQ29udGVudD0hMTt0aGlzLnVwZGF0ZUFkZG9ucyh7aW5wdXRFbGVtZW50OmIsdmFsdWU6ZCxpbnZhbGlkOnRoaXMuaW52YWxpZH0pfSxfaGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGU6ZnVuY3Rpb24oYil7dGhpcy5hdXRvVmFsaWRhdGUmJmImJih0aGlzLmludmFsaWQ9IShiLnZhbGlkYXRlP2IudmFsaWRhdGUodGhpcy5faW5wdXRFbGVtZW50VmFsdWUpOmIuY2hlY2tWYWxpZGl0eSgpKSk7CnRoaXMuX2hhbmRsZVZhbHVlKGIpfSxfb25Jcm9uSW5wdXRWYWxpZGF0ZTpmdW5jdGlvbigpe3RoaXMuaW52YWxpZD10aGlzLl9pbnB1dEVsZW1lbnQuaW52YWxpZH0sX2ludmFsaWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fYWRkb25zJiZ0aGlzLnVwZGF0ZUFkZG9ucyh7aW52YWxpZDp0aGlzLmludmFsaWR9KX0sdXBkYXRlQWRkb25zOmZ1bmN0aW9uKGIpe2Zvcih2YXIgZCxmPTA7ZD10aGlzLl9hZGRvbnNbZl07ZisrKWQudXBkYXRlKGIpfSxfY29tcHV0ZUlucHV0Q29udGVudENsYXNzOmZ1bmN0aW9uKGIsZCxmLGgsayl7dmFyIHQ9ImlucHV0LWNvbnRlbnQiO2I/KGsmJih0Kz0iIGxhYmVsLWlzLWhpZGRlbiIpLGgmJih0Kz0iIGlzLWludmFsaWQiKSk6KGI9dGhpcy5xdWVyeVNlbGVjdG9yKCJsYWJlbCIpLGR8fGs/KHQrPSIgbGFiZWwtaXMtZmxvYXRpbmciLHRoaXMuJC5sYWJlbEFuZElucHV0Q29udGFpbmVyLnN0eWxlLnBvc2l0aW9uPSJzdGF0aWMiLGg/dCs9IiBpcy1pbnZhbGlkIjoKZiYmKHQrPSIgbGFiZWwtaXMtaGlnaGxpZ2h0ZWQiKSk6KGImJih0aGlzLiQubGFiZWxBbmRJbnB1dENvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxoJiYodCs9IiBpcy1pbnZhbGlkIikpKTtmJiYodCs9IiBmb2N1c2VkIik7cmV0dXJuIHR9LF9jb21wdXRlVW5kZXJsaW5lQ2xhc3M6ZnVuY3Rpb24oYixkKXt2YXIgZj0idW5kZXJsaW5lIjtkP2YrPSIgaXMtaW52YWxpZCI6YiYmKGYrPSIgaXMtaGlnaGxpZ2h0ZWQiKTtyZXR1cm4gZn0sX2NvbXB1dGVBZGRPbkNvbnRlbnRDbGFzczpmdW5jdGlvbihiLGQpe3ZhciBmPSJhZGQtb24tY29udGVudCI7ZD9mKz0iIGlzLWludmFsaWQiOmImJihmKz0iIGlzLWhpZ2hsaWdodGVkIik7cmV0dXJuIGZ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQtZXJyb3IuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQtZXJyb3IiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QWRkb25CZWhhdmlvcl0scHJvcGVydGllczp7aW52YWxpZDp7cmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbn19LHVwZGF0ZTpmdW5jdGlvbihiKXt0aGlzLl9zZXRJbnZhbGlkKGIuaW52YWxpZCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaW5wdXQvcGFwZXItaW5wdXQuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaW5wdXQiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlcklucHV0QmVoYXZpb3IsUG9seW1lci5Jcm9uRm9ybUVsZW1lbnRCZWhhdmlvcl0scHJvcGVydGllczp7dmFsdWU6e3R5cGU6U3RyaW5nfX0sYmVmb3JlUmVnaXN0ZXI6ZnVuY3Rpb24oKXt2YXIgYj0iZnVuY3Rpb24iPT10eXBlb2YgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaXJvbi1pbnB1dCIpLl9pbml0U2xvdHRlZElucHV0PyJ2MSI6InYwIixkPVBvbHltZXIuRG9tTW9kdWxlLmltcG9ydCgicGFwZXItaW5wdXQiLCJ0ZW1wbGF0ZSIpO2I9UG9seW1lci5Eb21Nb2R1bGUuaW1wb3J0KCJwYXBlci1pbnB1dCIsInRlbXBsYXRlIyIrYik7KGQ9ZC5jb250ZW50LnF1ZXJ5U2VsZWN0b3IoIiN0ZW1wbGF0ZS1wbGFjZWhvbGRlciIpKSYmZC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChiLmNvbnRlbnQsZCl9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiBQb2x5bWVyLkVsZW1lbnQ/dGhpcy5pbnB1dEVsZW1lbnQuX2lucHV0RWxlbWVudDoKdGhpcy5pbnB1dEVsZW1lbnR9LGxpc3RlbmVyczp7Imlyb24taW5wdXQtcmVhZHkiOiJfb25Jcm9uSW5wdXRSZWFkeSJ9LF9vbklyb25JbnB1dFJlYWR5OmZ1bmN0aW9uKCl7dGhpcy4kLm5hdGl2ZUlucHV0fHwodGhpcy4kLm5hdGl2ZUlucHV0PXRoaXMuJCQoImlucHV0IikpO3RoaXMuaW5wdXRFbGVtZW50JiYtMSE9PXRoaXMuX3R5cGVzVGhhdEhhdmVUZXh0LmluZGV4T2YodGhpcy4kLm5hdGl2ZUlucHV0LnR5cGUpJiYodGhpcy5hbHdheXNGbG9hdExhYmVsPSEwKTt0aGlzLmlucHV0RWxlbWVudC5iaW5kVmFsdWUmJnRoaXMuJC5jb250YWluZXIuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHRoaXMuaW5wdXRFbGVtZW50KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWZpdC1iZWhhdmlvci9pcm9uLWZpdC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbkZpdEJlaGF2aW9yPXtwcm9wZXJ0aWVzOntzaXppbmdUYXJnZXQ6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9fSxmaXRJbnRvOnt0eXBlOk9iamVjdCx2YWx1ZTp3aW5kb3d9LG5vT3ZlcmxhcDp7dHlwZTpCb29sZWFufSxwb3NpdGlvblRhcmdldDp7dHlwZTpFbGVtZW50fSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nfSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZ30sZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LGhvcml6b250YWxPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSx2ZXJ0aWNhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LGF1dG9GaXRPbkF0dGFjaDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfZml0SW5mbzp7dHlwZTpPYmplY3R9fSxnZXQgX2ZpdFdpZHRoKCl7cmV0dXJuIHRoaXMuZml0SW50bz09PXdpbmRvdz90aGlzLmZpdEludG8uaW5uZXJXaWR0aDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGh9LApnZXQgX2ZpdEhlaWdodCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/dGhpcy5maXRJbnRvLmlubmVySGVpZ2h0OnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHR9LGdldCBfZml0TGVmdCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/MDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0sZ2V0IF9maXRUb3AoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93PzA6dGhpcy5maXRJbnRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcH0sZ2V0IF9kZWZhdWx0UG9zaXRpb25UYXJnZXQoKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO2ImJmIubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJihiPWIuaG9zdCk7cmV0dXJuIGJ9LGdldCBfbG9jYWxlSG9yaXpvbnRhbEFsaWduKCl7aWYodGhpcy5faXNSVEwpe2lmKCJyaWdodCI9PT10aGlzLmhvcml6b250YWxBbGlnbilyZXR1cm4ibGVmdCI7CmlmKCJsZWZ0Ij09PXRoaXMuaG9yaXpvbnRhbEFsaWduKXJldHVybiJyaWdodCJ9cmV0dXJuIHRoaXMuaG9yaXpvbnRhbEFsaWdufSxnZXQgX19zaG91bGRQb3NpdGlvbigpe3JldHVybih0aGlzLmhvcml6b250YWxBbGlnbnx8dGhpcy52ZXJ0aWNhbEFsaWduKSYmdGhpcy5wb3NpdGlvblRhcmdldH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXsidW5kZWZpbmVkIj09PXR5cGVvZiB0aGlzLl9pc1JUTCYmKHRoaXMuX2lzUlRMPSJydGwiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXJlY3Rpb24pO3RoaXMucG9zaXRpb25UYXJnZXQ9dGhpcy5wb3NpdGlvblRhcmdldHx8dGhpcy5fZGVmYXVsdFBvc2l0aW9uVGFyZ2V0O3RoaXMuYXV0b0ZpdE9uQXR0YWNoJiYoIm5vbmUiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlzcGxheT9zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhpcy5maXQoKX0uYmluZCh0aGlzKSk6KHdpbmRvdy5TaGFkeURPTSYmU2hhZHlET00uZmx1c2goKSwKdGhpcy5maXQoKSkpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX19kZWZlcnJlZEZpdCYmKGNsZWFyVGltZW91dCh0aGlzLl9fZGVmZXJyZWRGaXQpLHRoaXMuX19kZWZlcnJlZEZpdD1udWxsKX0sZml0OmZ1bmN0aW9uKCl7dGhpcy5wb3NpdGlvbigpO3RoaXMuY29uc3RyYWluKCk7dGhpcy5jZW50ZXIoKX0sX2Rpc2NvdmVySW5mbzpmdW5jdGlvbigpe2lmKCF0aGlzLl9maXRJbmZvKXt2YXIgYj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKSxkPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMuc2l6aW5nVGFyZ2V0KTt0aGlzLl9maXRJbmZvPXtpbmxpbmVTdHlsZTp7dG9wOnRoaXMuc3R5bGUudG9wfHwiIixsZWZ0OnRoaXMuc3R5bGUubGVmdHx8IiIscG9zaXRpb246dGhpcy5zdHlsZS5wb3NpdGlvbnx8IiJ9LHNpemVySW5saW5lU3R5bGU6e21heFdpZHRoOnRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heFdpZHRofHwiIixtYXhIZWlnaHQ6dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4SGVpZ2h0fHwKIiIsYm94U2l6aW5nOnRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLmJveFNpemluZ3x8IiJ9LHBvc2l0aW9uZWRCeTp7dmVydGljYWxseToiYXV0byIhPT1iLnRvcD8idG9wIjoiYXV0byIhPT1iLmJvdHRvbT8iYm90dG9tIjpudWxsLGhvcml6b250YWxseToiYXV0byIhPT1iLmxlZnQ/ImxlZnQiOiJhdXRvIiE9PWIucmlnaHQ/InJpZ2h0IjpudWxsfSxzaXplZEJ5OntoZWlnaHQ6Im5vbmUiIT09ZC5tYXhIZWlnaHQsd2lkdGg6Im5vbmUiIT09ZC5tYXhXaWR0aCxtaW5XaWR0aDpwYXJzZUludChkLm1pbldpZHRoLDEwKXx8MCxtaW5IZWlnaHQ6cGFyc2VJbnQoZC5taW5IZWlnaHQsMTApfHwwfSxtYXJnaW46e3RvcDpwYXJzZUludChiLm1hcmdpblRvcCwxMCl8fDAscmlnaHQ6cGFyc2VJbnQoYi5tYXJnaW5SaWdodCwxMCl8fDAsYm90dG9tOnBhcnNlSW50KGIubWFyZ2luQm90dG9tLDEwKXx8MCxsZWZ0OnBhcnNlSW50KGIubWFyZ2luTGVmdCwxMCl8fDB9fX19LHJlc2V0Rml0OmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuX2ZpdEluZm98fHt9LGQ7Zm9yKGQgaW4gYi5zaXplcklubGluZVN0eWxlKXRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlW2RdPWIuc2l6ZXJJbmxpbmVTdHlsZVtkXTtmb3IoZCBpbiBiLmlubGluZVN0eWxlKXRoaXMuc3R5bGVbZF09Yi5pbmxpbmVTdHlsZVtkXTt0aGlzLl9maXRJbmZvPW51bGx9LHJlZml0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsTGVmdCxkPXRoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbFRvcDt0aGlzLnJlc2V0Rml0KCk7dGhpcy5maXQoKTt0aGlzLnNpemluZ1RhcmdldC5zY3JvbGxMZWZ0PWI7dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsVG9wPWR9LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fX3Nob3VsZFBvc2l0aW9uKXt0aGlzLl9kaXNjb3ZlckluZm8oKTt0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Ijt0aGlzLnN0eWxlLmxlZnQ9IjBweCI7CnRoaXMuc3R5bGUudG9wPSIwcHgiO3ZhciBiPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZD10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5wb3NpdGlvblRhcmdldCksZj10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5maXRJbnRvKSxoPXRoaXMuX2ZpdEluZm8ubWFyZ2luLGs9dGhpcy5fX2dldFBvc2l0aW9uKHRoaXMuX2xvY2FsZUhvcml6b250YWxBbGlnbix0aGlzLnZlcnRpY2FsQWxpZ24se3dpZHRoOmIud2lkdGgraC5sZWZ0K2gucmlnaHQsaGVpZ2h0OmIuaGVpZ2h0K2gudG9wK2guYm90dG9tfSxiLGQsZik7ZD1rLmxlZnQraC5sZWZ0O2s9ay50b3AraC50b3A7dmFyIHQ9TWF0aC5taW4oZi5yaWdodC1oLnJpZ2h0LGQrYi53aWR0aCksbD1NYXRoLm1pbihmLmJvdHRvbS1oLmJvdHRvbSxrK2IuaGVpZ2h0KTtkPU1hdGgubWF4KGYubGVmdCtoLmxlZnQsTWF0aC5taW4oZCx0LXRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5XaWR0aCkpO2s9TWF0aC5tYXgoZi50b3ArCmgudG9wLE1hdGgubWluKGssbC10aGlzLl9maXRJbmZvLnNpemVkQnkubWluSGVpZ2h0KSk7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4V2lkdGg9TWF0aC5tYXgodC1kLHRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5XaWR0aCkrInB4Ijt0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhIZWlnaHQ9TWF0aC5tYXgobC1rLHRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5IZWlnaHQpKyJweCI7dGhpcy5zdHlsZS5sZWZ0PWQtYi5sZWZ0KyJweCI7dGhpcy5zdHlsZS50b3A9ay1iLnRvcCsicHgifX0sY29uc3RyYWluOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dmFyIGI9dGhpcy5fZml0SW5mbztiLnBvc2l0aW9uZWRCeS52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiLHRoaXMuc3R5bGUudG9wPSIwcHgiKTtiLnBvc2l0aW9uZWRCeS5ob3Jpem9udGFsbHl8fCh0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsCnRoaXMuc3R5bGUubGVmdD0iMHB4Iik7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUuYm94U2l6aW5nPSJib3JkZXItYm94Ijt2YXIgZD10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Iuc2l6ZWRCeS5oZWlnaHR8fHRoaXMuX19zaXplRGltZW5zaW9uKGQsYi5wb3NpdGlvbmVkQnkudmVydGljYWxseSwidG9wIiwiYm90dG9tIiwiSGVpZ2h0Iik7Yi5zaXplZEJ5LndpZHRofHx0aGlzLl9fc2l6ZURpbWVuc2lvbihkLGIucG9zaXRpb25lZEJ5Lmhvcml6b250YWxseSwibGVmdCIsInJpZ2h0IiwiV2lkdGgiKX19LF9zaXplRGltZW5zaW9uOmZ1bmN0aW9uKGIsZCxmLGgsayl7dGhpcy5fX3NpemVEaW1lbnNpb24oYixkLGYsaCxrKX0sX19zaXplRGltZW5zaW9uOmZ1bmN0aW9uKGIsZCxmLGgsayl7dmFyIHQ9dGhpcy5fZml0SW5mbyxsPXRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLmZpdEludG8pO2w9IldpZHRoIj09PWs/bC53aWR0aDpsLmhlaWdodDtkPWQ9PT1oO3ZhciBwPQoib2Zmc2V0IitrO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlWyJtYXgiK2tdPWwtdC5tYXJnaW5bZD9mOmhdLShkP2wtYltoXTpiW2ZdKS0odGhpc1twXS10aGlzLnNpemluZ1RhcmdldFtwXSkrInB4In0sY2VudGVyOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19zaG91bGRQb3NpdGlvbil7dGhpcy5fZGlzY292ZXJJbmZvKCk7dmFyIGI9dGhpcy5fZml0SW5mby5wb3NpdGlvbmVkQnk7aWYoIWIudmVydGljYWxseXx8IWIuaG9yaXpvbnRhbGx5KXt0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7Yi52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS50b3A9IjBweCIpO2IuaG9yaXpvbnRhbGx5fHwodGhpcy5zdHlsZS5sZWZ0PSIwcHgiKTt2YXIgZD10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGY9dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMuZml0SW50byk7Yi52ZXJ0aWNhbGx5fHwodGhpcy5zdHlsZS50b3A9Zi50b3AtZC50b3ArKGYuaGVpZ2h0LWQuaGVpZ2h0KS8yKyJweCIpO2IuaG9yaXpvbnRhbGx5fHwKKHRoaXMuc3R5bGUubGVmdD1mLmxlZnQtZC5sZWZ0KyhmLndpZHRoLWQud2lkdGgpLzIrInB4Iil9fX0sX19nZXROb3JtYWxpemVkUmVjdDpmdW5jdGlvbihiKXtyZXR1cm4gYj09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8Yj09PXdpbmRvdz97dG9wOjAsbGVmdDowLHdpZHRoOndpbmRvdy5pbm5lcldpZHRoLGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHQscmlnaHQ6d2luZG93LmlubmVyV2lkdGgsYm90dG9tOndpbmRvdy5pbm5lckhlaWdodH06Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0sX19nZXRPZmZzY3JlZW5BcmVhOmZ1bmN0aW9uKGIsZCxmKXtyZXR1cm4gTWF0aC5hYnMoTWF0aC5taW4oMCxiLnRvcCkrTWF0aC5taW4oMCxmLmJvdHRvbS0oYi50b3ArZC5oZWlnaHQpKSkqZC53aWR0aCtNYXRoLmFicyhNYXRoLm1pbigwLGIubGVmdCkrTWF0aC5taW4oMCxmLnJpZ2h0LShiLmxlZnQrZC53aWR0aCkpKSpkLmhlaWdodH0sX19nZXRQb3NpdGlvbjpmdW5jdGlvbihiLGQsCmYsaCxrLHQpe3ZhciBsPVt7dmVydGljYWxBbGlnbjoidG9wIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDprLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ay5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOmsudG9wK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLnJpZ2h0LWYud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSx7dmVydGljYWxBbGlnbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246ImxlZnQiLHRvcDprLmJvdHRvbS1mLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ay5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246ImJvdHRvbSIsaG9yaXpvbnRhbEFsaWduOiJyaWdodCIsdG9wOmsuYm90dG9tLWYuaGVpZ2h0LXRoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLnJpZ2h0LWYud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0fV07CmlmKHRoaXMubm9PdmVybGFwKXtmb3IodmFyIHA9MCxtPWwubGVuZ3RoO3A8bTtwKyspe3ZhciBuPXt9LHE7Zm9yKHEgaW4gbFtwXSluW3FdPWxbcF1bcV07bC5wdXNoKG4pfWxbMF0udG9wPWxbMV0udG9wKz1rLmhlaWdodDtsWzJdLnRvcD1sWzNdLnRvcC09ay5oZWlnaHQ7bFs0XS5sZWZ0PWxbNl0ubGVmdCs9ay53aWR0aDtsWzVdLmxlZnQ9bFs3XS5sZWZ0LT1rLndpZHRofWQ9ImF1dG8iPT09ZD9udWxsOmQ7Yj0iYXV0byI9PT1iP251bGw6YjtiJiYiY2VudGVyIiE9PWJ8fChsLnB1c2goe3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDprLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0Kyh0aGlzLm5vT3ZlcmxhcD9rLmhlaWdodDowKSxsZWZ0OmsubGVmdC1oLndpZHRoLzIray53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pLGwucHVzaCh7dmVydGljYWxBbGlnbjoiYm90dG9tIixob3Jpem9udGFsQWxpZ246ImNlbnRlciIsdG9wOmsuYm90dG9tLQpmLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LSh0aGlzLm5vT3ZlcmxhcD9rLmhlaWdodDowKSxsZWZ0OmsubGVmdC1oLndpZHRoLzIray53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pKTtkJiYibWlkZGxlIiE9PWR8fChsLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJsZWZ0Iix0b3A6ay50b3AtaC5oZWlnaHQvMitrLmhlaWdodC8yK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDprLmxlZnQrdGhpcy5ob3Jpem9udGFsT2Zmc2V0Kyh0aGlzLm5vT3ZlcmxhcD9rLndpZHRoOjApfSksbC5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLGhvcml6b250YWxBbGlnbjoicmlnaHQiLHRvcDprLnRvcC1oLmhlaWdodC8yK2suaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmsucmlnaHQtZi53aWR0aC10aGlzLmhvcml6b250YWxPZmZzZXQtKHRoaXMubm9PdmVybGFwP2sud2lkdGg6MCl9KSk7Im1pZGRsZSI9PT1kJiYiY2VudGVyIj09PQpiJiZsLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDprLnRvcC1oLmhlaWdodC8yK2suaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OmsubGVmdC1oLndpZHRoLzIray53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pO2ZvcihwPTA7cDxsLmxlbmd0aDtwKyspe2g9bFtwXTtrPWgudmVydGljYWxBbGlnbj09PWQ7bT1oLmhvcml6b250YWxBbGlnbj09PWI7aWYoIXRoaXMuZHluYW1pY0FsaWduJiYhdGhpcy5ub092ZXJsYXAmJmsmJm0pe3ZhciB1PWg7YnJlYWt9bj0oIWR8fGspJiYoIWJ8fG0pO2lmKHRoaXMuZHluYW1pY0FsaWdufHxuKXtoLm9mZnNjcmVlbkFyZWE9dGhpcy5fX2dldE9mZnNjcmVlbkFyZWEoaCxmLHQpO2lmKDA9PT1oLm9mZnNjcmVlbkFyZWEmJm4pe3U9aDticmVha311PXV8fGg7bj1oLm9mZnNjcmVlbkFyZWEtdS5vZmZzY3JlZW5BcmVhO2lmKDA+bnx8MD09PW4mJihrfHxtKSl1PWh9fXJldHVybiB1fX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1yZXNpemFibGUtYmVoYXZpb3IvaXJvbi1yZXNpemFibGUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcj17cHJvcGVydGllczp7X3BhcmVudFJlc2l6YWJsZTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9wYXJlbnRSZXNpemFibGVDaGFuZ2VkIn0sX25vdGlmeWluZ0Rlc2NlbmRhbnQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGxpc3RlbmVyczp7Imlyb24tcmVxdWVzdC1yZXNpemUtbm90aWZpY2F0aW9ucyI6Il9vbklyb25SZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9ucyJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcz1bXTt0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZT10aGlzLm5vdGlmeVJlc2l6ZS5iaW5kKHRoaXMpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50UmVzaXphYmxlP3RoaXMuX3BhcmVudFJlc2l6YWJsZS5zdG9wUmVzaXplTm90aWZpY2F0aW9uc0Zvcih0aGlzKTp3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIiwKdGhpcy5fYm91bmROb3RpZnlSZXNpemUpO3RoaXMuX3BhcmVudFJlc2l6YWJsZT1udWxsfSxub3RpZnlSZXNpemU6ZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWQmJih0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3RoaXMucmVzaXplclNob3VsZE5vdGlmeShiKSYmdGhpcy5fbm90aWZ5RGVzY2VuZGFudChiKX0sdGhpcyksdGhpcy5fZmlyZVJlc2l6ZSgpKX0sYXNzaWduUGFyZW50UmVzaXphYmxlOmZ1bmN0aW9uKGIpe3RoaXMuX3BhcmVudFJlc2l6YWJsZT1ifSxzdG9wUmVzaXplTm90aWZpY2F0aW9uc0ZvcjpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5pbmRleE9mKGIpOy0xPGQmJih0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5zcGxpY2UoZCwxKSx0aGlzLnVubGlzdGVuKGIsImlyb24tcmVzaXplIiwiX29uRGVzY2VuZGFudElyb25SZXNpemUiKSl9LHJlc2l6ZXJTaG91bGROb3RpZnk6ZnVuY3Rpb24oKXtyZXR1cm4hMH0sCl9vbkRlc2NlbmRhbnRJcm9uUmVzaXplOmZ1bmN0aW9uKGIpe3RoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ/Yi5zdG9wUHJvcGFnYXRpb24oKTpQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvd3x8dGhpcy5fZmlyZVJlc2l6ZSgpfSxfZmlyZVJlc2l6ZTpmdW5jdGlvbigpe3RoaXMuZmlyZSgiaXJvbi1yZXNpemUiLG51bGwse25vZGU6dGhpcyxidWJibGVzOiExfSl9LF9vbklyb25SZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9uczpmdW5jdGlvbihiKXt2YXIgZD1Qb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0O2QhPT10aGlzJiYoLTE9PT10aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5pbmRleE9mKGQpJiYodGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXMucHVzaChkKSx0aGlzLmxpc3RlbihkLCJpcm9uLXJlc2l6ZSIsIl9vbkRlc2NlbmRhbnRJcm9uUmVzaXplIikpLGQuYXNzaWduUGFyZW50UmVzaXphYmxlKHRoaXMpLHRoaXMuX25vdGlmeURlc2NlbmRhbnQoZCksYi5zdG9wUHJvcGFnYXRpb24oKSl9LApfcGFyZW50UmVzaXphYmxlQ2hhbmdlZDpmdW5jdGlvbihiKXtiJiZ3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigicmVzaXplIix0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZSl9LF9ub3RpZnlEZXNjZW5kYW50OmZ1bmN0aW9uKGIpe3RoaXMuaXNBdHRhY2hlZCYmKHRoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ9ITAsYi5ub3RpZnlSZXNpemUoKSx0aGlzLl9ub3RpZnlpbmdEZXNjZW5kYW50PSExKX0sX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0F0dGFjaGVkKWlmKCJsb2FkaW5nIj09PWRvY3VtZW50LnJlYWR5U3RhdGUpe3ZhciBiPXRoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zLmJpbmQodGhpcyk7ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigicmVhZHlzdGF0ZWNoYW5nZSIsZnVuY3Rpb24gZigpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGYpO2IoKX0pfWVsc2UgdGhpcy5maXJlKCJpcm9uLXJlcXVlc3QtcmVzaXplLW5vdGlmaWNhdGlvbnMiLApudWxsLHtub2RlOnRoaXMsYnViYmxlczohMCxjYW5jZWxhYmxlOiEwfSksdGhpcy5fcGFyZW50UmVzaXphYmxlfHwod2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGhpcy5fYm91bmROb3RpZnlSZXNpemUpLHRoaXMubm90aWZ5UmVzaXplKCkpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1iYWNrZHJvcC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJpcm9uLW92ZXJsYXktYmFja2Ryb3AiLHByb3BlcnRpZXM6e29wZW5lZDp7cmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifX0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfb25UcmFuc2l0aW9uZW5kIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCl9LHByZXBhcmU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMucGFyZW50Tm9kZSYmUG9seW1lci5kb20oZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGhpcyl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMX0sY29tcGxldGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZHx8dGhpcy5wYXJlbnROb2RlIT09CmRvY3VtZW50LmJvZHl8fFBvbHltZXIuZG9tKHRoaXMucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQodGhpcyl9LF9vblRyYW5zaXRpb25lbmQ6ZnVuY3Rpb24oYil7YiYmYi50YXJnZXQ9PT10aGlzJiZ0aGlzLmNvbXBsZXRlKCl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKGIpe2I/dGhpcy5wcmVwYXJlKCk6KGI9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyksIjBzIiE9PWIudHJhbnNpdGlvbkR1cmF0aW9uJiYwIT1iLm9wYWNpdHl8fHRoaXMuY29tcGxldGUoKSk7dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5fX29wZW5lZFJhZiYmKHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fb3BlbmVkUmFmKSx0aGlzLl9fb3BlbmVkUmFmPW51bGwpLHRoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuX19vcGVuZWRSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbDt0aGlzLnRvZ2dsZUNsYXNzKCJvcGVuZWQiLAp0aGlzLm9wZW5lZCl9LmJpbmQodGhpcykpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1tYW5hZ2VyLmh0bWwuanMKUG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzcz1mdW5jdGlvbigpe3RoaXMuX292ZXJsYXlzPVtdO3RoaXMuX21pbmltdW1aPTEwMTt0aGlzLl9iYWNrZHJvcEVsZW1lbnQ9bnVsbDtQb2x5bWVyLkdlc3R1cmVzLmFkZChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsInRhcCIsZnVuY3Rpb24oKXt9KTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLHRoaXMuX29uQ2FwdHVyZUNsaWNrLmJpbmQodGhpcyksITApO2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9vbkNhcHR1cmVGb2N1cy5iaW5kKHRoaXMpLCEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLl9vbkNhcHR1cmVLZXlEb3duLmJpbmQodGhpcyksITApfTsKUG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJDbGFzcy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlBvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyQ2xhc3MsZ2V0IGJhY2tkcm9wRWxlbWVudCgpe3RoaXMuX2JhY2tkcm9wRWxlbWVudHx8KHRoaXMuX2JhY2tkcm9wRWxlbWVudD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpcm9uLW92ZXJsYXktYmFja2Ryb3AiKSk7cmV0dXJuIHRoaXMuX2JhY2tkcm9wRWxlbWVudH0sZ2V0IGRlZXBBY3RpdmVFbGVtZW50KCl7dmFyIGI9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtiJiYhMSE9PWIgaW5zdGFuY2VvZiBFbGVtZW50fHwoYj1kb2N1bWVudC5ib2R5KTtmb3IoO2Iucm9vdCYmUG9seW1lci5kb20oYi5yb290KS5hY3RpdmVFbGVtZW50OyliPVBvbHltZXIuZG9tKGIucm9vdCkuYWN0aXZlRWxlbWVudDtyZXR1cm4gYn0sX2JyaW5nT3ZlcmxheUF0SW5kZXhUb0Zyb250OmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX292ZXJsYXlzW2JdO2lmKGQpe3ZhciBmPQp0aGlzLl9vdmVybGF5cy5sZW5ndGgtMSxoPXRoaXMuX292ZXJsYXlzW2ZdO2gmJnRoaXMuX3Nob3VsZEJlQmVoaW5kT3ZlcmxheShkLGgpJiZmLS07aWYoIShiPj1mKSl7aD1NYXRoLm1heCh0aGlzLmN1cnJlbnRPdmVybGF5WigpLHRoaXMuX21pbmltdW1aKTtmb3IodGhpcy5fZ2V0WihkKTw9aCYmdGhpcy5fYXBwbHlPdmVybGF5WihkLGgpO2I8ZjspdGhpcy5fb3ZlcmxheXNbYl09dGhpcy5fb3ZlcmxheXNbYisxXSxiKys7dGhpcy5fb3ZlcmxheXNbZl09ZH19fSxhZGRPclJlbW92ZU92ZXJsYXk6ZnVuY3Rpb24oYil7Yi5vcGVuZWQ/dGhpcy5hZGRPdmVybGF5KGIpOnRoaXMucmVtb3ZlT3ZlcmxheShiKX0sYWRkT3ZlcmxheTpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl9vdmVybGF5cy5pbmRleE9mKGIpO2lmKDA8PWQpdGhpcy5fYnJpbmdPdmVybGF5QXRJbmRleFRvRnJvbnQoZCk7ZWxzZXtkPXRoaXMuX292ZXJsYXlzLmxlbmd0aDt2YXIgZj10aGlzLl9vdmVybGF5c1tkLTFdLGg9Ck1hdGgubWF4KHRoaXMuX2dldFooZiksdGhpcy5fbWluaW11bVopLGs9dGhpcy5fZ2V0WihiKTtmJiZ0aGlzLl9zaG91bGRCZUJlaGluZE92ZXJsYXkoYixmKSYmKHRoaXMuX2FwcGx5T3ZlcmxheVooZixoKSxkLS0saD1NYXRoLm1heCh0aGlzLl9nZXRaKHRoaXMuX292ZXJsYXlzW2QtMV0pLHRoaXMuX21pbmltdW1aKSk7azw9aCYmdGhpcy5fYXBwbHlPdmVybGF5WihiLGgpO3RoaXMuX292ZXJsYXlzLnNwbGljZShkLDAsYil9dGhpcy50cmFja0JhY2tkcm9wKCl9LHJlbW92ZU92ZXJsYXk6ZnVuY3Rpb24oYil7Yj10aGlzLl9vdmVybGF5cy5pbmRleE9mKGIpOy0xIT09YiYmKHRoaXMuX292ZXJsYXlzLnNwbGljZShiLDEpLHRoaXMudHJhY2tCYWNrZHJvcCgpKX0sY3VycmVudE92ZXJsYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3ZlcmxheXNbdGhpcy5fb3ZlcmxheXMubGVuZ3RoLTFdfSxjdXJyZW50T3ZlcmxheVo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0Wih0aGlzLmN1cnJlbnRPdmVybGF5KCkpfSwKZW5zdXJlTWluaW11bVo6ZnVuY3Rpb24oYil7dGhpcy5fbWluaW11bVo9TWF0aC5tYXgodGhpcy5fbWluaW11bVosYil9LGZvY3VzT3ZlcmxheTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuY3VycmVudE92ZXJsYXkoKTtiJiZiLl9hcHBseUZvY3VzKCl9LHRyYWNrQmFja2Ryb3A6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLl9vdmVybGF5V2l0aEJhY2tkcm9wKCk7aWYoYnx8dGhpcy5fYmFja2Ryb3BFbGVtZW50KXRoaXMuYmFja2Ryb3BFbGVtZW50LnN0eWxlLnpJbmRleD10aGlzLl9nZXRaKGIpLTEsdGhpcy5iYWNrZHJvcEVsZW1lbnQub3BlbmVkPSEhYix0aGlzLmJhY2tkcm9wRWxlbWVudC5wcmVwYXJlKCl9LGdldEJhY2tkcm9wczpmdW5jdGlvbigpe2Zvcih2YXIgYj1bXSxkPTA7ZDx0aGlzLl9vdmVybGF5cy5sZW5ndGg7ZCsrKXRoaXMuX292ZXJsYXlzW2RdLndpdGhCYWNrZHJvcCYmYi5wdXNoKHRoaXMuX292ZXJsYXlzW2RdKTtyZXR1cm4gYn0sYmFja2Ryb3BaOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFoodGhpcy5fb3ZlcmxheVdpdGhCYWNrZHJvcCgpKS0KMX0sX292ZXJsYXlXaXRoQmFja2Ryb3A6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5fb3ZlcmxheXMubGVuZ3RoLTE7MDw9YjtiLS0paWYodGhpcy5fb3ZlcmxheXNbYl0ud2l0aEJhY2tkcm9wKXJldHVybiB0aGlzLl9vdmVybGF5c1tiXX0sX2dldFo6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5fbWluaW11bVo7YiYmKGI9TnVtYmVyKGIuc3R5bGUuekluZGV4fHx3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShiKS56SW5kZXgpLGI9PT1iJiYoZD1iKSk7cmV0dXJuIGR9LF9zZXRaOmZ1bmN0aW9uKGIsZCl7Yi5zdHlsZS56SW5kZXg9ZH0sX2FwcGx5T3ZlcmxheVo6ZnVuY3Rpb24oYixkKXt0aGlzLl9zZXRaKGIsZCsyKX0sX292ZXJsYXlJblBhdGg6ZnVuY3Rpb24oYil7Yj1ifHxbXTtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKylpZihiW2RdLl9tYW5hZ2VyPT09dGhpcylyZXR1cm4gYltkXX0sX29uQ2FwdHVyZUNsaWNrOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMuX292ZXJsYXlzLmxlbmd0aC0KMTtpZigtMSE9PWQpZm9yKHZhciBmPVBvbHltZXIuZG9tKGIpLnBhdGgsaDsoaD10aGlzLl9vdmVybGF5c1tkXSkmJnRoaXMuX292ZXJsYXlJblBhdGgoZikhPT1oOylpZihoLl9vbkNhcHR1cmVDbGljayhiKSxoLmFsbG93Q2xpY2tUaHJvdWdoKWQtLTtlbHNlIGJyZWFrfSxfb25DYXB0dXJlRm9jdXM6ZnVuY3Rpb24oYil7dmFyIGQ9dGhpcy5jdXJyZW50T3ZlcmxheSgpO2QmJmQuX29uQ2FwdHVyZUZvY3VzKGIpfSxfb25DYXB0dXJlS2V5RG93bjpmdW5jdGlvbihiKXt2YXIgZD10aGlzLmN1cnJlbnRPdmVybGF5KCk7ZCYmKFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3Iua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzKGIsImVzYyIpP2QuX29uQ2FwdHVyZUVzYyhiKTpQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhiLCJ0YWIiKSYmZC5fb25DYXB0dXJlVGFiKGIpKX0sX3Nob3VsZEJlQmVoaW5kT3ZlcmxheTpmdW5jdGlvbihiLGQpe3JldHVybiFiLmFsd2F5c09uVG9wJiYKZC5hbHdheXNPblRvcH19O1BvbHltZXIuSXJvbk92ZXJsYXlNYW5hZ2VyPW5ldyBQb2x5bWVyLklyb25PdmVybGF5TWFuYWdlckNsYXNzOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tb3ZlcmxheS1iZWhhdmlvci9pcm9uLXNjcm9sbC1tYW5hZ2VyLmh0bWwuanMKKGZ1bmN0aW9uKCl7dmFyIGI9MCxkPTAsZj1udWxsLGg9W10saz1bIndoZWVsIiwibW91c2V3aGVlbCIsIkRPTU1vdXNlU2Nyb2xsIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSJdO1BvbHltZXIuSXJvblNjcm9sbE1hbmFnZXI9e2dldCBjdXJyZW50TG9ja2luZ0VsZW1lbnQoKXtyZXR1cm4gdGhpcy5fbG9ja2luZ0VsZW1lbnRzW3RoaXMuX2xvY2tpbmdFbGVtZW50cy5sZW5ndGgtMV19LGVsZW1lbnRJc1Njcm9sbExvY2tlZDpmdW5jdGlvbih0KXt2YXIgbD10aGlzLmN1cnJlbnRMb2NraW5nRWxlbWVudDtpZih2b2lkIDA9PT1sKXJldHVybiExO2lmKHRoaXMuX2hhc0NhY2hlZExvY2tlZEVsZW1lbnQodCkpcmV0dXJuITA7aWYodGhpcy5faGFzQ2FjaGVkVW5sb2NrZWRFbGVtZW50KHQpKXJldHVybiExOyhsPSEhbCYmbCE9PXQmJiF0aGlzLl9jb21wb3NlZFRyZWVDb250YWlucyhsLHQpKT90aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGUucHVzaCh0KTp0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZS5wdXNoKHQpOwpyZXR1cm4gbH0scHVzaFNjcm9sbExvY2s6ZnVuY3Rpb24odCl7MDw9dGhpcy5fbG9ja2luZ0VsZW1lbnRzLmluZGV4T2YodCl8fCgwPT09dGhpcy5fbG9ja2luZ0VsZW1lbnRzLmxlbmd0aCYmdGhpcy5fbG9ja1Njcm9sbEludGVyYWN0aW9ucygpLHRoaXMuX2xvY2tpbmdFbGVtZW50cy5wdXNoKHQpLHRoaXMuX2xvY2tlZEVsZW1lbnRDYWNoZT1bXSx0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZT1bXSl9LHJlbW92ZVNjcm9sbExvY2s6ZnVuY3Rpb24odCl7dD10aGlzLl9sb2NraW5nRWxlbWVudHMuaW5kZXhPZih0KTstMSE9PXQmJih0aGlzLl9sb2NraW5nRWxlbWVudHMuc3BsaWNlKHQsMSksdGhpcy5fbG9ja2VkRWxlbWVudENhY2hlPVtdLHRoaXMuX3VubG9ja2VkRWxlbWVudENhY2hlPVtdLDA9PT10aGlzLl9sb2NraW5nRWxlbWVudHMubGVuZ3RoJiZ0aGlzLl91bmxvY2tTY3JvbGxJbnRlcmFjdGlvbnMoKSl9LF9sb2NraW5nRWxlbWVudHM6W10sX2xvY2tlZEVsZW1lbnRDYWNoZTpudWxsLApfdW5sb2NrZWRFbGVtZW50Q2FjaGU6bnVsbCxfaGFzQ2FjaGVkTG9ja2VkRWxlbWVudDpmdW5jdGlvbih0KXtyZXR1cm4tMTx0aGlzLl9sb2NrZWRFbGVtZW50Q2FjaGUuaW5kZXhPZih0KX0sX2hhc0NhY2hlZFVubG9ja2VkRWxlbWVudDpmdW5jdGlvbih0KXtyZXR1cm4tMTx0aGlzLl91bmxvY2tlZEVsZW1lbnRDYWNoZS5pbmRleE9mKHQpfSxfY29tcG9zZWRUcmVlQ29udGFpbnM6ZnVuY3Rpb24odCxsKXt2YXIgcCxtO2lmKHQuY29udGFpbnMobCkpcmV0dXJuITA7dD1Qb2x5bWVyLmRvbSh0KS5xdWVyeVNlbGVjdG9yQWxsKCJjb250ZW50LHNsb3QiKTtmb3IocD0wO3A8dC5sZW5ndGg7KytwKXt2YXIgbj1Qb2x5bWVyLmRvbSh0W3BdKS5nZXREaXN0cmlidXRlZE5vZGVzKCk7Zm9yKG09MDttPG4ubGVuZ3RoOysrbSlpZihuW21dLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJnRoaXMuX2NvbXBvc2VkVHJlZUNvbnRhaW5zKG5bbV0sbCkpcmV0dXJuITB9cmV0dXJuITF9LF9zY3JvbGxJbnRlcmFjdGlvbkhhbmRsZXI6ZnVuY3Rpb24odCl7dC5jYW5jZWxhYmxlJiYKdGhpcy5fc2hvdWxkUHJldmVudFNjcm9sbGluZyh0KSYmdC5wcmV2ZW50RGVmYXVsdCgpO3QudGFyZ2V0VG91Y2hlcyYmKHQ9dC50YXJnZXRUb3VjaGVzWzBdLGI9dC5wYWdlWCxkPXQucGFnZVkpfSxfbG9ja1Njcm9sbEludGVyYWN0aW9uczpmdW5jdGlvbigpe3RoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcj10aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXJ8fHRoaXMuX3Njcm9sbEludGVyYWN0aW9uSGFuZGxlci5iaW5kKHRoaXMpO2Zvcih2YXIgdD0wLGw9ay5sZW5ndGg7dDxsO3QrKylkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGtbdF0sdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITF9KX0sX3VubG9ja1Njcm9sbEludGVyYWN0aW9uczpmdW5jdGlvbigpe2Zvcih2YXIgdD0wLGw9ay5sZW5ndGg7dDxsO3QrKylkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGtbdF0sdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITF9KX0sCl9zaG91bGRQcmV2ZW50U2Nyb2xsaW5nOmZ1bmN0aW9uKHQpe3ZhciBsPVBvbHltZXIuZG9tKHQpLnJvb3RUYXJnZXQ7InRvdWNobW92ZSIhPT10LnR5cGUmJmYhPT1sJiYoZj1sLGg9dGhpcy5fZ2V0U2Nyb2xsYWJsZU5vZGVzKFBvbHltZXIuZG9tKHQpLnBhdGgpKTtpZighaC5sZW5ndGgpcmV0dXJuITA7aWYoInRvdWNoc3RhcnQiPT09dC50eXBlKXJldHVybiExO3Q9dGhpcy5fZ2V0U2Nyb2xsSW5mbyh0KTtyZXR1cm4hdGhpcy5fZ2V0U2Nyb2xsaW5nTm9kZShoLHQuZGVsdGFYLHQuZGVsdGFZKX0sX2dldFNjcm9sbGFibGVOb2RlczpmdW5jdGlvbih0KXtmb3IodmFyIGw9W10scD10LmluZGV4T2YodGhpcy5jdXJyZW50TG9ja2luZ0VsZW1lbnQpLG09MDttPD1wO20rKylpZih0W21dLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpe3ZhciBuPXRbbV0scT1uLnN0eWxlOyJzY3JvbGwiIT09cS5vdmVyZmxvdyYmImF1dG8iIT09cS5vdmVyZmxvdyYmKHE9d2luZG93LmdldENvbXB1dGVkU3R5bGUobikpOwoic2Nyb2xsIiE9PXEub3ZlcmZsb3cmJiJhdXRvIiE9PXEub3ZlcmZsb3d8fGwucHVzaChuKX1yZXR1cm4gbH0sX2dldFNjcm9sbGluZ05vZGU6ZnVuY3Rpb24odCxsLHApe2lmKGx8fHApZm9yKHZhciBtPU1hdGguYWJzKHApPj1NYXRoLmFicyhsKSxuPTA7bjx0Lmxlbmd0aDtuKyspe3ZhciBxPXRbbl07aWYobT8wPnA/MDxxLnNjcm9sbFRvcDpxLnNjcm9sbFRvcDxxLnNjcm9sbEhlaWdodC1xLmNsaWVudEhlaWdodDowPmw/MDxxLnNjcm9sbExlZnQ6cS5zY3JvbGxMZWZ0PHEuc2Nyb2xsV2lkdGgtcS5jbGllbnRXaWR0aClyZXR1cm4gcX19LF9nZXRTY3JvbGxJbmZvOmZ1bmN0aW9uKHQpe3ZhciBsPXtkZWx0YVg6dC5kZWx0YVgsZGVsdGFZOnQuZGVsdGFZfTsiZGVsdGFYImluIHR8fCgid2hlZWxEZWx0YVgiaW4gdCYmIndoZWVsRGVsdGFZImluIHQ/KGwuZGVsdGFYPS10LndoZWVsRGVsdGFYLGwuZGVsdGFZPS10LndoZWVsRGVsdGFZKToid2hlZWxEZWx0YSJpbiB0PyhsLmRlbHRhWD0KMCxsLmRlbHRhWT0tdC53aGVlbERlbHRhKToiYXhpcyJpbiB0PyhsLmRlbHRhWD0xPT09dC5heGlzP3QuZGV0YWlsOjAsbC5kZWx0YVk9Mj09PXQuYXhpcz90LmRldGFpbDowKTp0LnRhcmdldFRvdWNoZXMmJih0PXQudGFyZ2V0VG91Y2hlc1swXSxsLmRlbHRhWD1iLXQucGFnZVgsbC5kZWx0YVk9ZC10LnBhZ2VZKSk7cmV0dXJuIGx9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tZm9jdXNhYmxlcy1oZWxwZXIuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj1FbGVtZW50LnByb3RvdHlwZSxkPWIubWF0Y2hlc3x8Yi5tYXRjaGVzU2VsZWN0b3J8fGIubW96TWF0Y2hlc1NlbGVjdG9yfHxiLm1zTWF0Y2hlc1NlbGVjdG9yfHxiLm9NYXRjaGVzU2VsZWN0b3J8fGIud2Via2l0TWF0Y2hlc1NlbGVjdG9yO1BvbHltZXIuSXJvbkZvY3VzYWJsZXNIZWxwZXI9e2dldFRhYmJhYmxlTm9kZXM6ZnVuY3Rpb24oZil7dmFyIGg9W107cmV0dXJuIHRoaXMuX2NvbGxlY3RUYWJiYWJsZU5vZGVzKGYsaCk/dGhpcy5fc29ydEJ5VGFiSW5kZXgoaCk6aH0saXNGb2N1c2FibGU6ZnVuY3Rpb24oZil7cmV0dXJuIGQuY2FsbChmLCJpbnB1dCwgc2VsZWN0LCB0ZXh0YXJlYSwgYnV0dG9uLCBvYmplY3QiKT9kLmNhbGwoZiwiOm5vdChbZGlzYWJsZWRdKSIpOmQuY2FsbChmLCJhW2hyZWZdLCBhcmVhW2hyZWZdLCBpZnJhbWUsIFt0YWJpbmRleF0sIFtjb250ZW50RWRpdGFibGVdIil9LGlzVGFiYmFibGU6ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMuaXNGb2N1c2FibGUoZikmJgpkLmNhbGwoZiwnOm5vdChbdGFiaW5kZXhceDNkIi0xIl0pJykmJnRoaXMuX2lzVmlzaWJsZShmKX0sX25vcm1hbGl6ZWRUYWJJbmRleDpmdW5jdGlvbihmKXtyZXR1cm4gdGhpcy5pc0ZvY3VzYWJsZShmKT8oZj1mLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKXx8MCxOdW1iZXIoZikpOi0xfSxfY29sbGVjdFRhYmJhYmxlTm9kZXM6ZnVuY3Rpb24oZixoKXtpZihmLm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREV8fCF0aGlzLl9pc1Zpc2libGUoZikpcmV0dXJuITE7dmFyIGs9dGhpcy5fbm9ybWFsaXplZFRhYkluZGV4KGYpLHQ9MDxrOzA8PWsmJmgucHVzaChmKTtmPSJjb250ZW50Ij09PWYubG9jYWxOYW1lfHwic2xvdCI9PT1mLmxvY2FsTmFtZT9Qb2x5bWVyLmRvbShmKS5nZXREaXN0cmlidXRlZE5vZGVzKCk6UG9seW1lci5kb20oZi5yb290fHxmKS5jaGlsZHJlbjtmb3Ioaz0wO2s8Zi5sZW5ndGg7aysrKXQ9dGhpcy5fY29sbGVjdFRhYmJhYmxlTm9kZXMoZltrXSxoKXx8dDsKcmV0dXJuIHR9LF9pc1Zpc2libGU6ZnVuY3Rpb24oZil7dmFyIGg9Zi5zdHlsZTtyZXR1cm4iaGlkZGVuIiE9PWgudmlzaWJpbGl0eSYmIm5vbmUiIT09aC5kaXNwbGF5PyhoPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGYpLCJoaWRkZW4iIT09aC52aXNpYmlsaXR5JiYibm9uZSIhPT1oLmRpc3BsYXkpOiExfSxfc29ydEJ5VGFiSW5kZXg6ZnVuY3Rpb24oZil7dmFyIGg9Zi5sZW5ndGg7aWYoMj5oKXJldHVybiBmO3ZhciBrPU1hdGguY2VpbChoLzIpO2g9dGhpcy5fc29ydEJ5VGFiSW5kZXgoZi5zbGljZSgwLGspKTtmPXRoaXMuX3NvcnRCeVRhYkluZGV4KGYuc2xpY2UoaykpO3JldHVybiB0aGlzLl9tZXJnZVNvcnRCeVRhYkluZGV4KGgsZil9LF9tZXJnZVNvcnRCeVRhYkluZGV4OmZ1bmN0aW9uKGYsaCl7Zm9yKHZhciBrPVtdOzA8Zi5sZW5ndGgmJjA8aC5sZW5ndGg7KXRoaXMuX2hhc0xvd2VyVGFiT3JkZXIoZlswXSxoWzBdKT9rLnB1c2goaC5zaGlmdCgpKTprLnB1c2goZi5zaGlmdCgpKTsKcmV0dXJuIGsuY29uY2F0KGYsaCl9LF9oYXNMb3dlclRhYk9yZGVyOmZ1bmN0aW9uKGYsaCl7Zj1NYXRoLm1heChmLnRhYkluZGV4LDApO2g9TWF0aC5tYXgoaC50YWJJbmRleCwwKTtyZXR1cm4gMD09PWZ8fDA9PT1oP2g+ZjpmPmh9fX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1vdmVybGF5LWJlaGF2aW9yL2lyb24tb3ZlcmxheS1iZWhhdmlvci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGw9e3Byb3BlcnRpZXM6e29wZW5lZDp7b2JzZXJ2ZXI6Il9vcGVuZWRDaGFuZ2VkIix0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxjYW5jZWxlZDp7b2JzZXJ2ZXI6Il9jYW5jZWxlZENoYW5nZWQiLHJlYWRPbmx5OiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sd2l0aEJhY2tkcm9wOntvYnNlcnZlcjoiX3dpdGhCYWNrZHJvcENoYW5nZWQiLHR5cGU6Qm9vbGVhbn0sbm9BdXRvRm9jdXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sbm9DYW5jZWxPbkVzY0tleTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0NhbmNlbE9uT3V0c2lkZUNsaWNrOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNsb3NpbmdSZWFzb246e3R5cGU6T2JqZWN0fSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsbG93Q2xpY2tUaHJvdWdoOnt0eXBlOkJvb2xlYW59LGFsd2F5c09uVG9wOnt0eXBlOkJvb2xlYW59LApzY3JvbGxBY3Rpb246e3R5cGU6U3RyaW5nfSxfbWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6UG9seW1lci5Jcm9uT3ZlcmxheU1hbmFnZXJ9LF9mb2N1c2VkQ2hpbGQ6e3R5cGU6T2JqZWN0fX0sbGlzdGVuZXJzOnsiaXJvbi1yZXNpemUiOiJfb25Jcm9uUmVzaXplIn0sb2JzZXJ2ZXJzOlsiX191cGRhdGVTY3JvbGxPYnNlcnZlcnMoaXNBdHRhY2hlZCwgb3BlbmVkLCBzY3JvbGxBY3Rpb24pIl0sZ2V0IGJhY2tkcm9wRWxlbWVudCgpe3JldHVybiB0aGlzLl9tYW5hZ2VyLmJhY2tkcm9wRWxlbWVudH0sZ2V0IF9mb2N1c05vZGUoKXtyZXR1cm4gdGhpcy5fZm9jdXNlZENoaWxkfHxQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yKCJbYXV0b2ZvY3VzXSIpfHx0aGlzfSxnZXQgX2ZvY3VzYWJsZU5vZGVzKCl7cmV0dXJuIFBvbHltZXIuSXJvbkZvY3VzYWJsZXNIZWxwZXIuZ2V0VGFiYmFibGVOb2Rlcyh0aGlzKX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9CnRoaXMuX19pc0FuaW1hdGluZz0hMTt0aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlPXRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZT1udWxsO3RoaXMuX19yYWZzPXt9O3RoaXMuX19zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbExlZnQ9dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9bnVsbDt0aGlzLl9fb25DYXB0dXJlU2Nyb2xsPXRoaXMuX19vbkNhcHR1cmVTY3JvbGwuYmluZCh0aGlzKTt0aGlzLl9fcm9vdE5vZGVzPW51bGw7dGhpcy5fZW5zdXJlU2V0dXAoKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCk7dGhpcy5fb2JzZXJ2ZXI9UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKHRoaXMuX29uTm9kZXNDaGFuZ2UpfSxkZXRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuZG9tKHRoaXMpLnVub2JzZXJ2ZU5vZGVzKHRoaXMuX29ic2VydmVyKTt0aGlzLl9vYnNlcnZlcj1udWxsO2Zvcih2YXIgYiBpbiB0aGlzLl9fcmFmcyludWxsIT09CnRoaXMuX19yYWZzW2JdJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fcmFmc1tiXSk7dGhpcy5fX3JhZnM9e307dGhpcy5fbWFuYWdlci5yZW1vdmVPdmVybGF5KHRoaXMpO3RoaXMuX19pc0FuaW1hdGluZyYmKHRoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOih0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCkpKX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Q2FuY2VsZWQoITEpO3RoaXMub3BlbmVkPSF0aGlzLm9wZW5lZH0sb3BlbjpmdW5jdGlvbigpe3RoaXMuX3NldENhbmNlbGVkKCExKTt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLl9zZXRDYW5jZWxlZCghMSk7dGhpcy5vcGVuZWQ9ITF9LGNhbmNlbDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoImlyb24tb3ZlcmxheS1jYW5jZWxlZCIsYix7Y2FuY2VsYWJsZTohMH0pLmRlZmF1bHRQcmV2ZW50ZWR8fCh0aGlzLl9zZXRDYW5jZWxlZCghMCksdGhpcy5vcGVuZWQ9CiExKX0saW52YWxpZGF0ZVRhYmJhYmxlczpmdW5jdGlvbigpe3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlPW51bGx9LF9lbnN1cmVTZXR1cDpmdW5jdGlvbigpe3RoaXMuX292ZXJsYXlTZXR1cHx8KHRoaXMuX292ZXJsYXlTZXR1cD0hMCx0aGlzLnN0eWxlLm91dGxpbmU9Im5vbmUiLHRoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbihiKXtiP3RoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpOnRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKTt0aGlzLmlzQXR0YWNoZWQmJih0aGlzLl9faXNBbmltYXRpbmc9ITAsdGhpcy5fX2RlcmFmKCJfX29wZW5lZENoYW5nZWQiLHRoaXMuX19vcGVuZWRDaGFuZ2VkKSl9LF9jYW5jZWxlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmNsb3NpbmdSZWFzb249dGhpcy5jbG9zaW5nUmVhc29ufHx7fTt0aGlzLmNsb3NpbmdSZWFzb24uY2FuY2VsZWQ9CnRoaXMuY2FuY2VsZWR9LF93aXRoQmFja2Ryb3BDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy53aXRoQmFja2Ryb3AmJiF0aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKT8odGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKSx0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXg9ITApOnRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleCYmKHRoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpLHRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleD0hMSk7dGhpcy5vcGVuZWQmJnRoaXMuaXNBdHRhY2hlZCYmdGhpcy5fbWFuYWdlci50cmFja0JhY2tkcm9wKCl9LF9wcmVwYXJlUmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDt0aGlzLl9wcmVwYXJlUG9zaXRpb25pbmcoKTt0aGlzLnJlZml0KCk7dGhpcy5fZmluaXNoUG9zaXRpb25pbmcoKTt0aGlzLm5vQXV0b0ZvY3VzJiZkb2N1bWVudC5hY3RpdmVFbGVtZW50PT09CnRoaXMuX2ZvY3VzTm9kZSYmKHRoaXMuX2ZvY3VzTm9kZS5ibHVyKCksdGhpcy5fX3Jlc3RvcmVGb2N1c05vZGUuZm9jdXMoKSl9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpfSxfZmluaXNoUmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5ub3RpZnlSZXNpemUoKTt0aGlzLl9faXNBbmltYXRpbmc9ITE7dGhpcy5maXJlKCJpcm9uLW92ZXJsYXktb3BlbmVkIil9LF9maW5pc2hSZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuc3R5bGUuekluZGV4PSIiO3RoaXMubm90aWZ5UmVzaXplKCk7dGhpcy5fX2lzQW5pbWF0aW5nPSExO3RoaXMuZmlyZSgiaXJvbi1vdmVybGF5LWNsb3NlZCIsdGhpcy5jbG9zaW5nUmVhc29uKX0sX3ByZXBhcmVQb3NpdGlvbmluZzpmdW5jdGlvbigpe3RoaXMuc3R5bGUudHJhbnNpdGlvbj0KdGhpcy5zdHlsZS53ZWJraXRUcmFuc2l0aW9uPSJub25lIjt0aGlzLnN0eWxlLnRyYW5zZm9ybT10aGlzLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0ibm9uZSI7dGhpcy5zdHlsZS5kaXNwbGF5PSIifSxfZmluaXNoUG9zaXRpb25pbmc6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wO3RoaXMuc3R5bGUudHJhbnNpdGlvbj10aGlzLnN0eWxlLndlYmtpdFRyYW5zaXRpb249IiI7dGhpcy5zdHlsZS50cmFuc2Zvcm09dGhpcy5zdHlsZS53ZWJraXRUcmFuc2Zvcm09IiI7dGhpcy5zdHlsZS5kaXNwbGF5PSIiO3RoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wfSxfYXBwbHlGb2N1czpmdW5jdGlvbigpe2lmKHRoaXMub3BlbmVkKXRoaXMubm9BdXRvRm9jdXN8fHRoaXMuX2ZvY3VzTm9kZS5mb2N1cygpO2Vsc2V7dGhpcy5fZm9jdXNOb2RlLmJsdXIoKTt0aGlzLl9mb2N1c2VkQ2hpbGQ9bnVsbDtpZih0aGlzLnJlc3RvcmVGb2N1c09uQ2xvc2UmJgp0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZSl7dmFyIGI9dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDsoYj09PWRvY3VtZW50LmJvZHl8fFBvbHltZXIuZG9tKHRoaXMpLmRlZXBDb250YWlucyhiKSkmJnRoaXMuX19yZXN0b3JlRm9jdXNOb2RlLmZvY3VzKCl9dGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9bnVsbDsoYj10aGlzLl9tYW5hZ2VyLmN1cnJlbnRPdmVybGF5KCkpJiZ0aGlzIT09YiYmYi5fYXBwbHlGb2N1cygpfX0sX29uQ2FwdHVyZUNsaWNrOmZ1bmN0aW9uKGIpe3RoaXMubm9DYW5jZWxPbk91dHNpZGVDbGlja3x8dGhpcy5jYW5jZWwoYil9LF9vbkNhcHR1cmVGb2N1czpmdW5jdGlvbihiKXtpZih0aGlzLndpdGhCYWNrZHJvcCl7dmFyIGQ9UG9seW1lci5kb20oYikucGF0aDstMT09PWQuaW5kZXhPZih0aGlzKT8oYi5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9hcHBseUZvY3VzKCkpOnRoaXMuX2ZvY3VzZWRDaGlsZD1kWzBdfX0sX29uQ2FwdHVyZUVzYzpmdW5jdGlvbihiKXt0aGlzLm5vQ2FuY2VsT25Fc2NLZXl8fAp0aGlzLmNhbmNlbChiKX0sX29uQ2FwdHVyZVRhYjpmdW5jdGlvbihiKXtpZih0aGlzLndpdGhCYWNrZHJvcCl7dGhpcy5fX2Vuc3VyZUZpcnN0TGFzdEZvY3VzYWJsZXMoKTt2YXIgZD1iLnNoaWZ0S2V5LGY9ZD90aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlOnRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZTtkPWQ/dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlOnRoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU7aWYoZj09PWQpZj0hMDtlbHNle3ZhciBoPXRoaXMuX21hbmFnZXIuZGVlcEFjdGl2ZUVsZW1lbnQ7Zj1oPT09Znx8aD09PXRoaXN9ZiYmKGIucHJldmVudERlZmF1bHQoKSx0aGlzLl9mb2N1c2VkQ2hpbGQ9ZCx0aGlzLl9hcHBseUZvY3VzKCkpfX0sX29uSXJvblJlc2l6ZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkJiYhdGhpcy5fX2lzQW5pbWF0aW5nJiZ0aGlzLl9fZGVyYWYoInJlZml0Iix0aGlzLnJlZml0KX0sX29uTm9kZXNDaGFuZ2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMuX19pc0FuaW1hdGluZyYmCih0aGlzLmludmFsaWRhdGVUYWJiYWJsZXMoKSx0aGlzLm5vdGlmeVJlc2l6ZSgpKX0sX19lbnN1cmVGaXJzdExhc3RGb2N1c2FibGVzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19maXJzdEZvY3VzYWJsZU5vZGV8fCF0aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGUpe3ZhciBiPXRoaXMuX2ZvY3VzYWJsZU5vZGVzO3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9YlswXTt0aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU9YltiLmxlbmd0aC0xXX19LF9fb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMub3BlbmVkPyh0aGlzLl9wcmVwYXJlUmVuZGVyT3BlbmVkKCksdGhpcy5fbWFuYWdlci5hZGRPdmVybGF5KHRoaXMpLHRoaXMuX2FwcGx5Rm9jdXMoKSx0aGlzLl9yZW5kZXJPcGVuZWQoKSk6KHRoaXMuX21hbmFnZXIucmVtb3ZlT3ZlcmxheSh0aGlzKSx0aGlzLl9hcHBseUZvY3VzKCksdGhpcy5fcmVuZGVyQ2xvc2VkKCkpfSxfX2RlcmFmOmZ1bmN0aW9uKGIsZCl7dmFyIGY9dGhpcy5fX3JhZnM7Cm51bGwhPT1mW2JdJiZjYW5jZWxBbmltYXRpb25GcmFtZShmW2JdKTtmW2JdPXJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe2ZbYl09bnVsbDtkLmNhbGwodGhpcyl9LmJpbmQodGhpcykpfSxfX3VwZGF0ZVNjcm9sbE9ic2VydmVyczpmdW5jdGlvbihiLGQsZil7YiYmZCYmdGhpcy5fX2lzVmFsaWRTY3JvbGxBY3Rpb24oZik/KCJsb2NrIj09PWYmJih0aGlzLl9fc2F2ZVNjcm9sbFBvc2l0aW9uKCksUG9seW1lci5Jcm9uU2Nyb2xsTWFuYWdlci5wdXNoU2Nyb2xsTG9jayh0aGlzKSksdGhpcy5fX2FkZFNjcm9sbExpc3RlbmVycygpKTooUG9seW1lci5Jcm9uU2Nyb2xsTWFuYWdlci5yZW1vdmVTY3JvbGxMb2NrKHRoaXMpLHRoaXMuX19yZW1vdmVTY3JvbGxMaXN0ZW5lcnMoKSl9LF9fYWRkU2Nyb2xsTGlzdGVuZXJzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19yb290Tm9kZXMpe3RoaXMuX19yb290Tm9kZXM9W107aWYoUG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpZm9yKHZhciBiPQp0aGlzO2I7KWIubm9kZVR5cGU9PT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUmJmIuaG9zdCYmdGhpcy5fX3Jvb3ROb2Rlcy5wdXNoKGIpLGI9Yi5ob3N0fHxiLmFzc2lnbmVkU2xvdHx8Yi5wYXJlbnROb2RlO3RoaXMuX19yb290Tm9kZXMucHVzaChkb2N1bWVudCl9dGhpcy5fX3Jvb3ROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGQpe2QuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9fb25DYXB0dXJlU2Nyb2xsLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9KX0sdGhpcyl9LF9fcmVtb3ZlU2Nyb2xsTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fX3Jvb3ROb2RlcyYmdGhpcy5fX3Jvb3ROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IucmVtb3ZlRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9fb25DYXB0dXJlU2Nyb2xsLHtjYXB0dXJlOiEwLHBhc3NpdmU6ITB9KX0sdGhpcyk7dGhpcy5pc0F0dGFjaGVkfHwodGhpcy5fX3Jvb3ROb2Rlcz1udWxsKX0sX19pc1ZhbGlkU2Nyb2xsQWN0aW9uOmZ1bmN0aW9uKGIpe3JldHVybiJsb2NrIj09PQpifHwicmVmaXQiPT09Ynx8ImNhbmNlbCI9PT1ifSxfX29uQ2FwdHVyZVNjcm9sbDpmdW5jdGlvbihiKXtpZighKHRoaXMuX19pc0FuaW1hdGluZ3x8MDw9UG9seW1lci5kb20oYikucGF0aC5pbmRleE9mKHRoaXMpKSlzd2l0Y2godGhpcy5zY3JvbGxBY3Rpb24pe2Nhc2UgImxvY2siOnRoaXMuX19yZXN0b3JlU2Nyb2xsUG9zaXRpb24oKTticmVhaztjYXNlICJyZWZpdCI6dGhpcy5fX2RlcmFmKCJyZWZpdCIsdGhpcy5yZWZpdCk7YnJlYWs7Y2FzZSAiY2FuY2VsIjp0aGlzLmNhbmNlbChiKX19LF9fc2F2ZVNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKCl7ZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudD8odGhpcy5fX3Njcm9sbFRvcD1kb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcCx0aGlzLl9fc2Nyb2xsTGVmdD1kb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbExlZnQpOih0aGlzLl9fc2Nyb2xsVG9wPU1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AsCmRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKSx0aGlzLl9fc2Nyb2xsTGVmdD1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCxkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpKX0sX19yZXN0b3JlU2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXtkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50Pyhkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcD10aGlzLl9fc2Nyb2xsVG9wLGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsTGVmdD10aGlzLl9fc2Nyb2xsTGVmdCk6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A9ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbFRvcCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdD1kb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ9dGhpcy5fX3Njcm9sbExlZnQpfX07UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9yPVtQb2x5bWVyLklyb25GaXRCZWhhdmlvcixQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvciwKUG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbF19KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL25lb24tYW5pbWF0YWJsZS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuTmVvbkFuaW1hdGFibGVCZWhhdmlvcj17cHJvcGVydGllczp7YW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sZW50cnlBbmltYXRpb246e29ic2VydmVyOiJfZW50cnlBbmltYXRpb25DaGFuZ2VkIix0eXBlOlN0cmluZ30sZXhpdEFuaW1hdGlvbjp7b2JzZXJ2ZXI6Il9leGl0QW5pbWF0aW9uQ2hhbmdlZCIsdHlwZTpTdHJpbmd9fSxfZW50cnlBbmltYXRpb25DaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hbmltYXRpb25Db25maWc9dGhpcy5hbmltYXRpb25Db25maWd8fHt9O3RoaXMuYW5pbWF0aW9uQ29uZmlnLmVudHJ5PVt7bmFtZTp0aGlzLmVudHJ5QW5pbWF0aW9uLG5vZGU6dGhpc31dfSxfZXhpdEFuaW1hdGlvbkNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGlvbkNvbmZpZz10aGlzLmFuaW1hdGlvbkNvbmZpZ3x8e307dGhpcy5hbmltYXRpb25Db25maWcuZXhpdD1be25hbWU6dGhpcy5leGl0QW5pbWF0aW9uLG5vZGU6dGhpc31dfSxfY29weVByb3BlcnRpZXM6ZnVuY3Rpb24oYiwKZCl7Zm9yKHZhciBmIGluIGQpYltmXT1kW2ZdfSxfY2xvbmVDb25maWc6ZnVuY3Rpb24oYil7dmFyIGQ9e2lzQ2xvbmU6ITB9O3RoaXMuX2NvcHlQcm9wZXJ0aWVzKGQsYik7cmV0dXJuIGR9LF9nZXRBbmltYXRpb25Db25maWdSZWN1cnNpdmU6ZnVuY3Rpb24oYixkLGYpe2lmKHRoaXMuYW5pbWF0aW9uQ29uZmlnKWlmKHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlJiYiZnVuY3Rpb24iPT09dHlwZW9mIHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlKXRoaXMuX3dhcm4odGhpcy5fbG9nZigicGxheUFuaW1hdGlvbiIsIlBsZWFzZSBwdXQgJ2FuaW1hdGlvbkNvbmZpZycgaW5zaWRlIG9mIHlvdXIgY29tcG9uZW50cyAncHJvcGVydGllcycgb2JqZWN0IGluc3RlYWQgb2Ygb3V0c2lkZSBvZiBpdC4iKSk7ZWxzZXt2YXIgaD1iP3RoaXMuYW5pbWF0aW9uQ29uZmlnW2JdOnRoaXMuYW5pbWF0aW9uQ29uZmlnO0FycmF5LmlzQXJyYXkoaCl8fChoPVtoXSk7aWYoaClmb3IodmFyIGssdD0wO2s9CmhbdF07dCsrKWlmKGsuYW5pbWF0YWJsZSlrLmFuaW1hdGFibGUuX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZShrLnR5cGV8fGIsZCxmKTtlbHNlIGlmKGsuaWQpe3ZhciBsPWRbay5pZF07bD8obC5pc0Nsb25lfHwoZFtrLmlkXT10aGlzLl9jbG9uZUNvbmZpZyhsKSxsPWRbay5pZF0pLHRoaXMuX2NvcHlQcm9wZXJ0aWVzKGwsaykpOmRbay5pZF09a31lbHNlIGYucHVzaChrKX19LGdldEFuaW1hdGlvbkNvbmZpZzpmdW5jdGlvbihiKXt2YXIgZD17fSxmPVtdO3RoaXMuX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZShiLGQsZik7Zm9yKHZhciBoIGluIGQpZi5wdXNoKGRbaF0pO3JldHVybiBmfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vbmVvbi1hbmltYXRpb24vbmVvbi1hbmltYXRpb24tcnVubmVyLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3JJbXBsPXtfY29uZmlndXJlQW5pbWF0aW9uczpmdW5jdGlvbihiKXt2YXIgZD1bXSxmPVtdO2lmKDA8Yi5sZW5ndGgpZm9yKHZhciBoLGs9MDtoPWJba107aysrKXt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGgubmFtZSk7aWYodC5pc05lb25BbmltYXRpb24pe3ZhciBsPW51bGw7dC5jb25maWd1cmV8fCh0LmNvbmZpZ3VyZT1mdW5jdGlvbigpe3JldHVybiBudWxsfSk7bD10LmNvbmZpZ3VyZShoKTtmLnB1c2goe3Jlc3VsdDpsLGNvbmZpZzpofSl9ZWxzZSBjb25zb2xlLndhcm4odGhpcy5pcysiOiIsaC5uYW1lLCJub3QgZm91bmQhIil9Zm9yKGI9MDtiPGYubGVuZ3RoO2IrKyl7bD1mW2JdLnJlc3VsdDtoPWZbYl0uY29uZmlnO3RyeXsiZnVuY3Rpb24iIT10eXBlb2YgbC5jYW5jZWwmJihsPWRvY3VtZW50LnRpbWVsaW5lLnBsYXkobCkpfWNhdGNoKHApe2w9bnVsbCxjb25zb2xlLndhcm4oIkNvdWxkbnQgcGxheSIsCiIoIixoLm5hbWUsIikuIixwKX1sJiZkLnB1c2goe25lb25BbmltYXRpb246dCxjb25maWc6aCxhbmltYXRpb246bH0pfXJldHVybiBkfSxfc2hvdWxkQ29tcGxldGU6ZnVuY3Rpb24oYil7Zm9yKHZhciBkPSEwLGY9MDtmPGIubGVuZ3RoO2YrKylpZigiZmluaXNoZWQiIT1iW2ZdLmFuaW1hdGlvbi5wbGF5U3RhdGUpe2Q9ITE7YnJlYWt9cmV0dXJuIGR9LF9jb21wbGV0ZTpmdW5jdGlvbihiKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKyliW2RdLm5lb25BbmltYXRpb24uY29tcGxldGUoYltkXS5jb25maWcpO2ZvcihkPTA7ZDxiLmxlbmd0aDtkKyspYltkXS5hbmltYXRpb24uY2FuY2VsKCl9LHBsYXlBbmltYXRpb246ZnVuY3Rpb24oYixkKXt2YXIgZj10aGlzLmdldEFuaW1hdGlvbkNvbmZpZyhiKTtpZihmKXt0aGlzLl9hY3RpdmU9dGhpcy5fYWN0aXZlfHx7fTt0aGlzLl9hY3RpdmVbYl0mJih0aGlzLl9jb21wbGV0ZSh0aGlzLl9hY3RpdmVbYl0pLGRlbGV0ZSB0aGlzLl9hY3RpdmVbYl0pOwp2YXIgaD10aGlzLl9jb25maWd1cmVBbmltYXRpb25zKGYpO2lmKDA9PWgubGVuZ3RoKXRoaXMuZmlyZSgibmVvbi1hbmltYXRpb24tZmluaXNoIixkLHtidWJibGVzOiExfSk7ZWxzZSBmb3IodGhpcy5fYWN0aXZlW2JdPWgsZj0wO2Y8aC5sZW5ndGg7ZisrKWhbZl0uYW5pbWF0aW9uLm9uZmluaXNoPWZ1bmN0aW9uKCl7dGhpcy5fc2hvdWxkQ29tcGxldGUoaCkmJih0aGlzLl9jb21wbGV0ZShoKSxkZWxldGUgdGhpcy5fYWN0aXZlW2JdLHRoaXMuZmlyZSgibmVvbi1hbmltYXRpb24tZmluaXNoIixkLHtidWJibGVzOiExfSkpfS5iaW5kKHRoaXMpfX0sY2FuY2VsQW5pbWF0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciBiIGluIHRoaXMuX2FjdGl2ZSl7dmFyIGQ9dGhpcy5fYWN0aXZlW2JdLGY7Zm9yKGYgaW4gZClkW2ZdLmFuaW1hdGlvbi5jYW5jZWwoKX10aGlzLl9hY3RpdmU9e319fTsKUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3I9W1BvbHltZXIuTmVvbkFuaW1hdGFibGVCZWhhdmlvcixQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tZHJvcGRvd24vaXJvbi1kcm9wZG93bi1zY3JvbGwtbWFuYWdlci5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIuSXJvbkRyb3Bkb3duU2Nyb2xsTWFuYWdlcj1Qb2x5bWVyLklyb25TY3JvbGxNYW5hZ2VyfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWRyb3Bkb3duL2lyb24tZHJvcGRvd24uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoiaXJvbi1kcm9wZG93biIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcixQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3IsUG9seW1lci5OZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3JdLHByb3BlcnRpZXM6e2hvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxvcGVuQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sY2xvc2VBbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0fSxmb2N1c1RhcmdldDp7dHlwZTpPYmplY3R9LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbGxvd091dHNpZGVTY3JvbGw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2FsbG93T3V0c2lkZVNjcm9sbENoYW5nZWQifX0sCmxpc3RlbmVyczp7Im5lb24tYW5pbWF0aW9uLWZpbmlzaCI6Il9vbk5lb25BbmltYXRpb25GaW5pc2gifSxvYnNlcnZlcnM6WyJfdXBkYXRlT3ZlcmxheVBvc2l0aW9uKHBvc2l0aW9uVGFyZ2V0LCB2ZXJ0aWNhbEFsaWduLCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsT2Zmc2V0LCBob3Jpem9udGFsT2Zmc2V0KSJdLGdldCBjb250YWluZWRFbGVtZW50KCl7Zm9yKHZhciBiPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksZD0wLGY9Yi5sZW5ndGg7ZDxmO2QrKylpZihiW2RdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGJbZF19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxBY3Rpb258fCh0aGlzLnNjcm9sbEFjdGlvbj10aGlzLmFsbG93T3V0c2lkZVNjcm9sbD8icmVmaXQiOiJsb2NrIik7dGhpcy5fcmVhZGllZD0hMH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnNpemluZ1RhcmdldCYmdGhpcy5zaXppbmdUYXJnZXQhPT0KdGhpc3x8KHRoaXMuc2l6aW5nVGFyZ2V0PXRoaXMuY29udGFpbmVkRWxlbWVudHx8dGhpcyl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxBbmltYXRpb24oKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5kaXNhYmxlZD90aGlzLmNhbmNlbCgpOih0aGlzLmNhbmNlbEFuaW1hdGlvbigpLHRoaXMuX3VwZGF0ZUFuaW1hdGlvbkNvbmZpZygpLFBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX29wZW5lZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3JlbmRlck9wZW5lZDpmdW5jdGlvbigpeyF0aGlzLm5vQW5pbWF0aW9ucyYmdGhpcy5hbmltYXRpb25Db25maWcub3Blbj8odGhpcy4kLmNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoImFuaW1hdGluZyIpLHRoaXMucGxheUFuaW1hdGlvbigib3BlbiIpKTpQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9yZW5kZXJPcGVuZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSwKX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpeyF0aGlzLm5vQW5pbWF0aW9ucyYmdGhpcy5hbmltYXRpb25Db25maWcuY2xvc2U/KHRoaXMuJC5jb250ZW50V3JhcHBlci5jbGFzc0xpc3QuYWRkKCJhbmltYXRpbmciKSx0aGlzLnBsYXlBbmltYXRpb24oImNsb3NlIikpOlBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX3JlbmRlckNsb3NlZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9vbk5lb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLiQuY29udGVudFdyYXBwZXIuY2xhc3NMaXN0LnJlbW92ZSgiYW5pbWF0aW5nIik7dGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCl9LF91cGRhdGVBbmltYXRpb25Db25maWc6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5jb250YWluZWRFbGVtZW50LGQ9W10uY29uY2F0KHRoaXMub3BlbkFuaW1hdGlvbkNvbmZpZ3x8W10pLmNvbmNhdCh0aGlzLmNsb3NlQW5pbWF0aW9uQ29uZmlnfHwKW10pLGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLm5vZGU9Yjt0aGlzLmFuaW1hdGlvbkNvbmZpZz17b3Blbjp0aGlzLm9wZW5BbmltYXRpb25Db25maWcsY2xvc2U6dGhpcy5jbG9zZUFuaW1hdGlvbkNvbmZpZ319LF91cGRhdGVPdmVybGF5UG9zaXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWQmJnRoaXMubm90aWZ5UmVzaXplKCl9LF9hbGxvd091dHNpZGVTY3JvbGxDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX3JlYWRpZWQmJihiP3RoaXMuc2Nyb2xsQWN0aW9uJiYibG9jayIhPT10aGlzLnNjcm9sbEFjdGlvbnx8KHRoaXMuc2Nyb2xsQWN0aW9uPSJyZWZpdCIpOnRoaXMuc2Nyb2xsQWN0aW9uPSJsb2NrIil9LF9hcHBseUZvY3VzOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5mb2N1c1RhcmdldHx8dGhpcy5jb250YWluZWRFbGVtZW50O2ImJnRoaXMub3BlbmVkJiYhdGhpcy5ub0F1dG9Gb2N1cz9iLmZvY3VzKCk6UG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9ySW1wbC5fYXBwbHlGb2N1cy5hcHBseSh0aGlzLAphcmd1bWVudHMpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9uZW9uLWFuaW1hdGlvbi9uZW9uLWFuaW1hdGlvbi1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthbmltYXRpb25UaW1pbmc6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue2R1cmF0aW9uOjUwMCxlYXNpbmc6ImN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSkiLGZpbGw6ImJvdGgifX19fSxpc05lb25BbmltYXRpb246ITAsY3JlYXRlZDpmdW5jdGlvbigpe2RvY3VtZW50LmJvZHkuYW5pbWF0ZXx8Y29uc29sZS53YXJuKCJObyB3ZWIgYW5pbWF0aW9ucyBkZXRlY3RlZC4gVGhpcyBlbGVtZW50IHdpbGwgbm90IGZ1bmN0aW9uIHdpdGhvdXQgYSB3ZWIgYW5pbWF0aW9ucyBwb2x5ZmlsbC4iKX0sdGltaW5nRnJvbUNvbmZpZzpmdW5jdGlvbihiKXtpZihiLnRpbWluZylmb3IodmFyIGQgaW4gYi50aW1pbmcpdGhpcy5hbmltYXRpb25UaW1pbmdbZF09Yi50aW1pbmdbZF07cmV0dXJuIHRoaXMuYW5pbWF0aW9uVGltaW5nfSxzZXRQcmVmaXhlZFByb3BlcnR5OmZ1bmN0aW9uKGIsZCxmKXtmb3IodmFyIGg9Cnt0cmFuc2Zvcm06WyJ3ZWJraXRUcmFuc2Zvcm0iXSx0cmFuc2Zvcm1PcmlnaW46WyJtb3pUcmFuc2Zvcm1PcmlnaW4iLCJ3ZWJraXRUcmFuc2Zvcm1PcmlnaW4iXX1bZF0sayx0PTA7az1oW3RdO3QrKyliLnN0eWxlW2tdPWY7Yi5zdHlsZVtkXT1mfSxjb21wbGV0ZTpmdW5jdGlvbigpe319OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL25lb24tYW5pbWF0aW9uL2FuaW1hdGlvbnMvZmFkZS1pbi1hbmltYXRpb24uaHRtbC5qcwpQb2x5bWVyKHtpczoiZmFkZS1pbi1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChiLm5vZGUsW3tvcGFjaXR5OiIwIn0se29wYWNpdHk6IjEifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9uZW9uLWFuaW1hdGlvbi9hbmltYXRpb25zL2ZhZGUtb3V0LWFuaW1hdGlvbi5odG1sLmpzClBvbHltZXIoe2lzOiJmYWRlLW91dC1hbmltYXRpb24iLGJlaGF2aW9yczpbUG9seW1lci5OZW9uQW5pbWF0aW9uQmVoYXZpb3JdLGNvbmZpZ3VyZTpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChiLm5vZGUsW3tvcGFjaXR5OiIxIn0se29wYWNpdHk6IjAifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1tZW51LWJ1dHRvbi9wYXBlci1tZW51LWJ1dHRvbi1hbmltYXRpb25zLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLW1lbnUtZ3Jvdy1oZWlnaHQtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5ub2RlLGY9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoZCxbe2hlaWdodDpmLzIrInB4In0se2hlaWdodDpmKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pO1BvbHltZXIoe2lzOiJwYXBlci1tZW51LWdyb3ctd2lkdGgtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5ub2RlLGY9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChkLFt7d2lkdGg6Zi8yKyJweCJ9LHt3aWR0aDpmKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pOwpQb2x5bWVyKHtpczoicGFwZXItbWVudS1zaHJpbmstd2lkdGgtYW5pbWF0aW9uIixiZWhhdmlvcnM6W1BvbHltZXIuTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSxjb25maWd1cmU6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5ub2RlLGY9ZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChkLFt7d2lkdGg6ZisicHgifSx7d2lkdGg6Zi1mLzIwKyJweCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcoYikpfX0pOwpQb2x5bWVyKHtpczoicGFwZXItbWVudS1zaHJpbmstaGVpZ2h0LWFuaW1hdGlvbiIsYmVoYXZpb3JzOltQb2x5bWVyLk5lb25BbmltYXRpb25CZWhhdmlvcl0sY29uZmlndXJlOmZ1bmN0aW9uKGIpe3ZhciBkPWIubm9kZSxmPWQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O3RoaXMuc2V0UHJlZml4ZWRQcm9wZXJ0eShkLCJ0cmFuc2Zvcm1PcmlnaW4iLCIwIDAiKTtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChkLFt7aGVpZ2h0OmYrInB4Iix0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkifSx7aGVpZ2h0OmYvMisicHgiLHRyYW5zZm9ybToidHJhbnNsYXRlWSgtMjBweCkifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKGIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1tZW51LWJ1dHRvbi9wYXBlci1tZW51LWJ1dHRvbi5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtBTklNQVRJT05fQ1VCSUNfQkVaSUVSOiJjdWJpYy1iZXppZXIoLjMsLjk1LC41LDEpIixNQVhfQU5JTUFUSU9OX1RJTUVfTVM6NDAwfTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbj1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLnJlZ2lzdGVyZWQ9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5hZGRPd25LZXlCaW5kaW5nPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUucmVtb3ZlT3duS2V5QmluZGluZ3M9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXM9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fY29sbGVjdEtleUJpbmRpbmdzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3ByZXBLZXlCaW5kaW5ncz0KZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fYWRkS2V5QmluZGluZz1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b24ucHJvdG90eXBlLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzPWZ1bmN0aW9uKCl7fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fb25LZXlCaW5kaW5nRXZlbnQ9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fdHJpZ2dlcktleUhhbmRsZXI9ZnVuY3Rpb24oKXt9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fZm9jdXNCbHVySGFuZGxlcj1mdW5jdGlvbihkKXtpZihQb2x5bWVyLkVsZW1lbnQpdGhpcy5fc2V0Rm9jdXNlZCgiZm9jdXMiPT09CmQudHlwZSk7ZWxzZSBpZihkLnRhcmdldD09PXRoaXMpdGhpcy5fc2V0Rm9jdXNlZCgiZm9jdXMiPT09ZC50eXBlKTtlbHNlIGlmKHRoaXMuX19oYW5kbGVFdmVudFJldGFyZ2V0aW5nKXt2YXIgZj1Qb2x5bWVyLmRvbShkKS5sb2NhbFRhcmdldDt0aGlzLmlzTGlnaHREZXNjZW5kYW50KGYpfHx0aGlzLmZpcmUoZC50eXBlLHtzb3VyY2VFdmVudDpkfSx7bm9kZTp0aGlzLGJ1YmJsZXM6ZC5idWJibGVzLGNhbmNlbGFibGU6ZC5jYW5jZWxhYmxlfSl9fTtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbi5wcm90b3R5cGUuX2NoYW5nZWRDb250cm9sU3RhdGU9ZnVuY3Rpb24oKXt0aGlzLl9jb250cm9sU3RhdGVDaGFuZ2VkJiZ0aGlzLl9jb250cm9sU3RhdGVDaGFuZ2VkKCl9O1BvbHltZXIuUGFwZXJNZW51QnV0dG9uLnByb3RvdHlwZS5fc2V0Rm9jdXNlZD1mdW5jdGlvbigpe307UG9seW1lci5QYXBlck1lbnVCdXR0b249UG9seW1lcih7aXM6InBhcGVyLW1lbnUtYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsClBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZV0scHJvcGVydGllczp7b3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxkeW5hbWljQWxpZ246e3R5cGU6Qm9vbGVhbn0saG9yaXpvbnRhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LHZlcnRpY2FsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sbm9PdmVybGFwOnt0eXBlOkJvb2xlYW59LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpZ25vcmVTZWxlY3Q6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sY2xvc2VPbkFjdGl2YXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG9wZW5BbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LAp2YWx1ZTpmdW5jdGlvbigpe3JldHVyblt7bmFtZToiZmFkZS1pbi1hbmltYXRpb24iLHRpbWluZzp7ZGVsYXk6MTAwLGR1cmF0aW9uOjIwMH19LHtuYW1lOiJwYXBlci1tZW51LWdyb3ctd2lkdGgtYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjoxNTAsZWFzaW5nOmIuQU5JTUFUSU9OX0NVQklDX0JFWklFUn19LHtuYW1lOiJwYXBlci1tZW51LWdyb3ctaGVpZ2h0LWFuaW1hdGlvbiIsdGltaW5nOntkZWxheToxMDAsZHVyYXRpb246Mjc1LGVhc2luZzpiLkFOSU1BVElPTl9DVUJJQ19CRVpJRVJ9fV19fSxjbG9zZUFuaW1hdGlvbkNvbmZpZzp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5be25hbWU6ImZhZGUtb3V0LWFuaW1hdGlvbiIsdGltaW5nOntkdXJhdGlvbjoxNTB9fSx7bmFtZToicGFwZXItbWVudS1zaHJpbmstd2lkdGgtYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjo1MCxlYXNpbmc6Yi5BTklNQVRJT05fQ1VCSUNfQkVaSUVSfX0sCntuYW1lOiJwYXBlci1tZW51LXNocmluay1oZWlnaHQtYW5pbWF0aW9uIix0aW1pbmc6e2R1cmF0aW9uOjIwMCxlYXNpbmc6ImVhc2UtaW4ifX1dfX0sYWxsb3dPdXRzaWRlU2Nyb2xsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX2Ryb3Bkb3duQ29udGVudDp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToiZ3JvdXAiLCJhcmlhLWhhc3BvcHVwIjoidHJ1ZSJ9LGxpc3RlbmVyczp7Imlyb24tYWN0aXZhdGUiOiJfb25Jcm9uQWN0aXZhdGUiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QifSxnZXQgY29udGVudEVsZW1lbnQoKXtmb3IodmFyIGQ9UG9seW1lci5kb20odGhpcy4kLmNvbnRlbnQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKSxmPTAsaD1kLmxlbmd0aDtmPGg7ZisrKWlmKGRbZl0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gZFtmXX0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ/CnRoaXMuY2xvc2UoKTp0aGlzLm9wZW4oKX0sb3BlbjpmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWR8fHRoaXMuJC5kcm9wZG93bi5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy4kLmRyb3Bkb3duLmNsb3NlKCl9LF9vbklyb25TZWxlY3Q6ZnVuY3Rpb24oKXt0aGlzLmlnbm9yZVNlbGVjdHx8dGhpcy5jbG9zZSgpfSxfb25Jcm9uQWN0aXZhdGU6ZnVuY3Rpb24oKXt0aGlzLmNsb3NlT25BY3RpdmF0ZSYmdGhpcy5jbG9zZSgpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbihkLGYpe2Q/KHRoaXMuX2Ryb3Bkb3duQ29udGVudD10aGlzLmNvbnRlbnRFbGVtZW50LHRoaXMuZmlyZSgicGFwZXItZHJvcGRvd24tb3BlbiIpKTpudWxsIT1mJiZ0aGlzLmZpcmUoInBhcGVyLWRyb3Bkb3duLWNsb3NlIil9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oZCl7UG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLl9kaXNhYmxlZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpO2QmJnRoaXMub3BlbmVkJiYKdGhpcy5jbG9zZSgpfSxfX29uSXJvbk92ZXJsYXlDYW5jZWxlZDpmdW5jdGlvbihkKXt2YXIgZj10aGlzLiQudHJpZ2dlcjstMTxQb2x5bWVyLmRvbShkLmRldGFpbCkucGF0aC5pbmRleE9mKGYpJiZkLnByZXZlbnREZWZhdWx0KCl9fSk7T2JqZWN0LmtleXMoYikuZm9yRWFjaChmdW5jdGlvbihkKXtQb2x5bWVyLlBhcGVyTWVudUJ1dHRvbltkXT1iW2RdfSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24taWNvbnNldC1zdmcvaXJvbi1pY29uc2V0LXN2Zy5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWljb25zZXQtc3ZnIixwcm9wZXJ0aWVzOntuYW1lOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX25hbWVDaGFuZ2VkIn0sc2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MjR9LHJ0bE1pcnJvcmluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSx1c2VHbG9iYWxSdGxBdHRyaWJ1dGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhPW5ldyBQb2x5bWVyLklyb25NZXRhKHt0eXBlOiJpY29uc2V0IixrZXk6bnVsbCx2YWx1ZTpudWxsfSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIn0sZ2V0SWNvbk5hbWVzOmZ1bmN0aW9uKCl7dGhpcy5faWNvbnM9dGhpcy5fY3JlYXRlSWNvbk1hcCgpO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9pY29ucykubWFwKGZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLm5hbWUrIjoiK2J9LHRoaXMpfSxhcHBseUljb246ZnVuY3Rpb24oYixkKXt0aGlzLnJlbW92ZUljb24oYik7CmlmKGQ9dGhpcy5fY2xvbmVJY29uKGQsdGhpcy5ydGxNaXJyb3JpbmcmJnRoaXMuX3RhcmdldElzUlRMKGIpKSl7dmFyIGY9UG9seW1lci5kb20oYi5yb290fHxiKTtmLmluc2VydEJlZm9yZShkLGYuY2hpbGROb2Rlc1swXSk7cmV0dXJuIGIuX3N2Z0ljb249ZH1yZXR1cm4gbnVsbH0scmVtb3ZlSWNvbjpmdW5jdGlvbihiKXtiLl9zdmdJY29uJiYoUG9seW1lci5kb20oYi5yb290fHxiKS5yZW1vdmVDaGlsZChiLl9zdmdJY29uKSxiLl9zdmdJY29uPW51bGwpfSxfdGFyZ2V0SXNSVEw6ZnVuY3Rpb24oYil7bnVsbD09dGhpcy5fX3RhcmdldElzUlRMJiYodGhpcy51c2VHbG9iYWxSdGxBdHRyaWJ1dGU/dGhpcy5fX3RhcmdldElzUlRMPSJydGwiPT09KGRvY3VtZW50LmJvZHkmJmRvY3VtZW50LmJvZHkuaGFzQXR0cmlidXRlKCJkaXIiKT9kb2N1bWVudC5ib2R5OmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkuZ2V0QXR0cmlidXRlKCJkaXIiKTooYiYmYi5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFJiYKKGI9Yi5ob3N0KSx0aGlzLl9fdGFyZ2V0SXNSVEw9YiYmInJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShiKS5kaXJlY3Rpb24pKTtyZXR1cm4gdGhpcy5fX3RhcmdldElzUlRMfSxfbmFtZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhLnZhbHVlPW51bGw7dGhpcy5fbWV0YS5rZXk9dGhpcy5uYW1lO3RoaXMuX21ldGEudmFsdWU9dGhpczt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5maXJlKCJpcm9uLWljb25zZXQtYWRkZWQiLHRoaXMse25vZGU6d2luZG93fSl9KX0sX2NyZWF0ZUljb25NYXA6ZnVuY3Rpb24oKXt2YXIgYj1PYmplY3QuY3JlYXRlKG51bGwpO1BvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZF0iKS5mb3JFYWNoKGZ1bmN0aW9uKGQpe2JbZC5pZF09ZH0pO3JldHVybiBifSxfY2xvbmVJY29uOmZ1bmN0aW9uKGIsZCl7dGhpcy5faWNvbnM9dGhpcy5faWNvbnN8fHRoaXMuX2NyZWF0ZUljb25NYXAoKTtyZXR1cm4gdGhpcy5fcHJlcGFyZVN2Z0Nsb25lKHRoaXMuX2ljb25zW2JdLAp0aGlzLnNpemUsZCl9LF9wcmVwYXJlU3ZnQ2xvbmU6ZnVuY3Rpb24oYixkLGYpe2lmKGIpe2I9Yi5jbG9uZU5vZGUoITApO3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJzdmciKTtkPWIuZ2V0QXR0cmlidXRlKCJ2aWV3Qm94Iil8fCIwIDAgIitkKyIgIitkO3ZhciBrPSJwb2ludGVyLWV2ZW50czogbm9uZTsgZGlzcGxheTogYmxvY2s7IHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7IjtmJiZiLmhhc0F0dHJpYnV0ZSgibWlycm9yLWluLXJ0bCIpJiYoays9Ii13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC0xLDEpO3RyYW5zZm9ybTpzY2FsZSgtMSwxKTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjsiKTtoLnNldEF0dHJpYnV0ZSgidmlld0JveCIsZCk7aC5zZXRBdHRyaWJ1dGUoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCBtZWV0Iik7aC5zZXRBdHRyaWJ1dGUoImZvY3VzYWJsZSIsImZhbHNlIik7aC5zdHlsZS5jc3NUZXh0PQprO2guYXBwZW5kQ2hpbGQoYikucmVtb3ZlQXR0cmlidXRlKCJpZCIpO3JldHVybiBofXJldHVybiBudWxsfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRyb3Bkb3duLW1lbnUvcGFwZXItZHJvcGRvd24tbWVudS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJwYXBlci1kcm9wZG93bi1tZW51IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZSxQb2x5bWVyLklyb25Gb3JtRWxlbWVudEJlaGF2aW9yLFBvbHltZXIuSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NlbGVjdGVkSXRlbUxhYmVsOnt0eXBlOlN0cmluZyxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSx2YWx1ZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxsYWJlbDp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZ30sZXJyb3JNZXNzYWdlOnt0eXBlOlN0cmluZ30sb3BlbmVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LGFsbG93T3V0c2lkZVNjcm9sbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbiwKdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxhbHdheXNGbG9hdExhYmVsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG5vQW5pbWF0aW9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJyaWdodCJ9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AifSx2ZXJ0aWNhbE9mZnNldDpOdW1iZXIsZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LHJlc3RvcmVGb2N1c09uQ2xvc2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LGxpc3RlbmVyczp7dGFwOiJfb25UYXAifSxrZXlCaW5kaW5nczp7InVwIGRvd24iOiJvcGVuIixlc2M6ImNsb3NlIn0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImNvbWJvYm94IiwiYXJpYS1hdXRvY29tcGxldGUiOiJub25lIiwiYXJpYS1oYXNwb3B1cCI6InRydWUifSxvYnNlcnZlcnM6WyJfc2VsZWN0ZWRJdGVtQ2hhbmdlZChzZWxlY3RlZEl0ZW0pIl0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt2YXIgYj0KdGhpcy5jb250ZW50RWxlbWVudDtiJiZiLnNlbGVjdGVkSXRlbSYmdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGIuc2VsZWN0ZWRJdGVtKX0sZ2V0IGNvbnRlbnRFbGVtZW50KCl7Zm9yKHZhciBiPVBvbHltZXIuZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksZD0wLGY9Yi5sZW5ndGg7ZDxmO2QrKylpZihiW2RdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIGJbZF19LG9wZW46ZnVuY3Rpb24oKXt0aGlzLiQubWVudUJ1dHRvbi5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy4kLm1lbnVCdXR0b24uY2xvc2UoKX0sX29uSXJvblNlbGVjdDpmdW5jdGlvbihiKXt0aGlzLl9zZXRTZWxlY3RlZEl0ZW0oYi5kZXRhaWwuaXRlbSl9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbigpe3RoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKX0sX29uVGFwOmZ1bmN0aW9uKGIpe1BvbHltZXIuR2VzdHVyZXMuZmluZE9yaWdpbmFsVGFyZ2V0KGIpPT09dGhpcyYmCnRoaXMub3BlbigpfSxfc2VsZWN0ZWRJdGVtQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnZhbHVlPWI9Yj9iLmxhYmVsfHxiLmdldEF0dHJpYnV0ZSgibGFiZWwiKXx8Yi50ZXh0Q29udGVudC50cmltKCk6IiI7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtTGFiZWwoYil9LF9jb21wdXRlTWVudVZlcnRpY2FsT2Zmc2V0OmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGQ/ZDpiPy00Ojh9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5yZXF1aXJlZHx8dGhpcy5yZXF1aXJlZCYmISF0aGlzLnZhbHVlfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMub3BlbmVkPyJ0cnVlIjoiZmFsc2UiLGQ9dGhpcy5jb250ZW50RWxlbWVudDtkJiZkLnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsYil9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3Rpb24uaHRtbC5qcwpQb2x5bWVyLklyb25TZWxlY3Rpb249ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3Rpb249W107dGhpcy5zZWxlY3RDYWxsYmFjaz1ifTsKUG9seW1lci5Jcm9uU2VsZWN0aW9uLnByb3RvdHlwZT17Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubXVsdGk/dGhpcy5zZWxlY3Rpb24uc2xpY2UoKTp0aGlzLnNlbGVjdGlvblswXX0sY2xlYXI6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3Rpb24uc2xpY2UoKS5mb3JFYWNoKGZ1bmN0aW9uKGQpeyghYnx8MD5iLmluZGV4T2YoZCkpJiZ0aGlzLnNldEl0ZW1TZWxlY3RlZChkLCExKX0sdGhpcyl9LGlzU2VsZWN0ZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIDA8PXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYil9LHNldEl0ZW1TZWxlY3RlZDpmdW5jdGlvbihiLGQpe2lmKG51bGwhPWImJmQhPT10aGlzLmlzU2VsZWN0ZWQoYikpe2lmKGQpdGhpcy5zZWxlY3Rpb24ucHVzaChiKTtlbHNle3ZhciBmPXRoaXMuc2VsZWN0aW9uLmluZGV4T2YoYik7MDw9ZiYmdGhpcy5zZWxlY3Rpb24uc3BsaWNlKGYsMSl9dGhpcy5zZWxlY3RDYWxsYmFjayYmdGhpcy5zZWxlY3RDYWxsYmFjayhiLGQpfX0sc2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMubXVsdGk/CnRoaXMudG9nZ2xlKGIpOnRoaXMuZ2V0KCkhPT1iJiYodGhpcy5zZXRJdGVtU2VsZWN0ZWQodGhpcy5nZXQoKSwhMSksdGhpcy5zZXRJdGVtU2VsZWN0ZWQoYiwhMCkpfSx0b2dnbGU6ZnVuY3Rpb24oYil7dGhpcy5zZXRJdGVtU2VsZWN0ZWQoYiwhdGhpcy5pc1NlbGVjdGVkKGIpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1zZWxlY3RhYmxlLmh0bWwuanMKUG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthdHRyRm9yU2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHNlbGVjdGVkOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxhY3RpdmF0ZUV2ZW50Ont0eXBlOlN0cmluZyx2YWx1ZToidGFwIixvYnNlcnZlcjoiX2FjdGl2YXRlRXZlbnRDaGFuZ2VkIn0sc2VsZWN0YWJsZTpTdHJpbmcsc2VsZWN0ZWRDbGFzczp7dHlwZTpTdHJpbmcsdmFsdWU6Imlyb24tc2VsZWN0ZWQifSxzZWxlY3RlZEF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZmFsbGJhY2tTZWxlY3Rpb246e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGl0ZW1zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX2V4Y2x1ZGVkTG9jYWxOYW1lczp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57dGVtcGxhdGU6MSwKImRvbS1iaW5kIjoxLCJkb20taWYiOjEsImRvbS1yZXBlYXQiOjF9fX19LG9ic2VydmVyczpbIl91cGRhdGVBdHRyRm9yU2VsZWN0ZWQoYXR0ckZvclNlbGVjdGVkKSIsIl91cGRhdGVTZWxlY3RlZChzZWxlY3RlZCkiLCJfY2hlY2tGYWxsYmFjayhmYWxsYmFja1NlbGVjdGlvbikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fYmluZEZpbHRlckl0ZW09dGhpcy5fZmlsdGVySXRlbS5iaW5kKHRoaXMpO3RoaXMuX3NlbGVjdGlvbj1uZXcgUG9seW1lci5Jcm9uU2VsZWN0aW9uKHRoaXMuX2FwcGx5U2VsZWN0aW9uLmJpbmQodGhpcykpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPXRoaXMuX29ic2VydmVJdGVtcyh0aGlzKTt0aGlzLl9hZGRMaXN0ZW5lcih0aGlzLmFjdGl2YXRlRXZlbnQpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiZQb2x5bWVyLmRvbSh0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlcik7dGhpcy5fcmVtb3ZlTGlzdGVuZXIodGhpcy5hY3RpdmF0ZUV2ZW50KX0sCmluZGV4T2Y6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuaXRlbXM/dGhpcy5pdGVtcy5pbmRleE9mKGIpOi0xfSxzZWxlY3Q6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3RlZD1ifSxzZWxlY3RQcmV2aW91czpmdW5jdGlvbigpe3ZhciBiPXRoaXMuaXRlbXMubGVuZ3RoO2I9KE51bWJlcih0aGlzLl92YWx1ZVRvSW5kZXgodGhpcy5zZWxlY3RlZCkpLTErYiklYjt0aGlzLnNlbGVjdGVkPXRoaXMuX2luZGV4VG9WYWx1ZShiKX0sc2VsZWN0TmV4dDpmdW5jdGlvbigpe3ZhciBiPShOdW1iZXIodGhpcy5fdmFsdWVUb0luZGV4KHRoaXMuc2VsZWN0ZWQpKSsxKSV0aGlzLml0ZW1zLmxlbmd0aDt0aGlzLnNlbGVjdGVkPXRoaXMuX2luZGV4VG9WYWx1ZShiKX0sc2VsZWN0SW5kZXg6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3QodGhpcy5faW5kZXhUb1ZhbHVlKGIpKX0sZm9yY2VTeW5jaHJvbm91c0l0ZW1VcGRhdGU6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlciYmImZ1bmN0aW9uIj09PXR5cGVvZiB0aGlzLl9vYnNlcnZlci5mbHVzaD8KdGhpcy5fb2JzZXJ2ZXIuZmx1c2goKTp0aGlzLl91cGRhdGVJdGVtcygpfSxnZXQgX3Nob3VsZFVwZGF0ZVNlbGVjdGlvbigpe3JldHVybiBudWxsIT10aGlzLnNlbGVjdGVkfSxfY2hlY2tGYWxsYmFjazpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCl9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLmxpc3Rlbih0aGlzLGIsIl9hY3RpdmF0ZUhhbmRsZXIiKX0sX3JlbW92ZUxpc3RlbmVyOmZ1bmN0aW9uKGIpe3RoaXMudW5saXN0ZW4odGhpcyxiLCJfYWN0aXZhdGVIYW5kbGVyIil9LF9hY3RpdmF0ZUV2ZW50Q2hhbmdlZDpmdW5jdGlvbihiLGQpe3RoaXMuX3JlbW92ZUxpc3RlbmVyKGQpO3RoaXMuX2FkZExpc3RlbmVyKGIpfSxfdXBkYXRlSXRlbXM6ZnVuY3Rpb24oKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHModGhpcy5zZWxlY3RhYmxlfHwiKiIpO2I9QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKGIsdGhpcy5fYmluZEZpbHRlckl0ZW0pOwp0aGlzLl9zZXRJdGVtcyhiKX0sX3VwZGF0ZUF0dHJGb3JTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWRJdGVtJiYodGhpcy5zZWxlY3RlZD10aGlzLl92YWx1ZUZvckl0ZW0odGhpcy5zZWxlY3RlZEl0ZW0pKX0sX3VwZGF0ZVNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5fc2VsZWN0U2VsZWN0ZWQodGhpcy5zZWxlY3RlZCl9LF9zZWxlY3RTZWxlY3RlZDpmdW5jdGlvbigpe2lmKHRoaXMuaXRlbXMpe3ZhciBiPXRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuc2VsZWN0ZWQpO2I/dGhpcy5fc2VsZWN0aW9uLnNlbGVjdChiKTp0aGlzLl9zZWxlY3Rpb24uY2xlYXIoKTt0aGlzLmZhbGxiYWNrU2VsZWN0aW9uJiZ0aGlzLml0ZW1zLmxlbmd0aCYmdm9pZCAwPT09dGhpcy5fc2VsZWN0aW9uLmdldCgpJiYodGhpcy5zZWxlY3RlZD10aGlzLmZhbGxiYWNrU2VsZWN0aW9uKX19LF9maWx0ZXJJdGVtOmZ1bmN0aW9uKGIpe3JldHVybiF0aGlzLl9leGNsdWRlZExvY2FsTmFtZXNbYi5sb2NhbE5hbWVdfSwKX3ZhbHVlVG9JdGVtOmZ1bmN0aW9uKGIpe3JldHVybiBudWxsPT1iP251bGw6dGhpcy5pdGVtc1t0aGlzLl92YWx1ZVRvSW5kZXgoYildfSxfdmFsdWVUb0luZGV4OmZ1bmN0aW9uKGIpe2lmKHRoaXMuYXR0ckZvclNlbGVjdGVkKWZvcih2YXIgZD0wLGY7Zj10aGlzLml0ZW1zW2RdO2QrKyl7aWYodGhpcy5fdmFsdWVGb3JJdGVtKGYpPT1iKXJldHVybiBkfWVsc2UgcmV0dXJuIE51bWJlcihiKX0sX2luZGV4VG9WYWx1ZTpmdW5jdGlvbihiKXtpZih0aGlzLmF0dHJGb3JTZWxlY3RlZCl7aWYoYj10aGlzLml0ZW1zW2JdKXJldHVybiB0aGlzLl92YWx1ZUZvckl0ZW0oYil9ZWxzZSByZXR1cm4gYn0sX3ZhbHVlRm9ySXRlbTpmdW5jdGlvbihiKXtpZighYilyZXR1cm4gbnVsbDtpZighdGhpcy5hdHRyRm9yU2VsZWN0ZWQpcmV0dXJuIGI9dGhpcy5pbmRleE9mKGIpLC0xPT09Yj9udWxsOmI7dmFyIGQ9YltQb2x5bWVyLkNhc2VNYXAuZGFzaFRvQ2FtZWxDYXNlKHRoaXMuYXR0ckZvclNlbGVjdGVkKV07CnJldHVybiB2b2lkIDAhPWQ/ZDpiLmdldEF0dHJpYnV0ZSh0aGlzLmF0dHJGb3JTZWxlY3RlZCl9LF9hcHBseVNlbGVjdGlvbjpmdW5jdGlvbihiLGQpe3RoaXMuc2VsZWN0ZWRDbGFzcyYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnNlbGVjdGVkQ2xhc3MsZCxiKTt0aGlzLnNlbGVjdGVkQXR0cmlidXRlJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLnNlbGVjdGVkQXR0cmlidXRlLGQsYik7dGhpcy5fc2VsZWN0aW9uQ2hhbmdlKCk7dGhpcy5maXJlKCJpcm9uLSIrKGQ/InNlbGVjdCI6ImRlc2VsZWN0Iikse2l0ZW06Yn0pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtKHRoaXMuX3NlbGVjdGlvbi5nZXQoKSl9LF9vYnNlcnZlSXRlbXM6ZnVuY3Rpb24oYil7cmV0dXJuIFBvbHltZXIuZG9tKGIpLm9ic2VydmVOb2RlcyhmdW5jdGlvbihkKXt0aGlzLl91cGRhdGVJdGVtcygpO3RoaXMuX3VwZGF0ZVNlbGVjdGVkKCk7dGhpcy5maXJlKCJpcm9uLWl0ZW1zLWNoYW5nZWQiLApkLHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KX0pfSxfYWN0aXZhdGVIYW5kbGVyOmZ1bmN0aW9uKGIpe2I9Yi50YXJnZXQ7Zm9yKHZhciBkPXRoaXMuaXRlbXM7YiYmYiE9dGhpczspe3ZhciBmPWQuaW5kZXhPZihiKTtpZigwPD1mKXtkPXRoaXMuX2luZGV4VG9WYWx1ZShmKTt0aGlzLl9pdGVtQWN0aXZhdGUoZCxiKTticmVha31iPWIucGFyZW50Tm9kZX19LF9pdGVtQWN0aXZhdGU6ZnVuY3Rpb24oYixkKXt0aGlzLmZpcmUoImlyb24tYWN0aXZhdGUiLHtzZWxlY3RlZDpiLGl0ZW06ZH0se2NhbmNlbGFibGU6ITB9KS5kZWZhdWx0UHJldmVudGVkfHx0aGlzLnNlbGVjdChiKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tc2VsZWN0b3IvaXJvbi1tdWx0aS1zZWxlY3RhYmxlLmh0bWwuanMKUG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOnttdWx0aTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJtdWx0aUNoYW5nZWQifSxzZWxlY3RlZFZhbHVlczp7dHlwZTpBcnJheSxub3RpZnk6ITAsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LHNlbGVjdGVkSXRlbXM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZVNlbGVjdGVkKHNlbGVjdGVkVmFsdWVzLnNwbGljZXMpIl0sc2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMubXVsdGk/dGhpcy5fdG9nZ2xlU2VsZWN0ZWQoYik6dGhpcy5zZWxlY3RlZD1ifSxtdWx0aUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fc2VsZWN0aW9uLm11bHRpPWI7dGhpcy5fdXBkYXRlU2VsZWN0ZWQoKX0sZ2V0IF9zaG91bGRVcGRhdGVTZWxlY3Rpb24oKXtyZXR1cm4gbnVsbCE9dGhpcy5zZWxlY3RlZHx8Cm51bGwhPXRoaXMuc2VsZWN0ZWRWYWx1ZXMmJnRoaXMuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RofSxfdXBkYXRlQXR0ckZvclNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5tdWx0aT90aGlzLnNlbGVjdGVkSXRlbXMmJjA8dGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCYmKHRoaXMuc2VsZWN0ZWRWYWx1ZXM9dGhpcy5zZWxlY3RlZEl0ZW1zLm1hcChmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5faW5kZXhUb1ZhbHVlKHRoaXMuaW5kZXhPZihiKSl9LHRoaXMpLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gbnVsbCE9Yn0sdGhpcykpOlBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fdXBkYXRlQXR0ckZvclNlbGVjdGVkLmFwcGx5KHRoaXMpfSxfdXBkYXRlU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLm11bHRpP3RoaXMuX3NlbGVjdE11bHRpKHRoaXMuc2VsZWN0ZWRWYWx1ZXMpOnRoaXMuX3NlbGVjdFNlbGVjdGVkKHRoaXMuc2VsZWN0ZWQpfSxfc2VsZWN0TXVsdGk6ZnVuY3Rpb24oYil7Yj0KYnx8W107Yj0odGhpcy5fdmFsdWVzVG9JdGVtcyhiKXx8W10pLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4gbnVsbCE9PWYmJnZvaWQgMCE9PWZ9KTt0aGlzLl9zZWxlY3Rpb24uY2xlYXIoYik7Zm9yKHZhciBkPTA7ZDxiLmxlbmd0aDtkKyspdGhpcy5fc2VsZWN0aW9uLnNldEl0ZW1TZWxlY3RlZChiW2RdLCEwKTt0aGlzLmZhbGxiYWNrU2VsZWN0aW9uJiYhdGhpcy5fc2VsZWN0aW9uLmdldCgpLmxlbmd0aCYmdGhpcy5fdmFsdWVUb0l0ZW0odGhpcy5mYWxsYmFja1NlbGVjdGlvbikmJnRoaXMuc2VsZWN0KHRoaXMuZmFsbGJhY2tTZWxlY3Rpb24pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fc2VsZWN0aW9uLmdldCgpO3RoaXMubXVsdGk/KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoYiksdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKGIubGVuZ3RoP2JbMF06bnVsbCkpOm51bGwhPT1iJiZ2b2lkIDAhPT1iPyh0aGlzLl9zZXRTZWxlY3RlZEl0ZW1zKFtiXSksCnRoaXMuX3NldFNlbGVjdGVkSXRlbShiKSk6KHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoW10pLHRoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKSl9LF90b2dnbGVTZWxlY3RlZDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLnNlbGVjdGVkVmFsdWVzLmluZGV4T2YoYik7MD5kP3RoaXMucHVzaCgic2VsZWN0ZWRWYWx1ZXMiLGIpOnRoaXMuc3BsaWNlKCJzZWxlY3RlZFZhbHVlcyIsZCwxKX0sX3ZhbHVlc1RvSXRlbXM6ZnVuY3Rpb24oYil7cmV0dXJuIG51bGw9PWI/bnVsbDpiLm1hcChmdW5jdGlvbihkKXtyZXR1cm4gdGhpcy5fdmFsdWVUb0l0ZW0oZCl9LHRoaXMpfX07UG9seW1lci5Jcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3I9W1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NdWx0aVNlbGVjdGFibGVCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbWVudS1iZWhhdmlvci9pcm9uLW1lbnUtYmVoYXZpb3IuaHRtbC5qcwpQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOntmb2N1c2VkSXRlbTp7b2JzZXJ2ZXI6Il9mb2N1c2VkSXRlbUNoYW5nZWQiLHJlYWRPbmx5OiEwLHR5cGU6T2JqZWN0fSxhdHRyRm9ySXRlbVRpdGxlOnt0eXBlOlN0cmluZ30sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCJ9fSxfTU9ESUZJRVJfS0VZUzoiQWx0IEFsdEdyYXBoIENhcHNMb2NrIENvbnRyb2wgRm4gRm5Mb2NrIEh5cGVyIE1ldGEgTnVtTG9jayBPUyBTY3JvbGxMb2NrIFNoaWZ0IFN1cGVyIFN5bWJvbCBTeW1ib2xMb2NrIi5zcGxpdCgiICIpLF9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUzoxRTMsX3ByZXZpb3VzVGFiSW5kZXg6MCxob3N0QXR0cmlidXRlczp7cm9sZToibWVudSJ9LG9ic2VydmVyczpbIl91cGRhdGVNdWx0aXNlbGVjdGFibGUobXVsdGkpIl0sbGlzdGVuZXJzOntmb2N1czoiX29uRm9jdXMiLGtleWRvd246Il9vbktleWRvd24iLAoiaXJvbi1pdGVtcy1jaGFuZ2VkIjoiX29uSXJvbkl0ZW1zQ2hhbmdlZCJ9LGtleUJpbmRpbmdzOnt1cDoiX29uVXBLZXkiLGRvd246Il9vbkRvd25LZXkiLGVzYzoiX29uRXNjS2V5Iiwic2hpZnQrdGFiOmtleWRvd24iOiJfb25TaGlmdFRhYkRvd24ifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3Jlc2V0VGFiaW5kaWNlcygpfSxzZWxlY3Q6ZnVuY3Rpb24oYil7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKTt2YXIgZD10aGlzLl92YWx1ZVRvSXRlbShiKTtkJiZkLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8KHRoaXMuX3NldEZvY3VzZWRJdGVtKGQpLFBvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9ySW1wbC5zZWxlY3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3Jlc2V0VGFiaW5kaWNlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMubXVsdGk/CnRoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihkKXtkLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLGQ9PT1iPyIwIjoiLTEiKX0sdGhpcyl9LF91cGRhdGVNdWx0aXNlbGVjdGFibGU6ZnVuY3Rpb24oYil7Yj90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1tdWx0aXNlbGVjdGFibGUiLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtbXVsdGlzZWxlY3RhYmxlIil9LF9mb2N1c1dpdGhLZXlib2FyZEV2ZW50OmZ1bmN0aW9uKGIpe2lmKC0xPT09dGhpcy5fTU9ESUZJRVJfS0VZUy5pbmRleE9mKGIua2V5KSl7dGhpcy5jYW5jZWxEZWJvdW5jZXIoIl9jbGVhclNlYXJjaFRleHQiKTt2YXIgZD10aGlzLl9zZWFyY2hUZXh0fHwiIjtkKz0oYi5rZXkmJjE9PWIua2V5Lmxlbmd0aD9iLmtleTpTdHJpbmcuZnJvbUNoYXJDb2RlKGIua2V5Q29kZSkpLnRvTG9jYWxlTG93ZXJDYXNlKCk7CmI9ZC5sZW5ndGg7Zm9yKHZhciBmPTAsaDtoPXRoaXMuaXRlbXNbZl07ZisrKWlmKCFoLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGs9dGhpcy5hdHRyRm9ySXRlbVRpdGxlfHwidGV4dENvbnRlbnQiO2s9KGhba118fGguZ2V0QXR0cmlidXRlKGspfHwiIikudHJpbSgpO2lmKCEoay5sZW5ndGg8YikmJmsuc2xpY2UoMCxiKS50b0xvY2FsZUxvd2VyQ2FzZSgpPT1kKXt0aGlzLl9zZXRGb2N1c2VkSXRlbShoKTticmVha319dGhpcy5fc2VhcmNoVGV4dD1kO3RoaXMuZGVib3VuY2UoIl9jbGVhclNlYXJjaFRleHQiLHRoaXMuX2NsZWFyU2VhcmNoVGV4dCx0aGlzLl9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUyl9fSxfY2xlYXJTZWFyY2hUZXh0OmZ1bmN0aW9uKCl7dGhpcy5fc2VhcmNoVGV4dD0iIn0sX2ZvY3VzUHJldmlvdXM6ZnVuY3Rpb24oKXtmb3IodmFyIGI9dGhpcy5pdGVtcy5sZW5ndGgsZD1OdW1iZXIodGhpcy5pbmRleE9mKHRoaXMuZm9jdXNlZEl0ZW0pKSxmPTE7ZjwKYisxO2YrKyl7dmFyIGg9dGhpcy5pdGVtc1soZC1mK2IpJWJdO2lmKCFoLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIGs9UG9seW1lci5kb20oaCkuZ2V0T3duZXJSb290KCl8fGRvY3VtZW50O3RoaXMuX3NldEZvY3VzZWRJdGVtKGgpO2lmKFBvbHltZXIuZG9tKGspLmFjdGl2ZUVsZW1lbnQ9PWgpYnJlYWt9fX0sX2ZvY3VzTmV4dDpmdW5jdGlvbigpe2Zvcih2YXIgYj10aGlzLml0ZW1zLmxlbmd0aCxkPU51bWJlcih0aGlzLmluZGV4T2YodGhpcy5mb2N1c2VkSXRlbSkpLGY9MTtmPGIrMTtmKyspe3ZhciBoPXRoaXMuaXRlbXNbKGQrZiklYl07aWYoIWguaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKXt2YXIgaz1Qb2x5bWVyLmRvbShoKS5nZXRPd25lclJvb3QoKXx8ZG9jdW1lbnQ7dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oaCk7aWYoUG9seW1lci5kb20oaykuYWN0aXZlRWxlbWVudD09aClicmVha319fSxfYXBwbHlTZWxlY3Rpb246ZnVuY3Rpb24oYixkKXtkP2Iuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIiwKInRydWUiKTpiLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1zZWxlY3RlZCIpO1BvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5fYXBwbHlTZWxlY3Rpb24uYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfZm9jdXNlZEl0ZW1DaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7ZCYmZC5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKTshYnx8Yi5oYXNBdHRyaWJ1dGUoImRpc2FibGVkIil8fHRoaXMuZGlzYWJsZWR8fChiLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCIwIiksYi5mb2N1cygpKX0sX29uSXJvbkl0ZW1zQ2hhbmdlZDpmdW5jdGlvbihiKXtiLmRldGFpbC5hZGRlZE5vZGVzLmxlbmd0aCYmdGhpcy5fcmVzZXRUYWJpbmRpY2VzKCl9LF9vblNoaWZ0VGFiRG93bjpmdW5jdGlvbigpe3ZhciBiPXRoaXMuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZD0hMDt0aGlzLl9zZXRGb2N1c2VkSXRlbShudWxsKTt0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLAoiLTEiKTt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixiKTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3JJbXBsLl9zaGlmdFRhYlByZXNzZWQ9ITF9LDEpfSxfb25Gb2N1czpmdW5jdGlvbihiKXshUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbC5fc2hpZnRUYWJQcmVzc2VkJiYoYj1Qb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0LGI9PT10aGlzfHwidW5kZWZpbmVkIj09PXR5cGVvZiBiLnRhYkluZGV4fHx0aGlzLmlzTGlnaHREZXNjZW5kYW50KGIpKSYmKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jPXRoaXMuYXN5bmMoZnVuY3Rpb24oKXt2YXIgZD10aGlzLm11bHRpP3RoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuX3NldEZvY3VzZWRJdGVtKG51bGwpO2Q/dGhpcy5fc2V0Rm9jdXNlZEl0ZW0oZCk6dGhpcy5pdGVtc1swXSYmdGhpcy5fZm9jdXNOZXh0KCl9KSl9LF9vblVwS2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzUHJldmlvdXMoKTsKYi5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25Eb3duS2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzTmV4dCgpO2IuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uRXNjS2V5OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5mb2N1c2VkSXRlbTtiJiZiLmJsdXIoKX0sX29uS2V5ZG93bjpmdW5jdGlvbihiKXt0aGlzLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhiLCJ1cCBkb3duIGVzYyIpfHx0aGlzLl9mb2N1c1dpdGhLZXlib2FyZEV2ZW50KGIpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yLl9hY3RpdmF0ZUhhbmRsZXIuY2FsbCh0aGlzLGIpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYil7Yj8odGhpcy5fcHJldmlvdXNUYWJJbmRleD10aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKT90aGlzLnRhYkluZGV4OgowLHRoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpKTp0aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKXx8dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4Iix0aGlzLl9wcmV2aW91c1RhYkluZGV4KX19O1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX3NoaWZ0VGFiUHJlc3NlZD0hMTtQb2x5bWVyLklyb25NZW51QmVoYXZpb3I9W1BvbHltZXIuSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uTWVudUJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItbGlzdGJveC9wYXBlci1saXN0Ym94Lmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InBhcGVyLWxpc3Rib3giLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uTWVudUJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToibGlzdGJveCJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWl0ZW0vcGFwZXItaXRlbS1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToib3B0aW9uIix0YWJpbmRleDoiMCJ9fTtQb2x5bWVyLlBhcGVySXRlbUJlaGF2aW9yPVtQb2x5bWVyLklyb25CdXR0b25TdGF0ZSxQb2x5bWVyLklyb25Db250cm9sU3RhdGUsUG9seW1lci5QYXBlckl0ZW1CZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWl0ZW0vcGFwZXItaXRlbS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pdGVtIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJdGVtQmVoYXZpb3JdfSk7CgovKgoKIExvZGFzaCA8aHR0cHM6Ly9sb2Rhc2guY29tLz4KIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMgPGh0dHBzOi8vanMuZm91bmRhdGlvbi8+CiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+CiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPgogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzCiovCihmdW5jdGlvbigpe3ZhciB1bmRlZmluZWQ7dmFyIFZFUlNJT049IjQuMTcuNSI7dmFyIExBUkdFX0FSUkFZX1NJWkU9MjAwO3ZhciBDT1JFX0VSUk9SX1RFWFQ9IlVuc3VwcG9ydGVkIGNvcmUtanMgdXNlLiBUcnkgaHR0cHM6Ly9ucG1zLmlvL3NlYXJjaD9xXHgzZHBvbnlmaWxsLiIsRlVOQ19FUlJPUl9URVhUPSJFeHBlY3RlZCBhIGZ1bmN0aW9uIjt2YXIgSEFTSF9VTkRFRklORUQ9Il9fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18iO3ZhciBNQVhfTUVNT0laRV9TSVpFPTUwMDt2YXIgUExBQ0VIT0xERVI9Il9fbG9kYXNoX3BsYWNlaG9sZGVyX18iO3ZhciBDTE9ORV9ERUVQX0ZMQUc9MSxDTE9ORV9GTEFUX0ZMQUc9MixDTE9ORV9TWU1CT0xTX0ZMQUc9NDt2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUc9MSxDT01QQVJFX1VOT1JERVJFRF9GTEFHPTI7dmFyIFdSQVBfQklORF9GTEFHPTEsV1JBUF9CSU5EX0tFWV9GTEFHPTIsV1JBUF9DVVJSWV9CT1VORF9GTEFHPTQsV1JBUF9DVVJSWV9GTEFHPQo4LFdSQVBfQ1VSUllfUklHSFRfRkxBRz0xNixXUkFQX1BBUlRJQUxfRkxBRz0zMixXUkFQX1BBUlRJQUxfUklHSFRfRkxBRz02NCxXUkFQX0FSWV9GTEFHPTEyOCxXUkFQX1JFQVJHX0ZMQUc9MjU2LFdSQVBfRkxJUF9GTEFHPTUxMjt2YXIgREVGQVVMVF9UUlVOQ19MRU5HVEg9MzAsREVGQVVMVF9UUlVOQ19PTUlTU0lPTj0iLi4uIjt2YXIgSE9UX0NPVU5UPTgwMCxIT1RfU1BBTj0xNjt2YXIgTEFaWV9GSUxURVJfRkxBRz0xLExBWllfTUFQX0ZMQUc9MixMQVpZX1dISUxFX0ZMQUc9Mzt2YXIgSU5GSU5JVFk9MS8wLE1BWF9TQUZFX0lOVEVHRVI9OTAwNzE5OTI1NDc0MDk5MSxNQVhfSU5URUdFUj0xLjc5NzY5MzEzNDg2MjMxNTdFMzA4LE5BTj0wLzA7dmFyIE1BWF9BUlJBWV9MRU5HVEg9NDI5NDk2NzI5NSxNQVhfQVJSQVlfSU5ERVg9TUFYX0FSUkFZX0xFTkdUSC0xLEhBTEZfTUFYX0FSUkFZX0xFTkdUSD1NQVhfQVJSQVlfTEVOR1RIPj4+MTt2YXIgd3JhcEZsYWdzPVtbImFyeSIsCldSQVBfQVJZX0ZMQUddLFsiYmluZCIsV1JBUF9CSU5EX0ZMQUddLFsiYmluZEtleSIsV1JBUF9CSU5EX0tFWV9GTEFHXSxbImN1cnJ5IixXUkFQX0NVUlJZX0ZMQUddLFsiY3VycnlSaWdodCIsV1JBUF9DVVJSWV9SSUdIVF9GTEFHXSxbImZsaXAiLFdSQVBfRkxJUF9GTEFHXSxbInBhcnRpYWwiLFdSQVBfUEFSVElBTF9GTEFHXSxbInBhcnRpYWxSaWdodCIsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUddLFsicmVhcmciLFdSQVBfUkVBUkdfRkxBR11dO3ZhciBhcmdzVGFnPSJbb2JqZWN0IEFyZ3VtZW50c10iLGFycmF5VGFnPSJbb2JqZWN0IEFycmF5XSIsYXN5bmNUYWc9IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iLGJvb2xUYWc9IltvYmplY3QgQm9vbGVhbl0iLGRhdGVUYWc9IltvYmplY3QgRGF0ZV0iLGRvbUV4Y1RhZz0iW29iamVjdCBET01FeGNlcHRpb25dIixlcnJvclRhZz0iW29iamVjdCBFcnJvcl0iLGZ1bmNUYWc9IltvYmplY3QgRnVuY3Rpb25dIixnZW5UYWc9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIiwKbWFwVGFnPSJbb2JqZWN0IE1hcF0iLG51bWJlclRhZz0iW29iamVjdCBOdW1iZXJdIixudWxsVGFnPSJbb2JqZWN0IE51bGxdIixvYmplY3RUYWc9IltvYmplY3QgT2JqZWN0XSIscHJvbWlzZVRhZz0iW29iamVjdCBQcm9taXNlXSIscHJveHlUYWc9IltvYmplY3QgUHJveHldIixyZWdleHBUYWc9IltvYmplY3QgUmVnRXhwXSIsc2V0VGFnPSJbb2JqZWN0IFNldF0iLHN0cmluZ1RhZz0iW29iamVjdCBTdHJpbmddIixzeW1ib2xUYWc9IltvYmplY3QgU3ltYm9sXSIsdW5kZWZpbmVkVGFnPSJbb2JqZWN0IFVuZGVmaW5lZF0iLHdlYWtNYXBUYWc9IltvYmplY3QgV2Vha01hcF0iLHdlYWtTZXRUYWc9IltvYmplY3QgV2Vha1NldF0iO3ZhciBhcnJheUJ1ZmZlclRhZz0iW29iamVjdCBBcnJheUJ1ZmZlcl0iLGRhdGFWaWV3VGFnPSJbb2JqZWN0IERhdGFWaWV3XSIsZmxvYXQzMlRhZz0iW29iamVjdCBGbG9hdDMyQXJyYXldIixmbG9hdDY0VGFnPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLAppbnQ4VGFnPSJbb2JqZWN0IEludDhBcnJheV0iLGludDE2VGFnPSJbb2JqZWN0IEludDE2QXJyYXldIixpbnQzMlRhZz0iW29iamVjdCBJbnQzMkFycmF5XSIsdWludDhUYWc9IltvYmplY3QgVWludDhBcnJheV0iLHVpbnQ4Q2xhbXBlZFRhZz0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLHVpbnQxNlRhZz0iW29iamVjdCBVaW50MTZBcnJheV0iLHVpbnQzMlRhZz0iW29iamVjdCBVaW50MzJBcnJheV0iO3ZhciByZUVtcHR5U3RyaW5nTGVhZGluZz0vXGJfX3AgXCs9ICcnOy9nLHJlRW1wdHlTdHJpbmdNaWRkbGU9L1xiKF9fcCBcKz0pICcnIFwrL2cscmVFbXB0eVN0cmluZ1RyYWlsaW5nPS8oX19lXCguKj9cKXxcYl9fdFwpKSBcK1xuJyc7L2c7dmFyIHJlRXNjYXBlZEh0bWw9LyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLHJlVW5lc2NhcGVkSHRtbD0vWyY8PiInXS9nLHJlSGFzRXNjYXBlZEh0bWw9UmVnRXhwKHJlRXNjYXBlZEh0bWwuc291cmNlKSxyZUhhc1VuZXNjYXBlZEh0bWw9ClJlZ0V4cChyZVVuZXNjYXBlZEh0bWwuc291cmNlKTt2YXIgcmVFc2NhcGU9LzwlLShbXHNcU10rPyklPi9nLHJlRXZhbHVhdGU9LzwlKFtcc1xTXSs/KSU+L2cscmVJbnRlcnBvbGF0ZT0vPCU9KFtcc1xTXSs/KSU+L2c7dmFyIHJlSXNEZWVwUHJvcD0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxyZUlzUGxhaW5Qcm9wPS9eXHcqJC8scmVQcm9wTmFtZT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZzt2YXIgcmVSZWdFeHBDaGFyPS9bXFxeJC4qKz8oKVtcXXt9fF0vZyxyZUhhc1JlZ0V4cENoYXI9UmVnRXhwKHJlUmVnRXhwQ2hhci5zb3VyY2UpO3ZhciByZVRyaW09L15ccyt8XHMrJC9nLHJlVHJpbVN0YXJ0PS9eXHMrLyxyZVRyaW1FbmQ9L1xzKyQvO3ZhciByZVdyYXBDb21tZW50PS9ceyg/OlxuXC9cKiBcW3dyYXBwZWQgd2l0aCAuK1xdIFwqXC8pP1xuPy8sCnJlV3JhcERldGFpbHM9L1x7XG5cL1wqIFxbd3JhcHBlZCB3aXRoICguKylcXSBcKi8scmVTcGxpdERldGFpbHM9Lyw/ICYgLzt2YXIgcmVBc2NpaVdvcmQ9L1teXHgwMC1ceDJmXHgzYS1ceDQwXHg1Yi1ceDYwXHg3Yi1ceDdmXSsvZzt2YXIgcmVFc2NhcGVDaGFyPS9cXChcXCk/L2c7dmFyIHJlRXNUZW1wbGF0ZT0vXCRceyhbXlxcfV0qKD86XFwuW15cXH1dKikqKVx9L2c7dmFyIHJlRmxhZ3M9L1x3KiQvO3ZhciByZUlzQmFkSGV4PS9eWy0rXTB4WzAtOWEtZl0rJC9pO3ZhciByZUlzQmluYXJ5PS9eMGJbMDFdKyQvaTt2YXIgcmVJc0hvc3RDdG9yPS9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvO3ZhciByZUlzT2N0YWw9L14wb1swLTddKyQvaTt2YXIgcmVJc1VpbnQ9L14oPzowfFsxLTldXGQqKSQvO3ZhciByZUxhdGluPS9bXHhjMC1ceGQ2XHhkOC1ceGY2XHhmOC1ceGZmXHUwMTAwLVx1MDE3Zl0vZzt2YXIgcmVOb01hdGNoPS8oJF4pLzt2YXIgcmVVbmVzY2FwZWRTdHJpbmc9Ci9bJ1xuXHJcdTIwMjhcdTIwMjlcXF0vZzt2YXIgcnNBc3RyYWxSYW5nZT0iXFx1ZDgwMC1cXHVkZmZmIixyc0NvbWJvTWFya3NSYW5nZT0iXFx1MDMwMC1cXHUwMzZmIixyZUNvbWJvSGFsZk1hcmtzUmFuZ2U9IlxcdWZlMjAtXFx1ZmUyZiIscnNDb21ib1N5bWJvbHNSYW5nZT0iXFx1MjBkMC1cXHUyMGZmIixyc0NvbWJvUmFuZ2U9cnNDb21ib01hcmtzUmFuZ2UrcmVDb21ib0hhbGZNYXJrc1JhbmdlK3JzQ29tYm9TeW1ib2xzUmFuZ2UscnNEaW5nYmF0UmFuZ2U9IlxcdTI3MDAtXFx1MjdiZiIscnNMb3dlclJhbmdlPSJhLXpcXHhkZi1cXHhmNlxceGY4LVxceGZmIixyc01hdGhPcFJhbmdlPSJcXHhhY1xceGIxXFx4ZDdcXHhmNyIscnNOb25DaGFyUmFuZ2U9IlxceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceGJmIixyc1B1bmN0dWF0aW9uUmFuZ2U9IlxcdTIwMDAtXFx1MjA2ZiIscnNTcGFjZVJhbmdlPSIgXFx0XFx4MGJcXGZcXHhhMFxcdWZlZmZcXG5cXHJcXHUyMDI4XFx1MjAyOVxcdTE2ODBcXHUxODBlXFx1MjAwMFxcdTIwMDFcXHUyMDAyXFx1MjAwM1xcdTIwMDRcXHUyMDA1XFx1MjAwNlxcdTIwMDdcXHUyMDA4XFx1MjAwOVxcdTIwMGFcXHUyMDJmXFx1MjA1ZlxcdTMwMDAiLApyc1VwcGVyUmFuZ2U9IkEtWlxceGMwLVxceGQ2XFx4ZDgtXFx4ZGUiLHJzVmFyUmFuZ2U9IlxcdWZlMGVcXHVmZTBmIixyc0JyZWFrUmFuZ2U9cnNNYXRoT3BSYW5nZStyc05vbkNoYXJSYW5nZStyc1B1bmN0dWF0aW9uUmFuZ2UrcnNTcGFjZVJhbmdlO3ZhciByc0Fwb3M9IlsnXHUyMDE5XSIscnNBc3RyYWw9IlsiK3JzQXN0cmFsUmFuZ2UrIl0iLHJzQnJlYWs9IlsiK3JzQnJlYWtSYW5nZSsiXSIscnNDb21ibz0iWyIrcnNDb21ib1JhbmdlKyJdIixyc0RpZ2l0cz0iXFxkKyIscnNEaW5nYmF0PSJbIityc0RpbmdiYXRSYW5nZSsiXSIscnNMb3dlcj0iWyIrcnNMb3dlclJhbmdlKyJdIixyc01pc2M9IlteIityc0FzdHJhbFJhbmdlK3JzQnJlYWtSYW5nZStyc0RpZ2l0cytyc0RpbmdiYXRSYW5nZStyc0xvd2VyUmFuZ2UrcnNVcHBlclJhbmdlKyJdIixyc0ZpdHo9IlxcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXSIscnNNb2RpZmllcj0iKD86Iityc0NvbWJvKyJ8Iityc0ZpdHorIikiLHJzTm9uQXN0cmFsPQoiW14iK3JzQXN0cmFsUmFuZ2UrIl0iLHJzUmVnaW9uYWw9Iig/OlxcdWQ4M2NbXFx1ZGRlNi1cXHVkZGZmXSl7Mn0iLHJzU3VyclBhaXI9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLHJzVXBwZXI9IlsiK3JzVXBwZXJSYW5nZSsiXSIscnNaV0o9IlxcdTIwMGQiO3ZhciByc01pc2NMb3dlcj0iKD86Iityc0xvd2VyKyJ8Iityc01pc2MrIikiLHJzTWlzY1VwcGVyPSIoPzoiK3JzVXBwZXIrInwiK3JzTWlzYysiKSIscnNPcHRDb250ckxvd2VyPSIoPzoiK3JzQXBvcysiKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPyIscnNPcHRDb250clVwcGVyPSIoPzoiK3JzQXBvcysiKD86RHxMTHxNfFJFfFN8VHxWRSkpPyIscmVPcHRNb2Q9cnNNb2RpZmllcisiPyIscnNPcHRWYXI9IlsiK3JzVmFyUmFuZ2UrIl0/Iixyc09wdEpvaW49Iig/OiIrcnNaV0orIig/OiIrW3JzTm9uQXN0cmFsLHJzUmVnaW9uYWwscnNTdXJyUGFpcl0uam9pbigifCIpKyIpIityc09wdFZhcityZU9wdE1vZCsKIikqIixyc09yZExvd2VyPSJcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxkdGgpKD9ceDNkXFxifFtBLVpfXSkiLHJzT3JkVXBwZXI9IlxcZCooPzoxU1R8Mk5EfDNSRHwoPyFbMTIzXSlcXGRUSCkoP1x4M2RcXGJ8W2Etel9dKSIscnNTZXE9cnNPcHRWYXIrcmVPcHRNb2QrcnNPcHRKb2luLHJzRW1vamk9Iig/OiIrW3JzRGluZ2JhdCxyc1JlZ2lvbmFsLHJzU3VyclBhaXJdLmpvaW4oInwiKSsiKSIrcnNTZXEscnNTeW1ib2w9Iig/OiIrW3JzTm9uQXN0cmFsK3JzQ29tYm8rIj8iLHJzQ29tYm8scnNSZWdpb25hbCxyc1N1cnJQYWlyLHJzQXN0cmFsXS5qb2luKCJ8IikrIikiO3ZhciByZUFwb3M9UmVnRXhwKHJzQXBvcywiZyIpO3ZhciByZUNvbWJvTWFyaz1SZWdFeHAocnNDb21ibywiZyIpO3ZhciByZVVuaWNvZGU9UmVnRXhwKHJzRml0eisiKD9ceDNkIityc0ZpdHorIil8Iityc1N5bWJvbCtyc1NlcSwiZyIpO3ZhciByZVVuaWNvZGVXb3JkPVJlZ0V4cChbcnNVcHBlcisiPyIrCnJzTG93ZXIrIisiK3JzT3B0Q29udHJMb3dlcisiKD9ceDNkIitbcnNCcmVhayxyc1VwcGVyLCIkIl0uam9pbigifCIpKyIpIixyc01pc2NVcHBlcisiKyIrcnNPcHRDb250clVwcGVyKyIoP1x4M2QiK1tyc0JyZWFrLHJzVXBwZXIrcnNNaXNjTG93ZXIsIiQiXS5qb2luKCJ8IikrIikiLHJzVXBwZXIrIj8iK3JzTWlzY0xvd2VyKyIrIityc09wdENvbnRyTG93ZXIscnNVcHBlcisiKyIrcnNPcHRDb250clVwcGVyLHJzT3JkVXBwZXIscnNPcmRMb3dlcixyc0RpZ2l0cyxyc0Vtb2ppXS5qb2luKCJ8IiksImciKTt2YXIgcmVIYXNVbmljb2RlPVJlZ0V4cCgiWyIrcnNaV0orcnNBc3RyYWxSYW5nZStyc0NvbWJvUmFuZ2UrcnNWYXJSYW5nZSsiXSIpO3ZhciByZUhhc1VuaWNvZGVXb3JkPS9bYS16XVtBLVpdfFtBLVpdezIsfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLzt2YXIgY29udGV4dFByb3BzPVsiQXJyYXkiLCJCdWZmZXIiLCJEYXRhVmlldyIsCiJEYXRlIiwiRXJyb3IiLCJGbG9hdDMyQXJyYXkiLCJGbG9hdDY0QXJyYXkiLCJGdW5jdGlvbiIsIkludDhBcnJheSIsIkludDE2QXJyYXkiLCJJbnQzMkFycmF5IiwiTWFwIiwiTWF0aCIsIk9iamVjdCIsIlByb21pc2UiLCJSZWdFeHAiLCJTZXQiLCJTdHJpbmciLCJTeW1ib2wiLCJUeXBlRXJyb3IiLCJVaW50OEFycmF5IiwiVWludDhDbGFtcGVkQXJyYXkiLCJVaW50MTZBcnJheSIsIlVpbnQzMkFycmF5IiwiV2Vha01hcCIsIl8iLCJjbGVhclRpbWVvdXQiLCJpc0Zpbml0ZSIsInBhcnNlSW50Iiwic2V0VGltZW91dCJdO3ZhciB0ZW1wbGF0ZUNvdW50ZXI9LTE7dmFyIHR5cGVkQXJyYXlUYWdzPXt9O3R5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddPXR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddPXR5cGVkQXJyYXlUYWdzW2ludDhUYWddPXR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXT10eXBlZEFycmF5VGFnc1tpbnQzMlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDhUYWddPXR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ109CnR5cGVkQXJyYXlUYWdzW3VpbnQxNlRhZ109dHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXT10cnVlO3R5cGVkQXJyYXlUYWdzW2FyZ3NUYWddPXR5cGVkQXJyYXlUYWdzW2FycmF5VGFnXT10eXBlZEFycmF5VGFnc1thcnJheUJ1ZmZlclRhZ109dHlwZWRBcnJheVRhZ3NbYm9vbFRhZ109dHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddPXR5cGVkQXJyYXlUYWdzW2RhdGVUYWddPXR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXT10eXBlZEFycmF5VGFnc1tmdW5jVGFnXT10eXBlZEFycmF5VGFnc1ttYXBUYWddPXR5cGVkQXJyYXlUYWdzW251bWJlclRhZ109dHlwZWRBcnJheVRhZ3Nbb2JqZWN0VGFnXT10eXBlZEFycmF5VGFnc1tyZWdleHBUYWddPXR5cGVkQXJyYXlUYWdzW3NldFRhZ109dHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXT10eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgY2xvbmVhYmxlVGFncz17fTtjbG9uZWFibGVUYWdzW2FyZ3NUYWddPWNsb25lYWJsZVRhZ3NbYXJyYXlUYWddPQpjbG9uZWFibGVUYWdzW2FycmF5QnVmZmVyVGFnXT1jbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnXT1jbG9uZWFibGVUYWdzW2Jvb2xUYWddPWNsb25lYWJsZVRhZ3NbZGF0ZVRhZ109Y2xvbmVhYmxlVGFnc1tmbG9hdDMyVGFnXT1jbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddPWNsb25lYWJsZVRhZ3NbaW50OFRhZ109Y2xvbmVhYmxlVGFnc1tpbnQxNlRhZ109Y2xvbmVhYmxlVGFnc1tpbnQzMlRhZ109Y2xvbmVhYmxlVGFnc1ttYXBUYWddPWNsb25lYWJsZVRhZ3NbbnVtYmVyVGFnXT1jbG9uZWFibGVUYWdzW29iamVjdFRhZ109Y2xvbmVhYmxlVGFnc1tyZWdleHBUYWddPWNsb25lYWJsZVRhZ3Nbc2V0VGFnXT1jbG9uZWFibGVUYWdzW3N0cmluZ1RhZ109Y2xvbmVhYmxlVGFnc1tzeW1ib2xUYWddPWNsb25lYWJsZVRhZ3NbdWludDhUYWddPWNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXT1jbG9uZWFibGVUYWdzW3VpbnQxNlRhZ109Y2xvbmVhYmxlVGFnc1t1aW50MzJUYWddPXRydWU7CmNsb25lYWJsZVRhZ3NbZXJyb3JUYWddPWNsb25lYWJsZVRhZ3NbZnVuY1RhZ109Y2xvbmVhYmxlVGFnc1t3ZWFrTWFwVGFnXT1mYWxzZTt2YXIgZGVidXJyZWRMZXR0ZXJzPXsiXHUwMGMwIjoiQSIsIlx1MDBjMSI6IkEiLCJcdTAwYzIiOiJBIiwiXHUwMGMzIjoiQSIsIlx1MDBjNCI6IkEiLCJcdTAwYzUiOiJBIiwiXHUwMGUwIjoiYSIsIlx1MDBlMSI6ImEiLCJcdTAwZTIiOiJhIiwiXHUwMGUzIjoiYSIsIlx1MDBlNCI6ImEiLCJcdTAwZTUiOiJhIiwiXHUwMGM3IjoiQyIsIlx1MDBlNyI6ImMiLCJcdTAwZDAiOiJEIiwiXHUwMGYwIjoiZCIsIlx1MDBjOCI6IkUiLCJcdTAwYzkiOiJFIiwiXHUwMGNhIjoiRSIsIlx1MDBjYiI6IkUiLCJcdTAwZTgiOiJlIiwiXHUwMGU5IjoiZSIsIlx1MDBlYSI6ImUiLCJcdTAwZWIiOiJlIiwiXHUwMGNjIjoiSSIsIlx1MDBjZCI6IkkiLCJcdTAwY2UiOiJJIiwiXHUwMGNmIjoiSSIsIlx1MDBlYyI6ImkiLCJcdTAwZWQiOiJpIiwiXHUwMGVlIjoiaSIsCiJcdTAwZWYiOiJpIiwiXHUwMGQxIjoiTiIsIlx1MDBmMSI6Im4iLCJcdTAwZDIiOiJPIiwiXHUwMGQzIjoiTyIsIlx1MDBkNCI6Ik8iLCJcdTAwZDUiOiJPIiwiXHUwMGQ2IjoiTyIsIlx1MDBkOCI6Ik8iLCJcdTAwZjIiOiJvIiwiXHUwMGYzIjoibyIsIlx1MDBmNCI6Im8iLCJcdTAwZjUiOiJvIiwiXHUwMGY2IjoibyIsIlx1MDBmOCI6Im8iLCJcdTAwZDkiOiJVIiwiXHUwMGRhIjoiVSIsIlx1MDBkYiI6IlUiLCJcdTAwZGMiOiJVIiwiXHUwMGY5IjoidSIsIlx1MDBmYSI6InUiLCJcdTAwZmIiOiJ1IiwiXHUwMGZjIjoidSIsIlx1MDBkZCI6IlkiLCJcdTAwZmQiOiJ5IiwiXHUwMGZmIjoieSIsIlx1MDBjNiI6IkFlIiwiXHUwMGU2IjoiYWUiLCJcdTAwZGUiOiJUaCIsIlx1MDBmZSI6InRoIiwiXHUwMGRmIjoic3MiLCJcdTAxMDAiOiJBIiwiXHUwMTAyIjoiQSIsIlx1MDEwNCI6IkEiLCJcdTAxMDEiOiJhIiwiXHUwMTAzIjoiYSIsIlx1MDEwNSI6ImEiLCJcdTAxMDYiOiJDIiwiXHUwMTA4IjoiQyIsCiJcdTAxMGEiOiJDIiwiXHUwMTBjIjoiQyIsIlx1MDEwNyI6ImMiLCJcdTAxMDkiOiJjIiwiXHUwMTBiIjoiYyIsIlx1MDEwZCI6ImMiLCJcdTAxMGUiOiJEIiwiXHUwMTEwIjoiRCIsIlx1MDEwZiI6ImQiLCJcdTAxMTEiOiJkIiwiXHUwMTEyIjoiRSIsIlx1MDExNCI6IkUiLCJcdTAxMTYiOiJFIiwiXHUwMTE4IjoiRSIsIlx1MDExYSI6IkUiLCJcdTAxMTMiOiJlIiwiXHUwMTE1IjoiZSIsIlx1MDExNyI6ImUiLCJcdTAxMTkiOiJlIiwiXHUwMTFiIjoiZSIsIlx1MDExYyI6IkciLCJcdTAxMWUiOiJHIiwiXHUwMTIwIjoiRyIsIlx1MDEyMiI6IkciLCJcdTAxMWQiOiJnIiwiXHUwMTFmIjoiZyIsIlx1MDEyMSI6ImciLCJcdTAxMjMiOiJnIiwiXHUwMTI0IjoiSCIsIlx1MDEyNiI6IkgiLCJcdTAxMjUiOiJoIiwiXHUwMTI3IjoiaCIsIlx1MDEyOCI6IkkiLCJcdTAxMmEiOiJJIiwiXHUwMTJjIjoiSSIsIlx1MDEyZSI6IkkiLCJcdTAxMzAiOiJJIiwiXHUwMTI5IjoiaSIsIlx1MDEyYiI6ImkiLAoiXHUwMTJkIjoiaSIsIlx1MDEyZiI6ImkiLCJcdTAxMzEiOiJpIiwiXHUwMTM0IjoiSiIsIlx1MDEzNSI6ImoiLCJcdTAxMzYiOiJLIiwiXHUwMTM3IjoiayIsIlx1MDEzOCI6ImsiLCJcdTAxMzkiOiJMIiwiXHUwMTNiIjoiTCIsIlx1MDEzZCI6IkwiLCJcdTAxM2YiOiJMIiwiXHUwMTQxIjoiTCIsIlx1MDEzYSI6ImwiLCJcdTAxM2MiOiJsIiwiXHUwMTNlIjoibCIsIlx1MDE0MCI6ImwiLCJcdTAxNDIiOiJsIiwiXHUwMTQzIjoiTiIsIlx1MDE0NSI6Ik4iLCJcdTAxNDciOiJOIiwiXHUwMTRhIjoiTiIsIlx1MDE0NCI6Im4iLCJcdTAxNDYiOiJuIiwiXHUwMTQ4IjoibiIsIlx1MDE0YiI6Im4iLCJcdTAxNGMiOiJPIiwiXHUwMTRlIjoiTyIsIlx1MDE1MCI6Ik8iLCJcdTAxNGQiOiJvIiwiXHUwMTRmIjoibyIsIlx1MDE1MSI6Im8iLCJcdTAxNTQiOiJSIiwiXHUwMTU2IjoiUiIsIlx1MDE1OCI6IlIiLCJcdTAxNTUiOiJyIiwiXHUwMTU3IjoiciIsIlx1MDE1OSI6InIiLCJcdTAxNWEiOiJTIiwKIlx1MDE1YyI6IlMiLCJcdTAxNWUiOiJTIiwiXHUwMTYwIjoiUyIsIlx1MDE1YiI6InMiLCJcdTAxNWQiOiJzIiwiXHUwMTVmIjoicyIsIlx1MDE2MSI6InMiLCJcdTAxNjIiOiJUIiwiXHUwMTY0IjoiVCIsIlx1MDE2NiI6IlQiLCJcdTAxNjMiOiJ0IiwiXHUwMTY1IjoidCIsIlx1MDE2NyI6InQiLCJcdTAxNjgiOiJVIiwiXHUwMTZhIjoiVSIsIlx1MDE2YyI6IlUiLCJcdTAxNmUiOiJVIiwiXHUwMTcwIjoiVSIsIlx1MDE3MiI6IlUiLCJcdTAxNjkiOiJ1IiwiXHUwMTZiIjoidSIsIlx1MDE2ZCI6InUiLCJcdTAxNmYiOiJ1IiwiXHUwMTcxIjoidSIsIlx1MDE3MyI6InUiLCJcdTAxNzQiOiJXIiwiXHUwMTc1IjoidyIsIlx1MDE3NiI6IlkiLCJcdTAxNzciOiJ5IiwiXHUwMTc4IjoiWSIsIlx1MDE3OSI6IloiLCJcdTAxN2IiOiJaIiwiXHUwMTdkIjoiWiIsIlx1MDE3YSI6InoiLCJcdTAxN2MiOiJ6IiwiXHUwMTdlIjoieiIsIlx1MDEzMiI6IklKIiwiXHUwMTMzIjoiaWoiLCJcdTAxNTIiOiJPZSIsCiJcdTAxNTMiOiJvZSIsIlx1MDE0OSI6IiduIiwiXHUwMTdmIjoicyJ9O3ZhciBodG1sRXNjYXBlcz17Ilx4MjYiOiJceDI2YW1wOyIsIlx4M2MiOiJceDI2bHQ7IiwiXHgzZSI6Ilx4MjZndDsiLCciJzoiXHgyNnF1b3Q7IiwiJyI6Ilx4MjYjMzk7In07dmFyIGh0bWxVbmVzY2FwZXM9eyJceDI2YW1wOyI6Ilx4MjYiLCJceDI2bHQ7IjoiXHgzYyIsIlx4MjZndDsiOiJceDNlIiwiXHgyNnF1b3Q7IjonIicsIlx4MjYjMzk7IjoiJyJ9O3ZhciBzdHJpbmdFc2NhcGVzPXsiXFwiOiJcXCIsIiciOiInIiwiXG4iOiJuIiwiXHIiOiJyIiwiXHUyMDI4IjoidTIwMjgiLCJcdTIwMjkiOiJ1MjAyOSJ9O3ZhciBmcmVlUGFyc2VGbG9hdD1wYXJzZUZsb2F0LGZyZWVQYXJzZUludD1wYXJzZUludDt2YXIgZnJlZUdsb2JhbD10eXBlb2YgZ2xvYmFsPT0ib2JqZWN0IiYmZ2xvYmFsJiZnbG9iYWwuT2JqZWN0PT09T2JqZWN0JiZnbG9iYWw7dmFyIGZyZWVTZWxmPXR5cGVvZiBzZWxmPT0ib2JqZWN0IiYmCnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmO3ZhciByb290PWZyZWVHbG9iYWx8fGZyZWVTZWxmfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpO3ZhciBmcmVlRXhwb3J0cz10eXBlb2YgZXhwb3J0cz09Im9iamVjdCImJmV4cG9ydHMmJiFleHBvcnRzLm5vZGVUeXBlJiZleHBvcnRzO3ZhciBmcmVlTW9kdWxlPWZyZWVFeHBvcnRzJiZ0eXBlb2YgbW9kdWxlPT0ib2JqZWN0IiYmbW9kdWxlJiYhbW9kdWxlLm5vZGVUeXBlJiZtb2R1bGU7dmFyIG1vZHVsZUV4cG9ydHM9ZnJlZU1vZHVsZSYmZnJlZU1vZHVsZS5leHBvcnRzPT09ZnJlZUV4cG9ydHM7dmFyIGZyZWVQcm9jZXNzPW1vZHVsZUV4cG9ydHMmJmZyZWVHbG9iYWwucHJvY2Vzczt2YXIgbm9kZVV0aWw9ZnVuY3Rpb24oKXt0cnl7cmV0dXJuIGZyZWVQcm9jZXNzJiZmcmVlUHJvY2Vzcy5iaW5kaW5nJiZmcmVlUHJvY2Vzcy5iaW5kaW5nKCJ1dGlsIil9Y2F0Y2goZSl7fX0oKTt2YXIgbm9kZUlzQXJyYXlCdWZmZXI9bm9kZVV0aWwmJgpub2RlVXRpbC5pc0FycmF5QnVmZmVyLG5vZGVJc0RhdGU9bm9kZVV0aWwmJm5vZGVVdGlsLmlzRGF0ZSxub2RlSXNNYXA9bm9kZVV0aWwmJm5vZGVVdGlsLmlzTWFwLG5vZGVJc1JlZ0V4cD1ub2RlVXRpbCYmbm9kZVV0aWwuaXNSZWdFeHAsbm9kZUlzU2V0PW5vZGVVdGlsJiZub2RlVXRpbC5pc1NldCxub2RlSXNUeXBlZEFycmF5PW5vZGVVdGlsJiZub2RlVXRpbC5pc1R5cGVkQXJyYXk7ZnVuY3Rpb24gYXBwbHkoZnVuYyx0aGlzQXJnLGFyZ3Mpe3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7Y2FzZSAxOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdKTtjYXNlIDI6cmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiBmdW5jLmNhbGwodGhpc0FyZyxhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSl9cmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZyxhcmdzKX1mdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksCnNldHRlcixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtzZXR0ZXIoYWNjdW11bGF0b3IsdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGFycmF5KX1yZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYXJyYXlFYWNoKGFycmF5LGl0ZXJhdGVlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGl0ZXJhdGVlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk9PT1mYWxzZSlicmVhaztyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlFYWNoUmlnaHQoYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0paWYoaXRlcmF0ZWUoYXJyYXlbbGVuZ3RoXSxsZW5ndGgsYXJyYXkpPT09ZmFsc2UpYnJlYWs7CnJldHVybiBhcnJheX1mdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZighcHJlZGljYXRlKGFycmF5W2luZGV4XSxpbmRleCxhcnJheSkpcmV0dXJuIGZhbHNlO3JldHVybiB0cnVlfWZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aCxyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsYXJyYXkpKXJlc3VsdFtyZXNJbmRleCsrXT12YWx1ZX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGFycmF5SW5jbHVkZXMoYXJyYXksdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmJhc2VJbmRleE9mKGFycmF5LAp2YWx1ZSwwKT4tMX1mdW5jdGlvbiBhcnJheUluY2x1ZGVzV2l0aChhcnJheSx2YWx1ZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKGNvbXBhcmF0b3IodmFsdWUsYXJyYXlbaW5kZXhdKSlyZXR1cm4gdHJ1ZTtyZXR1cm4gZmFsc2V9ZnVuY3Rpb24gYXJyYXlNYXAoYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1pdGVyYXRlZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXMubGVuZ3RoLG9mZnNldD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJyYXlbb2Zmc2V0K2luZGV4XT0KdmFsdWVzW2luZGV4XTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYXJyYXlSZWR1Y2UoYXJyYXksaXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGluaXRBY2N1bSYmbGVuZ3RoKWFjY3VtdWxhdG9yPWFycmF5WysraW5kZXhdO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFjY3VtdWxhdG9yPWl0ZXJhdGVlKGFjY3VtdWxhdG9yLGFycmF5W2luZGV4XSxpbmRleCxhcnJheSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGFycmF5UmVkdWNlUmlnaHQoYXJyYXksaXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGluaXRBY2N1bSYmbGVuZ3RoKWFjY3VtdWxhdG9yPWFycmF5Wy0tbGVuZ3RoXTt3aGlsZShsZW5ndGgtLSlhY2N1bXVsYXRvcj1pdGVyYXRlZShhY2N1bXVsYXRvcixhcnJheVtsZW5ndGhdLGxlbmd0aCxhcnJheSk7CnJldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiBhcnJheVNvbWUoYXJyYXkscHJlZGljYXRlKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKWlmKHByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKXJldHVybiB0cnVlO3JldHVybiBmYWxzZX12YXIgYXNjaWlTaXplPWJhc2VQcm9wZXJ0eSgibGVuZ3RoIik7ZnVuY3Rpb24gYXNjaWlUb0FycmF5KHN0cmluZyl7cmV0dXJuIHN0cmluZy5zcGxpdCgiIil9ZnVuY3Rpb24gYXNjaWlXb3JkcyhzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpfHxbXX1mdW5jdGlvbiBiYXNlRmluZEtleShjb2xsZWN0aW9uLHByZWRpY2F0ZSxlYWNoRnVuYyl7dmFyIHJlc3VsdDtlYWNoRnVuYyhjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGtleSxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsa2V5LGNvbGxlY3Rpb24pKXtyZXN1bHQ9a2V5OwpyZXR1cm4gZmFsc2V9fSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tSW5kZXgrKGZyb21SaWdodD8xOi0xKTt3aGlsZShmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aClpZihwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLGluZGV4LGFycmF5KSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXtyZXR1cm4gdmFsdWU9PT12YWx1ZT9zdHJpY3RJbmRleE9mKGFycmF5LHZhbHVlLGZyb21JbmRleCk6YmFzZUZpbmRJbmRleChhcnJheSxiYXNlSXNOYU4sZnJvbUluZGV4KX1mdW5jdGlvbiBiYXNlSW5kZXhPZldpdGgoYXJyYXksdmFsdWUsZnJvbUluZGV4LGNvbXBhcmF0b3Ipe3ZhciBpbmRleD1mcm9tSW5kZXgtMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8Cmxlbmd0aClpZihjb21wYXJhdG9yKGFycmF5W2luZGV4XSx2YWx1ZSkpcmV0dXJuIGluZGV4O3JldHVybi0xfWZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSl7cmV0dXJuIHZhbHVlIT09dmFsdWV9ZnVuY3Rpb24gYmFzZU1lYW4oYXJyYXksaXRlcmF0ZWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU3VtKGFycmF5LGl0ZXJhdGVlKS9sZW5ndGg6TkFOfWZ1bmN0aW9uIGJhc2VQcm9wZXJ0eShrZXkpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfX1mdW5jdGlvbiBiYXNlUHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfX1mdW5jdGlvbiBiYXNlUmVkdWNlKGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3IsaW5pdEFjY3VtLGVhY2hGdW5jKXtlYWNoRnVuYyhjb2xsZWN0aW9uLApmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXthY2N1bXVsYXRvcj1pbml0QWNjdW0/KGluaXRBY2N1bT1mYWxzZSx2YWx1ZSk6aXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsY29sbGVjdGlvbil9KTtyZXR1cm4gYWNjdW11bGF0b3J9ZnVuY3Rpb24gYmFzZVNvcnRCeShhcnJheSxjb21wYXJlcil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7YXJyYXkuc29ydChjb21wYXJlcik7d2hpbGUobGVuZ3RoLS0pYXJyYXlbbGVuZ3RoXT1hcnJheVtsZW5ndGhdLnZhbHVlO3JldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlU3VtKGFycmF5LGl0ZXJhdGVlKXt2YXIgcmVzdWx0LGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBjdXJyZW50PWl0ZXJhdGVlKGFycmF5W2luZGV4XSk7aWYoY3VycmVudCE9PXVuZGVmaW5lZClyZXN1bHQ9cmVzdWx0PT09dW5kZWZpbmVkP2N1cnJlbnQ6cmVzdWx0K2N1cnJlbnR9cmV0dXJuIHJlc3VsdH0KZnVuY3Rpb24gYmFzZVRpbWVzKG4saXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobik7d2hpbGUoKytpbmRleDxuKXJlc3VsdFtpbmRleF09aXRlcmF0ZWUoaW5kZXgpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlNYXAocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm5ba2V5LG9iamVjdFtrZXldXX0pfWZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKXtyZXR1cm4gZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jKHZhbHVlKX19ZnVuY3Rpb24gYmFzZVZhbHVlcyhvYmplY3QscHJvcHMpe3JldHVybiBhcnJheU1hcChwcm9wcyxmdW5jdGlvbihrZXkpe3JldHVybiBvYmplY3Rba2V5XX0pfWZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLGtleSl7cmV0dXJuIGNhY2hlLmhhcyhrZXkpfWZ1bmN0aW9uIGNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9c3RyU3ltYm9scy5sZW5ndGg7CndoaWxlKCsraW5kZXg8bGVuZ3RoJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKTtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpe3ZhciBpbmRleD1zdHJTeW1ib2xzLmxlbmd0aDt3aGlsZShpbmRleC0tJiZiYXNlSW5kZXhPZihjaHJTeW1ib2xzLHN0clN5bWJvbHNbaW5kZXhdLDApPi0xKTtyZXR1cm4gaW5kZXh9ZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LHBsYWNlaG9sZGVyKXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9MDt3aGlsZShsZW5ndGgtLSlpZihhcnJheVtsZW5ndGhdPT09cGxhY2Vob2xkZXIpKytyZXN1bHQ7cmV0dXJuIHJlc3VsdH12YXIgZGVidXJyTGV0dGVyPWJhc2VQcm9wZXJ0eU9mKGRlYnVycmVkTGV0dGVycyk7dmFyIGVzY2FwZUh0bWxDaGFyPWJhc2VQcm9wZXJ0eU9mKGh0bWxFc2NhcGVzKTtmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocil7cmV0dXJuIlxcIisKc3RyaW5nRXNjYXBlc1tjaHJdfWZ1bmN0aW9uIGdldFZhbHVlKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3Q9PW51bGw/dW5kZWZpbmVkOm9iamVjdFtrZXldfWZ1bmN0aW9uIGhhc1VuaWNvZGUoc3RyaW5nKXtyZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKX1mdW5jdGlvbiBoYXNVbmljb2RlV29yZChzdHJpbmcpe3JldHVybiByZUhhc1VuaWNvZGVXb3JkLnRlc3Qoc3RyaW5nKX1mdW5jdGlvbiBpdGVyYXRvclRvQXJyYXkoaXRlcmF0b3Ipe3ZhciBkYXRhLHJlc3VsdD1bXTt3aGlsZSghKGRhdGE9aXRlcmF0b3IubmV4dCgpKS5kb25lKXJlc3VsdC5wdXNoKGRhdGEudmFsdWUpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbWFwVG9BcnJheShtYXApe3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobWFwLnNpemUpO21hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLGtleSl7cmVzdWx0WysraW5kZXhdPVtrZXksdmFsdWVdfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBvdmVyQXJnKGZ1bmMsCnRyYW5zZm9ybSl7cmV0dXJuIGZ1bmN0aW9uKGFyZyl7cmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpfX1mdW5jdGlvbiByZXBsYWNlSG9sZGVycyhhcnJheSxwbGFjZWhvbGRlcil7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgscmVzSW5kZXg9MCxyZXN1bHQ9W107d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF07aWYodmFsdWU9PT1wbGFjZWhvbGRlcnx8dmFsdWU9PT1QTEFDRUhPTERFUil7YXJyYXlbaW5kZXhdPVBMQUNFSE9MREVSO3Jlc3VsdFtyZXNJbmRleCsrXT1pbmRleH19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBzYWZlR2V0KG9iamVjdCxrZXkpe3JldHVybiBrZXk9PSJfX3Byb3RvX18iP3VuZGVmaW5lZDpvYmplY3Rba2V5XX1mdW5jdGlvbiBzZXRUb0FycmF5KHNldCl7dmFyIGluZGV4PS0xLHJlc3VsdD1BcnJheShzZXQuc2l6ZSk7c2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpe3Jlc3VsdFsrK2luZGV4XT12YWx1ZX0pOwpyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHNldFRvUGFpcnMoc2V0KXt2YXIgaW5kZXg9LTEscmVzdWx0PUFycmF5KHNldC5zaXplKTtzZXQuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPVt2YWx1ZSx2YWx1ZV19KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN0cmljdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDt3aGlsZSgrK2luZGV4PGxlbmd0aClpZihhcnJheVtpbmRleF09PT12YWx1ZSlyZXR1cm4gaW5kZXg7cmV0dXJuLTF9ZnVuY3Rpb24gc3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsZnJvbUluZGV4KXt2YXIgaW5kZXg9ZnJvbUluZGV4KzE7d2hpbGUoaW5kZXgtLSlpZihhcnJheVtpbmRleF09PT12YWx1ZSlyZXR1cm4gaW5kZXg7cmV0dXJuIGluZGV4fWZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKXtyZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpP3VuaWNvZGVTaXplKHN0cmluZyk6CmFzY2lpU2l6ZShzdHJpbmcpfWZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkoc3RyaW5nKXtyZXR1cm4gaGFzVW5pY29kZShzdHJpbmcpP3VuaWNvZGVUb0FycmF5KHN0cmluZyk6YXNjaWlUb0FycmF5KHN0cmluZyl9dmFyIHVuZXNjYXBlSHRtbENoYXI9YmFzZVByb3BlcnR5T2YoaHRtbFVuZXNjYXBlcyk7ZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKXt2YXIgcmVzdWx0PXJlVW5pY29kZS5sYXN0SW5kZXg9MDt3aGlsZShyZVVuaWNvZGUudGVzdChzdHJpbmcpKSsrcmVzdWx0O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKXtyZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZSl8fFtdfWZ1bmN0aW9uIHVuaWNvZGVXb3JkcyhzdHJpbmcpe3JldHVybiBzdHJpbmcubWF0Y2gocmVVbmljb2RlV29yZCl8fFtdfXZhciBydW5JbkNvbnRleHQ9ZnVuY3Rpb24gcnVuSW5Db250ZXh0KGNvbnRleHQpe2NvbnRleHQ9Y29udGV4dD09bnVsbD9yb290Ol8uZGVmYXVsdHMocm9vdC5PYmplY3QoKSwKY29udGV4dCxfLnBpY2socm9vdCxjb250ZXh0UHJvcHMpKTt2YXIgQXJyYXk9Y29udGV4dC5BcnJheSxEYXRlPWNvbnRleHQuRGF0ZSxFcnJvcj1jb250ZXh0LkVycm9yLEZ1bmN0aW9uPWNvbnRleHQuRnVuY3Rpb24sTWF0aD1jb250ZXh0Lk1hdGgsT2JqZWN0PWNvbnRleHQuT2JqZWN0LFJlZ0V4cD1jb250ZXh0LlJlZ0V4cCxTdHJpbmc9Y29udGV4dC5TdHJpbmcsVHlwZUVycm9yPWNvbnRleHQuVHlwZUVycm9yO3ZhciBhcnJheVByb3RvPUFycmF5LnByb3RvdHlwZSxmdW5jUHJvdG89RnVuY3Rpb24ucHJvdG90eXBlLG9iamVjdFByb3RvPU9iamVjdC5wcm90b3R5cGU7dmFyIGNvcmVKc0RhdGE9Y29udGV4dFsiX19jb3JlLWpzX3NoYXJlZF9fIl07dmFyIGZ1bmNUb1N0cmluZz1mdW5jUHJvdG8udG9TdHJpbmc7dmFyIGhhc093blByb3BlcnR5PW9iamVjdFByb3RvLmhhc093blByb3BlcnR5O3ZhciBpZENvdW50ZXI9MDt2YXIgbWFza1NyY0tleT1mdW5jdGlvbigpe3ZhciB1aWQ9Ci9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSYmY29yZUpzRGF0YS5rZXlzJiZjb3JlSnNEYXRhLmtleXMuSUVfUFJPVE98fCIiKTtyZXR1cm4gdWlkPyJTeW1ib2woc3JjKV8xLiIrdWlkOiIifSgpO3ZhciBuYXRpdmVPYmplY3RUb1N0cmluZz1vYmplY3RQcm90by50b1N0cmluZzt2YXIgb2JqZWN0Q3RvclN0cmluZz1mdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpO3ZhciBvbGREYXNoPXJvb3QuXzt2YXIgcmVJc05hdGl2ZT1SZWdFeHAoIl4iK2Z1bmNUb1N0cmluZy5jYWxsKGhhc093blByb3BlcnR5KS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwiXFwkXHgyNiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKTt2YXIgQnVmZmVyPW1vZHVsZUV4cG9ydHM/Y29udGV4dC5CdWZmZXI6dW5kZWZpbmVkLFN5bWJvbD1jb250ZXh0LlN5bWJvbCxVaW50OEFycmF5PWNvbnRleHQuVWludDhBcnJheSxhbGxvY1Vuc2FmZT0KQnVmZmVyP0J1ZmZlci5hbGxvY1Vuc2FmZTp1bmRlZmluZWQsZ2V0UHJvdG90eXBlPW92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLE9iamVjdCksb2JqZWN0Q3JlYXRlPU9iamVjdC5jcmVhdGUscHJvcGVydHlJc0VudW1lcmFibGU9b2JqZWN0UHJvdG8ucHJvcGVydHlJc0VudW1lcmFibGUsc3BsaWNlPWFycmF5UHJvdG8uc3BsaWNlLHNwcmVhZGFibGVTeW1ib2w9U3ltYm9sP1N5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGU6dW5kZWZpbmVkLHN5bUl0ZXJhdG9yPVN5bWJvbD9TeW1ib2wuaXRlcmF0b3I6dW5kZWZpbmVkLHN5bVRvU3RyaW5nVGFnPVN5bWJvbD9TeW1ib2wudG9TdHJpbmdUYWc6dW5kZWZpbmVkO3ZhciBkZWZpbmVQcm9wZXJ0eT1mdW5jdGlvbigpe3RyeXt2YXIgZnVuYz1nZXROYXRpdmUoT2JqZWN0LCJkZWZpbmVQcm9wZXJ0eSIpO2Z1bmMoe30sIiIse30pO3JldHVybiBmdW5jfWNhdGNoKGUpe319KCk7dmFyIGN0eENsZWFyVGltZW91dD1jb250ZXh0LmNsZWFyVGltZW91dCE9PQpyb290LmNsZWFyVGltZW91dCYmY29udGV4dC5jbGVhclRpbWVvdXQsY3R4Tm93PURhdGUmJkRhdGUubm93IT09cm9vdC5EYXRlLm5vdyYmRGF0ZS5ub3csY3R4U2V0VGltZW91dD1jb250ZXh0LnNldFRpbWVvdXQhPT1yb290LnNldFRpbWVvdXQmJmNvbnRleHQuc2V0VGltZW91dDt2YXIgbmF0aXZlQ2VpbD1NYXRoLmNlaWwsbmF0aXZlRmxvb3I9TWF0aC5mbG9vcixuYXRpdmVHZXRTeW1ib2xzPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsbmF0aXZlSXNCdWZmZXI9QnVmZmVyP0J1ZmZlci5pc0J1ZmZlcjp1bmRlZmluZWQsbmF0aXZlSXNGaW5pdGU9Y29udGV4dC5pc0Zpbml0ZSxuYXRpdmVKb2luPWFycmF5UHJvdG8uam9pbixuYXRpdmVLZXlzPW92ZXJBcmcoT2JqZWN0LmtleXMsT2JqZWN0KSxuYXRpdmVNYXg9TWF0aC5tYXgsbmF0aXZlTWluPU1hdGgubWluLG5hdGl2ZU5vdz1EYXRlLm5vdyxuYXRpdmVQYXJzZUludD1jb250ZXh0LnBhcnNlSW50LG5hdGl2ZVJhbmRvbT0KTWF0aC5yYW5kb20sbmF0aXZlUmV2ZXJzZT1hcnJheVByb3RvLnJldmVyc2U7dmFyIERhdGFWaWV3PWdldE5hdGl2ZShjb250ZXh0LCJEYXRhVmlldyIpLE1hcD1nZXROYXRpdmUoY29udGV4dCwiTWFwIiksUHJvbWlzZT1nZXROYXRpdmUoY29udGV4dCwiUHJvbWlzZSIpLFNldD1nZXROYXRpdmUoY29udGV4dCwiU2V0IiksV2Vha01hcD1nZXROYXRpdmUoY29udGV4dCwiV2Vha01hcCIpLG5hdGl2ZUNyZWF0ZT1nZXROYXRpdmUoT2JqZWN0LCJjcmVhdGUiKTt2YXIgbWV0YU1hcD1XZWFrTWFwJiZuZXcgV2Vha01hcDt2YXIgcmVhbE5hbWVzPXt9O3ZhciBkYXRhVmlld0N0b3JTdHJpbmc9dG9Tb3VyY2UoRGF0YVZpZXcpLG1hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoTWFwKSxwcm9taXNlQ3RvclN0cmluZz10b1NvdXJjZShQcm9taXNlKSxzZXRDdG9yU3RyaW5nPXRvU291cmNlKFNldCksd2Vha01hcEN0b3JTdHJpbmc9dG9Tb3VyY2UoV2Vha01hcCk7dmFyIHN5bWJvbFByb3RvPVN5bWJvbD8KU3ltYm9sLnByb3RvdHlwZTp1bmRlZmluZWQsc3ltYm9sVmFsdWVPZj1zeW1ib2xQcm90bz9zeW1ib2xQcm90by52YWx1ZU9mOnVuZGVmaW5lZCxzeW1ib2xUb1N0cmluZz1zeW1ib2xQcm90bz9zeW1ib2xQcm90by50b1N0cmluZzp1bmRlZmluZWQ7ZnVuY3Rpb24gbG9kYXNoKHZhbHVlKXtpZihpc09iamVjdExpa2UodmFsdWUpJiYhaXNBcnJheSh2YWx1ZSkmJiEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpe2lmKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcilyZXR1cm4gdmFsdWU7aWYoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwiX193cmFwcGVkX18iKSlyZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKX1yZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodmFsdWUpfXZhciBiYXNlQ3JlYXRlPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gb2JqZWN0KCl7fXJldHVybiBmdW5jdGlvbihwcm90byl7aWYoIWlzT2JqZWN0KHByb3RvKSlyZXR1cm57fTtpZihvYmplY3RDcmVhdGUpcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7Cm9iamVjdC5wcm90b3R5cGU9cHJvdG87dmFyIHJlc3VsdD1uZXcgb2JqZWN0O29iamVjdC5wcm90b3R5cGU9dW5kZWZpbmVkO3JldHVybiByZXN1bHR9fSgpO2Z1bmN0aW9uIGJhc2VMb2Rhc2goKXt9ZnVuY3Rpb24gTG9kYXNoV3JhcHBlcih2YWx1ZSxjaGFpbkFsbCl7dGhpcy5fX3dyYXBwZWRfXz12YWx1ZTt0aGlzLl9fYWN0aW9uc19fPVtdO3RoaXMuX19jaGFpbl9fPSEhY2hhaW5BbGw7dGhpcy5fX2luZGV4X189MDt0aGlzLl9fdmFsdWVzX189dW5kZWZpbmVkfWxvZGFzaC50ZW1wbGF0ZVNldHRpbmdzPXsiZXNjYXBlIjpyZUVzY2FwZSwiZXZhbHVhdGUiOnJlRXZhbHVhdGUsImludGVycG9sYXRlIjpyZUludGVycG9sYXRlLCJ2YXJpYWJsZSI6IiIsImltcG9ydHMiOnsiXyI6bG9kYXNofX07bG9kYXNoLnByb3RvdHlwZT1iYXNlTG9kYXNoLnByb3RvdHlwZTtsb2Rhc2gucHJvdG90eXBlLmNvbnN0cnVjdG9yPWxvZGFzaDtMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZT1iYXNlQ3JlYXRlKGJhc2VMb2Rhc2gucHJvdG90eXBlKTsKTG9kYXNoV3JhcHBlci5wcm90b3R5cGUuY29uc3RydWN0b3I9TG9kYXNoV3JhcHBlcjtmdW5jdGlvbiBMYXp5V3JhcHBlcih2YWx1ZSl7dGhpcy5fX3dyYXBwZWRfXz12YWx1ZTt0aGlzLl9fYWN0aW9uc19fPVtdO3RoaXMuX19kaXJfXz0xO3RoaXMuX19maWx0ZXJlZF9fPWZhbHNlO3RoaXMuX19pdGVyYXRlZXNfXz1bXTt0aGlzLl9fdGFrZUNvdW50X189TUFYX0FSUkFZX0xFTkdUSDt0aGlzLl9fdmlld3NfXz1bXX1mdW5jdGlvbiBsYXp5Q2xvbmUoKXt2YXIgcmVzdWx0PW5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHRoaXMuX19hY3Rpb25zX18pO3Jlc3VsdC5fX2Rpcl9fPXRoaXMuX19kaXJfXztyZXN1bHQuX19maWx0ZXJlZF9fPXRoaXMuX19maWx0ZXJlZF9fO3Jlc3VsdC5fX2l0ZXJhdGVlc19fPWNvcHlBcnJheSh0aGlzLl9faXRlcmF0ZWVzX18pO3Jlc3VsdC5fX3Rha2VDb3VudF9fPXRoaXMuX190YWtlQ291bnRfXzsKcmVzdWx0Ll9fdmlld3NfXz1jb3B5QXJyYXkodGhpcy5fX3ZpZXdzX18pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gbGF6eVJldmVyc2UoKXtpZih0aGlzLl9fZmlsdGVyZWRfXyl7dmFyIHJlc3VsdD1uZXcgTGF6eVdyYXBwZXIodGhpcyk7cmVzdWx0Ll9fZGlyX189LTE7cmVzdWx0Ll9fZmlsdGVyZWRfXz10cnVlfWVsc2V7cmVzdWx0PXRoaXMuY2xvbmUoKTtyZXN1bHQuX19kaXJfXyo9LTF9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsYXp5VmFsdWUoKXt2YXIgYXJyYXk9dGhpcy5fX3dyYXBwZWRfXy52YWx1ZSgpLGRpcj10aGlzLl9fZGlyX18saXNBcnI9aXNBcnJheShhcnJheSksaXNSaWdodD1kaXI8MCxhcnJMZW5ndGg9aXNBcnI/YXJyYXkubGVuZ3RoOjAsdmlldz1nZXRWaWV3KDAsYXJyTGVuZ3RoLHRoaXMuX192aWV3c19fKSxzdGFydD12aWV3LnN0YXJ0LGVuZD12aWV3LmVuZCxsZW5ndGg9ZW5kLXN0YXJ0LGluZGV4PWlzUmlnaHQ/ZW5kOnN0YXJ0LTEsaXRlcmF0ZWVzPXRoaXMuX19pdGVyYXRlZXNfXywKaXRlckxlbmd0aD1pdGVyYXRlZXMubGVuZ3RoLHJlc0luZGV4PTAsdGFrZUNvdW50PW5hdGl2ZU1pbihsZW5ndGgsdGhpcy5fX3Rha2VDb3VudF9fKTtpZighaXNBcnJ8fCFpc1JpZ2h0JiZhcnJMZW5ndGg9PWxlbmd0aCYmdGFrZUNvdW50PT1sZW5ndGgpcmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUoYXJyYXksdGhpcy5fX2FjdGlvbnNfXyk7dmFyIHJlc3VsdD1bXTtvdXRlcjp3aGlsZShsZW5ndGgtLSYmcmVzSW5kZXg8dGFrZUNvdW50KXtpbmRleCs9ZGlyO3ZhciBpdGVySW5kZXg9LTEsdmFsdWU9YXJyYXlbaW5kZXhdO3doaWxlKCsraXRlckluZGV4PGl0ZXJMZW5ndGgpe3ZhciBkYXRhPWl0ZXJhdGVlc1tpdGVySW5kZXhdLGl0ZXJhdGVlPWRhdGEuaXRlcmF0ZWUsdHlwZT1kYXRhLnR5cGUsY29tcHV0ZWQ9aXRlcmF0ZWUodmFsdWUpO2lmKHR5cGU9PUxBWllfTUFQX0ZMQUcpdmFsdWU9Y29tcHV0ZWQ7ZWxzZSBpZighY29tcHV0ZWQpaWYodHlwZT09TEFaWV9GSUxURVJfRkxBRyljb250aW51ZSBvdXRlcjsKZWxzZSBicmVhayBvdXRlcn1yZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1MYXp5V3JhcHBlci5wcm90b3R5cGU9YmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7TGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxhenlXcmFwcGVyO2Z1bmN0aW9uIEhhc2goZW50cmllcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1lbnRyaWVzPT1udWxsPzA6ZW50cmllcy5sZW5ndGg7dGhpcy5jbGVhcigpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZW50cnk9ZW50cmllc1tpbmRleF07dGhpcy5zZXQoZW50cnlbMF0sZW50cnlbMV0pfX1mdW5jdGlvbiBoYXNoQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPW5hdGl2ZUNyZWF0ZT9uYXRpdmVDcmVhdGUobnVsbCk6e307dGhpcy5zaXplPTB9ZnVuY3Rpb24gaGFzaERlbGV0ZShrZXkpe3ZhciByZXN1bHQ9dGhpcy5oYXMoa2V5KSYmZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTt0aGlzLnNpemUtPXJlc3VsdD8xOjA7CnJldHVybiByZXN1bHR9ZnVuY3Rpb24gaGFzaEdldChrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYobmF0aXZlQ3JlYXRlKXt2YXIgcmVzdWx0PWRhdGFba2V5XTtyZXR1cm4gcmVzdWx0PT09SEFTSF9VTkRFRklORUQ/dW5kZWZpbmVkOnJlc3VsdH1yZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLGtleSk/ZGF0YVtrZXldOnVuZGVmaW5lZH1mdW5jdGlvbiBoYXNoSGFzKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXztyZXR1cm4gbmF0aXZlQ3JlYXRlP2RhdGFba2V5XSE9PXVuZGVmaW5lZDpoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsa2V5KX1mdW5jdGlvbiBoYXNoU2V0KGtleSx2YWx1ZSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXzt0aGlzLnNpemUrPXRoaXMuaGFzKGtleSk/MDoxO2RhdGFba2V5XT1uYXRpdmVDcmVhdGUmJnZhbHVlPT09dW5kZWZpbmVkP0hBU0hfVU5ERUZJTkVEOnZhbHVlO3JldHVybiB0aGlzfUhhc2gucHJvdG90eXBlLmNsZWFyPWhhc2hDbGVhcjsKSGFzaC5wcm90b3R5cGVbImRlbGV0ZSJdPWhhc2hEZWxldGU7SGFzaC5wcm90b3R5cGUuZ2V0PWhhc2hHZXQ7SGFzaC5wcm90b3R5cGUuaGFzPWhhc2hIYXM7SGFzaC5wcm90b3R5cGUuc2V0PWhhc2hTZXQ7ZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9ZW50cmllcz09bnVsbD8wOmVudHJpZXMubGVuZ3RoO3RoaXMuY2xlYXIoKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGVudHJ5PWVudHJpZXNbaW5kZXhdO3RoaXMuc2V0KGVudHJ5WzBdLGVudHJ5WzFdKX19ZnVuY3Rpb24gbGlzdENhY2hlQ2xlYXIoKXt0aGlzLl9fZGF0YV9fPVtdO3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpe3ZhciBkYXRhPXRoaXMuX19kYXRhX18saW5kZXg9YXNzb2NJbmRleE9mKGRhdGEsa2V5KTtpZihpbmRleDwwKXJldHVybiBmYWxzZTt2YXIgbGFzdEluZGV4PWRhdGEubGVuZ3RoLTE7aWYoaW5kZXg9PWxhc3RJbmRleClkYXRhLnBvcCgpOwplbHNlIHNwbGljZS5jYWxsKGRhdGEsaW5kZXgsMSk7LS10aGlzLnNpemU7cmV0dXJuIHRydWV9ZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxpbmRleD1hc3NvY0luZGV4T2YoZGF0YSxrZXkpO3JldHVybiBpbmRleDwwP3VuZGVmaW5lZDpkYXRhW2luZGV4XVsxXX1mdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KXtyZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sa2V5KT4tMX1mdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fLGluZGV4PWFzc29jSW5kZXhPZihkYXRhLGtleSk7aWYoaW5kZXg8MCl7Kyt0aGlzLnNpemU7ZGF0YS5wdXNoKFtrZXksdmFsdWVdKX1lbHNlIGRhdGFbaW5kZXhdWzFdPXZhbHVlO3JldHVybiB0aGlzfUxpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXI9bGlzdENhY2hlQ2xlYXI7TGlzdENhY2hlLnByb3RvdHlwZVsiZGVsZXRlIl09bGlzdENhY2hlRGVsZXRlO0xpc3RDYWNoZS5wcm90b3R5cGUuZ2V0PQpsaXN0Q2FjaGVHZXQ7TGlzdENhY2hlLnByb3RvdHlwZS5oYXM9bGlzdENhY2hlSGFzO0xpc3RDYWNoZS5wcm90b3R5cGUuc2V0PWxpc3RDYWNoZVNldDtmdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWVudHJpZXM9PW51bGw/MDplbnRyaWVzLmxlbmd0aDt0aGlzLmNsZWFyKCk7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBlbnRyeT1lbnRyaWVzW2luZGV4XTt0aGlzLnNldChlbnRyeVswXSxlbnRyeVsxXSl9fWZ1bmN0aW9uIG1hcENhY2hlQ2xlYXIoKXt0aGlzLnNpemU9MDt0aGlzLl9fZGF0YV9fPXsiaGFzaCI6bmV3IEhhc2gsIm1hcCI6bmV3IChNYXB8fExpc3RDYWNoZSksInN0cmluZyI6bmV3IEhhc2h9fWZ1bmN0aW9uIG1hcENhY2hlRGVsZXRlKGtleSl7dmFyIHJlc3VsdD1nZXRNYXBEYXRhKHRoaXMsa2V5KVsiZGVsZXRlIl0oa2V5KTt0aGlzLnNpemUtPXJlc3VsdD8xOjA7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpe3JldHVybiBnZXRNYXBEYXRhKHRoaXMsCmtleSkuZ2V0KGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KXtyZXR1cm4gZ2V0TWFwRGF0YSh0aGlzLGtleSkuaGFzKGtleSl9ZnVuY3Rpb24gbWFwQ2FjaGVTZXQoa2V5LHZhbHVlKXt2YXIgZGF0YT1nZXRNYXBEYXRhKHRoaXMsa2V5KSxzaXplPWRhdGEuc2l6ZTtkYXRhLnNldChrZXksdmFsdWUpO3RoaXMuc2l6ZSs9ZGF0YS5zaXplPT1zaXplPzA6MTtyZXR1cm4gdGhpc31NYXBDYWNoZS5wcm90b3R5cGUuY2xlYXI9bWFwQ2FjaGVDbGVhcjtNYXBDYWNoZS5wcm90b3R5cGVbImRlbGV0ZSJdPW1hcENhY2hlRGVsZXRlO01hcENhY2hlLnByb3RvdHlwZS5nZXQ9bWFwQ2FjaGVHZXQ7TWFwQ2FjaGUucHJvdG90eXBlLmhhcz1tYXBDYWNoZUhhcztNYXBDYWNoZS5wcm90b3R5cGUuc2V0PW1hcENhY2hlU2V0O2Z1bmN0aW9uIFNldENhY2hlKHZhbHVlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD12YWx1ZXM9PW51bGw/MDp2YWx1ZXMubGVuZ3RoO3RoaXMuX19kYXRhX189bmV3IE1hcENhY2hlOwp3aGlsZSgrK2luZGV4PGxlbmd0aCl0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKX1mdW5jdGlvbiBzZXRDYWNoZUFkZCh2YWx1ZSl7dGhpcy5fX2RhdGFfXy5zZXQodmFsdWUsSEFTSF9VTkRFRklORUQpO3JldHVybiB0aGlzfWZ1bmN0aW9uIHNldENhY2hlSGFzKHZhbHVlKXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModmFsdWUpfVNldENhY2hlLnByb3RvdHlwZS5hZGQ9U2V0Q2FjaGUucHJvdG90eXBlLnB1c2g9c2V0Q2FjaGVBZGQ7U2V0Q2FjaGUucHJvdG90eXBlLmhhcz1zZXRDYWNoZUhhcztmdW5jdGlvbiBTdGFjayhlbnRyaWVzKXt2YXIgZGF0YT10aGlzLl9fZGF0YV9fPW5ldyBMaXN0Q2FjaGUoZW50cmllcyk7dGhpcy5zaXplPWRhdGEuc2l6ZX1mdW5jdGlvbiBzdGFja0NsZWFyKCl7dGhpcy5fX2RhdGFfXz1uZXcgTGlzdENhY2hlO3RoaXMuc2l6ZT0wfWZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSl7dmFyIGRhdGE9dGhpcy5fX2RhdGFfXyxyZXN1bHQ9ZGF0YVsiZGVsZXRlIl0oa2V5KTsKdGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHN0YWNrR2V0KGtleSl7cmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSl9ZnVuY3Rpb24gc3RhY2tIYXMoa2V5KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXMoa2V5KX1mdW5jdGlvbiBzdGFja1NldChrZXksdmFsdWUpe3ZhciBkYXRhPXRoaXMuX19kYXRhX187aWYoZGF0YSBpbnN0YW5jZW9mIExpc3RDYWNoZSl7dmFyIHBhaXJzPWRhdGEuX19kYXRhX187aWYoIU1hcHx8cGFpcnMubGVuZ3RoPExBUkdFX0FSUkFZX1NJWkUtMSl7cGFpcnMucHVzaChba2V5LHZhbHVlXSk7dGhpcy5zaXplPSsrZGF0YS5zaXplO3JldHVybiB0aGlzfWRhdGE9dGhpcy5fX2RhdGFfXz1uZXcgTWFwQ2FjaGUocGFpcnMpfWRhdGEuc2V0KGtleSx2YWx1ZSk7dGhpcy5zaXplPWRhdGEuc2l6ZTtyZXR1cm4gdGhpc31TdGFjay5wcm90b3R5cGUuY2xlYXI9c3RhY2tDbGVhcjtTdGFjay5wcm90b3R5cGVbImRlbGV0ZSJdPXN0YWNrRGVsZXRlOwpTdGFjay5wcm90b3R5cGUuZ2V0PXN0YWNrR2V0O1N0YWNrLnByb3RvdHlwZS5oYXM9c3RhY2tIYXM7U3RhY2sucHJvdG90eXBlLnNldD1zdGFja1NldDtmdW5jdGlvbiBhcnJheUxpa2VLZXlzKHZhbHVlLGluaGVyaXRlZCl7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpLGlzQXJnPSFpc0FyciYmaXNBcmd1bWVudHModmFsdWUpLGlzQnVmZj0haXNBcnImJiFpc0FyZyYmaXNCdWZmZXIodmFsdWUpLGlzVHlwZT0haXNBcnImJiFpc0FyZyYmIWlzQnVmZiYmaXNUeXBlZEFycmF5KHZhbHVlKSxza2lwSW5kZXhlcz1pc0Fycnx8aXNBcmd8fGlzQnVmZnx8aXNUeXBlLHJlc3VsdD1za2lwSW5kZXhlcz9iYXNlVGltZXModmFsdWUubGVuZ3RoLFN0cmluZyk6W10sbGVuZ3RoPXJlc3VsdC5sZW5ndGg7Zm9yKHZhciBrZXkgaW4gdmFsdWUpaWYoKGluaGVyaXRlZHx8aGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSxrZXkpKSYmIShza2lwSW5kZXhlcyYmKGtleT09Imxlbmd0aCJ8fGlzQnVmZiYmKGtleT09CiJvZmZzZXQifHxrZXk9PSJwYXJlbnQiKXx8aXNUeXBlJiYoa2V5PT0iYnVmZmVyInx8a2V5PT0iYnl0ZUxlbmd0aCJ8fGtleT09ImJ5dGVPZmZzZXQiKXx8aXNJbmRleChrZXksbGVuZ3RoKSkpKXJlc3VsdC5wdXNoKGtleSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9hcnJheVtiYXNlUmFuZG9tKDAsbGVuZ3RoLTEpXTp1bmRlZmluZWR9ZnVuY3Rpb24gYXJyYXlTYW1wbGVTaXplKGFycmF5LG4pe3JldHVybiBzaHVmZmxlU2VsZihjb3B5QXJyYXkoYXJyYXkpLGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSl9ZnVuY3Rpb24gYXJyYXlTaHVmZmxlKGFycmF5KXtyZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSl9ZnVuY3Rpb24gYXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXtpZih2YWx1ZSE9PXVuZGVmaW5lZCYmIWVxKG9iamVjdFtrZXldLHZhbHVlKXx8CnZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKWJhc2VBc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKX1mdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3Qsa2V5LHZhbHVlKXt2YXIgb2JqVmFsdWU9b2JqZWN0W2tleV07aWYoIShoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZlcShvYmpWYWx1ZSx2YWx1ZSkpfHx2YWx1ZT09PXVuZGVmaW5lZCYmIShrZXkgaW4gb2JqZWN0KSliYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSx2YWx1ZSl9ZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LGtleSl7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7d2hpbGUobGVuZ3RoLS0paWYoZXEoYXJyYXlbbGVuZ3RoXVswXSxrZXkpKXJldHVybiBsZW5ndGg7cmV0dXJuLTF9ZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbixzZXR0ZXIsaXRlcmF0ZWUsYWNjdW11bGF0b3Ipe2Jhc2VFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUsa2V5LGNvbGxlY3Rpb24pe3NldHRlcihhY2N1bXVsYXRvciwKdmFsdWUsaXRlcmF0ZWUodmFsdWUpLGNvbGxlY3Rpb24pfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LHNvdXJjZSl7cmV0dXJuIG9iamVjdCYmY29weU9iamVjdChzb3VyY2Usa2V5cyhzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gYmFzZUFzc2lnbkluKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3QmJmNvcHlPYmplY3Qoc291cmNlLGtleXNJbihzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksdmFsdWUpe2lmKGtleT09Il9fcHJvdG9fXyImJmRlZmluZVByb3BlcnR5KWRlZmluZVByb3BlcnR5KG9iamVjdCxrZXkseyJjb25maWd1cmFibGUiOnRydWUsImVudW1lcmFibGUiOnRydWUsInZhbHVlIjp2YWx1ZSwid3JpdGFibGUiOnRydWV9KTtlbHNlIG9iamVjdFtrZXldPXZhbHVlfWZ1bmN0aW9uIGJhc2VBdChvYmplY3QscGF0aHMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGF0aHMubGVuZ3RoLHJlc3VsdD0KQXJyYXkobGVuZ3RoKSxza2lwPW9iamVjdD09bnVsbDt3aGlsZSgrK2luZGV4PGxlbmd0aClyZXN1bHRbaW5kZXhdPXNraXA/dW5kZWZpbmVkOmdldChvYmplY3QscGF0aHNbaW5kZXhdKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VDbGFtcChudW1iZXIsbG93ZXIsdXBwZXIpe2lmKG51bWJlcj09PW51bWJlcil7aWYodXBwZXIhPT11bmRlZmluZWQpbnVtYmVyPW51bWJlcjw9dXBwZXI/bnVtYmVyOnVwcGVyO2lmKGxvd2VyIT09dW5kZWZpbmVkKW51bWJlcj1udW1iZXI+PWxvd2VyP251bWJlcjpsb3dlcn1yZXR1cm4gbnVtYmVyfWZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsa2V5LG9iamVjdCxzdGFjayl7dmFyIHJlc3VsdCxpc0RlZXA9Yml0bWFzayZDTE9ORV9ERUVQX0ZMQUcsaXNGbGF0PWJpdG1hc2smQ0xPTkVfRkxBVF9GTEFHLGlzRnVsbD1iaXRtYXNrJkNMT05FX1NZTUJPTFNfRkxBRztpZihjdXN0b21pemVyKXJlc3VsdD1vYmplY3Q/CmN1c3RvbWl6ZXIodmFsdWUsa2V5LG9iamVjdCxzdGFjayk6Y3VzdG9taXplcih2YWx1ZSk7aWYocmVzdWx0IT09dW5kZWZpbmVkKXJldHVybiByZXN1bHQ7aWYoIWlzT2JqZWN0KHZhbHVlKSlyZXR1cm4gdmFsdWU7dmFyIGlzQXJyPWlzQXJyYXkodmFsdWUpO2lmKGlzQXJyKXtyZXN1bHQ9aW5pdENsb25lQXJyYXkodmFsdWUpO2lmKCFpc0RlZXApcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSxyZXN1bHQpfWVsc2V7dmFyIHRhZz1nZXRUYWcodmFsdWUpLGlzRnVuYz10YWc9PWZ1bmNUYWd8fHRhZz09Z2VuVGFnO2lmKGlzQnVmZmVyKHZhbHVlKSlyZXR1cm4gY2xvbmVCdWZmZXIodmFsdWUsaXNEZWVwKTtpZih0YWc9PW9iamVjdFRhZ3x8dGFnPT1hcmdzVGFnfHxpc0Z1bmMmJiFvYmplY3Qpe3Jlc3VsdD1pc0ZsYXR8fGlzRnVuYz97fTppbml0Q2xvbmVPYmplY3QodmFsdWUpO2lmKCFpc0RlZXApcmV0dXJuIGlzRmxhdD9jb3B5U3ltYm9sc0luKHZhbHVlLGJhc2VBc3NpZ25JbihyZXN1bHQsCnZhbHVlKSk6Y29weVN5bWJvbHModmFsdWUsYmFzZUFzc2lnbihyZXN1bHQsdmFsdWUpKX1lbHNle2lmKCFjbG9uZWFibGVUYWdzW3RhZ10pcmV0dXJuIG9iamVjdD92YWx1ZTp7fTtyZXN1bHQ9aW5pdENsb25lQnlUYWcodmFsdWUsdGFnLGlzRGVlcCl9fXN0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTt2YXIgc3RhY2tlZD1zdGFjay5nZXQodmFsdWUpO2lmKHN0YWNrZWQpcmV0dXJuIHN0YWNrZWQ7c3RhY2suc2V0KHZhbHVlLHJlc3VsdCk7aWYoaXNTZXQodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlKXtyZXN1bHQuYWRkKGJhc2VDbG9uZShzdWJWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3ViVmFsdWUsdmFsdWUsc3RhY2spKX0pO3JldHVybiByZXN1bHR9aWYoaXNNYXAodmFsdWUpKXt2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7cmVzdWx0LnNldChrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsCnN0YWNrKSl9KTtyZXR1cm4gcmVzdWx0fXZhciBrZXlzRnVuYz1pc0Z1bGw/aXNGbGF0P2dldEFsbEtleXNJbjpnZXRBbGxLZXlzOmlzRmxhdD9rZXlzSW46a2V5czt2YXIgcHJvcHM9aXNBcnI/dW5kZWZpbmVkOmtleXNGdW5jKHZhbHVlKTthcnJheUVhY2gocHJvcHN8fHZhbHVlLGZ1bmN0aW9uKHN1YlZhbHVlLGtleSl7aWYocHJvcHMpe2tleT1zdWJWYWx1ZTtzdWJWYWx1ZT12YWx1ZVtrZXldfWFzc2lnblZhbHVlKHJlc3VsdCxrZXksYmFzZUNsb25lKHN1YlZhbHVlLGJpdG1hc2ssY3VzdG9taXplcixrZXksdmFsdWUsc3RhY2spKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUNvbmZvcm1zKHNvdXJjZSl7dmFyIHByb3BzPWtleXMoc291cmNlKTtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtyZXR1cm4gYmFzZUNvbmZvcm1zVG8ob2JqZWN0LHNvdXJjZSxwcm9wcyl9fWZ1bmN0aW9uIGJhc2VDb25mb3Jtc1RvKG9iamVjdCxzb3VyY2UscHJvcHMpe3ZhciBsZW5ndGg9cHJvcHMubGVuZ3RoOwppZihvYmplY3Q9PW51bGwpcmV0dXJuIWxlbmd0aDtvYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cHJvcHNbbGVuZ3RoXSxwcmVkaWNhdGU9c291cmNlW2tleV0sdmFsdWU9b2JqZWN0W2tleV07aWYodmFsdWU9PT11bmRlZmluZWQmJiEoa2V5IGluIG9iamVjdCl8fCFwcmVkaWNhdGUodmFsdWUpKXJldHVybiBmYWxzZX1yZXR1cm4gdHJ1ZX1mdW5jdGlvbiBiYXNlRGVsYXkoZnVuYyx3YWl0LGFyZ3Mpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe2Z1bmMuYXBwbHkodW5kZWZpbmVkLGFyZ3MpfSx3YWl0KX1mdW5jdGlvbiBiYXNlRGlmZmVyZW5jZShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUsY29tcGFyYXRvcil7dmFyIGluZGV4PS0xLGluY2x1ZGVzPWFycmF5SW5jbHVkZXMsaXNDb21tb249dHJ1ZSxsZW5ndGg9YXJyYXkubGVuZ3RoLApyZXN1bHQ9W10sdmFsdWVzTGVuZ3RoPXZhbHVlcy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4gcmVzdWx0O2lmKGl0ZXJhdGVlKXZhbHVlcz1hcnJheU1hcCh2YWx1ZXMsYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7aWYoY29tcGFyYXRvcil7aW5jbHVkZXM9YXJyYXlJbmNsdWRlc1dpdGg7aXNDb21tb249ZmFsc2V9ZWxzZSBpZih2YWx1ZXMubGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXtpbmNsdWRlcz1jYWNoZUhhcztpc0NvbW1vbj1mYWxzZTt2YWx1ZXM9bmV3IFNldENhY2hlKHZhbHVlcyl9b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciB2YWx1ZT1hcnJheVtpbmRleF0sY29tcHV0ZWQ9aXRlcmF0ZWU9PW51bGw/dmFsdWU6aXRlcmF0ZWUodmFsdWUpO3ZhbHVlPWNvbXBhcmF0b3J8fHZhbHVlIT09MD92YWx1ZTowO2lmKGlzQ29tbW9uJiZjb21wdXRlZD09PWNvbXB1dGVkKXt2YXIgdmFsdWVzSW5kZXg9dmFsdWVzTGVuZ3RoO3doaWxlKHZhbHVlc0luZGV4LS0paWYodmFsdWVzW3ZhbHVlc0luZGV4XT09PQpjb21wdXRlZCljb250aW51ZSBvdXRlcjtyZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXModmFsdWVzLGNvbXB1dGVkLGNvbXBhcmF0b3IpKXJlc3VsdC5wdXNoKHZhbHVlKX1yZXR1cm4gcmVzdWx0fXZhciBiYXNlRWFjaD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTt2YXIgYmFzZUVhY2hSaWdodD1jcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duUmlnaHQsdHJ1ZSk7ZnVuY3Rpb24gYmFzZUV2ZXJ5KGNvbGxlY3Rpb24scHJlZGljYXRlKXt2YXIgcmVzdWx0PXRydWU7YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtyZXN1bHQ9ISFwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIHJlc3VsdH0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZUV4dHJlbXVtKGFycmF5LGl0ZXJhdGVlLGNvbXBhcmF0b3Ipe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9CmFycmF5W2luZGV4XSxjdXJyZW50PWl0ZXJhdGVlKHZhbHVlKTtpZihjdXJyZW50IT1udWxsJiYoY29tcHV0ZWQ9PT11bmRlZmluZWQ/Y3VycmVudD09PWN1cnJlbnQmJiFpc1N5bWJvbChjdXJyZW50KTpjb21wYXJhdG9yKGN1cnJlbnQsY29tcHV0ZWQpKSl2YXIgY29tcHV0ZWQ9Y3VycmVudCxyZXN1bHQ9dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO3N0YXJ0PXRvSW50ZWdlcihzdGFydCk7aWYoc3RhcnQ8MClzdGFydD0tc3RhcnQ+bGVuZ3RoPzA6bGVuZ3RoK3N0YXJ0O2VuZD1lbmQ9PT11bmRlZmluZWR8fGVuZD5sZW5ndGg/bGVuZ3RoOnRvSW50ZWdlcihlbmQpO2lmKGVuZDwwKWVuZCs9bGVuZ3RoO2VuZD1zdGFydD5lbmQ/MDp0b0xlbmd0aChlbmQpO3doaWxlKHN0YXJ0PGVuZClhcnJheVtzdGFydCsrXT12YWx1ZTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLApwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxpbmRleCxjb2xsZWN0aW9uKXtpZihwcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbikpcmVzdWx0LnB1c2godmFsdWUpfSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSxkZXB0aCxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtwcmVkaWNhdGV8fChwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZSk7cmVzdWx0fHwocmVzdWx0PVtdKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihkZXB0aD4wJiZwcmVkaWNhdGUodmFsdWUpKWlmKGRlcHRoPjEpYmFzZUZsYXR0ZW4odmFsdWUsZGVwdGgtMSxwcmVkaWNhdGUsaXNTdHJpY3QscmVzdWx0KTtlbHNlIGFycmF5UHVzaChyZXN1bHQsdmFsdWUpO2Vsc2UgaWYoIWlzU3RyaWN0KXJlc3VsdFtyZXN1bHQubGVuZ3RoXT0KdmFsdWV9cmV0dXJuIHJlc3VsdH12YXIgYmFzZUZvcj1jcmVhdGVCYXNlRm9yKCk7dmFyIGJhc2VGb3JSaWdodD1jcmVhdGVCYXNlRm9yKHRydWUpO2Z1bmN0aW9uIGJhc2VGb3JPd24ob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yKG9iamVjdCxpdGVyYXRlZSxrZXlzKX1mdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yUmlnaHQob2JqZWN0LGl0ZXJhdGVlLGtleXMpfWZ1bmN0aW9uIGJhc2VGdW5jdGlvbnMob2JqZWN0LHByb3BzKXtyZXR1cm4gYXJyYXlGaWx0ZXIocHJvcHMsZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXNGdW5jdGlvbihvYmplY3Rba2V5XSl9KX1mdW5jdGlvbiBiYXNlR2V0KG9iamVjdCxwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9MCxsZW5ndGg9cGF0aC5sZW5ndGg7d2hpbGUob2JqZWN0IT1udWxsJiZpbmRleDxsZW5ndGgpb2JqZWN0PW9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07CnJldHVybiBpbmRleCYmaW5kZXg9PWxlbmd0aD9vYmplY3Q6dW5kZWZpbmVkfWZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzRnVuYyxzeW1ib2xzRnVuYyl7dmFyIHJlc3VsdD1rZXlzRnVuYyhvYmplY3QpO3JldHVybiBpc0FycmF5KG9iamVjdCk/cmVzdWx0OmFycmF5UHVzaChyZXN1bHQsc3ltYm9sc0Z1bmMob2JqZWN0KSl9ZnVuY3Rpb24gYmFzZUdldFRhZyh2YWx1ZSl7aWYodmFsdWU9PW51bGwpcmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkP3VuZGVmaW5lZFRhZzpudWxsVGFnO3JldHVybiBzeW1Ub1N0cmluZ1RhZyYmc3ltVG9TdHJpbmdUYWcgaW4gT2JqZWN0KHZhbHVlKT9nZXRSYXdUYWcodmFsdWUpOm9iamVjdFRvU3RyaW5nKHZhbHVlKX1mdW5jdGlvbiBiYXNlR3QodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT5vdGhlcn1mdW5jdGlvbiBiYXNlSGFzKG9iamVjdCxrZXkpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LAprZXkpfWZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3Qsa2V5KXtyZXR1cm4gb2JqZWN0IT1udWxsJiZrZXkgaW4gT2JqZWN0KG9iamVjdCl9ZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7cmV0dXJuIG51bWJlcj49bmF0aXZlTWluKHN0YXJ0LGVuZCkmJm51bWJlcjxuYXRpdmVNYXgoc3RhcnQsZW5kKX1mdW5jdGlvbiBiYXNlSW50ZXJzZWN0aW9uKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5jbHVkZXM9Y29tcGFyYXRvcj9hcnJheUluY2x1ZGVzV2l0aDphcnJheUluY2x1ZGVzLGxlbmd0aD1hcnJheXNbMF0ubGVuZ3RoLG90aExlbmd0aD1hcnJheXMubGVuZ3RoLG90aEluZGV4PW90aExlbmd0aCxjYWNoZXM9QXJyYXkob3RoTGVuZ3RoKSxtYXhMZW5ndGg9SW5maW5pdHkscmVzdWx0PVtdO3doaWxlKG90aEluZGV4LS0pe3ZhciBhcnJheT1hcnJheXNbb3RoSW5kZXhdO2lmKG90aEluZGV4JiZpdGVyYXRlZSlhcnJheT1hcnJheU1hcChhcnJheSwKYmFzZVVuYXJ5KGl0ZXJhdGVlKSk7bWF4TGVuZ3RoPW5hdGl2ZU1pbihhcnJheS5sZW5ndGgsbWF4TGVuZ3RoKTtjYWNoZXNbb3RoSW5kZXhdPSFjb21wYXJhdG9yJiYoaXRlcmF0ZWV8fGxlbmd0aD49MTIwJiZhcnJheS5sZW5ndGg+PTEyMCk/bmV3IFNldENhY2hlKG90aEluZGV4JiZhcnJheSk6dW5kZWZpbmVkfWFycmF5PWFycmF5c1swXTt2YXIgaW5kZXg9LTEsc2Vlbj1jYWNoZXNbMF07b3V0ZXI6d2hpbGUoKytpbmRleDxsZW5ndGgmJnJlc3VsdC5sZW5ndGg8bWF4TGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTt2YWx1ZT1jb21wYXJhdG9yfHx2YWx1ZSE9PTA/dmFsdWU6MDtpZighKHNlZW4/Y2FjaGVIYXMoc2Vlbixjb21wdXRlZCk6aW5jbHVkZXMocmVzdWx0LGNvbXB1dGVkLGNvbXBhcmF0b3IpKSl7b3RoSW5kZXg9b3RoTGVuZ3RoO3doaWxlKC0tb3RoSW5kZXgpe3ZhciBjYWNoZT1jYWNoZXNbb3RoSW5kZXhdOwppZighKGNhY2hlP2NhY2hlSGFzKGNhY2hlLGNvbXB1dGVkKTppbmNsdWRlcyhhcnJheXNbb3RoSW5kZXhdLGNvbXB1dGVkLGNvbXBhcmF0b3IpKSljb250aW51ZSBvdXRlcn1pZihzZWVuKXNlZW4ucHVzaChjb21wdXRlZCk7cmVzdWx0LnB1c2godmFsdWUpfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXtiYXNlRm9yT3duKG9iamVjdCxmdW5jdGlvbih2YWx1ZSxrZXksb2JqZWN0KXtzZXR0ZXIoYWNjdW11bGF0b3IsaXRlcmF0ZWUodmFsdWUpLGtleSxvYmplY3QpfSk7cmV0dXJuIGFjY3VtdWxhdG9yfWZ1bmN0aW9uIGJhc2VJbnZva2Uob2JqZWN0LHBhdGgsYXJncyl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7b2JqZWN0PXBhcmVudChvYmplY3QscGF0aCk7dmFyIGZ1bmM9b2JqZWN0PT1udWxsP29iamVjdDpvYmplY3RbdG9LZXkobGFzdChwYXRoKSldO3JldHVybiBmdW5jPT1udWxsP3VuZGVmaW5lZDoKYXBwbHkoZnVuYyxvYmplY3QsYXJncyl9ZnVuY3Rpb24gYmFzZUlzQXJndW1lbnRzKHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmYmFzZUdldFRhZyh2YWx1ZSk9PWFyZ3NUYWd9ZnVuY3Rpb24gYmFzZUlzQXJyYXlCdWZmZXIodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09YXJyYXlCdWZmZXJUYWd9ZnVuY3Rpb24gYmFzZUlzRGF0ZSh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1kYXRlVGFnfWZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl7aWYodmFsdWU9PT1vdGhlcilyZXR1cm4gdHJ1ZTtpZih2YWx1ZT09bnVsbHx8b3RoZXI9PW51bGx8fCFpc09iamVjdExpa2UodmFsdWUpJiYhaXNPYmplY3RMaWtlKG90aGVyKSlyZXR1cm4gdmFsdWUhPT12YWx1ZSYmb3RoZXIhPT1vdGhlcjtyZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLApvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsYmFzZUlzRXF1YWwsc3RhY2spfWZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3Qsb3RoZXIsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl7dmFyIG9iaklzQXJyPWlzQXJyYXkob2JqZWN0KSxvdGhJc0Fycj1pc0FycmF5KG90aGVyKSxvYmpUYWc9b2JqSXNBcnI/YXJyYXlUYWc6Z2V0VGFnKG9iamVjdCksb3RoVGFnPW90aElzQXJyP2FycmF5VGFnOmdldFRhZyhvdGhlcik7b2JqVGFnPW9ialRhZz09YXJnc1RhZz9vYmplY3RUYWc6b2JqVGFnO290aFRhZz1vdGhUYWc9PWFyZ3NUYWc/b2JqZWN0VGFnOm90aFRhZzt2YXIgb2JqSXNPYmo9b2JqVGFnPT1vYmplY3RUYWcsb3RoSXNPYmo9b3RoVGFnPT1vYmplY3RUYWcsaXNTYW1lVGFnPW9ialRhZz09b3RoVGFnO2lmKGlzU2FtZVRhZyYmaXNCdWZmZXIob2JqZWN0KSl7aWYoIWlzQnVmZmVyKG90aGVyKSlyZXR1cm4gZmFsc2U7b2JqSXNBcnI9dHJ1ZTtvYmpJc09iaj0KZmFsc2V9aWYoaXNTYW1lVGFnJiYhb2JqSXNPYmope3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gb2JqSXNBcnJ8fGlzVHlwZWRBcnJheShvYmplY3QpP2VxdWFsQXJyYXlzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTplcXVhbEJ5VGFnKG9iamVjdCxvdGhlcixvYmpUYWcsYml0bWFzayxjdXN0b21pemVyLGVxdWFsRnVuYyxzdGFjayl9aWYoIShiaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHKSl7dmFyIG9iaklzV3JhcHBlZD1vYmpJc09iaiYmaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIl9fd3JhcHBlZF9fIiksb3RoSXNXcmFwcGVkPW90aElzT2JqJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCJfX3dyYXBwZWRfXyIpO2lmKG9iaklzV3JhcHBlZHx8b3RoSXNXcmFwcGVkKXt2YXIgb2JqVW53cmFwcGVkPW9iaklzV3JhcHBlZD9vYmplY3QudmFsdWUoKTpvYmplY3Qsb3RoVW53cmFwcGVkPW90aElzV3JhcHBlZD9vdGhlci52YWx1ZSgpOgpvdGhlcjtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7cmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsb3RoVW53cmFwcGVkLGJpdG1hc2ssY3VzdG9taXplcixzdGFjayl9fWlmKCFpc1NhbWVUYWcpcmV0dXJuIGZhbHNlO3N0YWNrfHwoc3RhY2s9bmV3IFN0YWNrKTtyZXR1cm4gZXF1YWxPYmplY3RzKG9iamVjdCxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKX1mdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZnZXRUYWcodmFsdWUpPT1tYXBUYWd9ZnVuY3Rpb24gYmFzZUlzTWF0Y2gob2JqZWN0LHNvdXJjZSxtYXRjaERhdGEsY3VzdG9taXplcil7dmFyIGluZGV4PW1hdGNoRGF0YS5sZW5ndGgsbGVuZ3RoPWluZGV4LG5vQ3VzdG9taXplcj0hY3VzdG9taXplcjtpZihvYmplY3Q9PW51bGwpcmV0dXJuIWxlbmd0aDtvYmplY3Q9T2JqZWN0KG9iamVjdCk7d2hpbGUoaW5kZXgtLSl7dmFyIGRhdGE9bWF0Y2hEYXRhW2luZGV4XTsKaWYobm9DdXN0b21pemVyJiZkYXRhWzJdP2RhdGFbMV0hPT1vYmplY3RbZGF0YVswXV06IShkYXRhWzBdaW4gb2JqZWN0KSlyZXR1cm4gZmFsc2V9d2hpbGUoKytpbmRleDxsZW5ndGgpe2RhdGE9bWF0Y2hEYXRhW2luZGV4XTt2YXIga2V5PWRhdGFbMF0sb2JqVmFsdWU9b2JqZWN0W2tleV0sc3JjVmFsdWU9ZGF0YVsxXTtpZihub0N1c3RvbWl6ZXImJmRhdGFbMl0pe2lmKG9ialZhbHVlPT09dW5kZWZpbmVkJiYhKGtleSBpbiBvYmplY3QpKXJldHVybiBmYWxzZX1lbHNle3ZhciBzdGFjaz1uZXcgU3RhY2s7aWYoY3VzdG9taXplcil2YXIgcmVzdWx0PWN1c3RvbWl6ZXIob2JqVmFsdWUsc3JjVmFsdWUsa2V5LG9iamVjdCxzb3VyY2Usc3RhY2spO2lmKCEocmVzdWx0PT09dW5kZWZpbmVkP2Jhc2VJc0VxdWFsKHNyY1ZhbHVlLG9ialZhbHVlLENPTVBBUkVfUEFSVElBTF9GTEFHfENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsY3VzdG9taXplcixzdGFjayk6cmVzdWx0KSlyZXR1cm4gZmFsc2V9fXJldHVybiB0cnVlfQpmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpe2lmKCFpc09iamVjdCh2YWx1ZSl8fGlzTWFza2VkKHZhbHVlKSlyZXR1cm4gZmFsc2U7dmFyIHBhdHRlcm49aXNGdW5jdGlvbih2YWx1ZSk/cmVJc05hdGl2ZTpyZUlzSG9zdEN0b3I7cmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpfWZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1yZWdleHBUYWd9ZnVuY3Rpb24gYmFzZUlzU2V0KHZhbHVlKXtyZXR1cm4gaXNPYmplY3RMaWtlKHZhbHVlKSYmZ2V0VGFnKHZhbHVlKT09c2V0VGFnfWZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZpc0xlbmd0aCh2YWx1ZS5sZW5ndGgpJiYhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXX1mdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09ImZ1bmN0aW9uIilyZXR1cm4gdmFsdWU7CmlmKHZhbHVlPT1udWxsKXJldHVybiBpZGVudGl0eTtpZih0eXBlb2YgdmFsdWU9PSJvYmplY3QiKXJldHVybiBpc0FycmF5KHZhbHVlKT9iYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLHZhbHVlWzFdKTpiYXNlTWF0Y2hlcyh2YWx1ZSk7cmV0dXJuIHByb3BlcnR5KHZhbHVlKX1mdW5jdGlvbiBiYXNlS2V5cyhvYmplY3Qpe2lmKCFpc1Byb3RvdHlwZShvYmplY3QpKXJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7dmFyIHJlc3VsdD1bXTtmb3IodmFyIGtleSBpbiBPYmplY3Qob2JqZWN0KSlpZihoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpJiZrZXkhPSJjb25zdHJ1Y3RvciIpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KXtpZighaXNPYmplY3Qob2JqZWN0KSlyZXR1cm4gbmF0aXZlS2V5c0luKG9iamVjdCk7dmFyIGlzUHJvdG89aXNQcm90b3R5cGUob2JqZWN0KSxyZXN1bHQ9W107Zm9yKHZhciBrZXkgaW4gb2JqZWN0KWlmKCEoa2V5PT0KImNvbnN0cnVjdG9yIiYmKGlzUHJvdG98fCFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCxrZXkpKSkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPG90aGVyfWZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGluZGV4PS0xLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7cmVzdWx0WysraW5kZXhdPWl0ZXJhdGVlKHZhbHVlLGtleSxjb2xsZWN0aW9uKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKXt2YXIgbWF0Y2hEYXRhPWdldE1hdGNoRGF0YShzb3VyY2UpO2lmKG1hdGNoRGF0YS5sZW5ndGg9PTEmJm1hdGNoRGF0YVswXVsyXSlyZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLAptYXRjaERhdGFbMF1bMV0pO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBvYmplY3Q9PT1zb3VyY2V8fGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsbWF0Y2hEYXRhKX19ZnVuY3Rpb24gYmFzZU1hdGNoZXNQcm9wZXJ0eShwYXRoLHNyY1ZhbHVlKXtpZihpc0tleShwYXRoKSYmaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSlyZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUodG9LZXkocGF0aCksc3JjVmFsdWUpO3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3ZhciBvYmpWYWx1ZT1nZXQob2JqZWN0LHBhdGgpO3JldHVybiBvYmpWYWx1ZT09PXVuZGVmaW5lZCYmb2JqVmFsdWU9PT1zcmNWYWx1ZT9oYXNJbihvYmplY3QscGF0aCk6YmFzZUlzRXF1YWwoc3JjVmFsdWUsb2JqVmFsdWUsQ09NUEFSRV9QQVJUSUFMX0ZMQUd8Q09NUEFSRV9VTk9SREVSRURfRkxBRyl9fWZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4LGN1c3RvbWl6ZXIsc3RhY2spe2lmKG9iamVjdD09PQpzb3VyY2UpcmV0dXJuO2Jhc2VGb3Ioc291cmNlLGZ1bmN0aW9uKHNyY1ZhbHVlLGtleSl7aWYoaXNPYmplY3Qoc3JjVmFsdWUpKXtzdGFja3x8KHN0YWNrPW5ldyBTdGFjayk7YmFzZU1lcmdlRGVlcChvYmplY3Qsc291cmNlLGtleSxzcmNJbmRleCxiYXNlTWVyZ2UsY3VzdG9taXplcixzdGFjayl9ZWxzZXt2YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKHNhZmVHZXQob2JqZWN0LGtleSksc3JjVmFsdWUsa2V5KyIiLG9iamVjdCxzb3VyY2Usc3RhY2spOnVuZGVmaW5lZDtpZihuZXdWYWx1ZT09PXVuZGVmaW5lZCluZXdWYWx1ZT1zcmNWYWx1ZTthc3NpZ25NZXJnZVZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpfX0sa2V5c0luKX1mdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCxzb3VyY2Usa2V5LHNyY0luZGV4LG1lcmdlRnVuYyxjdXN0b21pemVyLHN0YWNrKXt2YXIgb2JqVmFsdWU9c2FmZUdldChvYmplY3Qsa2V5KSxzcmNWYWx1ZT1zYWZlR2V0KHNvdXJjZSwKa2V5KSxzdGFja2VkPXN0YWNrLmdldChzcmNWYWx1ZSk7aWYoc3RhY2tlZCl7YXNzaWduTWVyZ2VWYWx1ZShvYmplY3Qsa2V5LHN0YWNrZWQpO3JldHVybn12YXIgbmV3VmFsdWU9Y3VzdG9taXplcj9jdXN0b21pemVyKG9ialZhbHVlLHNyY1ZhbHVlLGtleSsiIixvYmplY3Qsc291cmNlLHN0YWNrKTp1bmRlZmluZWQ7dmFyIGlzQ29tbW9uPW5ld1ZhbHVlPT09dW5kZWZpbmVkO2lmKGlzQ29tbW9uKXt2YXIgaXNBcnI9aXNBcnJheShzcmNWYWx1ZSksaXNCdWZmPSFpc0FyciYmaXNCdWZmZXIoc3JjVmFsdWUpLGlzVHlwZWQ9IWlzQXJyJiYhaXNCdWZmJiZpc1R5cGVkQXJyYXkoc3JjVmFsdWUpO25ld1ZhbHVlPXNyY1ZhbHVlO2lmKGlzQXJyfHxpc0J1ZmZ8fGlzVHlwZWQpaWYoaXNBcnJheShvYmpWYWx1ZSkpbmV3VmFsdWU9b2JqVmFsdWU7ZWxzZSBpZihpc0FycmF5TGlrZU9iamVjdChvYmpWYWx1ZSkpbmV3VmFsdWU9Y29weUFycmF5KG9ialZhbHVlKTtlbHNlIGlmKGlzQnVmZil7aXNDb21tb249CmZhbHNlO25ld1ZhbHVlPWNsb25lQnVmZmVyKHNyY1ZhbHVlLHRydWUpfWVsc2UgaWYoaXNUeXBlZCl7aXNDb21tb249ZmFsc2U7bmV3VmFsdWU9Y2xvbmVUeXBlZEFycmF5KHNyY1ZhbHVlLHRydWUpfWVsc2UgbmV3VmFsdWU9W107ZWxzZSBpZihpc1BsYWluT2JqZWN0KHNyY1ZhbHVlKXx8aXNBcmd1bWVudHMoc3JjVmFsdWUpKXtuZXdWYWx1ZT1vYmpWYWx1ZTtpZihpc0FyZ3VtZW50cyhvYmpWYWx1ZSkpbmV3VmFsdWU9dG9QbGFpbk9iamVjdChvYmpWYWx1ZSk7ZWxzZSBpZighaXNPYmplY3Qob2JqVmFsdWUpfHxzcmNJbmRleCYmaXNGdW5jdGlvbihvYmpWYWx1ZSkpbmV3VmFsdWU9aW5pdENsb25lT2JqZWN0KHNyY1ZhbHVlKX1lbHNlIGlzQ29tbW9uPWZhbHNlfWlmKGlzQ29tbW9uKXtzdGFjay5zZXQoc3JjVmFsdWUsbmV3VmFsdWUpO21lcmdlRnVuYyhuZXdWYWx1ZSxzcmNWYWx1ZSxzcmNJbmRleCxjdXN0b21pemVyLHN0YWNrKTtzdGFja1siZGVsZXRlIl0oc3JjVmFsdWUpfWFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LAprZXksbmV3VmFsdWUpfWZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksbil7dmFyIGxlbmd0aD1hcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm47bis9bjwwP2xlbmd0aDowO3JldHVybiBpc0luZGV4KG4sbGVuZ3RoKT9hcnJheVtuXTp1bmRlZmluZWR9ZnVuY3Rpb24gYmFzZU9yZGVyQnkoY29sbGVjdGlvbixpdGVyYXRlZXMsb3JkZXJzKXt2YXIgaW5kZXg9LTE7aXRlcmF0ZWVzPWFycmF5TWFwKGl0ZXJhdGVlcy5sZW5ndGg/aXRlcmF0ZWVzOltpZGVudGl0eV0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTt2YXIgcmVzdWx0PWJhc2VNYXAoY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSxrZXksY29sbGVjdGlvbil7dmFyIGNyaXRlcmlhPWFycmF5TWFwKGl0ZXJhdGVlcyxmdW5jdGlvbihpdGVyYXRlZSl7cmV0dXJuIGl0ZXJhdGVlKHZhbHVlKX0pO3JldHVybnsiY3JpdGVyaWEiOmNyaXRlcmlhLCJpbmRleCI6KytpbmRleCwidmFsdWUiOnZhbHVlfX0pO3JldHVybiBiYXNlU29ydEJ5KHJlc3VsdCwKZnVuY3Rpb24ob2JqZWN0LG90aGVyKXtyZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCxvdGhlcixvcmRlcnMpfSl9ZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LHBhdGhzKXtyZXR1cm4gYmFzZVBpY2tCeShvYmplY3QscGF0aHMsZnVuY3Rpb24odmFsdWUscGF0aCl7cmV0dXJuIGhhc0luKG9iamVjdCxwYXRoKX0pfWZ1bmN0aW9uIGJhc2VQaWNrQnkob2JqZWN0LHBhdGhzLHByZWRpY2F0ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRocy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGF0aD1wYXRoc1tpbmRleF0sdmFsdWU9YmFzZUdldChvYmplY3QscGF0aCk7aWYocHJlZGljYXRlKHZhbHVlLHBhdGgpKWJhc2VTZXQocmVzdWx0LGNhc3RQYXRoKHBhdGgsb2JqZWN0KSx2YWx1ZSl9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlR2V0KG9iamVjdCxwYXRoKX19CmZ1bmN0aW9uIGJhc2VQdWxsQWxsKGFycmF5LHZhbHVlcyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXhPZj1jb21wYXJhdG9yP2Jhc2VJbmRleE9mV2l0aDpiYXNlSW5kZXhPZixpbmRleD0tMSxsZW5ndGg9dmFsdWVzLmxlbmd0aCxzZWVuPWFycmF5O2lmKGFycmF5PT09dmFsdWVzKXZhbHVlcz1jb3B5QXJyYXkodmFsdWVzKTtpZihpdGVyYXRlZSlzZWVuPWFycmF5TWFwKGFycmF5LGJhc2VVbmFyeShpdGVyYXRlZSkpO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgZnJvbUluZGV4PTAsdmFsdWU9dmFsdWVzW2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7d2hpbGUoKGZyb21JbmRleD1pbmRleE9mKHNlZW4sY29tcHV0ZWQsZnJvbUluZGV4LGNvbXBhcmF0b3IpKT4tMSl7aWYoc2VlbiE9PWFycmF5KXNwbGljZS5jYWxsKHNlZW4sZnJvbUluZGV4LDEpO3NwbGljZS5jYWxsKGFycmF5LGZyb21JbmRleCwxKX19cmV0dXJuIGFycmF5fWZ1bmN0aW9uIGJhc2VQdWxsQXQoYXJyYXksCmluZGV4ZXMpe3ZhciBsZW5ndGg9YXJyYXk/aW5kZXhlcy5sZW5ndGg6MCxsYXN0SW5kZXg9bGVuZ3RoLTE7d2hpbGUobGVuZ3RoLS0pe3ZhciBpbmRleD1pbmRleGVzW2xlbmd0aF07aWYobGVuZ3RoPT1sYXN0SW5kZXh8fGluZGV4IT09cHJldmlvdXMpe3ZhciBwcmV2aW91cz1pbmRleDtpZihpc0luZGV4KGluZGV4KSlzcGxpY2UuY2FsbChhcnJheSxpbmRleCwxKTtlbHNlIGJhc2VVbnNldChhcnJheSxpbmRleCl9fXJldHVybiBhcnJheX1mdW5jdGlvbiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKXtyZXR1cm4gbG93ZXIrbmF0aXZlRmxvb3IobmF0aXZlUmFuZG9tKCkqKHVwcGVyLWxvd2VyKzEpKX1mdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsZW5kLHN0ZXAsZnJvbVJpZ2h0KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1heChuYXRpdmVDZWlsKChlbmQtc3RhcnQpLyhzdGVwfHwxKSksMCkscmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUobGVuZ3RoLS0pe3Jlc3VsdFtmcm9tUmlnaHQ/Cmxlbmd0aDorK2luZGV4XT1zdGFydDtzdGFydCs9c3RlcH1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VSZXBlYXQoc3RyaW5nLG4pe3ZhciByZXN1bHQ9IiI7aWYoIXN0cmluZ3x8bjwxfHxuPk1BWF9TQUZFX0lOVEVHRVIpcmV0dXJuIHJlc3VsdDtkb3tpZihuJTIpcmVzdWx0Kz1zdHJpbmc7bj1uYXRpdmVGbG9vcihuLzIpO2lmKG4pc3RyaW5nKz1zdHJpbmd9d2hpbGUobik7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlUmVzdChmdW5jLHN0YXJ0KXtyZXR1cm4gc2V0VG9TdHJpbmcob3ZlclJlc3QoZnVuYyxzdGFydCxpZGVudGl0eSksZnVuYysiIil9ZnVuY3Rpb24gYmFzZVNhbXBsZShjb2xsZWN0aW9uKXtyZXR1cm4gYXJyYXlTYW1wbGUodmFsdWVzKGNvbGxlY3Rpb24pKX1mdW5jdGlvbiBiYXNlU2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4pe3ZhciBhcnJheT12YWx1ZXMoY29sbGVjdGlvbik7cmV0dXJuIHNodWZmbGVTZWxmKGFycmF5LGJhc2VDbGFtcChuLDAsYXJyYXkubGVuZ3RoKSl9CmZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIG9iamVjdDtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoLGxhc3RJbmRleD1sZW5ndGgtMSxuZXN0ZWQ9b2JqZWN0O3doaWxlKG5lc3RlZCE9bnVsbCYmKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9dG9LZXkocGF0aFtpbmRleF0pLG5ld1ZhbHVlPXZhbHVlO2lmKGluZGV4IT1sYXN0SW5kZXgpe3ZhciBvYmpWYWx1ZT1uZXN0ZWRba2V5XTtuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqVmFsdWUsa2V5LG5lc3RlZCk6dW5kZWZpbmVkO2lmKG5ld1ZhbHVlPT09dW5kZWZpbmVkKW5ld1ZhbHVlPWlzT2JqZWN0KG9ialZhbHVlKT9vYmpWYWx1ZTppc0luZGV4KHBhdGhbaW5kZXgrMV0pP1tdOnt9fWFzc2lnblZhbHVlKG5lc3RlZCxrZXksbmV3VmFsdWUpO25lc3RlZD1uZXN0ZWRba2V5XX1yZXR1cm4gb2JqZWN0fQp2YXIgYmFzZVNldERhdGE9IW1ldGFNYXA/aWRlbnRpdHk6ZnVuY3Rpb24oZnVuYyxkYXRhKXttZXRhTWFwLnNldChmdW5jLGRhdGEpO3JldHVybiBmdW5jfTt2YXIgYmFzZVNldFRvU3RyaW5nPSFkZWZpbmVQcm9wZXJ0eT9pZGVudGl0eTpmdW5jdGlvbihmdW5jLHN0cmluZyl7cmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsInRvU3RyaW5nIix7ImNvbmZpZ3VyYWJsZSI6dHJ1ZSwiZW51bWVyYWJsZSI6ZmFsc2UsInZhbHVlIjpjb25zdGFudChzdHJpbmcpLCJ3cml0YWJsZSI6dHJ1ZX0pfTtmdW5jdGlvbiBiYXNlU2h1ZmZsZShjb2xsZWN0aW9uKXtyZXR1cm4gc2h1ZmZsZVNlbGYodmFsdWVzKGNvbGxlY3Rpb24pKX1mdW5jdGlvbiBiYXNlU2xpY2UoYXJyYXksc3RhcnQsZW5kKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5Lmxlbmd0aDtpZihzdGFydDwwKXN0YXJ0PS1zdGFydD5sZW5ndGg/MDpsZW5ndGgrc3RhcnQ7ZW5kPWVuZD5sZW5ndGg/bGVuZ3RoOmVuZDtpZihlbmQ8MCllbmQrPQpsZW5ndGg7bGVuZ3RoPXN0YXJ0PmVuZD8wOmVuZC1zdGFydD4+PjA7c3RhcnQ+Pj49MDt2YXIgcmVzdWx0PUFycmF5KGxlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0W2luZGV4XT1hcnJheVtpbmRleCtzdGFydF07cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLHByZWRpY2F0ZSl7dmFyIHJlc3VsdDtiYXNlRWFjaChjb2xsZWN0aW9uLGZ1bmN0aW9uKHZhbHVlLGluZGV4LGNvbGxlY3Rpb24pe3Jlc3VsdD1wcmVkaWNhdGUodmFsdWUsaW5kZXgsY29sbGVjdGlvbik7cmV0dXJuIXJlc3VsdH0pO3JldHVybiEhcmVzdWx0fWZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSxyZXRIaWdoZXN0KXt2YXIgbG93PTAsaGlnaD1hcnJheT09bnVsbD9sb3c6YXJyYXkubGVuZ3RoO2lmKHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPT09dmFsdWUmJmhpZ2g8PUhBTEZfTUFYX0FSUkFZX0xFTkdUSCl7d2hpbGUobG93PGhpZ2gpe3ZhciBtaWQ9CmxvdytoaWdoPj4+MSxjb21wdXRlZD1hcnJheVttaWRdO2lmKGNvbXB1dGVkIT09bnVsbCYmIWlzU3ltYm9sKGNvbXB1dGVkKSYmKHJldEhpZ2hlc3Q/Y29tcHV0ZWQ8PXZhbHVlOmNvbXB1dGVkPHZhbHVlKSlsb3c9bWlkKzE7ZWxzZSBoaWdoPW1pZH1yZXR1cm4gaGlnaH1yZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaWRlbnRpdHkscmV0SGlnaGVzdCl9ZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUscmV0SGlnaGVzdCl7dmFsdWU9aXRlcmF0ZWUodmFsdWUpO3ZhciBsb3c9MCxoaWdoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLHZhbElzTmFOPXZhbHVlIT09dmFsdWUsdmFsSXNOdWxsPXZhbHVlPT09bnVsbCx2YWxJc1N5bWJvbD1pc1N5bWJvbCh2YWx1ZSksdmFsSXNVbmRlZmluZWQ9dmFsdWU9PT11bmRlZmluZWQ7d2hpbGUobG93PGhpZ2gpe3ZhciBtaWQ9bmF0aXZlRmxvb3IoKGxvdytoaWdoKS8yKSxjb21wdXRlZD0KaXRlcmF0ZWUoYXJyYXlbbWlkXSksb3RoSXNEZWZpbmVkPWNvbXB1dGVkIT09dW5kZWZpbmVkLG90aElzTnVsbD1jb21wdXRlZD09PW51bGwsb3RoSXNSZWZsZXhpdmU9Y29tcHV0ZWQ9PT1jb21wdXRlZCxvdGhJc1N5bWJvbD1pc1N5bWJvbChjb21wdXRlZCk7aWYodmFsSXNOYU4pdmFyIHNldExvdz1yZXRIaWdoZXN0fHxvdGhJc1JlZmxleGl2ZTtlbHNlIGlmKHZhbElzVW5kZWZpbmVkKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmKHJldEhpZ2hlc3R8fG90aElzRGVmaW5lZCk7ZWxzZSBpZih2YWxJc051bGwpc2V0TG93PW90aElzUmVmbGV4aXZlJiZvdGhJc0RlZmluZWQmJihyZXRIaWdoZXN0fHwhb3RoSXNOdWxsKTtlbHNlIGlmKHZhbElzU3ltYm9sKXNldExvdz1vdGhJc1JlZmxleGl2ZSYmb3RoSXNEZWZpbmVkJiYhb3RoSXNOdWxsJiYocmV0SGlnaGVzdHx8IW90aElzU3ltYm9sKTtlbHNlIGlmKG90aElzTnVsbHx8b3RoSXNTeW1ib2wpc2V0TG93PWZhbHNlO2Vsc2Ugc2V0TG93PQpyZXRIaWdoZXN0P2NvbXB1dGVkPD12YWx1ZTpjb21wdXRlZDx2YWx1ZTtpZihzZXRMb3cpbG93PW1pZCsxO2Vsc2UgaGlnaD1taWR9cmV0dXJuIG5hdGl2ZU1pbihoaWdoLE1BWF9BUlJBWV9JTkRFWCl9ZnVuY3Rpb24gYmFzZVNvcnRlZFVuaXEoYXJyYXksaXRlcmF0ZWUpe3ZhciBpbmRleD0tMSxsZW5ndGg9YXJyYXkubGVuZ3RoLHJlc0luZGV4PTAscmVzdWx0PVtdO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9YXJyYXlbaW5kZXhdLGNvbXB1dGVkPWl0ZXJhdGVlP2l0ZXJhdGVlKHZhbHVlKTp2YWx1ZTtpZighaW5kZXh8fCFlcShjb21wdXRlZCxzZWVuKSl7dmFyIHNlZW49Y29tcHV0ZWQ7cmVzdWx0W3Jlc0luZGV4KytdPXZhbHVlPT09MD8wOnZhbHVlfX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGJhc2VUb051bWJlcih2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ibnVtYmVyIilyZXR1cm4gdmFsdWU7aWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBOQU47cmV0dXJuK3ZhbHVlfQpmdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpe2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyIpcmV0dXJuIHZhbHVlO2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBhcnJheU1hcCh2YWx1ZSxiYXNlVG9TdHJpbmcpKyIiO2lmKGlzU3ltYm9sKHZhbHVlKSlyZXR1cm4gc3ltYm9sVG9TdHJpbmc/c3ltYm9sVG9TdHJpbmcuY2FsbCh2YWx1ZSk6IiI7dmFyIHJlc3VsdD12YWx1ZSsiIjtyZXR1cm4gcmVzdWx0PT0iMCImJjEvdmFsdWU9PS1JTkZJTklUWT8iLTAiOnJlc3VsdH1mdW5jdGlvbiBiYXNlVW5pcShhcnJheSxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgaW5kZXg9LTEsaW5jbHVkZXM9YXJyYXlJbmNsdWRlcyxsZW5ndGg9YXJyYXkubGVuZ3RoLGlzQ29tbW9uPXRydWUscmVzdWx0PVtdLHNlZW49cmVzdWx0O2lmKGNvbXBhcmF0b3Ipe2lzQ29tbW9uPWZhbHNlO2luY2x1ZGVzPWFycmF5SW5jbHVkZXNXaXRofWVsc2UgaWYobGVuZ3RoPj1MQVJHRV9BUlJBWV9TSVpFKXt2YXIgc2V0PQppdGVyYXRlZT9udWxsOmNyZWF0ZVNldChhcnJheSk7aWYoc2V0KXJldHVybiBzZXRUb0FycmF5KHNldCk7aXNDb21tb249ZmFsc2U7aW5jbHVkZXM9Y2FjaGVIYXM7c2Vlbj1uZXcgU2V0Q2FjaGV9ZWxzZSBzZWVuPWl0ZXJhdGVlP1tdOnJlc3VsdDtvdXRlcjp3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XSxjb21wdXRlZD1pdGVyYXRlZT9pdGVyYXRlZSh2YWx1ZSk6dmFsdWU7dmFsdWU9Y29tcGFyYXRvcnx8dmFsdWUhPT0wP3ZhbHVlOjA7aWYoaXNDb21tb24mJmNvbXB1dGVkPT09Y29tcHV0ZWQpe3ZhciBzZWVuSW5kZXg9c2Vlbi5sZW5ndGg7d2hpbGUoc2VlbkluZGV4LS0paWYoc2VlbltzZWVuSW5kZXhdPT09Y29tcHV0ZWQpY29udGludWUgb3V0ZXI7aWYoaXRlcmF0ZWUpc2Vlbi5wdXNoKGNvbXB1dGVkKTtyZXN1bHQucHVzaCh2YWx1ZSl9ZWxzZSBpZighaW5jbHVkZXMoc2Vlbixjb21wdXRlZCxjb21wYXJhdG9yKSl7aWYoc2VlbiE9PXJlc3VsdClzZWVuLnB1c2goY29tcHV0ZWQpOwpyZXN1bHQucHVzaCh2YWx1ZSl9fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gYmFzZVVuc2V0KG9iamVjdCxwYXRoKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTtvYmplY3Q9cGFyZW50KG9iamVjdCxwYXRoKTtyZXR1cm4gb2JqZWN0PT1udWxsfHxkZWxldGUgb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXX1mdW5jdGlvbiBiYXNlVXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIsY3VzdG9taXplcil7cmV0dXJuIGJhc2VTZXQob2JqZWN0LHBhdGgsdXBkYXRlcihiYXNlR2V0KG9iamVjdCxwYXRoKSksY3VzdG9taXplcil9ZnVuY3Rpb24gYmFzZVdoaWxlKGFycmF5LHByZWRpY2F0ZSxpc0Ryb3AsZnJvbVJpZ2h0KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxpbmRleD1mcm9tUmlnaHQ/bGVuZ3RoOi0xO3doaWxlKChmcm9tUmlnaHQ/aW5kZXgtLTorK2luZGV4PGxlbmd0aCkmJnByZWRpY2F0ZShhcnJheVtpbmRleF0saW5kZXgsYXJyYXkpKTtyZXR1cm4gaXNEcm9wP2Jhc2VTbGljZShhcnJheSwKZnJvbVJpZ2h0PzA6aW5kZXgsZnJvbVJpZ2h0P2luZGV4KzE6bGVuZ3RoKTpiYXNlU2xpY2UoYXJyYXksZnJvbVJpZ2h0P2luZGV4KzE6MCxmcm9tUmlnaHQ/bGVuZ3RoOmluZGV4KX1mdW5jdGlvbiBiYXNlV3JhcHBlclZhbHVlKHZhbHVlLGFjdGlvbnMpe3ZhciByZXN1bHQ9dmFsdWU7aWYocmVzdWx0IGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpcmVzdWx0PXJlc3VsdC52YWx1ZSgpO3JldHVybiBhcnJheVJlZHVjZShhY3Rpb25zLGZ1bmN0aW9uKHJlc3VsdCxhY3Rpb24pe3JldHVybiBhY3Rpb24uZnVuYy5hcHBseShhY3Rpb24udGhpc0FyZyxhcnJheVB1c2goW3Jlc3VsdF0sYWN0aW9uLmFyZ3MpKX0scmVzdWx0KX1mdW5jdGlvbiBiYXNlWG9yKGFycmF5cyxpdGVyYXRlZSxjb21wYXJhdG9yKXt2YXIgbGVuZ3RoPWFycmF5cy5sZW5ndGg7aWYobGVuZ3RoPDIpcmV0dXJuIGxlbmd0aD9iYXNlVW5pcShhcnJheXNbMF0pOltdO3ZhciBpbmRleD0tMSxyZXN1bHQ9QXJyYXkobGVuZ3RoKTsKd2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBhcnJheT1hcnJheXNbaW5kZXhdLG90aEluZGV4PS0xO3doaWxlKCsrb3RoSW5kZXg8bGVuZ3RoKWlmKG90aEluZGV4IT1pbmRleClyZXN1bHRbaW5kZXhdPWJhc2VEaWZmZXJlbmNlKHJlc3VsdFtpbmRleF18fGFycmF5LGFycmF5c1tvdGhJbmRleF0saXRlcmF0ZWUsY29tcGFyYXRvcil9cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwxKSxpdGVyYXRlZSxjb21wYXJhdG9yKX1mdW5jdGlvbiBiYXNlWmlwT2JqZWN0KHByb3BzLHZhbHVlcyxhc3NpZ25GdW5jKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXByb3BzLmxlbmd0aCx2YWxzTGVuZ3RoPXZhbHVlcy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9aW5kZXg8dmFsc0xlbmd0aD92YWx1ZXNbaW5kZXhdOnVuZGVmaW5lZDthc3NpZ25GdW5jKHJlc3VsdCxwcm9wc1tpbmRleF0sdmFsdWUpfXJldHVybiByZXN1bHR9ZnVuY3Rpb24gY2FzdEFycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKT8KdmFsdWU6W119ZnVuY3Rpb24gY2FzdEZ1bmN0aW9uKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0iZnVuY3Rpb24iP3ZhbHVlOmlkZW50aXR5fWZ1bmN0aW9uIGNhc3RQYXRoKHZhbHVlLG9iamVjdCl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIHZhbHVlO3JldHVybiBpc0tleSh2YWx1ZSxvYmplY3QpP1t2YWx1ZV06c3RyaW5nVG9QYXRoKHRvU3RyaW5nKHZhbHVlKSl9dmFyIGNhc3RSZXN0PWJhc2VSZXN0O2Z1bmN0aW9uIGNhc3RTbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXkubGVuZ3RoO2VuZD1lbmQ9PT11bmRlZmluZWQ/bGVuZ3RoOmVuZDtyZXR1cm4hc3RhcnQmJmVuZD49bGVuZ3RoP2FycmF5OmJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpfXZhciBjbGVhclRpbWVvdXQ9Y3R4Q2xlYXJUaW1lb3V0fHxmdW5jdGlvbihpZCl7cmV0dXJuIHJvb3QuY2xlYXJUaW1lb3V0KGlkKX07ZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLGlzRGVlcCl7aWYoaXNEZWVwKXJldHVybiBidWZmZXIuc2xpY2UoKTsKdmFyIGxlbmd0aD1idWZmZXIubGVuZ3RoLHJlc3VsdD1hbGxvY1Vuc2FmZT9hbGxvY1Vuc2FmZShsZW5ndGgpOm5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTtidWZmZXIuY29weShyZXN1bHQpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcil7dmFyIHJlc3VsdD1uZXcgYXJyYXlCdWZmZXIuY29uc3RydWN0b3IoYXJyYXlCdWZmZXIuYnl0ZUxlbmd0aCk7KG5ldyBVaW50OEFycmF5KHJlc3VsdCkpLnNldChuZXcgVWludDhBcnJheShhcnJheUJ1ZmZlcikpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVEYXRhVmlldyhkYXRhVmlldyxpc0RlZXApe3ZhciBidWZmZXI9aXNEZWVwP2Nsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKTpkYXRhVmlldy5idWZmZXI7cmV0dXJuIG5ldyBkYXRhVmlldy5jb25zdHJ1Y3RvcihidWZmZXIsZGF0YVZpZXcuYnl0ZU9mZnNldCxkYXRhVmlldy5ieXRlTGVuZ3RoKX1mdW5jdGlvbiBjbG9uZVJlZ0V4cChyZWdleHApe3ZhciByZXN1bHQ9Cm5ldyByZWdleHAuY29uc3RydWN0b3IocmVnZXhwLnNvdXJjZSxyZUZsYWdzLmV4ZWMocmVnZXhwKSk7cmVzdWx0Lmxhc3RJbmRleD1yZWdleHAubGFzdEluZGV4O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKXtyZXR1cm4gc3ltYm9sVmFsdWVPZj9PYmplY3Qoc3ltYm9sVmFsdWVPZi5jYWxsKHN5bWJvbCkpOnt9fWZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LGlzRGVlcCl7dmFyIGJ1ZmZlcj1pc0RlZXA/Y2xvbmVBcnJheUJ1ZmZlcih0eXBlZEFycmF5LmJ1ZmZlcik6dHlwZWRBcnJheS5idWZmZXI7cmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlcix0eXBlZEFycmF5LmJ5dGVPZmZzZXQsdHlwZWRBcnJheS5sZW5ndGgpfWZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsb3RoZXIpe2lmKHZhbHVlIT09b3RoZXIpe3ZhciB2YWxJc0RlZmluZWQ9dmFsdWUhPT11bmRlZmluZWQsdmFsSXNOdWxsPXZhbHVlPT09Cm51bGwsdmFsSXNSZWZsZXhpdmU9dmFsdWU9PT12YWx1ZSx2YWxJc1N5bWJvbD1pc1N5bWJvbCh2YWx1ZSk7dmFyIG90aElzRGVmaW5lZD1vdGhlciE9PXVuZGVmaW5lZCxvdGhJc051bGw9b3RoZXI9PT1udWxsLG90aElzUmVmbGV4aXZlPW90aGVyPT09b3RoZXIsb3RoSXNTeW1ib2w9aXNTeW1ib2wob3RoZXIpO2lmKCFvdGhJc051bGwmJiFvdGhJc1N5bWJvbCYmIXZhbElzU3ltYm9sJiZ2YWx1ZT5vdGhlcnx8dmFsSXNTeW1ib2wmJm90aElzRGVmaW5lZCYmb3RoSXNSZWZsZXhpdmUmJiFvdGhJc051bGwmJiFvdGhJc1N5bWJvbHx8dmFsSXNOdWxsJiZvdGhJc0RlZmluZWQmJm90aElzUmVmbGV4aXZlfHwhdmFsSXNEZWZpbmVkJiZvdGhJc1JlZmxleGl2ZXx8IXZhbElzUmVmbGV4aXZlKXJldHVybiAxO2lmKCF2YWxJc051bGwmJiF2YWxJc1N5bWJvbCYmIW90aElzU3ltYm9sJiZ2YWx1ZTxvdGhlcnx8b3RoSXNTeW1ib2wmJnZhbElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmUmJiF2YWxJc051bGwmJgohdmFsSXNTeW1ib2x8fG90aElzTnVsbCYmdmFsSXNEZWZpbmVkJiZ2YWxJc1JlZmxleGl2ZXx8IW90aElzRGVmaW5lZCYmdmFsSXNSZWZsZXhpdmV8fCFvdGhJc1JlZmxleGl2ZSlyZXR1cm4tMX1yZXR1cm4gMH1mdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LG90aGVyLG9yZGVycyl7dmFyIGluZGV4PS0xLG9iakNyaXRlcmlhPW9iamVjdC5jcml0ZXJpYSxvdGhDcml0ZXJpYT1vdGhlci5jcml0ZXJpYSxsZW5ndGg9b2JqQ3JpdGVyaWEubGVuZ3RoLG9yZGVyc0xlbmd0aD1vcmRlcnMubGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcmVzdWx0PWNvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLG90aENyaXRlcmlhW2luZGV4XSk7aWYocmVzdWx0KXtpZihpbmRleD49b3JkZXJzTGVuZ3RoKXJldHVybiByZXN1bHQ7dmFyIG9yZGVyPW9yZGVyc1tpbmRleF07cmV0dXJuIHJlc3VsdCoob3JkZXI9PSJkZXNjIj8tMToxKX19cmV0dXJuIG9iamVjdC5pbmRleC0Kb3RoZXIuaW5kZXh9ZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncyxwYXJ0aWFscyxob2xkZXJzLGlzQ3VycmllZCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPWFyZ3MubGVuZ3RoLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgsbGVmdEluZGV4PS0xLGxlZnRMZW5ndGg9cGFydGlhbHMubGVuZ3RoLHJhbmdlTGVuZ3RoPW5hdGl2ZU1heChhcmdzTGVuZ3RoLWhvbGRlcnNMZW5ndGgsMCkscmVzdWx0PUFycmF5KGxlZnRMZW5ndGgrcmFuZ2VMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKytsZWZ0SW5kZXg8bGVmdExlbmd0aClyZXN1bHRbbGVmdEluZGV4XT1wYXJ0aWFsc1tsZWZ0SW5kZXhdO3doaWxlKCsrYXJnc0luZGV4PGhvbGRlcnNMZW5ndGgpaWYoaXNVbmN1cnJpZWR8fGFyZ3NJbmRleDxhcmdzTGVuZ3RoKXJlc3VsdFtob2xkZXJzW2FyZ3NJbmRleF1dPWFyZ3NbYXJnc0luZGV4XTt3aGlsZShyYW5nZUxlbmd0aC0tKXJlc3VsdFtsZWZ0SW5kZXgrK109CmFyZ3NbYXJnc0luZGV4KytdO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY29tcG9zZUFyZ3NSaWdodChhcmdzLHBhcnRpYWxzLGhvbGRlcnMsaXNDdXJyaWVkKXt2YXIgYXJnc0luZGV4PS0xLGFyZ3NMZW5ndGg9YXJncy5sZW5ndGgsaG9sZGVyc0luZGV4PS0xLGhvbGRlcnNMZW5ndGg9aG9sZGVycy5sZW5ndGgscmlnaHRJbmRleD0tMSxyaWdodExlbmd0aD1wYXJ0aWFscy5sZW5ndGgscmFuZ2VMZW5ndGg9bmF0aXZlTWF4KGFyZ3NMZW5ndGgtaG9sZGVyc0xlbmd0aCwwKSxyZXN1bHQ9QXJyYXkocmFuZ2VMZW5ndGgrcmlnaHRMZW5ndGgpLGlzVW5jdXJyaWVkPSFpc0N1cnJpZWQ7d2hpbGUoKythcmdzSW5kZXg8cmFuZ2VMZW5ndGgpcmVzdWx0W2FyZ3NJbmRleF09YXJnc1thcmdzSW5kZXhdO3ZhciBvZmZzZXQ9YXJnc0luZGV4O3doaWxlKCsrcmlnaHRJbmRleDxyaWdodExlbmd0aClyZXN1bHRbb2Zmc2V0K3JpZ2h0SW5kZXhdPXBhcnRpYWxzW3JpZ2h0SW5kZXhdO3doaWxlKCsraG9sZGVyc0luZGV4PApob2xkZXJzTGVuZ3RoKWlmKGlzVW5jdXJyaWVkfHxhcmdzSW5kZXg8YXJnc0xlbmd0aClyZXN1bHRbb2Zmc2V0K2hvbGRlcnNbaG9sZGVyc0luZGV4XV09YXJnc1thcmdzSW5kZXgrK107cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLGFycmF5KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPXNvdXJjZS5sZW5ndGg7YXJyYXl8fChhcnJheT1BcnJheShsZW5ndGgpKTt3aGlsZSgrK2luZGV4PGxlbmd0aClhcnJheVtpbmRleF09c291cmNlW2luZGV4XTtyZXR1cm4gYXJyYXl9ZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UscHJvcHMsb2JqZWN0LGN1c3RvbWl6ZXIpe3ZhciBpc05ldz0hb2JqZWN0O29iamVjdHx8KG9iamVjdD17fSk7dmFyIGluZGV4PS0xLGxlbmd0aD1wcm9wcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBrZXk9cHJvcHNbaW5kZXhdO3ZhciBuZXdWYWx1ZT1jdXN0b21pemVyP2N1c3RvbWl6ZXIob2JqZWN0W2tleV0sc291cmNlW2tleV0sCmtleSxvYmplY3Qsc291cmNlKTp1bmRlZmluZWQ7aWYobmV3VmFsdWU9PT11bmRlZmluZWQpbmV3VmFsdWU9c291cmNlW2tleV07aWYoaXNOZXcpYmFzZUFzc2lnblZhbHVlKG9iamVjdCxrZXksbmV3VmFsdWUpO2Vsc2UgYXNzaWduVmFsdWUob2JqZWN0LGtleSxuZXdWYWx1ZSl9cmV0dXJuIG9iamVjdH1mdW5jdGlvbiBjb3B5U3ltYm9scyhzb3VyY2Usb2JqZWN0KXtyZXR1cm4gY29weU9iamVjdChzb3VyY2UsZ2V0U3ltYm9scyhzb3VyY2UpLG9iamVjdCl9ZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2Usb2JqZWN0KXtyZXR1cm4gY29weU9iamVjdChzb3VyY2UsZ2V0U3ltYm9sc0luKHNvdXJjZSksb2JqZWN0KX1mdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlcixpbml0aWFsaXplcil7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlBZ2dyZWdhdG9yOmJhc2VBZ2dyZWdhdG9yLGFjY3VtdWxhdG9yPQppbml0aWFsaXplcj9pbml0aWFsaXplcigpOnt9O3JldHVybiBmdW5jKGNvbGxlY3Rpb24sc2V0dGVyLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpLGFjY3VtdWxhdG9yKX19ZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoYXNzaWduZXIpe3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihvYmplY3Qsc291cmNlcyl7dmFyIGluZGV4PS0xLGxlbmd0aD1zb3VyY2VzLmxlbmd0aCxjdXN0b21pemVyPWxlbmd0aD4xP3NvdXJjZXNbbGVuZ3RoLTFdOnVuZGVmaW5lZCxndWFyZD1sZW5ndGg+Mj9zb3VyY2VzWzJdOnVuZGVmaW5lZDtjdXN0b21pemVyPWFzc2lnbmVyLmxlbmd0aD4zJiZ0eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj8obGVuZ3RoLS0sY3VzdG9taXplcik6dW5kZWZpbmVkO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLHNvdXJjZXNbMV0sZ3VhcmQpKXtjdXN0b21pemVyPWxlbmd0aDwzP3VuZGVmaW5lZDpjdXN0b21pemVyO2xlbmd0aD0xfW9iamVjdD1PYmplY3Qob2JqZWN0KTsKd2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBzb3VyY2U9c291cmNlc1tpbmRleF07aWYoc291cmNlKWFzc2lnbmVyKG9iamVjdCxzb3VyY2UsaW5kZXgsY3VzdG9taXplcil9cmV0dXJuIG9iamVjdH0pfWZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24saXRlcmF0ZWUpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuIGNvbGxlY3Rpb247aWYoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLGl0ZXJhdGVlKTt2YXIgbGVuZ3RoPWNvbGxlY3Rpb24ubGVuZ3RoLGluZGV4PWZyb21SaWdodD9sZW5ndGg6LTEsaXRlcmFibGU9T2JqZWN0KGNvbGxlY3Rpb24pO3doaWxlKGZyb21SaWdodD9pbmRleC0tOisraW5kZXg8bGVuZ3RoKWlmKGl0ZXJhdGVlKGl0ZXJhYmxlW2luZGV4XSxpbmRleCxpdGVyYWJsZSk9PT1mYWxzZSlicmVhaztyZXR1cm4gY29sbGVjdGlvbn19ZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpe3JldHVybiBmdW5jdGlvbihvYmplY3QsCml0ZXJhdGVlLGtleXNGdW5jKXt2YXIgaW5kZXg9LTEsaXRlcmFibGU9T2JqZWN0KG9iamVjdCkscHJvcHM9a2V5c0Z1bmMob2JqZWN0KSxsZW5ndGg9cHJvcHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKXt2YXIga2V5PXByb3BzW2Zyb21SaWdodD9sZW5ndGg6KytpbmRleF07aWYoaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpPT09ZmFsc2UpYnJlYWt9cmV0dXJuIG9iamVjdH19ZnVuY3Rpb24gY3JlYXRlQmluZChmdW5jLGJpdG1hc2ssdGhpc0FyZyl7dmFyIGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGZuPXRoaXMmJnRoaXMhPT1yb290JiZ0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcj9DdG9yOmZ1bmM7cmV0dXJuIGZuLmFwcGx5KGlzQmluZD90aGlzQXJnOnRoaXMsYXJndW1lbnRzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7c3RyaW5nPQp0b1N0cmluZyhzdHJpbmcpO3ZhciBzdHJTeW1ib2xzPWhhc1VuaWNvZGUoc3RyaW5nKT9zdHJpbmdUb0FycmF5KHN0cmluZyk6dW5kZWZpbmVkO3ZhciBjaHI9c3RyU3ltYm9scz9zdHJTeW1ib2xzWzBdOnN0cmluZy5jaGFyQXQoMCk7dmFyIHRyYWlsaW5nPXN0clN5bWJvbHM/Y2FzdFNsaWNlKHN0clN5bWJvbHMsMSkuam9pbigiIik6c3RyaW5nLnNsaWNlKDEpO3JldHVybiBjaHJbbWV0aG9kTmFtZV0oKSt0cmFpbGluZ319ZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjayl7cmV0dXJuIGZ1bmN0aW9uKHN0cmluZyl7cmV0dXJuIGFycmF5UmVkdWNlKHdvcmRzKGRlYnVycihzdHJpbmcpLnJlcGxhY2UocmVBcG9zLCIiKSksY2FsbGJhY2ssIiIpfX1mdW5jdGlvbiBjcmVhdGVDdG9yKEN0b3Ipe3JldHVybiBmdW5jdGlvbigpe3ZhciBhcmdzPWFyZ3VtZW50cztzd2l0Y2goYXJncy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IEN0b3I7Y2FzZSAxOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTsKY2FzZSAyOnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0pO2Nhc2UgMzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0pO2Nhc2UgNDpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSk7Y2FzZSA1OnJldHVybiBuZXcgQ3RvcihhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxhcmdzWzNdLGFyZ3NbNF0pO2Nhc2UgNjpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0pO2Nhc2UgNzpyZXR1cm4gbmV3IEN0b3IoYXJnc1swXSxhcmdzWzFdLGFyZ3NbMl0sYXJnc1szXSxhcmdzWzRdLGFyZ3NbNV0sYXJnc1s2XSl9dmFyIHRoaXNCaW5kaW5nPWJhc2VDcmVhdGUoQ3Rvci5wcm90b3R5cGUpLHJlc3VsdD1DdG9yLmFwcGx5KHRoaXNCaW5kaW5nLGFyZ3MpO3JldHVybiBpc09iamVjdChyZXN1bHQpP3Jlc3VsdDp0aGlzQmluZGluZ319ZnVuY3Rpb24gY3JlYXRlQ3VycnkoZnVuYywKYml0bWFzayxhcml0eSl7dmFyIEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGxlbmd0aD1hcmd1bWVudHMubGVuZ3RoLGFyZ3M9QXJyYXkobGVuZ3RoKSxpbmRleD1sZW5ndGgscGxhY2Vob2xkZXI9Z2V0SG9sZGVyKHdyYXBwZXIpO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleF09YXJndW1lbnRzW2luZGV4XTt2YXIgaG9sZGVycz1sZW5ndGg8MyYmYXJnc1swXSE9PXBsYWNlaG9sZGVyJiZhcmdzW2xlbmd0aC0xXSE9PXBsYWNlaG9sZGVyP1tdOnJlcGxhY2VIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpO2xlbmd0aC09aG9sZGVycy5sZW5ndGg7aWYobGVuZ3RoPGFyaXR5KXJldHVybiBjcmVhdGVSZWN1cnJ5KGZ1bmMsYml0bWFzayxjcmVhdGVIeWJyaWQsd3JhcHBlci5wbGFjZWhvbGRlcix1bmRlZmluZWQsYXJncyxob2xkZXJzLHVuZGVmaW5lZCx1bmRlZmluZWQsYXJpdHktbGVuZ3RoKTt2YXIgZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZgp3cmFwcGVyP0N0b3I6ZnVuYztyZXR1cm4gYXBwbHkoZm4sdGhpcyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpe3JldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBpdGVyYWJsZT1PYmplY3QoY29sbGVjdGlvbik7aWYoIWlzQXJyYXlMaWtlKGNvbGxlY3Rpb24pKXt2YXIgaXRlcmF0ZWU9Z2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpO2NvbGxlY3Rpb249a2V5cyhjb2xsZWN0aW9uKTtwcmVkaWNhdGU9ZnVuY3Rpb24oa2V5KXtyZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSxrZXksaXRlcmFibGUpfX12YXIgaW5kZXg9ZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLHByZWRpY2F0ZSxmcm9tSW5kZXgpO3JldHVybiBpbmRleD4tMT9pdGVyYWJsZVtpdGVyYXRlZT9jb2xsZWN0aW9uW2luZGV4XTppbmRleF06dW5kZWZpbmVkfX1mdW5jdGlvbiBjcmVhdGVGbG93KGZyb21SaWdodCl7cmV0dXJuIGZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmNzKXt2YXIgbGVuZ3RoPQpmdW5jcy5sZW5ndGgsaW5kZXg9bGVuZ3RoLHByZXJlcT1Mb2Rhc2hXcmFwcGVyLnByb3RvdHlwZS50aHJ1O2lmKGZyb21SaWdodClmdW5jcy5yZXZlcnNlKCk7d2hpbGUoaW5kZXgtLSl7dmFyIGZ1bmM9ZnVuY3NbaW5kZXhdO2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtpZihwcmVyZXEmJiF3cmFwcGVyJiZnZXRGdW5jTmFtZShmdW5jKT09IndyYXBwZXIiKXZhciB3cmFwcGVyPW5ldyBMb2Rhc2hXcmFwcGVyKFtdLHRydWUpfWluZGV4PXdyYXBwZXI/aW5kZXg6bGVuZ3RoO3doaWxlKCsraW5kZXg8bGVuZ3RoKXtmdW5jPWZ1bmNzW2luZGV4XTt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksZGF0YT1mdW5jTmFtZT09IndyYXBwZXIiP2dldERhdGEoZnVuYyk6dW5kZWZpbmVkO2lmKGRhdGEmJmlzTGF6aWFibGUoZGF0YVswXSkmJmRhdGFbMV09PShXUkFQX0FSWV9GTEFHfFdSQVBfQ1VSUllfRkxBR3xXUkFQX1BBUlRJQUxfRkxBR3wKV1JBUF9SRUFSR19GTEFHKSYmIWRhdGFbNF0ubGVuZ3RoJiZkYXRhWzldPT0xKXdyYXBwZXI9d3JhcHBlcltnZXRGdW5jTmFtZShkYXRhWzBdKV0uYXBwbHkod3JhcHBlcixkYXRhWzNdKTtlbHNlIHdyYXBwZXI9ZnVuYy5sZW5ndGg9PTEmJmlzTGF6aWFibGUoZnVuYyk/d3JhcHBlcltmdW5jTmFtZV0oKTp3cmFwcGVyLnRocnUoZnVuYyl9cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHZhbHVlPWFyZ3NbMF07aWYod3JhcHBlciYmYXJncy5sZW5ndGg9PTEmJmlzQXJyYXkodmFsdWUpKXJldHVybiB3cmFwcGVyLnBsYW50KHZhbHVlKS52YWx1ZSgpO3ZhciBpbmRleD0wLHJlc3VsdD1sZW5ndGg/ZnVuY3NbaW5kZXhdLmFwcGx5KHRoaXMsYXJncyk6dmFsdWU7d2hpbGUoKytpbmRleDxsZW5ndGgpcmVzdWx0PWZ1bmNzW2luZGV4XS5jYWxsKHRoaXMscmVzdWx0KTtyZXR1cm4gcmVzdWx0fX0pfWZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLGJpdG1hc2ssdGhpc0FyZywKcGFydGlhbHMsaG9sZGVycyxwYXJ0aWFsc1JpZ2h0LGhvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNBcnk9Yml0bWFzayZXUkFQX0FSWV9GTEFHLGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRyxpc0N1cnJpZWQ9Yml0bWFzayYoV1JBUF9DVVJSWV9GTEFHfFdSQVBfQ1VSUllfUklHSFRfRkxBRyksaXNGbGlwPWJpdG1hc2smV1JBUF9GTElQX0ZMQUcsQ3Rvcj1pc0JpbmRLZXk/dW5kZWZpbmVkOmNyZWF0ZUN0b3IoZnVuYyk7ZnVuY3Rpb24gd3JhcHBlcigpe3ZhciBsZW5ndGg9YXJndW1lbnRzLmxlbmd0aCxhcmdzPUFycmF5KGxlbmd0aCksaW5kZXg9bGVuZ3RoO3doaWxlKGluZGV4LS0pYXJnc1tpbmRleF09YXJndW1lbnRzW2luZGV4XTtpZihpc0N1cnJpZWQpdmFyIHBsYWNlaG9sZGVyPWdldEhvbGRlcih3cmFwcGVyKSxob2xkZXJzQ291bnQ9Y291bnRIb2xkZXJzKGFyZ3MscGxhY2Vob2xkZXIpOwppZihwYXJ0aWFscylhcmdzPWNvbXBvc2VBcmdzKGFyZ3MscGFydGlhbHMsaG9sZGVycyxpc0N1cnJpZWQpO2lmKHBhcnRpYWxzUmlnaHQpYXJncz1jb21wb3NlQXJnc1JpZ2h0KGFyZ3MscGFydGlhbHNSaWdodCxob2xkZXJzUmlnaHQsaXNDdXJyaWVkKTtsZW5ndGgtPWhvbGRlcnNDb3VudDtpZihpc0N1cnJpZWQmJmxlbmd0aDxhcml0eSl7dmFyIG5ld0hvbGRlcnM9cmVwbGFjZUhvbGRlcnMoYXJncyxwbGFjZWhvbGRlcik7cmV0dXJuIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLGNyZWF0ZUh5YnJpZCx3cmFwcGVyLnBsYWNlaG9sZGVyLHRoaXNBcmcsYXJncyxuZXdIb2xkZXJzLGFyZ1BvcyxhcnksYXJpdHktbGVuZ3RoKX12YXIgdGhpc0JpbmRpbmc9aXNCaW5kP3RoaXNBcmc6dGhpcyxmbj1pc0JpbmRLZXk/dGhpc0JpbmRpbmdbZnVuY106ZnVuYztsZW5ndGg9YXJncy5sZW5ndGg7aWYoYXJnUG9zKWFyZ3M9cmVvcmRlcihhcmdzLGFyZ1Bvcyk7ZWxzZSBpZihpc0ZsaXAmJmxlbmd0aD4KMSlhcmdzLnJldmVyc2UoKTtpZihpc0FyeSYmYXJ5PGxlbmd0aClhcmdzLmxlbmd0aD1hcnk7aWYodGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKWZuPUN0b3J8fGNyZWF0ZUN0b3IoZm4pO3JldHVybiBmbi5hcHBseSh0aGlzQmluZGluZyxhcmdzKX1yZXR1cm4gd3JhcHBlcn1mdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsdG9JdGVyYXRlZSl7cmV0dXJuIGZ1bmN0aW9uKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIGJhc2VJbnZlcnRlcihvYmplY3Qsc2V0dGVyLHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLHt9KX19ZnVuY3Rpb24gY3JlYXRlTWF0aE9wZXJhdGlvbihvcGVyYXRvcixkZWZhdWx0VmFsdWUpe3JldHVybiBmdW5jdGlvbih2YWx1ZSxvdGhlcil7dmFyIHJlc3VsdDtpZih2YWx1ZT09PXVuZGVmaW5lZCYmb3RoZXI9PT11bmRlZmluZWQpcmV0dXJuIGRlZmF1bHRWYWx1ZTtpZih2YWx1ZSE9PXVuZGVmaW5lZClyZXN1bHQ9dmFsdWU7aWYob3RoZXIhPT0KdW5kZWZpbmVkKXtpZihyZXN1bHQ9PT11bmRlZmluZWQpcmV0dXJuIG90aGVyO2lmKHR5cGVvZiB2YWx1ZT09InN0cmluZyJ8fHR5cGVvZiBvdGhlcj09InN0cmluZyIpe3ZhbHVlPWJhc2VUb1N0cmluZyh2YWx1ZSk7b3RoZXI9YmFzZVRvU3RyaW5nKG90aGVyKX1lbHNle3ZhbHVlPWJhc2VUb051bWJlcih2YWx1ZSk7b3RoZXI9YmFzZVRvTnVtYmVyKG90aGVyKX1yZXN1bHQ9b3BlcmF0b3IodmFsdWUsb3RoZXIpfXJldHVybiByZXN1bHR9fWZ1bmN0aW9uIGNyZWF0ZU92ZXIoYXJyYXlGdW5jKXtyZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oaXRlcmF0ZWVzKXtpdGVyYXRlZXM9YXJyYXlNYXAoaXRlcmF0ZWVzLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7cmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe3ZhciB0aGlzQXJnPXRoaXM7cmV0dXJuIGFycmF5RnVuYyhpdGVyYXRlZXMsZnVuY3Rpb24oaXRlcmF0ZWUpe3JldHVybiBhcHBseShpdGVyYXRlZSx0aGlzQXJnLGFyZ3MpfSl9KX0pfQpmdW5jdGlvbiBjcmVhdGVQYWRkaW5nKGxlbmd0aCxjaGFycyl7Y2hhcnM9Y2hhcnM9PT11bmRlZmluZWQ/IiAiOmJhc2VUb1N0cmluZyhjaGFycyk7dmFyIGNoYXJzTGVuZ3RoPWNoYXJzLmxlbmd0aDtpZihjaGFyc0xlbmd0aDwyKXJldHVybiBjaGFyc0xlbmd0aD9iYXNlUmVwZWF0KGNoYXJzLGxlbmd0aCk6Y2hhcnM7dmFyIHJlc3VsdD1iYXNlUmVwZWF0KGNoYXJzLG5hdGl2ZUNlaWwobGVuZ3RoL3N0cmluZ1NpemUoY2hhcnMpKSk7cmV0dXJuIGhhc1VuaWNvZGUoY2hhcnMpP2Nhc3RTbGljZShzdHJpbmdUb0FycmF5KHJlc3VsdCksMCxsZW5ndGgpLmpvaW4oIiIpOnJlc3VsdC5zbGljZSgwLGxlbmd0aCl9ZnVuY3Rpb24gY3JlYXRlUGFydGlhbChmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyl7dmFyIGlzQmluZD1iaXRtYXNrJldSQVBfQklORF9GTEFHLEN0b3I9Y3JlYXRlQ3RvcihmdW5jKTtmdW5jdGlvbiB3cmFwcGVyKCl7dmFyIGFyZ3NJbmRleD0tMSxhcmdzTGVuZ3RoPQphcmd1bWVudHMubGVuZ3RoLGxlZnRJbmRleD0tMSxsZWZ0TGVuZ3RoPXBhcnRpYWxzLmxlbmd0aCxhcmdzPUFycmF5KGxlZnRMZW5ndGgrYXJnc0xlbmd0aCksZm49dGhpcyYmdGhpcyE9PXJvb3QmJnRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyP0N0b3I6ZnVuYzt3aGlsZSgrK2xlZnRJbmRleDxsZWZ0TGVuZ3RoKWFyZ3NbbGVmdEluZGV4XT1wYXJ0aWFsc1tsZWZ0SW5kZXhdO3doaWxlKGFyZ3NMZW5ndGgtLSlhcmdzW2xlZnRJbmRleCsrXT1hcmd1bWVudHNbKythcmdzSW5kZXhdO3JldHVybiBhcHBseShmbixpc0JpbmQ/dGhpc0FyZzp0aGlzLGFyZ3MpfXJldHVybiB3cmFwcGVyfWZ1bmN0aW9uIGNyZWF0ZVJhbmdlKGZyb21SaWdodCl7cmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LGVuZCxzdGVwKXtpZihzdGVwJiZ0eXBlb2Ygc3RlcCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKHN0YXJ0LGVuZCxzdGVwKSllbmQ9c3RlcD11bmRlZmluZWQ7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PQp1bmRlZmluZWQpe2VuZD1zdGFydDtzdGFydD0wfWVsc2UgZW5kPXRvRmluaXRlKGVuZCk7c3RlcD1zdGVwPT09dW5kZWZpbmVkP3N0YXJ0PGVuZD8xOi0xOnRvRmluaXRlKHN0ZXApO3JldHVybiBiYXNlUmFuZ2Uoc3RhcnQsZW5kLHN0ZXAsZnJvbVJpZ2h0KX19ZnVuY3Rpb24gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihvcGVyYXRvcil7cmV0dXJuIGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtpZighKHR5cGVvZiB2YWx1ZT09InN0cmluZyImJnR5cGVvZiBvdGhlcj09InN0cmluZyIpKXt2YWx1ZT10b051bWJlcih2YWx1ZSk7b3RoZXI9dG9OdW1iZXIob3RoZXIpfXJldHVybiBvcGVyYXRvcih2YWx1ZSxvdGhlcil9fWZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYyxiaXRtYXNrLHdyYXBGdW5jLHBsYWNlaG9sZGVyLHRoaXNBcmcscGFydGlhbHMsaG9sZGVycyxhcmdQb3MsYXJ5LGFyaXR5KXt2YXIgaXNDdXJyeT1iaXRtYXNrJldSQVBfQ1VSUllfRkxBRyxuZXdIb2xkZXJzPWlzQ3Vycnk/CmhvbGRlcnM6dW5kZWZpbmVkLG5ld0hvbGRlcnNSaWdodD1pc0N1cnJ5P3VuZGVmaW5lZDpob2xkZXJzLG5ld1BhcnRpYWxzPWlzQ3Vycnk/cGFydGlhbHM6dW5kZWZpbmVkLG5ld1BhcnRpYWxzUmlnaHQ9aXNDdXJyeT91bmRlZmluZWQ6cGFydGlhbHM7Yml0bWFza3w9aXNDdXJyeT9XUkFQX1BBUlRJQUxfRkxBRzpXUkFQX1BBUlRJQUxfUklHSFRfRkxBRztiaXRtYXNrJj1+KGlzQ3Vycnk/V1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUc6V1JBUF9QQVJUSUFMX0ZMQUcpO2lmKCEoYml0bWFzayZXUkFQX0NVUlJZX0JPVU5EX0ZMQUcpKWJpdG1hc2smPX4oV1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHKTt2YXIgbmV3RGF0YT1bZnVuYyxiaXRtYXNrLHRoaXNBcmcsbmV3UGFydGlhbHMsbmV3SG9sZGVycyxuZXdQYXJ0aWFsc1JpZ2h0LG5ld0hvbGRlcnNSaWdodCxhcmdQb3MsYXJ5LGFyaXR5XTt2YXIgcmVzdWx0PXdyYXBGdW5jLmFwcGx5KHVuZGVmaW5lZCxuZXdEYXRhKTtpZihpc0xhemlhYmxlKGZ1bmMpKXNldERhdGEocmVzdWx0LApuZXdEYXRhKTtyZXN1bHQucGxhY2Vob2xkZXI9cGxhY2Vob2xkZXI7cmV0dXJuIHNldFdyYXBUb1N0cmluZyhyZXN1bHQsZnVuYyxiaXRtYXNrKX1mdW5jdGlvbiBjcmVhdGVSb3VuZChtZXRob2ROYW1lKXt2YXIgZnVuYz1NYXRoW21ldGhvZE5hbWVdO3JldHVybiBmdW5jdGlvbihudW1iZXIscHJlY2lzaW9uKXtudW1iZXI9dG9OdW1iZXIobnVtYmVyKTtwcmVjaXNpb249cHJlY2lzaW9uPT1udWxsPzA6bmF0aXZlTWluKHRvSW50ZWdlcihwcmVjaXNpb24pLDI5Mik7aWYocHJlY2lzaW9uKXt2YXIgcGFpcj0odG9TdHJpbmcobnVtYmVyKSsiZSIpLnNwbGl0KCJlIiksdmFsdWU9ZnVuYyhwYWlyWzBdKyJlIisoK3BhaXJbMV0rcHJlY2lzaW9uKSk7cGFpcj0odG9TdHJpbmcodmFsdWUpKyJlIikuc3BsaXQoImUiKTtyZXR1cm4rKHBhaXJbMF0rImUiKygrcGFpclsxXS1wcmVjaXNpb24pKX1yZXR1cm4gZnVuYyhudW1iZXIpfX12YXIgY3JlYXRlU2V0PSEoU2V0JiYxL3NldFRvQXJyYXkobmV3IFNldChbLAotMF0pKVsxXT09SU5GSU5JVFkpP25vb3A6ZnVuY3Rpb24odmFsdWVzKXtyZXR1cm4gbmV3IFNldCh2YWx1ZXMpfTtmdW5jdGlvbiBjcmVhdGVUb1BhaXJzKGtleXNGdW5jKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXt2YXIgdGFnPWdldFRhZyhvYmplY3QpO2lmKHRhZz09bWFwVGFnKXJldHVybiBtYXBUb0FycmF5KG9iamVjdCk7aWYodGFnPT1zZXRUYWcpcmV0dXJuIHNldFRvUGFpcnMob2JqZWN0KTtyZXR1cm4gYmFzZVRvUGFpcnMob2JqZWN0LGtleXNGdW5jKG9iamVjdCkpfX1mdW5jdGlvbiBjcmVhdGVXcmFwKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMsYXJnUG9zLGFyeSxhcml0eSl7dmFyIGlzQmluZEtleT1iaXRtYXNrJldSQVBfQklORF9LRVlfRkxBRztpZighaXNCaW5kS2V5JiZ0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7dmFyIGxlbmd0aD1wYXJ0aWFscz9wYXJ0aWFscy5sZW5ndGg6CjA7aWYoIWxlbmd0aCl7Yml0bWFzayY9fihXUkFQX1BBUlRJQUxfRkxBR3xXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7cGFydGlhbHM9aG9sZGVycz11bmRlZmluZWR9YXJ5PWFyeT09PXVuZGVmaW5lZD9hcnk6bmF0aXZlTWF4KHRvSW50ZWdlcihhcnkpLDApO2FyaXR5PWFyaXR5PT09dW5kZWZpbmVkP2FyaXR5OnRvSW50ZWdlcihhcml0eSk7bGVuZ3RoLT1ob2xkZXJzP2hvbGRlcnMubGVuZ3RoOjA7aWYoYml0bWFzayZXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyl7dmFyIHBhcnRpYWxzUmlnaHQ9cGFydGlhbHMsaG9sZGVyc1JpZ2h0PWhvbGRlcnM7cGFydGlhbHM9aG9sZGVycz11bmRlZmluZWR9dmFyIGRhdGE9aXNCaW5kS2V5P3VuZGVmaW5lZDpnZXREYXRhKGZ1bmMpO3ZhciBuZXdEYXRhPVtmdW5jLGJpdG1hc2ssdGhpc0FyZyxwYXJ0aWFscyxob2xkZXJzLHBhcnRpYWxzUmlnaHQsaG9sZGVyc1JpZ2h0LGFyZ1BvcyxhcnksYXJpdHldO2lmKGRhdGEpbWVyZ2VEYXRhKG5ld0RhdGEsCmRhdGEpO2Z1bmM9bmV3RGF0YVswXTtiaXRtYXNrPW5ld0RhdGFbMV07dGhpc0FyZz1uZXdEYXRhWzJdO3BhcnRpYWxzPW5ld0RhdGFbM107aG9sZGVycz1uZXdEYXRhWzRdO2FyaXR5PW5ld0RhdGFbOV09bmV3RGF0YVs5XT09PXVuZGVmaW5lZD9pc0JpbmRLZXk/MDpmdW5jLmxlbmd0aDpuYXRpdmVNYXgobmV3RGF0YVs5XS1sZW5ndGgsMCk7aWYoIWFyaXR5JiZiaXRtYXNrJihXUkFQX0NVUlJZX0ZMQUd8V1JBUF9DVVJSWV9SSUdIVF9GTEFHKSliaXRtYXNrJj1+KFdSQVBfQ1VSUllfRkxBR3xXUkFQX0NVUlJZX1JJR0hUX0ZMQUcpO2lmKCFiaXRtYXNrfHxiaXRtYXNrPT1XUkFQX0JJTkRfRkxBRyl2YXIgcmVzdWx0PWNyZWF0ZUJpbmQoZnVuYyxiaXRtYXNrLHRoaXNBcmcpO2Vsc2UgaWYoYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxiaXRtYXNrPT1XUkFQX0NVUlJZX1JJR0hUX0ZMQUcpcmVzdWx0PWNyZWF0ZUN1cnJ5KGZ1bmMsYml0bWFzayxhcml0eSk7ZWxzZSBpZigoYml0bWFzaz09CldSQVBfUEFSVElBTF9GTEFHfHxiaXRtYXNrPT0oV1JBUF9CSU5EX0ZMQUd8V1JBUF9QQVJUSUFMX0ZMQUcpKSYmIWhvbGRlcnMubGVuZ3RoKXJlc3VsdD1jcmVhdGVQYXJ0aWFsKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzKTtlbHNlIHJlc3VsdD1jcmVhdGVIeWJyaWQuYXBwbHkodW5kZWZpbmVkLG5ld0RhdGEpO3ZhciBzZXR0ZXI9ZGF0YT9iYXNlU2V0RGF0YTpzZXREYXRhO3JldHVybiBzZXRXcmFwVG9TdHJpbmcoc2V0dGVyKHJlc3VsdCxuZXdEYXRhKSxmdW5jLGJpdG1hc2spfWZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzQXNzaWduSW4ob2JqVmFsdWUsc3JjVmFsdWUsa2V5LG9iamVjdCl7aWYob2JqVmFsdWU9PT11bmRlZmluZWR8fGVxKG9ialZhbHVlLG9iamVjdFByb3RvW2tleV0pJiYhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3Qsa2V5KSlyZXR1cm4gc3JjVmFsdWU7cmV0dXJuIG9ialZhbHVlfWZ1bmN0aW9uIGN1c3RvbURlZmF1bHRzTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsCmtleSxvYmplY3Qsc291cmNlLHN0YWNrKXtpZihpc09iamVjdChvYmpWYWx1ZSkmJmlzT2JqZWN0KHNyY1ZhbHVlKSl7c3RhY2suc2V0KHNyY1ZhbHVlLG9ialZhbHVlKTtiYXNlTWVyZ2Uob2JqVmFsdWUsc3JjVmFsdWUsdW5kZWZpbmVkLGN1c3RvbURlZmF1bHRzTWVyZ2Usc3RhY2spO3N0YWNrWyJkZWxldGUiXShzcmNWYWx1ZSl9cmV0dXJuIG9ialZhbHVlfWZ1bmN0aW9uIGN1c3RvbU9taXRDbG9uZSh2YWx1ZSl7cmV0dXJuIGlzUGxhaW5PYmplY3QodmFsdWUpP3VuZGVmaW5lZDp2YWx1ZX1mdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSxvdGhlcixiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKXt2YXIgaXNQYXJ0aWFsPWJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsYXJyTGVuZ3RoPWFycmF5Lmxlbmd0aCxvdGhMZW5ndGg9b3RoZXIubGVuZ3RoO2lmKGFyckxlbmd0aCE9b3RoTGVuZ3RoJiYhKGlzUGFydGlhbCYmb3RoTGVuZ3RoPmFyckxlbmd0aCkpcmV0dXJuIGZhbHNlOwp2YXIgc3RhY2tlZD1zdGFjay5nZXQoYXJyYXkpO2lmKHN0YWNrZWQmJnN0YWNrLmdldChvdGhlcikpcmV0dXJuIHN0YWNrZWQ9PW90aGVyO3ZhciBpbmRleD0tMSxyZXN1bHQ9dHJ1ZSxzZWVuPWJpdG1hc2smQ09NUEFSRV9VTk9SREVSRURfRkxBRz9uZXcgU2V0Q2FjaGU6dW5kZWZpbmVkO3N0YWNrLnNldChhcnJheSxvdGhlcik7c3RhY2suc2V0KG90aGVyLGFycmF5KTt3aGlsZSgrK2luZGV4PGFyckxlbmd0aCl7dmFyIGFyclZhbHVlPWFycmF5W2luZGV4XSxvdGhWYWx1ZT1vdGhlcltpbmRleF07aWYoY3VzdG9taXplcil2YXIgY29tcGFyZWQ9aXNQYXJ0aWFsP2N1c3RvbWl6ZXIob3RoVmFsdWUsYXJyVmFsdWUsaW5kZXgsb3RoZXIsYXJyYXksc3RhY2spOmN1c3RvbWl6ZXIoYXJyVmFsdWUsb3RoVmFsdWUsaW5kZXgsYXJyYXksb3RoZXIsc3RhY2spO2lmKGNvbXBhcmVkIT09dW5kZWZpbmVkKXtpZihjb21wYXJlZCljb250aW51ZTtyZXN1bHQ9ZmFsc2U7YnJlYWt9aWYoc2Vlbil7aWYoIWFycmF5U29tZShvdGhlciwKZnVuY3Rpb24ob3RoVmFsdWUsb3RoSW5kZXgpe2lmKCFjYWNoZUhhcyhzZWVuLG90aEluZGV4KSYmKGFyclZhbHVlPT09b3RoVmFsdWV8fGVxdWFsRnVuYyhhcnJWYWx1ZSxvdGhWYWx1ZSxiaXRtYXNrLGN1c3RvbWl6ZXIsc3RhY2spKSlyZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KX0pKXtyZXN1bHQ9ZmFsc2U7YnJlYWt9fWVsc2UgaWYoIShhcnJWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMoYXJyVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKSkpe3Jlc3VsdD1mYWxzZTticmVha319c3RhY2tbImRlbGV0ZSJdKGFycmF5KTtzdGFja1siZGVsZXRlIl0ob3RoZXIpO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gZXF1YWxCeVRhZyhvYmplY3Qsb3RoZXIsdGFnLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3N3aXRjaCh0YWcpe2Nhc2UgZGF0YVZpZXdUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fG9iamVjdC5ieXRlT2Zmc2V0IT0Kb3RoZXIuYnl0ZU9mZnNldClyZXR1cm4gZmFsc2U7b2JqZWN0PW9iamVjdC5idWZmZXI7b3RoZXI9b3RoZXIuYnVmZmVyO2Nhc2UgYXJyYXlCdWZmZXJUYWc6aWYob2JqZWN0LmJ5dGVMZW5ndGghPW90aGVyLmJ5dGVMZW5ndGh8fCFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSxuZXcgVWludDhBcnJheShvdGhlcikpKXJldHVybiBmYWxzZTtyZXR1cm4gdHJ1ZTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOmNhc2UgbnVtYmVyVGFnOnJldHVybiBlcSgrb2JqZWN0LCtvdGhlcik7Y2FzZSBlcnJvclRhZzpyZXR1cm4gb2JqZWN0Lm5hbWU9PW90aGVyLm5hbWUmJm9iamVjdC5tZXNzYWdlPT1vdGhlci5tZXNzYWdlO2Nhc2UgcmVnZXhwVGFnOmNhc2Ugc3RyaW5nVGFnOnJldHVybiBvYmplY3Q9PW90aGVyKyIiO2Nhc2UgbWFwVGFnOnZhciBjb252ZXJ0PW1hcFRvQXJyYXk7Y2FzZSBzZXRUYWc6dmFyIGlzUGFydGlhbD1iaXRtYXNrJkNPTVBBUkVfUEFSVElBTF9GTEFHO2NvbnZlcnR8fAooY29udmVydD1zZXRUb0FycmF5KTtpZihvYmplY3Quc2l6ZSE9b3RoZXIuc2l6ZSYmIWlzUGFydGlhbClyZXR1cm4gZmFsc2U7dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZClyZXR1cm4gc3RhY2tlZD09b3RoZXI7Yml0bWFza3w9Q09NUEFSRV9VTk9SREVSRURfRkxBRztzdGFjay5zZXQob2JqZWN0LG90aGVyKTt2YXIgcmVzdWx0PWVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSxjb252ZXJ0KG90aGVyKSxiaXRtYXNrLGN1c3RvbWl6ZXIsZXF1YWxGdW5jLHN0YWNrKTtzdGFja1siZGVsZXRlIl0ob2JqZWN0KTtyZXR1cm4gcmVzdWx0O2Nhc2Ugc3ltYm9sVGFnOmlmKHN5bWJvbFZhbHVlT2YpcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpPT1zeW1ib2xWYWx1ZU9mLmNhbGwob3RoZXIpfXJldHVybiBmYWxzZX1mdW5jdGlvbiBlcXVhbE9iamVjdHMob2JqZWN0LG90aGVyLGJpdG1hc2ssY3VzdG9taXplcixlcXVhbEZ1bmMsc3RhY2spe3ZhciBpc1BhcnRpYWw9CmJpdG1hc2smQ09NUEFSRV9QQVJUSUFMX0ZMQUcsb2JqUHJvcHM9Z2V0QWxsS2V5cyhvYmplY3QpLG9iakxlbmd0aD1vYmpQcm9wcy5sZW5ndGgsb3RoUHJvcHM9Z2V0QWxsS2V5cyhvdGhlciksb3RoTGVuZ3RoPW90aFByb3BzLmxlbmd0aDtpZihvYmpMZW5ndGghPW90aExlbmd0aCYmIWlzUGFydGlhbClyZXR1cm4gZmFsc2U7dmFyIGluZGV4PW9iakxlbmd0aDt3aGlsZShpbmRleC0tKXt2YXIga2V5PW9ialByb3BzW2luZGV4XTtpZighKGlzUGFydGlhbD9rZXkgaW4gb3RoZXI6aGFzT3duUHJvcGVydHkuY2FsbChvdGhlcixrZXkpKSlyZXR1cm4gZmFsc2V9dmFyIHN0YWNrZWQ9c3RhY2suZ2V0KG9iamVjdCk7aWYoc3RhY2tlZCYmc3RhY2suZ2V0KG90aGVyKSlyZXR1cm4gc3RhY2tlZD09b3RoZXI7dmFyIHJlc3VsdD10cnVlO3N0YWNrLnNldChvYmplY3Qsb3RoZXIpO3N0YWNrLnNldChvdGhlcixvYmplY3QpO3ZhciBza2lwQ3Rvcj1pc1BhcnRpYWw7d2hpbGUoKytpbmRleDxvYmpMZW5ndGgpe2tleT0Kb2JqUHJvcHNbaW5kZXhdO3ZhciBvYmpWYWx1ZT1vYmplY3Rba2V5XSxvdGhWYWx1ZT1vdGhlcltrZXldO2lmKGN1c3RvbWl6ZXIpdmFyIGNvbXBhcmVkPWlzUGFydGlhbD9jdXN0b21pemVyKG90aFZhbHVlLG9ialZhbHVlLGtleSxvdGhlcixvYmplY3Qsc3RhY2spOmN1c3RvbWl6ZXIob2JqVmFsdWUsb3RoVmFsdWUsa2V5LG9iamVjdCxvdGhlcixzdGFjayk7aWYoIShjb21wYXJlZD09PXVuZGVmaW5lZD9vYmpWYWx1ZT09PW90aFZhbHVlfHxlcXVhbEZ1bmMob2JqVmFsdWUsb3RoVmFsdWUsYml0bWFzayxjdXN0b21pemVyLHN0YWNrKTpjb21wYXJlZCkpe3Jlc3VsdD1mYWxzZTticmVha31za2lwQ3Rvcnx8KHNraXBDdG9yPWtleT09ImNvbnN0cnVjdG9yIil9aWYocmVzdWx0JiYhc2tpcEN0b3Ipe3ZhciBvYmpDdG9yPW9iamVjdC5jb25zdHJ1Y3RvcixvdGhDdG9yPW90aGVyLmNvbnN0cnVjdG9yO2lmKG9iakN0b3IhPW90aEN0b3ImJigiY29uc3RydWN0b3IiaW4gb2JqZWN0JiYiY29uc3RydWN0b3IiaW4Kb3RoZXIpJiYhKHR5cGVvZiBvYmpDdG9yPT0iZnVuY3Rpb24iJiZvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciYmdHlwZW9mIG90aEN0b3I9PSJmdW5jdGlvbiImJm90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSlyZXN1bHQ9ZmFsc2V9c3RhY2tbImRlbGV0ZSJdKG9iamVjdCk7c3RhY2tbImRlbGV0ZSJdKG90aGVyKTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpe3JldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLHVuZGVmaW5lZCxmbGF0dGVuKSxmdW5jKyIiKX1mdW5jdGlvbiBnZXRBbGxLZXlzKG9iamVjdCl7cmV0dXJuIGJhc2VHZXRBbGxLZXlzKG9iamVjdCxrZXlzLGdldFN5bWJvbHMpfWZ1bmN0aW9uIGdldEFsbEtleXNJbihvYmplY3Qpe3JldHVybiBiYXNlR2V0QWxsS2V5cyhvYmplY3Qsa2V5c0luLGdldFN5bWJvbHNJbil9dmFyIGdldERhdGE9IW1ldGFNYXA/bm9vcDpmdW5jdGlvbihmdW5jKXtyZXR1cm4gbWV0YU1hcC5nZXQoZnVuYyl9OwpmdW5jdGlvbiBnZXRGdW5jTmFtZShmdW5jKXt2YXIgcmVzdWx0PWZ1bmMubmFtZSsiIixhcnJheT1yZWFsTmFtZXNbcmVzdWx0XSxsZW5ndGg9aGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMscmVzdWx0KT9hcnJheS5sZW5ndGg6MDt3aGlsZShsZW5ndGgtLSl7dmFyIGRhdGE9YXJyYXlbbGVuZ3RoXSxvdGhlckZ1bmM9ZGF0YS5mdW5jO2lmKG90aGVyRnVuYz09bnVsbHx8b3RoZXJGdW5jPT1mdW5jKXJldHVybiBkYXRhLm5hbWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBnZXRIb2xkZXIoZnVuYyl7dmFyIG9iamVjdD1oYXNPd25Qcm9wZXJ0eS5jYWxsKGxvZGFzaCwicGxhY2Vob2xkZXIiKT9sb2Rhc2g6ZnVuYztyZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyfWZ1bmN0aW9uIGdldEl0ZXJhdGVlKCl7dmFyIHJlc3VsdD1sb2Rhc2guaXRlcmF0ZWV8fGl0ZXJhdGVlO3Jlc3VsdD1yZXN1bHQ9PT1pdGVyYXRlZT9iYXNlSXRlcmF0ZWU6cmVzdWx0O3JldHVybiBhcmd1bWVudHMubGVuZ3RoPwpyZXN1bHQoYXJndW1lbnRzWzBdLGFyZ3VtZW50c1sxXSk6cmVzdWx0fWZ1bmN0aW9uIGdldE1hcERhdGEobWFwLGtleSl7dmFyIGRhdGE9bWFwLl9fZGF0YV9fO3JldHVybiBpc0tleWFibGUoa2V5KT9kYXRhW3R5cGVvZiBrZXk9PSJzdHJpbmciPyJzdHJpbmciOiJoYXNoIl06ZGF0YS5tYXB9ZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCl7dmFyIHJlc3VsdD1rZXlzKG9iamVjdCksbGVuZ3RoPXJlc3VsdC5sZW5ndGg7d2hpbGUobGVuZ3RoLS0pe3ZhciBrZXk9cmVzdWx0W2xlbmd0aF0sdmFsdWU9b2JqZWN0W2tleV07cmVzdWx0W2xlbmd0aF09W2tleSx2YWx1ZSxpc1N0cmljdENvbXBhcmFibGUodmFsdWUpXX1yZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3Qsa2V5KXt2YXIgdmFsdWU9Z2V0VmFsdWUob2JqZWN0LGtleSk7cmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk/dmFsdWU6dW5kZWZpbmVkfWZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSl7dmFyIGlzT3duPQpoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLHN5bVRvU3RyaW5nVGFnKSx0YWc9dmFsdWVbc3ltVG9TdHJpbmdUYWddO3RyeXt2YWx1ZVtzeW1Ub1N0cmluZ1RhZ109dW5kZWZpbmVkO3ZhciB1bm1hc2tlZD10cnVlfWNhdGNoKGUpe312YXIgcmVzdWx0PW5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpO2lmKHVubWFza2VkKWlmKGlzT3duKXZhbHVlW3N5bVRvU3RyaW5nVGFnXT10YWc7ZWxzZSBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddO3JldHVybiByZXN1bHR9dmFyIGdldFN5bWJvbHM9IW5hdGl2ZUdldFN5bWJvbHM/c3R1YkFycmF5OmZ1bmN0aW9uKG9iamVjdCl7aWYob2JqZWN0PT1udWxsKXJldHVybltdO29iamVjdD1PYmplY3Qob2JqZWN0KTtyZXR1cm4gYXJyYXlGaWx0ZXIobmF0aXZlR2V0U3ltYm9scyhvYmplY3QpLGZ1bmN0aW9uKHN5bWJvbCl7cmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LHN5bWJvbCl9KX07dmFyIGdldFN5bWJvbHNJbj0KIW5hdGl2ZUdldFN5bWJvbHM/c3R1YkFycmF5OmZ1bmN0aW9uKG9iamVjdCl7dmFyIHJlc3VsdD1bXTt3aGlsZShvYmplY3Qpe2FycmF5UHVzaChyZXN1bHQsZ2V0U3ltYm9scyhvYmplY3QpKTtvYmplY3Q9Z2V0UHJvdG90eXBlKG9iamVjdCl9cmV0dXJuIHJlc3VsdH07dmFyIGdldFRhZz1iYXNlR2V0VGFnO2lmKERhdGFWaWV3JiZnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpIT1kYXRhVmlld1RhZ3x8TWFwJiZnZXRUYWcobmV3IE1hcCkhPW1hcFRhZ3x8UHJvbWlzZSYmZ2V0VGFnKFByb21pc2UucmVzb2x2ZSgpKSE9cHJvbWlzZVRhZ3x8U2V0JiZnZXRUYWcobmV3IFNldCkhPXNldFRhZ3x8V2Vha01hcCYmZ2V0VGFnKG5ldyBXZWFrTWFwKSE9d2Vha01hcFRhZylnZXRUYWc9ZnVuY3Rpb24odmFsdWUpe3ZhciByZXN1bHQ9YmFzZUdldFRhZyh2YWx1ZSksQ3Rvcj1yZXN1bHQ9PW9iamVjdFRhZz92YWx1ZS5jb25zdHJ1Y3Rvcjp1bmRlZmluZWQsY3RvclN0cmluZz0KQ3Rvcj90b1NvdXJjZShDdG9yKToiIjtpZihjdG9yU3RyaW5nKXN3aXRjaChjdG9yU3RyaW5nKXtjYXNlIGRhdGFWaWV3Q3RvclN0cmluZzpyZXR1cm4gZGF0YVZpZXdUYWc7Y2FzZSBtYXBDdG9yU3RyaW5nOnJldHVybiBtYXBUYWc7Y2FzZSBwcm9taXNlQ3RvclN0cmluZzpyZXR1cm4gcHJvbWlzZVRhZztjYXNlIHNldEN0b3JTdHJpbmc6cmV0dXJuIHNldFRhZztjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOnJldHVybiB3ZWFrTWFwVGFnfXJldHVybiByZXN1bHR9O2Z1bmN0aW9uIGdldFZpZXcoc3RhcnQsZW5kLHRyYW5zZm9ybXMpe3ZhciBpbmRleD0tMSxsZW5ndGg9dHJhbnNmb3Jtcy5sZW5ndGg7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBkYXRhPXRyYW5zZm9ybXNbaW5kZXhdLHNpemU9ZGF0YS5zaXplO3N3aXRjaChkYXRhLnR5cGUpe2Nhc2UgImRyb3AiOnN0YXJ0Kz1zaXplO2JyZWFrO2Nhc2UgImRyb3BSaWdodCI6ZW5kLT1zaXplO2JyZWFrO2Nhc2UgInRha2UiOmVuZD1uYXRpdmVNaW4oZW5kLApzdGFydCtzaXplKTticmVhaztjYXNlICJ0YWtlUmlnaHQiOnN0YXJ0PW5hdGl2ZU1heChzdGFydCxlbmQtc2l6ZSk7YnJlYWt9fXJldHVybnsic3RhcnQiOnN0YXJ0LCJlbmQiOmVuZH19ZnVuY3Rpb24gZ2V0V3JhcERldGFpbHMoc291cmNlKXt2YXIgbWF0Y2g9c291cmNlLm1hdGNoKHJlV3JhcERldGFpbHMpO3JldHVybiBtYXRjaD9tYXRjaFsxXS5zcGxpdChyZVNwbGl0RGV0YWlscyk6W119ZnVuY3Rpb24gaGFzUGF0aChvYmplY3QscGF0aCxoYXNGdW5jKXtwYXRoPWNhc3RQYXRoKHBhdGgsb2JqZWN0KTt2YXIgaW5kZXg9LTEsbGVuZ3RoPXBhdGgubGVuZ3RoLHJlc3VsdD1mYWxzZTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIGtleT10b0tleShwYXRoW2luZGV4XSk7aWYoIShyZXN1bHQ9b2JqZWN0IT1udWxsJiZoYXNGdW5jKG9iamVjdCxrZXkpKSlicmVhaztvYmplY3Q9b2JqZWN0W2tleV19aWYocmVzdWx0fHwrK2luZGV4IT1sZW5ndGgpcmV0dXJuIHJlc3VsdDtsZW5ndGg9Cm9iamVjdD09bnVsbD8wOm9iamVjdC5sZW5ndGg7cmV0dXJuISFsZW5ndGgmJmlzTGVuZ3RoKGxlbmd0aCkmJmlzSW5kZXgoa2V5LGxlbmd0aCkmJihpc0FycmF5KG9iamVjdCl8fGlzQXJndW1lbnRzKG9iamVjdCkpfWZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5Lmxlbmd0aCxyZXN1bHQ9bmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7aWYobGVuZ3RoJiZ0eXBlb2YgYXJyYXlbMF09PSJzdHJpbmciJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCJpbmRleCIpKXtyZXN1bHQuaW5kZXg9YXJyYXkuaW5kZXg7cmVzdWx0LmlucHV0PWFycmF5LmlucHV0fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCl7cmV0dXJuIHR5cGVvZiBvYmplY3QuY29uc3RydWN0b3I9PSJmdW5jdGlvbiImJiFpc1Byb3RvdHlwZShvYmplY3QpP2Jhc2VDcmVhdGUoZ2V0UHJvdG90eXBlKG9iamVjdCkpOnt9fWZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwKdGFnLGlzRGVlcCl7dmFyIEN0b3I9b2JqZWN0LmNvbnN0cnVjdG9yO3N3aXRjaCh0YWcpe2Nhc2UgYXJyYXlCdWZmZXJUYWc6cmV0dXJuIGNsb25lQXJyYXlCdWZmZXIob2JqZWN0KTtjYXNlIGJvb2xUYWc6Y2FzZSBkYXRlVGFnOnJldHVybiBuZXcgQ3Rvcigrb2JqZWN0KTtjYXNlIGRhdGFWaWV3VGFnOnJldHVybiBjbG9uZURhdGFWaWV3KG9iamVjdCxpc0RlZXApO2Nhc2UgZmxvYXQzMlRhZzpjYXNlIGZsb2F0NjRUYWc6Y2FzZSBpbnQ4VGFnOmNhc2UgaW50MTZUYWc6Y2FzZSBpbnQzMlRhZzpjYXNlIHVpbnQ4VGFnOmNhc2UgdWludDhDbGFtcGVkVGFnOmNhc2UgdWludDE2VGFnOmNhc2UgdWludDMyVGFnOnJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LGlzRGVlcCk7Y2FzZSBtYXBUYWc6cmV0dXJuIG5ldyBDdG9yO2Nhc2UgbnVtYmVyVGFnOmNhc2Ugc3RyaW5nVGFnOnJldHVybiBuZXcgQ3RvcihvYmplY3QpO2Nhc2UgcmVnZXhwVGFnOnJldHVybiBjbG9uZVJlZ0V4cChvYmplY3QpOwpjYXNlIHNldFRhZzpyZXR1cm4gbmV3IEN0b3I7Y2FzZSBzeW1ib2xUYWc6cmV0dXJuIGNsb25lU3ltYm9sKG9iamVjdCl9fWZ1bmN0aW9uIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSxkZXRhaWxzKXt2YXIgbGVuZ3RoPWRldGFpbHMubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuIHNvdXJjZTt2YXIgbGFzdEluZGV4PWxlbmd0aC0xO2RldGFpbHNbbGFzdEluZGV4XT0obGVuZ3RoPjE/Ilx4MjYgIjoiIikrZGV0YWlsc1tsYXN0SW5kZXhdO2RldGFpbHM9ZGV0YWlscy5qb2luKGxlbmd0aD4yPyIsICI6IiAiKTtyZXR1cm4gc291cmNlLnJlcGxhY2UocmVXcmFwQ29tbWVudCwie1xuLyogW3dyYXBwZWQgd2l0aCAiK2RldGFpbHMrIl0gKi9cbiIpfWZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpe3JldHVybiBpc0FycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpfHwhIShzcHJlYWRhYmxlU3ltYm9sJiZ2YWx1ZSYmdmFsdWVbc3ByZWFkYWJsZVN5bWJvbF0pfWZ1bmN0aW9uIGlzSW5kZXgodmFsdWUsCmxlbmd0aCl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO2xlbmd0aD1sZW5ndGg9PW51bGw/TUFYX1NBRkVfSU5URUdFUjpsZW5ndGg7cmV0dXJuISFsZW5ndGgmJih0eXBlPT0ibnVtYmVyInx8dHlwZSE9InN5bWJvbCImJnJlSXNVaW50LnRlc3QodmFsdWUpKSYmKHZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTxsZW5ndGgpfWZ1bmN0aW9uIGlzSXRlcmF0ZWVDYWxsKHZhbHVlLGluZGV4LG9iamVjdCl7aWYoIWlzT2JqZWN0KG9iamVjdCkpcmV0dXJuIGZhbHNlO3ZhciB0eXBlPXR5cGVvZiBpbmRleDtpZih0eXBlPT0ibnVtYmVyIj9pc0FycmF5TGlrZShvYmplY3QpJiZpc0luZGV4KGluZGV4LG9iamVjdC5sZW5ndGgpOnR5cGU9PSJzdHJpbmciJiZpbmRleCBpbiBvYmplY3QpcmV0dXJuIGVxKG9iamVjdFtpbmRleF0sdmFsdWUpO3JldHVybiBmYWxzZX1mdW5jdGlvbiBpc0tleSh2YWx1ZSxvYmplY3Qpe2lmKGlzQXJyYXkodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdHlwZT10eXBlb2YgdmFsdWU7CmlmKHR5cGU9PSJudW1iZXIifHx0eXBlPT0ic3ltYm9sInx8dHlwZT09ImJvb2xlYW4ifHx2YWx1ZT09bnVsbHx8aXNTeW1ib2wodmFsdWUpKXJldHVybiB0cnVlO3JldHVybiByZUlzUGxhaW5Qcm9wLnRlc3QodmFsdWUpfHwhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpfHxvYmplY3QhPW51bGwmJnZhbHVlIGluIE9iamVjdChvYmplY3QpfWZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB0eXBlPT0ic3RyaW5nInx8dHlwZT09Im51bWJlciJ8fHR5cGU9PSJzeW1ib2wifHx0eXBlPT0iYm9vbGVhbiI/dmFsdWUhPT0iX19wcm90b19fIjp2YWx1ZT09PW51bGx9ZnVuY3Rpb24gaXNMYXppYWJsZShmdW5jKXt2YXIgZnVuY05hbWU9Z2V0RnVuY05hbWUoZnVuYyksb3RoZXI9bG9kYXNoW2Z1bmNOYW1lXTtpZih0eXBlb2Ygb3RoZXIhPSJmdW5jdGlvbiJ8fCEoZnVuY05hbWUgaW4gTGF6eVdyYXBwZXIucHJvdG90eXBlKSlyZXR1cm4gZmFsc2U7CmlmKGZ1bmM9PT1vdGhlcilyZXR1cm4gdHJ1ZTt2YXIgZGF0YT1nZXREYXRhKG90aGVyKTtyZXR1cm4hIWRhdGEmJmZ1bmM9PT1kYXRhWzBdfWZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpe3JldHVybiEhbWFza1NyY0tleSYmbWFza1NyY0tleSBpbiBmdW5jfXZhciBpc01hc2thYmxlPWNvcmVKc0RhdGE/aXNGdW5jdGlvbjpzdHViRmFsc2U7ZnVuY3Rpb24gaXNQcm90b3R5cGUodmFsdWUpe3ZhciBDdG9yPXZhbHVlJiZ2YWx1ZS5jb25zdHJ1Y3Rvcixwcm90bz10eXBlb2YgQ3Rvcj09ImZ1bmN0aW9uIiYmQ3Rvci5wcm90b3R5cGV8fG9iamVjdFByb3RvO3JldHVybiB2YWx1ZT09PXByb3RvfWZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dmFsdWUmJiFpc09iamVjdCh2YWx1ZSl9ZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LHNyY1ZhbHVlKXtyZXR1cm4gZnVuY3Rpb24ob2JqZWN0KXtpZihvYmplY3Q9PW51bGwpcmV0dXJuIGZhbHNlOwpyZXR1cm4gb2JqZWN0W2tleV09PT1zcmNWYWx1ZSYmKHNyY1ZhbHVlIT09dW5kZWZpbmVkfHxrZXkgaW4gT2JqZWN0KG9iamVjdCkpfX1mdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpe3ZhciByZXN1bHQ9bWVtb2l6ZShmdW5jLGZ1bmN0aW9uKGtleSl7aWYoY2FjaGUuc2l6ZT09PU1BWF9NRU1PSVpFX1NJWkUpY2FjaGUuY2xlYXIoKTtyZXR1cm4ga2V5fSk7dmFyIGNhY2hlPXJlc3VsdC5jYWNoZTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1lcmdlRGF0YShkYXRhLHNvdXJjZSl7dmFyIGJpdG1hc2s9ZGF0YVsxXSxzcmNCaXRtYXNrPXNvdXJjZVsxXSxuZXdCaXRtYXNrPWJpdG1hc2t8c3JjQml0bWFzayxpc0NvbW1vbj1uZXdCaXRtYXNrPChXUkFQX0JJTkRfRkxBR3xXUkFQX0JJTkRfS0VZX0ZMQUd8V1JBUF9BUllfRkxBRyk7dmFyIGlzQ29tYm89c3JjQml0bWFzaz09V1JBUF9BUllfRkxBRyYmYml0bWFzaz09V1JBUF9DVVJSWV9GTEFHfHxzcmNCaXRtYXNrPT1XUkFQX0FSWV9GTEFHJiYKYml0bWFzaz09V1JBUF9SRUFSR19GTEFHJiZkYXRhWzddLmxlbmd0aDw9c291cmNlWzhdfHxzcmNCaXRtYXNrPT0oV1JBUF9BUllfRkxBR3xXUkFQX1JFQVJHX0ZMQUcpJiZzb3VyY2VbN10ubGVuZ3RoPD1zb3VyY2VbOF0mJmJpdG1hc2s9PVdSQVBfQ1VSUllfRkxBRztpZighKGlzQ29tbW9ufHxpc0NvbWJvKSlyZXR1cm4gZGF0YTtpZihzcmNCaXRtYXNrJldSQVBfQklORF9GTEFHKXtkYXRhWzJdPXNvdXJjZVsyXTtuZXdCaXRtYXNrfD1iaXRtYXNrJldSQVBfQklORF9GTEFHPzA6V1JBUF9DVVJSWV9CT1VORF9GTEFHfXZhciB2YWx1ZT1zb3VyY2VbM107aWYodmFsdWUpe3ZhciBwYXJ0aWFscz1kYXRhWzNdO2RhdGFbM109cGFydGlhbHM/Y29tcG9zZUFyZ3MocGFydGlhbHMsdmFsdWUsc291cmNlWzRdKTp2YWx1ZTtkYXRhWzRdPXBhcnRpYWxzP3JlcGxhY2VIb2xkZXJzKGRhdGFbM10sUExBQ0VIT0xERVIpOnNvdXJjZVs0XX12YWx1ZT1zb3VyY2VbNV07aWYodmFsdWUpe3BhcnRpYWxzPQpkYXRhWzVdO2RhdGFbNV09cGFydGlhbHM/Y29tcG9zZUFyZ3NSaWdodChwYXJ0aWFscyx2YWx1ZSxzb3VyY2VbNl0pOnZhbHVlO2RhdGFbNl09cGFydGlhbHM/cmVwbGFjZUhvbGRlcnMoZGF0YVs1XSxQTEFDRUhPTERFUik6c291cmNlWzZdfXZhbHVlPXNvdXJjZVs3XTtpZih2YWx1ZSlkYXRhWzddPXZhbHVlO2lmKHNyY0JpdG1hc2smV1JBUF9BUllfRkxBRylkYXRhWzhdPWRhdGFbOF09PW51bGw/c291cmNlWzhdOm5hdGl2ZU1pbihkYXRhWzhdLHNvdXJjZVs4XSk7aWYoZGF0YVs5XT09bnVsbClkYXRhWzldPXNvdXJjZVs5XTtkYXRhWzBdPXNvdXJjZVswXTtkYXRhWzFdPW5ld0JpdG1hc2s7cmV0dXJuIGRhdGF9ZnVuY3Rpb24gbmF0aXZlS2V5c0luKG9iamVjdCl7dmFyIHJlc3VsdD1bXTtpZihvYmplY3QhPW51bGwpZm9yKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpcmVzdWx0LnB1c2goa2V5KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKXtyZXR1cm4gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSl9CmZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsc3RhcnQsdHJhbnNmb3JtKXtzdGFydD1uYXRpdmVNYXgoc3RhcnQ9PT11bmRlZmluZWQ/ZnVuYy5sZW5ndGgtMTpzdGFydCwwKTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1heChhcmdzLmxlbmd0aC1zdGFydCwwKSxhcnJheT1BcnJheShsZW5ndGgpO3doaWxlKCsraW5kZXg8bGVuZ3RoKWFycmF5W2luZGV4XT1hcmdzW3N0YXJ0K2luZGV4XTtpbmRleD0tMTt2YXIgb3RoZXJBcmdzPUFycmF5KHN0YXJ0KzEpO3doaWxlKCsraW5kZXg8c3RhcnQpb3RoZXJBcmdzW2luZGV4XT1hcmdzW2luZGV4XTtvdGhlckFyZ3Nbc3RhcnRdPXRyYW5zZm9ybShhcnJheSk7cmV0dXJuIGFwcGx5KGZ1bmMsdGhpcyxvdGhlckFyZ3MpfX1mdW5jdGlvbiBwYXJlbnQob2JqZWN0LHBhdGgpe3JldHVybiBwYXRoLmxlbmd0aDwyP29iamVjdDpiYXNlR2V0KG9iamVjdCxiYXNlU2xpY2UocGF0aCwwLC0xKSl9CmZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksaW5kZXhlcyl7dmFyIGFyckxlbmd0aD1hcnJheS5sZW5ndGgsbGVuZ3RoPW5hdGl2ZU1pbihpbmRleGVzLmxlbmd0aCxhcnJMZW5ndGgpLG9sZEFycmF5PWNvcHlBcnJheShhcnJheSk7d2hpbGUobGVuZ3RoLS0pe3ZhciBpbmRleD1pbmRleGVzW2xlbmd0aF07YXJyYXlbbGVuZ3RoXT1pc0luZGV4KGluZGV4LGFyckxlbmd0aCk/b2xkQXJyYXlbaW5kZXhdOnVuZGVmaW5lZH1yZXR1cm4gYXJyYXl9dmFyIHNldERhdGE9c2hvcnRPdXQoYmFzZVNldERhdGEpO3ZhciBzZXRUaW1lb3V0PWN0eFNldFRpbWVvdXR8fGZ1bmN0aW9uKGZ1bmMsd2FpdCl7cmV0dXJuIHJvb3Quc2V0VGltZW91dChmdW5jLHdhaXQpfTt2YXIgc2V0VG9TdHJpbmc9c2hvcnRPdXQoYmFzZVNldFRvU3RyaW5nKTtmdW5jdGlvbiBzZXRXcmFwVG9TdHJpbmcod3JhcHBlcixyZWZlcmVuY2UsYml0bWFzayl7dmFyIHNvdXJjZT1yZWZlcmVuY2UrIiI7cmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsCmluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSx1cGRhdGVXcmFwRGV0YWlscyhnZXRXcmFwRGV0YWlscyhzb3VyY2UpLGJpdG1hc2spKSl9ZnVuY3Rpb24gc2hvcnRPdXQoZnVuYyl7dmFyIGNvdW50PTAsbGFzdENhbGxlZD0wO3JldHVybiBmdW5jdGlvbigpe3ZhciBzdGFtcD1uYXRpdmVOb3coKSxyZW1haW5pbmc9SE9UX1NQQU4tKHN0YW1wLWxhc3RDYWxsZWQpO2xhc3RDYWxsZWQ9c3RhbXA7aWYocmVtYWluaW5nPjApe2lmKCsrY291bnQ+PUhPVF9DT1VOVClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgY291bnQ9MDtyZXR1cm4gZnVuYy5hcHBseSh1bmRlZmluZWQsYXJndW1lbnRzKX19ZnVuY3Rpb24gc2h1ZmZsZVNlbGYoYXJyYXksc2l6ZSl7dmFyIGluZGV4PS0xLGxlbmd0aD1hcnJheS5sZW5ndGgsbGFzdEluZGV4PWxlbmd0aC0xO3NpemU9c2l6ZT09PXVuZGVmaW5lZD9sZW5ndGg6c2l6ZTt3aGlsZSgrK2luZGV4PHNpemUpe3ZhciByYW5kPWJhc2VSYW5kb20oaW5kZXgsbGFzdEluZGV4KSwKdmFsdWU9YXJyYXlbcmFuZF07YXJyYXlbcmFuZF09YXJyYXlbaW5kZXhdO2FycmF5W2luZGV4XT12YWx1ZX1hcnJheS5sZW5ndGg9c2l6ZTtyZXR1cm4gYXJyYXl9dmFyIHN0cmluZ1RvUGF0aD1tZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZyl7dmFyIHJlc3VsdD1bXTtpZihzdHJpbmcuY2hhckNvZGVBdCgwKT09PTQ2KXJlc3VsdC5wdXNoKCIiKTtzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLGZ1bmN0aW9uKG1hdGNoLG51bWJlcixxdW90ZSxzdWJTdHJpbmcpe3Jlc3VsdC5wdXNoKHF1b3RlP3N1YlN0cmluZy5yZXBsYWNlKHJlRXNjYXBlQ2hhciwiJDEiKTpudW1iZXJ8fG1hdGNoKX0pO3JldHVybiByZXN1bHR9KTtmdW5jdGlvbiB0b0tleSh2YWx1ZSl7aWYodHlwZW9mIHZhbHVlPT0ic3RyaW5nInx8aXNTeW1ib2wodmFsdWUpKXJldHVybiB2YWx1ZTt2YXIgcmVzdWx0PXZhbHVlKyIiO3JldHVybiByZXN1bHQ9PSIwIiYmMS92YWx1ZT09LUlORklOSVRZPyItMCI6cmVzdWx0fQpmdW5jdGlvbiB0b1NvdXJjZShmdW5jKXtpZihmdW5jIT1udWxsKXt0cnl7cmV0dXJuIGZ1bmNUb1N0cmluZy5jYWxsKGZ1bmMpfWNhdGNoKGUpe310cnl7cmV0dXJuIGZ1bmMrIiJ9Y2F0Y2goZSQwKXt9fXJldHVybiIifWZ1bmN0aW9uIHVwZGF0ZVdyYXBEZXRhaWxzKGRldGFpbHMsYml0bWFzayl7YXJyYXlFYWNoKHdyYXBGbGFncyxmdW5jdGlvbihwYWlyKXt2YXIgdmFsdWU9Il8uIitwYWlyWzBdO2lmKGJpdG1hc2smcGFpclsxXSYmIWFycmF5SW5jbHVkZXMoZGV0YWlscyx2YWx1ZSkpZGV0YWlscy5wdXNoKHZhbHVlKX0pO3JldHVybiBkZXRhaWxzLnNvcnQoKX1mdW5jdGlvbiB3cmFwcGVyQ2xvbmUod3JhcHBlcil7aWYod3JhcHBlciBpbnN0YW5jZW9mIExhenlXcmFwcGVyKXJldHVybiB3cmFwcGVyLmNsb25lKCk7dmFyIHJlc3VsdD1uZXcgTG9kYXNoV3JhcHBlcih3cmFwcGVyLl9fd3JhcHBlZF9fLHdyYXBwZXIuX19jaGFpbl9fKTtyZXN1bHQuX19hY3Rpb25zX189Y29weUFycmF5KHdyYXBwZXIuX19hY3Rpb25zX18pOwpyZXN1bHQuX19pbmRleF9fPXdyYXBwZXIuX19pbmRleF9fO3Jlc3VsdC5fX3ZhbHVlc19fPXdyYXBwZXIuX192YWx1ZXNfXztyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNodW5rKGFycmF5LHNpemUsZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGFycmF5LHNpemUsZ3VhcmQpOnNpemU9PT11bmRlZmluZWQpc2l6ZT0xO2Vsc2Ugc2l6ZT1uYXRpdmVNYXgodG9JbnRlZ2VyKHNpemUpLDApO3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aHx8c2l6ZTwxKXJldHVybltdO3ZhciBpbmRleD0wLHJlc0luZGV4PTAscmVzdWx0PUFycmF5KG5hdGl2ZUNlaWwobGVuZ3RoL3NpemUpKTt3aGlsZShpbmRleDxsZW5ndGgpcmVzdWx0W3Jlc0luZGV4KytdPWJhc2VTbGljZShhcnJheSxpbmRleCxpbmRleCs9c2l6ZSk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb21wYWN0KGFycmF5KXt2YXIgaW5kZXg9LTEsbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoLApyZXNJbmRleD0wLHJlc3VsdD1bXTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZih2YWx1ZSlyZXN1bHRbcmVzSW5kZXgrK109dmFsdWV9cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjb25jYXQoKXt2YXIgbGVuZ3RoPWFyZ3VtZW50cy5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTt2YXIgYXJncz1BcnJheShsZW5ndGgtMSksYXJyYXk9YXJndW1lbnRzWzBdLGluZGV4PWxlbmd0aDt3aGlsZShpbmRleC0tKWFyZ3NbaW5kZXgtMV09YXJndW1lbnRzW2luZGV4XTtyZXR1cm4gYXJyYXlQdXNoKGlzQXJyYXkoYXJyYXkpP2NvcHlBcnJheShhcnJheSk6W2FycmF5XSxiYXNlRmxhdHRlbihhcmdzLDEpKX12YXIgZGlmZmVyZW5jZT1iYXNlUmVzdChmdW5jdGlvbihhcnJheSx2YWx1ZXMpe3JldHVybiBpc0FycmF5TGlrZU9iamVjdChhcnJheSk/YmFzZURpZmZlcmVuY2UoYXJyYXksYmFzZUZsYXR0ZW4odmFsdWVzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSkpOgpbXX0pO3ZhciBkaWZmZXJlbmNlQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgaXRlcmF0ZWU9bGFzdCh2YWx1ZXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT11bmRlZmluZWQ7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119KTt2YXIgZGlmZmVyZW5jZVdpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXt2YXIgY29tcGFyYXRvcj1sYXN0KHZhbHVlcyk7aWYoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpY29tcGFyYXRvcj11bmRlZmluZWQ7cmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KT9iYXNlRGlmZmVyZW5jZShhcnJheSxiYXNlRmxhdHRlbih2YWx1ZXMsMSxpc0FycmF5TGlrZU9iamVjdCx0cnVlKSx1bmRlZmluZWQsY29tcGFyYXRvcik6CltdfSk7ZnVuY3Rpb24gZHJvcChhcnJheSxuLGd1YXJkKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuW107bj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LG48MD8wOm4sbGVuZ3RoKX1mdW5jdGlvbiBkcm9wUmlnaHQoYXJyYXksbixndWFyZCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybltdO249Z3VhcmR8fG49PT11bmRlZmluZWQ/MTp0b0ludGVnZXIobik7bj1sZW5ndGgtbjtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bil9ZnVuY3Rpb24gZHJvcFJpZ2h0V2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLHRydWUsdHJ1ZSk6W119ZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LHByZWRpY2F0ZSl7cmV0dXJuIGFycmF5JiYKYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksdHJ1ZSk6W119ZnVuY3Rpb24gZmlsbChhcnJheSx2YWx1ZSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtpZihzdGFydCYmdHlwZW9mIHN0YXJ0IT0ibnVtYmVyIiYmaXNJdGVyYXRlZUNhbGwoYXJyYXksdmFsdWUsc3RhcnQpKXtzdGFydD0wO2VuZD1sZW5ndGh9cmV0dXJuIGJhc2VGaWxsKGFycmF5LHZhbHVlLHN0YXJ0LGVuZCl9ZnVuY3Rpb24gZmluZEluZGV4KGFycmF5LHByZWRpY2F0ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9ZnJvbUluZGV4PT1udWxsPzA6dG9JbnRlZ2VyKGZyb21JbmRleCk7aWYoaW5kZXg8MClpbmRleD1uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApO3JldHVybiBiYXNlRmluZEluZGV4KGFycmF5LApnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksaW5kZXgpfWZ1bmN0aW9uIGZpbmRMYXN0SW5kZXgoYXJyYXkscHJlZGljYXRlLGZyb21JbmRleCl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtpZighbGVuZ3RoKXJldHVybi0xO3ZhciBpbmRleD1sZW5ndGgtMTtpZihmcm9tSW5kZXghPT11bmRlZmluZWQpe2luZGV4PXRvSW50ZWdlcihmcm9tSW5kZXgpO2luZGV4PWZyb21JbmRleDwwP25hdGl2ZU1heChsZW5ndGgraW5kZXgsMCk6bmF0aXZlTWluKGluZGV4LGxlbmd0aC0xKX1yZXR1cm4gYmFzZUZpbmRJbmRleChhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMyksaW5kZXgsdHJ1ZSl9ZnVuY3Rpb24gZmxhdHRlbihhcnJheSl7dmFyIGxlbmd0aD1hcnJheT09bnVsbD8wOmFycmF5Lmxlbmd0aDtyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LDEpOltdfWZ1bmN0aW9uIGZsYXR0ZW5EZWVwKGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoOwpyZXR1cm4gbGVuZ3RoP2Jhc2VGbGF0dGVuKGFycmF5LElORklOSVRZKTpbXX1mdW5jdGlvbiBmbGF0dGVuRGVwdGgoYXJyYXksZGVwdGgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtkZXB0aD1kZXB0aD09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihkZXB0aCk7cmV0dXJuIGJhc2VGbGF0dGVuKGFycmF5LGRlcHRoKX1mdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpe3ZhciBpbmRleD0tMSxsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgscmVzdWx0PXt9O3doaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgcGFpcj1wYWlyc1tpbmRleF07cmVzdWx0W3BhaXJbMF1dPXBhaXJbMV19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBoZWFkKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9hcnJheVswXTp1bmRlZmluZWR9ZnVuY3Rpb24gaW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PQpudWxsPzA6YXJyYXkubGVuZ3RoO2lmKCFsZW5ndGgpcmV0dXJuLTE7dmFyIGluZGV4PWZyb21JbmRleD09bnVsbD8wOnRvSW50ZWdlcihmcm9tSW5kZXgpO2lmKGluZGV4PDApaW5kZXg9bmF0aXZlTWF4KGxlbmd0aCtpbmRleCwwKTtyZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpfWZ1bmN0aW9uIGluaXRpYWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMCwtMSk6W119dmFyIGludGVyc2VjdGlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO3JldHVybiBtYXBwZWQubGVuZ3RoJiZtYXBwZWRbMF09PT1hcnJheXNbMF0/YmFzZUludGVyc2VjdGlvbihtYXBwZWQpOltdfSk7dmFyIGludGVyc2VjdGlvbkJ5PWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGl0ZXJhdGVlPWxhc3QoYXJyYXlzKSwKbWFwcGVkPWFycmF5TWFwKGFycmF5cyxjYXN0QXJyYXlMaWtlT2JqZWN0KTtpZihpdGVyYXRlZT09PWxhc3QobWFwcGVkKSlpdGVyYXRlZT11bmRlZmluZWQ7ZWxzZSBtYXBwZWQucG9wKCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6W119KTt2YXIgaW50ZXJzZWN0aW9uV2l0aD1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3ZhciBjb21wYXJhdG9yPWxhc3QoYXJyYXlzKSxtYXBwZWQ9YXJyYXlNYXAoYXJyYXlzLGNhc3RBcnJheUxpa2VPYmplY3QpO2NvbXBhcmF0b3I9dHlwZW9mIGNvbXBhcmF0b3I9PSJmdW5jdGlvbiI/Y29tcGFyYXRvcjp1bmRlZmluZWQ7aWYoY29tcGFyYXRvciltYXBwZWQucG9wKCk7cmV0dXJuIG1hcHBlZC5sZW5ndGgmJm1hcHBlZFswXT09PWFycmF5c1swXT9iYXNlSW50ZXJzZWN0aW9uKG1hcHBlZCx1bmRlZmluZWQsY29tcGFyYXRvcik6CltdfSk7ZnVuY3Rpb24gam9pbihhcnJheSxzZXBhcmF0b3Ipe3JldHVybiBhcnJheT09bnVsbD8iIjpuYXRpdmVKb2luLmNhbGwoYXJyYXksc2VwYXJhdG9yKX1mdW5jdGlvbiBsYXN0KGFycmF5KXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO3JldHVybiBsZW5ndGg/YXJyYXlbbGVuZ3RoLTFdOnVuZGVmaW5lZH1mdW5jdGlvbiBsYXN0SW5kZXhPZihhcnJheSx2YWx1ZSxmcm9tSW5kZXgpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm4tMTt2YXIgaW5kZXg9bGVuZ3RoO2lmKGZyb21JbmRleCE9PXVuZGVmaW5lZCl7aW5kZXg9dG9JbnRlZ2VyKGZyb21JbmRleCk7aW5kZXg9aW5kZXg8MD9uYXRpdmVNYXgobGVuZ3RoK2luZGV4LDApOm5hdGl2ZU1pbihpbmRleCxsZW5ndGgtMSl9cmV0dXJuIHZhbHVlPT09dmFsdWU/c3RyaWN0TGFzdEluZGV4T2YoYXJyYXksdmFsdWUsaW5kZXgpOmJhc2VGaW5kSW5kZXgoYXJyYXksCmJhc2VJc05hTixpbmRleCx0cnVlKX1mdW5jdGlvbiBudGgoYXJyYXksbil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZU50aChhcnJheSx0b0ludGVnZXIobikpOnVuZGVmaW5lZH12YXIgcHVsbD1iYXNlUmVzdChwdWxsQWxsKTtmdW5jdGlvbiBwdWxsQWxsKGFycmF5LHZhbHVlcyl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSx2YWx1ZXMpOmFycmF5fWZ1bmN0aW9uIHB1bGxBbGxCeShhcnJheSx2YWx1ZXMsaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoJiZ2YWx1ZXMmJnZhbHVlcy5sZW5ndGg/YmFzZVB1bGxBbGwoYXJyYXksdmFsdWVzLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTphcnJheX1mdW5jdGlvbiBwdWxsQWxsV2l0aChhcnJheSx2YWx1ZXMsY29tcGFyYXRvcil7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGgmJnZhbHVlcyYmdmFsdWVzLmxlbmd0aD9iYXNlUHVsbEFsbChhcnJheSwKdmFsdWVzLHVuZGVmaW5lZCxjb21wYXJhdG9yKTphcnJheX12YXIgcHVsbEF0PWZsYXRSZXN0KGZ1bmN0aW9uKGFycmF5LGluZGV4ZXMpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGgscmVzdWx0PWJhc2VBdChhcnJheSxpbmRleGVzKTtiYXNlUHVsbEF0KGFycmF5LGFycmF5TWFwKGluZGV4ZXMsZnVuY3Rpb24oaW5kZXgpe3JldHVybiBpc0luZGV4KGluZGV4LGxlbmd0aCk/K2luZGV4OmluZGV4fSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIHJlbW92ZShhcnJheSxwcmVkaWNhdGUpe3ZhciByZXN1bHQ9W107aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm4gcmVzdWx0O3ZhciBpbmRleD0tMSxpbmRleGVzPVtdLGxlbmd0aD1hcnJheS5sZW5ndGg7cHJlZGljYXRlPWdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHZhbHVlPWFycmF5W2luZGV4XTtpZihwcmVkaWNhdGUodmFsdWUsCmluZGV4LGFycmF5KSl7cmVzdWx0LnB1c2godmFsdWUpO2luZGV4ZXMucHVzaChpbmRleCl9fWJhc2VQdWxsQXQoYXJyYXksaW5kZXhlcyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiByZXZlcnNlKGFycmF5KXtyZXR1cm4gYXJyYXk9PW51bGw/YXJyYXk6bmF0aXZlUmV2ZXJzZS5jYWxsKGFycmF5KX1mdW5jdGlvbiBzbGljZShhcnJheSxzdGFydCxlbmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtpZihlbmQmJnR5cGVvZiBlbmQhPSJudW1iZXIiJiZpc0l0ZXJhdGVlQ2FsbChhcnJheSxzdGFydCxlbmQpKXtzdGFydD0wO2VuZD1sZW5ndGh9ZWxzZXtzdGFydD1zdGFydD09bnVsbD8wOnRvSW50ZWdlcihzdGFydCk7ZW5kPWVuZD09PXVuZGVmaW5lZD9sZW5ndGg6dG9JbnRlZ2VyKGVuZCl9cmV0dXJuIGJhc2VTbGljZShhcnJheSxzdGFydCxlbmQpfWZ1bmN0aW9uIHNvcnRlZEluZGV4KGFycmF5LHZhbHVlKXtyZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LAp2YWx1ZSl9ZnVuY3Rpb24gc29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxpdGVyYXRlZSl7cmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LHZhbHVlLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX1mdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LHZhbHVlKXt2YXIgbGVuZ3RoPWFycmF5PT1udWxsPzA6YXJyYXkubGVuZ3RoO2lmKGxlbmd0aCl7dmFyIGluZGV4PWJhc2VTb3J0ZWRJbmRleChhcnJheSx2YWx1ZSk7aWYoaW5kZXg8bGVuZ3RoJiZlcShhcnJheVtpbmRleF0sdmFsdWUpKXJldHVybiBpbmRleH1yZXR1cm4tMX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXgoYXJyYXksdmFsdWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXgoYXJyYXksdmFsdWUsdHJ1ZSl9ZnVuY3Rpb24gc29ydGVkTGFzdEluZGV4QnkoYXJyYXksdmFsdWUsaXRlcmF0ZWUpe3JldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSx2YWx1ZSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSx0cnVlKX1mdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwKdmFsdWUpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYobGVuZ3RoKXt2YXIgaW5kZXg9YmFzZVNvcnRlZEluZGV4KGFycmF5LHZhbHVlLHRydWUpLTE7aWYoZXEoYXJyYXlbaW5kZXhdLHZhbHVlKSlyZXR1cm4gaW5kZXh9cmV0dXJuLTF9ZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXkpOltdfWZ1bmN0aW9uIHNvcnRlZFVuaXFCeShhcnJheSxpdGVyYXRlZSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVNvcnRlZFVuaXEoYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpOltdfWZ1bmN0aW9uIHRhaWwoYXJyYXkpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7cmV0dXJuIGxlbmd0aD9iYXNlU2xpY2UoYXJyYXksMSxsZW5ndGgpOltdfWZ1bmN0aW9uIHRha2UoYXJyYXksbixndWFyZCl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTsKbj1ndWFyZHx8bj09PXVuZGVmaW5lZD8xOnRvSW50ZWdlcihuKTtyZXR1cm4gYmFzZVNsaWNlKGFycmF5LDAsbjwwPzA6bil9ZnVuY3Rpb24gdGFrZVJpZ2h0KGFycmF5LG4sZ3VhcmQpe3ZhciBsZW5ndGg9YXJyYXk9PW51bGw/MDphcnJheS5sZW5ndGg7aWYoIWxlbmd0aClyZXR1cm5bXTtuPWd1YXJkfHxuPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKG4pO249bGVuZ3RoLW47cmV0dXJuIGJhc2VTbGljZShhcnJheSxuPDA/MDpuLGxlbmd0aCl9ZnVuY3Rpb24gdGFrZVJpZ2h0V2hpbGUoYXJyYXkscHJlZGljYXRlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlV2hpbGUoYXJyYXksZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpLGZhbHNlLHRydWUpOltdfWZ1bmN0aW9uIHRha2VXaGlsZShhcnJheSxwcmVkaWNhdGUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VXaGlsZShhcnJheSxnZXRJdGVyYXRlZShwcmVkaWNhdGUsMykpOltdfXZhciB1bmlvbj1iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpe3JldHVybiBiYXNlVW5pcShiYXNlRmxhdHRlbihhcnJheXMsCjEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSkpfSk7dmFyIHVuaW9uQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT11bmRlZmluZWQ7cmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywxLGlzQXJyYXlMaWtlT2JqZWN0LHRydWUpLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKX0pO3ZhciB1bmlvbldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLDEsaXNBcnJheUxpa2VPYmplY3QsdHJ1ZSksdW5kZWZpbmVkLGNvbXBhcmF0b3IpfSk7ZnVuY3Rpb24gdW5pcShhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZVVuaXEoYXJyYXkpOgpbXX1mdW5jdGlvbiB1bmlxQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDIpKTpbXX1mdW5jdGlvbiB1bmlxV2l0aChhcnJheSxjb21wYXJhdG9yKXtjb21wYXJhdG9yPXR5cGVvZiBjb21wYXJhdG9yPT0iZnVuY3Rpb24iP2NvbXBhcmF0b3I6dW5kZWZpbmVkO3JldHVybiBhcnJheSYmYXJyYXkubGVuZ3RoP2Jhc2VVbmlxKGFycmF5LHVuZGVmaW5lZCxjb21wYXJhdG9yKTpbXX1mdW5jdGlvbiB1bnppcChhcnJheSl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTt2YXIgbGVuZ3RoPTA7YXJyYXk9YXJyYXlGaWx0ZXIoYXJyYXksZnVuY3Rpb24oZ3JvdXApe2lmKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSl7bGVuZ3RoPW5hdGl2ZU1heChncm91cC5sZW5ndGgsbGVuZ3RoKTtyZXR1cm4gdHJ1ZX19KTtyZXR1cm4gYmFzZVRpbWVzKGxlbmd0aCxmdW5jdGlvbihpbmRleCl7cmV0dXJuIGFycmF5TWFwKGFycmF5LApiYXNlUHJvcGVydHkoaW5kZXgpKX0pfWZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSxpdGVyYXRlZSl7aWYoIShhcnJheSYmYXJyYXkubGVuZ3RoKSlyZXR1cm5bXTt2YXIgcmVzdWx0PXVuemlwKGFycmF5KTtpZihpdGVyYXRlZT09bnVsbClyZXR1cm4gcmVzdWx0O3JldHVybiBhcnJheU1hcChyZXN1bHQsZnVuY3Rpb24oZ3JvdXApe3JldHVybiBhcHBseShpdGVyYXRlZSx1bmRlZmluZWQsZ3JvdXApfSl9dmFyIHdpdGhvdXQ9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksdmFsdWVzKXtyZXR1cm4gaXNBcnJheUxpa2VPYmplY3QoYXJyYXkpP2Jhc2VEaWZmZXJlbmNlKGFycmF5LHZhbHVlcyk6W119KTt2YXIgeG9yPWJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7cmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLGlzQXJyYXlMaWtlT2JqZWN0KSl9KTt2YXIgeG9yQnk9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgaXRlcmF0ZWU9bGFzdChhcnJheXMpO2lmKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSlpdGVyYXRlZT0KdW5kZWZpbmVkO3JldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cyxpc0FycmF5TGlrZU9iamVjdCksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMikpfSk7dmFyIHhvcldpdGg9YmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKXt2YXIgY29tcGFyYXRvcj1sYXN0KGFycmF5cyk7Y29tcGFyYXRvcj10eXBlb2YgY29tcGFyYXRvcj09ImZ1bmN0aW9uIj9jb21wYXJhdG9yOnVuZGVmaW5lZDtyZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsaXNBcnJheUxpa2VPYmplY3QpLHVuZGVmaW5lZCxjb21wYXJhdG9yKX0pO3ZhciB6aXA9YmFzZVJlc3QodW56aXApO2Z1bmN0aW9uIHppcE9iamVjdChwcm9wcyx2YWx1ZXMpe3JldHVybiBiYXNlWmlwT2JqZWN0KHByb3BzfHxbXSx2YWx1ZXN8fFtdLGFzc2lnblZhbHVlKX1mdW5jdGlvbiB6aXBPYmplY3REZWVwKHByb3BzLHZhbHVlcyl7cmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHN8fFtdLHZhbHVlc3x8W10sYmFzZVNldCl9dmFyIHppcFdpdGg9CmJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cyl7dmFyIGxlbmd0aD1hcnJheXMubGVuZ3RoLGl0ZXJhdGVlPWxlbmd0aD4xP2FycmF5c1tsZW5ndGgtMV06dW5kZWZpbmVkO2l0ZXJhdGVlPXR5cGVvZiBpdGVyYXRlZT09ImZ1bmN0aW9uIj8oYXJyYXlzLnBvcCgpLGl0ZXJhdGVlKTp1bmRlZmluZWQ7cmV0dXJuIHVuemlwV2l0aChhcnJheXMsaXRlcmF0ZWUpfSk7ZnVuY3Rpb24gY2hhaW4odmFsdWUpe3ZhciByZXN1bHQ9bG9kYXNoKHZhbHVlKTtyZXN1bHQuX19jaGFpbl9fPXRydWU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB0YXAodmFsdWUsaW50ZXJjZXB0b3Ipe2ludGVyY2VwdG9yKHZhbHVlKTtyZXR1cm4gdmFsdWV9ZnVuY3Rpb24gdGhydSh2YWx1ZSxpbnRlcmNlcHRvcil7cmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKX12YXIgd3JhcHBlckF0PWZsYXRSZXN0KGZ1bmN0aW9uKHBhdGhzKXt2YXIgbGVuZ3RoPXBhdGhzLmxlbmd0aCxzdGFydD1sZW5ndGg/cGF0aHNbMF06MCx2YWx1ZT0KdGhpcy5fX3dyYXBwZWRfXyxpbnRlcmNlcHRvcj1mdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlQXQob2JqZWN0LHBhdGhzKX07aWYobGVuZ3RoPjF8fHRoaXMuX19hY3Rpb25zX18ubGVuZ3RofHwhKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpfHwhaXNJbmRleChzdGFydCkpcmV0dXJuIHRoaXMudGhydShpbnRlcmNlcHRvcik7dmFsdWU9dmFsdWUuc2xpY2Uoc3RhcnQsK3N0YXJ0KyhsZW5ndGg/MTowKSk7dmFsdWUuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltpbnRlcmNlcHRvcl0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybihuZXcgTG9kYXNoV3JhcHBlcih2YWx1ZSx0aGlzLl9fY2hhaW5fXykpLnRocnUoZnVuY3Rpb24oYXJyYXkpe2lmKGxlbmd0aCYmIWFycmF5Lmxlbmd0aClhcnJheS5wdXNoKHVuZGVmaW5lZCk7cmV0dXJuIGFycmF5fSl9KTtmdW5jdGlvbiB3cmFwcGVyQ2hhaW4oKXtyZXR1cm4gY2hhaW4odGhpcyl9ZnVuY3Rpb24gd3JhcHBlckNvbW1pdCgpe3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcih0aGlzLnZhbHVlKCksCnRoaXMuX19jaGFpbl9fKX1mdW5jdGlvbiB3cmFwcGVyTmV4dCgpe2lmKHRoaXMuX192YWx1ZXNfXz09PXVuZGVmaW5lZCl0aGlzLl9fdmFsdWVzX189dG9BcnJheSh0aGlzLnZhbHVlKCkpO3ZhciBkb25lPXRoaXMuX19pbmRleF9fPj10aGlzLl9fdmFsdWVzX18ubGVuZ3RoLHZhbHVlPWRvbmU/dW5kZWZpbmVkOnRoaXMuX192YWx1ZXNfX1t0aGlzLl9faW5kZXhfXysrXTtyZXR1cm57ImRvbmUiOmRvbmUsInZhbHVlIjp2YWx1ZX19ZnVuY3Rpb24gd3JhcHBlclRvSXRlcmF0b3IoKXtyZXR1cm4gdGhpc31mdW5jdGlvbiB3cmFwcGVyUGxhbnQodmFsdWUpe3ZhciByZXN1bHQscGFyZW50PXRoaXM7d2hpbGUocGFyZW50IGluc3RhbmNlb2YgYmFzZUxvZGFzaCl7dmFyIGNsb25lPXdyYXBwZXJDbG9uZShwYXJlbnQpO2Nsb25lLl9faW5kZXhfXz0wO2Nsb25lLl9fdmFsdWVzX189dW5kZWZpbmVkO2lmKHJlc3VsdClwcmV2aW91cy5fX3dyYXBwZWRfXz1jbG9uZTtlbHNlIHJlc3VsdD1jbG9uZTsKdmFyIHByZXZpb3VzPWNsb25lO3BhcmVudD1wYXJlbnQuX193cmFwcGVkX199cHJldmlvdXMuX193cmFwcGVkX189dmFsdWU7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpe3ZhciB2YWx1ZT10aGlzLl9fd3JhcHBlZF9fO2lmKHZhbHVlIGluc3RhbmNlb2YgTGF6eVdyYXBwZXIpe3ZhciB3cmFwcGVkPXZhbHVlO2lmKHRoaXMuX19hY3Rpb25zX18ubGVuZ3RoKXdyYXBwZWQ9bmV3IExhenlXcmFwcGVyKHRoaXMpO3dyYXBwZWQ9d3JhcHBlZC5yZXZlcnNlKCk7d3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHsiZnVuYyI6dGhydSwiYXJncyI6W3JldmVyc2VdLCJ0aGlzQXJnIjp1bmRlZmluZWR9KTtyZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIod3JhcHBlZCx0aGlzLl9fY2hhaW5fXyl9cmV0dXJuIHRoaXMudGhydShyZXZlcnNlKX1mdW5jdGlvbiB3cmFwcGVyVmFsdWUoKXtyZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZSh0aGlzLl9fd3JhcHBlZF9fLHRoaXMuX19hY3Rpb25zX18pfQp2YXIgY291bnRCeT1jcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LGtleSkpKytyZXN1bHRba2V5XTtlbHNlIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LDEpfSk7ZnVuY3Rpb24gZXZlcnkoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFdmVyeTpiYXNlRXZlcnk7aWYoZ3VhcmQmJmlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24scHJlZGljYXRlLGd1YXJkKSlwcmVkaWNhdGU9dW5kZWZpbmVkO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUocHJlZGljYXRlLDMpKX1mdW5jdGlvbiBmaWx0ZXIoY29sbGVjdGlvbixwcmVkaWNhdGUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlGaWx0ZXI6YmFzZUZpbHRlcjtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSl9dmFyIGZpbmQ9CmNyZWF0ZUZpbmQoZmluZEluZGV4KTt2YXIgZmluZExhc3Q9Y3JlYXRlRmluZChmaW5kTGFzdEluZGV4KTtmdW5jdGlvbiBmbGF0TWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3JldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbixpdGVyYXRlZSksMSl9ZnVuY3Rpb24gZmxhdE1hcERlZXAoY29sbGVjdGlvbixpdGVyYXRlZSl7cmV0dXJuIGJhc2VGbGF0dGVuKG1hcChjb2xsZWN0aW9uLGl0ZXJhdGVlKSxJTkZJTklUWSl9ZnVuY3Rpb24gZmxhdE1hcERlcHRoKGNvbGxlY3Rpb24saXRlcmF0ZWUsZGVwdGgpe2RlcHRoPWRlcHRoPT09dW5kZWZpbmVkPzE6dG9JbnRlZ2VyKGRlcHRoKTtyZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpLGRlcHRoKX1mdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlFYWNoOmJhc2VFYWNoO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjMpKX1mdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbixpdGVyYXRlZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUVhY2hSaWdodDpiYXNlRWFjaFJpZ2h0O3JldHVybiBmdW5jKGNvbGxlY3Rpb24sZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMykpfXZhciBncm91cEJ5PWNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LHZhbHVlLGtleSl7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsa2V5KSlyZXN1bHRba2V5XS5wdXNoKHZhbHVlKTtlbHNlIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LFt2YWx1ZV0pfSk7ZnVuY3Rpb24gaW5jbHVkZXMoY29sbGVjdGlvbix2YWx1ZSxmcm9tSW5kZXgsZ3VhcmQpe2NvbGxlY3Rpb249aXNBcnJheUxpa2UoY29sbGVjdGlvbik/Y29sbGVjdGlvbjp2YWx1ZXMoY29sbGVjdGlvbik7ZnJvbUluZGV4PWZyb21JbmRleCYmIWd1YXJkP3RvSW50ZWdlcihmcm9tSW5kZXgpOjA7dmFyIGxlbmd0aD1jb2xsZWN0aW9uLmxlbmd0aDsKaWYoZnJvbUluZGV4PDApZnJvbUluZGV4PW5hdGl2ZU1heChsZW5ndGgrZnJvbUluZGV4LDApO3JldHVybiBpc1N0cmluZyhjb2xsZWN0aW9uKT9mcm9tSW5kZXg8PWxlbmd0aCYmY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLGZyb21JbmRleCk+LTE6ISFsZW5ndGgmJmJhc2VJbmRleE9mKGNvbGxlY3Rpb24sdmFsdWUsZnJvbUluZGV4KT4tMX12YXIgaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKGNvbGxlY3Rpb24scGF0aCxhcmdzKXt2YXIgaW5kZXg9LTEsaXNGdW5jPXR5cGVvZiBwYXRoPT0iZnVuY3Rpb24iLHJlc3VsdD1pc0FycmF5TGlrZShjb2xsZWN0aW9uKT9BcnJheShjb2xsZWN0aW9uLmxlbmd0aCk6W107YmFzZUVhY2goY29sbGVjdGlvbixmdW5jdGlvbih2YWx1ZSl7cmVzdWx0WysraW5kZXhdPWlzRnVuYz9hcHBseShwYXRoLHZhbHVlLGFyZ3MpOmJhc2VJbnZva2UodmFsdWUscGF0aCxhcmdzKX0pO3JldHVybiByZXN1bHR9KTt2YXIga2V5Qnk9Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsCnZhbHVlLGtleSl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxrZXksdmFsdWUpfSk7ZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24saXRlcmF0ZWUpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlNYXA6YmFzZU1hcDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBvcmRlckJ5KGNvbGxlY3Rpb24saXRlcmF0ZWVzLG9yZGVycyxndWFyZCl7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm5bXTtpZighaXNBcnJheShpdGVyYXRlZXMpKWl0ZXJhdGVlcz1pdGVyYXRlZXM9PW51bGw/W106W2l0ZXJhdGVlc107b3JkZXJzPWd1YXJkP3VuZGVmaW5lZDpvcmRlcnM7aWYoIWlzQXJyYXkob3JkZXJzKSlvcmRlcnM9b3JkZXJzPT1udWxsP1tdOltvcmRlcnNdO3JldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGl0ZXJhdGVlcyxvcmRlcnMpfXZhciBwYXJ0aXRpb249Y3JlYXRlQWdncmVnYXRvcihmdW5jdGlvbihyZXN1bHQsdmFsdWUsCmtleSl7cmVzdWx0W2tleT8wOjFdLnB1c2godmFsdWUpfSxmdW5jdGlvbigpe3JldHVybltbXSxbXV19KTtmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbixpdGVyYXRlZSxhY2N1bXVsYXRvcil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVJlZHVjZTpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2gpfWZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNvbGxlY3Rpb24saXRlcmF0ZWUsYWNjdW11bGF0b3Ipe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlSZWR1Y2VSaWdodDpiYXNlUmVkdWNlLGluaXRBY2N1bT1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbixnZXRJdGVyYXRlZShpdGVyYXRlZSw0KSxhY2N1bXVsYXRvcixpbml0QWNjdW0sYmFzZUVhY2hSaWdodCl9ZnVuY3Rpb24gcmVqZWN0KGNvbGxlY3Rpb24sCnByZWRpY2F0ZSl7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheUZpbHRlcjpiYXNlRmlsdGVyO3JldHVybiBmdW5jKGNvbGxlY3Rpb24sbmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSkpfWZ1bmN0aW9uIHNhbXBsZShjb2xsZWN0aW9uKXt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2FtcGxlOmJhc2VTYW1wbGU7cmV0dXJuIGZ1bmMoY29sbGVjdGlvbil9ZnVuY3Rpb24gc2FtcGxlU2l6ZShjb2xsZWN0aW9uLG4sZ3VhcmQpe2lmKGd1YXJkP2lzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sbixndWFyZCk6bj09PXVuZGVmaW5lZCluPTE7ZWxzZSBuPXRvSW50ZWdlcihuKTt2YXIgZnVuYz1pc0FycmF5KGNvbGxlY3Rpb24pP2FycmF5U2FtcGxlU2l6ZTpiYXNlU2FtcGxlU2l6ZTtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLG4pfWZ1bmN0aW9uIHNodWZmbGUoY29sbGVjdGlvbil7dmFyIGZ1bmM9aXNBcnJheShjb2xsZWN0aW9uKT9hcnJheVNodWZmbGU6CmJhc2VTaHVmZmxlO3JldHVybiBmdW5jKGNvbGxlY3Rpb24pfWZ1bmN0aW9uIHNpemUoY29sbGVjdGlvbil7aWYoY29sbGVjdGlvbj09bnVsbClyZXR1cm4gMDtpZihpc0FycmF5TGlrZShjb2xsZWN0aW9uKSlyZXR1cm4gaXNTdHJpbmcoY29sbGVjdGlvbik/c3RyaW5nU2l6ZShjb2xsZWN0aW9uKTpjb2xsZWN0aW9uLmxlbmd0aDt2YXIgdGFnPWdldFRhZyhjb2xsZWN0aW9uKTtpZih0YWc9PW1hcFRhZ3x8dGFnPT1zZXRUYWcpcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTtyZXR1cm4gYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RofWZ1bmN0aW9uIHNvbWUoY29sbGVjdGlvbixwcmVkaWNhdGUsZ3VhcmQpe3ZhciBmdW5jPWlzQXJyYXkoY29sbGVjdGlvbik/YXJyYXlTb21lOmJhc2VTb21lO2lmKGd1YXJkJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLHByZWRpY2F0ZSxndWFyZCkpcHJlZGljYXRlPXVuZGVmaW5lZDtyZXR1cm4gZnVuYyhjb2xsZWN0aW9uLGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwKMykpfXZhciBzb3J0Qnk9YmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbixpdGVyYXRlZXMpe2lmKGNvbGxlY3Rpb249PW51bGwpcmV0dXJuW107dmFyIGxlbmd0aD1pdGVyYXRlZXMubGVuZ3RoO2lmKGxlbmd0aD4xJiZpc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLGl0ZXJhdGVlc1swXSxpdGVyYXRlZXNbMV0pKWl0ZXJhdGVlcz1bXTtlbHNlIGlmKGxlbmd0aD4yJiZpc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0saXRlcmF0ZWVzWzFdLGl0ZXJhdGVlc1syXSkpaXRlcmF0ZWVzPVtpdGVyYXRlZXNbMF1dO3JldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywxKSxbXSl9KTt2YXIgbm93PWN0eE5vd3x8ZnVuY3Rpb24oKXtyZXR1cm4gcm9vdC5EYXRlLm5vdygpfTtmdW5jdGlvbiBhZnRlcihuLGZ1bmMpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtuPXRvSW50ZWdlcihuKTsKcmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPDEpcmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBhcnkoZnVuYyxuLGd1YXJkKXtuPWd1YXJkP3VuZGVmaW5lZDpuO249ZnVuYyYmbj09bnVsbD9mdW5jLmxlbmd0aDpuO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9BUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsbil9ZnVuY3Rpb24gYmVmb3JlKG4sZnVuYyl7dmFyIHJlc3VsdDtpZih0eXBlb2YgZnVuYyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7bj10b0ludGVnZXIobik7cmV0dXJuIGZ1bmN0aW9uKCl7aWYoLS1uPjApcmVzdWx0PWZ1bmMuYXBwbHkodGhpcyxhcmd1bWVudHMpO2lmKG48PTEpZnVuYz11bmRlZmluZWQ7cmV0dXJuIHJlc3VsdH19dmFyIGJpbmQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyx0aGlzQXJnLHBhcnRpYWxzKXt2YXIgYml0bWFzaz1XUkFQX0JJTkRfRkxBRzsKaWYocGFydGlhbHMubGVuZ3RoKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIoYmluZCkpO2JpdG1hc2t8PVdSQVBfUEFSVElBTF9GTEFHfXJldHVybiBjcmVhdGVXcmFwKGZ1bmMsYml0bWFzayx0aGlzQXJnLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIGJpbmRLZXk9YmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LGtleSxwYXJ0aWFscyl7dmFyIGJpdG1hc2s9V1JBUF9CSU5EX0ZMQUd8V1JBUF9CSU5EX0tFWV9GTEFHO2lmKHBhcnRpYWxzLmxlbmd0aCl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKGJpbmRLZXkpKTtiaXRtYXNrfD1XUkFQX1BBUlRJQUxfRkxBR31yZXR1cm4gY3JlYXRlV3JhcChrZXksYml0bWFzayxvYmplY3QscGFydGlhbHMsaG9sZGVycyl9KTtmdW5jdGlvbiBjdXJyeShmdW5jLGFyaXR5LGd1YXJkKXthcml0eT1ndWFyZD91bmRlZmluZWQ6YXJpdHk7dmFyIHJlc3VsdD1jcmVhdGVXcmFwKGZ1bmMsCldSQVBfQ1VSUllfRkxBRyx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLGFyaXR5KTtyZXN1bHQucGxhY2Vob2xkZXI9Y3VycnkucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBjdXJyeVJpZ2h0KGZ1bmMsYXJpdHksZ3VhcmQpe2FyaXR5PWd1YXJkP3VuZGVmaW5lZDphcml0eTt2YXIgcmVzdWx0PWNyZWF0ZVdyYXAoZnVuYyxXUkFQX0NVUlJZX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsdW5kZWZpbmVkLHVuZGVmaW5lZCxhcml0eSk7cmVzdWx0LnBsYWNlaG9sZGVyPWN1cnJ5UmlnaHQucGxhY2Vob2xkZXI7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBkZWJvdW5jZShmdW5jLHdhaXQsb3B0aW9ucyl7dmFyIGxhc3RBcmdzLGxhc3RUaGlzLG1heFdhaXQscmVzdWx0LHRpbWVySWQsbGFzdENhbGxUaW1lLGxhc3RJbnZva2VUaW1lPTAsbGVhZGluZz1mYWxzZSxtYXhpbmc9ZmFsc2UsdHJhaWxpbmc9dHJ1ZTsKaWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3dhaXQ9dG9OdW1iZXIod2FpdCl8fDA7aWYoaXNPYmplY3Qob3B0aW9ucykpe2xlYWRpbmc9ISFvcHRpb25zLmxlYWRpbmc7bWF4aW5nPSJtYXhXYWl0ImluIG9wdGlvbnM7bWF4V2FpdD1tYXhpbmc/bmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCl8fDAsd2FpdCk6bWF4V2FpdDt0cmFpbGluZz0idHJhaWxpbmciaW4gb3B0aW9ucz8hIW9wdGlvbnMudHJhaWxpbmc6dHJhaWxpbmd9ZnVuY3Rpb24gaW52b2tlRnVuYyh0aW1lKXt2YXIgYXJncz1sYXN0QXJncyx0aGlzQXJnPWxhc3RUaGlzO2xhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtsYXN0SW52b2tlVGltZT10aW1lO3Jlc3VsdD1mdW5jLmFwcGx5KHRoaXNBcmcsYXJncyk7cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBsZWFkaW5nRWRnZSh0aW1lKXtsYXN0SW52b2tlVGltZT10aW1lO3RpbWVySWQ9c2V0VGltZW91dCh0aW1lckV4cGlyZWQsCndhaXQpO3JldHVybiBsZWFkaW5nP2ludm9rZUZ1bmModGltZSk6cmVzdWx0fWZ1bmN0aW9uIHJlbWFpbmluZ1dhaXQodGltZSl7dmFyIHRpbWVTaW5jZUxhc3RDYWxsPXRpbWUtbGFzdENhbGxUaW1lLHRpbWVTaW5jZUxhc3RJbnZva2U9dGltZS1sYXN0SW52b2tlVGltZSx0aW1lV2FpdGluZz13YWl0LXRpbWVTaW5jZUxhc3RDYWxsO3JldHVybiBtYXhpbmc/bmF0aXZlTWluKHRpbWVXYWl0aW5nLG1heFdhaXQtdGltZVNpbmNlTGFzdEludm9rZSk6dGltZVdhaXRpbmd9ZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpe3ZhciB0aW1lU2luY2VMYXN0Q2FsbD10aW1lLWxhc3RDYWxsVGltZSx0aW1lU2luY2VMYXN0SW52b2tlPXRpbWUtbGFzdEludm9rZVRpbWU7cmV0dXJuIGxhc3RDYWxsVGltZT09PXVuZGVmaW5lZHx8dGltZVNpbmNlTGFzdENhbGw+PXdhaXR8fHRpbWVTaW5jZUxhc3RDYWxsPDB8fG1heGluZyYmdGltZVNpbmNlTGFzdEludm9rZT49bWF4V2FpdH1mdW5jdGlvbiB0aW1lckV4cGlyZWQoKXt2YXIgdGltZT0Kbm93KCk7aWYoc2hvdWxkSW52b2tlKHRpbWUpKXJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7dGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCxyZW1haW5pbmdXYWl0KHRpbWUpKX1mdW5jdGlvbiB0cmFpbGluZ0VkZ2UodGltZSl7dGltZXJJZD11bmRlZmluZWQ7aWYodHJhaWxpbmcmJmxhc3RBcmdzKXJldHVybiBpbnZva2VGdW5jKHRpbWUpO2xhc3RBcmdzPWxhc3RUaGlzPXVuZGVmaW5lZDtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIGNhbmNlbCgpe2lmKHRpbWVySWQhPT11bmRlZmluZWQpY2xlYXJUaW1lb3V0KHRpbWVySWQpO2xhc3RJbnZva2VUaW1lPTA7bGFzdEFyZ3M9bGFzdENhbGxUaW1lPWxhc3RUaGlzPXRpbWVySWQ9dW5kZWZpbmVkfWZ1bmN0aW9uIGZsdXNoKCl7cmV0dXJuIHRpbWVySWQ9PT11bmRlZmluZWQ/cmVzdWx0OnRyYWlsaW5nRWRnZShub3coKSl9ZnVuY3Rpb24gZGVib3VuY2VkKCl7dmFyIHRpbWU9bm93KCksaXNJbnZva2luZz1zaG91bGRJbnZva2UodGltZSk7Cmxhc3RBcmdzPWFyZ3VtZW50cztsYXN0VGhpcz10aGlzO2xhc3RDYWxsVGltZT10aW1lO2lmKGlzSW52b2tpbmcpe2lmKHRpbWVySWQ9PT11bmRlZmluZWQpcmV0dXJuIGxlYWRpbmdFZGdlKGxhc3RDYWxsVGltZSk7aWYobWF4aW5nKXt0aW1lcklkPXNldFRpbWVvdXQodGltZXJFeHBpcmVkLHdhaXQpO3JldHVybiBpbnZva2VGdW5jKGxhc3RDYWxsVGltZSl9fWlmKHRpbWVySWQ9PT11bmRlZmluZWQpdGltZXJJZD1zZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCx3YWl0KTtyZXR1cm4gcmVzdWx0fWRlYm91bmNlZC5jYW5jZWw9Y2FuY2VsO2RlYm91bmNlZC5mbHVzaD1mbHVzaDtyZXR1cm4gZGVib3VuY2VkfXZhciBkZWZlcj1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3JldHVybiBiYXNlRGVsYXkoZnVuYywxLGFyZ3MpfSk7dmFyIGRlbGF5PWJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsd2FpdCxhcmdzKXtyZXR1cm4gYmFzZURlbGF5KGZ1bmMsdG9OdW1iZXIod2FpdCl8fDAsYXJncyl9KTsKZnVuY3Rpb24gZmxpcChmdW5jKXtyZXR1cm4gY3JlYXRlV3JhcChmdW5jLFdSQVBfRkxJUF9GTEFHKX1mdW5jdGlvbiBtZW1vaXplKGZ1bmMscmVzb2x2ZXIpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24ifHxyZXNvbHZlciE9bnVsbCYmdHlwZW9mIHJlc29sdmVyIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTt2YXIgbWVtb2l6ZWQ9ZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHMsa2V5PXJlc29sdmVyP3Jlc29sdmVyLmFwcGx5KHRoaXMsYXJncyk6YXJnc1swXSxjYWNoZT1tZW1vaXplZC5jYWNoZTtpZihjYWNoZS5oYXMoa2V5KSlyZXR1cm4gY2FjaGUuZ2V0KGtleSk7dmFyIHJlc3VsdD1mdW5jLmFwcGx5KHRoaXMsYXJncyk7bWVtb2l6ZWQuY2FjaGU9Y2FjaGUuc2V0KGtleSxyZXN1bHQpfHxjYWNoZTtyZXR1cm4gcmVzdWx0fTttZW1vaXplZC5jYWNoZT1uZXcgKG1lbW9pemUuQ2FjaGV8fE1hcENhY2hlKTtyZXR1cm4gbWVtb2l6ZWR9Cm1lbW9pemUuQ2FjaGU9TWFwQ2FjaGU7ZnVuY3Rpb24gbmVnYXRlKHByZWRpY2F0ZSl7aWYodHlwZW9mIHByZWRpY2F0ZSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGFyZ3M9YXJndW1lbnRzO3N3aXRjaChhcmdzLmxlbmd0aCl7Y2FzZSAwOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzKTtjYXNlIDE6cmV0dXJuIXByZWRpY2F0ZS5jYWxsKHRoaXMsYXJnc1swXSk7Y2FzZSAyOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0sYXJnc1sxXSk7Y2FzZSAzOnJldHVybiFwcmVkaWNhdGUuY2FsbCh0aGlzLGFyZ3NbMF0sYXJnc1sxXSxhcmdzWzJdKX1yZXR1cm4hcHJlZGljYXRlLmFwcGx5KHRoaXMsYXJncyl9fWZ1bmN0aW9uIG9uY2UoZnVuYyl7cmV0dXJuIGJlZm9yZSgyLGZ1bmMpfXZhciBvdmVyQXJncz1jYXN0UmVzdChmdW5jdGlvbihmdW5jLHRyYW5zZm9ybXMpe3RyYW5zZm9ybXM9dHJhbnNmb3Jtcy5sZW5ndGg9PQoxJiZpc0FycmF5KHRyYW5zZm9ybXNbMF0pP2FycmF5TWFwKHRyYW5zZm9ybXNbMF0sYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTphcnJheU1hcChiYXNlRmxhdHRlbih0cmFuc2Zvcm1zLDEpLGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7dmFyIGZ1bmNzTGVuZ3RoPXRyYW5zZm9ybXMubGVuZ3RoO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTEsbGVuZ3RoPW5hdGl2ZU1pbihhcmdzLmxlbmd0aCxmdW5jc0xlbmd0aCk7d2hpbGUoKytpbmRleDxsZW5ndGgpYXJnc1tpbmRleF09dHJhbnNmb3Jtc1tpbmRleF0uY2FsbCh0aGlzLGFyZ3NbaW5kZXhdKTtyZXR1cm4gYXBwbHkoZnVuYyx0aGlzLGFyZ3MpfSl9KTt2YXIgcGFydGlhbD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLHBhcnRpYWxzKXt2YXIgaG9sZGVycz1yZXBsYWNlSG9sZGVycyhwYXJ0aWFscyxnZXRIb2xkZXIocGFydGlhbCkpO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9QQVJUSUFMX0ZMQUcsCnVuZGVmaW5lZCxwYXJ0aWFscyxob2xkZXJzKX0pO3ZhciBwYXJ0aWFsUmlnaHQ9YmFzZVJlc3QoZnVuY3Rpb24oZnVuYyxwYXJ0aWFscyl7dmFyIGhvbGRlcnM9cmVwbGFjZUhvbGRlcnMocGFydGlhbHMsZ2V0SG9sZGVyKHBhcnRpYWxSaWdodCkpO3JldHVybiBjcmVhdGVXcmFwKGZ1bmMsV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcsdW5kZWZpbmVkLHBhcnRpYWxzLGhvbGRlcnMpfSk7dmFyIHJlYXJnPWZsYXRSZXN0KGZ1bmN0aW9uKGZ1bmMsaW5kZXhlcyl7cmV0dXJuIGNyZWF0ZVdyYXAoZnVuYyxXUkFQX1JFQVJHX0ZMQUcsdW5kZWZpbmVkLHVuZGVmaW5lZCx1bmRlZmluZWQsaW5kZXhlcyl9KTtmdW5jdGlvbiByZXN0KGZ1bmMsc3RhcnQpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtzdGFydD1zdGFydD09PXVuZGVmaW5lZD9zdGFydDp0b0ludGVnZXIoc3RhcnQpO3JldHVybiBiYXNlUmVzdChmdW5jLHN0YXJ0KX0KZnVuY3Rpb24gc3ByZWFkKGZ1bmMsc3RhcnQpe2lmKHR5cGVvZiBmdW5jIT0iZnVuY3Rpb24iKXRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTtzdGFydD1zdGFydD09bnVsbD8wOm5hdGl2ZU1heCh0b0ludGVnZXIoc3RhcnQpLDApO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgYXJyYXk9YXJnc1tzdGFydF0sb3RoZXJBcmdzPWNhc3RTbGljZShhcmdzLDAsc3RhcnQpO2lmKGFycmF5KWFycmF5UHVzaChvdGhlckFyZ3MsYXJyYXkpO3JldHVybiBhcHBseShmdW5jLHRoaXMsb3RoZXJBcmdzKX0pfWZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsd2FpdCxvcHRpb25zKXt2YXIgbGVhZGluZz10cnVlLHRyYWlsaW5nPXRydWU7aWYodHlwZW9mIGZ1bmMhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO2lmKGlzT2JqZWN0KG9wdGlvbnMpKXtsZWFkaW5nPSJsZWFkaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLmxlYWRpbmc6CmxlYWRpbmc7dHJhaWxpbmc9InRyYWlsaW5nImluIG9wdGlvbnM/ISFvcHRpb25zLnRyYWlsaW5nOnRyYWlsaW5nfXJldHVybiBkZWJvdW5jZShmdW5jLHdhaXQseyJsZWFkaW5nIjpsZWFkaW5nLCJtYXhXYWl0Ijp3YWl0LCJ0cmFpbGluZyI6dHJhaWxpbmd9KX1mdW5jdGlvbiB1bmFyeShmdW5jKXtyZXR1cm4gYXJ5KGZ1bmMsMSl9ZnVuY3Rpb24gd3JhcCh2YWx1ZSx3cmFwcGVyKXtyZXR1cm4gcGFydGlhbChjYXN0RnVuY3Rpb24od3JhcHBlciksdmFsdWUpfWZ1bmN0aW9uIGNhc3RBcnJheSgpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybltdO3ZhciB2YWx1ZT1hcmd1bWVudHNbMF07cmV0dXJuIGlzQXJyYXkodmFsdWUpP3ZhbHVlOlt2YWx1ZV19ZnVuY3Rpb24gY2xvbmUodmFsdWUpe3JldHVybiBiYXNlQ2xvbmUodmFsdWUsQ0xPTkVfU1lNQk9MU19GTEFHKX1mdW5jdGlvbiBjbG9uZVdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09CiJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VDbG9uZSh2YWx1ZSxDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcil9ZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKXtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcpfWZ1bmN0aW9uIGNsb25lRGVlcFdpdGgodmFsdWUsY3VzdG9taXplcil7Y3VzdG9taXplcj10eXBlb2YgY3VzdG9taXplcj09ImZ1bmN0aW9uIj9jdXN0b21pemVyOnVuZGVmaW5lZDtyZXR1cm4gYmFzZUNsb25lKHZhbHVlLENMT05FX0RFRVBfRkxBR3xDTE9ORV9TWU1CT0xTX0ZMQUcsY3VzdG9taXplcil9ZnVuY3Rpb24gY29uZm9ybXNUbyhvYmplY3Qsc291cmNlKXtyZXR1cm4gc291cmNlPT1udWxsfHxiYXNlQ29uZm9ybXNUbyhvYmplY3Qsc291cmNlLGtleXMoc291cmNlKSl9ZnVuY3Rpb24gZXEodmFsdWUsb3RoZXIpe3JldHVybiB2YWx1ZT09PW90aGVyfHx2YWx1ZSE9PXZhbHVlJiYKb3RoZXIhPT1vdGhlcn12YXIgZ3Q9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlR3QpO3ZhciBndGU9Y3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSxvdGhlcil7cmV0dXJuIHZhbHVlPj1vdGhlcn0pO3ZhciBpc0FyZ3VtZW50cz1iYXNlSXNBcmd1bWVudHMoZnVuY3Rpb24oKXtyZXR1cm4gYXJndW1lbnRzfSgpKT9iYXNlSXNBcmd1bWVudHM6ZnVuY3Rpb24odmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCJjYWxsZWUiKSYmIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsImNhbGxlZSIpfTt2YXIgaXNBcnJheT1BcnJheS5pc0FycmF5O3ZhciBpc0FycmF5QnVmZmVyPW5vZGVJc0FycmF5QnVmZmVyP2Jhc2VVbmFyeShub2RlSXNBcnJheUJ1ZmZlcik6YmFzZUlzQXJyYXlCdWZmZXI7ZnVuY3Rpb24gaXNBcnJheUxpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmaXNMZW5ndGgodmFsdWUubGVuZ3RoKSYmCiFpc0Z1bmN0aW9uKHZhbHVlKX1mdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmlzQXJyYXlMaWtlKHZhbHVlKX1mdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpe3JldHVybiB2YWx1ZT09PXRydWV8fHZhbHVlPT09ZmFsc2V8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1ib29sVGFnfXZhciBpc0J1ZmZlcj1uYXRpdmVJc0J1ZmZlcnx8c3R1YkZhbHNlO3ZhciBpc0RhdGU9bm9kZUlzRGF0ZT9iYXNlVW5hcnkobm9kZUlzRGF0ZSk6YmFzZUlzRGF0ZTtmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpe3JldHVybiBpc09iamVjdExpa2UodmFsdWUpJiZ2YWx1ZS5ub2RlVHlwZT09PTEmJiFpc1BsYWluT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBpc0VtcHR5KHZhbHVlKXtpZih2YWx1ZT09bnVsbClyZXR1cm4gdHJ1ZTtpZihpc0FycmF5TGlrZSh2YWx1ZSkmJihpc0FycmF5KHZhbHVlKXx8dHlwZW9mIHZhbHVlPT0KInN0cmluZyJ8fHR5cGVvZiB2YWx1ZS5zcGxpY2U9PSJmdW5jdGlvbiJ8fGlzQnVmZmVyKHZhbHVlKXx8aXNUeXBlZEFycmF5KHZhbHVlKXx8aXNBcmd1bWVudHModmFsdWUpKSlyZXR1cm4hdmFsdWUubGVuZ3RoO3ZhciB0YWc9Z2V0VGFnKHZhbHVlKTtpZih0YWc9PW1hcFRhZ3x8dGFnPT1zZXRUYWcpcmV0dXJuIXZhbHVlLnNpemU7aWYoaXNQcm90b3R5cGUodmFsdWUpKXJldHVybiFiYXNlS2V5cyh2YWx1ZSkubGVuZ3RoO2Zvcih2YXIga2V5IGluIHZhbHVlKWlmKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsa2V5KSlyZXR1cm4gZmFsc2U7cmV0dXJuIHRydWV9ZnVuY3Rpb24gaXNFcXVhbCh2YWx1ZSxvdGhlcil7cmV0dXJuIGJhc2VJc0VxdWFsKHZhbHVlLG90aGVyKX1mdW5jdGlvbiBpc0VxdWFsV2l0aCh2YWx1ZSxvdGhlcixjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3ZhciByZXN1bHQ9CmN1c3RvbWl6ZXI/Y3VzdG9taXplcih2YWx1ZSxvdGhlcik6dW5kZWZpbmVkO3JldHVybiByZXN1bHQ9PT11bmRlZmluZWQ/YmFzZUlzRXF1YWwodmFsdWUsb3RoZXIsdW5kZWZpbmVkLGN1c3RvbWl6ZXIpOiEhcmVzdWx0fWZ1bmN0aW9uIGlzRXJyb3IodmFsdWUpe2lmKCFpc09iamVjdExpa2UodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PWVycm9yVGFnfHx0YWc9PWRvbUV4Y1RhZ3x8dHlwZW9mIHZhbHVlLm1lc3NhZ2U9PSJzdHJpbmciJiZ0eXBlb2YgdmFsdWUubmFtZT09InN0cmluZyImJiFpc1BsYWluT2JqZWN0KHZhbHVlKX1mdW5jdGlvbiBpc0Zpbml0ZSh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJm5hdGl2ZUlzRmluaXRlKHZhbHVlKX1mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbHVlKXtpZighaXNPYmplY3QodmFsdWUpKXJldHVybiBmYWxzZTt2YXIgdGFnPWJhc2VHZXRUYWcodmFsdWUpO3JldHVybiB0YWc9PQpmdW5jVGFnfHx0YWc9PWdlblRhZ3x8dGFnPT1hc3luY1RhZ3x8dGFnPT1wcm94eVRhZ31mdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJudW1iZXIiJiZ2YWx1ZT09dG9JbnRlZ2VyKHZhbHVlKX1mdW5jdGlvbiBpc0xlbmd0aCh2YWx1ZSl7cmV0dXJuIHR5cGVvZiB2YWx1ZT09Im51bWJlciImJnZhbHVlPi0xJiZ2YWx1ZSUxPT0wJiZ2YWx1ZTw9TUFYX1NBRkVfSU5URUdFUn1mdW5jdGlvbiBpc09iamVjdCh2YWx1ZSl7dmFyIHR5cGU9dHlwZW9mIHZhbHVlO3JldHVybiB2YWx1ZSE9bnVsbCYmKHR5cGU9PSJvYmplY3QifHx0eXBlPT0iZnVuY3Rpb24iKX1mdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpe3JldHVybiB2YWx1ZSE9bnVsbCYmdHlwZW9mIHZhbHVlPT0ib2JqZWN0In12YXIgaXNNYXA9bm9kZUlzTWFwP2Jhc2VVbmFyeShub2RlSXNNYXApOmJhc2VJc01hcDtmdW5jdGlvbiBpc01hdGNoKG9iamVjdCxzb3VyY2Upe3JldHVybiBvYmplY3Q9PT0Kc291cmNlfHxiYXNlSXNNYXRjaChvYmplY3Qsc291cmNlLGdldE1hdGNoRGF0YShzb3VyY2UpKX1mdW5jdGlvbiBpc01hdGNoV2l0aChvYmplY3Qsc291cmNlLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIGJhc2VJc01hdGNoKG9iamVjdCxzb3VyY2UsZ2V0TWF0Y2hEYXRhKHNvdXJjZSksY3VzdG9taXplcil9ZnVuY3Rpb24gaXNOYU4odmFsdWUpe3JldHVybiBpc051bWJlcih2YWx1ZSkmJnZhbHVlIT0rdmFsdWV9ZnVuY3Rpb24gaXNOYXRpdmUodmFsdWUpe2lmKGlzTWFza2FibGUodmFsdWUpKXRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpO3JldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpfWZ1bmN0aW9uIGlzTnVsbCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09bnVsbH1mdW5jdGlvbiBpc05pbCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsfWZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKXtyZXR1cm4gdHlwZW9mIHZhbHVlPT0KIm51bWJlciJ8fGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1udW1iZXJUYWd9ZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSl7aWYoIWlzT2JqZWN0TGlrZSh2YWx1ZSl8fGJhc2VHZXRUYWcodmFsdWUpIT1vYmplY3RUYWcpcmV0dXJuIGZhbHNlO3ZhciBwcm90bz1nZXRQcm90b3R5cGUodmFsdWUpO2lmKHByb3RvPT09bnVsbClyZXR1cm4gdHJ1ZTt2YXIgQ3Rvcj1oYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCJjb25zdHJ1Y3RvciIpJiZwcm90by5jb25zdHJ1Y3RvcjtyZXR1cm4gdHlwZW9mIEN0b3I9PSJmdW5jdGlvbiImJkN0b3IgaW5zdGFuY2VvZiBDdG9yJiZmdW5jVG9TdHJpbmcuY2FsbChDdG9yKT09b2JqZWN0Q3RvclN0cmluZ312YXIgaXNSZWdFeHA9bm9kZUlzUmVnRXhwP2Jhc2VVbmFyeShub2RlSXNSZWdFeHApOmJhc2VJc1JlZ0V4cDtmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKXtyZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSYmdmFsdWU+PQotTUFYX1NBRkVfSU5URUdFUiYmdmFsdWU8PU1BWF9TQUZFX0lOVEVHRVJ9dmFyIGlzU2V0PW5vZGVJc1NldD9iYXNlVW5hcnkobm9kZUlzU2V0KTpiYXNlSXNTZXQ7ZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJzdHJpbmcifHwhaXNBcnJheSh2YWx1ZSkmJmlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT1zdHJpbmdUYWd9ZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpe3JldHVybiB0eXBlb2YgdmFsdWU9PSJzeW1ib2wifHxpc09iamVjdExpa2UodmFsdWUpJiZiYXNlR2V0VGFnKHZhbHVlKT09c3ltYm9sVGFnfXZhciBpc1R5cGVkQXJyYXk9bm9kZUlzVHlwZWRBcnJheT9iYXNlVW5hcnkobm9kZUlzVHlwZWRBcnJheSk6YmFzZUlzVHlwZWRBcnJheTtmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSl7cmV0dXJuIHZhbHVlPT09dW5kZWZpbmVkfWZ1bmN0aW9uIGlzV2Vha01hcCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJgpnZXRUYWcodmFsdWUpPT13ZWFrTWFwVGFnfWZ1bmN0aW9uIGlzV2Vha1NldCh2YWx1ZSl7cmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkmJmJhc2VHZXRUYWcodmFsdWUpPT13ZWFrU2V0VGFnfXZhciBsdD1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGJhc2VMdCk7dmFyIGx0ZT1jcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLG90aGVyKXtyZXR1cm4gdmFsdWU8PW90aGVyfSk7ZnVuY3Rpb24gdG9BcnJheSh2YWx1ZSl7aWYoIXZhbHVlKXJldHVybltdO2lmKGlzQXJyYXlMaWtlKHZhbHVlKSlyZXR1cm4gaXNTdHJpbmcodmFsdWUpP3N0cmluZ1RvQXJyYXkodmFsdWUpOmNvcHlBcnJheSh2YWx1ZSk7aWYoc3ltSXRlcmF0b3ImJnZhbHVlW3N5bUl0ZXJhdG9yXSlyZXR1cm4gaXRlcmF0b3JUb0FycmF5KHZhbHVlW3N5bUl0ZXJhdG9yXSgpKTt2YXIgdGFnPWdldFRhZyh2YWx1ZSksZnVuYz10YWc9PW1hcFRhZz9tYXBUb0FycmF5OnRhZz09c2V0VGFnP3NldFRvQXJyYXk6CnZhbHVlcztyZXR1cm4gZnVuYyh2YWx1ZSl9ZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpe2lmKCF2YWx1ZSlyZXR1cm4gdmFsdWU9PT0wP3ZhbHVlOjA7dmFsdWU9dG9OdW1iZXIodmFsdWUpO2lmKHZhbHVlPT09SU5GSU5JVFl8fHZhbHVlPT09LUlORklOSVRZKXt2YXIgc2lnbj12YWx1ZTwwPy0xOjE7cmV0dXJuIHNpZ24qTUFYX0lOVEVHRVJ9cmV0dXJuIHZhbHVlPT09dmFsdWU/dmFsdWU6MH1mdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpe3ZhciByZXN1bHQ9dG9GaW5pdGUodmFsdWUpLHJlbWFpbmRlcj1yZXN1bHQlMTtyZXR1cm4gcmVzdWx0PT09cmVzdWx0P3JlbWFpbmRlcj9yZXN1bHQtcmVtYWluZGVyOnJlc3VsdDowfWZ1bmN0aW9uIHRvTGVuZ3RoKHZhbHVlKXtyZXR1cm4gdmFsdWU/YmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksMCxNQVhfQVJSQVlfTEVOR1RIKTowfWZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKXtpZih0eXBlb2YgdmFsdWU9PSJudW1iZXIiKXJldHVybiB2YWx1ZTsKaWYoaXNTeW1ib2wodmFsdWUpKXJldHVybiBOQU47aWYoaXNPYmplY3QodmFsdWUpKXt2YXIgb3RoZXI9dHlwZW9mIHZhbHVlLnZhbHVlT2Y9PSJmdW5jdGlvbiI/dmFsdWUudmFsdWVPZigpOnZhbHVlO3ZhbHVlPWlzT2JqZWN0KG90aGVyKT9vdGhlcisiIjpvdGhlcn1pZih0eXBlb2YgdmFsdWUhPSJzdHJpbmciKXJldHVybiB2YWx1ZT09PTA/dmFsdWU6K3ZhbHVlO3ZhbHVlPXZhbHVlLnJlcGxhY2UocmVUcmltLCIiKTt2YXIgaXNCaW5hcnk9cmVJc0JpbmFyeS50ZXN0KHZhbHVlKTtyZXR1cm4gaXNCaW5hcnl8fHJlSXNPY3RhbC50ZXN0KHZhbHVlKT9mcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksaXNCaW5hcnk/Mjo4KTpyZUlzQmFkSGV4LnRlc3QodmFsdWUpP05BTjordmFsdWV9ZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSl7cmV0dXJuIGNvcHlPYmplY3QodmFsdWUsa2V5c0luKHZhbHVlKSl9ZnVuY3Rpb24gdG9TYWZlSW50ZWdlcih2YWx1ZSl7cmV0dXJuIHZhbHVlPwpiYXNlQ2xhbXAodG9JbnRlZ2VyKHZhbHVlKSwtTUFYX1NBRkVfSU5URUdFUixNQVhfU0FGRV9JTlRFR0VSKTp2YWx1ZT09PTA/dmFsdWU6MH1mdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSl7cmV0dXJuIHZhbHVlPT1udWxsPyIiOmJhc2VUb1N0cmluZyh2YWx1ZSl9dmFyIGFzc2lnbj1jcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3Qsc291cmNlKXtpZihpc1Byb3RvdHlwZShzb3VyY2UpfHxpc0FycmF5TGlrZShzb3VyY2UpKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0KTtyZXR1cm59Zm9yKHZhciBrZXkgaW4gc291cmNlKWlmKGhhc093blByb3BlcnR5LmNhbGwoc291cmNlLGtleSkpYXNzaWduVmFsdWUob2JqZWN0LGtleSxzb3VyY2Vba2V5XSl9KTt2YXIgYXNzaWduSW49Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSl7Y29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0KX0pO3ZhciBhc3NpZ25JbldpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LApzb3VyY2Usc3JjSW5kZXgsY3VzdG9taXplcil7Y29weU9iamVjdChzb3VyY2Usa2V5c0luKHNvdXJjZSksb2JqZWN0LGN1c3RvbWl6ZXIpfSk7dmFyIGFzc2lnbldpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtjb3B5T2JqZWN0KHNvdXJjZSxrZXlzKHNvdXJjZSksb2JqZWN0LGN1c3RvbWl6ZXIpfSk7dmFyIGF0PWZsYXRSZXN0KGJhc2VBdCk7ZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSxwcm9wZXJ0aWVzKXt2YXIgcmVzdWx0PWJhc2VDcmVhdGUocHJvdG90eXBlKTtyZXR1cm4gcHJvcGVydGllcz09bnVsbD9yZXN1bHQ6YmFzZUFzc2lnbihyZXN1bHQscHJvcGVydGllcyl9dmFyIGRlZmF1bHRzPWJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCxzb3VyY2VzKXtvYmplY3Q9T2JqZWN0KG9iamVjdCk7dmFyIGluZGV4PS0xO3ZhciBsZW5ndGg9c291cmNlcy5sZW5ndGg7dmFyIGd1YXJkPWxlbmd0aD4yP3NvdXJjZXNbMl06CnVuZGVmaW5lZDtpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSxzb3VyY2VzWzFdLGd1YXJkKSlsZW5ndGg9MTt3aGlsZSgrK2luZGV4PGxlbmd0aCl7dmFyIHNvdXJjZT1zb3VyY2VzW2luZGV4XTt2YXIgcHJvcHM9a2V5c0luKHNvdXJjZSk7dmFyIHByb3BzSW5kZXg9LTE7dmFyIHByb3BzTGVuZ3RoPXByb3BzLmxlbmd0aDt3aGlsZSgrK3Byb3BzSW5kZXg8cHJvcHNMZW5ndGgpe3ZhciBrZXk9cHJvcHNbcHJvcHNJbmRleF07dmFyIHZhbHVlPW9iamVjdFtrZXldO2lmKHZhbHVlPT09dW5kZWZpbmVkfHxlcSh2YWx1ZSxvYmplY3RQcm90b1trZXldKSYmIWhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LGtleSkpb2JqZWN0W2tleV09c291cmNlW2tleV19fXJldHVybiBvYmplY3R9KTt2YXIgZGVmYXVsdHNEZWVwPWJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3Mpe2FyZ3MucHVzaCh1bmRlZmluZWQsY3VzdG9tRGVmYXVsdHNNZXJnZSk7cmV0dXJuIGFwcGx5KG1lcmdlV2l0aCwKdW5kZWZpbmVkLGFyZ3MpfSk7ZnVuY3Rpb24gZmluZEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duKX1mdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwzKSxiYXNlRm9yT3duUmlnaHQpfWZ1bmN0aW9uIGZvckluKG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvcihvYmplY3QsZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksa2V5c0luKX1mdW5jdGlvbiBmb3JJblJpZ2h0KG9iamVjdCxpdGVyYXRlZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZUZvclJpZ2h0KG9iamVjdCxnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSxrZXlzSW4pfWZ1bmN0aW9uIGZvck93bihvYmplY3QsaXRlcmF0ZWUpe3JldHVybiBvYmplY3QmJmJhc2VGb3JPd24ob2JqZWN0LApnZXRJdGVyYXRlZShpdGVyYXRlZSwzKSl9ZnVuY3Rpb24gZm9yT3duUmlnaHQob2JqZWN0LGl0ZXJhdGVlKXtyZXR1cm4gb2JqZWN0JiZiYXNlRm9yT3duUmlnaHQob2JqZWN0LGdldEl0ZXJhdGVlKGl0ZXJhdGVlLDMpKX1mdW5jdGlvbiBmdW5jdGlvbnMob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXMob2JqZWN0KSl9ZnVuY3Rpb24gZnVuY3Rpb25zSW4ob2JqZWN0KXtyZXR1cm4gb2JqZWN0PT1udWxsP1tdOmJhc2VGdW5jdGlvbnMob2JqZWN0LGtleXNJbihvYmplY3QpKX1mdW5jdGlvbiBnZXQob2JqZWN0LHBhdGgsZGVmYXVsdFZhbHVlKXt2YXIgcmVzdWx0PW9iamVjdD09bnVsbD91bmRlZmluZWQ6YmFzZUdldChvYmplY3QscGF0aCk7cmV0dXJuIHJlc3VsdD09PXVuZGVmaW5lZD9kZWZhdWx0VmFsdWU6cmVzdWx0fWZ1bmN0aW9uIGhhcyhvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdCE9bnVsbCYmaGFzUGF0aChvYmplY3QsCnBhdGgsYmFzZUhhcyl9ZnVuY3Rpb24gaGFzSW4ob2JqZWN0LHBhdGgpe3JldHVybiBvYmplY3QhPW51bGwmJmhhc1BhdGgob2JqZWN0LHBhdGgsYmFzZUhhc0luKX12YXIgaW52ZXJ0PWNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpdmFsdWU9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7cmVzdWx0W3ZhbHVlXT1rZXl9LGNvbnN0YW50KGlkZW50aXR5KSk7dmFyIGludmVydEJ5PWNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCx2YWx1ZSxrZXkpe2lmKHZhbHVlIT1udWxsJiZ0eXBlb2YgdmFsdWUudG9TdHJpbmchPSJmdW5jdGlvbiIpdmFsdWU9bmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7aWYoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsdmFsdWUpKXJlc3VsdFt2YWx1ZV0ucHVzaChrZXkpO2Vsc2UgcmVzdWx0W3ZhbHVlXT1ba2V5XX0sCmdldEl0ZXJhdGVlKTt2YXIgaW52b2tlPWJhc2VSZXN0KGJhc2VJbnZva2UpO2Z1bmN0aW9uIGtleXMob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCk6YmFzZUtleXMob2JqZWN0KX1mdW5jdGlvbiBrZXlzSW4ob2JqZWN0KXtyZXR1cm4gaXNBcnJheUxpa2Uob2JqZWN0KT9hcnJheUxpa2VLZXlzKG9iamVjdCx0cnVlKTpiYXNlS2V5c0luKG9iamVjdCl9ZnVuY3Rpb24gbWFwS2V5cyhvYmplY3QsaXRlcmF0ZWUpe3ZhciByZXN1bHQ9e307aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyk7YmFzZUZvck93bihvYmplY3QsZnVuY3Rpb24odmFsdWUsa2V5LG9iamVjdCl7YmFzZUFzc2lnblZhbHVlKHJlc3VsdCxpdGVyYXRlZSh2YWx1ZSxrZXksb2JqZWN0KSx2YWx1ZSl9KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsaXRlcmF0ZWUpe3ZhciByZXN1bHQ9e307aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjMpO2Jhc2VGb3JPd24ob2JqZWN0LGZ1bmN0aW9uKHZhbHVlLGtleSxvYmplY3Qpe2Jhc2VBc3NpZ25WYWx1ZShyZXN1bHQsa2V5LGl0ZXJhdGVlKHZhbHVlLGtleSxvYmplY3QpKX0pO3JldHVybiByZXN1bHR9dmFyIG1lcmdlPWNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCxzb3VyY2Usc3JjSW5kZXgpe2Jhc2VNZXJnZShvYmplY3Qsc291cmNlLHNyY0luZGV4KX0pO3ZhciBtZXJnZVdpdGg9Y3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKXtiYXNlTWVyZ2Uob2JqZWN0LHNvdXJjZSxzcmNJbmRleCxjdXN0b21pemVyKX0pO3ZhciBvbWl0PWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7dmFyIHJlc3VsdD17fTtpZihvYmplY3Q9PW51bGwpcmV0dXJuIHJlc3VsdDt2YXIgaXNEZWVwPWZhbHNlO3BhdGhzPWFycmF5TWFwKHBhdGhzLGZ1bmN0aW9uKHBhdGgpe3BhdGg9Y2FzdFBhdGgocGF0aCxvYmplY3QpO2lzRGVlcHx8Cihpc0RlZXA9cGF0aC5sZW5ndGg+MSk7cmV0dXJuIHBhdGh9KTtjb3B5T2JqZWN0KG9iamVjdCxnZXRBbGxLZXlzSW4ob2JqZWN0KSxyZXN1bHQpO2lmKGlzRGVlcClyZXN1bHQ9YmFzZUNsb25lKHJlc3VsdCxDTE9ORV9ERUVQX0ZMQUd8Q0xPTkVfRkxBVF9GTEFHfENMT05FX1NZTUJPTFNfRkxBRyxjdXN0b21PbWl0Q2xvbmUpO3ZhciBsZW5ndGg9cGF0aHMubGVuZ3RoO3doaWxlKGxlbmd0aC0tKWJhc2VVbnNldChyZXN1bHQscGF0aHNbbGVuZ3RoXSk7cmV0dXJuIHJlc3VsdH0pO2Z1bmN0aW9uIG9taXRCeShvYmplY3QscHJlZGljYXRlKXtyZXR1cm4gcGlja0J5KG9iamVjdCxuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpfXZhciBwaWNrPWZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCxwYXRocyl7cmV0dXJuIG9iamVjdD09bnVsbD97fTpiYXNlUGljayhvYmplY3QscGF0aHMpfSk7ZnVuY3Rpb24gcGlja0J5KG9iamVjdCxwcmVkaWNhdGUpe2lmKG9iamVjdD09bnVsbClyZXR1cm57fTsKdmFyIHByb3BzPWFycmF5TWFwKGdldEFsbEtleXNJbihvYmplY3QpLGZ1bmN0aW9uKHByb3Ape3JldHVybltwcm9wXX0pO3ByZWRpY2F0ZT1nZXRJdGVyYXRlZShwcmVkaWNhdGUpO3JldHVybiBiYXNlUGlja0J5KG9iamVjdCxwcm9wcyxmdW5jdGlvbih2YWx1ZSxwYXRoKXtyZXR1cm4gcHJlZGljYXRlKHZhbHVlLHBhdGhbMF0pfSl9ZnVuY3Rpb24gcmVzdWx0KG9iamVjdCxwYXRoLGRlZmF1bHRWYWx1ZSl7cGF0aD1jYXN0UGF0aChwYXRoLG9iamVjdCk7dmFyIGluZGV4PS0xLGxlbmd0aD1wYXRoLmxlbmd0aDtpZighbGVuZ3RoKXtsZW5ndGg9MTtvYmplY3Q9dW5kZWZpbmVkfXdoaWxlKCsraW5kZXg8bGVuZ3RoKXt2YXIgdmFsdWU9b2JqZWN0PT1udWxsP3VuZGVmaW5lZDpvYmplY3RbdG9LZXkocGF0aFtpbmRleF0pXTtpZih2YWx1ZT09PXVuZGVmaW5lZCl7aW5kZXg9bGVuZ3RoO3ZhbHVlPWRlZmF1bHRWYWx1ZX1vYmplY3Q9aXNGdW5jdGlvbih2YWx1ZSk/dmFsdWUuY2FsbChvYmplY3QpOgp2YWx1ZX1yZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIHNldChvYmplY3QscGF0aCx2YWx1ZSl7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVNldChvYmplY3QscGF0aCx2YWx1ZSl9ZnVuY3Rpb24gc2V0V2l0aChvYmplY3QscGF0aCx2YWx1ZSxjdXN0b21pemVyKXtjdXN0b21pemVyPXR5cGVvZiBjdXN0b21pemVyPT0iZnVuY3Rpb24iP2N1c3RvbWl6ZXI6dW5kZWZpbmVkO3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VTZXQob2JqZWN0LHBhdGgsdmFsdWUsY3VzdG9taXplcil9dmFyIHRvUGFpcnM9Y3JlYXRlVG9QYWlycyhrZXlzKTt2YXIgdG9QYWlyc0luPWNyZWF0ZVRvUGFpcnMoa2V5c0luKTtmdW5jdGlvbiB0cmFuc2Zvcm0ob2JqZWN0LGl0ZXJhdGVlLGFjY3VtdWxhdG9yKXt2YXIgaXNBcnI9aXNBcnJheShvYmplY3QpLGlzQXJyTGlrZT1pc0Fycnx8aXNCdWZmZXIob2JqZWN0KXx8aXNUeXBlZEFycmF5KG9iamVjdCk7aXRlcmF0ZWU9Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsCjQpO2lmKGFjY3VtdWxhdG9yPT1udWxsKXt2YXIgQ3Rvcj1vYmplY3QmJm9iamVjdC5jb25zdHJ1Y3RvcjtpZihpc0Fyckxpa2UpYWNjdW11bGF0b3I9aXNBcnI/bmV3IEN0b3I6W107ZWxzZSBpZihpc09iamVjdChvYmplY3QpKWFjY3VtdWxhdG9yPWlzRnVuY3Rpb24oQ3Rvcik/YmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSk6e307ZWxzZSBhY2N1bXVsYXRvcj17fX0oaXNBcnJMaWtlP2FycmF5RWFjaDpiYXNlRm9yT3duKShvYmplY3QsZnVuY3Rpb24odmFsdWUsaW5kZXgsb2JqZWN0KXtyZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsdmFsdWUsaW5kZXgsb2JqZWN0KX0pO3JldHVybiBhY2N1bXVsYXRvcn1mdW5jdGlvbiB1bnNldChvYmplY3QscGF0aCl7cmV0dXJuIG9iamVjdD09bnVsbD90cnVlOmJhc2VVbnNldChvYmplY3QscGF0aCl9ZnVuY3Rpb24gdXBkYXRlKG9iamVjdCxwYXRoLHVwZGF0ZXIpe3JldHVybiBvYmplY3Q9PW51bGw/b2JqZWN0OmJhc2VVcGRhdGUob2JqZWN0LApwYXRoLGNhc3RGdW5jdGlvbih1cGRhdGVyKSl9ZnVuY3Rpb24gdXBkYXRlV2l0aChvYmplY3QscGF0aCx1cGRhdGVyLGN1c3RvbWl6ZXIpe2N1c3RvbWl6ZXI9dHlwZW9mIGN1c3RvbWl6ZXI9PSJmdW5jdGlvbiI/Y3VzdG9taXplcjp1bmRlZmluZWQ7cmV0dXJuIG9iamVjdD09bnVsbD9vYmplY3Q6YmFzZVVwZGF0ZShvYmplY3QscGF0aCxjYXN0RnVuY3Rpb24odXBkYXRlciksY3VzdG9taXplcil9ZnVuY3Rpb24gdmFsdWVzKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlVmFsdWVzKG9iamVjdCxrZXlzKG9iamVjdCkpfWZ1bmN0aW9uIHZhbHVlc0luKG9iamVjdCl7cmV0dXJuIG9iamVjdD09bnVsbD9bXTpiYXNlVmFsdWVzKG9iamVjdCxrZXlzSW4ob2JqZWN0KSl9ZnVuY3Rpb24gY2xhbXAobnVtYmVyLGxvd2VyLHVwcGVyKXtpZih1cHBlcj09PXVuZGVmaW5lZCl7dXBwZXI9bG93ZXI7bG93ZXI9dW5kZWZpbmVkfWlmKHVwcGVyIT09dW5kZWZpbmVkKXt1cHBlcj0KdG9OdW1iZXIodXBwZXIpO3VwcGVyPXVwcGVyPT09dXBwZXI/dXBwZXI6MH1pZihsb3dlciE9PXVuZGVmaW5lZCl7bG93ZXI9dG9OdW1iZXIobG93ZXIpO2xvd2VyPWxvd2VyPT09bG93ZXI/bG93ZXI6MH1yZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksbG93ZXIsdXBwZXIpfWZ1bmN0aW9uIGluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl7c3RhcnQ9dG9GaW5pdGUoc3RhcnQpO2lmKGVuZD09PXVuZGVmaW5lZCl7ZW5kPXN0YXJ0O3N0YXJ0PTB9ZWxzZSBlbmQ9dG9GaW5pdGUoZW5kKTtudW1iZXI9dG9OdW1iZXIobnVtYmVyKTtyZXR1cm4gYmFzZUluUmFuZ2UobnVtYmVyLHN0YXJ0LGVuZCl9ZnVuY3Rpb24gcmFuZG9tKGxvd2VyLHVwcGVyLGZsb2F0aW5nKXtpZihmbG9hdGluZyYmdHlwZW9mIGZsb2F0aW5nIT0iYm9vbGVhbiImJmlzSXRlcmF0ZWVDYWxsKGxvd2VyLHVwcGVyLGZsb2F0aW5nKSl1cHBlcj1mbG9hdGluZz11bmRlZmluZWQ7aWYoZmxvYXRpbmc9PT11bmRlZmluZWQpaWYodHlwZW9mIHVwcGVyPT0KImJvb2xlYW4iKXtmbG9hdGluZz11cHBlcjt1cHBlcj11bmRlZmluZWR9ZWxzZSBpZih0eXBlb2YgbG93ZXI9PSJib29sZWFuIil7ZmxvYXRpbmc9bG93ZXI7bG93ZXI9dW5kZWZpbmVkfWlmKGxvd2VyPT09dW5kZWZpbmVkJiZ1cHBlcj09PXVuZGVmaW5lZCl7bG93ZXI9MDt1cHBlcj0xfWVsc2V7bG93ZXI9dG9GaW5pdGUobG93ZXIpO2lmKHVwcGVyPT09dW5kZWZpbmVkKXt1cHBlcj1sb3dlcjtsb3dlcj0wfWVsc2UgdXBwZXI9dG9GaW5pdGUodXBwZXIpfWlmKGxvd2VyPnVwcGVyKXt2YXIgdGVtcD1sb3dlcjtsb3dlcj11cHBlcjt1cHBlcj10ZW1wfWlmKGZsb2F0aW5nfHxsb3dlciUxfHx1cHBlciUxKXt2YXIgcmFuZD1uYXRpdmVSYW5kb20oKTtyZXR1cm4gbmF0aXZlTWluKGxvd2VyK3JhbmQqKHVwcGVyLWxvd2VyK2ZyZWVQYXJzZUZsb2F0KCIxZS0iKygocmFuZCsiIikubGVuZ3RoLTEpKSksdXBwZXIpfXJldHVybiBiYXNlUmFuZG9tKGxvd2VyLHVwcGVyKX12YXIgY2FtZWxDYXNlPQpjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCx3b3JkLGluZGV4KXt3b3JkPXdvcmQudG9Mb3dlckNhc2UoKTtyZXR1cm4gcmVzdWx0KyhpbmRleD9jYXBpdGFsaXplKHdvcmQpOndvcmQpfSk7ZnVuY3Rpb24gY2FwaXRhbGl6ZShzdHJpbmcpe3JldHVybiB1cHBlckZpcnN0KHRvU3RyaW5nKHN0cmluZykudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gZGVidXJyKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmc3RyaW5nLnJlcGxhY2UocmVMYXRpbixkZWJ1cnJMZXR0ZXIpLnJlcGxhY2UocmVDb21ib01hcmssIiIpfWZ1bmN0aW9uIGVuZHNXaXRoKHN0cmluZyx0YXJnZXQscG9zaXRpb24pe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTt2YXIgbGVuZ3RoPXN0cmluZy5sZW5ndGg7cG9zaXRpb249cG9zaXRpb249PT11bmRlZmluZWQ/bGVuZ3RoOmJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLAowLGxlbmd0aCk7dmFyIGVuZD1wb3NpdGlvbjtwb3NpdGlvbi09dGFyZ2V0Lmxlbmd0aDtyZXR1cm4gcG9zaXRpb24+PTAmJnN0cmluZy5zbGljZShwb3NpdGlvbixlbmQpPT10YXJnZXR9ZnVuY3Rpb24gZXNjYXBlKHN0cmluZyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7cmV0dXJuIHN0cmluZyYmcmVIYXNVbmVzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZVVuZXNjYXBlZEh0bWwsZXNjYXBlSHRtbENoYXIpOnN0cmluZ31mdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc1JlZ0V4cENoYXIudGVzdChzdHJpbmcpP3N0cmluZy5yZXBsYWNlKHJlUmVnRXhwQ2hhciwiXFwkXHgyNiIpOnN0cmluZ312YXIga2ViYWJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyItIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7CnZhciBsb3dlckNhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt3b3JkLnRvTG93ZXJDYXNlKCl9KTt2YXIgbG93ZXJGaXJzdD1jcmVhdGVDYXNlRmlyc3QoInRvTG93ZXJDYXNlIik7ZnVuY3Rpb24gcGFkKHN0cmluZyxsZW5ndGgsY2hhcnMpe3N0cmluZz10b1N0cmluZyhzdHJpbmcpO2xlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtpZighbGVuZ3RofHxzdHJMZW5ndGg+PWxlbmd0aClyZXR1cm4gc3RyaW5nO3ZhciBtaWQ9KGxlbmd0aC1zdHJMZW5ndGgpLzI7cmV0dXJuIGNyZWF0ZVBhZGRpbmcobmF0aXZlRmxvb3IobWlkKSxjaGFycykrc3RyaW5nK2NyZWF0ZVBhZGRpbmcobmF0aXZlQ2VpbChtaWQpLGNoYXJzKX1mdW5jdGlvbiBwYWRFbmQoc3RyaW5nLGxlbmd0aCxjaGFycyl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7Cmxlbmd0aD10b0ludGVnZXIobGVuZ3RoKTt2YXIgc3RyTGVuZ3RoPWxlbmd0aD9zdHJpbmdTaXplKHN0cmluZyk6MDtyZXR1cm4gbGVuZ3RoJiZzdHJMZW5ndGg8bGVuZ3RoP3N0cmluZytjcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpOnN0cmluZ31mdW5jdGlvbiBwYWRTdGFydChzdHJpbmcsbGVuZ3RoLGNoYXJzKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtsZW5ndGg9dG9JbnRlZ2VyKGxlbmd0aCk7dmFyIHN0ckxlbmd0aD1sZW5ndGg/c3RyaW5nU2l6ZShzdHJpbmcpOjA7cmV0dXJuIGxlbmd0aCYmc3RyTGVuZ3RoPGxlbmd0aD9jcmVhdGVQYWRkaW5nKGxlbmd0aC1zdHJMZW5ndGgsY2hhcnMpK3N0cmluZzpzdHJpbmd9ZnVuY3Rpb24gcGFyc2VJbnQoc3RyaW5nLHJhZGl4LGd1YXJkKXtpZihndWFyZHx8cmFkaXg9PW51bGwpcmFkaXg9MDtlbHNlIGlmKHJhZGl4KXJhZGl4PStyYWRpeDtyZXR1cm4gbmF0aXZlUGFyc2VJbnQodG9TdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlVHJpbVN0YXJ0LAoiIikscmFkaXh8fDApfWZ1bmN0aW9uIHJlcGVhdChzdHJpbmcsbixndWFyZCl7aWYoZ3VhcmQ/aXNJdGVyYXRlZUNhbGwoc3RyaW5nLG4sZ3VhcmQpOm49PT11bmRlZmluZWQpbj0xO2Vsc2Ugbj10b0ludGVnZXIobik7cmV0dXJuIGJhc2VSZXBlYXQodG9TdHJpbmcoc3RyaW5nKSxuKX1mdW5jdGlvbiByZXBsYWNlKCl7dmFyIGFyZ3M9YXJndW1lbnRzLHN0cmluZz10b1N0cmluZyhhcmdzWzBdKTtyZXR1cm4gYXJncy5sZW5ndGg8Mz9zdHJpbmc6c3RyaW5nLnJlcGxhY2UoYXJnc1sxXSxhcmdzWzJdKX12YXIgc25ha2VDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyJfIjoiIikrd29yZC50b0xvd2VyQ2FzZSgpfSk7ZnVuY3Rpb24gc3BsaXQoc3RyaW5nLHNlcGFyYXRvcixsaW1pdCl7aWYobGltaXQmJnR5cGVvZiBsaW1pdCE9Im51bWJlciImJmlzSXRlcmF0ZWVDYWxsKHN0cmluZyxzZXBhcmF0b3IsbGltaXQpKXNlcGFyYXRvcj0KbGltaXQ9dW5kZWZpbmVkO2xpbWl0PWxpbWl0PT09dW5kZWZpbmVkP01BWF9BUlJBWV9MRU5HVEg6bGltaXQ+Pj4wO2lmKCFsaW1pdClyZXR1cm5bXTtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtpZihzdHJpbmcmJih0eXBlb2Ygc2VwYXJhdG9yPT0ic3RyaW5nInx8c2VwYXJhdG9yIT1udWxsJiYhaXNSZWdFeHAoc2VwYXJhdG9yKSkpe3NlcGFyYXRvcj1iYXNlVG9TdHJpbmcoc2VwYXJhdG9yKTtpZighc2VwYXJhdG9yJiZoYXNVbmljb2RlKHN0cmluZykpcmV0dXJuIGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHN0cmluZyksMCxsaW1pdCl9cmV0dXJuIHN0cmluZy5zcGxpdChzZXBhcmF0b3IsbGltaXQpfXZhciBzdGFydENhc2U9Y3JlYXRlQ29tcG91bmRlcihmdW5jdGlvbihyZXN1bHQsd29yZCxpbmRleCl7cmV0dXJuIHJlc3VsdCsoaW5kZXg/IiAiOiIiKSt1cHBlckZpcnN0KHdvcmQpfSk7ZnVuY3Rpb24gc3RhcnRzV2l0aChzdHJpbmcsdGFyZ2V0LHBvc2l0aW9uKXtzdHJpbmc9CnRvU3RyaW5nKHN0cmluZyk7cG9zaXRpb249cG9zaXRpb249PW51bGw/MDpiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwwLHN0cmluZy5sZW5ndGgpO3RhcmdldD1iYXNlVG9TdHJpbmcodGFyZ2V0KTtyZXR1cm4gc3RyaW5nLnNsaWNlKHBvc2l0aW9uLHBvc2l0aW9uK3RhcmdldC5sZW5ndGgpPT10YXJnZXR9ZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpe3ZhciBzZXR0aW5ncz1sb2Rhc2gudGVtcGxhdGVTZXR0aW5ncztpZihndWFyZCYmaXNJdGVyYXRlZUNhbGwoc3RyaW5nLG9wdGlvbnMsZ3VhcmQpKW9wdGlvbnM9dW5kZWZpbmVkO3N0cmluZz10b1N0cmluZyhzdHJpbmcpO29wdGlvbnM9YXNzaWduSW5XaXRoKHt9LG9wdGlvbnMsc2V0dGluZ3MsY3VzdG9tRGVmYXVsdHNBc3NpZ25Jbik7dmFyIGltcG9ydHM9YXNzaWduSW5XaXRoKHt9LG9wdGlvbnMuaW1wb3J0cyxzZXR0aW5ncy5pbXBvcnRzLGN1c3RvbURlZmF1bHRzQXNzaWduSW4pLGltcG9ydHNLZXlzPQprZXlzKGltcG9ydHMpLGltcG9ydHNWYWx1ZXM9YmFzZVZhbHVlcyhpbXBvcnRzLGltcG9ydHNLZXlzKTt2YXIgaXNFc2NhcGluZyxpc0V2YWx1YXRpbmcsaW5kZXg9MCxpbnRlcnBvbGF0ZT1vcHRpb25zLmludGVycG9sYXRlfHxyZU5vTWF0Y2gsc291cmNlPSJfX3AgK1x4M2QgJyI7dmFyIHJlRGVsaW1pdGVycz1SZWdFeHAoKG9wdGlvbnMuZXNjYXBlfHxyZU5vTWF0Y2gpLnNvdXJjZSsifCIraW50ZXJwb2xhdGUuc291cmNlKyJ8IisoaW50ZXJwb2xhdGU9PT1yZUludGVycG9sYXRlP3JlRXNUZW1wbGF0ZTpyZU5vTWF0Y2gpLnNvdXJjZSsifCIrKG9wdGlvbnMuZXZhbHVhdGV8fHJlTm9NYXRjaCkuc291cmNlKyJ8JCIsImciKTt2YXIgc291cmNlVVJMPSIvLyMgc291cmNlVVJMXHgzZCIrKCJzb3VyY2VVUkwiaW4gb3B0aW9ucz9vcHRpb25zLnNvdXJjZVVSTDoibG9kYXNoLnRlbXBsYXRlU291cmNlc1siKyArK3RlbXBsYXRlQ291bnRlcisiXSIpKyJcbiI7c3RyaW5nLnJlcGxhY2UocmVEZWxpbWl0ZXJzLApmdW5jdGlvbihtYXRjaCxlc2NhcGVWYWx1ZSxpbnRlcnBvbGF0ZVZhbHVlLGVzVGVtcGxhdGVWYWx1ZSxldmFsdWF0ZVZhbHVlLG9mZnNldCl7aW50ZXJwb2xhdGVWYWx1ZXx8KGludGVycG9sYXRlVmFsdWU9ZXNUZW1wbGF0ZVZhbHVlKTtzb3VyY2UrPXN0cmluZy5zbGljZShpbmRleCxvZmZzZXQpLnJlcGxhY2UocmVVbmVzY2FwZWRTdHJpbmcsZXNjYXBlU3RyaW5nQ2hhcik7aWYoZXNjYXBlVmFsdWUpe2lzRXNjYXBpbmc9dHJ1ZTtzb3VyY2UrPSInICtcbl9fZSgiK2VzY2FwZVZhbHVlKyIpICtcbicifWlmKGV2YWx1YXRlVmFsdWUpe2lzRXZhbHVhdGluZz10cnVlO3NvdXJjZSs9Iic7XG4iK2V2YWx1YXRlVmFsdWUrIjtcbl9fcCArXHgzZCAnIn1pZihpbnRlcnBvbGF0ZVZhbHVlKXNvdXJjZSs9IicgK1xuKChfX3QgXHgzZCAoIitpbnRlcnBvbGF0ZVZhbHVlKyIpKSBceDNkXHgzZCBudWxsID8gJycgOiBfX3QpICtcbiciO2luZGV4PW9mZnNldCttYXRjaC5sZW5ndGg7cmV0dXJuIG1hdGNofSk7CnNvdXJjZSs9Iic7XG4iO3ZhciB2YXJpYWJsZT1vcHRpb25zLnZhcmlhYmxlO2lmKCF2YXJpYWJsZSlzb3VyY2U9IndpdGggKG9iaikge1xuIitzb3VyY2UrIlxufVxuIjtzb3VyY2U9KGlzRXZhbHVhdGluZz9zb3VyY2UucmVwbGFjZShyZUVtcHR5U3RyaW5nTGVhZGluZywiIik6c291cmNlKS5yZXBsYWNlKHJlRW1wdHlTdHJpbmdNaWRkbGUsIiQxIikucmVwbGFjZShyZUVtcHR5U3RyaW5nVHJhaWxpbmcsIiQxOyIpO3NvdXJjZT0iZnVuY3Rpb24oIisodmFyaWFibGV8fCJvYmoiKSsiKSB7XG4iKyh2YXJpYWJsZT8iIjoib2JqIHx8IChvYmogXHgzZCB7fSk7XG4iKSsidmFyIF9fdCwgX19wIFx4M2QgJyciKyhpc0VzY2FwaW5nPyIsIF9fZSBceDNkIF8uZXNjYXBlIjoiIikrKGlzRXZhbHVhdGluZz8iLCBfX2ogXHgzZCBBcnJheS5wcm90b3R5cGUuam9pbjtcbiIrImZ1bmN0aW9uIHByaW50KCkgeyBfX3AgK1x4M2QgX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxuIjoiO1xuIikrc291cmNlKwoicmV0dXJuIF9fcFxufSI7dmFyIHJlc3VsdD1hdHRlbXB0KGZ1bmN0aW9uKCl7cmV0dXJuIEZ1bmN0aW9uKGltcG9ydHNLZXlzLHNvdXJjZVVSTCsicmV0dXJuICIrc291cmNlKS5hcHBseSh1bmRlZmluZWQsaW1wb3J0c1ZhbHVlcyl9KTtyZXN1bHQuc291cmNlPXNvdXJjZTtpZihpc0Vycm9yKHJlc3VsdCkpdGhyb3cgcmVzdWx0O3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdG9Mb3dlcih2YWx1ZSl7cmV0dXJuIHRvU3RyaW5nKHZhbHVlKS50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIHRvVXBwZXIodmFsdWUpe3JldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKX1mdW5jdGlvbiB0cmltKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltLCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7CnZhciBzdHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoc3RyaW5nKSxjaHJTeW1ib2xzPXN0cmluZ1RvQXJyYXkoY2hhcnMpLHN0YXJ0PWNoYXJzU3RhcnRJbmRleChzdHJTeW1ib2xzLGNoclN5bWJvbHMpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsY2hyU3ltYm9scykrMTtyZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsc3RhcnQsZW5kKS5qb2luKCIiKX1mdW5jdGlvbiB0cmltRW5kKHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltRW5kLCIiKTtpZighc3RyaW5nfHwhKGNoYXJzPWJhc2VUb1N0cmluZyhjaGFycykpKXJldHVybiBzdHJpbmc7dmFyIHN0clN5bWJvbHM9c3RyaW5nVG9BcnJheShzdHJpbmcpLGVuZD1jaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpKzE7cmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLAowLGVuZCkuam9pbigiIil9ZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZyxjaGFycyxndWFyZCl7c3RyaW5nPXRvU3RyaW5nKHN0cmluZyk7aWYoc3RyaW5nJiYoZ3VhcmR8fGNoYXJzPT09dW5kZWZpbmVkKSlyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltU3RhcnQsIiIpO2lmKCFzdHJpbmd8fCEoY2hhcnM9YmFzZVRvU3RyaW5nKGNoYXJzKSkpcmV0dXJuIHN0cmluZzt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyksc3RhcnQ9Y2hhcnNTdGFydEluZGV4KHN0clN5bWJvbHMsc3RyaW5nVG9BcnJheShjaGFycykpO3JldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scyxzdGFydCkuam9pbigiIil9ZnVuY3Rpb24gdHJ1bmNhdGUoc3RyaW5nLG9wdGlvbnMpe3ZhciBsZW5ndGg9REVGQVVMVF9UUlVOQ19MRU5HVEgsb21pc3Npb249REVGQVVMVF9UUlVOQ19PTUlTU0lPTjtpZihpc09iamVjdChvcHRpb25zKSl7dmFyIHNlcGFyYXRvcj0ic2VwYXJhdG9yImluIG9wdGlvbnM/Cm9wdGlvbnMuc2VwYXJhdG9yOnNlcGFyYXRvcjtsZW5ndGg9Imxlbmd0aCJpbiBvcHRpb25zP3RvSW50ZWdlcihvcHRpb25zLmxlbmd0aCk6bGVuZ3RoO29taXNzaW9uPSJvbWlzc2lvbiJpbiBvcHRpb25zP2Jhc2VUb1N0cmluZyhvcHRpb25zLm9taXNzaW9uKTpvbWlzc2lvbn1zdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTt2YXIgc3RyTGVuZ3RoPXN0cmluZy5sZW5ndGg7aWYoaGFzVW5pY29kZShzdHJpbmcpKXt2YXIgc3RyU3ltYm9scz1zdHJpbmdUb0FycmF5KHN0cmluZyk7c3RyTGVuZ3RoPXN0clN5bWJvbHMubGVuZ3RofWlmKGxlbmd0aD49c3RyTGVuZ3RoKXJldHVybiBzdHJpbmc7dmFyIGVuZD1sZW5ndGgtc3RyaW5nU2l6ZShvbWlzc2lvbik7aWYoZW5kPDEpcmV0dXJuIG9taXNzaW9uO3ZhciByZXN1bHQ9c3RyU3ltYm9scz9jYXN0U2xpY2Uoc3RyU3ltYm9scywwLGVuZCkuam9pbigiIik6c3RyaW5nLnNsaWNlKDAsZW5kKTtpZihzZXBhcmF0b3I9PT11bmRlZmluZWQpcmV0dXJuIHJlc3VsdCsKb21pc3Npb247aWYoc3RyU3ltYm9scyllbmQrPXJlc3VsdC5sZW5ndGgtZW5kO2lmKGlzUmVnRXhwKHNlcGFyYXRvcikpe2lmKHN0cmluZy5zbGljZShlbmQpLnNlYXJjaChzZXBhcmF0b3IpKXt2YXIgbWF0Y2gsc3Vic3RyaW5nPXJlc3VsdDtpZighc2VwYXJhdG9yLmdsb2JhbClzZXBhcmF0b3I9UmVnRXhwKHNlcGFyYXRvci5zb3VyY2UsdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpKyJnIik7c2VwYXJhdG9yLmxhc3RJbmRleD0wO3doaWxlKG1hdGNoPXNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpdmFyIG5ld0VuZD1tYXRjaC5pbmRleDtyZXN1bHQ9cmVzdWx0LnNsaWNlKDAsbmV3RW5kPT09dW5kZWZpbmVkP2VuZDpuZXdFbmQpfX1lbHNlIGlmKHN0cmluZy5pbmRleE9mKGJhc2VUb1N0cmluZyhzZXBhcmF0b3IpLGVuZCkhPWVuZCl7dmFyIGluZGV4PXJlc3VsdC5sYXN0SW5kZXhPZihzZXBhcmF0b3IpO2lmKGluZGV4Pi0xKXJlc3VsdD1yZXN1bHQuc2xpY2UoMCxpbmRleCl9cmV0dXJuIHJlc3VsdCsKb21pc3Npb259ZnVuY3Rpb24gdW5lc2NhcGUoc3RyaW5nKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtyZXR1cm4gc3RyaW5nJiZyZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKT9zdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLHVuZXNjYXBlSHRtbENoYXIpOnN0cmluZ312YXIgdXBwZXJDYXNlPWNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LHdvcmQsaW5kZXgpe3JldHVybiByZXN1bHQrKGluZGV4PyIgIjoiIikrd29yZC50b1VwcGVyQ2FzZSgpfSk7dmFyIHVwcGVyRmlyc3Q9Y3JlYXRlQ2FzZUZpcnN0KCJ0b1VwcGVyQ2FzZSIpO2Z1bmN0aW9uIHdvcmRzKHN0cmluZyxwYXR0ZXJuLGd1YXJkKXtzdHJpbmc9dG9TdHJpbmcoc3RyaW5nKTtwYXR0ZXJuPWd1YXJkP3VuZGVmaW5lZDpwYXR0ZXJuO2lmKHBhdHRlcm49PT11bmRlZmluZWQpcmV0dXJuIGhhc1VuaWNvZGVXb3JkKHN0cmluZyk/dW5pY29kZVdvcmRzKHN0cmluZyk6YXNjaWlXb3JkcyhzdHJpbmcpO3JldHVybiBzdHJpbmcubWF0Y2gocGF0dGVybil8fApbXX12YXIgYXR0ZW1wdD1iYXNlUmVzdChmdW5jdGlvbihmdW5jLGFyZ3Mpe3RyeXtyZXR1cm4gYXBwbHkoZnVuYyx1bmRlZmluZWQsYXJncyl9Y2F0Y2goZSl7cmV0dXJuIGlzRXJyb3IoZSk/ZTpuZXcgRXJyb3IoZSl9fSk7dmFyIGJpbmRBbGw9ZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LG1ldGhvZE5hbWVzKXthcnJheUVhY2gobWV0aG9kTmFtZXMsZnVuY3Rpb24oa2V5KXtrZXk9dG9LZXkoa2V5KTtiYXNlQXNzaWduVmFsdWUob2JqZWN0LGtleSxiaW5kKG9iamVjdFtrZXldLG9iamVjdCkpfSk7cmV0dXJuIG9iamVjdH0pO2Z1bmN0aW9uIGNvbmQocGFpcnMpe3ZhciBsZW5ndGg9cGFpcnM9PW51bGw/MDpwYWlycy5sZW5ndGgsdG9JdGVyYXRlZT1nZXRJdGVyYXRlZSgpO3BhaXJzPSFsZW5ndGg/W106YXJyYXlNYXAocGFpcnMsZnVuY3Rpb24ocGFpcil7aWYodHlwZW9mIHBhaXJbMV0hPSJmdW5jdGlvbiIpdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpO3JldHVyblt0b0l0ZXJhdGVlKHBhaXJbMF0pLApwYWlyWzFdXX0pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXt2YXIgaW5kZXg9LTE7d2hpbGUoKytpbmRleDxsZW5ndGgpe3ZhciBwYWlyPXBhaXJzW2luZGV4XTtpZihhcHBseShwYWlyWzBdLHRoaXMsYXJncykpcmV0dXJuIGFwcGx5KHBhaXJbMV0sdGhpcyxhcmdzKX19KX1mdW5jdGlvbiBjb25mb3Jtcyhzb3VyY2Upe3JldHVybiBiYXNlQ29uZm9ybXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBjb25zdGFudCh2YWx1ZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHZhbHVlfX1mdW5jdGlvbiBkZWZhdWx0VG8odmFsdWUsZGVmYXVsdFZhbHVlKXtyZXR1cm4gdmFsdWU9PW51bGx8fHZhbHVlIT09dmFsdWU/ZGVmYXVsdFZhbHVlOnZhbHVlfXZhciBmbG93PWNyZWF0ZUZsb3coKTt2YXIgZmxvd1JpZ2h0PWNyZWF0ZUZsb3codHJ1ZSk7ZnVuY3Rpb24gaWRlbnRpdHkodmFsdWUpe3JldHVybiB2YWx1ZX1mdW5jdGlvbiBpdGVyYXRlZShmdW5jKXtyZXR1cm4gYmFzZUl0ZXJhdGVlKHR5cGVvZiBmdW5jPT0KImZ1bmN0aW9uIj9mdW5jOmJhc2VDbG9uZShmdW5jLENMT05FX0RFRVBfRkxBRykpfWZ1bmN0aW9uIG1hdGNoZXMoc291cmNlKXtyZXR1cm4gYmFzZU1hdGNoZXMoYmFzZUNsb25lKHNvdXJjZSxDTE9ORV9ERUVQX0ZMQUcpKX1mdW5jdGlvbiBtYXRjaGVzUHJvcGVydHkocGF0aCxzcmNWYWx1ZSl7cmV0dXJuIGJhc2VNYXRjaGVzUHJvcGVydHkocGF0aCxiYXNlQ2xvbmUoc3JjVmFsdWUsQ0xPTkVfREVFUF9GTEFHKSl9dmFyIG1ldGhvZD1iYXNlUmVzdChmdW5jdGlvbihwYXRoLGFyZ3Mpe3JldHVybiBmdW5jdGlvbihvYmplY3Qpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpfX0pO3ZhciBtZXRob2RPZj1iYXNlUmVzdChmdW5jdGlvbihvYmplY3QsYXJncyl7cmV0dXJuIGZ1bmN0aW9uKHBhdGgpe3JldHVybiBiYXNlSW52b2tlKG9iamVjdCxwYXRoLGFyZ3MpfX0pO2Z1bmN0aW9uIG1peGluKG9iamVjdCxzb3VyY2Usb3B0aW9ucyl7dmFyIHByb3BzPWtleXMoc291cmNlKSwKbWV0aG9kTmFtZXM9YmFzZUZ1bmN0aW9ucyhzb3VyY2UscHJvcHMpO2lmKG9wdGlvbnM9PW51bGwmJiEoaXNPYmplY3Qoc291cmNlKSYmKG1ldGhvZE5hbWVzLmxlbmd0aHx8IXByb3BzLmxlbmd0aCkpKXtvcHRpb25zPXNvdXJjZTtzb3VyY2U9b2JqZWN0O29iamVjdD10aGlzO21ldGhvZE5hbWVzPWJhc2VGdW5jdGlvbnMoc291cmNlLGtleXMoc291cmNlKSl9dmFyIGNoYWluPSEoaXNPYmplY3Qob3B0aW9ucykmJiJjaGFpbiJpbiBvcHRpb25zKXx8ISFvcHRpb25zLmNoYWluLGlzRnVuYz1pc0Z1bmN0aW9uKG9iamVjdCk7YXJyYXlFYWNoKG1ldGhvZE5hbWVzLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe3ZhciBmdW5jPXNvdXJjZVttZXRob2ROYW1lXTtvYmplY3RbbWV0aG9kTmFtZV09ZnVuYztpZihpc0Z1bmMpb2JqZWN0LnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbigpe3ZhciBjaGFpbkFsbD10aGlzLl9fY2hhaW5fXztpZihjaGFpbnx8Y2hhaW5BbGwpe3ZhciByZXN1bHQ9Cm9iamVjdCh0aGlzLl9fd3JhcHBlZF9fKSxhY3Rpb25zPXJlc3VsdC5fX2FjdGlvbnNfXz1jb3B5QXJyYXkodGhpcy5fX2FjdGlvbnNfXyk7YWN0aW9ucy5wdXNoKHsiZnVuYyI6ZnVuYywiYXJncyI6YXJndW1lbnRzLCJ0aGlzQXJnIjpvYmplY3R9KTtyZXN1bHQuX19jaGFpbl9fPWNoYWluQWxsO3JldHVybiByZXN1bHR9cmV0dXJuIGZ1bmMuYXBwbHkob2JqZWN0LGFycmF5UHVzaChbdGhpcy52YWx1ZSgpXSxhcmd1bWVudHMpKX19KTtyZXR1cm4gb2JqZWN0fWZ1bmN0aW9uIG5vQ29uZmxpY3QoKXtpZihyb290Ll89PT10aGlzKXJvb3QuXz1vbGREYXNoO3JldHVybiB0aGlzfWZ1bmN0aW9uIG5vb3AoKXt9ZnVuY3Rpb24gbnRoQXJnKG4pe249dG9JbnRlZ2VyKG4pO3JldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKXtyZXR1cm4gYmFzZU50aChhcmdzLG4pfSl9dmFyIG92ZXI9Y3JlYXRlT3ZlcihhcnJheU1hcCk7dmFyIG92ZXJFdmVyeT1jcmVhdGVPdmVyKGFycmF5RXZlcnkpOwp2YXIgb3ZlclNvbWU9Y3JlYXRlT3ZlcihhcnJheVNvbWUpO2Z1bmN0aW9uIHByb3BlcnR5KHBhdGgpe3JldHVybiBpc0tleShwYXRoKT9iYXNlUHJvcGVydHkodG9LZXkocGF0aCkpOmJhc2VQcm9wZXJ0eURlZXAocGF0aCl9ZnVuY3Rpb24gcHJvcGVydHlPZihvYmplY3Qpe3JldHVybiBmdW5jdGlvbihwYXRoKXtyZXR1cm4gb2JqZWN0PT1udWxsP3VuZGVmaW5lZDpiYXNlR2V0KG9iamVjdCxwYXRoKX19dmFyIHJhbmdlPWNyZWF0ZVJhbmdlKCk7dmFyIHJhbmdlUmlnaHQ9Y3JlYXRlUmFuZ2UodHJ1ZSk7ZnVuY3Rpb24gc3R1YkFycmF5KCl7cmV0dXJuW119ZnVuY3Rpb24gc3R1YkZhbHNlKCl7cmV0dXJuIGZhbHNlfWZ1bmN0aW9uIHN0dWJPYmplY3QoKXtyZXR1cm57fX1mdW5jdGlvbiBzdHViU3RyaW5nKCl7cmV0dXJuIiJ9ZnVuY3Rpb24gc3R1YlRydWUoKXtyZXR1cm4gdHJ1ZX1mdW5jdGlvbiB0aW1lcyhuLGl0ZXJhdGVlKXtuPXRvSW50ZWdlcihuKTtpZihuPDF8fG4+TUFYX1NBRkVfSU5URUdFUilyZXR1cm5bXTsKdmFyIGluZGV4PU1BWF9BUlJBWV9MRU5HVEgsbGVuZ3RoPW5hdGl2ZU1pbihuLE1BWF9BUlJBWV9MRU5HVEgpO2l0ZXJhdGVlPWdldEl0ZXJhdGVlKGl0ZXJhdGVlKTtuLT1NQVhfQVJSQVlfTEVOR1RIO3ZhciByZXN1bHQ9YmFzZVRpbWVzKGxlbmd0aCxpdGVyYXRlZSk7d2hpbGUoKytpbmRleDxuKWl0ZXJhdGVlKGluZGV4KTtyZXR1cm4gcmVzdWx0fWZ1bmN0aW9uIHRvUGF0aCh2YWx1ZSl7aWYoaXNBcnJheSh2YWx1ZSkpcmV0dXJuIGFycmF5TWFwKHZhbHVlLHRvS2V5KTtyZXR1cm4gaXNTeW1ib2wodmFsdWUpP1t2YWx1ZV06Y29weUFycmF5KHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpKX1mdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpe3ZhciBpZD0rK2lkQ291bnRlcjtyZXR1cm4gdG9TdHJpbmcocHJlZml4KStpZH12YXIgYWRkPWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oYXVnZW5kLGFkZGVuZCl7cmV0dXJuIGF1Z2VuZCthZGRlbmR9LDApO3ZhciBjZWlsPWNyZWF0ZVJvdW5kKCJjZWlsIik7CnZhciBkaXZpZGU9Y3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihkaXZpZGVuZCxkaXZpc29yKXtyZXR1cm4gZGl2aWRlbmQvZGl2aXNvcn0sMSk7dmFyIGZsb29yPWNyZWF0ZVJvdW5kKCJmbG9vciIpO2Z1bmN0aW9uIG1heChhcnJheSl7cmV0dXJuIGFycmF5JiZhcnJheS5sZW5ndGg/YmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VHdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1heEJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUd0KTp1bmRlZmluZWR9ZnVuY3Rpb24gbWVhbihhcnJheSl7cmV0dXJuIGJhc2VNZWFuKGFycmF5LGlkZW50aXR5KX1mdW5jdGlvbiBtZWFuQnkoYXJyYXksaXRlcmF0ZWUpe3JldHVybiBiYXNlTWVhbihhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSl9ZnVuY3Rpb24gbWluKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD8KYmFzZUV4dHJlbXVtKGFycmF5LGlkZW50aXR5LGJhc2VMdCk6dW5kZWZpbmVkfWZ1bmN0aW9uIG1pbkJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlRXh0cmVtdW0oYXJyYXksZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMiksYmFzZUx0KTp1bmRlZmluZWR9dmFyIG11bHRpcGx5PWNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obXVsdGlwbGllcixtdWx0aXBsaWNhbmQpe3JldHVybiBtdWx0aXBsaWVyKm11bHRpcGxpY2FuZH0sMSk7dmFyIHJvdW5kPWNyZWF0ZVJvdW5kKCJyb3VuZCIpO3ZhciBzdWJ0cmFjdD1jcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKG1pbnVlbmQsc3VidHJhaGVuZCl7cmV0dXJuIG1pbnVlbmQtc3VidHJhaGVuZH0sMCk7ZnVuY3Rpb24gc3VtKGFycmF5KXtyZXR1cm4gYXJyYXkmJmFycmF5Lmxlbmd0aD9iYXNlU3VtKGFycmF5LGlkZW50aXR5KTowfWZ1bmN0aW9uIHN1bUJ5KGFycmF5LGl0ZXJhdGVlKXtyZXR1cm4gYXJyYXkmJgphcnJheS5sZW5ndGg/YmFzZVN1bShhcnJheSxnZXRJdGVyYXRlZShpdGVyYXRlZSwyKSk6MH1sb2Rhc2guYWZ0ZXI9YWZ0ZXI7bG9kYXNoLmFyeT1hcnk7bG9kYXNoLmFzc2lnbj1hc3NpZ247bG9kYXNoLmFzc2lnbkluPWFzc2lnbkluO2xvZGFzaC5hc3NpZ25JbldpdGg9YXNzaWduSW5XaXRoO2xvZGFzaC5hc3NpZ25XaXRoPWFzc2lnbldpdGg7bG9kYXNoLmF0PWF0O2xvZGFzaC5iZWZvcmU9YmVmb3JlO2xvZGFzaC5iaW5kPWJpbmQ7bG9kYXNoLmJpbmRBbGw9YmluZEFsbDtsb2Rhc2guYmluZEtleT1iaW5kS2V5O2xvZGFzaC5jYXN0QXJyYXk9Y2FzdEFycmF5O2xvZGFzaC5jaGFpbj1jaGFpbjtsb2Rhc2guY2h1bms9Y2h1bms7bG9kYXNoLmNvbXBhY3Q9Y29tcGFjdDtsb2Rhc2guY29uY2F0PWNvbmNhdDtsb2Rhc2guY29uZD1jb25kO2xvZGFzaC5jb25mb3Jtcz1jb25mb3Jtcztsb2Rhc2guY29uc3RhbnQ9Y29uc3RhbnQ7bG9kYXNoLmNvdW50Qnk9Y291bnRCeTtsb2Rhc2guY3JlYXRlPQpjcmVhdGU7bG9kYXNoLmN1cnJ5PWN1cnJ5O2xvZGFzaC5jdXJyeVJpZ2h0PWN1cnJ5UmlnaHQ7bG9kYXNoLmRlYm91bmNlPWRlYm91bmNlO2xvZGFzaC5kZWZhdWx0cz1kZWZhdWx0cztsb2Rhc2guZGVmYXVsdHNEZWVwPWRlZmF1bHRzRGVlcDtsb2Rhc2guZGVmZXI9ZGVmZXI7bG9kYXNoLmRlbGF5PWRlbGF5O2xvZGFzaC5kaWZmZXJlbmNlPWRpZmZlcmVuY2U7bG9kYXNoLmRpZmZlcmVuY2VCeT1kaWZmZXJlbmNlQnk7bG9kYXNoLmRpZmZlcmVuY2VXaXRoPWRpZmZlcmVuY2VXaXRoO2xvZGFzaC5kcm9wPWRyb3A7bG9kYXNoLmRyb3BSaWdodD1kcm9wUmlnaHQ7bG9kYXNoLmRyb3BSaWdodFdoaWxlPWRyb3BSaWdodFdoaWxlO2xvZGFzaC5kcm9wV2hpbGU9ZHJvcFdoaWxlO2xvZGFzaC5maWxsPWZpbGw7bG9kYXNoLmZpbHRlcj1maWx0ZXI7bG9kYXNoLmZsYXRNYXA9ZmxhdE1hcDtsb2Rhc2guZmxhdE1hcERlZXA9ZmxhdE1hcERlZXA7bG9kYXNoLmZsYXRNYXBEZXB0aD1mbGF0TWFwRGVwdGg7CmxvZGFzaC5mbGF0dGVuPWZsYXR0ZW47bG9kYXNoLmZsYXR0ZW5EZWVwPWZsYXR0ZW5EZWVwO2xvZGFzaC5mbGF0dGVuRGVwdGg9ZmxhdHRlbkRlcHRoO2xvZGFzaC5mbGlwPWZsaXA7bG9kYXNoLmZsb3c9Zmxvdztsb2Rhc2guZmxvd1JpZ2h0PWZsb3dSaWdodDtsb2Rhc2guZnJvbVBhaXJzPWZyb21QYWlycztsb2Rhc2guZnVuY3Rpb25zPWZ1bmN0aW9ucztsb2Rhc2guZnVuY3Rpb25zSW49ZnVuY3Rpb25zSW47bG9kYXNoLmdyb3VwQnk9Z3JvdXBCeTtsb2Rhc2guaW5pdGlhbD1pbml0aWFsO2xvZGFzaC5pbnRlcnNlY3Rpb249aW50ZXJzZWN0aW9uO2xvZGFzaC5pbnRlcnNlY3Rpb25CeT1pbnRlcnNlY3Rpb25CeTtsb2Rhc2guaW50ZXJzZWN0aW9uV2l0aD1pbnRlcnNlY3Rpb25XaXRoO2xvZGFzaC5pbnZlcnQ9aW52ZXJ0O2xvZGFzaC5pbnZlcnRCeT1pbnZlcnRCeTtsb2Rhc2guaW52b2tlTWFwPWludm9rZU1hcDtsb2Rhc2guaXRlcmF0ZWU9aXRlcmF0ZWU7bG9kYXNoLmtleUJ5PQprZXlCeTtsb2Rhc2gua2V5cz1rZXlzO2xvZGFzaC5rZXlzSW49a2V5c0luO2xvZGFzaC5tYXA9bWFwO2xvZGFzaC5tYXBLZXlzPW1hcEtleXM7bG9kYXNoLm1hcFZhbHVlcz1tYXBWYWx1ZXM7bG9kYXNoLm1hdGNoZXM9bWF0Y2hlcztsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5PW1hdGNoZXNQcm9wZXJ0eTtsb2Rhc2gubWVtb2l6ZT1tZW1vaXplO2xvZGFzaC5tZXJnZT1tZXJnZTtsb2Rhc2gubWVyZ2VXaXRoPW1lcmdlV2l0aDtsb2Rhc2gubWV0aG9kPW1ldGhvZDtsb2Rhc2gubWV0aG9kT2Y9bWV0aG9kT2Y7bG9kYXNoLm1peGluPW1peGluO2xvZGFzaC5uZWdhdGU9bmVnYXRlO2xvZGFzaC5udGhBcmc9bnRoQXJnO2xvZGFzaC5vbWl0PW9taXQ7bG9kYXNoLm9taXRCeT1vbWl0Qnk7bG9kYXNoLm9uY2U9b25jZTtsb2Rhc2gub3JkZXJCeT1vcmRlckJ5O2xvZGFzaC5vdmVyPW92ZXI7bG9kYXNoLm92ZXJBcmdzPW92ZXJBcmdzO2xvZGFzaC5vdmVyRXZlcnk9b3ZlckV2ZXJ5O2xvZGFzaC5vdmVyU29tZT0Kb3ZlclNvbWU7bG9kYXNoLnBhcnRpYWw9cGFydGlhbDtsb2Rhc2gucGFydGlhbFJpZ2h0PXBhcnRpYWxSaWdodDtsb2Rhc2gucGFydGl0aW9uPXBhcnRpdGlvbjtsb2Rhc2gucGljaz1waWNrO2xvZGFzaC5waWNrQnk9cGlja0J5O2xvZGFzaC5wcm9wZXJ0eT1wcm9wZXJ0eTtsb2Rhc2gucHJvcGVydHlPZj1wcm9wZXJ0eU9mO2xvZGFzaC5wdWxsPXB1bGw7bG9kYXNoLnB1bGxBbGw9cHVsbEFsbDtsb2Rhc2gucHVsbEFsbEJ5PXB1bGxBbGxCeTtsb2Rhc2gucHVsbEFsbFdpdGg9cHVsbEFsbFdpdGg7bG9kYXNoLnB1bGxBdD1wdWxsQXQ7bG9kYXNoLnJhbmdlPXJhbmdlO2xvZGFzaC5yYW5nZVJpZ2h0PXJhbmdlUmlnaHQ7bG9kYXNoLnJlYXJnPXJlYXJnO2xvZGFzaC5yZWplY3Q9cmVqZWN0O2xvZGFzaC5yZW1vdmU9cmVtb3ZlO2xvZGFzaC5yZXN0PXJlc3Q7bG9kYXNoLnJldmVyc2U9cmV2ZXJzZTtsb2Rhc2guc2FtcGxlU2l6ZT1zYW1wbGVTaXplO2xvZGFzaC5zZXQ9c2V0O2xvZGFzaC5zZXRXaXRoPQpzZXRXaXRoO2xvZGFzaC5zaHVmZmxlPXNodWZmbGU7bG9kYXNoLnNsaWNlPXNsaWNlO2xvZGFzaC5zb3J0Qnk9c29ydEJ5O2xvZGFzaC5zb3J0ZWRVbmlxPXNvcnRlZFVuaXE7bG9kYXNoLnNvcnRlZFVuaXFCeT1zb3J0ZWRVbmlxQnk7bG9kYXNoLnNwbGl0PXNwbGl0O2xvZGFzaC5zcHJlYWQ9c3ByZWFkO2xvZGFzaC50YWlsPXRhaWw7bG9kYXNoLnRha2U9dGFrZTtsb2Rhc2gudGFrZVJpZ2h0PXRha2VSaWdodDtsb2Rhc2gudGFrZVJpZ2h0V2hpbGU9dGFrZVJpZ2h0V2hpbGU7bG9kYXNoLnRha2VXaGlsZT10YWtlV2hpbGU7bG9kYXNoLnRhcD10YXA7bG9kYXNoLnRocm90dGxlPXRocm90dGxlO2xvZGFzaC50aHJ1PXRocnU7bG9kYXNoLnRvQXJyYXk9dG9BcnJheTtsb2Rhc2gudG9QYWlycz10b1BhaXJzO2xvZGFzaC50b1BhaXJzSW49dG9QYWlyc0luO2xvZGFzaC50b1BhdGg9dG9QYXRoO2xvZGFzaC50b1BsYWluT2JqZWN0PXRvUGxhaW5PYmplY3Q7bG9kYXNoLnRyYW5zZm9ybT0KdHJhbnNmb3JtO2xvZGFzaC51bmFyeT11bmFyeTtsb2Rhc2gudW5pb249dW5pb247bG9kYXNoLnVuaW9uQnk9dW5pb25CeTtsb2Rhc2gudW5pb25XaXRoPXVuaW9uV2l0aDtsb2Rhc2gudW5pcT11bmlxO2xvZGFzaC51bmlxQnk9dW5pcUJ5O2xvZGFzaC51bmlxV2l0aD11bmlxV2l0aDtsb2Rhc2gudW5zZXQ9dW5zZXQ7bG9kYXNoLnVuemlwPXVuemlwO2xvZGFzaC51bnppcFdpdGg9dW56aXBXaXRoO2xvZGFzaC51cGRhdGU9dXBkYXRlO2xvZGFzaC51cGRhdGVXaXRoPXVwZGF0ZVdpdGg7bG9kYXNoLnZhbHVlcz12YWx1ZXM7bG9kYXNoLnZhbHVlc0luPXZhbHVlc0luO2xvZGFzaC53aXRob3V0PXdpdGhvdXQ7bG9kYXNoLndvcmRzPXdvcmRzO2xvZGFzaC53cmFwPXdyYXA7bG9kYXNoLnhvcj14b3I7bG9kYXNoLnhvckJ5PXhvckJ5O2xvZGFzaC54b3JXaXRoPXhvcldpdGg7bG9kYXNoLnppcD16aXA7bG9kYXNoLnppcE9iamVjdD16aXBPYmplY3Q7bG9kYXNoLnppcE9iamVjdERlZXA9CnppcE9iamVjdERlZXA7bG9kYXNoLnppcFdpdGg9emlwV2l0aDtsb2Rhc2guZW50cmllcz10b1BhaXJzO2xvZGFzaC5lbnRyaWVzSW49dG9QYWlyc0luO2xvZGFzaC5leHRlbmQ9YXNzaWduSW47bG9kYXNoLmV4dGVuZFdpdGg9YXNzaWduSW5XaXRoO21peGluKGxvZGFzaCxsb2Rhc2gpO2xvZGFzaC5hZGQ9YWRkO2xvZGFzaC5hdHRlbXB0PWF0dGVtcHQ7bG9kYXNoLmNhbWVsQ2FzZT1jYW1lbENhc2U7bG9kYXNoLmNhcGl0YWxpemU9Y2FwaXRhbGl6ZTtsb2Rhc2guY2VpbD1jZWlsO2xvZGFzaC5jbGFtcD1jbGFtcDtsb2Rhc2guY2xvbmU9Y2xvbmU7bG9kYXNoLmNsb25lRGVlcD1jbG9uZURlZXA7bG9kYXNoLmNsb25lRGVlcFdpdGg9Y2xvbmVEZWVwV2l0aDtsb2Rhc2guY2xvbmVXaXRoPWNsb25lV2l0aDtsb2Rhc2guY29uZm9ybXNUbz1jb25mb3Jtc1RvO2xvZGFzaC5kZWJ1cnI9ZGVidXJyO2xvZGFzaC5kZWZhdWx0VG89ZGVmYXVsdFRvO2xvZGFzaC5kaXZpZGU9ZGl2aWRlO2xvZGFzaC5lbmRzV2l0aD0KZW5kc1dpdGg7bG9kYXNoLmVxPWVxO2xvZGFzaC5lc2NhcGU9ZXNjYXBlO2xvZGFzaC5lc2NhcGVSZWdFeHA9ZXNjYXBlUmVnRXhwO2xvZGFzaC5ldmVyeT1ldmVyeTtsb2Rhc2guZmluZD1maW5kO2xvZGFzaC5maW5kSW5kZXg9ZmluZEluZGV4O2xvZGFzaC5maW5kS2V5PWZpbmRLZXk7bG9kYXNoLmZpbmRMYXN0PWZpbmRMYXN0O2xvZGFzaC5maW5kTGFzdEluZGV4PWZpbmRMYXN0SW5kZXg7bG9kYXNoLmZpbmRMYXN0S2V5PWZpbmRMYXN0S2V5O2xvZGFzaC5mbG9vcj1mbG9vcjtsb2Rhc2guZm9yRWFjaD1mb3JFYWNoO2xvZGFzaC5mb3JFYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5mb3JJbj1mb3JJbjtsb2Rhc2guZm9ySW5SaWdodD1mb3JJblJpZ2h0O2xvZGFzaC5mb3JPd249Zm9yT3duO2xvZGFzaC5mb3JPd25SaWdodD1mb3JPd25SaWdodDtsb2Rhc2guZ2V0PWdldDtsb2Rhc2guZ3Q9Z3Q7bG9kYXNoLmd0ZT1ndGU7bG9kYXNoLmhhcz1oYXM7bG9kYXNoLmhhc0luPWhhc0luOwpsb2Rhc2guaGVhZD1oZWFkO2xvZGFzaC5pZGVudGl0eT1pZGVudGl0eTtsb2Rhc2guaW5jbHVkZXM9aW5jbHVkZXM7bG9kYXNoLmluZGV4T2Y9aW5kZXhPZjtsb2Rhc2guaW5SYW5nZT1pblJhbmdlO2xvZGFzaC5pbnZva2U9aW52b2tlO2xvZGFzaC5pc0FyZ3VtZW50cz1pc0FyZ3VtZW50cztsb2Rhc2guaXNBcnJheT1pc0FycmF5O2xvZGFzaC5pc0FycmF5QnVmZmVyPWlzQXJyYXlCdWZmZXI7bG9kYXNoLmlzQXJyYXlMaWtlPWlzQXJyYXlMaWtlO2xvZGFzaC5pc0FycmF5TGlrZU9iamVjdD1pc0FycmF5TGlrZU9iamVjdDtsb2Rhc2guaXNCb29sZWFuPWlzQm9vbGVhbjtsb2Rhc2guaXNCdWZmZXI9aXNCdWZmZXI7bG9kYXNoLmlzRGF0ZT1pc0RhdGU7bG9kYXNoLmlzRWxlbWVudD1pc0VsZW1lbnQ7bG9kYXNoLmlzRW1wdHk9aXNFbXB0eTtsb2Rhc2guaXNFcXVhbD1pc0VxdWFsO2xvZGFzaC5pc0VxdWFsV2l0aD1pc0VxdWFsV2l0aDtsb2Rhc2guaXNFcnJvcj1pc0Vycm9yO2xvZGFzaC5pc0Zpbml0ZT0KaXNGaW5pdGU7bG9kYXNoLmlzRnVuY3Rpb249aXNGdW5jdGlvbjtsb2Rhc2guaXNJbnRlZ2VyPWlzSW50ZWdlcjtsb2Rhc2guaXNMZW5ndGg9aXNMZW5ndGg7bG9kYXNoLmlzTWFwPWlzTWFwO2xvZGFzaC5pc01hdGNoPWlzTWF0Y2g7bG9kYXNoLmlzTWF0Y2hXaXRoPWlzTWF0Y2hXaXRoO2xvZGFzaC5pc05hTj1pc05hTjtsb2Rhc2guaXNOYXRpdmU9aXNOYXRpdmU7bG9kYXNoLmlzTmlsPWlzTmlsO2xvZGFzaC5pc051bGw9aXNOdWxsO2xvZGFzaC5pc051bWJlcj1pc051bWJlcjtsb2Rhc2guaXNPYmplY3Q9aXNPYmplY3Q7bG9kYXNoLmlzT2JqZWN0TGlrZT1pc09iamVjdExpa2U7bG9kYXNoLmlzUGxhaW5PYmplY3Q9aXNQbGFpbk9iamVjdDtsb2Rhc2guaXNSZWdFeHA9aXNSZWdFeHA7bG9kYXNoLmlzU2FmZUludGVnZXI9aXNTYWZlSW50ZWdlcjtsb2Rhc2guaXNTZXQ9aXNTZXQ7bG9kYXNoLmlzU3RyaW5nPWlzU3RyaW5nO2xvZGFzaC5pc1N5bWJvbD1pc1N5bWJvbDtsb2Rhc2guaXNUeXBlZEFycmF5PQppc1R5cGVkQXJyYXk7bG9kYXNoLmlzVW5kZWZpbmVkPWlzVW5kZWZpbmVkO2xvZGFzaC5pc1dlYWtNYXA9aXNXZWFrTWFwO2xvZGFzaC5pc1dlYWtTZXQ9aXNXZWFrU2V0O2xvZGFzaC5qb2luPWpvaW47bG9kYXNoLmtlYmFiQ2FzZT1rZWJhYkNhc2U7bG9kYXNoLmxhc3Q9bGFzdDtsb2Rhc2gubGFzdEluZGV4T2Y9bGFzdEluZGV4T2Y7bG9kYXNoLmxvd2VyQ2FzZT1sb3dlckNhc2U7bG9kYXNoLmxvd2VyRmlyc3Q9bG93ZXJGaXJzdDtsb2Rhc2gubHQ9bHQ7bG9kYXNoLmx0ZT1sdGU7bG9kYXNoLm1heD1tYXg7bG9kYXNoLm1heEJ5PW1heEJ5O2xvZGFzaC5tZWFuPW1lYW47bG9kYXNoLm1lYW5CeT1tZWFuQnk7bG9kYXNoLm1pbj1taW47bG9kYXNoLm1pbkJ5PW1pbkJ5O2xvZGFzaC5zdHViQXJyYXk9c3R1YkFycmF5O2xvZGFzaC5zdHViRmFsc2U9c3R1YkZhbHNlO2xvZGFzaC5zdHViT2JqZWN0PXN0dWJPYmplY3Q7bG9kYXNoLnN0dWJTdHJpbmc9c3R1YlN0cmluZztsb2Rhc2guc3R1YlRydWU9CnN0dWJUcnVlO2xvZGFzaC5tdWx0aXBseT1tdWx0aXBseTtsb2Rhc2gubnRoPW50aDtsb2Rhc2gubm9Db25mbGljdD1ub0NvbmZsaWN0O2xvZGFzaC5ub29wPW5vb3A7bG9kYXNoLm5vdz1ub3c7bG9kYXNoLnBhZD1wYWQ7bG9kYXNoLnBhZEVuZD1wYWRFbmQ7bG9kYXNoLnBhZFN0YXJ0PXBhZFN0YXJ0O2xvZGFzaC5wYXJzZUludD1wYXJzZUludDtsb2Rhc2gucmFuZG9tPXJhbmRvbTtsb2Rhc2gucmVkdWNlPXJlZHVjZTtsb2Rhc2gucmVkdWNlUmlnaHQ9cmVkdWNlUmlnaHQ7bG9kYXNoLnJlcGVhdD1yZXBlYXQ7bG9kYXNoLnJlcGxhY2U9cmVwbGFjZTtsb2Rhc2gucmVzdWx0PXJlc3VsdDtsb2Rhc2gucm91bmQ9cm91bmQ7bG9kYXNoLnJ1bkluQ29udGV4dD1ydW5JbkNvbnRleHQ7bG9kYXNoLnNhbXBsZT1zYW1wbGU7bG9kYXNoLnNpemU9c2l6ZTtsb2Rhc2guc25ha2VDYXNlPXNuYWtlQ2FzZTtsb2Rhc2guc29tZT1zb21lO2xvZGFzaC5zb3J0ZWRJbmRleD1zb3J0ZWRJbmRleDtsb2Rhc2guc29ydGVkSW5kZXhCeT0Kc29ydGVkSW5kZXhCeTtsb2Rhc2guc29ydGVkSW5kZXhPZj1zb3J0ZWRJbmRleE9mO2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXg9c29ydGVkTGFzdEluZGV4O2xvZGFzaC5zb3J0ZWRMYXN0SW5kZXhCeT1zb3J0ZWRMYXN0SW5kZXhCeTtsb2Rhc2guc29ydGVkTGFzdEluZGV4T2Y9c29ydGVkTGFzdEluZGV4T2Y7bG9kYXNoLnN0YXJ0Q2FzZT1zdGFydENhc2U7bG9kYXNoLnN0YXJ0c1dpdGg9c3RhcnRzV2l0aDtsb2Rhc2guc3VidHJhY3Q9c3VidHJhY3Q7bG9kYXNoLnN1bT1zdW07bG9kYXNoLnN1bUJ5PXN1bUJ5O2xvZGFzaC50ZW1wbGF0ZT10ZW1wbGF0ZTtsb2Rhc2gudGltZXM9dGltZXM7bG9kYXNoLnRvRmluaXRlPXRvRmluaXRlO2xvZGFzaC50b0ludGVnZXI9dG9JbnRlZ2VyO2xvZGFzaC50b0xlbmd0aD10b0xlbmd0aDtsb2Rhc2gudG9Mb3dlcj10b0xvd2VyO2xvZGFzaC50b051bWJlcj10b051bWJlcjtsb2Rhc2gudG9TYWZlSW50ZWdlcj10b1NhZmVJbnRlZ2VyO2xvZGFzaC50b1N0cmluZz0KdG9TdHJpbmc7bG9kYXNoLnRvVXBwZXI9dG9VcHBlcjtsb2Rhc2gudHJpbT10cmltO2xvZGFzaC50cmltRW5kPXRyaW1FbmQ7bG9kYXNoLnRyaW1TdGFydD10cmltU3RhcnQ7bG9kYXNoLnRydW5jYXRlPXRydW5jYXRlO2xvZGFzaC51bmVzY2FwZT11bmVzY2FwZTtsb2Rhc2gudW5pcXVlSWQ9dW5pcXVlSWQ7bG9kYXNoLnVwcGVyQ2FzZT11cHBlckNhc2U7bG9kYXNoLnVwcGVyRmlyc3Q9dXBwZXJGaXJzdDtsb2Rhc2guZWFjaD1mb3JFYWNoO2xvZGFzaC5lYWNoUmlnaHQ9Zm9yRWFjaFJpZ2h0O2xvZGFzaC5maXJzdD1oZWFkO21peGluKGxvZGFzaCxmdW5jdGlvbigpe3ZhciBzb3VyY2U9e307YmFzZUZvck93bihsb2Rhc2gsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXtpZighaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLG1ldGhvZE5hbWUpKXNvdXJjZVttZXRob2ROYW1lXT1mdW5jfSk7cmV0dXJuIHNvdXJjZX0oKSx7ImNoYWluIjpmYWxzZX0pO2xvZGFzaC5WRVJTSU9OPQpWRVJTSU9OO2FycmF5RWFjaChbImJpbmQiLCJiaW5kS2V5IiwiY3VycnkiLCJjdXJyeVJpZ2h0IiwicGFydGlhbCIsInBhcnRpYWxSaWdodCJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUpe2xvZGFzaFttZXRob2ROYW1lXS5wbGFjZWhvbGRlcj1sb2Rhc2h9KTthcnJheUVhY2goWyJkcm9wIiwidGFrZSJdLGZ1bmN0aW9uKG1ldGhvZE5hbWUsaW5kZXgpe0xhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXT1mdW5jdGlvbihuKXtuPW49PT11bmRlZmluZWQ/MTpuYXRpdmVNYXgodG9JbnRlZ2VyKG4pLDApO3ZhciByZXN1bHQ9dGhpcy5fX2ZpbHRlcmVkX18mJiFpbmRleD9uZXcgTGF6eVdyYXBwZXIodGhpcyk6dGhpcy5jbG9uZSgpO2lmKHJlc3VsdC5fX2ZpbHRlcmVkX18pcmVzdWx0Ll9fdGFrZUNvdW50X189bmF0aXZlTWluKG4scmVzdWx0Ll9fdGFrZUNvdW50X18pO2Vsc2UgcmVzdWx0Ll9fdmlld3NfXy5wdXNoKHsic2l6ZSI6bmF0aXZlTWluKG4sTUFYX0FSUkFZX0xFTkdUSCksCiJ0eXBlIjptZXRob2ROYW1lKyhyZXN1bHQuX19kaXJfXzwwPyJSaWdodCI6IiIpfSk7cmV0dXJuIHJlc3VsdH07TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWUrIlJpZ2h0Il09ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMucmV2ZXJzZSgpW21ldGhvZE5hbWVdKG4pLnJldmVyc2UoKX19KTthcnJheUVhY2goWyJmaWx0ZXIiLCJtYXAiLCJ0YWtlV2hpbGUiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgdHlwZT1pbmRleCsxLGlzRmlsdGVyPXR5cGU9PUxBWllfRklMVEVSX0ZMQUd8fHR5cGU9PUxBWllfV0hJTEVfRkxBRztMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oaXRlcmF0ZWUpe3ZhciByZXN1bHQ9dGhpcy5jbG9uZSgpO3Jlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goeyJpdGVyYXRlZSI6Z2V0SXRlcmF0ZWUoaXRlcmF0ZWUsMyksInR5cGUiOnR5cGV9KTtyZXN1bHQuX19maWx0ZXJlZF9fPXJlc3VsdC5fX2ZpbHRlcmVkX198fAppc0ZpbHRlcjtyZXR1cm4gcmVzdWx0fX0pO2FycmF5RWFjaChbImhlYWQiLCJsYXN0Il0sZnVuY3Rpb24obWV0aG9kTmFtZSxpbmRleCl7dmFyIHRha2VOYW1lPSJ0YWtlIisoaW5kZXg/IlJpZ2h0IjoiIik7TGF6eVdyYXBwZXIucHJvdG90eXBlW21ldGhvZE5hbWVdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF19fSk7YXJyYXlFYWNoKFsiaW5pdGlhbCIsInRhaWwiXSxmdW5jdGlvbihtZXRob2ROYW1lLGluZGV4KXt2YXIgZHJvcE5hbWU9ImRyb3AiKyhpbmRleD8iIjoiUmlnaHQiKTtMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18/bmV3IExhenlXcmFwcGVyKHRoaXMpOnRoaXNbZHJvcE5hbWVdKDEpfX0pO0xhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyKGlkZW50aXR5KX07TGF6eVdyYXBwZXIucHJvdG90eXBlLmZpbmQ9CmZ1bmN0aW9uKHByZWRpY2F0ZSl7cmV0dXJuIHRoaXMuZmlsdGVyKHByZWRpY2F0ZSkuaGVhZCgpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuZmluZExhc3Q9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZChwcmVkaWNhdGUpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUuaW52b2tlTWFwPWJhc2VSZXN0KGZ1bmN0aW9uKHBhdGgsYXJncyl7aWYodHlwZW9mIHBhdGg9PSJmdW5jdGlvbiIpcmV0dXJuIG5ldyBMYXp5V3JhcHBlcih0aGlzKTtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odmFsdWUpe3JldHVybiBiYXNlSW52b2tlKHZhbHVlLHBhdGgsYXJncyl9KX0pO0xhenlXcmFwcGVyLnByb3RvdHlwZS5yZWplY3Q9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5maWx0ZXIobmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKX07TGF6eVdyYXBwZXIucHJvdG90eXBlLnNsaWNlPWZ1bmN0aW9uKHN0YXJ0LGVuZCl7c3RhcnQ9dG9JbnRlZ2VyKHN0YXJ0KTsKdmFyIHJlc3VsdD10aGlzO2lmKHJlc3VsdC5fX2ZpbHRlcmVkX18mJihzdGFydD4wfHxlbmQ8MCkpcmV0dXJuIG5ldyBMYXp5V3JhcHBlcihyZXN1bHQpO2lmKHN0YXJ0PDApcmVzdWx0PXJlc3VsdC50YWtlUmlnaHQoLXN0YXJ0KTtlbHNlIGlmKHN0YXJ0KXJlc3VsdD1yZXN1bHQuZHJvcChzdGFydCk7aWYoZW5kIT09dW5kZWZpbmVkKXtlbmQ9dG9JbnRlZ2VyKGVuZCk7cmVzdWx0PWVuZDwwP3Jlc3VsdC5kcm9wUmlnaHQoLWVuZCk6cmVzdWx0LnRha2UoZW5kLXN0YXJ0KX1yZXR1cm4gcmVzdWx0fTtMYXp5V3JhcHBlci5wcm90b3R5cGUudGFrZVJpZ2h0V2hpbGU9ZnVuY3Rpb24ocHJlZGljYXRlKXtyZXR1cm4gdGhpcy5yZXZlcnNlKCkudGFrZVdoaWxlKHByZWRpY2F0ZSkucmV2ZXJzZSgpfTtMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRha2UoTUFYX0FSUkFZX0xFTkdUSCl9O2Jhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLApmdW5jdGlvbihmdW5jLG1ldGhvZE5hbWUpe3ZhciBjaGVja0l0ZXJhdGVlPS9eKD86ZmlsdGVyfGZpbmR8bWFwfHJlamVjdCl8V2hpbGUkLy50ZXN0KG1ldGhvZE5hbWUpLGlzVGFrZXI9L14oPzpoZWFkfGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSxsb2Rhc2hGdW5jPWxvZGFzaFtpc1Rha2VyPyJ0YWtlIisobWV0aG9kTmFtZT09Imxhc3QiPyJSaWdodCI6IiIpOm1ldGhvZE5hbWVdLHJldFVud3JhcHBlZD1pc1Rha2VyfHwvXmZpbmQvLnRlc3QobWV0aG9kTmFtZSk7aWYoIWxvZGFzaEZ1bmMpcmV0dXJuO2xvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgdmFsdWU9dGhpcy5fX3dyYXBwZWRfXyxhcmdzPWlzVGFrZXI/WzFdOmFyZ3VtZW50cyxpc0xhenk9dmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcixpdGVyYXRlZT1hcmdzWzBdLHVzZUxhenk9aXNMYXp5fHxpc0FycmF5KHZhbHVlKTt2YXIgaW50ZXJjZXB0b3I9ZnVuY3Rpb24odmFsdWUpe3ZhciByZXN1bHQ9CmxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLGFycmF5UHVzaChbdmFsdWVdLGFyZ3MpKTtyZXR1cm4gaXNUYWtlciYmY2hhaW5BbGw/cmVzdWx0WzBdOnJlc3VsdH07aWYodXNlTGF6eSYmY2hlY2tJdGVyYXRlZSYmdHlwZW9mIGl0ZXJhdGVlPT0iZnVuY3Rpb24iJiZpdGVyYXRlZS5sZW5ndGghPTEpaXNMYXp5PXVzZUxhenk9ZmFsc2U7dmFyIGNoYWluQWxsPXRoaXMuX19jaGFpbl9fLGlzSHlicmlkPSEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsaXNVbndyYXBwZWQ9cmV0VW53cmFwcGVkJiYhY2hhaW5BbGwsb25seUxhenk9aXNMYXp5JiYhaXNIeWJyaWQ7aWYoIXJldFVud3JhcHBlZCYmdXNlTGF6eSl7dmFsdWU9b25seUxhenk/dmFsdWU6bmV3IExhenlXcmFwcGVyKHRoaXMpO3ZhciByZXN1bHQ9ZnVuYy5hcHBseSh2YWx1ZSxhcmdzKTtyZXN1bHQuX19hY3Rpb25zX18ucHVzaCh7ImZ1bmMiOnRocnUsImFyZ3MiOltpbnRlcmNlcHRvcl0sInRoaXNBcmciOnVuZGVmaW5lZH0pO3JldHVybiBuZXcgTG9kYXNoV3JhcHBlcihyZXN1bHQsCmNoYWluQWxsKX1pZihpc1Vud3JhcHBlZCYmb25seUxhenkpcmV0dXJuIGZ1bmMuYXBwbHkodGhpcyxhcmdzKTtyZXN1bHQ9dGhpcy50aHJ1KGludGVyY2VwdG9yKTtyZXR1cm4gaXNVbndyYXBwZWQ/aXNUYWtlcj9yZXN1bHQudmFsdWUoKVswXTpyZXN1bHQudmFsdWUoKTpyZXN1bHR9fSk7YXJyYXlFYWNoKFsicG9wIiwicHVzaCIsInNoaWZ0Iiwic29ydCIsInNwbGljZSIsInVuc2hpZnQiXSxmdW5jdGlvbihtZXRob2ROYW1lKXt2YXIgZnVuYz1hcnJheVByb3RvW21ldGhvZE5hbWVdLGNoYWluTmFtZT0vXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSk/InRhcCI6InRocnUiLHJldFVud3JhcHBlZD0vXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpO2xvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV09ZnVuY3Rpb24oKXt2YXIgYXJncz1hcmd1bWVudHM7aWYocmV0VW53cmFwcGVkJiYhdGhpcy5fX2NoYWluX18pe3ZhciB2YWx1ZT10aGlzLnZhbHVlKCk7CnJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpP3ZhbHVlOltdLGFyZ3MpfXJldHVybiB0aGlzW2NoYWluTmFtZV0oZnVuY3Rpb24odmFsdWUpe3JldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpP3ZhbHVlOltdLGFyZ3MpfSl9fSk7YmFzZUZvck93bihMYXp5V3JhcHBlci5wcm90b3R5cGUsZnVuY3Rpb24oZnVuYyxtZXRob2ROYW1lKXt2YXIgbG9kYXNoRnVuYz1sb2Rhc2hbbWV0aG9kTmFtZV07aWYobG9kYXNoRnVuYyl7dmFyIGtleT1sb2Rhc2hGdW5jLm5hbWUrIiIsbmFtZXM9cmVhbE5hbWVzW2tleV18fChyZWFsTmFtZXNba2V5XT1bXSk7bmFtZXMucHVzaCh7Im5hbWUiOm1ldGhvZE5hbWUsImZ1bmMiOmxvZGFzaEZ1bmN9KX19KTtyZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCxXUkFQX0JJTkRfS0VZX0ZMQUcpLm5hbWVdPVt7Im5hbWUiOiJ3cmFwcGVyIiwiZnVuYyI6dW5kZWZpbmVkfV07TGF6eVdyYXBwZXIucHJvdG90eXBlLmNsb25lPWxhenlDbG9uZTsKTGF6eVdyYXBwZXIucHJvdG90eXBlLnJldmVyc2U9bGF6eVJldmVyc2U7TGF6eVdyYXBwZXIucHJvdG90eXBlLnZhbHVlPWxhenlWYWx1ZTtsb2Rhc2gucHJvdG90eXBlLmF0PXdyYXBwZXJBdDtsb2Rhc2gucHJvdG90eXBlLmNoYWluPXdyYXBwZXJDaGFpbjtsb2Rhc2gucHJvdG90eXBlLmNvbW1pdD13cmFwcGVyQ29tbWl0O2xvZGFzaC5wcm90b3R5cGUubmV4dD13cmFwcGVyTmV4dDtsb2Rhc2gucHJvdG90eXBlLnBsYW50PXdyYXBwZXJQbGFudDtsb2Rhc2gucHJvdG90eXBlLnJldmVyc2U9d3JhcHBlclJldmVyc2U7bG9kYXNoLnByb3RvdHlwZS50b0pTT049bG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mPWxvZGFzaC5wcm90b3R5cGUudmFsdWU9d3JhcHBlclZhbHVlO2xvZGFzaC5wcm90b3R5cGUuZmlyc3Q9bG9kYXNoLnByb3RvdHlwZS5oZWFkO2lmKHN5bUl0ZXJhdG9yKWxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdPXdyYXBwZXJUb0l0ZXJhdG9yO3JldHVybiBsb2Rhc2h9Owp2YXIgXz1ydW5JbkNvbnRleHQoKTtpZih0eXBlb2YgZGVmaW5lPT0iZnVuY3Rpb24iJiZ0eXBlb2YgZGVmaW5lLmFtZD09Im9iamVjdCImJmRlZmluZS5hbWQpe3Jvb3QuXz1fO2RlZmluZShmdW5jdGlvbigpe3JldHVybiBffSl9ZWxzZSBpZihmcmVlTW9kdWxlKXsoZnJlZU1vZHVsZS5leHBvcnRzPV8pLl89XztmcmVlRXhwb3J0cy5fPV99ZWxzZSByb290Ll89X30pLmNhbGwodGhpcyk7Ci8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1zb3J0aW5nL3NvcnRpbmcuanMKdmFyIHJjOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChrLHQpe2xldCBsOyhmdW5jdGlvbihtKXttW20uTkFUVVJBTD0wXT0iTkFUVVJBTCI7bVttLlJFQUw9MV09IlJFQUwiO21bbS5FWFBPTkVOVF9TSUdOPTJdPSJFWFBPTkVOVF9TSUdOIjttW20uRVhQT05FTlQ9M109IkVYUE9ORU5UIn0pKGx8fChsPXt9KSk7bGV0IHA9bC5OQVRVUkFMO2Zvcig7dDxrLmxlbmd0aDt0KyspaWYocD09PWwuTkFUVVJBTClpZigiLiI9PT1rW3RdKXA9bC5SRUFMO2Vsc2UgaWYoImUiPT09a1t0XXx8IkUiPT09a1t0XSlwPWwuRVhQT05FTlRfU0lHTjtlbHNle2lmKCFmKGtbdF0pKWJyZWFrfWVsc2UgaWYocD09PWwuUkVBTClpZigiZSI9PT1rW3RdfHwiRSI9PT1rW3RdKXA9bC5FWFBPTkVOVF9TSUdOO2Vsc2V7aWYoIWYoa1t0XSkpYnJlYWt9ZWxzZSBpZihwPT09bC5FWFBPTkVOVF9TSUdOKWlmKGYoa1t0XSl8fCIrIj09PWtbdF18fCItIj09PWtbdF0pcD1sLkVYUE9ORU5UO2Vsc2UgYnJlYWs7ZWxzZSBpZihwPT09bC5FWFBPTkVOVCYmCiFmKGtbdF0pKWJyZWFrO3JldHVybiB0fWZ1bmN0aW9uIGYoayl7cmV0dXJuIjAiPD1rJiYiOSI+PWt9ZnVuY3Rpb24gaChrKXtyZXR1cm4iLyI9PT1rfHwiXyI9PT1rfHxmKGspfWIuY29tcGFyZVRhZ05hbWVzPWZ1bmN0aW9uKGssdCl7bGV0IGw9MCxwPTA7Zm9yKDs7KXtpZihsPT09ay5sZW5ndGgpcmV0dXJuIHA9PT10Lmxlbmd0aD8wOi0xO2lmKHA9PT10Lmxlbmd0aClyZXR1cm4gMTtpZihmKGtbbF0pJiZmKHRbcF0pKXt2YXIgbT1sLG49cDtsPWQoayxsKzEpO3A9ZCh0LHArMSk7bT1wYXJzZUZsb2F0KGsuc2xpY2UobSxsKSk7bj1wYXJzZUZsb2F0KHQuc2xpY2UobixwKSk7aWYobTxuKXJldHVybi0xO2lmKG0+bilyZXR1cm4gMX1lbHNle2lmKGgoa1tsXSkpe2lmKCFoKHRbcF0pKXJldHVybi0xfWVsc2V7aWYoaCh0W3BdKSlyZXR1cm4gMTtpZihrW2xdPHRbcF0pcmV0dXJuLTE7aWYoa1tsXT50W3BdKXJldHVybiAxfWwrKztwKyt9fX19KShyY3x8KHJjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9yZXF1ZXN0TWFuYWdlci5qcwp2YXIgdmM7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHEsdSx4LEEpe2NvbnN0IHk9bmV3IFhNTEh0dHBSZXF1ZXN0O3kub3BlbihxLHUpO3gmJih5LndpdGhDcmVkZW50aWFscz14KTtBJiZ5LnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsQSk7cmV0dXJuIHl9ZnVuY3Rpb24gZihxKXtjb25zdCB1PW5ldyBtO2lmKCFxKXJldHVybiB1Lm1ldGhvZFR5cGU9cC5HRVQsdTt1Lm1ldGhvZFR5cGU9cC5QT1NUO3UuYm9keT1oKHEpO3JldHVybiB1fWZ1bmN0aW9uIGgocSl7Y29uc3QgdT1uZXcgRm9ybURhdGE7Zm9yKGxldCB4IGluIHEpeCYmdS5hcHBlbmQoeCxxW3hdKTtyZXR1cm4gdX1jbGFzcyBrIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMubmFtZT0iUmVxdWVzdENhbmNlbGxhdGlvbkVycm9yIn19Yi5SZXF1ZXN0Q2FuY2VsbGF0aW9uRXJyb3I9aztjbGFzcyB0IGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IocSl7c3VwZXIocSk7dGhpcy5uYW1lPQoiSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3IiO09iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLHQucHJvdG90eXBlKX19Yi5JbnZhbGlkUmVxdWVzdE9wdGlvbnNFcnJvcj10O2NsYXNzIGwgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihxLHUpe3N1cGVyKCk7dGhpcy5tZXNzYWdlPWBSZXF1ZXN0TmV0d29ya0Vycm9yOiAke3Euc3RhdHVzfSBhdCAke3V9YDt0aGlzLm5hbWU9IlJlcXVlc3ROZXR3b3JrRXJyb3IiO3RoaXMucmVxPXE7dGhpcy51cmw9dX19Yi5SZXF1ZXN0TmV0d29ya0Vycm9yPWw7bGV0IHA7KGZ1bmN0aW9uKHEpe3EuR0VUPSJHRVQiO3EuUE9TVD0iUE9TVCJ9KShwPWIuSHR0cE1ldGhvZFR5cGV8fChiLkh0dHBNZXRob2RUeXBlPXt9KSk7Y2xhc3MgbXt2YWxpZGF0ZSgpe2lmKHRoaXMubWV0aG9kVHlwZT09PXAuR0VUJiZ0aGlzLmJvZHkpdGhyb3cgbmV3IHQoImJvZHkgbXVzdCBiZSBtaXNzaW5nIGZvciBhIEdFVCByZXF1ZXN0LiIpO319Yi5SZXF1ZXN0T3B0aW9ucz0KbTtjbGFzcyBue2NvbnN0cnVjdG9yKHE9MUUzLHU9Myl7dGhpcy5fcXVldWU9W107dGhpcy5fbkFjdGl2ZVJlcXVlc3RzPTA7dGhpcy5fblNpbXVsdGFuZW91c1JlcXVlc3RzPXE7dGhpcy5fbWF4UmV0cmllcz11fXJlcXVlc3QocSx1KXt1PWYodSk7cmV0dXJuIHRoaXMucmVxdWVzdFdpdGhPcHRpb25zKHEsdSl9cmVxdWVzdFdpdGhPcHRpb25zKHEsdSl7dS52YWxpZGF0ZSgpO3JldHVybihuZXcgUHJvbWlzZSgoeCxBKT0+e3RoaXMuX3F1ZXVlLnB1c2goe3Jlc29sdmU6eCxyZWplY3Q6QX0pO3RoaXMubGF1bmNoUmVxdWVzdHMoKX0pKS50aGVuKCgpPT50aGlzLnByb21pc2VXaXRoUmV0cmllcyhxLHRoaXMuX21heFJldHJpZXMsdSkpLnRoZW4oeD0+e3RoaXMuX25BY3RpdmVSZXF1ZXN0cy0tO3RoaXMubGF1bmNoUmVxdWVzdHMoKTtyZXR1cm4geH0seD0+eyJSZXF1ZXN0TmV0d29ya0Vycm9yIj09PXgubmFtZSYmKHRoaXMuX25BY3RpdmVSZXF1ZXN0cy0tLHRoaXMubGF1bmNoUmVxdWVzdHMoKSk7CnJldHVybiBQcm9taXNlLnJlamVjdCh4KX0pfWZldGNoKHEsdSl7cmV0dXJuKG5ldyBQcm9taXNlKCh4LEEpPT57dGhpcy5fcXVldWUucHVzaCh7cmVzb2x2ZTp4LHJlamVjdDpBfSk7dGhpcy5sYXVuY2hSZXF1ZXN0cygpfSkpLnRoZW4oKCk9PntsZXQgeD0xO3JldHVybiBuZXcgUHJvbWlzZShBPT57Y29uc3QgeT0oKT0+e2ZldGNoKHEsdSkudGhlbih3PT57IXcub2smJnRoaXMuX21heFJldHJpZXM+eD8oeCsrLHkoKSk6KEEodyksdGhpcy5fbkFjdGl2ZVJlcXVlc3RzLS0sdGhpcy5sYXVuY2hSZXF1ZXN0cygpKX0pfTt5KCl9KX0pfWNsZWFyUXVldWUoKXtmb3IoOzA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9xdWV1ZS5wb3AoKS5yZWplY3QobmV3IGsoIlJlcXVlc3QgY2FuY2VsbGVkIGJ5IGNsZWFyUXVldWUiKSl9YWN0aXZlUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzfW91dHN0YW5kaW5nUmVxdWVzdHMoKXtyZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzKwp0aGlzLl9xdWV1ZS5sZW5ndGh9bGF1bmNoUmVxdWVzdHMoKXtmb3IoO3RoaXMuX25BY3RpdmVSZXF1ZXN0czx0aGlzLl9uU2ltdWx0YW5lb3VzUmVxdWVzdHMmJjA8dGhpcy5fcXVldWUubGVuZ3RoOyl0aGlzLl9uQWN0aXZlUmVxdWVzdHMrKyx0aGlzLl9xdWV1ZS5wb3AoKS5yZXNvbHZlKCl9cHJvbWlzZVdpdGhSZXRyaWVzKHEsdSx4KXtyZXR1cm4gdGhpcy5fcHJvbWlzZUZyb21VcmwocSx4KS50aGVuKEE9PkEsQT0+MDx1P3RoaXMucHJvbWlzZVdpdGhSZXRyaWVzKHEsdS0xLHgpOlByb21pc2UucmVqZWN0KEEpKX1fcHJvbWlzZUZyb21VcmwocSx1KXtyZXR1cm4gbmV3IFByb21pc2UoKHgsQSk9Pntjb25zdCB5PWQodS5tZXRob2RUeXBlLHEsdS53aXRoQ3JlZGVudGlhbHMsdS5jb250ZW50VHlwZSk7eS5vbmxvYWQ9ZnVuY3Rpb24oKXsyMDA9PT15LnN0YXR1cz94KEpTT04ucGFyc2UoeS5yZXNwb25zZVRleHQpKTpBKG5ldyBsKHkscSkpfTt5Lm9uZXJyb3I9ZnVuY3Rpb24oKXtBKG5ldyBsKHksCnEpKX07dS5ib2R5P3kuc2VuZCh1LmJvZHkpOnkuc2VuZCgpfSl9fWIuUmVxdWVzdE1hbmFnZXI9bn0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL3VybFBhdGhIZWxwZXJzLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYpe3JldHVybiBlbmNvZGVVUklDb21wb25lbnQoZikucmVwbGFjZSgvXCgvZywiJTI4IikucmVwbGFjZSgvXCkvZywiJTI5Iil9Yi5hZGRQYXJhbXM9ZnVuY3Rpb24oZixoKXt2YXIgaz1PYmplY3Qua2V5cyhoKS5zb3J0KCkuZmlsdGVyKGw9PnZvaWQgMCE9PWhbbF0pO2lmKCFrLmxlbmd0aClyZXR1cm4gZjtjb25zdCB0PS0xIT09Zi5pbmRleE9mKCI/Iik/Ilx4MjYiOiI/IjtrPVtdLmNvbmNhdCguLi5rLm1hcChsPT57Y29uc3QgcD1oW2xdO3JldHVybihBcnJheS5pc0FycmF5KHApP3A6W3BdKS5tYXAobT0+YCR7bH09JHtkKG0pfWApfSkpLmpvaW4oIlx4MjYiKTtyZXR1cm4gZit0K2t9fSkodmN8fCh2Yz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvcm91dGVyLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKHQ9ImRhdGEiLGw9bmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSl7Ii8iPT09dFt0Lmxlbmd0aC0xXSYmKHQ9dC5zbGljZSgwLHQubGVuZ3RoLTEpKTtyZXR1cm57ZW52aXJvbm1lbnQ6KCk9PmYodCwiL2Vudmlyb25tZW50IiksZXhwZXJpbWVudHM6KCk9PmYodCwiL2V4cGVyaW1lbnRzIikscGx1Z2luUm91dGU6KHAsbSxuKT0+Zih0KyIvcGx1Z2luIixgLyR7cH0ke219YCxuKSxwbHVnaW5zTGlzdGluZzooKT0+Zih0LCIvcGx1Z2luc19saXN0aW5nIixoKHtbImV4cGVyaW1lbnRhbFBsdWdpbiJdOmwuZ2V0QWxsKCJleHBlcmltZW50YWxQbHVnaW4iKX0pKSxydW5zOigpPT5mKHQsIi9ydW5zIikscnVuc0ZvckV4cGVyaW1lbnQ6cD0+Zih0LCIvZXhwZXJpbWVudF9ydW5zIixoKHtleHBlcmltZW50OlN0cmluZyhwKX0pKX19ZnVuY3Rpb24gZih0LGwscD1uZXcgVVJMU2VhcmNoUGFyYW1zKXt0Kz1sO1N0cmluZyhwKSYmCihsPWwuaW5jbHVkZXMoIj8iKT8iXHgyNiI6Ij8iLHQrPWwrU3RyaW5nKHApKTtyZXR1cm4gdH1mdW5jdGlvbiBoKHQ9e30pe2NvbnN0IGw9T2JqZWN0LmtleXModCkuc29ydCgpLmZpbHRlcihtPT50W21dKSxwPW5ldyBVUkxTZWFyY2hQYXJhbXM7bC5mb3JFYWNoKG09Pntjb25zdCBuPXRbbV07KEFycmF5LmlzQXJyYXkobik/bjpbbl0pLmZvckVhY2gocT0+cC5hcHBlbmQobSxxKSl9KTtyZXR1cm4gcH1sZXQgaz1kKCk7Yi5jcmVhdGVSb3V0ZXI9ZDtiLmdldFJvdXRlcj1mdW5jdGlvbigpe3JldHVybiBrfTtiLnNldFJvdXRlcj1mdW5jdGlvbih0KXtpZihudWxsPT10KXRocm93IEVycm9yKCJSb3V0ZXIgcmVxdWlyZWQsIGJ1dCBnb3Q6ICIrdCk7az10fTtiLmNyZWF0ZVNlYXJjaFBhcmFtPWh9KSh2Y3x8KHZjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9iYXNlU3RvcmUuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGR7Y29uc3RydWN0b3IoaCl7dGhpcy5saXN0ZW5lcj1ofX1iLkxpc3RlbktleT1kO2NsYXNzIGZ7Y29uc3RydWN0b3IoKXt0aGlzLnJlcXVlc3RNYW5hZ2VyPW5ldyBiLlJlcXVlc3RNYW5hZ2VyKDEpO3RoaXMuX2xpc3RlbmVycz1uZXcgU2V0O3RoaXMuaW5pdGlhbGl6ZWQ9ITF9cmVmcmVzaCgpe3JldHVybiB0aGlzLmxvYWQoKS50aGVuKCgpPT57dGhpcy5pbml0aWFsaXplZD0hMH0pfWFkZExpc3RlbmVyKGgpe2g9bmV3IGQoaCk7dGhpcy5fbGlzdGVuZXJzLmFkZChoKTtyZXR1cm4gaH1yZW1vdmVMaXN0ZW5lckJ5S2V5KGgpe3RoaXMuX2xpc3RlbmVycy5kZWxldGUoaCl9ZW1pdENoYW5nZSgpe3RoaXMuX2xpc3RlbmVycy5mb3JFYWNoKGg9Pnt0cnl7aC5saXN0ZW5lcigpfWNhdGNoKGspe319KX19Yi5CYXNlU3RvcmU9Zn0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2Vudmlyb25tZW50U3RvcmUuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGQgZXh0ZW5kcyBiLkJhc2VTdG9yZXtsb2FkKCl7Y29uc3QgZj1iLmdldFJvdXRlcigpLmVudmlyb25tZW50KCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKGg9Pntjb25zdCBrPXtkYXRhTG9jYXRpb246aC5kYXRhX2xvY2F0aW9uLHdpbmRvd1RpdGxlOmgud2luZG93X3RpdGxlfTt2b2lkIDAhPT1oLmV4cGVyaW1lbnRfbmFtZSYmKGsuZXhwZXJpbWVudE5hbWU9aC5leHBlcmltZW50X25hbWUpO3ZvaWQgMCE9PWguZXhwZXJpbWVudF9kZXNjcmlwdGlvbiYmKGsuZXhwZXJpbWVudERlc2NyaXB0aW9uPWguZXhwZXJpbWVudF9kZXNjcmlwdGlvbik7dm9pZCAwIT09aC5jcmVhdGlvbl90aW1lJiYoay5jcmVhdGlvblRpbWU9aC5jcmVhdGlvbl90aW1lKTtfLmlzRXF1YWwodGhpcy5lbnZpcm9ubWVudCxrKXx8KHRoaXMuZW52aXJvbm1lbnQ9ayx0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXREYXRhTG9jYXRpb24oKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD8KdGhpcy5lbnZpcm9ubWVudC5kYXRhTG9jYXRpb246IiJ9Z2V0V2luZG93VGl0bGUoKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LndpbmRvd1RpdGxlOiIifWdldEV4cGVyaW1lbnROYW1lKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC5leHBlcmltZW50TmFtZToiIn1nZXRFeHBlcmltZW50RGVzY3JpcHRpb24oKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmV4cGVyaW1lbnREZXNjcmlwdGlvbjoiIn1nZXRDcmVhdGlvblRpbWUoKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmNyZWF0aW9uVGltZTpudWxsfX1iLkVudmlyb25tZW50U3RvcmU9ZDtiLmVudmlyb25tZW50U3RvcmU9bmV3IGR9KSh2Y3x8KHZjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9leHBlcmltZW50c1N0b3JlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgYi5CYXNlU3RvcmV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMuX2V4cGVyaW1lbnRzPVtdfWxvYWQoKXtjb25zdCBmPWIuZ2V0Um91dGVyKCkuZXhwZXJpbWVudHMoKTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGYpLnRoZW4oaD0+e18uaXNFcXVhbCh0aGlzLl9leHBlcmltZW50cyxoKXx8KHRoaXMuX2V4cGVyaW1lbnRzPWgsdGhpcy5lbWl0Q2hhbmdlKCkpfSl9Z2V0RXhwZXJpbWVudHMoKXtyZXR1cm4gdGhpcy5fZXhwZXJpbWVudHMuc2xpY2UoKX19Yi5FeHBlcmltZW50c1N0b3JlPWQ7Yi5leHBlcmltZW50c1N0b3JlPW5ldyBkfSkodmN8fCh2Yz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWJhY2tlbmQvcnVuc1N0b3JlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgYi5CYXNlU3RvcmV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO3RoaXMuX3J1bnM9W119bG9hZCgpe2NvbnN0IGY9Yi5nZXRSb3V0ZXIoKS5ydW5zKCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKGg9PntfLmlzRXF1YWwodGhpcy5fcnVucyxoKXx8KHRoaXMuX3J1bnM9aCx0aGlzLmVtaXRDaGFuZ2UoKSl9KX1nZXRSdW5zKCl7cmV0dXJuIHRoaXMuX3J1bnMuc2xpY2UoKX19Yi5SdW5zU3RvcmU9ZDtiLnJ1bnNTdG9yZT1uZXcgZH0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL2JhY2tlbmQuanMKKGZ1bmN0aW9uKGIpe2IuVFlQRVM9W107Yi5nZXRSdW5zTmFtZWQ9ZnVuY3Rpb24oZCl7cmV0dXJuIF8ua2V5cyhkKS5zb3J0KHJjLmNvbXBhcmVUYWdOYW1lcyl9O2IuZ2V0VGFncz1mdW5jdGlvbihkKXtyZXR1cm4gXy51bmlvbi5hcHBseShudWxsLF8udmFsdWVzKGQpKS5zb3J0KHJjLmNvbXBhcmVUYWdOYW1lcyl9O2IuZmlsdGVyVGFncz1mdW5jdGlvbihkLGYpe2xldCBoPVtdO2YuZm9yRWFjaChrPT5oPWguY29uY2F0KGRba10pKTtyZXR1cm4gXy51bmlxKGgpLnNvcnQocmMuY29tcGFyZVRhZ05hbWVzKX19KSh2Y3x8KHZjPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmFja2VuZC9jYW5jZWxsZXIuanMKKGZ1bmN0aW9uKGIpe2NsYXNzIGR7Y29uc3RydWN0b3IoKXt0aGlzLmNhbmNlbGxhdGlvbkNvdW50PTB9Y2FuY2VsbGFibGUoZil7Y29uc3QgaD10aGlzLmNhbmNlbGxhdGlvbkNvdW50O3JldHVybiBrPT5mKHt2YWx1ZTprLGNhbmNlbGxlZDp0aGlzLmNhbmNlbGxhdGlvbkNvdW50IT09aH0pfWNhbmNlbEFsbCgpe3RoaXMuY2FuY2VsbGF0aW9uQ291bnQrK319Yi5DYW5jZWxsZXI9ZH0pKHZjfHwodmM9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iYWNrZW5kL3RmLWJhY2tlbmQtcG9seW1lci5qcwooZnVuY3Rpb24oYil7UG9seW1lcih7aXM6InRmLWJhY2tlbmQiLF90ZW1wbGF0ZTpudWxsLHRmX2JhY2tlbmQ6Yn0pfSkodmN8fCh2Yz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNhdGVnb3JpemF0aW9uLXV0aWxzL2NhdGVnb3JpemF0aW9uVXRpbHMuanMKdmFyICRjOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChtLG4pe2NvbnN0IHE9KCgpPT57dHJ5e3JldHVybiBuZXcgUmVnRXhwKG4pfWNhdGNoKHUpe3JldHVybiBudWxsfX0pKCk7cmV0dXJue25hbWU6bixtZXRhZGF0YTp7dHlwZTpwLlNFQVJDSF9SRVNVTFRTLHZhbGlkUmVnZXg6ISFxLHVuaXZlcnNhbFJlZ2V4OiIuKiI9PT1ufSxpdGVtczpxP20uZmlsdGVyKHU9PnUubWF0Y2gocSkpOltdfX1mdW5jdGlvbiBmKG0sbj0iLyIpe2NvbnN0IHE9W10sdT17fTttLmZvckVhY2goeD0+e3ZhciBBPXguaW5kZXhPZihuKTtBPTA8PUE/eC5zbGljZSgwLEEpOng7aWYoIXVbQV0pe2NvbnN0IHk9e25hbWU6QSxtZXRhZGF0YTp7dHlwZTpwLlBSRUZJWF9HUk9VUH0saXRlbXM6W119O3VbQV09eTtxLnB1c2goeSl9dVtBXS5pdGVtcy5wdXNoKHgpfSk7cmV0dXJuIHF9ZnVuY3Rpb24gaChtLG49IiIpe249W2QobSxuKV07bT1mKG0pO3JldHVybltdLmNvbmNhdChuLG0pfWZ1bmN0aW9uIGsobSxuLHEpe2NvbnN0IHU9CnZjLmdldFRhZ3MobSk7cT1oKHUscSk7Y29uc3QgeD10KF8ucGljayhtLG4pKTtyZXR1cm4gcS5tYXAoKHtuYW1lOkEsbWV0YWRhdGE6eSxpdGVtczp3fSk9Pih7bmFtZTpBLG1ldGFkYXRhOnksaXRlbXM6dy5tYXAoQz0+KHt0YWc6QyxydW5zOih4LmdldChDKXx8W10pLnNsaWNlKCl9KSl9KSl9ZnVuY3Rpb24gdChtKXtjb25zdCBuPW5ldyBNYXA7T2JqZWN0LmtleXMobSkuZm9yRWFjaChxPT57bVtxXS5mb3JFYWNoKHU9Pntjb25zdCB4PW4uZ2V0KHUpfHxbXTt4LnB1c2gocSk7bi5zZXQodSx4KX0pfSk7cmV0dXJuIG59ZnVuY3Rpb24gbChtLG4pe2NvbnN0IHE9cmMuY29tcGFyZVRhZ05hbWVzKG0udGFnLG4udGFnKTtyZXR1cm4gMCE9cT9xOnJjLmNvbXBhcmVUYWdOYW1lcyhtLnJ1bixuLnJ1bil9bGV0IHA7KGZ1bmN0aW9uKG0pe21bbS5TRUFSQ0hfUkVTVUxUUz0wXT0iU0VBUkNIX1JFU1VMVFMiO21bbS5QUkVGSVhfR1JPVVA9MV09IlBSRUZJWF9HUk9VUCJ9KShwPWIuQ2F0ZWdvcnlUeXBlfHwKKGIuQ2F0ZWdvcnlUeXBlPXt9KSk7Yi5jYXRlZ29yaXplQnlTZWFyY2hRdWVyeT1kO2IuY2F0ZWdvcml6ZUJ5UHJlZml4PWY7Yi5jYXRlZ29yaXplPWg7Yi5jYXRlZ29yaXplVGFncz1rO2IuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucz1mdW5jdGlvbihtLG4scSl7cmV0dXJuIGsobSxuLHEpLm1hcChmdW5jdGlvbih1KXtjb25zdCB4PV8uZmxhdHRlbih1Lml0ZW1zLm1hcCgoe3RhZzpBLHJ1bnM6eX0pPT55Lm1hcCh3PT4oe3RhZzpBLHJ1bjp3fSkpKSk7eC5zb3J0KGwpO3JldHVybntuYW1lOnUubmFtZSxtZXRhZGF0YTp1Lm1ldGFkYXRhLGl0ZW1zOnh9fSl9fSkoJGN8fCgkYz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdsb2JhbHMvZ2xvYmFscy5qcwp2YXIgYWQ7KGZ1bmN0aW9uKGIpe2xldCBkPSExO2Iuc2V0VXNlSGFzaD1mdW5jdGlvbihoKXtkPWh9O2IudXNlSGFzaD1mdW5jdGlvbigpe3JldHVybiBkfTtsZXQgZj0iIjtiLnNldEZha2VIYXNoPWZ1bmN0aW9uKGgpe2Y9aH07Yi5nZXRGYWtlSGFzaD1mdW5jdGlvbigpe3JldHVybiBmfX0pKGFkfHwoYWQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1nbG9iYWxzL2dsb2JhbHMtcG9seW1lci5qcwooZnVuY3Rpb24oYil7UG9seW1lcih7aXM6InRmLWdsb2JhbHMiLF90ZW1wbGF0ZTpudWxsLHRmX2dsb2JhbHM6Yn0pfSkoYWR8fChhZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXN0b3JhZ2UvbGlzdGVuZXJzLmpzCnZhciBwZDsKKGZ1bmN0aW9uKGIpe2NsYXNzIGR7Y29uc3RydWN0b3Ioayl7dGhpcy5saXN0ZW5lcj1rfX1iLkxpc3RlbktleT1kO2NvbnN0IGY9bmV3IFNldCxoPW5ldyBTZXQ7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLCgpPT57Zi5mb3JFYWNoKGs9PmsubGlzdGVuZXIoKSl9KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigic3RvcmFnZSIsKCk9PntoLmZvckVhY2goaz0+ay5saXN0ZW5lcigpKX0pO2IuYWRkSGFzaExpc3RlbmVyPWZ1bmN0aW9uKGspe2s9bmV3IGQoayk7Zi5hZGQoayk7cmV0dXJuIGt9O2IuYWRkU3RvcmFnZUxpc3RlbmVyPWZ1bmN0aW9uKGspe2s9bmV3IGQoayk7aC5hZGQoayk7cmV0dXJuIGt9O2IuZmlyZVN0b3JhZ2VDaGFuZ2VkPWZ1bmN0aW9uKCl7aC5mb3JFYWNoKGs9PmsubGlzdGVuZXIoKSl9O2IucmVtb3ZlSGFzaExpc3RlbmVyQnlLZXk9ZnVuY3Rpb24oayl7Zi5kZWxldGUoayl9O2IucmVtb3ZlU3RvcmFnZUxpc3RlbmVyQnlLZXk9ZnVuY3Rpb24oayl7aC5kZWxldGUoayl9fSkocGR8fAoocGQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zdG9yYWdlL3N0b3JhZ2UuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQobixxKXtmdW5jdGlvbiB1KHcsQz17fSl7Y29uc3Qge2RlZmF1bHRWYWx1ZTpHLHVzZUxvY2FsU3RvcmFnZTpEPSExfT1DO3c9RD93aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0odyk6bChoKCkpW3ddO3JldHVybiB2b2lkIDA9PXc/Xy5jbG9uZURlZXAoRyk6bih3KX1mdW5jdGlvbiB4KHcsQyxHPXt9KXtjb25zdCB7ZGVmYXVsdFZhbHVlOkQsdXNlTG9jYWxTdG9yYWdlOkI9ITEsdXNlTG9jYXRpb25SZXBsYWNlOkk9ITF9PUc7Rz1xKEMpO0I/KHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh3LEcpLGIuZmlyZVN0b3JhZ2VDaGFuZ2VkKCkpOl8uaXNFcXVhbChDLHUodyx7dXNlTG9jYWxTdG9yYWdlOkJ9KSl8fChfLmlzRXF1YWwoQyxEKT9wKHcpOihDPWwoaCgpKSxDW3ddPUcsayh0KEMpLEkpKSl9Y29uc3QgQT1bXSx5PVtdO3JldHVybntnZXQ6dSxzZXQ6eCxnZXRJbml0aWFsaXplcjpmdW5jdGlvbih3LEMpe2NvbnN0IEc9T2JqZWN0LmFzc2lnbih7ZGVmYXVsdFZhbHVlOkMuZGVmYXVsdFZhbHVlLApwb2x5bWVyUHJvcGVydHk6dyx1c2VMb2NhbFN0b3JhZ2U6ITF9LEMpO3JldHVybiBmdW5jdGlvbigpe2NvbnN0IEQ9Zih0aGlzLHcpLEI9KCk9Pntjb25zdCBOPXUoRCxHKTtfLmlzRXF1YWwoTix0aGlzW0cucG9seW1lclByb3BlcnR5XSl8fCh0aGlzW0cucG9seW1lclByb3BlcnR5XT1OKX0sST0oRy51c2VMb2NhbFN0b3JhZ2U/Yi5hZGRTdG9yYWdlTGlzdGVuZXI6Yi5hZGRIYXNoTGlzdGVuZXIpKCgpPT5CKCkpO0cudXNlTG9jYWxTdG9yYWdlP3kucHVzaChJKTpBLnB1c2goSSk7QigpO3JldHVybiB0aGlzW0cucG9seW1lclByb3BlcnR5XX19LGdldE9ic2VydmVyOmZ1bmN0aW9uKHcsQyl7Y29uc3QgRz1PYmplY3QuYXNzaWduKHtkZWZhdWx0VmFsdWU6Qy5kZWZhdWx0VmFsdWUscG9seW1lclByb3BlcnR5OncsdXNlTG9jYWxTdG9yYWdlOiExfSxDKTtyZXR1cm4gZnVuY3Rpb24oKXtjb25zdCBEPWYodGhpcyx3KTt4KEQsdGhpc1tHLnBvbHltZXJQcm9wZXJ0eV0sRyl9fSxkaXNwb3NlQmluZGluZzpmdW5jdGlvbigpe0EuZm9yRWFjaCh3PT4KYi5yZW1vdmVIYXNoTGlzdGVuZXJCeUtleSh3KSk7eS5mb3JFYWNoKHc9PmIucmVtb3ZlU3RvcmFnZUxpc3RlbmVyQnlLZXkodykpfX19ZnVuY3Rpb24gZihuLHEpe249bltiLkRJU0FNQklHVUFUT1JdO3JldHVybihudWxsPT1uP1txXTpbbixxXSkuam9pbigiLiIpfWZ1bmN0aW9uIGgoKXtyZXR1cm4gYWQudXNlSGFzaCgpP3dpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpOmFkLmdldEZha2VIYXNoKCl9ZnVuY3Rpb24gayhuLHE9ITEpe2FkLnVzZUhhc2goKT9xP3dpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKCIjIituKTp3aW5kb3cubG9jYXRpb24uaGFzaD1uOmFkLnNldEZha2VIYXNoKG4pfWZ1bmN0aW9uIHQobil7bGV0IHE9IiI7dm9pZCAwIT09bltiLlRBQl0mJihxKz1uW2IuVEFCXSk7Y29uc3QgdT1PYmplY3Qua2V5cyhuKS5tYXAoeD0+W3gsblt4XV0pLmZpbHRlcih4PT54WzBdIT09Yi5UQUIpLm1hcCh4PT5lbmNvZGVVUklDb21wb25lbnQoeFswXSkrIlx4M2QiK2VuY29kZVVSSUNvbXBvbmVudCh4WzFdKSkuam9pbigiXHgyNiIpOwpyZXR1cm4gMDx1Lmxlbmd0aD9xKyJceDI2Iit1OnF9ZnVuY3Rpb24gbChuKXtjb25zdCBxPXt9O24uc3BsaXQoIlx4MjYiKS5mb3JFYWNoKHU9Pnt1PXUuc3BsaXQoIlx4M2QiKTsxPT09dS5sZW5ndGg/cVtiLlRBQl09dVswXToyPT09dS5sZW5ndGgmJihxW2RlY29kZVVSSUNvbXBvbmVudCh1WzBdKV09ZGVjb2RlVVJJQ29tcG9uZW50KHVbMV0pKX0pO3JldHVybiBxfWZ1bmN0aW9uIHAobil7Y29uc3QgcT1sKGgoKSk7ZGVsZXRlIHFbbl07ayh0KHEpKX1iLlRBQj0iX190YWJfXyI7Yi5ESVNBTUJJR1VBVE9SPSJkaXNhbWJpZ3VhdG9yIjtiLnVybERpY3Q9bChoKCkpO2IuYWRkSGFzaExpc3RlbmVyKCgpPT57Yi51cmxEaWN0PWwoaCgpKX0pO3ZhciBtPWQobj0+bixuPT5uKTtiLmdldFN0cmluZz1tLmdldDtiLnNldFN0cmluZz1tLnNldDtiLmdldFN0cmluZ0luaXRpYWxpemVyPW0uZ2V0SW5pdGlhbGl6ZXI7Yi5nZXRTdHJpbmdPYnNlcnZlcj1tLmdldE9ic2VydmVyO2IuZGlzcG9zZVN0cmluZ0JpbmRpbmc9Cm0uZGlzcG9zZUJpbmRpbmc7bT1kKG49PiJ0cnVlIj09PW4/ITA6ImZhbHNlIj09PW4/ITE6dm9pZCAwLG49Pm4udG9TdHJpbmcoKSk7Yi5nZXRCb29sZWFuPW0uZ2V0O2Iuc2V0Qm9vbGVhbj1tLnNldDtiLmdldEJvb2xlYW5Jbml0aWFsaXplcj1tLmdldEluaXRpYWxpemVyO2IuZ2V0Qm9vbGVhbk9ic2VydmVyPW0uZ2V0T2JzZXJ2ZXI7Yi5kaXNwb3NlQm9vbGVhbkJpbmRpbmc9bS5kaXNwb3NlQmluZGluZzttPWQobj0+K24sbj0+bi50b1N0cmluZygpKTtiLmdldE51bWJlcj1tLmdldDtiLnNldE51bWJlcj1tLnNldDtiLmdldE51bWJlckluaXRpYWxpemVyPW0uZ2V0SW5pdGlhbGl6ZXI7Yi5nZXROdW1iZXJPYnNlcnZlcj1tLmdldE9ic2VydmVyO2IuZGlzcG9zZU51bWJlckJpbmRpbmc9bS5kaXNwb3NlQmluZGluZzttPWQobj0+SlNPTi5wYXJzZShhdG9iKG4pKSxuPT5idG9hKEpTT04uc3RyaW5naWZ5KG4pKSk7Yi5nZXRPYmplY3Q9bS5nZXQ7Yi5zZXRPYmplY3Q9bS5zZXQ7Yi5nZXRPYmplY3RJbml0aWFsaXplcj0KbS5nZXRJbml0aWFsaXplcjtiLmdldE9iamVjdE9ic2VydmVyPW0uZ2V0T2JzZXJ2ZXI7Yi5kaXNwb3NlT2JqZWN0QmluZGluZz1tLmRpc3Bvc2VCaW5kaW5nO2IubWFrZUJpbmRpbmdzPWQ7Yi5taWdyYXRlTGVnYWN5VVJMU2NoZW1lPWZ1bmN0aW9uKCl7Y29uc3Qgbj1uZXcgU2V0KCJleGFtcGxlc1BhdGggaGlkZU1vZGVsUGFuZTIgbW9kZWxOYW1lMSBtb2RlbE5hbWUyIGluZmVyZW5jZUFkZHJlc3MxIGluZmVyZW5jZUFkZHJlc3MyIG1vZGVsVHlwZSBtb2RlbFZlcnNpb24xIG1vZGVsVmVyc2lvbjIgbW9kZWxTaWduYXR1cmUxIG1vZGVsU2lnbmF0dXJlMiBtYXhFeGFtcGxlcyBsYWJlbFZvY2FiUGF0aCBtdWx0aUNsYXNzIHNlcXVlbmNlRXhhbXBsZXMgbWF4Q2xhc3Nlc1RvRGlzcGxheSBzYW1wbGluZ09kZHMgdXNlUHJlZGljdEFwaSBwcmVkaWN0SW5wdXRUZW5zb3IgcHJlZGljdE91dHB1dFRlbnNvciIuc3BsaXQoIiAiKSkscT1sKGgoKSk7aWYoIndoYXRpZiI9PT1xW2IuVEFCXSlmb3IobGV0IHUgb2Ygbil1IGluCnEmJihxW2BwLndoYXRpZi4ke3V9YF09cVt1XSk7ayh0KHEpKTt0aGlzLnVybERpY3Q9cX19KShwZHx8KHBkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtc3RvcmFnZS90Zi1zdG9yYWdlLXBvbHltZXIuanMKKGZ1bmN0aW9uKGIpe1BvbHltZXIoe2lzOiJ0Zi1zdG9yYWdlIixfdGVtcGxhdGU6bnVsbCx0Zl9zdG9yYWdlOmJ9KX0pKHBkfHwocGQ9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jYXRlZ29yaXphdGlvbi11dGlscy90Zi10YWctZmlsdGVyZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGFnLWZpbHRlcmVyIixwcm9wZXJ0aWVzOnt0YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLG5vdGlmeTohMCxjb21wdXRlZDoiX2NvbXB1dGVUYWdGaWx0ZXIoX3RhZ0ZpbHRlcikifSxfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZTpwZC5nZXRTdHJpbmdJbml0aWFsaXplcigidGFnRmlsdGVyIix7ZGVmYXVsdFZhbHVlOiIiLHVzZUxvY2FsU3RvcmFnZTohMSxwb2x5bWVyUHJvcGVydHk6Il90YWdGaWx0ZXIifSksb2JzZXJ2ZXI6Il90YWdGaWx0ZXJPYnNlcnZlciJ9fSxfdGFnRmlsdGVyT2JzZXJ2ZXI6cGQuZ2V0U3RyaW5nT2JzZXJ2ZXIoInRhZ0ZpbHRlciIse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhbFN0b3JhZ2U6ITEscG9seW1lclByb3BlcnR5OiJfdGFnRmlsdGVyIn0pLF9jb21wdXRlVGFnRmlsdGVyKCl7cmV0dXJuIHRoaXMuX3RhZ0ZpbHRlcn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kYXNoYm9hcmQtY29tbW9uL2FycmF5LXVwZGF0ZS1oZWxwZXIuanMKdmFyIHFkOyhmdW5jdGlvbihiKXtiLkFycmF5VXBkYXRlSGVscGVyPXt1cGRhdGVBcnJheVByb3AoZCxmLGgpe2xldCBrPXRoaXMuZ2V0KGQpO2lmKCFBcnJheS5pc0FycmF5KGYpKXRocm93IFJhbmdlRXJyb3IoYEV4cGVjdGVkIG5ldyB2YWx1ZSB0byAnJHtkfScgdG8gYmUgYW4gYXJyYXkuYCk7QXJyYXkuaXNBcnJheShrKXx8KGs9W10sdGhpcy5zZXQoZCxrKSk7Y29uc3QgdD1uZXcgU2V0KGYubWFwKChtLG4pPT5oKG0sbikpKTtsZXQgbD0wLHA9MDtmb3IoO2w8ay5sZW5ndGgmJnA8Zi5sZW5ndGg7KXQuaGFzKGgoa1tsXSxsKSk/KGgoa1tsXSxsKT09aChmW3BdLHApP3RoaXMuc2V0KGAke2R9LiR7bH1gLGZbcF0pOnRoaXMuc3BsaWNlKGQsbCwwLGZbcF0pLHArKyxsKyspOnRoaXMuc3BsaWNlKGQsbCwxKTtsPGsubGVuZ3RoJiZ0aGlzLnNwbGljZShkLGwpO3A8Zi5sZW5ndGgmJnRoaXMucHVzaChkLC4uLmYuc2xpY2UocCkpfX19KShxZHx8KHFkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1kYXNoYm9hcmQtbGF5b3V0Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRhc2hib2FyZC1sYXlvdXQifSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1vcHRpb24tc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtb3B0aW9uLXNlbGVjdG9yIixwcm9wZXJ0aWVzOntuYW1lOlN0cmluZyxzZWxlY3RlZElkOnt0eXBlOlN0cmluZyxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zZWxlY3RlZElkQ2hhbmdlZCJ9fSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbihiKXt0aGlzLmxpc3RlbihiLCJ0YXAiLCJfc2VsZWN0VGFyZ2V0Iil9LmJpbmQodGhpcykpfSl9LF9zZWxlY3RUYXJnZXQ6ZnVuY3Rpb24oYil7dGhpcy5zZWxlY3RlZElkPWIuY3VycmVudFRhcmdldC5pZH0sX3NlbGVjdGVkSWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCIjIit0aGlzLnNlbGVjdGVkSWQpO2ImJih0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKCkuZm9yRWFjaChmdW5jdGlvbihkKXtkLmNsYXNzTGlzdC5yZW1vdmUoInNlbGVjdGVkIil9KSxiLmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkIikpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tY29sbGFwc2UvaXJvbi1jb2xsYXBzZS5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLWNvbGxhcHNlIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxwcm9wZXJ0aWVzOntob3Jpem9udGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ob3Jpem9udGFsQ2hhbmdlZCJ9LG9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifSx0cmFuc2l0aW9uaW5nOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSxub0FuaW1hdGlvbjp7dHlwZTpCb29sZWFufSxfZGVzaXJlZFNpemU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sZ2V0IGRpbWVuc2lvbigpe3JldHVybiB0aGlzLmhvcml6b250YWw/IndpZHRoIjoiaGVpZ2h0In0sZ2V0IF9kaW1lbnNpb25NYXgoKXtyZXR1cm4gdGhpcy5ob3Jpem9udGFsPyJtYXhXaWR0aCI6Im1heEhlaWdodCJ9LGdldCBfZGltZW5zaW9uTWF4Q3NzKCl7cmV0dXJuIHRoaXMuaG9yaXpvbnRhbD8ibWF4LXdpZHRoIjoKIm1heC1oZWlnaHQifSxob3N0QXR0cmlidXRlczp7cm9sZToiZ3JvdXAiLCJhcmlhLWhpZGRlbiI6InRydWUifSxsaXN0ZW5lcnM6e3RyYW5zaXRpb25lbmQ6Il9vblRyYW5zaXRpb25FbmQifSx0b2dnbGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hdGhpcy5vcGVuZWR9LHNob3c6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0saGlkZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkPSExfSx1cGRhdGVTaXplOmZ1bmN0aW9uKGIsZCl7Yj0iYXV0byI9PT1iPyIiOmI7ZD1kJiYhdGhpcy5ub0FuaW1hdGlvbiYmdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9kZXNpcmVkU2l6ZSE9PWI7dGhpcy5fZGVzaXJlZFNpemU9Yjt0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCExKTtkJiYoZD10aGlzLl9jYWxjU2l6ZSgpLCIiPT09YiYmKHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT0iIixiPXRoaXMuX2NhbGNTaXplKCkpLHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XT1kLHRoaXMuc2Nyb2xsVG9wPQp0aGlzLnNjcm9sbFRvcCx0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCEwKSxkPWIhPT1kKTt0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09YjtkfHx0aGlzLl90cmFuc2l0aW9uRW5kKCl9LGVuYWJsZVRyYW5zaXRpb246ZnVuY3Rpb24oYil7UG9seW1lci5CYXNlLl93YXJuKCJgZW5hYmxlVHJhbnNpdGlvbigpYCBpcyBkZXByZWNhdGVkLCB1c2UgYG5vQW5pbWF0aW9uYCBpbnN0ZWFkLiIpO3RoaXMubm9BbmltYXRpb249IWJ9LF91cGRhdGVUcmFuc2l0aW9uOmZ1bmN0aW9uKGIpe3RoaXMuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uPWImJiF0aGlzLm5vQW5pbWF0aW9uPyIiOiIwcyJ9LF9ob3Jpem9udGFsQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc3R5bGUudHJhbnNpdGlvblByb3BlcnR5PXRoaXMuX2RpbWVuc2lvbk1heENzczt0aGlzLnN0eWxlWyJtYXhXaWR0aCI9PT10aGlzLl9kaW1lbnNpb25NYXg/Im1heEhlaWdodCI6Im1heFdpZHRoIl09IiI7dGhpcy51cGRhdGVTaXplKHRoaXMub3BlbmVkPwoiYXV0byI6IjBweCIsITEpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsIXRoaXMub3BlbmVkKTt0aGlzLl9zZXRUcmFuc2l0aW9uaW5nKCEwKTt0aGlzLnRvZ2dsZUNsYXNzKCJpcm9uLWNvbGxhcHNlLWNsb3NlZCIsITEpO3RoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2Utb3BlbmVkIiwhMSk7dGhpcy51cGRhdGVTaXplKHRoaXMub3BlbmVkPyJhdXRvIjoiMHB4IiwhMCk7dGhpcy5vcGVuZWQmJnRoaXMuZm9jdXMoKX0sX3RyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09dGhpcy5fZGVzaXJlZFNpemU7dGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1jbG9zZWQiLCF0aGlzLm9wZW5lZCk7dGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1vcGVuZWQiLHRoaXMub3BlbmVkKTt0aGlzLl91cGRhdGVUcmFuc2l0aW9uKCExKTt0aGlzLm5vdGlmeVJlc2l6ZSgpOwp0aGlzLl9zZXRUcmFuc2l0aW9uaW5nKCExKX0sX29uVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihiKXtQb2x5bWVyLmRvbShiKS5yb290VGFyZ2V0PT09dGhpcyYmdGhpcy5fdHJhbnNpdGlvbkVuZCgpfSxfY2FsY1NpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVt0aGlzLmRpbWVuc2lvbl0rInB4In19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wYWdpbmF0ZWQtdmlldy90Zi1kb20tcmVwZWF0Lmh0bWwuanMKdmFyIEpkOwooZnVuY3Rpb24oYil7Yi5UZkRvbVJlcGVhdEJlaGF2aW9yPVtxZC5BcnJheVVwZGF0ZUhlbHBlcix7cHJvcGVydGllczp7YXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpdGVtIn0sX2NvbnRlbnRBY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX2RvbUJvb3RzdHJhcHBlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY3Rvcjp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+bnVsbH0sX3JlbmRlcmVkSXRlbXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfcmVuZGVyZWRUZW1wbGF0ZUluc3Q6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgTWFwfSxfbHJ1Q2FjaGVkSXRlbXM6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgTWFwfSxfY2FjaGVTaXplOnt0eXBlOk51bWJlcix2YWx1ZToxMH0sX2dldEl0ZW1LZXk6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmQ9PkpTT04uc3RyaW5naWZ5KGQpfX0sb2JzZXJ2ZXJzOlsiX2Jvb3RzdHJhcERvbShfaXRlbXNSZW5kZXJlZCwgaXNBdHRhY2hlZCkiLCJfdXBkYXRlRG9tKF9yZW5kZXJlZEl0ZW1zLiosIF9kb21Cb290c3RyYXBwZWQpIiwKIl91cGRhdGVBY3RpdmUoX2NvbnRlbnRBY3RpdmUpIiwiX3RyaW1DYWNoZShfY2FjaGVTaXplKSJdLHNldENhY2hlU2l6ZShkKXt0aGlzLl9jYWNoZVNpemU9ZH0sc2V0R2V0SXRlbUtleShkKXt0aGlzLl9nZXRJdGVtS2V5PWR9LHVwZGF0ZURvbShkKXt0aGlzLnVwZGF0ZUFycmF5UHJvcCgiX3JlbmRlcmVkSXRlbXMiLGQsdGhpcy5fZ2V0SXRlbUtleSl9LF9lbnN1cmVUZW1wbGF0aXplZCgpe2lmKCF0aGlzLmlzQXR0YWNoZWQpcmV0dXJuITE7dGhpcy5fY3Rvcnx8KHRoaXMuX2N0b3I9UG9seW1lci5UZW1wbGF0aXplLnRlbXBsYXRpemUodGhpcy5xdWVyeVNlbGVjdG9yKCJ0ZW1wbGF0ZSIpLHRoaXMse3BhcmVudE1vZGVsOiEwLGluc3RhbmNlUHJvcHM6e1t0aGlzLmFzXTohMCxhY3RpdmU6dGhpcy5fY29udGVudEFjdGl2ZX0sZm9yd2FyZEhvc3RQcm9wOmZ1bmN0aW9uKGQsZil7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZm9yRWFjaChoPT57aC5mb3J3YXJkSG9zdFByb3AoZCwKZil9KX19KSk7cmV0dXJuITB9LF9ib290c3RyYXBEb20oKXt0aGlzLl9pdGVtc1JlbmRlcmVkJiZ0aGlzLl9lbnN1cmVUZW1wbGF0aXplZCgpJiYhdGhpcy5fZG9tQm9vdHN0cmFwcGVkJiYoQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKS5mb3JFYWNoKGQ9PntQb2x5bWVyLmRvbSh0aGlzKS5yZW1vdmVDaGlsZChkKX0pLHRoaXMuX2xydUNhY2hlZEl0ZW1zLmNsZWFyKCksdGhpcy5fcmVuZGVyZWRJdGVtcy5mb3JFYWNoKChkLGYpPT50aGlzLl9pbnNlcnRJdGVtKGQsZikpLHRoaXMuX2RvbUJvb3RzdHJhcHBlZD0hMCl9LF91cGRhdGVBY3RpdmUoKXt0aGlzLl9kb21Cb290c3RyYXBwZWQmJkFycmF5LmZyb20odGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QudmFsdWVzKCkpLmZvckVhY2goZD0+e2Qubm90aWZ5UGF0aCgiYWN0aXZlIix0aGlzLl9jb250ZW50QWN0aXZlKX0pfSxfdXBkYXRlRG9tKGQpe2lmKHRoaXMuX2RvbUJvb3RzdHJhcHBlZCYmIl9yZW5kZXJlZEl0ZW1zIiE9ZC5wYXRoJiYKIl9yZW5kZXJlZEl0ZW1zLmxlbmd0aCIhPWQucGF0aClpZigiX3JlbmRlcmVkSXRlbXMuc3BsaWNlcyI9PT1kLnBhdGgpZC52YWx1ZS5pbmRleFNwbGljZXMuZm9yRWFjaChmPT57Y29uc3QgaD1mLmluZGV4LGs9Zi5hZGRlZENvdW50LHQ9Zi5vYmplY3Q7Zi5yZW1vdmVkLmZvckVhY2gobD0+e3RoaXMuX3JlbW92ZUl0ZW0obCx0aGlzLmNoaWxkcmVuW2hdKX0pO3Quc2xpY2UoaCxoK2spLmZvckVhY2goKGwscCk9PnRoaXMuX2luc2VydEl0ZW0obCxoK3ApKTt0aGlzLl90cmltQ2FjaGUoKX0pO2Vsc2V7Y29uc3QgZj10aGlzLl9nZXRJdGVtS2V5KGQudmFsdWUpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmhhcyhmKT90aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoZikubm90aWZ5UGF0aCh0aGlzLmFzLGQudmFsdWUpOmNvbnNvbGUud2FybihgRXhwZWN0ZWQgJyR7Zn0nIHRvIGV4aXN0IGluIHRoZSBET00gYnV0IGArImNvdWxkIG5vdCBmaW5kIG9uZS4iKX19LF9pbnNlcnRJdGVtKGQsCmYpe2lmKCF0aGlzLl9lbnN1cmVUZW1wbGF0aXplZCgpKXRocm93IEVycm9yKCJFeHBlY3RlZCB0ZW1wbGF0aXplZCBiZWZvcmUgaW5zZXJ0aW5nIGFuIGl0ZW0iKTtjb25zdCBoPXRoaXMuX2dldEl0ZW1LZXkoZCk7aWYodGhpcy5fbHJ1Q2FjaGVkSXRlbXMuaGFzKGgpKWQ9dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZ2V0KGgpLHRoaXMuX2xydUNhY2hlZEl0ZW1zLmRlbGV0ZShoKSx0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoaCkubm90aWZ5UGF0aCgiYWN0aXZlIix0aGlzLl9jb250ZW50QWN0aXZlKTtlbHNle2NvbnN0IGs9bmV3IHRoaXMuX2N0b3Ioe1t0aGlzLmFzXTpkLGFjdGl2ZTp0aGlzLl9jb250ZW50QWN0aXZlfSk7ZD1rLnJvb3Q7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3Quc2V0KGgsayl9dGhpcy5jaGlsZHJlbltmXT9Qb2x5bWVyLmRvbSh0aGlzKS5pbnNlcnRCZWZvcmUoZCx0aGlzLmNoaWxkcmVuW2ZdKTooKGQubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERT8KQXJyYXkuZnJvbShkLmNoaWxkcmVuKTpbZF0pLmZvckVhY2goaz0+ay5zZXRBdHRyaWJ1dGUoInNsb3QiLCJpdGVtcyIpKSxQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZChkKSl9LF9yZW1vdmVJdGVtKGQsZil7UG9seW1lci5kb20oZi5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZChmKTtkPXRoaXMuX2dldEl0ZW1LZXkoZCk7dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuc2V0KGQsZik7dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZ2V0KGQpLm5vdGlmeVBhdGgoImFjdGl2ZSIsITEpfSxfdHJpbUNhY2hlKCl7Zm9yKDt0aGlzLl9scnVDYWNoZWRJdGVtcy5zaXplPnRoaXMuX2NhY2hlU2l6ZTspe2NvbnN0IFtkXT10aGlzLl9scnVDYWNoZWRJdGVtcy5rZXlzKCk7dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZGVsZXRlKGQpO3RoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmRlbGV0ZShkKX19fV19KShKZHx8KEpkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcGFnaW5hdGVkLXZpZXcvcGFnaW5hdGVkVmlld1N0b3JlLmpzCnZhciBuZTsKKGZ1bmN0aW9uKGIpe2xldCBkPW51bGw7Y29uc3QgZj1uZXcgU2V0O2IuYWRkTGltaXRMaXN0ZW5lcj1mdW5jdGlvbihoKXtmLmFkZChoKX07Yi5yZW1vdmVMaW1pdExpc3RlbmVyPWZ1bmN0aW9uKGgpe2YuZGVsZXRlKGgpfTtiLmdldExpbWl0PWZ1bmN0aW9uKCl7bnVsbD09ZCYmKGQ9cGQuZ2V0TnVtYmVyKCJURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0Iix7dXNlTG9jYWxTdG9yYWdlOiEwfSksbnVsbD09ZHx8IWlzRmluaXRlKGQpfHwwPj1kKSYmKGQ9MTIpO3JldHVybiBkfTtiLnNldExpbWl0PWZ1bmN0aW9uKGgpe2lmKGghPT1NYXRoLmZsb29yKGgpKXRocm93IEVycm9yKGBsaW1pdCBtdXN0IGJlIGFuIGludGVnZXIsIGJ1dCBnb3Q6ICR7aH1gKTtpZigwPj1oKXRocm93IEVycm9yKGBsaW1pdCBtdXN0IGJlIHBvc2l0aXZlLCBidXQgZ290OiAke2h9YCk7aCE9PWQmJihkPWgscGQuc2V0TnVtYmVyKCJURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0IixkLAp7dXNlTG9jYWxTdG9yYWdlOiEwfSksZi5mb3JFYWNoKGs9PntrKCl9KSl9fSkobmV8fChuZT17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBhZ2luYXRlZC12aWV3L3RmLXBhZ2luYXRlZC12aWV3LXN0b3JlLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXBhZ2luYXRlZC12aWV3LXN0b3JlIixfdGVtcGxhdGU6bnVsbCx0Zl9wYWdpbmF0ZWRfdmlldzpuZX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBhZ2luYXRlZC12aWV3L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3Iixwcm9wZXJ0aWVzOntjYXRlZ29yeTpPYmplY3QsaW5pdGlhbE9wZW5lZDpCb29sZWFuLG9wZW5lZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxyZWFkT25seTohMH0sX2NvbnRlbnRBY3RpdmU6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVDb250ZW50QWN0aXZlKG9wZW5lZCkifSxkaXNhYmxlUGFnaW5hdGlvbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY291bnQ6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZUNvdW50KGNhdGVnb3J5Lml0ZW1zLiopIn0sX2hhc011bHRpcGxlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzTXVsdGlwbGUoX2NvdW50KSJ9LF9wYW5lUmVuZGVyZWQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVQYW5lUmVuZGVyZWQoY2F0ZWdvcnkpIixvYnNlcnZlcjoiX29uUGFuZVJlbmRlcmVkQ2hhbmdlZCJ9LF9pdGVtc1JlbmRlcmVkOnt0eXBlOkJvb2xlYW4sCmNvbXB1dGVkOiJfY29tcHV0ZUl0ZW1zUmVuZGVyZWQob3BlbmVkLCBfcGFuZVJlbmRlcmVkKSJ9LF9pc1NlYXJjaFJlc3VsdHM6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc1NlYXJjaFJlc3VsdHMoY2F0ZWdvcnkubWV0YWRhdGEudHlwZSkifSxfaXNJbnZhbGlkU2VhcmNoUmVzdWx0czp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUlzSW52YWxpZFNlYXJjaFJlc3VsdHMoY2F0ZWdvcnkubWV0YWRhdGEpIn0sX2lzVW5pdmVyc2FsU2VhcmNoUXVlcnk6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5KGNhdGVnb3J5Lm1ldGFkYXRhKSJ9LGdldENhdGVnb3J5SXRlbUtleTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Yj0+SlNPTi5zdHJpbmdpZnkoYiksb2JzZXJ2ZXI6Il9nZXRDYXRlZ29yeUl0ZW1LZXlDaGFuZ2VkIn0sX2xpbWl0Ont0eXBlOk51bWJlcix2YWx1ZToxMixvYnNlcnZlcjoiX2xpbWl0Q2hhbmdlZCJ9LApfYWN0aXZlSW5kZXg6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9jdXJyZW50UGFnZTp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFBhZ2UoX2xpbWl0LCBfYWN0aXZlSW5kZXgpIn0sX3BhZ2VDb3VudDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlUGFnZUNvdW50KGNhdGVnb3J5Lml0ZW1zLiosIF9saW1pdCkifSxfbXVsdGlwbGVQYWdlc0V4aXN0Ont0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlTXVsdGlwbGVQYWdlc0V4aXN0KF9wYWdlQ291bnQsIGRpc2FibGVQYWdpbmF0aW9uKSJ9LF9oYXNQcmV2aW91c1BhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIYXNQcmV2aW91c1BhZ2UoX2N1cnJlbnRQYWdlKSJ9LF9oYXNOZXh0UGFnZTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc05leHRQYWdlKF9jdXJyZW50UGFnZSwgX3BhZ2VDb3VudCkifSxfaW5wdXRXaWR0aDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlSW5wdXRXaWR0aChfcGFnZUNvdW50KSIsCm9ic2VydmVyOiJfdXBkYXRlSW5wdXRXaWR0aCJ9LF9wYWdlSW5wdXRWYWx1ZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUGFnZUlucHV0VmFsdWUoX3BhZ2VJbnB1dEZvY3VzZWQsIF9wYWdlSW5wdXRSYXdWYWx1ZSwgX2N1cnJlbnRQYWdlKSIsb2JzZXJ2ZXI6Il91cGRhdGVQYWdlSW5wdXRWYWx1ZSJ9LF9wYWdlSW5wdXRSYXdWYWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9wYWdlSW5wdXRGb2N1c2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJfY2xhbXBBY3RpdmVJbmRleChjYXRlZ29yeS5pdGVtcy4qKSIsIl91cGRhdGVSZW5kZXJlZEl0ZW1zKF9pdGVtc1JlbmRlcmVkLCBjYXRlZ29yeS5pdGVtcy4qLCBfbGltaXQsIF9hY3RpdmVJbmRleCwgX3BhZ2VDb3VudCwgZGlzYWJsZVBhZ2luYXRpb24pIl0sYmVoYXZpb3JzOltKZC5UZkRvbVJlcGVhdEJlaGF2aW9yXSxfY29tcHV0ZUNvdW50KCl7cmV0dXJuIHRoaXMuY2F0ZWdvcnkuaXRlbXMubGVuZ3RofSwKX2NvbXB1dGVIYXNNdWx0aXBsZSgpe3JldHVybiAxPHRoaXMuX2NvdW50fSxfdG9nZ2xlUGFuZSgpe3RoaXMuX3NldE9wZW5lZCghdGhpcy5vcGVuZWQpfSxfY29tcHV0ZUNvbnRlbnRBY3RpdmUoKXtyZXR1cm4gdGhpcy5vcGVuZWR9LF9vblBhbmVSZW5kZXJlZENoYW5nZWQoYixkKXtiJiZiIT09ZCYmdGhpcy4kLmlmUmVuZGVyZWQucmVuZGVyKCl9LF9jb21wdXRlUGFuZVJlbmRlcmVkKGIpe3JldHVybiEoYi5tZXRhZGF0YS50eXBlPT09JGMuQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTJiYiIj09PWIubmFtZSl9LF9jb21wdXRlSXRlbXNSZW5kZXJlZCgpe3JldHVybiB0aGlzLl9wYW5lUmVuZGVyZWQmJnRoaXMub3BlbmVkfSxfY29tcHV0ZUlzU2VhcmNoUmVzdWx0cyhiKXtyZXR1cm4gYj09PSRjLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUU30sX2NvbXB1dGVJc0ludmFsaWRTZWFyY2hSZXN1bHRzKGIpe3JldHVybiBiLnR5cGU9PT0kYy5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFMmJgohYi52YWxpZFJlZ2V4fSxfY29tcHV0ZUlzVW5pdmVyc2FsU2VhcmNoUXVlcnkoYil7cmV0dXJuIGIudHlwZT09PSRjLkNhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUyYmYi51bml2ZXJzYWxSZWdleH0sX2lzQ29tcG9zaXRlU2VhcmNoKCl7Y29uc3QgYj10aGlzLmNhdGVnb3J5Lm1ldGFkYXRhLnR5cGU7cmV0dXJuIHRoaXMuY2F0ZWdvcnkubWV0YWRhdGEuY29tcG9zaXRlU2VhcmNoJiZiPT09JGMuQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTfSxyZWFkeSgpe3RoaXMuX3NldE9wZW5lZChudWxsPT10aGlzLmluaXRpYWxPcGVuZWQ/ITA6dGhpcy5pbml0aWFsT3BlbmVkKTt0aGlzLl9saW1pdExpc3RlbmVyPSgpPT57dGhpcy5zZXQoIl9saW1pdCIsbmUuZ2V0TGltaXQoKSl9O25lLmFkZExpbWl0TGlzdGVuZXIodGhpcy5fbGltaXRMaXN0ZW5lcik7dGhpcy5fbGltaXRMaXN0ZW5lcigpfSxkZXRhY2hlZCgpe25lLnJlbW92ZUxpbWl0TGlzdGVuZXIodGhpcy5fbGltaXRMaXN0ZW5lcil9LApfdXBkYXRlUmVuZGVyZWRJdGVtcyhiLGQsZixoLGssdCl7YiYmKGI9TWF0aC5mbG9vcihoL2YpLGQ9dGhpcy5jYXRlZ29yeS5pdGVtc3x8W10sdGhpcy51cGRhdGVEb20odD9kOmQuc2xpY2UoYipmLChiKzEpKmYpLHRoaXMuZ2V0Q2F0ZWdvcnlJdGVtS2V5KSl9LF9saW1pdENoYW5nZWQoYil7dGhpcy5zZXRDYWNoZVNpemUoMipiKX0sX2dldENhdGVnb3J5SXRlbUtleUNoYW5nZWQoKXt0aGlzLnNldEdldEl0ZW1LZXkodGhpcy5nZXRDYXRlZ29yeUl0ZW1LZXkpfSxfY29tcHV0ZUN1cnJlbnRQYWdlKGIsZCl7cmV0dXJuIE1hdGguZmxvb3IoZC9iKSsxfSxfY29tcHV0ZVBhZ2VDb3VudChiLGQpe3JldHVybiB0aGlzLmNhdGVnb3J5P01hdGguY2VpbCh0aGlzLmNhdGVnb3J5Lml0ZW1zLmxlbmd0aC9kKTowfSxfY29tcHV0ZU11bHRpcGxlUGFnZXNFeGlzdChiLGQpe3JldHVybiFkJiYxPGJ9LF9jb21wdXRlSGFzUHJldmlvdXNQYWdlKGIpe3JldHVybiAxPGJ9LF9jb21wdXRlSGFzTmV4dFBhZ2UoYiwKZCl7cmV0dXJuIGI8ZH0sX2NvbXB1dGVJbnB1dFdpZHRoKGIpe3JldHVybmBjYWxjKCR7Yi50b1N0cmluZygpLmxlbmd0aH1lbSArIDIwcHgpYH0sX3NldEFjdGl2ZUluZGV4KGIpe2NvbnN0IGQ9KHRoaXMuY2F0ZWdvcnkuaXRlbXN8fFtdKS5sZW5ndGgtMTtiPmQmJihiPWQpOzA+YiYmKGI9MCk7dGhpcy5zZXQoIl9hY3RpdmVJbmRleCIsYil9LF9jbGFtcEFjdGl2ZUluZGV4KCl7dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fYWN0aXZlSW5kZXgpfSxfcGVyZm9ybVByZXZpb3VzUGFnZSgpe3RoaXMuX3NldEFjdGl2ZUluZGV4KHRoaXMuX2FjdGl2ZUluZGV4LXRoaXMuX2xpbWl0KX0sX3BlcmZvcm1OZXh0UGFnZSgpe3RoaXMuX3NldEFjdGl2ZUluZGV4KHRoaXMuX2FjdGl2ZUluZGV4K3RoaXMuX2xpbWl0KX0sX2NvbXB1dGVQYWdlSW5wdXRWYWx1ZShiLGQsZil7cmV0dXJuIGI/ZDpmLnRvU3RyaW5nKCl9LF9oYW5kbGVQYWdlSW5wdXRFdmVudChiKXt0aGlzLnNldCgiX3BhZ2VJbnB1dFJhd1ZhbHVlIiwKYi50YXJnZXQudmFsdWUpO2I9TnVtYmVyKGIudGFyZ2V0LnZhbHVlfHxOYU4pO2lzTmFOKGIpfHx0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9saW1pdCooTWF0aC5tYXgoMSxNYXRoLm1pbihiLHRoaXMuX3BhZ2VDb3VudCkpLTEpKX0sX2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCgpe3RoaXMuc2V0KCJfcGFnZUlucHV0UmF3VmFsdWUiLHRoaXMuX2N1cnJlbnRQYWdlLnRvU3RyaW5nKCkpfSxfaGFuZGxlUGFnZUZvY3VzRXZlbnQoKXt0aGlzLnNldCgiX3BhZ2VJbnB1dFJhd1ZhbHVlIix0aGlzLl9wYWdlSW5wdXRWYWx1ZSk7dGhpcy5zZXQoIl9wYWdlSW5wdXRGb2N1c2VkIiwhMCl9LF9oYW5kbGVQYWdlQmx1ckV2ZW50KCl7dGhpcy5zZXQoIl9wYWdlSW5wdXRGb2N1c2VkIiwhMSl9LF91cGRhdGVQYWdlSW5wdXRWYWx1ZShiKXtjb25zdCBkPXRoaXMuJCQoIiNwYWdlLWlucHV0IGlucHV0Iik7ZCYmKGQudmFsdWU9Yil9LF91cGRhdGVJbnB1dFdpZHRoKCl7dGhpcy51cGRhdGVTdHlsZXMoeyItLXRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3LXBhZ2UtaW5wdXQtd2lkdGgiOnRoaXMuX2lucHV0V2lkdGh9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1kaWFsb2ctYmVoYXZpb3IvcGFwZXItZGlhbG9nLWJlaGF2aW9yLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9ySW1wbD17aG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImRpYWxvZyIsdGFiaW5kZXg6Ii0xIn0scHJvcGVydGllczp7bW9kYWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX19yZWFkaWVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJfbW9kYWxDaGFuZ2VkKG1vZGFsLCBfX3JlYWRpZWQpIl0sbGlzdGVuZXJzOnt0YXA6Il9vbkRpYWxvZ0NsaWNrIn0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9fcHJldk5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s9dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrO3RoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXk7dGhpcy5fX3ByZXZXaXRoQmFja2Ryb3A9dGhpcy53aXRoQmFja2Ryb3A7dGhpcy5fX3JlYWRpZWQ9ITB9LF9tb2RhbENoYW5nZWQ6ZnVuY3Rpb24oYixkKXtkJiYoYj8odGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrPQp0aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2ssdGhpcy5fX3ByZXZOb0NhbmNlbE9uRXNjS2V5PXRoaXMubm9DYW5jZWxPbkVzY0tleSx0aGlzLl9fcHJldldpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcCx0aGlzLndpdGhCYWNrZHJvcD10aGlzLm5vQ2FuY2VsT25Fc2NLZXk9dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrPSEwKToodGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrPXRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljayYmdGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrLHRoaXMubm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXkmJnRoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleSx0aGlzLndpdGhCYWNrZHJvcD10aGlzLndpdGhCYWNrZHJvcCYmdGhpcy5fX3ByZXZXaXRoQmFja2Ryb3ApKX0sX3VwZGF0ZUNsb3NpbmdSZWFzb25Db25maXJtZWQ6ZnVuY3Rpb24oYil7dGhpcy5jbG9zaW5nUmVhc29uPXRoaXMuY2xvc2luZ1JlYXNvbnx8Cnt9O3RoaXMuY2xvc2luZ1JlYXNvbi5jb25maXJtZWQ9Yn0sX29uRGlhbG9nQ2xpY2s6ZnVuY3Rpb24oYil7Zm9yKHZhciBkPVBvbHltZXIuZG9tKGIpLnBhdGgsZj0wLGg9ZC5pbmRleE9mKHRoaXMpO2Y8aDtmKyspe3ZhciBrPWRbZl07aWYoay5oYXNBdHRyaWJ1dGUmJihrLmhhc0F0dHJpYnV0ZSgiZGlhbG9nLWRpc21pc3MiKXx8ay5oYXNBdHRyaWJ1dGUoImRpYWxvZy1jb25maXJtIikpKXt0aGlzLl91cGRhdGVDbG9zaW5nUmVhc29uQ29uZmlybWVkKGsuaGFzQXR0cmlidXRlKCJkaWFsb2ctY29uZmlybSIpKTt0aGlzLmNsb3NlKCk7Yi5zdG9wUHJvcGFnYXRpb24oKTticmVha319fX07UG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9yPVtQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3IsUG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9ySW1wbF19KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWRpYWxvZy9wYXBlci1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItZGlhbG9nIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvcixQb2x5bWVyLk5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvcl0sbGlzdGVuZXJzOnsibmVvbi1hbmltYXRpb24tZmluaXNoIjoiX29uTmVvbkFuaW1hdGlvbkZpbmlzaCJ9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEFuaW1hdGlvbigpO3RoaXMucGxheUFuaW1hdGlvbigiZW50cnkiKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuY2FuY2VsQW5pbWF0aW9uKCk7dGhpcy5wbGF5QW5pbWF0aW9uKCJleGl0Iil9LF9vbk5lb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD90aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKTp0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKX19KTsKCi8vIGh0dHBzOi8vZDNqcy5vcmcgdjUuNy4wIENvcHlyaWdodCAyMDE4IE1pa2UgQm9zdG9jawohZnVuY3Rpb24odCxuKXsib2JqZWN0Ij09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT10eXBlb2YgbW9kdWxlP24oZXhwb3J0cyk6ImZ1bmN0aW9uIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUoWyJleHBvcnRzIl0sbik6bih0LmQzPXQuZDN8fHt9KX0odGhpcyxmdW5jdGlvbih0KXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gbih0LG4pe3JldHVybiB0PG4/LTE6dD5uPzE6dD49bj8wOk5hTn1mdW5jdGlvbiBlKHQpe3ZhciBlO3JldHVybiAxPT09dC5sZW5ndGgmJihlPXQsdD1mdW5jdGlvbih0LHIpe3JldHVybiBuKGUodCkscil9KSx7bGVmdDpmdW5jdGlvbihuLGUscixpKXtmb3IobnVsbD09ciYmKHI9MCksbnVsbD09aSYmKGk9bi5sZW5ndGgpO3I8aTspe3ZhciBvPXIraT4+PjE7dChuW29dLGUpPDA/cj1vKzE6aT1vfXJldHVybiByfSxyaWdodDpmdW5jdGlvbihuLGUscixpKXtmb3IobnVsbD09ciYmKHI9MCksbnVsbD09aSYmKGk9bi5sZW5ndGgpO3I8aTspe3ZhciBvPXIraT4+PjE7dChuW29dLGUpPjA/aT1vOnI9bysxfXJldHVybiByfX19dmFyIHI9ZShuKSxpPXIucmlnaHQsbz1yLmxlZnQ7ZnVuY3Rpb24gYSh0LG4pe3JldHVyblt0LG5dfWZ1bmN0aW9uIHUodCl7cmV0dXJuIG51bGw9PT10P05hTjordH1mdW5jdGlvbiBmKHQsbil7dmFyIGUscixpPXQubGVuZ3RoLG89MCxhPS0xLGY9MCxjPTA7aWYobnVsbD09bilmb3IoOysrYTxpOylpc05hTihlPXUodFthXSkpfHwoYys9KHI9ZS1mKSooZS0oZis9ci8rK28pKSk7ZWxzZSBmb3IoOysrYTxpOylpc05hTihlPXUobih0W2FdLGEsdCkpKXx8KGMrPShyPWUtZikqKGUtKGYrPXIvKytvKSkpO2lmKG8+MSlyZXR1cm4gYy8oby0xKX1mdW5jdGlvbiBjKHQsbil7dmFyIGU9Zih0LG4pO3JldHVybiBlP01hdGguc3FydChlKTplfWZ1bmN0aW9uIHModCxuKXt2YXIgZSxyLGksbz10Lmxlbmd0aCxhPS0xO2lmKG51bGw9PW4pe2Zvcig7KythPG87KWlmKG51bGwhPShlPXRbYV0pJiZlPj1lKWZvcihyPWk9ZTsrK2E8bzspbnVsbCE9KGU9dFthXSkmJihyPmUmJihyPWUpLGk8ZSYmKGk9ZSkpfWVsc2UgZm9yKDsrK2E8bzspaWYobnVsbCE9KGU9bih0W2FdLGEsdCkpJiZlPj1lKWZvcihyPWk9ZTsrK2E8bzspbnVsbCE9KGU9bih0W2FdLGEsdCkpJiYocj5lJiYocj1lKSxpPGUmJihpPWUpKTtyZXR1cm5bcixpXX12YXIgbD1BcnJheS5wcm90b3R5cGUsaD1sLnNsaWNlLGQ9bC5tYXA7ZnVuY3Rpb24gcCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gdih0KXtyZXR1cm4gdH1mdW5jdGlvbiBnKHQsbixlKXt0PSt0LG49K24sZT0oaT1hcmd1bWVudHMubGVuZ3RoKTwyPyhuPXQsdD0wLDEpOmk8Mz8xOitlO2Zvcih2YXIgcj0tMSxpPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKG4tdCkvZSkpLG89bmV3IEFycmF5KGkpOysrcjxpOylvW3JdPXQrciplO3JldHVybiBvfXZhciB5PU1hdGguc3FydCg1MCksXz1NYXRoLnNxcnQoMTApLGI9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIG0odCxuLGUpe3ZhciByLGksbyxhLHU9LTE7aWYoZT0rZSwodD0rdCk9PT0obj0rbikmJmU+MClyZXR1cm5bdF07aWYoKHI9bjx0KSYmKGk9dCx0PW4sbj1pKSwwPT09KGE9eCh0LG4sZSkpfHwhaXNGaW5pdGUoYSkpcmV0dXJuW107aWYoYT4wKWZvcih0PU1hdGguY2VpbCh0L2EpLG49TWF0aC5mbG9vcihuL2EpLG89bmV3IEFycmF5KGk9TWF0aC5jZWlsKG4tdCsxKSk7Kyt1PGk7KW9bdV09KHQrdSkqYTtlbHNlIGZvcih0PU1hdGguZmxvb3IodCphKSxuPU1hdGguY2VpbChuKmEpLG89bmV3IEFycmF5KGk9TWF0aC5jZWlsKHQtbisxKSk7Kyt1PGk7KW9bdV09KHQtdSkvYTtyZXR1cm4gciYmby5yZXZlcnNlKCksb31mdW5jdGlvbiB4KHQsbixlKXt2YXIgcj0obi10KS9NYXRoLm1heCgwLGUpLGk9TWF0aC5mbG9vcihNYXRoLmxvZyhyKS9NYXRoLkxOMTApLG89ci9NYXRoLnBvdygxMCxpKTtyZXR1cm4gaT49MD8obz49eT8xMDpvPj1fPzU6bz49Yj8yOjEpKk1hdGgucG93KDEwLGkpOi1NYXRoLnBvdygxMCwtaSkvKG8+PXk/MTA6bz49Xz81Om8+PWI/MjoxKX1mdW5jdGlvbiB3KHQsbixlKXt2YXIgcj1NYXRoLmFicyhuLXQpL01hdGgubWF4KDAsZSksaT1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKHIpL01hdGguTE4xMCkpLG89ci9pO3JldHVybiBvPj15P2kqPTEwOm8+PV8/aSo9NTpvPj1iJiYoaSo9Miksbjx0Py1pOml9ZnVuY3Rpb24gTSh0KXtyZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHQubGVuZ3RoKS9NYXRoLkxOMikrMX1mdW5jdGlvbiBBKHQsbixlKXtpZihudWxsPT1lJiYoZT11KSxyPXQubGVuZ3RoKXtpZigobj0rbik8PTB8fHI8MilyZXR1cm4rZSh0WzBdLDAsdCk7aWYobj49MSlyZXR1cm4rZSh0W3ItMV0sci0xLHQpO3ZhciByLGk9KHItMSkqbixvPU1hdGguZmxvb3IoaSksYT0rZSh0W29dLG8sdCk7cmV0dXJuIGErKCtlKHRbbysxXSxvKzEsdCktYSkqKGktbyl9fWZ1bmN0aW9uIFQodCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmZT5yJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJmU+ciYmKHI9ZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gTih0KXtmb3IodmFyIG4sZSxyLGk9dC5sZW5ndGgsbz0tMSxhPTA7KytvPGk7KWErPXRbb10ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKTstLWk+PTA7KWZvcihuPShyPXRbaV0pLmxlbmd0aDstLW4+PTA7KWVbLS1hXT1yW25dO3JldHVybiBlfWZ1bmN0aW9uIFModCxuKXt2YXIgZSxyLGk9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1uKXtmb3IoOysrbzxpOylpZihudWxsIT0oZT10W29dKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT10W29dKSYmcj5lJiYocj1lKX1lbHNlIGZvcig7KytvPGk7KWlmKG51bGwhPShlPW4odFtvXSxvLHQpKSYmZT49ZSlmb3Iocj1lOysrbzxpOyludWxsIT0oZT1uKHRbb10sbyx0KSkmJnI+ZSYmKHI9ZSk7cmV0dXJuIHJ9ZnVuY3Rpb24gRSh0KXtpZighKGk9dC5sZW5ndGgpKXJldHVybltdO2Zvcih2YXIgbj0tMSxlPVModCxrKSxyPW5ldyBBcnJheShlKTsrK248ZTspZm9yKHZhciBpLG89LTEsYT1yW25dPW5ldyBBcnJheShpKTsrK288aTspYVtvXT10W29dW25dO3JldHVybiByfWZ1bmN0aW9uIGsodCl7cmV0dXJuIHQubGVuZ3RofXZhciBDPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBQKHQpe3JldHVybiB0fXZhciB6PTEsUj0yLEw9MyxEPTQsVT0xZS02O2Z1bmN0aW9uIHEodCl7cmV0dXJuInRyYW5zbGF0ZSgiKyh0Ky41KSsiLDApIn1mdW5jdGlvbiBPKHQpe3JldHVybiJ0cmFuc2xhdGUoMCwiKyh0Ky41KSsiKSJ9ZnVuY3Rpb24gWSgpe3JldHVybiF0aGlzLl9fYXhpc31mdW5jdGlvbiBCKHQsbil7dmFyIGU9W10scj1udWxsLGk9bnVsbCxvPTYsYT02LHU9MyxmPXQ9PT16fHx0PT09RD8tMToxLGM9dD09PUR8fHQ9PT1SPyJ4IjoieSIscz10PT09enx8dD09PUw/cTpPO2Z1bmN0aW9uIGwobCl7dmFyIGg9bnVsbD09cj9uLnRpY2tzP24udGlja3MuYXBwbHkobixlKTpuLmRvbWFpbigpOnIsZD1udWxsPT1pP24udGlja0Zvcm1hdD9uLnRpY2tGb3JtYXQuYXBwbHkobixlKTpQOmkscD1NYXRoLm1heChvLDApK3Usdj1uLnJhbmdlKCksZz0rdlswXSsuNSx5PSt2W3YubGVuZ3RoLTFdKy41LF89KG4uYmFuZHdpZHRoP2Z1bmN0aW9uKHQpe3ZhciBuPU1hdGgubWF4KDAsdC5iYW5kd2lkdGgoKS0xKS8yO3JldHVybiB0LnJvdW5kKCkmJihuPU1hdGgucm91bmQobikpLGZ1bmN0aW9uKGUpe3JldHVybit0KGUpK259fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuK3Qobil9fSkobi5jb3B5KCkpLGI9bC5zZWxlY3Rpb24/bC5zZWxlY3Rpb24oKTpsLG09Yi5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFtudWxsXSkseD1iLnNlbGVjdEFsbCgiLnRpY2siKS5kYXRhKGgsbikub3JkZXIoKSx3PXguZXhpdCgpLE09eC5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwidGljayIpLEE9eC5zZWxlY3QoImxpbmUiKSxUPXguc2VsZWN0KCJ0ZXh0Iik7bT1tLm1lcmdlKG0uZW50ZXIoKS5pbnNlcnQoInBhdGgiLCIudGljayIpLmF0dHIoImNsYXNzIiwiZG9tYWluIikuYXR0cigic3Ryb2tlIiwiY3VycmVudENvbG9yIikpLHg9eC5tZXJnZShNKSxBPUEubWVyZ2UoTS5hcHBlbmQoImxpbmUiKS5hdHRyKCJzdHJva2UiLCJjdXJyZW50Q29sb3IiKS5hdHRyKGMrIjIiLGYqbykpLFQ9VC5tZXJnZShNLmFwcGVuZCgidGV4dCIpLmF0dHIoImZpbGwiLCJjdXJyZW50Q29sb3IiKS5hdHRyKGMsZipwKS5hdHRyKCJkeSIsdD09PXo/IjBlbSI6dD09PUw/IjAuNzFlbSI6IjAuMzJlbSIpKSxsIT09YiYmKG09bS50cmFuc2l0aW9uKGwpLHg9eC50cmFuc2l0aW9uKGwpLEE9QS50cmFuc2l0aW9uKGwpLFQ9VC50cmFuc2l0aW9uKGwpLHc9dy50cmFuc2l0aW9uKGwpLmF0dHIoIm9wYWNpdHkiLFUpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9Xyh0KSk/cyh0KTp0aGlzLmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIil9KSxNLmF0dHIoIm9wYWNpdHkiLFUpLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24odCl7dmFyIG49dGhpcy5wYXJlbnROb2RlLl9fYXhpcztyZXR1cm4gcyhuJiZpc0Zpbml0ZShuPW4odCkpP246Xyh0KSl9KSksdy5yZW1vdmUoKSxtLmF0dHIoImQiLHQ9PT1EfHx0PT1SP2E/Ik0iK2YqYSsiLCIrZysiSDAuNVYiK3krIkgiK2YqYToiTTAuNSwiK2crIlYiK3k6YT8iTSIrZysiLCIrZiphKyJWMC41SCIreSsiViIrZiphOiJNIitnKyIsMC41SCIreSkseC5hdHRyKCJvcGFjaXR5IiwxKS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKHQpe3JldHVybiBzKF8odCkpfSksQS5hdHRyKGMrIjIiLGYqbyksVC5hdHRyKGMsZipwKS50ZXh0KGQpLGIuZmlsdGVyKFkpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigiZm9udC1zaXplIiwxMCkuYXR0cigiZm9udC1mYW1pbHkiLCJzYW5zLXNlcmlmIikuYXR0cigidGV4dC1hbmNob3IiLHQ9PT1SPyJzdGFydCI6dD09PUQ/ImVuZCI6Im1pZGRsZSIpLGIuZWFjaChmdW5jdGlvbigpe3RoaXMuX19heGlzPV99KX1yZXR1cm4gbC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGwpOm59LGwudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gZT1DLmNhbGwoYXJndW1lbnRzKSxsfSxsLnRpY2tBcmd1bWVudHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9bXTpDLmNhbGwodCksbCk6ZS5zbGljZSgpfSxsLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOkMuY2FsbCh0KSxsKTpyJiZyLnNsaWNlKCl9LGwudGlja0Zvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LGwpOml9LGwudGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89YT0rdCxsKTpvfSxsLnRpY2tTaXplSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3QsbCk6b30sbC50aWNrU2l6ZU91dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LGwpOmF9LGwudGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3QsbCk6dX0sbH12YXIgRj17dmFsdWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBJKCl7Zm9yKHZhciB0LG49MCxlPWFyZ3VtZW50cy5sZW5ndGgscj17fTtuPGU7KytuKXtpZighKHQ9YXJndW1lbnRzW25dKyIiKXx8dCBpbiByKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO3JbdF09W119cmV0dXJuIG5ldyBIKHIpfWZ1bmN0aW9uIEgodCl7dGhpcy5fPXR9ZnVuY3Rpb24gaih0LG4pe2Zvcih2YXIgZSxyPTAsaT10Lmxlbmd0aDtyPGk7KytyKWlmKChlPXRbcl0pLm5hbWU9PT1uKXJldHVybiBlLnZhbHVlfWZ1bmN0aW9uIFgodCxuLGUpe2Zvcih2YXIgcj0wLGk9dC5sZW5ndGg7cjxpOysrcilpZih0W3JdLm5hbWU9PT1uKXt0W3JdPUYsdD10LnNsaWNlKDAscikuY29uY2F0KHQuc2xpY2UocisxKSk7YnJlYWt9cmV0dXJuIG51bGwhPWUmJnQucHVzaCh7bmFtZTpuLHZhbHVlOmV9KSx0fUgucHJvdG90eXBlPUkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpILG9uOmZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXRoaXMuXyxvPShyPWksKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtpZihlPj0wJiYobj10LnNsaWNlKGUrMSksdD10LnNsaWNlKDAsZSkpLHQmJiFyLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKSxhPS0xLHU9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1uJiYiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrbik7Zm9yKDsrK2E8dTspaWYoZT0odD1vW2FdKS50eXBlKWlbZV09WChpW2VdLHQubmFtZSxuKTtlbHNlIGlmKG51bGw9PW4pZm9yKGUgaW4gaSlpW2VdPVgoaVtlXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK2E8dTspaWYoKGU9KHQ9b1thXSkudHlwZSkmJihlPWooaVtlXSx0Lm5hbWUpKSlyZXR1cm4gZX0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LG49dGhpcy5fO2Zvcih2YXIgZSBpbiBuKXRbZV09bltlXS5zbGljZSgpO3JldHVybiBuZXcgSCh0KX0sY2FsbDpmdW5jdGlvbih0LG4pe2lmKChlPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIGUscixpPW5ldyBBcnJheShlKSxvPTA7bzxlOysrbylpW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKG89MCxlPShyPXRoaXMuX1t0XSkubGVuZ3RoO288ZTsrK28pcltvXS52YWx1ZS5hcHBseShuLGkpfSxhcHBseTpmdW5jdGlvbih0LG4sZSl7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3IodmFyIHI9dGhpcy5fW3RdLGk9MCxvPXIubGVuZ3RoO2k8bzsrK2kpcltpXS52YWx1ZS5hcHBseShuLGUpfX07dmFyIEc9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLFY9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOkcseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtmdW5jdGlvbiAkKHQpe3ZhciBuPXQrPSIiLGU9bi5pbmRleE9mKCI6Iik7cmV0dXJuIGU+PTAmJiJ4bWxucyIhPT0obj10LnNsaWNlKDAsZSkpJiYodD10LnNsaWNlKGUrMSkpLFYuaGFzT3duUHJvcGVydHkobik/e3NwYWNlOlZbbl0sbG9jYWw6dH06dH1mdW5jdGlvbiBXKHQpe3ZhciBuPSQodCk7cmV0dXJuKG4ubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlModC5zcGFjZSx0LmxvY2FsKX19OmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMub3duZXJEb2N1bWVudCxlPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBlPT09RyYmbi5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09Rz9uLmNyZWF0ZUVsZW1lbnQodCk6bi5jcmVhdGVFbGVtZW50TlMoZSx0KX19KShuKX1mdW5jdGlvbiBaKCl7fWZ1bmN0aW9uIFEodCl7cmV0dXJuIG51bGw9PXQ/WjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fWZ1bmN0aW9uIEooKXtyZXR1cm5bXX1mdW5jdGlvbiBLKHQpe3JldHVybiBudWxsPT10P0o6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfX12YXIgdHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19O2lmKCJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQpe3ZhciBudD1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7aWYoIW50Lm1hdGNoZXMpe3ZhciBldD1udC53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fG50Lm1zTWF0Y2hlc1NlbGVjdG9yfHxudC5tb3pNYXRjaGVzU2VsZWN0b3J8fG50Lm9NYXRjaGVzU2VsZWN0b3I7dHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGV0LmNhbGwodGhpcyx0KX19fX12YXIgcnQ9dHQ7ZnVuY3Rpb24gaXQodCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9ZnVuY3Rpb24gb3QodCxuKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPW59b3QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvdCxhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LG4pfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fTt2YXIgYXQ9IiQiO2Z1bmN0aW9uIHV0KHQsbixlLHIsaSxvKXtmb3IodmFyIGEsdT0wLGY9bi5sZW5ndGgsYz1vLmxlbmd0aDt1PGM7Kyt1KShhPW5bdV0pPyhhLl9fZGF0YV9fPW9bdV0sclt1XT1hKTplW3VdPW5ldyBvdCh0LG9bdV0pO2Zvcig7dTxmOysrdSkoYT1uW3VdKSYmKGlbdV09YSl9ZnVuY3Rpb24gZnQodCxuLGUscixpLG8sYSl7dmFyIHUsZixjLHM9e30sbD1uLmxlbmd0aCxoPW8ubGVuZ3RoLGQ9bmV3IEFycmF5KGwpO2Zvcih1PTA7dTxsOysrdSkoZj1uW3VdKSYmKGRbdV09Yz1hdCthLmNhbGwoZixmLl9fZGF0YV9fLHUsbiksYyBpbiBzP2lbdV09ZjpzW2NdPWYpO2Zvcih1PTA7dTxoOysrdSkoZj1zW2M9YXQrYS5jYWxsKHQsb1t1XSx1LG8pXSk/KHJbdV09ZixmLl9fZGF0YV9fPW9bdV0sc1tjXT1udWxsKTplW3VdPW5ldyBvdCh0LG9bdV0pO2Zvcih1PTA7dTxsOysrdSkoZj1uW3VdKSYmc1tkW3VdXT09PWYmJihpW3VdPWYpfWZ1bmN0aW9uIGN0KHQsbil7cmV0dXJuIHQ8bj8tMTp0Pm4/MTp0Pj1uPzA6TmFOfWZ1bmN0aW9uIHN0KHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld31mdW5jdGlvbiBsdCh0LG4pe3JldHVybiB0LnN0eWxlLmdldFByb3BlcnR5VmFsdWUobil8fHN0KHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG4pfWZ1bmN0aW9uIGh0KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBkdCh0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyBwdCh0KX1mdW5jdGlvbiBwdCh0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9aHQodC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiB2dCh0LG4pe2Zvcih2YXIgZT1kdCh0KSxyPS0xLGk9bi5sZW5ndGg7KytyPGk7KWUuYWRkKG5bcl0pfWZ1bmN0aW9uIGd0KHQsbil7Zm9yKHZhciBlPWR0KHQpLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspZS5yZW1vdmUobltyXSl9ZnVuY3Rpb24geXQoKXt0aGlzLnRleHRDb250ZW50PSIifWZ1bmN0aW9uIF90KCl7dGhpcy5pbm5lckhUTUw9IiJ9ZnVuY3Rpb24gYnQoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gbXQoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiB4dCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIHd0KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gTXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMSksdGhpcy5uZXh0U2libGluZyl9ZnVuY3Rpb24gQXQoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMCksdGhpcy5uZXh0U2libGluZyl9cHQucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtuPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKG4sMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgVHQ9e307KHQuZXZlbnQ9bnVsbCwidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50KSYmKCJvbm1vdXNlZW50ZXIiaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHwoVHQ9e21vdXNlZW50ZXI6Im1vdXNlb3ZlciIsbW91c2VsZWF2ZToibW91c2VvdXQifSkpO2Z1bmN0aW9uIE50KHQsbixlKXtyZXR1cm4gdD1TdCh0LG4sZSksZnVuY3Rpb24obil7dmFyIGU9bi5yZWxhdGVkVGFyZ2V0O2UmJihlPT09dGhpc3x8OCZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpKXx8dC5jYWxsKHRoaXMsbil9fWZ1bmN0aW9uIFN0KG4sZSxyKXtyZXR1cm4gZnVuY3Rpb24oaSl7dmFyIG89dC5ldmVudDt0LmV2ZW50PWk7dHJ5e24uY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxyKX1maW5hbGx5e3QuZXZlbnQ9b319fWZ1bmN0aW9uIEV0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMuX19vbjtpZihuKXtmb3IodmFyIGUscj0wLGk9LTEsbz1uLmxlbmd0aDtyPG87KytyKWU9bltyXSx0LnR5cGUmJmUudHlwZSE9PXQudHlwZXx8ZS5uYW1lIT09dC5uYW1lP25bKytpXT1lOnRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLnR5cGUsZS5saXN0ZW5lcixlLmNhcHR1cmUpOysraT9uLmxlbmd0aD1pOmRlbGV0ZSB0aGlzLl9fb259fX1mdW5jdGlvbiBrdCh0LG4sZSl7dmFyIHI9VHQuaGFzT3duUHJvcGVydHkodC50eXBlKT9OdDpTdDtyZXR1cm4gZnVuY3Rpb24oaSxvLGEpe3ZhciB1LGY9dGhpcy5fX29uLGM9cihuLG8sYSk7aWYoZilmb3IodmFyIHM9MCxsPWYubGVuZ3RoO3M8bDsrK3MpaWYoKHU9ZltzXSkudHlwZT09PXQudHlwZSYmdS5uYW1lPT09dC5uYW1lKXJldHVybiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIodS50eXBlLHUubGlzdGVuZXIsdS5jYXB0dXJlKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIodS50eXBlLHUubGlzdGVuZXI9Yyx1LmNhcHR1cmU9ZSksdm9pZCh1LnZhbHVlPW4pO3RoaXMuYWRkRXZlbnRMaXN0ZW5lcih0LnR5cGUsYyxlKSx1PXt0eXBlOnQudHlwZSxuYW1lOnQubmFtZSx2YWx1ZTpuLGxpc3RlbmVyOmMsY2FwdHVyZTplfSxmP2YucHVzaCh1KTp0aGlzLl9fb249W3VdfX1mdW5jdGlvbiBDdChuLGUscixpKXt2YXIgbz10LmV2ZW50O24uc291cmNlRXZlbnQ9dC5ldmVudCx0LmV2ZW50PW47dHJ5e3JldHVybiBlLmFwcGx5KHIsaSl9ZmluYWxseXt0LmV2ZW50PW99fWZ1bmN0aW9uIFB0KHQsbixlKXt2YXIgcj1zdCh0KSxpPXIuQ3VzdG9tRXZlbnQ7ImZ1bmN0aW9uIj09dHlwZW9mIGk/aT1uZXcgaShuLGUpOihpPXIuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50IiksZT8oaS5pbml0RXZlbnQobixlLmJ1YmJsZXMsZS5jYW5jZWxhYmxlKSxpLmRldGFpbD1lLmRldGFpbCk6aS5pbml0RXZlbnQobiwhMSwhMSkpLHQuZGlzcGF0Y2hFdmVudChpKX12YXIgenQ9W251bGxdO2Z1bmN0aW9uIFJ0KHQsbil7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1ufWZ1bmN0aW9uIEx0KCl7cmV0dXJuIG5ldyBSdChbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLHp0KX1mdW5jdGlvbiBEdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFJ0KFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgUnQoW1t0XV0senQpfVJ0LnByb3RvdHlwZT1MdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlJ0LHNlbGVjdDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9USh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhLHU9bltpXSxmPXUubGVuZ3RoLGM9cltpXT1uZXcgQXJyYXkoZikscz0wO3M8ZjsrK3MpKG89dVtzXSkmJihhPXQuY2FsbChvLG8uX19kYXRhX18scyx1KSkmJigiX19kYXRhX18iaW4gbyYmKGEuX19kYXRhX189by5fX2RhdGFfXyksY1tzXT1hKTtyZXR1cm4gbmV3IFJ0KHIsdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9Syh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9W10saT1bXSxvPTA7bzxlOysrbylmb3IodmFyIGEsdT1uW29dLGY9dS5sZW5ndGgsYz0wO2M8ZjsrK2MpKGE9dVtjXSkmJihyLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHUpKSxpLnB1c2goYSkpO3JldHVybiBuZXcgUnQocixpKX0sZmlsdGVyOmZ1bmN0aW9uKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1ydCh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7KytpKWZvcih2YXIgbyxhPW5baV0sdT1hLmxlbmd0aCxmPXJbaV09W10sYz0wO2M8dTsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmZi5wdXNoKG8pO3JldHVybiBuZXcgUnQocix0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbih0LG4pe2lmKCF0KXJldHVybiBwPW5ldyBBcnJheSh0aGlzLnNpemUoKSkscz0tMSx0aGlzLmVhY2goZnVuY3Rpb24odCl7cFsrK3NdPXR9KSxwO3ZhciBlLHI9bj9mdDp1dCxpPXRoaXMuX3BhcmVudHMsbz10aGlzLl9ncm91cHM7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJihlPXQsdD1mdW5jdGlvbigpe3JldHVybiBlfSk7Zm9yKHZhciBhPW8ubGVuZ3RoLHU9bmV3IEFycmF5KGEpLGY9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHM9MDtzPGE7KytzKXt2YXIgbD1pW3NdLGg9b1tzXSxkPWgubGVuZ3RoLHA9dC5jYWxsKGwsbCYmbC5fX2RhdGFfXyxzLGkpLHY9cC5sZW5ndGgsZz1mW3NdPW5ldyBBcnJheSh2KSx5PXVbc109bmV3IEFycmF5KHYpO3IobCxoLGcseSxjW3NdPW5ldyBBcnJheShkKSxwLG4pO2Zvcih2YXIgXyxiLG09MCx4PTA7bTx2OysrbSlpZihfPWdbbV0pe2ZvcihtPj14JiYoeD1tKzEpOyEoYj15W3hdKSYmKyt4PHY7KTtfLl9uZXh0PWJ8fG51bGx9fXJldHVybih1PW5ldyBSdCh1LGkpKS5fZW50ZXI9Zix1Ll9leGl0PWMsdX0sZW50ZXI6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFJ0KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKGl0KSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbigpe3JldHVybiBuZXcgUnQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChpdCksdGhpcy5fcGFyZW50cyl9LG1lcmdlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSxhPW5ldyBBcnJheShyKSx1PTA7dTxvOysrdSlmb3IodmFyIGYsYz1uW3VdLHM9ZVt1XSxsPWMubGVuZ3RoLGg9YVt1XT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGY9Y1tkXXx8c1tkXSkmJihoW2RdPWYpO2Zvcig7dTxyOysrdSlhW3VdPW5bdV07cmV0dXJuIG5ldyBSdChhLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsbj0tMSxlPXQubGVuZ3RoOysrbjxlOylmb3IodmFyIHIsaT10W25dLG89aS5sZW5ndGgtMSxhPWlbb107LS1vPj0wOykocj1pW29dKSYmKGEmJmEhPT1yLm5leHRTaWJsaW5nJiZhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHIsYSksYT1yKTtyZXR1cm4gdGhpc30sc29ydDpmdW5jdGlvbih0KXtmdW5jdGlvbiBuKG4sZSl7cmV0dXJuIG4mJmU/dChuLl9fZGF0YV9fLGUuX19kYXRhX18pOiFuLSFlfXR8fCh0PWN0KTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLHI9ZS5sZW5ndGgsaT1uZXcgQXJyYXkociksbz0wO288cjsrK28pe2Zvcih2YXIgYSx1PWVbb10sZj11Lmxlbmd0aCxjPWlbb109bmV3IEFycmF5KGYpLHM9MDtzPGY7KytzKShhPXVbc10pJiYoY1tzXT1hKTtjLnNvcnQobil9cmV0dXJuIG5ldyBSdChpLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGNhbGw6ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxuPS0xO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt0Wysrbl09dGhpc30pLHR9LG5vZGU6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLG49MCxlPXQubGVuZ3RoO248ZTsrK24pZm9yKHZhciByPXRbbl0saT0wLG89ci5sZW5ndGg7aTxvOysraSl7dmFyIGE9cltpXTtpZihhKXJldHVybiBhfXJldHVybiBudWxsfSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7Kyt0fSksdH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxlPTAscj1uLmxlbmd0aDtlPHI7KytlKWZvcih2YXIgaSxvPW5bZV0sYT0wLHU9by5sZW5ndGg7YTx1OysrYSkoaT1vW2FdKSYmdC5jYWxsKGksaS5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uKHQsbil7dmFyIGU9JCh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciByPXRoaXMubm9kZSgpO3JldHVybiBlLmxvY2FsP3IuZ2V0QXR0cmlidXRlTlMoZS5zcGFjZSxlLmxvY2FsKTpyLmdldEF0dHJpYnV0ZShlKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1uP2UubG9jYWw/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9lLmxvY2FsP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZSl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWU/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19OmUubG9jYWw/ZnVuY3Rpb24odCxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuKX19OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxuKX19KShlLG4pKX0sc3R5bGU6ZnVuY3Rpb24odCxuLGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1uP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fToiZnVuY3Rpb24iPT10eXBlb2Ygbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09cj90aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpOnRoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxyLGUpfX06ZnVuY3Rpb24odCxuLGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxuLGUpfX0pKHQsbixudWxsPT1lPyIiOmUpKTpsdCh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24odCxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19OiJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09ZT9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPWV9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXNbdF09bn19KSh0LG4pKTp0aGlzLm5vZGUoKVt0XX0sY2xhc3NlZDpmdW5jdGlvbih0LG4pe3ZhciBlPWh0KHQrIiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciByPWR0KHRoaXMubm9kZSgpKSxpPS0xLG89ZS5sZW5ndGg7KytpPG87KWlmKCFyLmNvbnRhaW5zKGVbaV0pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7KG4uYXBwbHkodGhpcyxhcmd1bWVudHMpP3Z0Omd0KSh0aGlzLHQpfX06bj9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2dCh0aGlzLHQpfX06ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7Z3QodGhpcyx0KX19KShlLG4pKX0sdGV4dDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD95dDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49dC5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1uPyIiOm59fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fSkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P190OigiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1uPyIiOm59fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX0pKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChidCl9LGxvd2VyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaChtdCl9LGFwcGVuZDpmdW5jdGlvbih0KXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlcodCk7cmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSl9LGluc2VydDpmdW5jdGlvbih0LG4pe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Vyh0KSxyPW51bGw9PW4/eHQ6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRKG4pO3JldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KX0scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaCh3dCl9LGNsb25lOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNlbGVjdCh0P0F0Ok10KX0sZGF0dW06ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLHQpOnRoaXMubm9kZSgpLl9fZGF0YV9ffSxvbjpmdW5jdGlvbih0LG4sZSl7dmFyIHIsaSxvPWZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCl7dmFyIG49IiIsZT10LmluZGV4T2YoIi4iKTtyZXR1cm4gZT49MCYmKG49dC5zbGljZShlKzEpLHQ9dC5zbGljZSgwLGUpKSx7dHlwZTp0LG5hbWU6bn19KX0odCsiIiksYT1vLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2Zvcih1PW4/a3Q6RXQsbnVsbD09ZSYmKGU9ITEpLHI9MDtyPGE7KytyKXRoaXMuZWFjaCh1KG9bcl0sbixlKSk7cmV0dXJuIHRoaXN9dmFyIHU9dGhpcy5ub2RlKCkuX19vbjtpZih1KWZvcih2YXIgZixjPTAscz11Lmxlbmd0aDtjPHM7KytjKWZvcihyPTAsZj11W2NdO3I8YTsrK3IpaWYoKGk9b1tyXSkudHlwZT09PWYudHlwZSYmaS5uYW1lPT09Zi5uYW1lKXJldHVybiBmLnZhbHVlfSxkaXNwYXRjaDpmdW5jdGlvbih0LG4pe3JldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBuP2Z1bmN0aW9uKHQsbil7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFB0KHRoaXMsdCxuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fTpmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBQdCh0aGlzLHQsbil9fSkodCxuKSl9fTt2YXIgVXQ9MDtmdW5jdGlvbiBxdCgpe3JldHVybiBuZXcgT3R9ZnVuY3Rpb24gT3QoKXt0aGlzLl89IkAiKygrK1V0KS50b1N0cmluZygzNil9ZnVuY3Rpb24gWXQoKXtmb3IodmFyIG4sZT10LmV2ZW50O249ZS5zb3VyY2VFdmVudDspZT1uO3JldHVybiBlfWZ1bmN0aW9uIEJ0KHQsbil7dmFyIGU9dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYoZS5jcmVhdGVTVkdQb2ludCl7dmFyIHI9ZS5jcmVhdGVTVkdQb2ludCgpO3JldHVybiByLng9bi5jbGllbnRYLHIueT1uLmNsaWVudFksWyhyPXIubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxyLnldfXZhciBpPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW24uY2xpZW50WC1pLmxlZnQtdC5jbGllbnRMZWZ0LG4uY2xpZW50WS1pLnRvcC10LmNsaWVudFRvcF19ZnVuY3Rpb24gRnQodCl7dmFyIG49WXQoKTtyZXR1cm4gbi5jaGFuZ2VkVG91Y2hlcyYmKG49bi5jaGFuZ2VkVG91Y2hlc1swXSksQnQodCxuKX1mdW5jdGlvbiBJdCh0LG4sZSl7YXJndW1lbnRzLmxlbmd0aDwzJiYoZT1uLG49WXQoKS5jaGFuZ2VkVG91Y2hlcyk7Zm9yKHZhciByLGk9MCxvPW4/bi5sZW5ndGg6MDtpPG87KytpKWlmKChyPW5baV0pLmlkZW50aWZpZXI9PT1lKXJldHVybiBCdCh0LHIpO3JldHVybiBudWxsfWZ1bmN0aW9uIEh0KCl7dC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBqdCgpe3QuZXZlbnQucHJldmVudERlZmF1bHQoKSx0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIFh0KHQpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGU9RHQodCkub24oImRyYWdzdGFydC5kcmFnIixqdCwhMCk7Im9uc2VsZWN0c3RhcnQiaW4gbj9lLm9uKCJzZWxlY3RzdGFydC5kcmFnIixqdCwhMCk6KG4uX19ub3NlbGVjdD1uLnN0eWxlLk1velVzZXJTZWxlY3Qsbi5zdHlsZS5Nb3pVc2VyU2VsZWN0PSJub25lIil9ZnVuY3Rpb24gR3QodCxuKXt2YXIgZT10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxyPUR0KHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsbnVsbCk7biYmKHIub24oImNsaWNrLmRyYWciLGp0LCEwKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ci5vbigiY2xpY2suZHJhZyIsbnVsbCl9LDApKSwib25zZWxlY3RzdGFydCJpbiBlP3Iub24oInNlbGVjdHN0YXJ0LmRyYWciLG51bGwpOihlLnN0eWxlLk1velVzZXJTZWxlY3Q9ZS5fX25vc2VsZWN0LGRlbGV0ZSBlLl9fbm9zZWxlY3QpfWZ1bmN0aW9uIFZ0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiAkdCh0LG4sZSxyLGksbyxhLHUsZixjKXt0aGlzLnRhcmdldD10LHRoaXMudHlwZT1uLHRoaXMuc3ViamVjdD1lLHRoaXMuaWRlbnRpZmllcj1yLHRoaXMuYWN0aXZlPWksdGhpcy54PW8sdGhpcy55PWEsdGhpcy5keD11LHRoaXMuZHk9Zix0aGlzLl89Y31mdW5jdGlvbiBXdCgpe3JldHVybiF0LmV2ZW50LmJ1dHRvbn1mdW5jdGlvbiBadCgpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9ZnVuY3Rpb24gUXQobil7cmV0dXJuIG51bGw9PW4/e3g6dC5ldmVudC54LHk6dC5ldmVudC55fTpufWZ1bmN0aW9uIEp0KCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIEt0KHQsbixlKXt0LnByb3RvdHlwZT1uLnByb3RvdHlwZT1lLGUuY29uc3RydWN0b3I9dH1mdW5jdGlvbiB0bih0LG4pe3ZhciBlPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgciBpbiBuKWVbcl09bltyXTtyZXR1cm4gZX1mdW5jdGlvbiBubigpe31PdC5wcm90b3R5cGU9cXQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpPdCxnZXQ6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMuXzshKG4gaW4gdCk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybjtyZXR1cm4gdFtuXX0sc2V0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRbdGhpcy5fXT1ufSxyZW1vdmU6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuXyBpbiB0JiZkZWxldGUgdFt0aGlzLl9dfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fSwkdC5wcm90b3R5cGUub249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl8ub24uYXBwbHkodGhpcy5fLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT10aGlzLl8/dGhpczp0fTt2YXIgZW49IlxccyooWystXT9cXGQrKVxccyoiLHJuPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLG9uPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixhbj0vXiMoWzAtOWEtZl17M30pJC8sdW49L14jKFswLTlhLWZdezZ9KSQvLGZuPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tlbixlbixlbl0rIlxcKSQiKSxjbj1uZXcgUmVnRXhwKCJecmdiXFwoIitbb24sb24sb25dKyJcXCkkIiksc249bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tlbixlbixlbixybl0rIlxcKSQiKSxsbj1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW29uLG9uLG9uLHJuXSsiXFwpJCIpLGhuPW5ldyBSZWdFeHAoIl5oc2xcXCgiK1tybixvbixvbl0rIlxcKSQiKSxkbj1uZXcgUmVnRXhwKCJeaHNsYVxcKCIrW3JuLG9uLG9uLHJuXSsiXFwpJCIpLHBuPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2Z1bmN0aW9uIHZuKHQpe3ZhciBuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwobj1hbi5leGVjKHQpKT9uZXcgbW4oKG49cGFyc2VJbnQoblsxXSwxNikpPj44JjE1fG4+PjQmMjQwLG4+PjQmMTV8MjQwJm4sKDE1Jm4pPDw0fDE1Jm4sMSk6KG49dW4uZXhlYyh0KSk/Z24ocGFyc2VJbnQoblsxXSwxNikpOihuPWZuLmV4ZWModCkpP25ldyBtbihuWzFdLG5bMl0sblszXSwxKToobj1jbi5leGVjKHQpKT9uZXcgbW4oMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsMSk6KG49c24uZXhlYyh0KSk/eW4oblsxXSxuWzJdLG5bM10sbls0XSk6KG49bG4uZXhlYyh0KSk/eW4oMjU1Km5bMV0vMTAwLDI1NSpuWzJdLzEwMCwyNTUqblszXS8xMDAsbls0XSk6KG49aG4uZXhlYyh0KSk/d24oblsxXSxuWzJdLzEwMCxuWzNdLzEwMCwxKToobj1kbi5leGVjKHQpKT93bihuWzFdLG5bMl0vMTAwLG5bM10vMTAwLG5bNF0pOnBuLmhhc093blByb3BlcnR5KHQpP2duKHBuW3RdKToidHJhbnNwYXJlbnQiPT09dD9uZXcgbW4oTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiBnbih0KXtyZXR1cm4gbmV3IG1uKHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCwxKX1mdW5jdGlvbiB5bih0LG4sZSxyKXtyZXR1cm4gcjw9MCYmKHQ9bj1lPU5hTiksbmV3IG1uKHQsbixlLHIpfWZ1bmN0aW9uIF9uKHQpe3JldHVybiB0IGluc3RhbmNlb2Ygbm58fCh0PXZuKHQpKSx0P25ldyBtbigodD10LnJnYigpKS5yLHQuZyx0LmIsdC5vcGFjaXR5KTpuZXcgbW59ZnVuY3Rpb24gYm4odCxuLGUscil7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP19uKHQpOm5ldyBtbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gbW4odCxuLGUscil7dGhpcy5yPSt0LHRoaXMuZz0rbix0aGlzLmI9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIHhuKHQpe3JldHVybigodD1NYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHQpfHwwKSkpPDE2PyIwIjoiIikrdC50b1N0cmluZygxNil9ZnVuY3Rpb24gd24odCxuLGUscil7cmV0dXJuIHI8PTA/dD1uPWU9TmFOOmU8PTB8fGU+PTE/dD1uPU5hTjpuPD0wJiYodD1OYU4pLG5ldyBBbih0LG4sZSxyKX1mdW5jdGlvbiBNbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIEFuKXJldHVybiBuZXcgQW4odC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2Ygbm58fCh0PXZuKHQpKSwhdClyZXR1cm4gbmV3IEFuO2lmKHQgaW5zdGFuY2VvZiBBbilyZXR1cm4gdDt2YXIgbj0odD10LnJnYigpKS5yLzI1NSxlPXQuZy8yNTUscj10LmIvMjU1LGk9TWF0aC5taW4obixlLHIpLG89TWF0aC5tYXgobixlLHIpLGE9TmFOLHU9by1pLGY9KG8raSkvMjtyZXR1cm4gdT8oYT1uPT09bz8oZS1yKS91KzYqKGU8cik6ZT09PW8/KHItbikvdSsyOihuLWUpL3UrNCx1Lz1mPC41P28raToyLW8taSxhKj02MCk6dT1mPjAmJmY8MT8wOmEsbmV3IEFuKGEsdSxmLHQub3BhY2l0eSl9KHQpOm5ldyBBbih0LG4sZSxudWxsPT1yPzE6cil9ZnVuY3Rpb24gQW4odCxuLGUscil7dGhpcy5oPSt0LHRoaXMucz0rbix0aGlzLmw9K2UsdGhpcy5vcGFjaXR5PStyfWZ1bmN0aW9uIFRuKHQsbixlKXtyZXR1cm4gMjU1Kih0PDYwP24rKGUtbikqdC82MDp0PDE4MD9lOnQ8MjQwP24rKGUtbikqKDI0MC10KS82MDpuKX1LdChubix2bix7ZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpfSxoZXg6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKS5oZXgoKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKSsiIn19KSxLdChtbixibix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8xLy43Ok1hdGgucG93KDEvLjcsdCksbmV3IG1uKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBtbih0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4gMDw9dGhpcy5yJiZ0aGlzLnI8PTI1NSYmMDw9dGhpcy5nJiZ0aGlzLmc8PTI1NSYmMDw9dGhpcy5iJiZ0aGlzLmI8PTI1NSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDpmdW5jdGlvbigpe3JldHVybiIjIit4bih0aGlzLnIpK3huKHRoaXMuZykreG4odGhpcy5iKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksS3QoQW4sTW4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/MS8uNzpNYXRoLnBvdygxLy43LHQpLG5ldyBBbih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10Py43Ok1hdGgucG93KC43LHQpLG5ldyBBbih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksbj1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxlPXRoaXMubCxyPWUrKGU8LjU/ZToxLWUpKm4saT0yKmUtcjtyZXR1cm4gbmV3IG1uKFRuKHQ+PTI0MD90LTI0MDp0KzEyMCxpLHIpLFRuKHQsaSxyKSxUbih0PDEyMD90KzI0MDp0LTEyMCxpLHIpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfX0pKTt2YXIgTm49TWF0aC5QSS8xODAsU249MTgwL01hdGguUEksRW49Ljk2NDIyLGtuPTEsQ249LjgyNTIxLFBuPTQvMjksem49Ni8yOSxSbj0zKnpuKnpuLExuPXpuKnpuKnpuO2Z1bmN0aW9uIERuKHQpe2lmKHQgaW5zdGFuY2VvZiBxbilyZXR1cm4gbmV3IHFuKHQubCx0LmEsdC5iLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIGpuKXtpZihpc05hTih0LmgpKXJldHVybiBuZXcgcW4odC5sLDAsMCx0Lm9wYWNpdHkpO3ZhciBuPXQuaCpObjtyZXR1cm4gbmV3IHFuKHQubCxNYXRoLmNvcyhuKSp0LmMsTWF0aC5zaW4obikqdC5jLHQub3BhY2l0eSl9dCBpbnN0YW5jZW9mIG1ufHwodD1fbih0KSk7dmFyIGUscixpPUZuKHQuciksbz1Gbih0LmcpLGE9Rm4odC5iKSx1PU9uKCguMjIyNTA0NSppKy43MTY4Nzg2Km8rLjA2MDYxNjkqYSkva24pO3JldHVybiBpPT09byYmbz09PWE/ZT1yPXU6KGU9T24oKC40MzYwNzQ3KmkrLjM4NTA2NDkqbysuMTQzMDgwNCphKS9Fbikscj1PbigoLjAxMzkzMjIqaSsuMDk3MTA0NSpvKy43MTQxNzMzKmEpL0NuKSksbmV3IHFuKDExNip1LTE2LDUwMCooZS11KSwyMDAqKHUtciksdC5vcGFjaXR5KX1mdW5jdGlvbiBVbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/RG4odCk6bmV3IHFuKHQsbixlLG51bGw9PXI/MTpyKX1mdW5jdGlvbiBxbih0LG4sZSxyKXt0aGlzLmw9K3QsdGhpcy5hPStuLHRoaXMuYj0rZSx0aGlzLm9wYWNpdHk9K3J9ZnVuY3Rpb24gT24odCl7cmV0dXJuIHQ+TG4/TWF0aC5wb3codCwxLzMpOnQvUm4rUG59ZnVuY3Rpb24gWW4odCl7cmV0dXJuIHQ+em4/dCp0KnQ6Um4qKHQtUG4pfWZ1bmN0aW9uIEJuKHQpe3JldHVybiAyNTUqKHQ8PS4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwxLzIuNCktLjA1NSl9ZnVuY3Rpb24gRm4odCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gSW4odCl7aWYodCBpbnN0YW5jZW9mIGpuKXJldHVybiBuZXcgam4odC5oLHQuYyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgcW58fCh0PURuKHQpKSwwPT09dC5hJiYwPT09dC5iKXJldHVybiBuZXcgam4oTmFOLDAsdC5sLHQub3BhY2l0eSk7dmFyIG49TWF0aC5hdGFuMih0LmIsdC5hKSpTbjtyZXR1cm4gbmV3IGpuKG48MD9uKzM2MDpuLE1hdGguc3FydCh0LmEqdC5hK3QuYip0LmIpLHQubCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIEhuKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Jbih0KTpuZXcgam4odCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIGpuKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLmM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1LdChxbixVbix0bihubix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBxbih0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHFuKHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LG49aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxlPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIG5ldyBtbihCbigzLjEzMzg1NjEqKG49RW4qWW4obikpLTEuNjE2ODY2NyoodD1rbipZbih0KSktLjQ5MDYxNDYqKGU9Q24qWW4oZSkpKSxCbigtLjk3ODc2ODQqbisxLjkxNjE0MTUqdCsuMDMzNDU0KmUpLEJuKC4wNzE5NDUzKm4tLjIyODk5MTQqdCsxLjQwNTI0MjcqZSksdGhpcy5vcGFjaXR5KX19KSksS3Qoam4sSG4sdG4obm4se2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgam4odGhpcy5oLHRoaXMuYyx0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBqbih0aGlzLmgsdGhpcy5jLHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiBEbih0aGlzKS5yZ2IoKX19KSk7dmFyIFhuPS0uMTQ4NjEsR249MS43ODI3NyxWbj0tLjI5MjI3LCRuPS0uOTA2NDksV249MS45NzI5NCxabj1XbiokbixRbj1XbipHbixKbj1HbipWbi0kbipYbjtmdW5jdGlvbiBLbih0LG4sZSxyKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZnVuY3Rpb24odCl7aWYodCBpbnN0YW5jZW9mIHRlKXJldHVybiBuZXcgdGUodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgbW58fCh0PV9uKHQpKTt2YXIgbj10LnIvMjU1LGU9dC5nLzI1NSxyPXQuYi8yNTUsaT0oSm4qcitabipuLVFuKmUpLyhKbitabi1Rbiksbz1yLWksYT0oV24qKGUtaSktVm4qbykvJG4sdT1NYXRoLnNxcnQoYSphK28qbykvKFduKmkqKDEtaSkpLGY9dT9NYXRoLmF0YW4yKGEsbykqU24tMTIwOk5hTjtyZXR1cm4gbmV3IHRlKGY8MD9mKzM2MDpmLHUsaSx0Lm9wYWNpdHkpfSh0KTpuZXcgdGUodCxuLGUsbnVsbD09cj8xOnIpfWZ1bmN0aW9uIHRlKHQsbixlLHIpe3RoaXMuaD0rdCx0aGlzLnM9K24sdGhpcy5sPStlLHRoaXMub3BhY2l0eT0rcn1mdW5jdGlvbiBuZSh0LG4sZSxyLGkpe3ZhciBvPXQqdCxhPW8qdDtyZXR1cm4oKDEtMyp0KzMqby1hKSpuKyg0LTYqbyszKmEpKmUrKDErMyp0KzMqby0zKmEpKnIrYSppKS82fWZ1bmN0aW9uIGVlKHQpe3ZhciBuPXQubGVuZ3RoLTE7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciByPWU8PTA/ZT0wOmU+PTE/KGU9MSxuLTEpOk1hdGguZmxvb3IoZSpuKSxpPXRbcl0sbz10W3IrMV0sYT1yPjA/dFtyLTFdOjIqaS1vLHU9cjxuLTE/dFtyKzJdOjIqby1pO3JldHVybiBuZSgoZS1yL24pKm4sYSxpLG8sdSl9fWZ1bmN0aW9uIHJlKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXt2YXIgcj1NYXRoLmZsb29yKCgoZSU9MSk8MD8rK2U6ZSkqbiksaT10WyhyK24tMSklbl0sbz10W3Ilbl0sYT10WyhyKzEpJW5dLHU9dFsocisyKSVuXTtyZXR1cm4gbmUoKGUtci9uKSpuLGksbyxhLHUpfX1mdW5jdGlvbiBpZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gb2UodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQrZSpufX1mdW5jdGlvbiBhZSh0LG4pe3ZhciBlPW4tdDtyZXR1cm4gZT9vZSh0LGU+MTgwfHxlPC0xODA/ZS0zNjAqTWF0aC5yb3VuZChlLzM2MCk6ZSk6aWUoaXNOYU4odCk/bjp0KX1mdW5jdGlvbiB1ZSh0KXtyZXR1cm4gMT09KHQ9K3QpP2ZlOmZ1bmN0aW9uKG4sZSl7cmV0dXJuIGUtbj9mdW5jdGlvbih0LG4sZSl7cmV0dXJuIHQ9TWF0aC5wb3codCxlKSxuPU1hdGgucG93KG4sZSktdCxlPTEvZSxmdW5jdGlvbihyKXtyZXR1cm4gTWF0aC5wb3codCtyKm4sZSl9fShuLGUsdCk6aWUoaXNOYU4obik/ZTpuKX19ZnVuY3Rpb24gZmUodCxuKXt2YXIgZT1uLXQ7cmV0dXJuIGU/b2UodCxlKTppZShpc05hTih0KT9uOnQpfUt0KHRlLEtuLHRuKG5uLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10PzEvLjc6TWF0aC5wb3coMS8uNyx0KSxuZXcgdGUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD8uNzpNYXRoLnBvdyguNyx0KSxuZXcgdGUodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD1pc05hTih0aGlzLmgpPzA6KHRoaXMuaCsxMjApKk5uLG49K3RoaXMubCxlPWlzTmFOKHRoaXMucyk/MDp0aGlzLnMqbiooMS1uKSxyPU1hdGguY29zKHQpLGk9TWF0aC5zaW4odCk7cmV0dXJuIG5ldyBtbigyNTUqKG4rZSooWG4qcitHbippKSksMjU1KihuK2UqKFZuKnIrJG4qaSkpLDI1NSoobitlKihXbipyKSksdGhpcy5vcGFjaXR5KX19KSk7dmFyIGNlPWZ1bmN0aW9uIHQobil7dmFyIGU9dWUobik7ZnVuY3Rpb24gcih0LG4pe3ZhciByPWUoKHQ9Ym4odCkpLnIsKG49Ym4obikpLnIpLGk9ZSh0Lmcsbi5nKSxvPWUodC5iLG4uYiksYT1mZSh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQucj1yKG4pLHQuZz1pKG4pLHQuYj1vKG4pLHQub3BhY2l0eT1hKG4pLHQrIiJ9fXJldHVybiByLmdhbW1hPXQscn0oMSk7ZnVuY3Rpb24gc2UodCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBlLHIsaT1uLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPW5ldyBBcnJheShpKSx1PW5ldyBBcnJheShpKTtmb3IoZT0wO2U8aTsrK2Upcj1ibihuW2VdKSxvW2VdPXIucnx8MCxhW2VdPXIuZ3x8MCx1W2VdPXIuYnx8MDtyZXR1cm4gbz10KG8pLGE9dChhKSx1PXQodSksci5vcGFjaXR5PTEsZnVuY3Rpb24odCl7cmV0dXJuIHIucj1vKHQpLHIuZz1hKHQpLHIuYj11KHQpLHIrIiJ9fX12YXIgbGU9c2UoZWUpLGhlPXNlKHJlKTtmdW5jdGlvbiBkZSh0LG4pe3ZhciBlLHI9bj9uLmxlbmd0aDowLGk9dD9NYXRoLm1pbihyLHQubGVuZ3RoKTowLG89bmV3IEFycmF5KGkpLGE9bmV3IEFycmF5KHIpO2ZvcihlPTA7ZTxpOysrZSlvW2VdPW1lKHRbZV0sbltlXSk7Zm9yKDtlPHI7KytlKWFbZV09bltlXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKGU9MDtlPGk7KytlKWFbZV09b1tlXSh0KTtyZXR1cm4gYX19ZnVuY3Rpb24gcGUodCxuKXt2YXIgZT1uZXcgRGF0ZTtyZXR1cm4gbi09dD0rdCxmdW5jdGlvbihyKXtyZXR1cm4gZS5zZXRUaW1lKHQrbipyKSxlfX1mdW5jdGlvbiB2ZSh0LG4pe3JldHVybiBuLT10PSt0LGZ1bmN0aW9uKGUpe3JldHVybiB0K24qZX19ZnVuY3Rpb24gZ2UodCxuKXt2YXIgZSxyPXt9LGk9e307Zm9yKGUgaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1uJiYib2JqZWN0Ij09dHlwZW9mIG58fChuPXt9KSxuKWUgaW4gdD9yW2VdPW1lKHRbZV0sbltlXSk6aVtlXT1uW2VdO3JldHVybiBmdW5jdGlvbih0KXtmb3IoZSBpbiByKWlbZV09cltlXSh0KTtyZXR1cm4gaX19dmFyIHllPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxfZT1uZXcgUmVnRXhwKHllLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIGJlKHQsbil7dmFyIGUscixpLG89eWUubGFzdEluZGV4PV9lLmxhc3RJbmRleD0wLGE9LTEsdT1bXSxmPVtdO2Zvcih0Kz0iIixuKz0iIjsoZT15ZS5leGVjKHQpKSYmKHI9X2UuZXhlYyhuKSk7KShpPXIuaW5kZXgpPm8mJihpPW4uc2xpY2UobyxpKSx1W2FdP3VbYV0rPWk6dVsrK2FdPWkpLChlPWVbMF0pPT09KHI9clswXSk/dVthXT91W2FdKz1yOnVbKythXT1yOih1WysrYV09bnVsbCxmLnB1c2goe2k6YSx4OnZlKGUscil9KSksbz1fZS5sYXN0SW5kZXg7cmV0dXJuIG88bi5sZW5ndGgmJihpPW4uc2xpY2UobyksdVthXT91W2FdKz1pOnVbKythXT1pKSx1Lmxlbmd0aDwyP2ZbMF0/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KG4pKyIifX0oZlswXS54KTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KG4pOihuPWYubGVuZ3RoLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxyPTA7cjxuOysrcil1WyhlPWZbcl0pLmldPWUueCh0KTtyZXR1cm4gdS5qb2luKCIiKX0pfWZ1bmN0aW9uIG1lKHQsbil7dmFyIGUscj10eXBlb2YgbjtyZXR1cm4gbnVsbD09bnx8ImJvb2xlYW4iPT09cj9pZShuKTooIm51bWJlciI9PT1yP3ZlOiJzdHJpbmciPT09cj8oZT12bihuKSk/KG49ZSxjZSk6YmU6biBpbnN0YW5jZW9mIHZuP2NlOm4gaW5zdGFuY2VvZiBEYXRlP3BlOkFycmF5LmlzQXJyYXkobik/ZGU6ImZ1bmN0aW9uIiE9dHlwZW9mIG4udmFsdWVPZiYmImZ1bmN0aW9uIiE9dHlwZW9mIG4udG9TdHJpbmd8fGlzTmFOKG4pP2dlOnZlKSh0LG4pfWZ1bmN0aW9uIHhlKHQsbil7cmV0dXJuIG4tPXQ9K3QsZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucm91bmQodCtuKmUpfX12YXIgd2UsTWUsQWUsVGUsTmU9MTgwL01hdGguUEksU2U9e3RyYW5zbGF0ZVg6MCx0cmFuc2xhdGVZOjAscm90YXRlOjAsc2tld1g6MCxzY2FsZVg6MSxzY2FsZVk6MX07ZnVuY3Rpb24gRWUodCxuLGUscixpLG8pe3ZhciBhLHUsZjtyZXR1cm4oYT1NYXRoLnNxcnQodCp0K24qbikpJiYodC89YSxuLz1hKSwoZj10KmUrbipyKSYmKGUtPXQqZixyLT1uKmYpLCh1PU1hdGguc3FydChlKmUrcipyKSkmJihlLz11LHIvPXUsZi89dSksdCpyPG4qZSYmKHQ9LXQsbj0tbixmPS1mLGE9LWEpLHt0cmFuc2xhdGVYOmksdHJhbnNsYXRlWTpvLHJvdGF0ZTpNYXRoLmF0YW4yKG4sdCkqTmUsc2tld1g6TWF0aC5hdGFuKGYpKk5lLHNjYWxlWDphLHNjYWxlWTp1fX1mdW5jdGlvbiBrZSh0LG4sZSxyKXtmdW5jdGlvbiBpKHQpe3JldHVybiB0Lmxlbmd0aD90LnBvcCgpKyIgIjoiIn1yZXR1cm4gZnVuY3Rpb24obyxhKXt2YXIgdT1bXSxmPVtdO3JldHVybiBvPXQobyksYT10KGEpLGZ1bmN0aW9uKHQscixpLG8sYSx1KXtpZih0IT09aXx8ciE9PW8pe3ZhciBmPWEucHVzaCgidHJhbnNsYXRlKCIsbnVsbCxuLG51bGwsZSk7dS5wdXNoKHtpOmYtNCx4OnZlKHQsaSl9LHtpOmYtMix4OnZlKHIsbyl9KX1lbHNlKGl8fG8pJiZhLnB1c2goInRyYW5zbGF0ZSgiK2krbitvK2UpfShvLnRyYW5zbGF0ZVgsby50cmFuc2xhdGVZLGEudHJhbnNsYXRlWCxhLnRyYW5zbGF0ZVksdSxmKSxmdW5jdGlvbih0LG4sZSxvKXt0IT09bj8odC1uPjE4MD9uKz0zNjA6bi10PjE4MCYmKHQrPTM2MCksby5wdXNoKHtpOmUucHVzaChpKGUpKyJyb3RhdGUoIixudWxsLHIpLTIseDp2ZSh0LG4pfSkpOm4mJmUucHVzaChpKGUpKyJyb3RhdGUoIituK3IpfShvLnJvdGF0ZSxhLnJvdGF0ZSx1LGYpLGZ1bmN0aW9uKHQsbixlLG8pe3QhPT1uP28ucHVzaCh7aTplLnB1c2goaShlKSsic2tld1goIixudWxsLHIpLTIseDp2ZSh0LG4pfSk6biYmZS5wdXNoKGkoZSkrInNrZXdYKCIrbityKX0oby5za2V3WCxhLnNrZXdYLHUsZiksZnVuY3Rpb24odCxuLGUscixvLGEpe2lmKHQhPT1lfHxuIT09cil7dmFyIHU9by5wdXNoKGkobykrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpO2EucHVzaCh7aTp1LTQseDp2ZSh0LGUpfSx7aTp1LTIseDp2ZShuLHIpfSl9ZWxzZSAxPT09ZSYmMT09PXJ8fG8ucHVzaChpKG8pKyJzY2FsZSgiK2UrIiwiK3IrIikiKX0oby5zY2FsZVgsby5zY2FsZVksYS5zY2FsZVgsYS5zY2FsZVksdSxmKSxvPWE9bnVsbCxmdW5jdGlvbih0KXtmb3IodmFyIG4sZT0tMSxyPWYubGVuZ3RoOysrZTxyOyl1WyhuPWZbZV0pLmldPW4ueCh0KTtyZXR1cm4gdS5qb2luKCIiKX19fXZhciBDZT1rZShmdW5jdGlvbih0KXtyZXR1cm4ibm9uZSI9PT10P1NlOih3ZXx8KHdlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLE1lPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxBZT1kb2N1bWVudC5kZWZhdWx0Vmlldyksd2Uuc3R5bGUudHJhbnNmb3JtPXQsdD1BZS5nZXRDb21wdXRlZFN0eWxlKE1lLmFwcGVuZENoaWxkKHdlKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxNZS5yZW1vdmVDaGlsZCh3ZSksRWUoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0sInB4LCAiLCJweCkiLCJkZWcpIiksUGU9a2UoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/U2U6KFRlfHwoVGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSksVGUuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLHQpLCh0PVRlLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpP0VlKCh0PXQubWF0cml4KS5hLHQuYix0LmMsdC5kLHQuZSx0LmYpOlNlKX0sIiwgIiwiKSIsIikiKSx6ZT1NYXRoLlNRUlQyLFJlPTIsTGU9NCxEZT0xZS0xMjtmdW5jdGlvbiBVZSh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpKzEvdCkvMn1mdW5jdGlvbiBxZSh0LG4pe3ZhciBlLHIsaT10WzBdLG89dFsxXSxhPXRbMl0sdT1uWzBdLGY9blsxXSxjPW5bMl0scz11LWksbD1mLW8saD1zKnMrbCpsO2lmKGg8RGUpcj1NYXRoLmxvZyhjL2EpL3plLGU9ZnVuY3Rpb24odCl7cmV0dXJuW2krdCpzLG8rdCpsLGEqTWF0aC5leHAoemUqdCpyKV19O2Vsc2V7dmFyIGQ9TWF0aC5zcXJ0KGgpLHA9KGMqYy1hKmErTGUqaCkvKDIqYSpSZSpkKSx2PShjKmMtYSphLUxlKmgpLygyKmMqUmUqZCksZz1NYXRoLmxvZyhNYXRoLnNxcnQocCpwKzEpLXApLHk9TWF0aC5sb2coTWF0aC5zcXJ0KHYqdisxKS12KTtyPSh5LWcpL3plLGU9ZnVuY3Rpb24odCl7dmFyIG4sZT10KnIsdT1VZShnKSxmPWEvKFJlKmQpKih1KihuPXplKmUrZywoKG49TWF0aC5leHAoMipuKSktMSkvKG4rMSkpLWZ1bmN0aW9uKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfShnKSk7cmV0dXJuW2krZipzLG8rZipsLGEqdS9VZSh6ZSplK2cpXX19cmV0dXJuIGUuZHVyYXRpb249MWUzKnIsZX1mdW5jdGlvbiBPZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPU1uKG4pKS5oLChlPU1uKGUpKS5oKSxpPWZlKG4ucyxlLnMpLG89ZmUobi5sLGUubCksYT1mZShuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4ucz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgWWU9T2UoYWUpLEJlPU9lKGZlKTtmdW5jdGlvbiBGZSh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj10KChuPUhuKG4pKS5oLChlPUhuKGUpKS5oKSxpPWZlKG4uYyxlLmMpLG89ZmUobi5sLGUubCksYT1mZShuLm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4uaD1yKHQpLG4uYz1pKHQpLG4ubD1vKHQpLG4ub3BhY2l0eT1hKHQpLG4rIiJ9fX12YXIgSWU9RmUoYWUpLEhlPUZlKGZlKTtmdW5jdGlvbiBqZSh0KXtyZXR1cm4gZnVuY3Rpb24gbihlKXtmdW5jdGlvbiByKG4scil7dmFyIGk9dCgobj1LbihuKSkuaCwocj1LbihyKSkuaCksbz1mZShuLnMsci5zKSxhPWZlKG4ubCxyLmwpLHU9ZmUobi5vcGFjaXR5LHIub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuLmg9aSh0KSxuLnM9byh0KSxuLmw9YShNYXRoLnBvdyh0LGUpKSxuLm9wYWNpdHk9dSh0KSxuKyIifX1yZXR1cm4gZT0rZSxyLmdhbW1hPW4scn0oMSl9dmFyIFhlPWplKGFlKSxHZT1qZShmZSk7dmFyIFZlLCRlLFdlPTAsWmU9MCxRZT0wLEplPTFlMyxLZT0wLHRyPTAsbnI9MCxlcj0ib2JqZWN0Ij09dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2U6RGF0ZSxycj0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtmdW5jdGlvbiBpcigpe3JldHVybiB0cnx8KHJyKG9yKSx0cj1lci5ub3coKStucil9ZnVuY3Rpb24gb3IoKXt0cj0wfWZ1bmN0aW9uIGFyKCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiB1cih0LG4sZSl7dmFyIHI9bmV3IGFyO3JldHVybiByLnJlc3RhcnQodCxuLGUpLHJ9ZnVuY3Rpb24gZnIoKXtpcigpLCsrV2U7Zm9yKHZhciB0LG49VmU7bjspKHQ9dHItbi5fdGltZSk+PTAmJm4uX2NhbGwuY2FsbChudWxsLHQpLG49bi5fbmV4dDstLVdlfWZ1bmN0aW9uIGNyKCl7dHI9KEtlPWVyLm5vdygpKStucixXZT1aZT0wO3RyeXtmcigpfWZpbmFsbHl7V2U9MCxmdW5jdGlvbigpe3ZhciB0LG4sZT1WZSxyPTEvMDtmb3IoO2U7KWUuX2NhbGw/KHI+ZS5fdGltZSYmKHI9ZS5fdGltZSksdD1lLGU9ZS5fbmV4dCk6KG49ZS5fbmV4dCxlLl9uZXh0PW51bGwsZT10P3QuX25leHQ9bjpWZT1uKTskZT10LGxyKHIpfSgpLHRyPTB9fWZ1bmN0aW9uIHNyKCl7dmFyIHQ9ZXIubm93KCksbj10LUtlO24+SmUmJihuci09bixLZT10KX1mdW5jdGlvbiBscih0KXtXZXx8KFplJiYoWmU9Y2xlYXJUaW1lb3V0KFplKSksdC10cj4yND8odDwxLzAmJihaZT1zZXRUaW1lb3V0KGNyLHQtZXIubm93KCktbnIpKSxRZSYmKFFlPWNsZWFySW50ZXJ2YWwoUWUpKSk6KFFlfHwoS2U9ZXIubm93KCksUWU9c2V0SW50ZXJ2YWwoc3IsSmUpKSxXZT0xLHJyKGNyKSkpfWZ1bmN0aW9uIGhyKHQsbixlKXt2YXIgcj1uZXcgYXI7cmV0dXJuIG49bnVsbD09bj8wOituLHIucmVzdGFydChmdW5jdGlvbihlKXtyLnN0b3AoKSx0KGUrbil9LG4sZSkscn1hci5wcm90b3R5cGU9dXIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjphcixyZXN0YXJ0OmZ1bmN0aW9uKHQsbixlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO2U9KG51bGw9PWU/aXIoKTorZSkrKG51bGw9PW4/MDorbiksdGhpcy5fbmV4dHx8JGU9PT10aGlzfHwoJGU/JGUuX25leHQ9dGhpczpWZT10aGlzLCRlPXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPWUsbHIoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsbHIoKSl9fTt2YXIgZHI9SSgic3RhcnQiLCJlbmQiLCJpbnRlcnJ1cHQiKSxwcj1bXSx2cj0wLGdyPTEseXI9Mixfcj0zLGJyPTQsbXI9NSx4cj02O2Z1bmN0aW9uIHdyKHQsbixlLHIsaSxvKXt2YXIgYT10Ll9fdHJhbnNpdGlvbjtpZihhKXtpZihlIGluIGEpcmV0dXJufWVsc2UgdC5fX3RyYW5zaXRpb249e307IWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpPXQuX190cmFuc2l0aW9uO2Z1bmN0aW9uIG8oZil7dmFyIGMscyxsLGg7aWYoZS5zdGF0ZSE9PWdyKXJldHVybiB1KCk7Zm9yKGMgaW4gaSlpZigoaD1pW2NdKS5uYW1lPT09ZS5uYW1lKXtpZihoLnN0YXRlPT09X3IpcmV0dXJuIGhyKG8pO2guc3RhdGU9PT1icj8oaC5zdGF0ZT14cixoLnRpbWVyLnN0b3AoKSxoLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGguaW5kZXgsaC5ncm91cCksZGVsZXRlIGlbY10pOitjPG4mJihoLnN0YXRlPXhyLGgudGltZXIuc3RvcCgpLGRlbGV0ZSBpW2NdKX1pZihocihmdW5jdGlvbigpe2Uuc3RhdGU9PT1fciYmKGUuc3RhdGU9YnIsZS50aW1lci5yZXN0YXJ0KGEsZS5kZWxheSxlLnRpbWUpLGEoZikpfSksZS5zdGF0ZT15cixlLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxlLnN0YXRlPT09eXIpe2ZvcihlLnN0YXRlPV9yLHI9bmV3IEFycmF5KGw9ZS50d2Vlbi5sZW5ndGgpLGM9MCxzPS0xO2M8bDsrK2MpKGg9ZS50d2VlbltjXS52YWx1ZS5jYWxsKHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApKSYmKHJbKytzXT1oKTtyLmxlbmd0aD1zKzF9fWZ1bmN0aW9uIGEobil7Zm9yKHZhciBpPW48ZS5kdXJhdGlvbj9lLmVhc2UuY2FsbChudWxsLG4vZS5kdXJhdGlvbik6KGUudGltZXIucmVzdGFydCh1KSxlLnN0YXRlPW1yLDEpLG89LTEsYT1yLmxlbmd0aDsrK288YTspcltvXS5jYWxsKG51bGwsaSk7ZS5zdGF0ZT09PW1yJiYoZS5vbi5jYWxsKCJlbmQiLHQsdC5fX2RhdGFfXyxlLmluZGV4LGUuZ3JvdXApLHUoKSl9ZnVuY3Rpb24gdSgpe2Zvcih2YXIgciBpbiBlLnN0YXRlPXhyLGUudGltZXIuc3RvcCgpLGRlbGV0ZSBpW25dLGkpcmV0dXJuO2RlbGV0ZSB0Ll9fdHJhbnNpdGlvbn1pW25dPWUsZS50aW1lcj11cihmdW5jdGlvbih0KXtlLnN0YXRlPWdyLGUudGltZXIucmVzdGFydChvLGUuZGVsYXksZS50aW1lKSxlLmRlbGF5PD10JiZvKHQtZS5kZWxheSl9LDAsZS50aW1lKX0odCxlLHtuYW1lOm4saW5kZXg6cixncm91cDppLG9uOmRyLHR3ZWVuOnByLHRpbWU6by50aW1lLGRlbGF5Om8uZGVsYXksZHVyYXRpb246by5kdXJhdGlvbixlYXNlOm8uZWFzZSx0aW1lcjpudWxsLHN0YXRlOnZyfSl9ZnVuY3Rpb24gTXIodCxuKXt2YXIgZT1Ucih0LG4pO2lmKGUuc3RhdGU+dnIpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBBcih0LG4pe3ZhciBlPVRyKHQsbik7aWYoZS5zdGF0ZT55cil0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHN0YXJ0ZWQiKTtyZXR1cm4gZX1mdW5jdGlvbiBUcih0LG4pe3ZhciBlPXQuX190cmFuc2l0aW9uO2lmKCFlfHwhKGU9ZVtuXSkpdGhyb3cgbmV3IEVycm9yKCJ0cmFuc2l0aW9uIG5vdCBmb3VuZCIpO3JldHVybiBlfWZ1bmN0aW9uIE5yKHQsbil7dmFyIGUscixpLG89dC5fX3RyYW5zaXRpb24sYT0hMDtpZihvKXtmb3IoaSBpbiBuPW51bGw9PW4/bnVsbDpuKyIiLG8pKGU9b1tpXSkubmFtZT09PW4/KHI9ZS5zdGF0ZT55ciYmZS5zdGF0ZTxtcixlLnN0YXRlPXhyLGUudGltZXIuc3RvcCgpLHImJmUub24uY2FsbCgiaW50ZXJydXB0Iix0LHQuX19kYXRhX18sZS5pbmRleCxlLmdyb3VwKSxkZWxldGUgb1tpXSk6YT0hMTthJiZkZWxldGUgdC5fX3RyYW5zaXRpb259fWZ1bmN0aW9uIFNyKHQsbixlKXt2YXIgcj10Ll9pZDtyZXR1cm4gdC5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9QXIodGhpcyxyKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtuXT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pLGZ1bmN0aW9uKHQpe3JldHVybiBUcih0LHIpLnZhbHVlW25dfX1mdW5jdGlvbiBFcih0LG4pe3ZhciBlO3JldHVybigibnVtYmVyIj09dHlwZW9mIG4/dmU6biBpbnN0YW5jZW9mIHZuP2NlOihlPXZuKG4pKT8obj1lLGNlKTpiZSkodCxuKX12YXIga3I9THQucHJvdG90eXBlLmNvbnN0cnVjdG9yO3ZhciBDcj0wO2Z1bmN0aW9uIFByKHQsbixlLHIpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9bix0aGlzLl9uYW1lPWUsdGhpcy5faWQ9cn1mdW5jdGlvbiB6cih0KXtyZXR1cm4gTHQoKS50cmFuc2l0aW9uKHQpfWZ1bmN0aW9uIFJyKCl7cmV0dXJuKytDcn12YXIgTHI9THQucHJvdG90eXBlO2Z1bmN0aW9uIERyKHQpe3JldHVybigodCo9Mik8PTE/dCp0Oi0tdCooMi10KSsxKS8yfWZ1bmN0aW9uIFVyKHQpe3JldHVybigodCo9Mik8PTE/dCp0KnQ6KHQtPTIpKnQqdCsyKS8yfVByLnByb3RvdHlwZT16ci5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlByLHNlbGVjdDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVEodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPW5ldyBBcnJheShpKSxhPTA7YTxpOysrYSlmb3IodmFyIHUsZixjPXJbYV0scz1jLmxlbmd0aCxsPW9bYV09bmV3IEFycmF5KHMpLGg9MDtoPHM7KytoKSh1PWNbaF0pJiYoZj10LmNhbGwodSx1Ll9fZGF0YV9fLGgsYykpJiYoIl9fZGF0YV9fImluIHUmJihmLl9fZGF0YV9fPXUuX19kYXRhX18pLGxbaF09Zix3cihsW2hdLG4sZSxoLGwsVHIodSxlKSkpO3JldHVybiBuZXcgUHIobyx0aGlzLl9wYXJlbnRzLG4sZSl9LHNlbGVjdEFsbDpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9uYW1lLGU9dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUsodCkpO2Zvcih2YXIgcj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPVtdLGE9W10sdT0wO3U8aTsrK3UpZm9yKHZhciBmLGM9clt1XSxzPWMubGVuZ3RoLGw9MDtsPHM7KytsKWlmKGY9Y1tsXSl7Zm9yKHZhciBoLGQ9dC5jYWxsKGYsZi5fX2RhdGFfXyxsLGMpLHA9VHIoZixlKSx2PTAsZz1kLmxlbmd0aDt2PGc7Kyt2KShoPWRbdl0pJiZ3cihoLG4sZSx2LGQscCk7by5wdXNoKGQpLGEucHVzaChmKX1yZXR1cm4gbmV3IFByKG8sYSxuLGUpfSxmaWx0ZXI6ZnVuY3Rpb24odCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXJ0KHQpKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGU9bi5sZW5ndGgscj1uZXcgQXJyYXkoZSksaT0wO2k8ZTsrK2kpZm9yKHZhciBvLGE9bltpXSx1PWEubGVuZ3RoLGY9cltpXT1bXSxjPTA7Yzx1OysrYykobz1hW2NdKSYmdC5jYWxsKG8sby5fX2RhdGFfXyxjLGEpJiZmLnB1c2gobyk7cmV0dXJuIG5ldyBQcihyLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LG1lcmdlOmZ1bmN0aW9uKHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsZT10Ll9ncm91cHMscj1uLmxlbmd0aCxpPWUubGVuZ3RoLG89TWF0aC5taW4ocixpKSxhPW5ldyBBcnJheShyKSx1PTA7dTxvOysrdSlmb3IodmFyIGYsYz1uW3VdLHM9ZVt1XSxsPWMubGVuZ3RoLGg9YVt1XT1uZXcgQXJyYXkobCksZD0wO2Q8bDsrK2QpKGY9Y1tkXXx8c1tkXSkmJihoW2RdPWYpO2Zvcig7dTxyOysrdSlhW3VdPW5bdV07cmV0dXJuIG5ldyBQcihhLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LHNlbGVjdGlvbjpmdW5jdGlvbigpe3JldHVybiBuZXcga3IodGhpcy5fZ3JvdXBzLHRoaXMuX3BhcmVudHMpfSx0cmFuc2l0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsbj10aGlzLl9pZCxlPVJyKCkscj10aGlzLl9ncm91cHMsaT1yLmxlbmd0aCxvPTA7bzxpOysrbylmb3IodmFyIGEsdT1yW29dLGY9dS5sZW5ndGgsYz0wO2M8ZjsrK2MpaWYoYT11W2NdKXt2YXIgcz1UcihhLG4pO3dyKGEsdCxlLGMsdSx7dGltZTpzLnRpbWUrcy5kZWxheStzLmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246cy5kdXJhdGlvbixlYXNlOnMuZWFzZX0pfXJldHVybiBuZXcgUHIocix0aGlzLl9wYXJlbnRzLHQsZSl9LGNhbGw6THIuY2FsbCxub2RlczpMci5ub2Rlcyxub2RlOkxyLm5vZGUsc2l6ZTpMci5zaXplLGVtcHR5OkxyLmVtcHR5LGVhY2g6THIuZWFjaCxvbjpmdW5jdGlvbih0LG4pe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/VHIodGhpcy5ub2RlKCksZSkub24ub24odCk6dGhpcy5lYWNoKGZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG89ZnVuY3Rpb24odCl7cmV0dXJuKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeShmdW5jdGlvbih0KXt2YXIgbj10LmluZGV4T2YoIi4iKTtyZXR1cm4gbj49MCYmKHQ9dC5zbGljZSgwLG4pKSwhdHx8InN0YXJ0Ij09PXR9KX0obik/TXI6QXI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9byh0aGlzLHQpLHU9YS5vbjt1IT09ciYmKGk9KHI9dSkuY29weSgpKS5vbihuLGUpLGEub249aX19KGUsdCxuKSl9LGF0dHI6ZnVuY3Rpb24odCxuKXt2YXIgZT0kKHQpLHI9InRyYW5zZm9ybSI9PT1lP1BlOkVyO3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBuPyhlLmxvY2FsP2Z1bmN0aW9uKHQsbixlKXt2YXIgcixpLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEsdT1lKHRoaXMpO2lmKG51bGwhPXUpcmV0dXJuKGE9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpKT09PXU/bnVsbDphPT09ciYmdT09PWk/bzpvPW4ocj1hLGk9dSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSx1PWUodGhpcyk7aWYobnVsbCE9dSlyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT11P251bGw6YT09PXImJnU9PT1pP286bz1uKHI9YSxpPXUpO3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX0pKGUscixTcih0aGlzLCJhdHRyLiIrdCxuKSk6bnVsbD09bj8oZS5sb2NhbD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fTpmdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19KShlKTooZS5sb2NhbD9mdW5jdGlvbih0LG4sZSl7dmFyIHIsaTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89dGhpcy5nZXRBdHRyaWJ1dGUodCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0pKGUscixuKyIiKSl9LGF0dHJUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciBlPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PW4pcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7dmFyIHI9JCh0KTtyZXR1cm4gdGhpcy50d2VlbihlLChyLmxvY2FsP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwscihuKSl9fXJldHVybiBlLl92YWx1ZT1uLGV9OmZ1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZSgpe3ZhciBlPXRoaXMscj1uLmFwcGx5KGUsYXJndW1lbnRzKTtyZXR1cm4gciYmZnVuY3Rpb24obil7ZS5zZXRBdHRyaWJ1dGUodCxyKG4pKX19cmV0dXJuIGUuX3ZhbHVlPW4sZX0pKHIsbikpfSxzdHlsZTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9InRyYW5zZm9ybSI9PSh0Kz0iIik/Q2U6RXI7cmV0dXJuIG51bGw9PW4/dGhpcy5zdHlsZVR3ZWVuKHQsZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89bHQodGhpcyx0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGx0KHRoaXMsdCkpO3JldHVybiBvPT09YT9udWxsOm89PT1lJiZhPT09cj9pOmk9bihlPW8scj1hKX19KHQscikpLm9uKCJlbmQuc3R5bGUuIit0LGZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fSh0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIG4/ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1sdCh0aGlzLHQpLHU9ZSh0aGlzKTtyZXR1cm4gbnVsbD09dSYmKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCksdT1sdCh0aGlzLHQpKSxhPT09dT9udWxsOmE9PT1yJiZ1PT09aT9vOm89bihyPWEsaT11KX19KHQscixTcih0aGlzLCJzdHlsZS4iK3QsbikpOmZ1bmN0aW9uKHQsbixlKXt2YXIgcixpO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPWx0KHRoaXMsdCk7cmV0dXJuIG89PT1lP251bGw6bz09PXI/aTppPW4ocj1vLGUpfX0odCxyLG4rIiIpLGUpfSxzdHlsZVR3ZWVuOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj0ic3R5bGUuIisodCs9IiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4ocj10aGlzLnR3ZWVuKHIpKSYmci5fdmFsdWU7aWYobnVsbD09bilyZXR1cm4gdGhpcy50d2VlbihyLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdGhpcy50d2VlbihyLGZ1bmN0aW9uKHQsbixlKXtmdW5jdGlvbiByKCl7dmFyIHI9dGhpcyxpPW4uYXBwbHkocixhcmd1bWVudHMpO3JldHVybiBpJiZmdW5jdGlvbihuKXtyLnN0eWxlLnNldFByb3BlcnR5KHQsaShuKSxlKX19cmV0dXJuIHIuX3ZhbHVlPW4scn0odCxuLG51bGw9PWU/IiI6ZSkpfSx0ZXh0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09bj8iIjpufX0oU3IodGhpcywidGV4dCIsdCkpOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KG51bGw9PXQ/IiI6dCsiIikpfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsKHQ9dGhpcy5faWQsZnVuY3Rpb24oKXt2YXIgbj10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBlIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtlIT09dClyZXR1cm47biYmbi5yZW1vdmVDaGlsZCh0aGlzKX0pKTt2YXIgdH0sdHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgZT10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgcixpPVRyKHRoaXMubm9kZSgpLGUpLnR3ZWVuLG89MCxhPWkubGVuZ3RoO288YTsrK28paWYoKHI9aVtvXSkubmFtZT09PXQpcmV0dXJuIHIudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09bj9mdW5jdGlvbih0LG4pe3ZhciBlLHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9QXIodGhpcyx0KSxvPWkudHdlZW47aWYobyE9PWUpZm9yKHZhciBhPTAsdT0ocj1lPW8pLmxlbmd0aDthPHU7KythKWlmKHJbYV0ubmFtZT09PW4peyhyPXIuc2xpY2UoKSkuc3BsaWNlKGEsMSk7YnJlYWt9aS50d2Vlbj1yfX06ZnVuY3Rpb24odCxuLGUpe3ZhciByLGk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPUFyKHRoaXMsdCksYT1vLnR3ZWVuO2lmKGEhPT1yKXtpPShyPWEpLnNsaWNlKCk7Zm9yKHZhciB1PXtuYW1lOm4sdmFsdWU6ZX0sZj0wLGM9aS5sZW5ndGg7ZjxjOysrZilpZihpW2ZdLm5hbWU9PT1uKXtpW2ZdPXU7YnJlYWt9Zj09PWMmJmkucHVzaCh1KX1vLnR3ZWVuPWl9fSkoZSx0LG4pKX0sZGVsYXk6ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe01yKHRoaXMsdCkuZGVsYXk9K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe01yKHRoaXMsdCkuZGVsYXk9bn19KShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5kZWxheX0sZHVyYXRpb246ZnVuY3Rpb24odCl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9mdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbigpe0FyKHRoaXMsdCkuZHVyYXRpb249K24uYXBwbHkodGhpcyxhcmd1bWVudHMpfX06ZnVuY3Rpb24odCxuKXtyZXR1cm4gbj0rbixmdW5jdGlvbigpe0FyKHRoaXMsdCkuZHVyYXRpb249bn19KShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5kdXJhdGlvbn0sZWFzZTpmdW5jdGlvbih0KXt2YXIgbj10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goZnVuY3Rpb24odCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7QXIodGhpcyx0KS5lYXNlPW59fShuLHQpKTpUcih0aGlzLm5vZGUoKSxuKS5lYXNlfX07dmFyIHFyPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gTWF0aC5wb3codCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksT3I9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxuKX1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksWXI9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3codCxuKToyLU1hdGgucG93KDItdCxuKSkvMn1yZXR1cm4gbj0rbixlLmV4cG9uZW50PXQsZX0oMyksQnI9TWF0aC5QSSxGcj1Cci8yO2Z1bmN0aW9uIElyKHQpe3JldHVybigxLU1hdGguY29zKEJyKnQpKS8yfWZ1bmN0aW9uIEhyKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3coMiwxMCp0LTEwKToyLU1hdGgucG93KDIsMTAtMTAqdCkpLzJ9ZnVuY3Rpb24ganIodCl7cmV0dXJuKCh0Kj0yKTw9MT8xLU1hdGguc3FydCgxLXQqdCk6TWF0aC5zcXJ0KDEtKHQtPTIpKnQpKzEpLzJ9dmFyIFhyPTQvMTEsR3I9Ni8xMSxWcj04LzExLCRyPS43NSxXcj05LzExLFpyPTEwLzExLFFyPS45Mzc1LEpyPTIxLzIyLEtyPTYzLzY0LHRpPTEvWHIvWHI7ZnVuY3Rpb24gbmkodCl7cmV0dXJuKHQ9K3QpPFhyP3RpKnQqdDp0PFZyP3RpKih0LT1HcikqdCskcjp0PFpyP3RpKih0LT1XcikqdCtRcjp0aSoodC09SnIpKnQrS3J9dmFyIGVpPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCp0KigobisxKSp0LW4pfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCkscmk9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybi0tdCp0KigobisxKSp0K24pKzF9cmV0dXJuIG49K24sZS5vdmVyc2hvb3Q9dCxlfSgxLjcwMTU4KSxpaT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuKCh0Kj0yKTwxP3QqdCooKG4rMSkqdC1uKToodC09MikqdCooKG4rMSkqdCtuKSsyKS8yfXJldHVybiBuPStuLGUub3ZlcnNob290PXQsZX0oMS43MDE1OCksb2k9MipNYXRoLlBJLGFpPWZ1bmN0aW9uIHQobixlKXt2YXIgcj1NYXRoLmFzaW4oMS8obj1NYXRoLm1heCgxLG4pKSkqKGUvPW9pKTtmdW5jdGlvbiBpKHQpe3JldHVybiBuKk1hdGgucG93KDIsMTAqLS10KSpNYXRoLnNpbigoci10KS9lKX1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksdWk9ZnVuY3Rpb24gdChuLGUpe3ZhciByPU1hdGguYXNpbigxLyhuPU1hdGgubWF4KDEsbikpKSooZS89b2kpO2Z1bmN0aW9uIGkodCl7cmV0dXJuIDEtbipNYXRoLnBvdygyLC0xMCoodD0rdCkpKk1hdGguc2luKCh0K3IpL2UpfXJldHVybiBpLmFtcGxpdHVkZT1mdW5jdGlvbihuKXtyZXR1cm4gdChuLGUqb2kpfSxpLnBlcmlvZD1mdW5jdGlvbihlKXtyZXR1cm4gdChuLGUpfSxpfSgxLC4zKSxmaT1mdW5jdGlvbiB0KG4sZSl7dmFyIHI9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihlLz1vaSk7ZnVuY3Rpb24gaSh0KXtyZXR1cm4oKHQ9Mip0LTEpPDA/bipNYXRoLnBvdygyLDEwKnQpKk1hdGguc2luKChyLXQpL2UpOjItbipNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigocit0KS9lKSkvMn1yZXR1cm4gaS5hbXBsaXR1ZGU9ZnVuY3Rpb24obil7cmV0dXJuIHQobixlKm9pKX0saS5wZXJpb2Q9ZnVuY3Rpb24oZSl7cmV0dXJuIHQobixlKX0saX0oMSwuMyksY2k9e3RpbWU6bnVsbCxkZWxheTowLGR1cmF0aW9uOjI1MCxlYXNlOlVyfTtmdW5jdGlvbiBzaSh0LG4pe2Zvcih2YXIgZTshKGU9dC5fX3RyYW5zaXRpb24pfHwhKGU9ZVtuXSk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybiBjaS50aW1lPWlyKCksY2k7cmV0dXJuIGV9THQucHJvdG90eXBlLmludGVycnVwdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7TnIodGhpcyx0KX0pfSxMdC5wcm90b3R5cGUudHJhbnNpdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlO3QgaW5zdGFuY2VvZiBQcj8obj10Ll9pZCx0PXQuX25hbWUpOihuPVJyKCksKGU9Y2kpLnRpbWU9aXIoKSx0PW51bGw9PXQ/bnVsbDp0KyIiKTtmb3IodmFyIHI9dGhpcy5fZ3JvdXBzLGk9ci5sZW5ndGgsbz0wO288aTsrK28pZm9yKHZhciBhLHU9cltvXSxmPXUubGVuZ3RoLGM9MDtjPGY7KytjKShhPXVbY10pJiZ3cihhLHQsbixjLHUsZXx8c2koYSxuKSk7cmV0dXJuIG5ldyBQcihyLHRoaXMuX3BhcmVudHMsdCxuKX07dmFyIGxpPVtudWxsXTtmdW5jdGlvbiBoaSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gZGkodCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy5zZWxlY3Rpb249ZX1mdW5jdGlvbiBwaSgpe3QuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gdmkoKXt0LmV2ZW50LnByZXZlbnREZWZhdWx0KCksdC5ldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX12YXIgZ2k9e25hbWU6ImRyYWcifSx5aT17bmFtZToic3BhY2UifSxfaT17bmFtZToiaGFuZGxlIn0sYmk9e25hbWU6ImNlbnRlciJ9LG1pPXtuYW1lOiJ4IixoYW5kbGVzOlsiZSIsInciXS5tYXAoRWkpLGlucHV0OmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQmJltbdFswXSxuWzBdWzFdXSxbdFsxXSxuWzFdWzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMF0sdFsxXVswXV19fSx4aT17bmFtZToieSIsaGFuZGxlczpbIm4iLCJzIl0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0LG4pe3JldHVybiB0JiZbW25bMF1bMF0sdFswXV0sW25bMV1bMF0sdFsxXV1dfSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQmJlt0WzBdWzFdLHRbMV1bMV1dfX0sd2k9e25hbWU6Inh5IixoYW5kbGVzOlsibiIsImUiLCJzIiwidyIsIm53IiwibmUiLCJzZSIsInN3Il0ubWFwKEVpKSxpbnB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fX0sTWk9e292ZXJsYXk6ImNyb3NzaGFpciIsc2VsZWN0aW9uOiJtb3ZlIixuOiJucy1yZXNpemUiLGU6ImV3LXJlc2l6ZSIsczoibnMtcmVzaXplIix3OiJldy1yZXNpemUiLG53OiJud3NlLXJlc2l6ZSIsbmU6Im5lc3ctcmVzaXplIixzZToibndzZS1yZXNpemUiLHN3OiJuZXN3LXJlc2l6ZSJ9LEFpPXtlOiJ3Iix3OiJlIixudzoibmUiLG5lOiJudyIsc2U6InN3Iixzdzoic2UifSxUaT17bjoicyIsczoibiIsbnc6InN3IixuZToic2UiLHNlOiJuZSIsc3c6Im53In0sTmk9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOm51bGwsZToxLHM6bnVsbCx3Oi0xLG53Oi0xLG5lOjEsc2U6MSxzdzotMX0sU2k9e292ZXJsYXk6MSxzZWxlY3Rpb246MSxuOi0xLGU6bnVsbCxzOjEsdzpudWxsLG53Oi0xLG5lOi0xLHNlOjEsc3c6MX07ZnVuY3Rpb24gRWkodCl7cmV0dXJue3R5cGU6dH19ZnVuY3Rpb24ga2koKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gQ2koKXt2YXIgdD10aGlzLm93bmVyU1ZHRWxlbWVudHx8dGhpcztyZXR1cm5bWzAsMF0sW3Qud2lkdGguYmFzZVZhbC52YWx1ZSx0LmhlaWdodC5iYXNlVmFsLnZhbHVlXV19ZnVuY3Rpb24gUGkodCl7Zm9yKDshdC5fX2JydXNoOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHQuX19icnVzaH1mdW5jdGlvbiB6aSh0KXtyZXR1cm4gdFswXVswXT09PXRbMV1bMF18fHRbMF1bMV09PT10WzFdWzFdfWZ1bmN0aW9uIFJpKG4pe3ZhciBlLHI9Q2ksaT1raSxvPUkodSwic3RhcnQiLCJicnVzaCIsImVuZCIpLGE9NjtmdW5jdGlvbiB1KHQpe3ZhciBlPXQucHJvcGVydHkoIl9fYnJ1c2giLGgpLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5kYXRhKFtFaSgib3ZlcmxheSIpXSk7ZS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwib3ZlcmxheSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuYXR0cigiY3Vyc29yIixNaS5vdmVybGF5KS5tZXJnZShlKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9UGkodGhpcykuZXh0ZW50O0R0KHRoaXMpLmF0dHIoIngiLHRbMF1bMF0pLmF0dHIoInkiLHRbMF1bMV0pLmF0dHIoIndpZHRoIix0WzFdWzBdLXRbMF1bMF0pLmF0dHIoImhlaWdodCIsdFsxXVsxXS10WzBdWzFdKX0pLHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuZGF0YShbRWkoInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsTWkuc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIHI9dC5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKG4uaGFuZGxlcyxmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlfSk7ci5leGl0KCkucmVtb3ZlKCksci5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIixmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KS5hdHRyKCJjdXJzb3IiLGZ1bmN0aW9uKHQpe3JldHVybiBNaVt0LnR5cGVdfSksdC5lYWNoKGYpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2ggdG91Y2hzdGFydC5icnVzaCIsbCl9ZnVuY3Rpb24gZigpe3ZhciB0PUR0KHRoaXMpLG49UGkodGhpcykuc2VsZWN0aW9uO24/KHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLG5bMF1bMF0pLmF0dHIoInkiLG5bMF1bMV0pLmF0dHIoIndpZHRoIixuWzFdWzBdLW5bMF1bMF0pLmF0dHIoImhlaWdodCIsblsxXVsxXS1uWzBdWzFdKSx0LnNlbGVjdEFsbCgiLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGVbdC50eXBlLmxlbmd0aC0xXT9uWzFdWzBdLWEvMjpuWzBdWzBdLWEvMn0pLmF0dHIoInkiLGZ1bmN0aW9uKHQpe3JldHVybiJzIj09PXQudHlwZVswXT9uWzFdWzFdLWEvMjpuWzBdWzFdLWEvMn0pLmF0dHIoIndpZHRoIixmdW5jdGlvbih0KXtyZXR1cm4ibiI9PT10LnR5cGV8fCJzIj09PXQudHlwZT9uWzFdWzBdLW5bMF1bMF0rYTphfSkuYXR0cigiaGVpZ2h0IixmdW5jdGlvbih0KXtyZXR1cm4iZSI9PT10LnR5cGV8fCJ3Ij09PXQudHlwZT9uWzFdWzFdLW5bMF1bMV0rYTphfSkpOnQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKS5hdHRyKCJ4IixudWxsKS5hdHRyKCJ5IixudWxsKS5hdHRyKCJ3aWR0aCIsbnVsbCkuYXR0cigiaGVpZ2h0IixudWxsKX1mdW5jdGlvbiBjKHQsbil7cmV0dXJuIHQuX19icnVzaC5lbWl0dGVyfHxuZXcgcyh0LG4pfWZ1bmN0aW9uIHModCxuKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9bix0aGlzLnN0YXRlPXQuX19icnVzaCx0aGlzLmFjdGl2ZT0wfWZ1bmN0aW9uIGwoKXtpZih0LmV2ZW50LnRvdWNoZXMpe2lmKHQuZXZlbnQuY2hhbmdlZFRvdWNoZXMubGVuZ3RoPHQuZXZlbnQudG91Y2hlcy5sZW5ndGgpcmV0dXJuIHZpKCl9ZWxzZSBpZihlKXJldHVybjtpZihpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHIsbyxhLHUscyxsLGgsZCxwLHYsZyx5LF8sYj10aGlzLG09dC5ldmVudC50YXJnZXQuX19kYXRhX18udHlwZSx4PSJzZWxlY3Rpb24iPT09KHQuZXZlbnQubWV0YUtleT9tPSJvdmVybGF5IjptKT9naTp0LmV2ZW50LmFsdEtleT9iaTpfaSx3PW49PT14aT9udWxsOk5pW21dLE09bj09PW1pP251bGw6U2lbbV0sQT1QaShiKSxUPUEuZXh0ZW50LE49QS5zZWxlY3Rpb24sUz1UWzBdWzBdLEU9VFswXVsxXSxrPVRbMV1bMF0sQz1UWzFdWzFdLFA9dyYmTSYmdC5ldmVudC5zaGlmdEtleSx6PUZ0KGIpLFI9eixMPWMoYixhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCk7Im92ZXJsYXkiPT09bT9BLnNlbGVjdGlvbj1OPVtbcj1uPT09eGk/Uzp6WzBdLGE9bj09PW1pP0U6elsxXV0sW3M9bj09PXhpP2s6cixoPW49PT1taT9DOmFdXToocj1OWzBdWzBdLGE9TlswXVsxXSxzPU5bMV1bMF0saD1OWzFdWzFdKSxvPXIsdT1hLGw9cyxkPWg7dmFyIEQ9RHQoYikuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIiksVT1ELnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5hdHRyKCJjdXJzb3IiLE1pW21dKTtpZih0LmV2ZW50LnRvdWNoZXMpRC5vbigidG91Y2htb3ZlLmJydXNoIixPLCEwKS5vbigidG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLEIsITApO2Vsc2V7dmFyIHE9RHQodC5ldmVudC52aWV3KS5vbigia2V5ZG93bi5icnVzaCIsZnVuY3Rpb24oKXtzd2l0Y2godC5ldmVudC5rZXlDb2RlKXtjYXNlIDE2OlA9dyYmTTticmVhaztjYXNlIDE4Ong9PT1faSYmKHcmJihzPWwtcCp3LHI9bytwKncpLE0mJihoPWQtdipNLGE9dSt2Kk0pLHg9YmksWSgpKTticmVhaztjYXNlIDMyOnghPT1faSYmeCE9PWJpfHwodzwwP3M9bC1wOnc+MCYmKHI9by1wKSxNPDA/aD1kLXY6TT4wJiYoYT11LXYpLHg9eWksVS5hdHRyKCJjdXJzb3IiLE1pLnNlbGVjdGlvbiksWSgpKTticmVhaztkZWZhdWx0OnJldHVybn12aSgpfSwhMCkub24oImtleXVwLmJydXNoIixmdW5jdGlvbigpe3N3aXRjaCh0LmV2ZW50LmtleUNvZGUpe2Nhc2UgMTY6UCYmKHk9Xz1QPSExLFkoKSk7YnJlYWs7Y2FzZSAxODp4PT09YmkmJih3PDA/cz1sOnc+MCYmKHI9byksTTwwP2g9ZDpNPjAmJihhPXUpLHg9X2ksWSgpKTticmVhaztjYXNlIDMyOng9PT15aSYmKHQuZXZlbnQuYWx0S2V5Pyh3JiYocz1sLXAqdyxyPW8rcCp3KSxNJiYoaD1kLXYqTSxhPXUrdipNKSx4PWJpKToodzwwP3M9bDp3PjAmJihyPW8pLE08MD9oPWQ6TT4wJiYoYT11KSx4PV9pKSxVLmF0dHIoImN1cnNvciIsTWlbbV0pLFkoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59dmkoKX0sITApLm9uKCJtb3VzZW1vdmUuYnJ1c2giLE8sITApLm9uKCJtb3VzZXVwLmJydXNoIixCLCEwKTtYdCh0LmV2ZW50LnZpZXcpfXBpKCksTnIoYiksZi5jYWxsKGIpLEwuc3RhcnQoKX1mdW5jdGlvbiBPKCl7dmFyIHQ9RnQoYik7IVB8fHl8fF98fChNYXRoLmFicyh0WzBdLVJbMF0pPk1hdGguYWJzKHRbMV0tUlsxXSk/Xz0hMDp5PSEwKSxSPXQsZz0hMCx2aSgpLFkoKX1mdW5jdGlvbiBZKCl7dmFyIHQ7c3dpdGNoKHA9UlswXS16WzBdLHY9UlsxXS16WzFdLHgpe2Nhc2UgeWk6Y2FzZSBnaTp3JiYocD1NYXRoLm1heChTLXIsTWF0aC5taW4oay1zLHApKSxvPXIrcCxsPXMrcCksTSYmKHY9TWF0aC5tYXgoRS1hLE1hdGgubWluKEMtaCx2KSksdT1hK3YsZD1oK3YpO2JyZWFrO2Nhc2UgX2k6dzwwPyhwPU1hdGgubWF4KFMtcixNYXRoLm1pbihrLXIscCkpLG89citwLGw9cyk6dz4wJiYocD1NYXRoLm1heChTLXMsTWF0aC5taW4oay1zLHApKSxvPXIsbD1zK3ApLE08MD8odj1NYXRoLm1heChFLWEsTWF0aC5taW4oQy1hLHYpKSx1PWErdixkPWgpOk0+MCYmKHY9TWF0aC5tYXgoRS1oLE1hdGgubWluKEMtaCx2KSksdT1hLGQ9aCt2KTticmVhaztjYXNlIGJpOncmJihvPU1hdGgubWF4KFMsTWF0aC5taW4oayxyLXAqdykpLGw9TWF0aC5tYXgoUyxNYXRoLm1pbihrLHMrcCp3KSkpLE0mJih1PU1hdGgubWF4KEUsTWF0aC5taW4oQyxhLXYqTSkpLGQ9TWF0aC5tYXgoRSxNYXRoLm1pbihDLGgrdipNKSkpfWw8byYmKHcqPS0xLHQ9cixyPXMscz10LHQ9byxvPWwsbD10LG0gaW4gQWkmJlUuYXR0cigiY3Vyc29yIixNaVttPUFpW21dXSkpLGQ8dSYmKE0qPS0xLHQ9YSxhPWgsaD10LHQ9dSx1PWQsZD10LG0gaW4gVGkmJlUuYXR0cigiY3Vyc29yIixNaVttPVRpW21dXSkpLEEuc2VsZWN0aW9uJiYoTj1BLnNlbGVjdGlvbikseSYmKG89TlswXVswXSxsPU5bMV1bMF0pLF8mJih1PU5bMF1bMV0sZD1OWzFdWzFdKSxOWzBdWzBdPT09byYmTlswXVsxXT09PXUmJk5bMV1bMF09PT1sJiZOWzFdWzFdPT09ZHx8KEEuc2VsZWN0aW9uPVtbbyx1XSxbbCxkXV0sZi5jYWxsKGIpLEwuYnJ1c2goKSl9ZnVuY3Rpb24gQigpe2lmKHBpKCksdC5ldmVudC50b3VjaGVzKXtpZih0LmV2ZW50LnRvdWNoZXMubGVuZ3RoKXJldHVybjtlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1udWxsfSw1MDApLEQub24oInRvdWNobW92ZS5icnVzaCB0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaCIsbnVsbCl9ZWxzZSBHdCh0LmV2ZW50LnZpZXcsZykscS5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7RC5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLFUuYXR0cigiY3Vyc29yIixNaS5vdmVybGF5KSxBLnNlbGVjdGlvbiYmKE49QS5zZWxlY3Rpb24pLHppKE4pJiYoQS5zZWxlY3Rpb249bnVsbCxmLmNhbGwoYikpLEwuZW5kKCl9fWZ1bmN0aW9uIGgoKXt2YXIgdD10aGlzLl9fYnJ1c2h8fHtzZWxlY3Rpb246bnVsbH07cmV0dXJuIHQuZXh0ZW50PXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLHQuZGltPW4sdH1yZXR1cm4gdS5tb3ZlPWZ1bmN0aW9uKHQsZSl7dC5zZWxlY3Rpb24/dC5vbigic3RhcnQuYnJ1c2giLGZ1bmN0aW9uKCl7Yyh0aGlzLGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKS5zdGFydCgpfSkub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLGZ1bmN0aW9uKCl7Yyh0aGlzLGFyZ3VtZW50cykuZW5kKCl9KS50d2VlbigiYnJ1c2giLGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxyPXQuX19icnVzaCxpPWModCxhcmd1bWVudHMpLG89ci5zZWxlY3Rpb24sYT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsci5leHRlbnQpLHU9bWUobyxhKTtmdW5jdGlvbiBzKG4pe3Iuc2VsZWN0aW9uPTE9PT1uJiZ6aShhKT9udWxsOnUobiksZi5jYWxsKHQpLGkuYnJ1c2goKX1yZXR1cm4gbyYmYT9zOnMoMSl9KTp0LmVhY2goZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHMscj10aGlzLl9fYnJ1c2gsaT1uLmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyx0KTplLHIuZXh0ZW50KSxvPWModGhpcyx0KS5iZWZvcmVzdGFydCgpO05yKHRoaXMpLHIuc2VsZWN0aW9uPW51bGw9PWl8fHppKGkpP251bGw6aSxmLmNhbGwodGhpcyksby5zdGFydCgpLmJydXNoKCkuZW5kKCl9KX0scy5wcm90b3R5cGU9e2JlZm9yZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIDE9PSsrdGhpcy5hY3RpdmUmJih0aGlzLnN0YXRlLmVtaXR0ZXI9dGhpcyx0aGlzLnN0YXJ0aW5nPSEwKSx0aGlzfSxzdGFydDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0aW5nJiYodGhpcy5zdGFydGluZz0hMSx0aGlzLmVtaXQoInN0YXJ0IikpLHRoaXN9LGJydXNoOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZW1pdCgiYnJ1c2giKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGRlbGV0ZSB0aGlzLnN0YXRlLmVtaXR0ZXIsdGhpcy5lbWl0KCJlbmQiKSksdGhpc30sZW1pdDpmdW5jdGlvbih0KXtDdChuZXcgZGkodSx0LG4ub3V0cHV0KHRoaXMuc3RhdGUuc2VsZWN0aW9uKSksby5hcHBseSxvLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LHUuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGkoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLHUpOnJ9LHUuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6aGkoISF0KSx1KTppfSx1LmhhbmRsZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9K3QsdSk6YX0sdS5vbj1mdW5jdGlvbigpe3ZhciB0PW8ub24uYXBwbHkobyxhcmd1bWVudHMpO3JldHVybiB0PT09bz91OnR9LHV9dmFyIExpPU1hdGguY29zLERpPU1hdGguc2luLFVpPU1hdGguUEkscWk9VWkvMixPaT0yKlVpLFlpPU1hdGgubWF4O3ZhciBCaT1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gRmkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBJaT1NYXRoLlBJLEhpPTIqSWksamk9SGktMWUtNjtmdW5jdGlvbiBYaSgpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifWZ1bmN0aW9uIEdpKCl7cmV0dXJuIG5ldyBYaX1mdW5jdGlvbiBWaSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gJGkodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIFdpKHQpe3JldHVybiB0LnJhZGl1c31mdW5jdGlvbiBaaSh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIFFpKHQpe3JldHVybiB0LmVuZEFuZ2xlfVhpLnByb3RvdHlwZT1HaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlhpLG1vdmVUbzpmdW5jdGlvbih0LG4pe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rbil9LGNsb3NlUGF0aDpmdW5jdGlvbigpe251bGwhPT10aGlzLl94MSYmKHRoaXMuX3gxPXRoaXMuX3gwLHRoaXMuX3kxPXRoaXMuX3kwLHRoaXMuXys9IloiKX0sbGluZVRvOmZ1bmN0aW9uKHQsbil7dGhpcy5fKz0iTCIrKHRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kxPStuKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyKXt0aGlzLl8rPSJRIisgK3QrIiwiKyArbisiLCIrKHRoaXMuX3gxPStlKSsiLCIrKHRoaXMuX3kxPStyKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LG4sZSxyLGksbyl7dGhpcy5fKz0iQyIrICt0KyIsIisgK24rIiwiKyArZSsiLCIrICtyKyIsIisodGhpcy5feDE9K2kpKyIsIisodGhpcy5feTE9K28pfSxhcmNUbzpmdW5jdGlvbih0LG4sZSxyLGkpe3Q9K3Qsbj0rbixlPStlLHI9K3IsaT0raTt2YXIgbz10aGlzLl94MSxhPXRoaXMuX3kxLHU9ZS10LGY9ci1uLGM9by10LHM9YS1uLGw9YypjK3MqcztpZihpPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIraSk7aWYobnVsbD09PXRoaXMuX3gxKXRoaXMuXys9Ik0iKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2UgaWYobD4xZS02KWlmKE1hdGguYWJzKHMqdS1mKmMpPjFlLTYmJmkpe3ZhciBoPWUtbyxkPXItYSxwPXUqdStmKmYsdj1oKmgrZCpkLGc9TWF0aC5zcXJ0KHApLHk9TWF0aC5zcXJ0KGwpLF89aSpNYXRoLnRhbigoSWktTWF0aC5hY29zKChwK2wtdikvKDIqZyp5KSkpLzIpLGI9Xy95LG09Xy9nO01hdGguYWJzKGItMSk+MWUtNiYmKHRoaXMuXys9IkwiKyh0K2IqYykrIiwiKyhuK2IqcykpLHRoaXMuXys9IkEiK2krIiwiK2krIiwwLDAsIisgKyhzKmg+YypkKSsiLCIrKHRoaXMuX3gxPXQrbSp1KSsiLCIrKHRoaXMuX3kxPW4rbSpmKX1lbHNlIHRoaXMuXys9IkwiKyh0aGlzLl94MT10KSsiLCIrKHRoaXMuX3kxPW4pO2Vsc2U7fSxhcmM6ZnVuY3Rpb24odCxuLGUscixpLG8pe3Q9K3Qsbj0rbjt2YXIgYT0oZT0rZSkqTWF0aC5jb3MociksdT1lKk1hdGguc2luKHIpLGY9dCthLGM9bit1LHM9MV5vLGw9bz9yLWk6aS1yO2lmKGU8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIitlKTtudWxsPT09dGhpcy5feDE/dGhpcy5fKz0iTSIrZisiLCIrYzooTWF0aC5hYnModGhpcy5feDEtZik+MWUtNnx8TWF0aC5hYnModGhpcy5feTEtYyk+MWUtNikmJih0aGlzLl8rPSJMIitmKyIsIitjKSxlJiYobDwwJiYobD1sJUhpK0hpKSxsPmppP3RoaXMuXys9IkEiK2UrIiwiK2UrIiwwLDEsIitzKyIsIisodC1hKSsiLCIrKG4tdSkrIkEiK2UrIiwiK2UrIiwwLDEsIitzKyIsIisodGhpcy5feDE9ZikrIiwiKyh0aGlzLl95MT1jKTpsPjFlLTYmJih0aGlzLl8rPSJBIitlKyIsIitlKyIsMCwiKyArKGw+PUlpKSsiLCIrcysiLCIrKHRoaXMuX3gxPXQrZSpNYXRoLmNvcyhpKSkrIiwiKyh0aGlzLl95MT1uK2UqTWF0aC5zaW4oaSkpKSl9LHJlY3Q6ZnVuY3Rpb24odCxuLGUscil7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStuKSsiaCIrICtlKyJ2IisgK3IrImgiKy1lKyJaIn0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX07ZnVuY3Rpb24gSmkoKXt9ZnVuY3Rpb24gS2kodCxuKXt2YXIgZT1uZXcgSmk7aWYodCBpbnN0YW5jZW9mIEppKXQuZWFjaChmdW5jdGlvbih0LG4pe2Uuc2V0KG4sdCl9KTtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3ZhciByLGk9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytpPG87KWUuc2V0KGksdFtpXSk7ZWxzZSBmb3IoOysraTxvOyllLnNldChuKHI9dFtpXSxpLHQpLHIpfWVsc2UgaWYodClmb3IodmFyIGEgaW4gdCllLnNldChhLHRbYV0pO3JldHVybiBlfWZ1bmN0aW9uIHRvKCl7cmV0dXJue319ZnVuY3Rpb24gbm8odCxuLGUpe3Rbbl09ZX1mdW5jdGlvbiBlbygpe3JldHVybiBLaSgpfWZ1bmN0aW9uIHJvKHQsbixlKXt0LnNldChuLGUpfWZ1bmN0aW9uIGlvKCl7fUppLnByb3RvdHlwZT1LaS5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkppLGhhczpmdW5jdGlvbih0KXtyZXR1cm4iJCIrdCBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbIiQiK3RdfSxzZXQ6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpc1siJCIrdF09bix0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIG49IiQiK3Q7cmV0dXJuIG4gaW4gdGhpcyYmZGVsZXRlIHRoaXNbbl19LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpIiQiPT09dFswXSYmZGVsZXRlIHRoaXNbdF19LGtleXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0LnB1c2gobi5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh0aGlzW25dKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgbiBpbiB0aGlzKSIkIj09PW5bMF0mJnQucHVzaCh7a2V5Om4uc2xpY2UoMSksdmFsdWU6dGhpc1tuXX0pO3JldHVybiB0fSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYoIiQiPT09dFswXSlyZXR1cm4hMTtyZXR1cm4hMH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIG4gaW4gdGhpcykiJCI9PT1uWzBdJiZ0KHRoaXNbbl0sbi5zbGljZSgxKSx0aGlzKX19O3ZhciBvbz1LaS5wcm90b3R5cGU7ZnVuY3Rpb24gYW8odCxuKXt2YXIgZT1uZXcgaW87aWYodCBpbnN0YW5jZW9mIGlvKXQuZWFjaChmdW5jdGlvbih0KXtlLmFkZCh0KX0pO2Vsc2UgaWYodCl7dmFyIHI9LTEsaT10Lmxlbmd0aDtpZihudWxsPT1uKWZvcig7KytyPGk7KWUuYWRkKHRbcl0pO2Vsc2UgZm9yKDsrK3I8aTspZS5hZGQobih0W3JdLHIsdCkpfXJldHVybiBlfWlvLnByb3RvdHlwZT1hby5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmlvLGhhczpvby5oYXMsYWRkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzWyIkIisodCs9IiIpXT10LHRoaXN9LHJlbW92ZTpvby5yZW1vdmUsY2xlYXI6b28uY2xlYXIsdmFsdWVzOm9vLmtleXMsc2l6ZTpvby5zaXplLGVtcHR5Om9vLmVtcHR5LGVhY2g6b28uZWFjaH07dmFyIHVvPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBmbyh0LG4pe3JldHVybiB0LW59ZnVuY3Rpb24gY28odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHNvKHQsbil7Zm9yKHZhciBlLHI9LTEsaT1uLmxlbmd0aDsrK3I8aTspaWYoZT1sbyh0LG5bcl0pKXJldHVybiBlO3JldHVybiAwfWZ1bmN0aW9uIGxvKHQsbil7Zm9yKHZhciBlPW5bMF0scj1uWzFdLGk9LTEsbz0wLGE9dC5sZW5ndGgsdT1hLTE7bzxhO3U9bysrKXt2YXIgZj10W29dLGM9ZlswXSxzPWZbMV0sbD10W3VdLGg9bFswXSxkPWxbMV07aWYoaG8oZixsLG4pKXJldHVybiAwO3M+ciE9ZD5yJiZlPChoLWMpKihyLXMpLyhkLXMpK2MmJihpPS1pKX1yZXR1cm4gaX1mdW5jdGlvbiBobyh0LG4sZSl7dmFyIHIsaSxvLGE7cmV0dXJuIGZ1bmN0aW9uKHQsbixlKXtyZXR1cm4oblswXS10WzBdKSooZVsxXS10WzFdKT09KGVbMF0tdFswXSkqKG5bMV0tdFsxXSl9KHQsbixlKSYmKGk9dFtyPSsodFswXT09PW5bMF0pXSxvPWVbcl0sYT1uW3JdLGk8PW8mJm88PWF8fGE8PW8mJm88PWkpfWZ1bmN0aW9uIHBvKCl7fXZhciB2bz1bW10sW1tbMSwxLjVdLFsuNSwxXV1dLFtbWzEuNSwxXSxbMSwxLjVdXV0sW1tbMS41LDFdLFsuNSwxXV1dLFtbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLDEuNV0sWy41LDFdXSxbWzEsLjVdLFsxLjUsMV1dXSxbW1sxLC41XSxbMSwxLjVdXV0sW1tbMSwuNV0sWy41LDFdXV0sW1tbLjUsMV0sWzEsLjVdXV0sW1tbMSwxLjVdLFsxLC41XV1dLFtbWy41LDFdLFsxLC41XV0sW1sxLjUsMV0sWzEsMS41XV1dLFtbWzEuNSwxXSxbMSwuNV1dXSxbW1suNSwxXSxbMS41LDFdXV0sW1tbMSwxLjVdLFsxLjUsMV1dXSxbW1suNSwxXSxbMSwxLjVdXV0sW11dO2Z1bmN0aW9uIGdvKCl7dmFyIHQ9MSxuPTEsZT1NLHI9dTtmdW5jdGlvbiBpKHQpe3ZhciBuPWUodCk7aWYoQXJyYXkuaXNBcnJheShuKSluPW4uc2xpY2UoKS5zb3J0KGZvKTtlbHNle3ZhciByPXModCksaT1yWzBdLGE9clsxXTtuPXcoaSxhLG4pLG49ZyhNYXRoLmZsb29yKGkvbikqbixNYXRoLmZsb29yKGEvbikqbixuKX1yZXR1cm4gbi5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG8odCxuKX0pfWZ1bmN0aW9uIG8oZSxpKXt2YXIgbz1bXSx1PVtdO3JldHVybiBmdW5jdGlvbihlLHIsaSl7dmFyIG8sdSxmLGMscyxsLGg9bmV3IEFycmF5LGQ9bmV3IEFycmF5O289dT0tMSxjPWVbMF0+PXIsdm9bYzw8MV0uZm9yRWFjaChwKTtmb3IoOysrbzx0LTE7KWY9YyxjPWVbbysxXT49cix2b1tmfGM8PDFdLmZvckVhY2gocCk7dm9bYzw8MF0uZm9yRWFjaChwKTtmb3IoOysrdTxuLTE7KXtmb3Iobz0tMSxjPWVbdSp0K3RdPj1yLHM9ZVt1KnRdPj1yLHZvW2M8PDF8czw8Ml0uZm9yRWFjaChwKTsrK288dC0xOylmPWMsYz1lW3UqdCt0K28rMV0+PXIsbD1zLHM9ZVt1KnQrbysxXT49cix2b1tmfGM8PDF8czw8MnxsPDwzXS5mb3JFYWNoKHApO3ZvW2N8czw8M10uZm9yRWFjaChwKX1vPS0xLHM9ZVt1KnRdPj1yLHZvW3M8PDJdLmZvckVhY2gocCk7Zm9yKDsrK288dC0xOylsPXMscz1lW3UqdCtvKzFdPj1yLHZvW3M8PDJ8bDw8M10uZm9yRWFjaChwKTtmdW5jdGlvbiBwKHQpe3ZhciBuLGUscj1bdFswXVswXStvLHRbMF1bMV0rdV0sZj1bdFsxXVswXStvLHRbMV1bMV0rdV0sYz1hKHIpLHM9YShmKTsobj1kW2NdKT8oZT1oW3NdKT8oZGVsZXRlIGRbbi5lbmRdLGRlbGV0ZSBoW2Uuc3RhcnRdLG49PT1lPyhuLnJpbmcucHVzaChmKSxpKG4ucmluZykpOmhbbi5zdGFydF09ZFtlLmVuZF09e3N0YXJ0Om4uc3RhcnQsZW5kOmUuZW5kLHJpbmc6bi5yaW5nLmNvbmNhdChlLnJpbmcpfSk6KGRlbGV0ZSBkW24uZW5kXSxuLnJpbmcucHVzaChmKSxkW24uZW5kPXNdPW4pOihuPWhbc10pPyhlPWRbY10pPyhkZWxldGUgaFtuLnN0YXJ0XSxkZWxldGUgZFtlLmVuZF0sbj09PWU/KG4ucmluZy5wdXNoKGYpLGkobi5yaW5nKSk6aFtlLnN0YXJ0XT1kW24uZW5kXT17c3RhcnQ6ZS5zdGFydCxlbmQ6bi5lbmQscmluZzplLnJpbmcuY29uY2F0KG4ucmluZyl9KTooZGVsZXRlIGhbbi5zdGFydF0sbi5yaW5nLnVuc2hpZnQociksaFtuLnN0YXJ0PWNdPW4pOmhbY109ZFtzXT17c3RhcnQ6YyxlbmQ6cyxyaW5nOltyLGZdfX12b1tzPDwzXS5mb3JFYWNoKHApfShlLGksZnVuY3Rpb24odCl7cih0LGUsaSksZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aCxyPXRbZS0xXVsxXSp0WzBdWzBdLXRbZS0xXVswXSp0WzBdWzFdOysrbjxlOylyKz10W24tMV1bMV0qdFtuXVswXS10W24tMV1bMF0qdFtuXVsxXTtyZXR1cm4gcn0odCk+MD9vLnB1c2goW3RdKTp1LnB1c2godCl9KSx1LmZvckVhY2goZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPW8ubGVuZ3RoO2U8cjsrK2UpaWYoLTEhPT1zbygobj1vW2VdKVswXSx0KSlyZXR1cm4gdm9pZCBuLnB1c2godCl9KSx7dHlwZToiTXVsdGlQb2x5Z29uIix2YWx1ZTppLGNvb3JkaW5hdGVzOm99fWZ1bmN0aW9uIGEobil7cmV0dXJuIDIqblswXStuWzFdKih0KzEpKjR9ZnVuY3Rpb24gdShlLHIsaSl7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe3ZhciBvLGE9ZVswXSx1PWVbMV0sZj0wfGEsYz0wfHUscz1yW2MqdCtmXTthPjAmJmE8dCYmZj09PWEmJihvPXJbYyp0K2YtMV0sZVswXT1hKyhpLW8pLyhzLW8pLS41KSx1PjAmJnU8biYmYz09PXUmJihvPXJbKGMtMSkqdCtmXSxlWzFdPXUrKGktbykvKHMtbyktLjUpfSl9cmV0dXJuIGkuY29udG91cj1vLGkuc2l6ZT1mdW5jdGlvbihlKXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bdCxuXTt2YXIgcj1NYXRoLmNlaWwoZVswXSksbz1NYXRoLmNlaWwoZVsxXSk7aWYoIShyPjAmJm8+MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gdD1yLG49byxpfSxpLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP2NvKHVvLmNhbGwodCkpOmNvKHQpLGkpOmV9LGkuc21vb3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQ/dTpwbyxpKTpyPT09dX0saX1mdW5jdGlvbiB5byh0LG4sZSl7Zm9yKHZhciByPXQud2lkdGgsaT10LmhlaWdodCxvPTErKGU8PDEpLGE9MDthPGk7KythKWZvcih2YXIgdT0wLGY9MDt1PHIrZTsrK3UpdTxyJiYoZis9dC5kYXRhW3UrYSpyXSksdT49ZSYmKHU+PW8mJihmLT10LmRhdGFbdS1vK2Eqcl0pLG4uZGF0YVt1LWUrYSpyXT1mL01hdGgubWluKHUrMSxyLTErby11LG8pKX1mdW5jdGlvbiBfbyh0LG4sZSl7Zm9yKHZhciByPXQud2lkdGgsaT10LmhlaWdodCxvPTErKGU8PDEpLGE9MDthPHI7KythKWZvcih2YXIgdT0wLGY9MDt1PGkrZTsrK3UpdTxpJiYoZis9dC5kYXRhW2ErdSpyXSksdT49ZSYmKHU+PW8mJihmLT10LmRhdGFbYSsodS1vKSpyXSksbi5kYXRhW2ErKHUtZSkqcl09Zi9NYXRoLm1pbih1KzEsaS0xK28tdSxvKSl9ZnVuY3Rpb24gYm8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gbW8odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24geG8oKXtyZXR1cm4gMX12YXIgd289e30sTW89e30sQW89MzQsVG89MTAsTm89MTM7ZnVuY3Rpb24gU28odCl7cmV0dXJuIG5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7Iit0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBKU09OLnN0cmluZ2lmeSh0KSsiOiBkWyIrbisiXSJ9KS5qb2luKCIsIikrIn0iKX1mdW5jdGlvbiBFbyh0KXt2YXIgbj1uZXcgUmVnRXhwKCdbIicrdCsiXG5ccl0iKSxlPXQuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiByKHQsbil7dmFyIHIsaT1bXSxvPXQubGVuZ3RoLGE9MCx1PTAsZj1vPD0wLGM9ITE7ZnVuY3Rpb24gcygpe2lmKGYpcmV0dXJuIE1vO2lmKGMpcmV0dXJuIGM9ITEsd287dmFyIG4scixpPWE7aWYodC5jaGFyQ29kZUF0KGkpPT09QW8pe2Zvcig7YSsrPG8mJnQuY2hhckNvZGVBdChhKSE9PUFvfHx0LmNoYXJDb2RlQXQoKythKT09PUFvOyk7cmV0dXJuKG49YSk+PW8/Zj0hMDoocj10LmNoYXJDb2RlQXQoYSsrKSk9PT1Ubz9jPSEwOnI9PT1ObyYmKGM9ITAsdC5jaGFyQ29kZUF0KGEpPT09VG8mJisrYSksdC5zbGljZShpKzEsbi0xKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDthPG87KXtpZigocj10LmNoYXJDb2RlQXQobj1hKyspKT09PVRvKWM9ITA7ZWxzZSBpZihyPT09Tm8pYz0hMCx0LmNoYXJDb2RlQXQoYSk9PT1UbyYmKythO2Vsc2UgaWYociE9PWUpY29udGludWU7cmV0dXJuIHQuc2xpY2UoaSxuKX1yZXR1cm4gZj0hMCx0LnNsaWNlKGksbyl9Zm9yKHQuY2hhckNvZGVBdChvLTEpPT09VG8mJi0tbyx0LmNoYXJDb2RlQXQoby0xKT09PU5vJiYtLW87KHI9cygpKSE9PU1vOyl7Zm9yKHZhciBsPVtdO3IhPT13byYmciE9PU1vOylsLnB1c2gocikscj1zKCk7biYmbnVsbD09KGw9bihsLHUrKykpfHxpLnB1c2gobCl9cmV0dXJuIGl9ZnVuY3Rpb24gaShuKXtyZXR1cm4gbi5tYXAobykuam9pbih0KX1mdW5jdGlvbiBvKHQpe3JldHVybiBudWxsPT10PyIiOm4udGVzdCh0Kz0iIik/JyInK3QucmVwbGFjZSgvIi9nLCciIicpKyciJzp0fXJldHVybntwYXJzZTpmdW5jdGlvbih0LG4pe3ZhciBlLGksbz1yKHQsZnVuY3Rpb24odCxyKXtpZihlKXJldHVybiBlKHQsci0xKTtpPXQsZT1uP2Z1bmN0aW9uKHQsbil7dmFyIGU9U28odCk7cmV0dXJuIGZ1bmN0aW9uKHIsaSl7cmV0dXJuIG4oZShyKSxpLHQpfX0odCxuKTpTbyh0KX0pO3JldHVybiBvLmNvbHVtbnM9aXx8W10sb30scGFyc2VSb3dzOnIsZm9ybWF0OmZ1bmN0aW9uKG4sZSl7cmV0dXJuIG51bGw9PWUmJihlPWZ1bmN0aW9uKHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCksZT1bXTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKHQpe2Zvcih2YXIgciBpbiB0KXIgaW4gbnx8ZS5wdXNoKG5bcl09cil9KSxlfShuKSksW2UubWFwKG8pLmpvaW4odCldLmNvbmNhdChuLm1hcChmdW5jdGlvbihuKXtyZXR1cm4gZS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIG8oblt0XSl9KS5qb2luKHQpfSkpLmpvaW4oIlxuIil9LGZvcm1hdFJvd3M6ZnVuY3Rpb24odCl7cmV0dXJuIHQubWFwKGkpLmpvaW4oIlxuIil9fX12YXIga289RW8oIiwiKSxDbz1rby5wYXJzZSxQbz1rby5wYXJzZVJvd3Msem89a28uZm9ybWF0LFJvPWtvLmZvcm1hdFJvd3MsTG89RW8oIlx0IiksRG89TG8ucGFyc2UsVW89TG8ucGFyc2VSb3dzLHFvPUxvLmZvcm1hdCxPbz1Mby5mb3JtYXRSb3dzO2Z1bmN0aW9uIFlvKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5ibG9iKCl9ZnVuY3Rpb24gQm8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LmFycmF5QnVmZmVyKCl9ZnVuY3Rpb24gRm8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LnRleHQoKX1mdW5jdGlvbiBJbyh0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oRm8pfWZ1bmN0aW9uIEhvKHQpe3JldHVybiBmdW5jdGlvbihuLGUscil7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgZSYmKHI9ZSxlPXZvaWQgMCksSW8obixlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybiB0KG4scil9KX19dmFyIGpvPUhvKENvKSxYbz1IbyhEbyk7ZnVuY3Rpb24gR28odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0Lmpzb24oKX1mdW5jdGlvbiBWbyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm4gSW8obixlKS50aGVuKGZ1bmN0aW9uKG4pe3JldHVybihuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcobix0KX0pfX12YXIgJG89Vm8oImFwcGxpY2F0aW9uL3htbCIpLFdvPVZvKCJ0ZXh0L2h0bWwiKSxabz1WbygiaW1hZ2Uvc3ZnK3htbCIpO2Z1bmN0aW9uIFFvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBKbygpe3JldHVybiAxZS02KihNYXRoLnJhbmRvbSgpLS41KX1mdW5jdGlvbiBLbyh0LG4sZSxyKXtpZihpc05hTihuKXx8aXNOYU4oZSkpcmV0dXJuIHQ7dmFyIGksbyxhLHUsZixjLHMsbCxoLGQ9dC5fcm9vdCxwPXtkYXRhOnJ9LHY9dC5feDAsZz10Ll95MCx5PXQuX3gxLF89dC5feTE7aWYoIWQpcmV0dXJuIHQuX3Jvb3Q9cCx0O2Zvcig7ZC5sZW5ndGg7KWlmKChjPW4+PShvPSh2K3kpLzIpKT92PW86eT1vLChzPWU+PShhPShnK18pLzIpKT9nPWE6Xz1hLGk9ZCwhKGQ9ZFtsPXM8PDF8Y10pKXJldHVybiBpW2xdPXAsdDtpZih1PSt0Ll94LmNhbGwobnVsbCxkLmRhdGEpLGY9K3QuX3kuY2FsbChudWxsLGQuZGF0YSksbj09PXUmJmU9PT1mKXJldHVybiBwLm5leHQ9ZCxpP2lbbF09cDp0Ll9yb290PXAsdDtkb3tpPWk/aVtsXT1uZXcgQXJyYXkoNCk6dC5fcm9vdD1uZXcgQXJyYXkoNCksKGM9bj49KG89KHYreSkvMikpP3Y9bzp5PW8sKHM9ZT49KGE9KGcrXykvMikpP2c9YTpfPWF9d2hpbGUoKGw9czw8MXxjKT09KGg9KGY+PWEpPDwxfHU+PW8pKTtyZXR1cm4gaVtoXT1kLGlbbF09cCx0fWZ1bmN0aW9uIHRhKHQsbixlLHIsaSl7dGhpcy5ub2RlPXQsdGhpcy54MD1uLHRoaXMueTA9ZSx0aGlzLngxPXIsdGhpcy55MT1pfWZ1bmN0aW9uIG5hKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIGVhKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIHJhKHQsbixlKXt2YXIgcj1uZXcgaWEobnVsbD09bj9uYTpuLG51bGw9PWU/ZWE6ZSxOYU4sTmFOLE5hTixOYU4pO3JldHVybiBudWxsPT10P3I6ci5hZGRBbGwodCl9ZnVuY3Rpb24gaWEodCxuLGUscixpLG8pe3RoaXMuX3g9dCx0aGlzLl95PW4sdGhpcy5feDA9ZSx0aGlzLl95MD1yLHRoaXMuX3gxPWksdGhpcy5feTE9byx0aGlzLl9yb290PXZvaWQgMH1mdW5jdGlvbiBvYSh0KXtmb3IodmFyIG49e2RhdGE6dC5kYXRhfSxlPW47dD10Lm5leHQ7KWU9ZS5uZXh0PXtkYXRhOnQuZGF0YX07cmV0dXJuIG59dmFyIGFhPXJhLnByb3RvdHlwZT1pYS5wcm90b3R5cGU7ZnVuY3Rpb24gdWEodCl7cmV0dXJuIHQueCt0LnZ4fWZ1bmN0aW9uIGZhKHQpe3JldHVybiB0LnkrdC52eX1mdW5jdGlvbiBjYSh0KXtyZXR1cm4gdC5pbmRleH1mdW5jdGlvbiBzYSh0LG4pe3ZhciBlPXQuZ2V0KG4pO2lmKCFlKXRocm93IG5ldyBFcnJvcigibWlzc2luZzogIituKTtyZXR1cm4gZX1mdW5jdGlvbiBsYSh0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIGhhKHQpe3JldHVybiB0Lnl9YWEuY29weT1mdW5jdGlvbigpe3ZhciB0LG4sZT1uZXcgaWEodGhpcy5feCx0aGlzLl95LHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSxyPXRoaXMuX3Jvb3Q7aWYoIXIpcmV0dXJuIGU7aWYoIXIubGVuZ3RoKXJldHVybiBlLl9yb290PW9hKHIpLGU7Zm9yKHQ9W3tzb3VyY2U6cix0YXJnZXQ6ZS5fcm9vdD1uZXcgQXJyYXkoNCl9XTtyPXQucG9wKCk7KWZvcih2YXIgaT0wO2k8NDsrK2kpKG49ci5zb3VyY2VbaV0pJiYobi5sZW5ndGg/dC5wdXNoKHtzb3VyY2U6bix0YXJnZXQ6ci50YXJnZXRbaV09bmV3IEFycmF5KDQpfSk6ci50YXJnZXRbaV09b2EobikpO3JldHVybiBlfSxhYS5hZGQ9ZnVuY3Rpb24odCl7dmFyIG49K3RoaXMuX3guY2FsbChudWxsLHQpLGU9K3RoaXMuX3kuY2FsbChudWxsLHQpO3JldHVybiBLbyh0aGlzLmNvdmVyKG4sZSksbixlLHQpfSxhYS5hZGRBbGw9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbz10Lmxlbmd0aCxhPW5ldyBBcnJheShvKSx1PW5ldyBBcnJheShvKSxmPTEvMCxjPTEvMCxzPS0xLzAsbD0tMS8wO2ZvcihlPTA7ZTxvOysrZSlpc05hTihyPSt0aGlzLl94LmNhbGwobnVsbCxuPXRbZV0pKXx8aXNOYU4oaT0rdGhpcy5feS5jYWxsKG51bGwsbikpfHwoYVtlXT1yLHVbZV09aSxyPGYmJihmPXIpLHI+cyYmKHM9ciksaTxjJiYoYz1pKSxpPmwmJihsPWkpKTtmb3IoczxmJiYoZj10aGlzLl94MCxzPXRoaXMuX3gxKSxsPGMmJihjPXRoaXMuX3kwLGw9dGhpcy5feTEpLHRoaXMuY292ZXIoZixjKS5jb3ZlcihzLGwpLGU9MDtlPG87KytlKUtvKHRoaXMsYVtlXSx1W2VdLHRbZV0pO3JldHVybiB0aGlzfSxhYS5jb3Zlcj1mdW5jdGlvbih0LG4pe2lmKGlzTmFOKHQ9K3QpfHxpc05hTihuPStuKSlyZXR1cm4gdGhpczt2YXIgZT10aGlzLl94MCxyPXRoaXMuX3kwLGk9dGhpcy5feDEsbz10aGlzLl95MTtpZihpc05hTihlKSlpPShlPU1hdGguZmxvb3IodCkpKzEsbz0ocj1NYXRoLmZsb29yKG4pKSsxO2Vsc2V7aWYoIShlPnR8fHQ+aXx8cj5ufHxuPm8pKXJldHVybiB0aGlzO3ZhciBhLHUsZj1pLWUsYz10aGlzLl9yb290O3N3aXRjaCh1PShuPChyK28pLzIpPDwxfHQ8KGUraSkvMil7Y2FzZSAwOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUobz1yKyhmKj0yKSx0PihpPWUrZil8fG4+byk7YnJlYWs7Y2FzZSAxOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUobz1yKyhmKj0yKSwoZT1pLWYpPnR8fG4+byk7YnJlYWs7Y2FzZSAyOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUocj1vLShmKj0yKSx0PihpPWUrZil8fHI+bik7YnJlYWs7Y2FzZSAzOmRveyhhPW5ldyBBcnJheSg0KSlbdV09YyxjPWF9d2hpbGUocj1vLShmKj0yKSwoZT1pLWYpPnR8fHI+bil9dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgmJih0aGlzLl9yb290PWMpfXJldHVybiB0aGlzLl94MD1lLHRoaXMuX3kwPXIsdGhpcy5feDE9aSx0aGlzLl95MT1vLHRoaXN9LGFhLmRhdGE9ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy52aXNpdChmdW5jdGlvbihuKXtpZighbi5sZW5ndGgpZG97dC5wdXNoKG4uZGF0YSl9d2hpbGUobj1uLm5leHQpfSksdH0sYWEuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuY292ZXIoK3RbMF1bMF0sK3RbMF1bMV0pLmNvdmVyKCt0WzFdWzBdLCt0WzFdWzFdKTppc05hTih0aGlzLl94MCk/dm9pZCAwOltbdGhpcy5feDAsdGhpcy5feTBdLFt0aGlzLl94MSx0aGlzLl95MV1dfSxhYS5maW5kPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sYSx1LGYsYyxzPXRoaXMuX3gwLGw9dGhpcy5feTAsaD10aGlzLl94MSxkPXRoaXMuX3kxLHA9W10sdj10aGlzLl9yb290O2Zvcih2JiZwLnB1c2gobmV3IHRhKHYscyxsLGgsZCkpLG51bGw9PWU/ZT0xLzA6KHM9dC1lLGw9bi1lLGg9dCtlLGQ9bitlLGUqPWUpO2Y9cC5wb3AoKTspaWYoISghKHY9Zi5ub2RlKXx8KGk9Zi54MCk+aHx8KG89Zi55MCk+ZHx8KGE9Zi54MSk8c3x8KHU9Zi55MSk8bCkpaWYodi5sZW5ndGgpe3ZhciBnPShpK2EpLzIseT0obyt1KS8yO3AucHVzaChuZXcgdGEodlszXSxnLHksYSx1KSxuZXcgdGEodlsyXSxpLHksZyx1KSxuZXcgdGEodlsxXSxnLG8sYSx5KSxuZXcgdGEodlswXSxpLG8sZyx5KSksKGM9KG4+PXkpPDwxfHQ+PWcpJiYoZj1wW3AubGVuZ3RoLTFdLHBbcC5sZW5ndGgtMV09cFtwLmxlbmd0aC0xLWNdLHBbcC5sZW5ndGgtMS1jXT1mKX1lbHNle3ZhciBfPXQtK3RoaXMuX3guY2FsbChudWxsLHYuZGF0YSksYj1uLSt0aGlzLl95LmNhbGwobnVsbCx2LmRhdGEpLG09XypfK2IqYjtpZihtPGUpe3ZhciB4PU1hdGguc3FydChlPW0pO3M9dC14LGw9bi14LGg9dCt4LGQ9bit4LHI9di5kYXRhfX1yZXR1cm4gcn0sYWEucmVtb3ZlPWZ1bmN0aW9uKHQpe2lmKGlzTmFOKG89K3RoaXMuX3guY2FsbChudWxsLHQpKXx8aXNOYU4oYT0rdGhpcy5feS5jYWxsKG51bGwsdCkpKXJldHVybiB0aGlzO3ZhciBuLGUscixpLG8sYSx1LGYsYyxzLGwsaCxkPXRoaXMuX3Jvb3QscD10aGlzLl94MCx2PXRoaXMuX3kwLGc9dGhpcy5feDEseT10aGlzLl95MTtpZighZClyZXR1cm4gdGhpcztpZihkLmxlbmd0aClmb3IoOzspe2lmKChjPW8+PSh1PShwK2cpLzIpKT9wPXU6Zz11LChzPWE+PShmPSh2K3kpLzIpKT92PWY6eT1mLG49ZCwhKGQ9ZFtsPXM8PDF8Y10pKXJldHVybiB0aGlzO2lmKCFkLmxlbmd0aClicmVhazsobltsKzEmM118fG5bbCsyJjNdfHxuW2wrMyYzXSkmJihlPW4saD1sKX1mb3IoO2QuZGF0YSE9PXQ7KWlmKHI9ZCwhKGQ9ZC5uZXh0KSlyZXR1cm4gdGhpcztyZXR1cm4oaT1kLm5leHQpJiZkZWxldGUgZC5uZXh0LHI/KGk/ci5uZXh0PWk6ZGVsZXRlIHIubmV4dCx0aGlzKTpuPyhpP25bbF09aTpkZWxldGUgbltsXSwoZD1uWzBdfHxuWzFdfHxuWzJdfHxuWzNdKSYmZD09PShuWzNdfHxuWzJdfHxuWzFdfHxuWzBdKSYmIWQubGVuZ3RoJiYoZT9lW2hdPWQ6dGhpcy5fcm9vdD1kKSx0aGlzKToodGhpcy5fcm9vdD1pLHRoaXMpfSxhYS5yZW1vdmVBbGw9ZnVuY3Rpb24odCl7Zm9yKHZhciBuPTAsZT10Lmxlbmd0aDtuPGU7KytuKXRoaXMucmVtb3ZlKHRbbl0pO3JldHVybiB0aGlzfSxhYS5yb290PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jvb3R9LGFhLnNpemU9ZnVuY3Rpb24oKXt2YXIgdD0wO3JldHVybiB0aGlzLnZpc2l0KGZ1bmN0aW9uKG4pe2lmKCFuLmxlbmd0aClkb3srK3R9d2hpbGUobj1uLm5leHQpfSksdH0sYWEudmlzaXQ9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGksbyxhLHU9W10sZj10aGlzLl9yb290O2ZvcihmJiZ1LnB1c2gobmV3IHRhKGYsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtuPXUucG9wKCk7KWlmKCF0KGY9bi5ub2RlLHI9bi54MCxpPW4ueTAsbz1uLngxLGE9bi55MSkmJmYubGVuZ3RoKXt2YXIgYz0ocitvKS8yLHM9KGkrYSkvMjsoZT1mWzNdKSYmdS5wdXNoKG5ldyB0YShlLGMscyxvLGEpKSwoZT1mWzJdKSYmdS5wdXNoKG5ldyB0YShlLHIscyxjLGEpKSwoZT1mWzFdKSYmdS5wdXNoKG5ldyB0YShlLGMsaSxvLHMpKSwoZT1mWzBdKSYmdS5wdXNoKG5ldyB0YShlLHIsaSxjLHMpKX1yZXR1cm4gdGhpc30sYWEudmlzaXRBZnRlcj1mdW5jdGlvbih0KXt2YXIgbixlPVtdLHI9W107Zm9yKHRoaXMuX3Jvb3QmJmUucHVzaChuZXcgdGEodGhpcy5fcm9vdCx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO249ZS5wb3AoKTspe3ZhciBpPW4ubm9kZTtpZihpLmxlbmd0aCl7dmFyIG8sYT1uLngwLHU9bi55MCxmPW4ueDEsYz1uLnkxLHM9KGErZikvMixsPSh1K2MpLzI7KG89aVswXSkmJmUucHVzaChuZXcgdGEobyxhLHUscyxsKSksKG89aVsxXSkmJmUucHVzaChuZXcgdGEobyxzLHUsZixsKSksKG89aVsyXSkmJmUucHVzaChuZXcgdGEobyxhLGwscyxjKSksKG89aVszXSkmJmUucHVzaChuZXcgdGEobyxzLGwsZixjKSl9ci5wdXNoKG4pfWZvcig7bj1yLnBvcCgpOyl0KG4ubm9kZSxuLngwLG4ueTAsbi54MSxuLnkxKTtyZXR1cm4gdGhpc30sYWEueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feD10LHRoaXMpOnRoaXMuX3h9LGFhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3k9dCx0aGlzKTp0aGlzLl95fTt2YXIgZGE9MTAscGE9TWF0aC5QSSooMy1NYXRoLnNxcnQoNSkpO2Z1bmN0aW9uIHZhKHQsbil7aWYoKGU9KHQ9bj90LnRvRXhwb25lbnRpYWwobi0xKTp0LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBlLHI9dC5zbGljZSgwLGUpO3JldHVybltyLmxlbmd0aD4xP3JbMF0rci5zbGljZSgyKTpyLCt0LnNsaWNlKGUrMSldfWZ1bmN0aW9uIGdhKHQpe3JldHVybih0PXZhKE1hdGguYWJzKHQpKSk/dFsxXTpOYU59dmFyIHlhLF9hPS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLSggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8ofik/KFthLXolXSk/JC9pO2Z1bmN0aW9uIGJhKHQpe3JldHVybiBuZXcgbWEodCl9ZnVuY3Rpb24gbWEodCl7aWYoIShuPV9hLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIG47dGhpcy5maWxsPW5bMV18fCIgIix0aGlzLmFsaWduPW5bMl18fCI+Iix0aGlzLnNpZ249blszXXx8Ii0iLHRoaXMuc3ltYm9sPW5bNF18fCIiLHRoaXMuemVybz0hIW5bNV0sdGhpcy53aWR0aD1uWzZdJiYrbls2XSx0aGlzLmNvbW1hPSEhbls3XSx0aGlzLnByZWNpc2lvbj1uWzhdJiYrbls4XS5zbGljZSgxKSx0aGlzLnRyaW09ISFuWzldLHRoaXMudHlwZT1uWzEwXXx8IiJ9ZnVuY3Rpb24geGEodCxuKXt2YXIgZT12YSh0LG4pO2lmKCFlKXJldHVybiB0KyIiO3ZhciByPWVbMF0saT1lWzFdO3JldHVybiBpPDA/IjAuIituZXcgQXJyYXkoLWkpLmpvaW4oIjAiKStyOnIubGVuZ3RoPmkrMT9yLnNsaWNlKDAsaSsxKSsiLiIrci5zbGljZShpKzEpOnIrbmV3IEFycmF5KGktci5sZW5ndGgrMikuam9pbigiMCIpfWJhLnByb3RvdHlwZT1tYS5wcm90b3R5cGUsbWEucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKG51bGw9PXRoaXMud2lkdGg/IiI6TWF0aC5tYXgoMSwwfHRoaXMud2lkdGgpKSsodGhpcy5jb21tYT8iLCI6IiIpKyhudWxsPT10aGlzLnByZWNpc2lvbj8iIjoiLiIrTWF0aC5tYXgoMCwwfHRoaXMucHJlY2lzaW9uKSkrKHRoaXMudHJpbT8ifiI6IiIpK3RoaXMudHlwZX07dmFyIHdhPXsiJSI6ZnVuY3Rpb24odCxuKXtyZXR1cm4oMTAwKnQpLnRvRml4ZWQobil9LGI6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24odCl7cmV0dXJuIHQrIiJ9LGQ6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHQudG9FeHBvbmVudGlhbChuKX0sZjpmdW5jdGlvbih0LG4pe3JldHVybiB0LnRvRml4ZWQobil9LGc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gdC50b1ByZWNpc2lvbihuKX0sbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KX0scDpmdW5jdGlvbih0LG4pe3JldHVybiB4YSgxMDAqdCxuKX0scjp4YSxzOmZ1bmN0aW9uKHQsbil7dmFyIGU9dmEodCxuKTtpZighZSlyZXR1cm4gdCsiIjt2YXIgcj1lWzBdLGk9ZVsxXSxvPWktKHlhPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGkvMykpKSkrMSxhPXIubGVuZ3RoO3JldHVybiBvPT09YT9yOm8+YT9yK25ldyBBcnJheShvLWErMSkuam9pbigiMCIpOm8+MD9yLnNsaWNlKDAsbykrIi4iK3Iuc2xpY2Uobyk6IjAuIituZXcgQXJyYXkoMS1vKS5qb2luKCIwIikrdmEodCxNYXRoLm1heCgwLG4rby0xKSlbMF19LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX07ZnVuY3Rpb24gTWEodCl7cmV0dXJuIHR9dmFyIEFhLFRhPVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiBOYSh0KXt2YXIgbixlLHI9dC5ncm91cGluZyYmdC50aG91c2FuZHM/KG49dC5ncm91cGluZyxlPXQudGhvdXNhbmRzLGZ1bmN0aW9uKHQscil7Zm9yKHZhciBpPXQubGVuZ3RoLG89W10sYT0wLHU9blswXSxmPTA7aT4wJiZ1PjAmJihmK3UrMT5yJiYodT1NYXRoLm1heCgxLHItZikpLG8ucHVzaCh0LnN1YnN0cmluZyhpLT11LGkrdSkpLCEoKGYrPXUrMSk+cikpOyl1PW5bYT0oYSsxKSVuLmxlbmd0aF07cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4oZSl9KTpNYSxpPXQuY3VycmVuY3ksbz10LmRlY2ltYWwsYT10Lm51bWVyYWxzP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbi5yZXBsYWNlKC9bMC05XS9nLGZ1bmN0aW9uKG4pe3JldHVybiB0WytuXX0pfX0odC5udW1lcmFscyk6TWEsdT10LnBlcmNlbnR8fCIlIjtmdW5jdGlvbiBmKHQpe3ZhciBuPSh0PWJhKHQpKS5maWxsLGU9dC5hbGlnbixmPXQuc2lnbixjPXQuc3ltYm9sLHM9dC56ZXJvLGw9dC53aWR0aCxoPXQuY29tbWEsZD10LnByZWNpc2lvbixwPXQudHJpbSx2PXQudHlwZTsibiI9PT12PyhoPSEwLHY9ImciKTp3YVt2XXx8KG51bGw9PWQmJihkPTEyKSxwPSEwLHY9ImciKSwoc3x8IjAiPT09biYmIj0iPT09ZSkmJihzPSEwLG49IjAiLGU9Ij0iKTt2YXIgZz0iJCI9PT1jP2lbMF06IiMiPT09YyYmL1tib3hYXS8udGVzdCh2KT8iMCIrdi50b0xvd2VyQ2FzZSgpOiIiLHk9IiQiPT09Yz9pWzFdOi9bJXBdLy50ZXN0KHYpP3U6IiIsXz13YVt2XSxiPS9bZGVmZ3BycyVdLy50ZXN0KHYpO2Z1bmN0aW9uIG0odCl7dmFyIGksdSxjLG09Zyx4PXk7aWYoImMiPT09dil4PV8odCkreCx0PSIiO2Vsc2V7dmFyIHc9KHQ9K3QpPDA7aWYodD1fKE1hdGguYWJzKHQpLGQpLHAmJih0PWZ1bmN0aW9uKHQpe3Q6Zm9yKHZhciBuLGU9dC5sZW5ndGgscj0xLGk9LTE7cjxlOysrcilzd2l0Y2godFtyXSl7Y2FzZSIuIjppPW49cjticmVhaztjYXNlIjAiOjA9PT1pJiYoaT1yKSxuPXI7YnJlYWs7ZGVmYXVsdDppZihpPjApe2lmKCErdFtyXSlicmVhayB0O2k9MH19cmV0dXJuIGk+MD90LnNsaWNlKDAsaSkrdC5zbGljZShuKzEpOnR9KHQpKSx3JiYwPT0rdCYmKHc9ITEpLG09KHc/IigiPT09Zj9mOiItIjoiLSI9PT1mfHwiKCI9PT1mPyIiOmYpK20seD0oInMiPT09dj9UYVs4K3lhLzNdOiIiKSt4Kyh3JiYiKCI9PT1mPyIpIjoiIiksYilmb3IoaT0tMSx1PXQubGVuZ3RoOysraTx1OylpZig0OD4oYz10LmNoYXJDb2RlQXQoaSkpfHxjPjU3KXt4PSg0Nj09PWM/byt0LnNsaWNlKGkrMSk6dC5zbGljZShpKSkreCx0PXQuc2xpY2UoMCxpKTticmVha319aCYmIXMmJih0PXIodCwxLzApKTt2YXIgTT1tLmxlbmd0aCt0Lmxlbmd0aCt4Lmxlbmd0aCxBPU08bD9uZXcgQXJyYXkobC1NKzEpLmpvaW4obik6IiI7c3dpdGNoKGgmJnMmJih0PXIoQSt0LEEubGVuZ3RoP2wteC5sZW5ndGg6MS8wKSxBPSIiKSxlKXtjYXNlIjwiOnQ9bSt0K3grQTticmVhaztjYXNlIj0iOnQ9bStBK3QreDticmVhaztjYXNlIl4iOnQ9QS5zbGljZSgwLE09QS5sZW5ndGg+PjEpK20rdCt4K0Euc2xpY2UoTSk7YnJlYWs7ZGVmYXVsdDp0PUErbSt0K3h9cmV0dXJuIGEodCl9cmV0dXJuIGQ9bnVsbD09ZD82Oi9bZ3Byc10vLnRlc3Qodik/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxkKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxkKSksbS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSxtfXJldHVybntmb3JtYXQ6Zixmb3JtYXRQcmVmaXg6ZnVuY3Rpb24odCxuKXt2YXIgZT1mKCgodD1iYSh0KSkudHlwZT0iZiIsdCkpLHI9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZ2EobikvMykpKSxpPU1hdGgucG93KDEwLC1yKSxvPVRhWzgrci8zXTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUoaSp0KStvfX19fWZ1bmN0aW9uIFNhKG4pe3JldHVybiBBYT1OYShuKSx0LmZvcm1hdD1BYS5mb3JtYXQsdC5mb3JtYXRQcmVmaXg9QWEuZm9ybWF0UHJlZml4LEFhfWZ1bmN0aW9uIEVhKHQpe3JldHVybiBNYXRoLm1heCgwLC1nYShNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIGthKHQsbil7cmV0dXJuIE1hdGgubWF4KDAsMypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoZ2EobikvMykpKS1nYShNYXRoLmFicyh0KSkpfWZ1bmN0aW9uIENhKHQsbil7cmV0dXJuIHQ9TWF0aC5hYnModCksbj1NYXRoLmFicyhuKS10LE1hdGgubWF4KDAsZ2EobiktZ2EodCkpKzF9ZnVuY3Rpb24gUGEoKXtyZXR1cm4gbmV3IHphfWZ1bmN0aW9uIHphKCl7dGhpcy5yZXNldCgpfVNhKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXX0pLHphLnByb3RvdHlwZT17Y29uc3RydWN0b3I6emEscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LGFkZDpmdW5jdGlvbih0KXtMYShSYSx0LHRoaXMudCksTGEodGhpcyxSYS5zLHRoaXMucyksdGhpcy5zP3RoaXMudCs9UmEudDp0aGlzLnM9UmEudH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgUmE9bmV3IHphO2Z1bmN0aW9uIExhKHQsbixlKXt2YXIgcj10LnM9bitlLGk9ci1uLG89ci1pO3QudD1uLW8rKGUtaSl9dmFyIERhPTFlLTYsVWE9MWUtMTIscWE9TWF0aC5QSSxPYT1xYS8yLFlhPXFhLzQsQmE9MipxYSxGYT0xODAvcWEsSWE9cWEvMTgwLEhhPU1hdGguYWJzLGphPU1hdGguYXRhbixYYT1NYXRoLmF0YW4yLEdhPU1hdGguY29zLFZhPU1hdGguY2VpbCwkYT1NYXRoLmV4cCxXYT1NYXRoLmxvZyxaYT1NYXRoLnBvdyxRYT1NYXRoLnNpbixKYT1NYXRoLnNpZ258fGZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0sS2E9TWF0aC5zcXJ0LHR1PU1hdGgudGFuO2Z1bmN0aW9uIG51KHQpe3JldHVybiB0PjE/MDp0PC0xP3FhOk1hdGguYWNvcyh0KX1mdW5jdGlvbiBldSh0KXtyZXR1cm4gdD4xP09hOnQ8LTE/LU9hOk1hdGguYXNpbih0KX1mdW5jdGlvbiBydSh0KXtyZXR1cm4odD1RYSh0LzIpKSp0fWZ1bmN0aW9uIGl1KCl7fWZ1bmN0aW9uIG91KHQsbil7dCYmdXUuaGFzT3duUHJvcGVydHkodC50eXBlKSYmdXVbdC50eXBlXSh0LG4pfXZhciBhdT17RmVhdHVyZTpmdW5jdGlvbih0LG4pe291KHQuZ2VvbWV0cnksbil9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZmVhdHVyZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylvdShlW3JdLmdlb21ldHJ5LG4pfX0sdXU9e1NwaGVyZTpmdW5jdGlvbih0LG4pe24uc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKHQsbil7dD10LmNvb3JkaW5hdGVzLG4ucG9pbnQodFswXSx0WzFdLHRbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyl0PWVbcl0sbi5wb2ludCh0WzBdLHRbMV0sdFsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtmdSh0LmNvb3JkaW5hdGVzLG4sMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspZnUoZVtyXSxuLDApfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Y3UodC5jb29yZGluYXRlcyxuKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOyljdShlW3JdLG4pfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5nZW9tZXRyaWVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspb3UoZVtyXSxuKX19O2Z1bmN0aW9uIGZ1KHQsbixlKXt2YXIgcixpPS0xLG89dC5sZW5ndGgtZTtmb3Iobi5saW5lU3RhcnQoKTsrK2k8bzspcj10W2ldLG4ucG9pbnQoclswXSxyWzFdLHJbMl0pO24ubGluZUVuZCgpfWZ1bmN0aW9uIGN1KHQsbil7dmFyIGU9LTEscj10Lmxlbmd0aDtmb3Iobi5wb2x5Z29uU3RhcnQoKTsrK2U8cjspZnUodFtlXSxuLDEpO24ucG9seWdvbkVuZCgpfWZ1bmN0aW9uIHN1KHQsbil7dCYmYXUuaGFzT3duUHJvcGVydHkodC50eXBlKT9hdVt0LnR5cGVdKHQsbik6b3UodCxuKX12YXIgbHUsaHUsZHUscHUsdnUsZ3U9UGEoKSx5dT1QYSgpLF91PXtwb2ludDppdSxsaW5lU3RhcnQ6aXUsbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtndS5yZXNldCgpLF91LmxpbmVTdGFydD1idSxfdS5saW5lRW5kPW11fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9K2d1O3l1LmFkZCh0PDA/QmErdDp0KSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD1pdX0sc3BoZXJlOmZ1bmN0aW9uKCl7eXUuYWRkKEJhKX19O2Z1bmN0aW9uIGJ1KCl7X3UucG9pbnQ9eHV9ZnVuY3Rpb24gbXUoKXt3dShsdSxodSl9ZnVuY3Rpb24geHUodCxuKXtfdS5wb2ludD13dSxsdT10LGh1PW4sZHU9dCo9SWEscHU9R2Eobj0obio9SWEpLzIrWWEpLHZ1PVFhKG4pfWZ1bmN0aW9uIHd1KHQsbil7dmFyIGU9KHQqPUlhKS1kdSxyPWU+PTA/MTotMSxpPXIqZSxvPUdhKG49KG4qPUlhKS8yK1lhKSxhPVFhKG4pLHU9dnUqYSxmPXB1Km8rdSpHYShpKSxjPXUqcipRYShpKTtndS5hZGQoWGEoYyxmKSksZHU9dCxwdT1vLHZ1PWF9ZnVuY3Rpb24gTXUodCl7cmV0dXJuW1hhKHRbMV0sdFswXSksZXUodFsyXSldfWZ1bmN0aW9uIEF1KHQpe3ZhciBuPXRbMF0sZT10WzFdLHI9R2EoZSk7cmV0dXJuW3IqR2EobikscipRYShuKSxRYShlKV19ZnVuY3Rpb24gVHUodCxuKXtyZXR1cm4gdFswXSpuWzBdK3RbMV0qblsxXSt0WzJdKm5bMl19ZnVuY3Rpb24gTnUodCxuKXtyZXR1cm5bdFsxXSpuWzJdLXRbMl0qblsxXSx0WzJdKm5bMF0tdFswXSpuWzJdLHRbMF0qblsxXS10WzFdKm5bMF1dfWZ1bmN0aW9uIFN1KHQsbil7dFswXSs9blswXSx0WzFdKz1uWzFdLHRbMl0rPW5bMl19ZnVuY3Rpb24gRXUodCxuKXtyZXR1cm5bdFswXSpuLHRbMV0qbix0WzJdKm5dfWZ1bmN0aW9uIGt1KHQpe3ZhciBuPUthKHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdKTt0WzBdLz1uLHRbMV0vPW4sdFsyXS89bn12YXIgQ3UsUHUsenUsUnUsTHUsRHUsVXUscXUsT3UsWXUsQnUsRnUsSXUsSHUsanUsWHUsR3UsVnUsJHUsV3UsWnUsUXUsSnUsS3UsdGYsbmYsZWY9UGEoKSxyZj17cG9pbnQ6b2YsbGluZVN0YXJ0OnVmLGxpbmVFbmQ6ZmYscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7cmYucG9pbnQ9Y2YscmYubGluZVN0YXJ0PXNmLHJmLmxpbmVFbmQ9bGYsZWYucmVzZXQoKSxfdS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe191LnBvbHlnb25FbmQoKSxyZi5wb2ludD1vZixyZi5saW5lU3RhcnQ9dWYscmYubGluZUVuZD1mZixndTwwPyhDdT0tKHp1PTE4MCksUHU9LShSdT05MCkpOmVmPkRhP1J1PTkwOmVmPC1EYSYmKFB1PS05MCksWXVbMF09Q3UsWXVbMV09enV9fTtmdW5jdGlvbiBvZih0LG4pe091LnB1c2goWXU9W0N1PXQsenU9dF0pLG48UHUmJihQdT1uKSxuPlJ1JiYoUnU9bil9ZnVuY3Rpb24gYWYodCxuKXt2YXIgZT1BdShbdCpJYSxuKklhXSk7aWYocXUpe3ZhciByPU51KHF1LGUpLGk9TnUoW3JbMV0sLXJbMF0sMF0scik7a3UoaSksaT1NdShpKTt2YXIgbyxhPXQtTHUsdT1hPjA/MTotMSxmPWlbMF0qRmEqdSxjPUhhKGEpPjE4MDtjXih1Kkx1PGYmJmY8dSp0KT8obz1pWzFdKkZhKT5SdSYmKFJ1PW8pOmNeKHUqTHU8KGY9KGYrMzYwKSUzNjAtMTgwKSYmZjx1KnQpPyhvPS1pWzFdKkZhKTxQdSYmKFB1PW8pOihuPFB1JiYoUHU9biksbj5SdSYmKFJ1PW4pKSxjP3Q8THU/aGYoQ3UsdCk+aGYoQ3UsenUpJiYoenU9dCk6aGYodCx6dSk+aGYoQ3UsenUpJiYoQ3U9dCk6enU+PUN1Pyh0PEN1JiYoQ3U9dCksdD56dSYmKHp1PXQpKTp0Pkx1P2hmKEN1LHQpPmhmKEN1LHp1KSYmKHp1PXQpOmhmKHQsenUpPmhmKEN1LHp1KSYmKEN1PXQpfWVsc2UgT3UucHVzaChZdT1bQ3U9dCx6dT10XSk7bjxQdSYmKFB1PW4pLG4+UnUmJihSdT1uKSxxdT1lLEx1PXR9ZnVuY3Rpb24gdWYoKXtyZi5wb2ludD1hZn1mdW5jdGlvbiBmZigpe1l1WzBdPUN1LFl1WzFdPXp1LHJmLnBvaW50PW9mLHF1PW51bGx9ZnVuY3Rpb24gY2YodCxuKXtpZihxdSl7dmFyIGU9dC1MdTtlZi5hZGQoSGEoZSk+MTgwP2UrKGU+MD8zNjA6LTM2MCk6ZSl9ZWxzZSBEdT10LFV1PW47X3UucG9pbnQodCxuKSxhZih0LG4pfWZ1bmN0aW9uIHNmKCl7X3UubGluZVN0YXJ0KCl9ZnVuY3Rpb24gbGYoKXtjZihEdSxVdSksX3UubGluZUVuZCgpLEhhKGVmKT5EYSYmKEN1PS0oenU9MTgwKSksWXVbMF09Q3UsWXVbMV09enUscXU9bnVsbH1mdW5jdGlvbiBoZih0LG4pe3JldHVybihuLT10KTwwP24rMzYwOm59ZnVuY3Rpb24gZGYodCxuKXtyZXR1cm4gdFswXS1uWzBdfWZ1bmN0aW9uIHBmKHQsbil7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9biYmbjw9dFsxXTpuPHRbMF18fHRbMV08bn12YXIgdmY9e3NwaGVyZTppdSxwb2ludDpnZixsaW5lU3RhcnQ6X2YsbGluZUVuZDp4Zixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt2Zi5saW5lU3RhcnQ9d2YsdmYubGluZUVuZD1NZn0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZmLmxpbmVTdGFydD1fZix2Zi5saW5lRW5kPXhmfX07ZnVuY3Rpb24gZ2YodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSk7eWYoZSpHYSh0KSxlKlFhKHQpLFFhKG4pKX1mdW5jdGlvbiB5Zih0LG4sZSl7SXUrPSh0LUl1KS8rK0J1LEh1Kz0obi1IdSkvQnUsanUrPShlLWp1KS9CdX1mdW5jdGlvbiBfZigpe3ZmLnBvaW50PWJmfWZ1bmN0aW9uIGJmKHQsbil7dCo9SWE7dmFyIGU9R2Eobio9SWEpO0t1PWUqR2EodCksdGY9ZSpRYSh0KSxuZj1RYShuKSx2Zi5wb2ludD1tZix5ZihLdSx0ZixuZil9ZnVuY3Rpb24gbWYodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSkscj1lKkdhKHQpLGk9ZSpRYSh0KSxvPVFhKG4pLGE9WGEoS2EoKGE9dGYqby1uZippKSphKyhhPW5mKnItS3UqbykqYSsoYT1LdSppLXRmKnIpKmEpLEt1KnIrdGYqaStuZipvKTtGdSs9YSxYdSs9YSooS3UrKEt1PXIpKSxHdSs9YSoodGYrKHRmPWkpKSxWdSs9YSoobmYrKG5mPW8pKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24geGYoKXt2Zi5wb2ludD1nZn1mdW5jdGlvbiB3Zigpe3ZmLnBvaW50PUFmfWZ1bmN0aW9uIE1mKCl7VGYoUXUsSnUpLHZmLnBvaW50PWdmfWZ1bmN0aW9uIEFmKHQsbil7UXU9dCxKdT1uLHQqPUlhLG4qPUlhLHZmLnBvaW50PVRmO3ZhciBlPUdhKG4pO0t1PWUqR2EodCksdGY9ZSpRYSh0KSxuZj1RYShuKSx5ZihLdSx0ZixuZil9ZnVuY3Rpb24gVGYodCxuKXt0Kj1JYTt2YXIgZT1HYShuKj1JYSkscj1lKkdhKHQpLGk9ZSpRYSh0KSxvPVFhKG4pLGE9dGYqby1uZippLHU9bmYqci1LdSpvLGY9S3UqaS10ZipyLGM9S2EoYSphK3UqdStmKmYpLHM9ZXUoYyksbD1jJiYtcy9jOyR1Kz1sKmEsV3UrPWwqdSxadSs9bCpmLEZ1Kz1zLFh1Kz1zKihLdSsoS3U9cikpLEd1Kz1zKih0ZisodGY9aSkpLFZ1Kz1zKihuZisobmY9bykpLHlmKEt1LHRmLG5mKX1mdW5jdGlvbiBOZih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gU2YodCxuKXtmdW5jdGlvbiBlKGUscil7cmV0dXJuIGU9dChlLHIpLG4oZVswXSxlWzFdKX1yZXR1cm4gdC5pbnZlcnQmJm4uaW52ZXJ0JiYoZS5pbnZlcnQ9ZnVuY3Rpb24oZSxyKXtyZXR1cm4oZT1uLmludmVydChlLHIpKSYmdC5pbnZlcnQoZVswXSxlWzFdKX0pLGV9ZnVuY3Rpb24gRWYodCxuKXtyZXR1cm5bdD5xYT90LUJhOnQ8LXFhP3QrQmE6dCxuXX1mdW5jdGlvbiBrZih0LG4sZSl7cmV0dXJuKHQlPUJhKT9ufHxlP1NmKFBmKHQpLHpmKG4sZSkpOlBmKHQpOm58fGU/emYobixlKTpFZn1mdW5jdGlvbiBDZih0KXtyZXR1cm4gZnVuY3Rpb24obixlKXtyZXR1cm5bKG4rPXQpPnFhP24tQmE6bjwtcWE/bitCYTpuLGVdfX1mdW5jdGlvbiBQZih0KXt2YXIgbj1DZih0KTtyZXR1cm4gbi5pbnZlcnQ9Q2YoLXQpLG59ZnVuY3Rpb24gemYodCxuKXt2YXIgZT1HYSh0KSxyPVFhKHQpLGk9R2Eobiksbz1RYShuKTtmdW5jdGlvbiBhKHQsbil7dmFyIGE9R2EobiksdT1HYSh0KSphLGY9UWEodCkqYSxjPVFhKG4pLHM9YyplK3UqcjtyZXR1cm5bWGEoZippLXMqbyx1KmUtYypyKSxldShzKmkrZipvKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGE9R2EobiksdT1HYSh0KSphLGY9UWEodCkqYSxjPVFhKG4pLHM9YyppLWYqbztyZXR1cm5bWGEoZippK2Mqbyx1KmUrcypyKSxldShzKmUtdSpyKV19LGF9ZnVuY3Rpb24gUmYodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4obj10KG5bMF0qSWEsblsxXSpJYSkpWzBdKj1GYSxuWzFdKj1GYSxufXJldHVybiB0PWtmKHRbMF0qSWEsdFsxXSpJYSx0Lmxlbmd0aD4yP3RbMl0qSWE6MCksbi5pbnZlcnQ9ZnVuY3Rpb24obil7cmV0dXJuKG49dC5pbnZlcnQoblswXSpJYSxuWzFdKklhKSlbMF0qPUZhLG5bMV0qPUZhLG59LG59ZnVuY3Rpb24gTGYodCxuLGUscixpLG8pe2lmKGUpe3ZhciBhPUdhKG4pLHU9UWEobiksZj1yKmU7bnVsbD09aT8oaT1uK3IqQmEsbz1uLWYvMik6KGk9RGYoYSxpKSxvPURmKGEsbyksKHI+MD9pPG86aT5vKSYmKGkrPXIqQmEpKTtmb3IodmFyIGMscz1pO3I+MD9zPm86czxvO3MtPWYpYz1NdShbYSwtdSpHYShzKSwtdSpRYShzKV0pLHQucG9pbnQoY1swXSxjWzFdKX19ZnVuY3Rpb24gRGYodCxuKXsobj1BdShuKSlbMF0tPXQsa3Uobik7dmFyIGU9bnUoLW5bMV0pO3JldHVybigoLW5bMl08MD8tZTplKStCYS1EYSklQmF9ZnVuY3Rpb24gVWYoKXt2YXIgdCxuPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihuLGUpe3QucHVzaChbbixlXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe24ucHVzaCh0PVtdKX0sbGluZUVuZDppdSxyZWpvaW46ZnVuY3Rpb24oKXtuLmxlbmd0aD4xJiZuLnB1c2gobi5wb3AoKS5jb25jYXQobi5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBlPW47cmV0dXJuIG49W10sdD1udWxsLGV9fX1mdW5jdGlvbiBxZih0LG4pe3JldHVybiBIYSh0WzBdLW5bMF0pPERhJiZIYSh0WzFdLW5bMV0pPERhfWZ1bmN0aW9uIE9mKHQsbixlLHIpe3RoaXMueD10LHRoaXMuej1uLHRoaXMubz1lLHRoaXMuZT1yLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gWWYodCxuLGUscixpKXt2YXIgbyxhLHU9W10sZj1bXTtpZih0LmZvckVhY2goZnVuY3Rpb24odCl7aWYoISgobj10Lmxlbmd0aC0xKTw9MCkpe3ZhciBuLGUscj10WzBdLGE9dFtuXTtpZihxZihyLGEpKXtmb3IoaS5saW5lU3RhcnQoKSxvPTA7bzxuOysrbylpLnBvaW50KChyPXRbb10pWzBdLHJbMV0pO2kubGluZUVuZCgpfWVsc2UgdS5wdXNoKGU9bmV3IE9mKHIsdCxudWxsLCEwKSksZi5wdXNoKGUubz1uZXcgT2YocixudWxsLGUsITEpKSx1LnB1c2goZT1uZXcgT2YoYSx0LG51bGwsITEpKSxmLnB1c2goZS5vPW5ldyBPZihhLG51bGwsZSwhMCkpfX0pLHUubGVuZ3RoKXtmb3IoZi5zb3J0KG4pLEJmKHUpLEJmKGYpLG89MCxhPWYubGVuZ3RoO288YTsrK28pZltvXS5lPWU9IWU7Zm9yKHZhciBjLHMsbD11WzBdOzspe2Zvcih2YXIgaD1sLGQ9ITA7aC52OylpZigoaD1oLm4pPT09bClyZXR1cm47Yz1oLnosaS5saW5lU3RhcnQoKTtkb3tpZihoLnY9aC5vLnY9ITAsaC5lKXtpZihkKWZvcihvPTAsYT1jLmxlbmd0aDtvPGE7KytvKWkucG9pbnQoKHM9Y1tvXSlbMF0sc1sxXSk7ZWxzZSByKGgueCxoLm4ueCwxLGkpO2g9aC5ufWVsc2V7aWYoZClmb3IoYz1oLnAueixvPWMubGVuZ3RoLTE7bz49MDstLW8paS5wb2ludCgocz1jW29dKVswXSxzWzFdKTtlbHNlIHIoaC54LGgucC54LC0xLGkpO2g9aC5wfWM9KGg9aC5vKS56LGQ9IWR9d2hpbGUoIWgudik7aS5saW5lRW5kKCl9fX1mdW5jdGlvbiBCZih0KXtpZihuPXQubGVuZ3RoKXtmb3IodmFyIG4sZSxyPTAsaT10WzBdOysrcjxuOylpLm49ZT10W3JdLGUucD1pLGk9ZTtpLm49ZT10WzBdLGUucD1pfX1FZi5pbnZlcnQ9RWY7dmFyIEZmPVBhKCk7ZnVuY3Rpb24gSWYodCxuKXt2YXIgZT1uWzBdLHI9blsxXSxpPVFhKHIpLG89W1FhKGUpLC1HYShlKSwwXSxhPTAsdT0wO0ZmLnJlc2V0KCksMT09PWk/cj1PYStEYTotMT09PWkmJihyPS1PYS1EYSk7Zm9yKHZhciBmPTAsYz10Lmxlbmd0aDtmPGM7KytmKWlmKGw9KHM9dFtmXSkubGVuZ3RoKWZvcih2YXIgcyxsLGg9c1tsLTFdLGQ9aFswXSxwPWhbMV0vMitZYSx2PVFhKHApLGc9R2EocCkseT0wO3k8bDsrK3ksZD1iLHY9eCxnPXcsaD1fKXt2YXIgXz1zW3ldLGI9X1swXSxtPV9bMV0vMitZYSx4PVFhKG0pLHc9R2EobSksTT1iLWQsQT1NPj0wPzE6LTEsVD1BKk0sTj1UPnFhLFM9dip4O2lmKEZmLmFkZChYYShTKkEqUWEoVCksZyp3K1MqR2EoVCkpKSxhKz1OP00rQSpCYTpNLE5eZD49ZV5iPj1lKXt2YXIgRT1OdShBdShoKSxBdShfKSk7a3UoRSk7dmFyIGs9TnUobyxFKTtrdShrKTt2YXIgQz0oTl5NPj0wPy0xOjEpKmV1KGtbMl0pOyhyPkN8fHI9PT1DJiYoRVswXXx8RVsxXSkpJiYodSs9Tl5NPj0wPzE6LTEpfX1yZXR1cm4oYTwtRGF8fGE8RGEmJkZmPC1EYSleMSZ1fWZ1bmN0aW9uIEhmKHQsbixlLHIpe3JldHVybiBmdW5jdGlvbihpKXt2YXIgbyxhLHUsZj1uKGkpLGM9VWYoKSxzPW4oYyksbD0hMSxoPXtwb2ludDpkLGxpbmVTdGFydDp2LGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtoLnBvaW50PXksaC5saW5lU3RhcnQ9XyxoLmxpbmVFbmQ9YixhPVtdLG89W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtoLnBvaW50PWQsaC5saW5lU3RhcnQ9dixoLmxpbmVFbmQ9ZyxhPU4oYSk7dmFyIHQ9SWYobyxyKTthLmxlbmd0aD8obHx8KGkucG9seWdvblN0YXJ0KCksbD0hMCksWWYoYSxYZix0LGUsaSkpOnQmJihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCkpLGwmJihpLnBvbHlnb25FbmQoKSxsPSExKSxhPW89bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7aS5wb2x5Z29uU3RhcnQoKSxpLmxpbmVTdGFydCgpLGUobnVsbCxudWxsLDEsaSksaS5saW5lRW5kKCksaS5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBkKG4sZSl7dChuLGUpJiZpLnBvaW50KG4sZSl9ZnVuY3Rpb24gcCh0LG4pe2YucG9pbnQodCxuKX1mdW5jdGlvbiB2KCl7aC5wb2ludD1wLGYubGluZVN0YXJ0KCl9ZnVuY3Rpb24gZygpe2gucG9pbnQ9ZCxmLmxpbmVFbmQoKX1mdW5jdGlvbiB5KHQsbil7dS5wdXNoKFt0LG5dKSxzLnBvaW50KHQsbil9ZnVuY3Rpb24gXygpe3MubGluZVN0YXJ0KCksdT1bXX1mdW5jdGlvbiBiKCl7eSh1WzBdWzBdLHVbMF1bMV0pLHMubGluZUVuZCgpO3ZhciB0LG4sZSxyLGY9cy5jbGVhbigpLGg9Yy5yZXN1bHQoKSxkPWgubGVuZ3RoO2lmKHUucG9wKCksby5wdXNoKHUpLHU9bnVsbCxkKWlmKDEmZil7aWYoKG49KGU9aFswXSkubGVuZ3RoLTEpPjApe2ZvcihsfHwoaS5wb2x5Z29uU3RhcnQoKSxsPSEwKSxpLmxpbmVTdGFydCgpLHQ9MDt0PG47Kyt0KWkucG9pbnQoKHI9ZVt0XSlbMF0sclsxXSk7aS5saW5lRW5kKCl9fWVsc2UgZD4xJiYyJmYmJmgucHVzaChoLnBvcCgpLmNvbmNhdChoLnNoaWZ0KCkpKSxhLnB1c2goaC5maWx0ZXIoamYpKX1yZXR1cm4gaH19ZnVuY3Rpb24gamYodCl7cmV0dXJuIHQubGVuZ3RoPjF9ZnVuY3Rpb24gWGYodCxuKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tT2EtRGE6T2EtdFsxXSktKChuPW4ueClbMF08MD9uWzFdLU9hLURhOk9hLW5bMV0pfXZhciBHZj1IZihmdW5jdGlvbigpe3JldHVybiEwfSxmdW5jdGlvbih0KXt2YXIgbixlPU5hTixyPU5hTixpPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxuPTF9LHBvaW50OmZ1bmN0aW9uKG8sYSl7dmFyIHU9bz4wP3FhOi1xYSxmPUhhKG8tZSk7SGEoZi1xYSk8RGE/KHQucG9pbnQoZSxyPShyK2EpLzI+MD9PYTotT2EpLHQucG9pbnQoaSxyKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQodSxyKSx0LnBvaW50KG8sciksbj0wKTppIT09dSYmZj49cWEmJihIYShlLWkpPERhJiYoZS09aSpEYSksSGEoby11KTxEYSYmKG8tPXUqRGEpLHI9ZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhPVFhKHQtZSk7cmV0dXJuIEhhKGEpPkRhP2phKChRYShuKSoobz1HYShyKSkqUWEoZSktUWEocikqKGk9R2EobikpKlFhKHQpKS8oaSpvKmEpKToobityKS8yfShlLHIsbyxhKSx0LnBvaW50KGksciksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHUsciksbj0wKSx0LnBvaW50KGU9byxyPWEpLGk9dX0sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLGU9cj1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItbn19fSxmdW5jdGlvbih0LG4sZSxyKXt2YXIgaTtpZihudWxsPT10KWk9ZSpPYSxyLnBvaW50KC1xYSxpKSxyLnBvaW50KDAsaSksci5wb2ludChxYSxpKSxyLnBvaW50KHFhLDApLHIucG9pbnQocWEsLWkpLHIucG9pbnQoMCwtaSksci5wb2ludCgtcWEsLWkpLHIucG9pbnQoLXFhLDApLHIucG9pbnQoLXFhLGkpO2Vsc2UgaWYoSGEodFswXS1uWzBdKT5EYSl7dmFyIG89dFswXTxuWzBdP3FhOi1xYTtpPWUqby8yLHIucG9pbnQoLW8saSksci5wb2ludCgwLGkpLHIucG9pbnQobyxpKX1lbHNlIHIucG9pbnQoblswXSxuWzFdKX0sWy1xYSwtT2FdKTtmdW5jdGlvbiBWZih0KXt2YXIgbj1HYSh0KSxlPTYqSWEscj1uPjAsaT1IYShuKT5EYTtmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIEdhKHQpKkdhKGUpPm59ZnVuY3Rpb24gYSh0LGUscil7dmFyIGk9WzEsMCwwXSxvPU51KEF1KHQpLEF1KGUpKSxhPVR1KG8sbyksdT1vWzBdLGY9YS11KnU7aWYoIWYpcmV0dXJuIXImJnQ7dmFyIGM9biphL2Yscz0tbip1L2YsbD1OdShpLG8pLGg9RXUoaSxjKTtTdShoLEV1KG8scykpO3ZhciBkPWwscD1UdShoLGQpLHY9VHUoZCxkKSxnPXAqcC12KihUdShoLGgpLTEpO2lmKCEoZzwwKSl7dmFyIHk9S2EoZyksXz1FdShkLCgtcC15KS92KTtpZihTdShfLGgpLF89TXUoXyksIXIpcmV0dXJuIF87dmFyIGIsbT10WzBdLHg9ZVswXSx3PXRbMV0sTT1lWzFdO3g8bSYmKGI9bSxtPXgseD1iKTt2YXIgQT14LW0sVD1IYShBLXFhKTxEYTtpZighVCYmTTx3JiYoYj13LHc9TSxNPWIpLFR8fEE8RGE/VD93K00+MF5fWzFdPChIYShfWzBdLW0pPERhP3c6TSk6dzw9X1sxXSYmX1sxXTw9TTpBPnFhXihtPD1fWzBdJiZfWzBdPD14KSl7dmFyIE49RXUoZCwoLXAreSkvdik7cmV0dXJuIFN1KE4saCksW18sTXUoTildfX19ZnVuY3Rpb24gdShuLGUpe3ZhciBpPXI/dDpxYS10LG89MDtyZXR1cm4gbjwtaT9vfD0xOm4+aSYmKG98PTIpLGU8LWk/b3w9NDplPmkmJihvfD04KSxvfXJldHVybiBIZihvLGZ1bmN0aW9uKHQpe3ZhciBuLGUsZixjLHM7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2M9Zj0hMSxzPTF9LHBvaW50OmZ1bmN0aW9uKGwsaCl7dmFyIGQscD1bbCxoXSx2PW8obCxoKSxnPXI/dj8wOnUobCxoKTp2P3UobCsobDwwP3FhOi1xYSksaCk6MDtpZighbiYmKGM9Zj12KSYmdC5saW5lU3RhcnQoKSx2IT09ZiYmKCEoZD1hKG4scCkpfHxxZihuLGQpfHxxZihwLGQpKSYmKHBbMF0rPURhLHBbMV0rPURhLHY9byhwWzBdLHBbMV0pKSx2IT09ZilzPTAsdj8odC5saW5lU3RhcnQoKSxkPWEocCxuKSx0LnBvaW50KGRbMF0sZFsxXSkpOihkPWEobixwKSx0LnBvaW50KGRbMF0sZFsxXSksdC5saW5lRW5kKCkpLG49ZDtlbHNlIGlmKGkmJm4mJnJedil7dmFyIHk7ZyZlfHwhKHk9YShwLG4sITApKXx8KHM9MCxyPyh0LmxpbmVTdGFydCgpLHQucG9pbnQoeVswXVswXSx5WzBdWzFdKSx0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KHlbMV1bMF0seVsxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHlbMF1bMF0seVswXVsxXSkpKX0hdnx8biYmcWYobixwKXx8dC5wb2ludChwWzBdLHBbMV0pLG49cCxmPXYsZT1nfSxsaW5lRW5kOmZ1bmN0aW9uKCl7ZiYmdC5saW5lRW5kKCksbj1udWxsfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiBzfChjJiZmKTw8MX19fSxmdW5jdGlvbihuLHIsaSxvKXtMZihvLHQsZSxpLG4scil9LHI/WzAsLXRdOlstcWEsdC1xYV0pfXZhciAkZj0xZTksV2Y9LSRmO2Z1bmN0aW9uIFpmKHQsbixlLHIpe2Z1bmN0aW9uIGkoaSxvKXtyZXR1cm4gdDw9aSYmaTw9ZSYmbjw9byYmbzw9cn1mdW5jdGlvbiBvKGksbyx1LGMpe3ZhciBzPTAsbD0wO2lmKG51bGw9PWl8fChzPWEoaSx1KSkhPT0obD1hKG8sdSkpfHxmKGksbyk8MF51PjApZG97Yy5wb2ludCgwPT09c3x8Mz09PXM/dDplLHM+MT9yOm4pfXdoaWxlKChzPShzK3UrNCklNCkhPT1sKTtlbHNlIGMucG9pbnQob1swXSxvWzFdKX1mdW5jdGlvbiBhKHIsaSl7cmV0dXJuIEhhKHJbMF0tdCk8RGE/aT4wPzA6MzpIYShyWzBdLWUpPERhP2k+MD8yOjE6SGEoclsxXS1uKTxEYT9pPjA/MTowOmk+MD8zOjJ9ZnVuY3Rpb24gdSh0LG4pe3JldHVybiBmKHQueCxuLngpfWZ1bmN0aW9uIGYodCxuKXt2YXIgZT1hKHQsMSkscj1hKG4sMSk7cmV0dXJuIGUhPT1yP2UtcjowPT09ZT9uWzFdLXRbMV06MT09PWU/dFswXS1uWzBdOjI9PT1lP3RbMV0tblsxXTpuWzBdLXRbMF19cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBmLGMscyxsLGgsZCxwLHYsZyx5LF8sYj1hLG09VWYoKSx4PXtwb2ludDp3LGxpbmVTdGFydDpmdW5jdGlvbigpe3gucG9pbnQ9TSxjJiZjLnB1c2gocz1bXSk7eT0hMCxnPSExLHA9dj1OYU59LGxpbmVFbmQ6ZnVuY3Rpb24oKXtmJiYoTShsLGgpLGQmJmcmJm0ucmVqb2luKCksZi5wdXNoKG0ucmVzdWx0KCkpKTt4LnBvaW50PXcsZyYmYi5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2I9bSxmPVtdLGM9W10sXz0hMH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciBuPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsZT0wLGk9Yy5sZW5ndGg7ZTxpOysrZSlmb3IodmFyIG8sYSx1PWNbZV0sZj0xLHM9dS5sZW5ndGgsbD11WzBdLGg9bFswXSxkPWxbMV07ZjxzOysrZilvPWgsYT1kLGw9dVtmXSxoPWxbMF0sZD1sWzFdLGE8PXI/ZD5yJiYoaC1vKSooci1hKT4oZC1hKSoodC1vKSYmKytuOmQ8PXImJihoLW8pKihyLWEpPChkLWEpKih0LW8pJiYtLW47cmV0dXJuIG59KCksZT1fJiZuLGk9KGY9TihmKSkubGVuZ3RoOyhlfHxpKSYmKGEucG9seWdvblN0YXJ0KCksZSYmKGEubGluZVN0YXJ0KCksbyhudWxsLG51bGwsMSxhKSxhLmxpbmVFbmQoKSksaSYmWWYoZix1LG4sbyxhKSxhLnBvbHlnb25FbmQoKSk7Yj1hLGY9Yz1zPW51bGx9fTtmdW5jdGlvbiB3KHQsbil7aSh0LG4pJiZiLnBvaW50KHQsbil9ZnVuY3Rpb24gTShvLGEpe3ZhciB1PWkobyxhKTtpZihjJiZzLnB1c2goW28sYV0pLHkpbD1vLGg9YSxkPXUseT0hMSx1JiYoYi5saW5lU3RhcnQoKSxiLnBvaW50KG8sYSkpO2Vsc2UgaWYodSYmZyliLnBvaW50KG8sYSk7ZWxzZXt2YXIgZj1bcD1NYXRoLm1heChXZixNYXRoLm1pbigkZixwKSksdj1NYXRoLm1heChXZixNYXRoLm1pbigkZix2KSldLG09W289TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsbykpLGE9TWF0aC5tYXgoV2YsTWF0aC5taW4oJGYsYSkpXTshZnVuY3Rpb24odCxuLGUscixpLG8pe3ZhciBhLHU9dFswXSxmPXRbMV0sYz0wLHM9MSxsPW5bMF0tdSxoPW5bMV0tZjtpZihhPWUtdSxsfHwhKGE+MCkpe2lmKGEvPWwsbDwwKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9ZWxzZSBpZihsPjApe2lmKGE+cylyZXR1cm47YT5jJiYoYz1hKX1pZihhPWktdSxsfHwhKGE8MCkpe2lmKGEvPWwsbDwwKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihsPjApe2lmKGE8YylyZXR1cm47YTxzJiYocz1hKX1pZihhPXItZixofHwhKGE+MCkpe2lmKGEvPWgsaDwwKXtpZihhPGMpcmV0dXJuO2E8cyYmKHM9YSl9ZWxzZSBpZihoPjApe2lmKGE+cylyZXR1cm47YT5jJiYoYz1hKX1pZihhPW8tZixofHwhKGE8MCkpe2lmKGEvPWgsaDwwKXtpZihhPnMpcmV0dXJuO2E+YyYmKGM9YSl9ZWxzZSBpZihoPjApe2lmKGE8YylyZXR1cm47YTxzJiYocz1hKX1yZXR1cm4gYz4wJiYodFswXT11K2MqbCx0WzFdPWYrYypoKSxzPDEmJihuWzBdPXUrcypsLG5bMV09ZitzKmgpLCEwfX19fX0oZixtLHQsbixlLHIpP3UmJihiLmxpbmVTdGFydCgpLGIucG9pbnQobyxhKSxfPSExKTooZ3x8KGIubGluZVN0YXJ0KCksYi5wb2ludChmWzBdLGZbMV0pKSxiLnBvaW50KG1bMF0sbVsxXSksdXx8Yi5saW5lRW5kKCksXz0hMSl9cD1vLHY9YSxnPXV9cmV0dXJuIHh9fXZhciBRZixKZixLZix0Yz1QYSgpLG5jPXtzcGhlcmU6aXUscG9pbnQ6aXUsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7bmMucG9pbnQ9cmMsbmMubGluZUVuZD1lY30sbGluZUVuZDppdSxwb2x5Z29uU3RhcnQ6aXUscG9seWdvbkVuZDppdX07ZnVuY3Rpb24gZWMoKXtuYy5wb2ludD1uYy5saW5lRW5kPWl1fWZ1bmN0aW9uIHJjKHQsbil7UWY9dCo9SWEsSmY9UWEobio9SWEpLEtmPUdhKG4pLG5jLnBvaW50PWljfWZ1bmN0aW9uIGljKHQsbil7dCo9SWE7dmFyIGU9UWEobio9SWEpLHI9R2EobiksaT1IYSh0LVFmKSxvPUdhKGkpLGE9cipRYShpKSx1PUtmKmUtSmYqcipvLGY9SmYqZStLZipyKm87dGMuYWRkKFhhKEthKGEqYSt1KnUpLGYpKSxRZj10LEpmPWUsS2Y9cn1mdW5jdGlvbiBvYyh0KXtyZXR1cm4gdGMucmVzZXQoKSxzdSh0LG5jKSwrdGN9dmFyIGFjPVtudWxsLG51bGxdLHVjPXt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczphY307ZnVuY3Rpb24gZmModCxuKXtyZXR1cm4gYWNbMF09dCxhY1sxXT1uLG9jKHVjKX12YXIgY2M9e0ZlYXR1cmU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gbGModC5nZW9tZXRyeSxuKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5mZWF0dXJlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGxjKGVbcl0uZ2VvbWV0cnksbikpcmV0dXJuITA7cmV0dXJuITF9fSxzYz17U3BoZXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBvaW50OmZ1bmN0aW9uKHQsbil7cmV0dXJuIGhjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9dC5jb29yZGluYXRlcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGhjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxuKXtyZXR1cm4gZGModC5jb29yZGluYXRlcyxuKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuY29vcmRpbmF0ZXMscj0tMSxpPWUubGVuZ3RoOysrcjxpOylpZihkYyhlW3JdLG4pKXJldHVybiEwO3JldHVybiExfSxQb2x5Z29uOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHBjKHQuY29vcmRpbmF0ZXMsbil9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LG4pe2Zvcih2YXIgZT10LmNvb3JkaW5hdGVzLHI9LTEsaT1lLmxlbmd0aDsrK3I8aTspaWYocGMoZVtyXSxuKSlyZXR1cm4hMDtyZXR1cm4hMX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPXQuZ2VvbWV0cmllcyxyPS0xLGk9ZS5sZW5ndGg7KytyPGk7KWlmKGxjKGVbcl0sbikpcmV0dXJuITA7cmV0dXJuITF9fTtmdW5jdGlvbiBsYyh0LG4pe3JldHVybiEoIXR8fCFzYy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpKSYmc2NbdC50eXBlXSh0LG4pfWZ1bmN0aW9uIGhjKHQsbil7cmV0dXJuIDA9PT1mYyh0LG4pfWZ1bmN0aW9uIGRjKHQsbil7dmFyIGU9ZmModFswXSx0WzFdKTtyZXR1cm4gZmModFswXSxuKStmYyhuLHRbMV0pPD1lK0RhfWZ1bmN0aW9uIHBjKHQsbil7cmV0dXJuISFJZih0Lm1hcCh2YyksZ2MobikpfWZ1bmN0aW9uIHZjKHQpe3JldHVybih0PXQubWFwKGdjKSkucG9wKCksdH1mdW5jdGlvbiBnYyh0KXtyZXR1cm5bdFswXSpJYSx0WzFdKklhXX1mdW5jdGlvbiB5Yyh0LG4sZSl7dmFyIHI9Zyh0LG4tRGEsZSkuY29uY2F0KG4pO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gci5tYXAoZnVuY3Rpb24obil7cmV0dXJuW3Qsbl19KX19ZnVuY3Rpb24gX2ModCxuLGUpe3ZhciByPWcodCxuLURhLGUpLmNvbmNhdChuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHIubWFwKGZ1bmN0aW9uKG4pe3JldHVybltuLHRdfSl9fWZ1bmN0aW9uIGJjKCl7dmFyIHQsbixlLHIsaSxvLGEsdSxmLGMscyxsLGg9MTAsZD1oLHA9OTAsdj0zNjAseT0yLjU7ZnVuY3Rpb24gXygpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOmIoKX19ZnVuY3Rpb24gYigpe3JldHVybiBnKFZhKHIvcCkqcCxlLHApLm1hcChzKS5jb25jYXQoZyhWYSh1L3YpKnYsYSx2KS5tYXAobCkpLmNvbmNhdChnKFZhKG4vaCkqaCx0LGgpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gSGEodCVwKT5EYX0pLm1hcChmKSkuY29uY2F0KGcoVmEoby9kKSpkLGksZCkuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBIYSh0JXYpPkRhfSkubWFwKGMpKX1yZXR1cm4gXy5saW5lcz1mdW5jdGlvbigpe3JldHVybiBiKCkubWFwKGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fX0pfSxfLm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3MocikuY29uY2F0KGwoYSkuc2xpY2UoMSkscyhlKS5yZXZlcnNlKCkuc2xpY2UoMSksbCh1KS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LF8uZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uZXh0ZW50TWFqb3IodCkuZXh0ZW50TWlub3IodCk6Xy5leHRlbnRNaW5vcigpfSxfLmV4dGVudE1ham9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0WzBdWzBdLGU9K3RbMV1bMF0sdT0rdFswXVsxXSxhPSt0WzFdWzFdLHI+ZSYmKHQ9cixyPWUsZT10KSx1PmEmJih0PXUsdT1hLGE9dCksXy5wcmVjaXNpb24oeSkpOltbcix1XSxbZSxhXV19LF8uZXh0ZW50TWlub3I9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K2VbMF1bMF0sdD0rZVsxXVswXSxvPStlWzBdWzFdLGk9K2VbMV1bMV0sbj50JiYoZT1uLG49dCx0PWUpLG8+aSYmKGU9byxvPWksaT1lKSxfLnByZWNpc2lvbih5KSk6W1tuLG9dLFt0LGldXX0sXy5zdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uc3RlcE1ham9yKHQpLnN0ZXBNaW5vcih0KTpfLnN0ZXBNaW5vcigpfSxfLnN0ZXBNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD0rdFswXSx2PSt0WzFdLF8pOltwLHZdfSxfLnN0ZXBNaW5vcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdFswXSxkPSt0WzFdLF8pOltoLGRdfSxfLnByZWNpc2lvbj1mdW5jdGlvbihoKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeT0raCxmPXljKG8saSw5MCksYz1fYyhuLHQseSkscz15Yyh1LGEsOTApLGw9X2MocixlLHkpLF8pOnl9LF8uZXh0ZW50TWFqb3IoW1stMTgwLC05MCtEYV0sWzE4MCw5MC1EYV1dKS5leHRlbnRNaW5vcihbWy0xODAsLTgwLURhXSxbMTgwLDgwK0RhXV0pfWZ1bmN0aW9uIG1jKHQpe3JldHVybiB0fXZhciB4Yyx3YyxNYyxBYyxUYz1QYSgpLE5jPVBhKCksU2M9e3BvaW50Oml1LGxpbmVTdGFydDppdSxsaW5lRW5kOml1LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe1NjLmxpbmVTdGFydD1FYyxTYy5saW5lRW5kPVBjfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7U2MubGluZVN0YXJ0PVNjLmxpbmVFbmQ9U2MucG9pbnQ9aXUsVGMuYWRkKEhhKE5jKSksTmMucmVzZXQoKX0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9VGMvMjtyZXR1cm4gVGMucmVzZXQoKSx0fX07ZnVuY3Rpb24gRWMoKXtTYy5wb2ludD1rY31mdW5jdGlvbiBrYyh0LG4pe1NjLnBvaW50PUNjLHhjPU1jPXQsd2M9QWM9bn1mdW5jdGlvbiBDYyh0LG4pe05jLmFkZChBYyp0LU1jKm4pLE1jPXQsQWM9bn1mdW5jdGlvbiBQYygpe0NjKHhjLHdjKX12YXIgemM9MS8wLFJjPXpjLExjPS16YyxEYz1MYyxVYz17cG9pbnQ6ZnVuY3Rpb24odCxuKXt0PHpjJiYoemM9dCk7dD5MYyYmKExjPXQpO248UmMmJihSYz1uKTtuPkRjJiYoRGM9bil9LGxpbmVTdGFydDppdSxsaW5lRW5kOml1LHBvbHlnb25TdGFydDppdSxwb2x5Z29uRW5kOml1LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PVtbemMsUmNdLFtMYyxEY11dO3JldHVybiBMYz1EYz0tKFJjPXpjPTEvMCksdH19O3ZhciBxYyxPYyxZYyxCYyxGYz0wLEljPTAsSGM9MCxqYz0wLFhjPTAsR2M9MCxWYz0wLCRjPTAsV2M9MCxaYz17cG9pbnQ6UWMsbGluZVN0YXJ0OkpjLGxpbmVFbmQ6bnMscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7WmMubGluZVN0YXJ0PWVzLFpjLmxpbmVFbmQ9cnN9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtaYy5wb2ludD1RYyxaYy5saW5lU3RhcnQ9SmMsWmMubGluZUVuZD1uc30scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9V2M/W1ZjL1djLCRjL1djXTpHYz9bamMvR2MsWGMvR2NdOkhjP1tGYy9IYyxJYy9IY106W05hTixOYU5dO3JldHVybiBGYz1JYz1IYz1qYz1YYz1HYz1WYz0kYz1XYz0wLHR9fTtmdW5jdGlvbiBRYyh0LG4pe0ZjKz10LEljKz1uLCsrSGN9ZnVuY3Rpb24gSmMoKXtaYy5wb2ludD1LY31mdW5jdGlvbiBLYyh0LG4pe1pjLnBvaW50PXRzLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gdHModCxuKXt2YXIgZT10LVljLHI9bi1CYyxpPUthKGUqZStyKnIpO2pjKz1pKihZYyt0KS8yLFhjKz1pKihCYytuKS8yLEdjKz1pLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gbnMoKXtaYy5wb2ludD1RY31mdW5jdGlvbiBlcygpe1pjLnBvaW50PWlzfWZ1bmN0aW9uIHJzKCl7b3MocWMsT2MpfWZ1bmN0aW9uIGlzKHQsbil7WmMucG9pbnQ9b3MsUWMocWM9WWM9dCxPYz1CYz1uKX1mdW5jdGlvbiBvcyh0LG4pe3ZhciBlPXQtWWMscj1uLUJjLGk9S2EoZSplK3Iqcik7amMrPWkqKFljK3QpLzIsWGMrPWkqKEJjK24pLzIsR2MrPWksVmMrPShpPUJjKnQtWWMqbikqKFljK3QpLCRjKz1pKihCYytuKSxXYys9MyppLFFjKFljPXQsQmM9bil9ZnVuY3Rpb24gYXModCl7dGhpcy5fY29udGV4dD10fWFzLnByb3RvdHlwZT17X3JhZGl1czo0LjUscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JhZGl1cz10LHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbiksdGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTticmVhaztkZWZhdWx0OnRoaXMuX2NvbnRleHQubW92ZVRvKHQrdGhpcy5fcmFkaXVzLG4pLHRoaXMuX2NvbnRleHQuYXJjKHQsbix0aGlzLl9yYWRpdXMsMCxCYSl9fSxyZXN1bHQ6aXV9O3ZhciB1cyxmcyxjcyxzcyxscyxocz1QYSgpLGRzPXtwb2ludDppdSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtkcy5wb2ludD1wc30sbGluZUVuZDpmdW5jdGlvbigpe3VzJiZ2cyhmcyxjcyksZHMucG9pbnQ9aXV9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3VzPSEwfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dXM9bnVsbH0scmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9K2hzO3JldHVybiBocy5yZXNldCgpLHR9fTtmdW5jdGlvbiBwcyh0LG4pe2RzLnBvaW50PXZzLGZzPXNzPXQsY3M9bHM9bn1mdW5jdGlvbiB2cyh0LG4pe3NzLT10LGxzLT1uLGhzLmFkZChLYShzcypzcytscypscykpLHNzPXQsbHM9bn1mdW5jdGlvbiBncygpe3RoaXMuX3N0cmluZz1bXX1mdW5jdGlvbiB5cyh0KXtyZXR1cm4ibTAsIit0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKy0yKnQrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrMip0KyJ6In1mdW5jdGlvbiBfcyh0KXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9bmV3IGJzO2Zvcih2YXIgciBpbiB0KWVbcl09dFtyXTtyZXR1cm4gZS5zdHJlYW09bixlfX1mdW5jdGlvbiBicygpe31mdW5jdGlvbiBtcyh0LG4sZSl7dmFyIHI9dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTtyZXR1cm4gdC5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbnVsbCE9ciYmdC5jbGlwRXh0ZW50KG51bGwpLHN1KGUsdC5zdHJlYW0oVWMpKSxuKFVjLnJlc3VsdCgpKSxudWxsIT1yJiZ0LmNsaXBFeHRlbnQociksdH1mdW5jdGlvbiB4cyh0LG4sZSl7cmV0dXJuIG1zKHQsZnVuY3Rpb24oZSl7dmFyIHI9blsxXVswXS1uWzBdWzBdLGk9blsxXVsxXS1uWzBdWzFdLG89TWF0aC5taW4oci8oZVsxXVswXS1lWzBdWzBdKSxpLyhlWzFdWzFdLWVbMF1bMV0pKSxhPStuWzBdWzBdKyhyLW8qKGVbMV1bMF0rZVswXVswXSkpLzIsdT0rblswXVsxXSsoaS1vKihlWzFdWzFdK2VbMF1bMV0pKS8yO3Quc2NhbGUoMTUwKm8pLnRyYW5zbGF0ZShbYSx1XSl9LGUpfWZ1bmN0aW9uIHdzKHQsbixlKXtyZXR1cm4geHModCxbWzAsMF0sbl0sZSl9ZnVuY3Rpb24gTXModCxuLGUpe3JldHVybiBtcyh0LGZ1bmN0aW9uKGUpe3ZhciByPStuLGk9ci8oZVsxXVswXS1lWzBdWzBdKSxvPShyLWkqKGVbMV1bMF0rZVswXVswXSkpLzIsYT0taSplWzBdWzFdO3Quc2NhbGUoMTUwKmkpLnRyYW5zbGF0ZShbbyxhXSl9LGUpfWZ1bmN0aW9uIEFzKHQsbixlKXtyZXR1cm4gbXModCxmdW5jdGlvbihlKXt2YXIgcj0rbixpPXIvKGVbMV1bMV0tZVswXVsxXSksbz0taSplWzBdWzBdLGE9KHItaSooZVsxXVsxXStlWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCppKS50cmFuc2xhdGUoW28sYV0pfSxlKX1ncy5wcm90b3R5cGU9e19yYWRpdXM6NC41LF9jaXJjbGU6eXMoNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4odD0rdCkhPT10aGlzLl9yYWRpdXMmJih0aGlzLl9yYWRpdXM9dCx0aGlzLl9jaXJjbGU9bnVsbCksdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fc3RyaW5nLnB1c2goIloiKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLG4pLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3N0cmluZy5wdXNoKCJMIix0LCIsIixuKTticmVhaztkZWZhdWx0Om51bGw9PXRoaXMuX2NpcmNsZSYmKHRoaXMuX2NpcmNsZT15cyh0aGlzLl9yYWRpdXMpKSx0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsbix0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH1yZXR1cm4gbnVsbH19LGJzLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YnMscG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0LG4pfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIFRzPTE2LE5zPUdhKDMwKklhKTtmdW5jdGlvbiBTcyh0LG4pe3JldHVybituP2Z1bmN0aW9uKHQsbil7ZnVuY3Rpb24gZShyLGksbyxhLHUsZixjLHMsbCxoLGQscCx2LGcpe3ZhciB5PWMtcixfPXMtaSxiPXkqeStfKl87aWYoYj40Km4mJnYtLSl7dmFyIG09YStoLHg9dStkLHc9ZitwLE09S2EobSptK3gqeCt3KncpLEE9ZXUody89TSksVD1IYShIYSh3KS0xKTxEYXx8SGEoby1sKTxEYT8obytsKS8yOlhhKHgsbSksTj10KFQsQSksUz1OWzBdLEU9TlsxXSxrPVMtcixDPUUtaSxQPV8qay15KkM7KFAqUC9iPm58fEhhKCh5KmsrXypDKS9iLS41KT4uM3x8YSpoK3UqZCtmKnA8TnMpJiYoZShyLGksbyxhLHUsZixTLEUsVCxtLz1NLHgvPU0sdyx2LGcpLGcucG9pbnQoUyxFKSxlKFMsRSxULG0seCx3LGMscyxsLGgsZCxwLHYsZykpfX1yZXR1cm4gZnVuY3Rpb24obil7dmFyIHIsaSxvLGEsdSxmLGMscyxsLGgsZCxwLHY9e3BvaW50OmcsbGluZVN0YXJ0OnksbGluZUVuZDpiLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe24ucG9seWdvblN0YXJ0KCksdi5saW5lU3RhcnQ9bX0scG9seWdvbkVuZDpmdW5jdGlvbigpe24ucG9seWdvbkVuZCgpLHYubGluZVN0YXJ0PXl9fTtmdW5jdGlvbiBnKGUscil7ZT10KGUsciksbi5wb2ludChlWzBdLGVbMV0pfWZ1bmN0aW9uIHkoKXtzPU5hTix2LnBvaW50PV8sbi5saW5lU3RhcnQoKX1mdW5jdGlvbiBfKHIsaSl7dmFyIG89QXUoW3IsaV0pLGE9dChyLGkpO2UocyxsLGMsaCxkLHAscz1hWzBdLGw9YVsxXSxjPXIsaD1vWzBdLGQ9b1sxXSxwPW9bMl0sVHMsbiksbi5wb2ludChzLGwpfWZ1bmN0aW9uIGIoKXt2LnBvaW50PWcsbi5saW5lRW5kKCl9ZnVuY3Rpb24gbSgpe3koKSx2LnBvaW50PXgsdi5saW5lRW5kPXd9ZnVuY3Rpb24geCh0LG4pe18ocj10LG4pLGk9cyxvPWwsYT1oLHU9ZCxmPXAsdi5wb2ludD1ffWZ1bmN0aW9uIHcoKXtlKHMsbCxjLGgsZCxwLGksbyxyLGEsdSxmLFRzLG4pLHYubGluZUVuZD1iLGIoKX1yZXR1cm4gdn19KHQsbik6ZnVuY3Rpb24odCl7cmV0dXJuIF9zKHtwb2ludDpmdW5jdGlvbihuLGUpe249dChuLGUpLHRoaXMuc3RyZWFtLnBvaW50KG5bMF0sblsxXSl9fSl9KHQpfXZhciBFcz1fcyh7cG9pbnQ6ZnVuY3Rpb24odCxuKXt0aGlzLnN0cmVhbS5wb2ludCh0KklhLG4qSWEpfX0pO2Z1bmN0aW9uIGtzKHQsbixlLHIpe3ZhciBpPUdhKHIpLG89UWEociksYT1pKnQsdT1vKnQsZj1pL3QsYz1vL3Qscz0obyplLWkqbikvdCxsPShvKm4raSplKS90O2Z1bmN0aW9uIGgodCxyKXtyZXR1cm5bYSp0LXUqcituLGUtdSp0LWEqcl19cmV0dXJuIGguaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW2YqdC1jKm4rcyxsLWMqdC1mKm5dfSxofWZ1bmN0aW9uIENzKHQpe3JldHVybiBQcyhmdW5jdGlvbigpe3JldHVybiB0fSkoKX1mdW5jdGlvbiBQcyh0KXt2YXIgbixlLHIsaSxvLGEsdSxmLGMscyxsPTE1MCxoPTQ4MCxkPTI1MCxwPTAsdj0wLGc9MCx5PTAsXz0wLGI9MCxtPW51bGwseD1HZix3PW51bGwsTT1tYyxBPS41O2Z1bmN0aW9uIFQodCl7cmV0dXJuIGYodFswXSpJYSx0WzFdKklhKX1mdW5jdGlvbiBOKHQpe3JldHVybih0PWYuaW52ZXJ0KHRbMF0sdFsxXSkpJiZbdFswXSpGYSx0WzFdKkZhXX1mdW5jdGlvbiBTKCl7dmFyIHQ9a3MobCwwLDAsYikuYXBwbHkobnVsbCxuKHAsdikpLHI9KGI/a3M6ZnVuY3Rpb24odCxuLGUpe2Z1bmN0aW9uIHIocixpKXtyZXR1cm5bbit0KnIsZS10KmldfXJldHVybiByLmludmVydD1mdW5jdGlvbihyLGkpe3JldHVyblsoci1uKS90LChlLWkpL3RdfSxyfSkobCxoLXRbMF0sZC10WzFdLGIpO3JldHVybiBlPWtmKGcseSxfKSx1PVNmKG4sciksZj1TZihlLHUpLGE9U3ModSxBKSxFKCl9ZnVuY3Rpb24gRSgpe3JldHVybiBjPXM9bnVsbCxUfXJldHVybiBULnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gYyYmcz09PXQ/YzpjPUVzKGZ1bmN0aW9uKHQpe3JldHVybiBfcyh7cG9pbnQ6ZnVuY3Rpb24obixlKXt2YXIgcj10KG4sZSk7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KHJbMF0sclsxXSl9fSl9KGUpKHgoYShNKHM9dCkpKSkpfSxULnByZWNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHg9dCxtPXZvaWQgMCxFKCkpOnh9LFQucG9zdGNsaXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KE09dCx3PXI9aT1vPW51bGwsRSgpKTpNfSxULmNsaXBBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD0rdD9WZihtPXQqSWEpOihtPW51bGwsR2YpLEUoKSk6bSpGYX0sVC5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhNPW51bGw9PXQ/KHc9cj1pPW89bnVsbCxtYyk6WmYodz0rdFswXVswXSxyPSt0WzBdWzFdLGk9K3RbMV1bMF0sbz0rdFsxXVsxXSksRSgpKTpudWxsPT13P251bGw6W1t3LHJdLFtpLG9dXX0sVC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0rdCxTKCkpOmx9LFQudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0WzBdLGQ9K3RbMV0sUygpKTpbaCxkXX0sVC5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9dFswXSUzNjAqSWEsdj10WzFdJTM2MCpJYSxTKCkpOltwKkZhLHYqRmFdfSxULnJvdGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz10WzBdJTM2MCpJYSx5PXRbMV0lMzYwKklhLF89dC5sZW5ndGg+Mj90WzJdJTM2MCpJYTowLFMoKSk6W2cqRmEseSpGYSxfKkZhXX0sVC5hbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj10JTM2MCpJYSxTKCkpOmIqRmF9LFQucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPVNzKHUsQT10KnQpLEUoKSk6S2EoQSl9LFQuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHhzKFQsdCxuKX0sVC5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKFQsdCxuKX0sVC5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBNcyhULHQsbil9LFQuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEFzKFQsdCxuKX0sZnVuY3Rpb24oKXtyZXR1cm4gbj10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxULmludmVydD1uLmludmVydCYmTixTKCl9fWZ1bmN0aW9uIHpzKHQpe3ZhciBuPTAsZT1xYS8zLHI9UHModCksaT1yKG4sZSk7cmV0dXJuIGkucGFyYWxsZWxzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3Iobj10WzBdKklhLGU9dFsxXSpJYSk6W24qRmEsZSpGYV19LGl9ZnVuY3Rpb24gUnModCxuKXt2YXIgZT1RYSh0KSxyPShlK1FhKG4pKS8yO2lmKEhhKHIpPERhKXJldHVybiBmdW5jdGlvbih0KXt2YXIgbj1HYSh0KTtmdW5jdGlvbiBlKHQsZSl7cmV0dXJuW3QqbixRYShlKS9uXX1yZXR1cm4gZS5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bdC9uLGV1KGUqbildfSxlfSh0KTt2YXIgaT0xK2UqKDIqci1lKSxvPUthKGkpL3I7ZnVuY3Rpb24gYSh0LG4pe3ZhciBlPUthKGktMipyKlFhKG4pKS9yO3JldHVybltlKlFhKHQqPXIpLG8tZSpHYSh0KV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7dmFyIGU9by1uO3JldHVybltYYSh0LEhhKGUpKS9yKkphKGUpLGV1KChpLSh0KnQrZSplKSpyKnIpLygyKnIpKV19LGF9ZnVuY3Rpb24gTHMoKXtyZXR1cm4genMoUnMpLnNjYWxlKDE1NS40MjQpLmNlbnRlcihbMCwzMy42NDQyXSl9ZnVuY3Rpb24gRHMoKXtyZXR1cm4gTHMoKS5wYXJhbGxlbHMoWzI5LjUsNDUuNV0pLnNjYWxlKDEwNzApLnRyYW5zbGF0ZShbNDgwLDI1MF0pLnJvdGF0ZShbOTYsMF0pLmNlbnRlcihbLS42LDM4LjddKX1mdW5jdGlvbiBVcyh0KXtyZXR1cm4gZnVuY3Rpb24obixlKXt2YXIgcj1HYShuKSxpPUdhKGUpLG89dChyKmkpO3JldHVybltvKmkqUWEobiksbypRYShlKV19fWZ1bmN0aW9uIHFzKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPUthKG4qbitlKmUpLGk9dChyKSxvPVFhKGkpLGE9R2EoaSk7cmV0dXJuW1hhKG4qbyxyKmEpLGV1KHImJmUqby9yKV19fXZhciBPcz1VcyhmdW5jdGlvbih0KXtyZXR1cm4gS2EoMi8oMSt0KSl9KTtPcy5pbnZlcnQ9cXMoZnVuY3Rpb24odCl7cmV0dXJuIDIqZXUodC8yKX0pO3ZhciBZcz1VcyhmdW5jdGlvbih0KXtyZXR1cm4odD1udSh0KSkmJnQvUWEodCl9KTtmdW5jdGlvbiBCcyh0LG4pe3JldHVyblt0LFdhKHR1KChPYStuKS8yKSldfWZ1bmN0aW9uIEZzKHQpe3ZhciBuLGUscixpPUNzKHQpLG89aS5jZW50ZXIsYT1pLnNjYWxlLHU9aS50cmFuc2xhdGUsZj1pLmNsaXBFeHRlbnQsYz1udWxsO2Z1bmN0aW9uIHMoKXt2YXIgbz1xYSphKCksdT1pKFJmKGkucm90YXRlKCkpLmludmVydChbMCwwXSkpO3JldHVybiBmKG51bGw9PWM/W1t1WzBdLW8sdVsxXS1vXSxbdVswXStvLHVbMV0rb11dOnQ9PT1Ccz9bW01hdGgubWF4KHVbMF0tbyxjKSxuXSxbTWF0aC5taW4odVswXStvLGUpLHJdXTpbW2MsTWF0aC5tYXgodVsxXS1vLG4pXSxbZSxNYXRoLm1pbih1WzFdK28scildXSl9cmV0dXJuIGkuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEodCkscygpKTphKCl9LGkudHJhbnNsYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1KHQpLHMoKSk6dSgpfSxpLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obyh0KSxzKCkpOm8oKX0saS5jbGlwRXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2M9bj1lPXI9bnVsbDooYz0rdFswXVswXSxuPSt0WzBdWzFdLGU9K3RbMV1bMF0scj0rdFsxXVsxXSkscygpKTpudWxsPT1jP251bGw6W1tjLG5dLFtlLHJdXX0scygpfWZ1bmN0aW9uIElzKHQpe3JldHVybiB0dSgoT2ErdCkvMil9ZnVuY3Rpb24gSHModCxuKXt2YXIgZT1HYSh0KSxyPXQ9PT1uP1FhKHQpOldhKGUvR2EobikpL1dhKElzKG4pL0lzKHQpKSxpPWUqWmEoSXModCkscikvcjtpZighcilyZXR1cm4gQnM7ZnVuY3Rpb24gbyh0LG4pe2k+MD9uPC1PYStEYSYmKG49LU9hK0RhKTpuPk9hLURhJiYobj1PYS1EYSk7dmFyIGU9aS9aYShJcyhuKSxyKTtyZXR1cm5bZSpRYShyKnQpLGktZSpHYShyKnQpXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW4sbz1KYShyKSpLYSh0KnQrZSplKTtyZXR1cm5bWGEodCxIYShlKSkvcipKYShlKSwyKmphKFphKGkvbywxL3IpKS1PYV19LG99ZnVuY3Rpb24ganModCxuKXtyZXR1cm5bdCxuXX1mdW5jdGlvbiBYcyh0LG4pe3ZhciBlPUdhKHQpLHI9dD09PW4/UWEodCk6KGUtR2EobikpLyhuLXQpLGk9ZS9yK3Q7aWYoSGEocik8RGEpcmV0dXJuIGpzO2Z1bmN0aW9uIG8odCxuKXt2YXIgZT1pLW4sbz1yKnQ7cmV0dXJuW2UqUWEobyksaS1lKkdhKG8pXX1yZXR1cm4gby5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZT1pLW47cmV0dXJuW1hhKHQsSGEoZSkpL3IqSmEoZSksaS1KYShyKSpLYSh0KnQrZSplKV19LG99WXMuaW52ZXJ0PXFzKGZ1bmN0aW9uKHQpe3JldHVybiB0fSksQnMuaW52ZXJ0PWZ1bmN0aW9uKHQsbil7cmV0dXJuW3QsMipqYSgkYShuKSktT2FdfSxqcy5pbnZlcnQ9anM7dmFyIEdzPTEuMzQwMjY0LFZzPS0uMDgxMTA2LCRzPTg5M2UtNixXcz0uMDAzNzk2LFpzPUthKDMpLzI7ZnVuY3Rpb24gUXModCxuKXt2YXIgZT1ldShacypRYShuKSkscj1lKmUsaT1yKnIqcjtyZXR1cm5bdCpHYShlKS8oWnMqKEdzKzMqVnMqcitpKig3KiRzKzkqV3MqcikpKSxlKihHcytWcypyK2kqKCRzK1dzKnIpKV19ZnVuY3Rpb24gSnModCxuKXt2YXIgZT1HYShuKSxyPUdhKHQpKmU7cmV0dXJuW2UqUWEodCkvcixRYShuKS9yXX1mdW5jdGlvbiBLcyh0LG4sZSxyKXtyZXR1cm4gMT09PXQmJjE9PT1uJiYwPT09ZSYmMD09PXI/bWM6X3Moe3BvaW50OmZ1bmN0aW9uKGksbyl7dGhpcy5zdHJlYW0ucG9pbnQoaSp0K2UsbypuK3IpfX0pfWZ1bmN0aW9uIHRsKHQsbil7dmFyIGU9bipuLHI9ZSplO3JldHVyblt0KiguODcwNy0uMTMxOTc5KmUrcioociooLjAwMzk3MSplLS4wMDE1MjkqciktLjAxMzc5MSkpLG4qKDEuMDA3MjI2K2UqKC4wMTUwODUrciooLjAyODg3NCplLS4wNDQ0NzUtLjAwNTkxNipyKSkpXX1mdW5jdGlvbiBubCh0LG4pe3JldHVybltHYShuKSpRYSh0KSxRYShuKV19ZnVuY3Rpb24gZWwodCxuKXt2YXIgZT1HYShuKSxyPTErR2EodCkqZTtyZXR1cm5bZSpRYSh0KS9yLFFhKG4pL3JdfWZ1bmN0aW9uIHJsKHQsbil7cmV0dXJuW1dhKHR1KChPYStuKS8yKSksLXRdfWZ1bmN0aW9uIGlsKHQsbil7cmV0dXJuIHQucGFyZW50PT09bi5wYXJlbnQ/MToyfWZ1bmN0aW9uIG9sKHQsbil7cmV0dXJuIHQrbi54fWZ1bmN0aW9uIGFsKHQsbil7cmV0dXJuIE1hdGgubWF4KHQsbi55KX1mdW5jdGlvbiB1bCh0KXt2YXIgbj0wLGU9dC5jaGlsZHJlbixyPWUmJmUubGVuZ3RoO2lmKHIpZm9yKDstLXI+PTA7KW4rPWVbcl0udmFsdWU7ZWxzZSBuPTE7dC52YWx1ZT1ufWZ1bmN0aW9uIGZsKHQsbil7dmFyIGUscixpLG8sYSx1PW5ldyBobCh0KSxmPSt0LnZhbHVlJiYodS52YWx1ZT10LnZhbHVlKSxjPVt1XTtmb3IobnVsbD09biYmKG49Y2wpO2U9Yy5wb3AoKTspaWYoZiYmKGUudmFsdWU9K2UuZGF0YS52YWx1ZSksKGk9bihlLmRhdGEpKSYmKGE9aS5sZW5ndGgpKWZvcihlLmNoaWxkcmVuPW5ldyBBcnJheShhKSxvPWEtMTtvPj0wOy0tbyljLnB1c2gocj1lLmNoaWxkcmVuW29dPW5ldyBobChpW29dKSksci5wYXJlbnQ9ZSxyLmRlcHRoPWUuZGVwdGgrMTtyZXR1cm4gdS5lYWNoQmVmb3JlKGxsKX1mdW5jdGlvbiBjbCh0KXtyZXR1cm4gdC5jaGlsZHJlbn1mdW5jdGlvbiBzbCh0KXt0LmRhdGE9dC5kYXRhLmRhdGF9ZnVuY3Rpb24gbGwodCl7dmFyIG49MDtkb3t0LmhlaWdodD1ufXdoaWxlKCh0PXQucGFyZW50KSYmdC5oZWlnaHQ8KytuKX1mdW5jdGlvbiBobCh0KXt0aGlzLmRhdGE9dCx0aGlzLmRlcHRoPXRoaXMuaGVpZ2h0PTAsdGhpcy5wYXJlbnQ9bnVsbH1Rcy5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGUscj1uLGk9cipyLG89aSppKmksYT0wO2E8MTImJihvPShpPShyLT1lPShyKihHcytWcyppK28qKCRzK1dzKmkpKS1uKS8oR3MrMypWcyppK28qKDcqJHMrOSpXcyppKSkpKnIpKmkqaSwhKEhhKGUpPFVhKSk7KythKTtyZXR1cm5bWnMqdCooR3MrMypWcyppK28qKDcqJHMrOSpXcyppKSkvR2EociksZXUoUWEocikvWnMpXX0sSnMuaW52ZXJ0PXFzKGphKSx0bC5pbnZlcnQ9ZnVuY3Rpb24odCxuKXt2YXIgZSxyPW4saT0yNTtkb3t2YXIgbz1yKnIsYT1vKm87ci09ZT0ociooMS4wMDcyMjYrbyooLjAxNTA4NSthKiguMDI4ODc0Km8tLjA0NDQ3NS0uMDA1OTE2KmEpKSktbikvKDEuMDA3MjI2K28qKC4wNDUyNTUrYSooLjI1OTg2NipvLS4zMTEzMjUtLjAwNTkxNioxMSphKSkpfXdoaWxlKEhhKGUpPkRhJiYtLWk+MCk7cmV0dXJuW3QvKC44NzA3KyhvPXIqcikqKG8qKG8qbypvKiguMDAzOTcxLS4wMDE1MjkqbyktLjAxMzc5MSktLjEzMTk3OSkpLHJdfSxubC5pbnZlcnQ9cXMoZXUpLGVsLmludmVydD1xcyhmdW5jdGlvbih0KXtyZXR1cm4gMipqYSh0KX0pLHJsLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblstbiwyKmphKCRhKHQpKS1PYV19LGhsLnByb3RvdHlwZT1mbC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmhsLGNvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKHVsKX0sZWFjaDpmdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvPXRoaXMsYT1bb107ZG97Zm9yKG49YS5yZXZlcnNlKCksYT1bXTtvPW4ucG9wKCk7KWlmKHQobyksZT1vLmNoaWxkcmVuKWZvcihyPTAsaT1lLmxlbmd0aDtyPGk7KytyKWEucHVzaChlW3JdKX13aGlsZShhLmxlbmd0aCk7cmV0dXJuIHRoaXN9LGVhY2hBZnRlcjpmdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyLGk9dGhpcyxvPVtpXSxhPVtdO2k9by5wb3AoKTspaWYoYS5wdXNoKGkpLG49aS5jaGlsZHJlbilmb3IoZT0wLHI9bi5sZW5ndGg7ZTxyOysrZSlvLnB1c2gobltlXSk7Zm9yKDtpPWEucG9wKCk7KXQoaSk7cmV0dXJuIHRoaXN9LGVhY2hCZWZvcmU6ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGUscj10aGlzLGk9W3JdO3I9aS5wb3AoKTspaWYodChyKSxuPXIuY2hpbGRyZW4pZm9yKGU9bi5sZW5ndGgtMTtlPj0wOy0tZSlpLnB1c2gobltlXSk7cmV0dXJuIHRoaXN9LHN1bTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obil7Zm9yKHZhciBlPSt0KG4uZGF0YSl8fDAscj1uLmNoaWxkcmVuLGk9ciYmci5sZW5ndGg7LS1pPj0wOyllKz1yW2ldLnZhbHVlO24udmFsdWU9ZX0pfSxzb3J0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbiYmbi5jaGlsZHJlbi5zb3J0KHQpfSl9LHBhdGg6ZnVuY3Rpb24odCl7Zm9yKHZhciBuPXRoaXMsZT1mdW5jdGlvbih0LG4pe2lmKHQ9PT1uKXJldHVybiB0O3ZhciBlPXQuYW5jZXN0b3JzKCkscj1uLmFuY2VzdG9ycygpLGk9bnVsbDtmb3IodD1lLnBvcCgpLG49ci5wb3AoKTt0PT09bjspaT10LHQ9ZS5wb3AoKSxuPXIucG9wKCk7cmV0dXJuIGl9KG4sdCkscj1bbl07biE9PWU7KW49bi5wYXJlbnQsci5wdXNoKG4pO2Zvcih2YXIgaT1yLmxlbmd0aDt0IT09ZTspci5zcGxpY2UoaSwwLHQpLHQ9dC5wYXJlbnQ7cmV0dXJuIHJ9LGFuY2VzdG9yczpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLG49W3RdO3Q9dC5wYXJlbnQ7KW4ucHVzaCh0KTtyZXR1cm4gbn0sZGVzY2VuZGFudHM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe3QucHVzaChuKX0pLHR9LGxlYXZlczpmdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obil7bi5jaGlsZHJlbnx8dC5wdXNoKG4pfSksdH0sbGlua3M6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLG49W107cmV0dXJuIHQuZWFjaChmdW5jdGlvbihlKXtlIT09dCYmbi5wdXNoKHtzb3VyY2U6ZS5wYXJlbnQsdGFyZ2V0OmV9KX0pLG59LGNvcHk6ZnVuY3Rpb24oKXtyZXR1cm4gZmwodGhpcykuZWFjaEJlZm9yZShzbCl9fTt2YXIgZGw9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIHBsKHQpe2Zvcih2YXIgbixlLHI9MCxpPSh0PWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHI9dC5sZW5ndGg7cjspZT1NYXRoLnJhbmRvbSgpKnItLXwwLG49dFtyXSx0W3JdPXRbZV0sdFtlXT1uO3JldHVybiB0fShkbC5jYWxsKHQpKSkubGVuZ3RoLG89W107cjxpOyluPXRbcl0sZSYmeWwoZSxuKT8rK3I6KGU9Ymwobz12bChvLG4pKSxyPTApO3JldHVybiBlfWZ1bmN0aW9uIHZsKHQsbil7dmFyIGUscjtpZihfbChuLHQpKXJldHVybltuXTtmb3IoZT0wO2U8dC5sZW5ndGg7KytlKWlmKGdsKG4sdFtlXSkmJl9sKG1sKHRbZV0sbiksdCkpcmV0dXJuW3RbZV0sbl07Zm9yKGU9MDtlPHQubGVuZ3RoLTE7KytlKWZvcihyPWUrMTtyPHQubGVuZ3RoOysrcilpZihnbChtbCh0W2VdLHRbcl0pLG4pJiZnbChtbCh0W2VdLG4pLHRbcl0pJiZnbChtbCh0W3JdLG4pLHRbZV0pJiZfbCh4bCh0W2VdLHRbcl0sbiksdCkpcmV0dXJuW3RbZV0sdFtyXSxuXTt0aHJvdyBuZXcgRXJyb3J9ZnVuY3Rpb24gZ2wodCxuKXt2YXIgZT10LnItbi5yLHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU8MHx8ZSplPHIqcitpKml9ZnVuY3Rpb24geWwodCxuKXt2YXIgZT10LnItbi5yKzFlLTYscj1uLngtdC54LGk9bi55LXQueTtyZXR1cm4gZT4wJiZlKmU+cipyK2kqaX1mdW5jdGlvbiBfbCh0LG4pe2Zvcih2YXIgZT0wO2U8bi5sZW5ndGg7KytlKWlmKCF5bCh0LG5bZV0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGJsKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnJldHVybnt4OihuPXRbMF0pLngseTpuLnkscjpuLnJ9O2Nhc2UgMjpyZXR1cm4gbWwodFswXSx0WzFdKTtjYXNlIDM6cmV0dXJuIHhsKHRbMF0sdFsxXSx0WzJdKX12YXIgbn1mdW5jdGlvbiBtbCh0LG4pe3ZhciBlPXQueCxyPXQueSxpPXQucixvPW4ueCxhPW4ueSx1PW4ucixmPW8tZSxjPWEtcixzPXUtaSxsPU1hdGguc3FydChmKmYrYypjKTtyZXR1cm57eDooZStvK2YvbCpzKS8yLHk6KHIrYStjL2wqcykvMixyOihsK2krdSkvMn19ZnVuY3Rpb24geGwodCxuLGUpe3ZhciByPXQueCxpPXQueSxvPXQucixhPW4ueCx1PW4ueSxmPW4ucixjPWUueCxzPWUueSxsPWUucixoPXItYSxkPXItYyxwPWktdSx2PWktcyxnPWYtbyx5PWwtbyxfPXIqcitpKmktbypvLGI9Xy1hKmEtdSp1K2YqZixtPV8tYypjLXMqcytsKmwseD1kKnAtaCp2LHc9KHAqbS12KmIpLygyKngpLXIsTT0odipnLXAqeSkveCxBPShkKmItaCptKS8oMip4KS1pLFQ9KGgqeS1kKmcpL3gsTj1NKk0rVCpULTEsUz0yKihvK3cqTStBKlQpLEU9dyp3K0EqQS1vKm8saz0tKE4/KFMrTWF0aC5zcXJ0KFMqUy00Kk4qRSkpLygyKk4pOkUvUyk7cmV0dXJue3g6cit3K00qayx5OmkrQStUKmsscjprfX1mdW5jdGlvbiB3bCh0LG4sZSl7dmFyIHIsaSxvLGEsdT10Lngtbi54LGY9dC55LW4ueSxjPXUqdStmKmY7Yz8oaT1uLnIrZS5yLGkqPWksYT10LnIrZS5yLGk+KGEqPWEpPyhyPShjK2EtaSkvKDIqYyksbz1NYXRoLnNxcnQoTWF0aC5tYXgoMCxhL2MtcipyKSksZS54PXQueC1yKnUtbypmLGUueT10LnktcipmK28qdSk6KHI9KGMraS1hKS8oMipjKSxvPU1hdGguc3FydChNYXRoLm1heCgwLGkvYy1yKnIpKSxlLng9bi54K3IqdS1vKmYsZS55PW4ueStyKmYrbyp1KSk6KGUueD1uLngrZS5yLGUueT1uLnkpfWZ1bmN0aW9uIE1sKHQsbil7dmFyIGU9dC5yK24uci0xZS02LHI9bi54LXQueCxpPW4ueS10Lnk7cmV0dXJuIGU+MCYmZSplPnIqcitpKml9ZnVuY3Rpb24gQWwodCl7dmFyIG49dC5fLGU9dC5uZXh0Ll8scj1uLnIrZS5yLGk9KG4ueCplLnIrZS54Km4ucikvcixvPShuLnkqZS5yK2UueSpuLnIpL3I7cmV0dXJuIGkqaStvKm99ZnVuY3Rpb24gVGwodCl7dGhpcy5fPXQsdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2aW91cz1udWxsfWZ1bmN0aW9uIE5sKHQpe2lmKCEoaT10Lmxlbmd0aCkpcmV0dXJuIDA7dmFyIG4sZSxyLGksbyxhLHUsZixjLHMsbDtpZigobj10WzBdKS54PTAsbi55PTAsIShpPjEpKXJldHVybiBuLnI7aWYoZT10WzFdLG4ueD0tZS5yLGUueD1uLnIsZS55PTAsIShpPjIpKXJldHVybiBuLnIrZS5yO3dsKGUsbixyPXRbMl0pLG49bmV3IFRsKG4pLGU9bmV3IFRsKGUpLHI9bmV3IFRsKHIpLG4ubmV4dD1yLnByZXZpb3VzPWUsZS5uZXh0PW4ucHJldmlvdXM9cixyLm5leHQ9ZS5wcmV2aW91cz1uO3Q6Zm9yKHU9Mzt1PGk7Kyt1KXt3bChuLl8sZS5fLHI9dFt1XSkscj1uZXcgVGwociksZj1lLm5leHQsYz1uLnByZXZpb3VzLHM9ZS5fLnIsbD1uLl8ucjtkb3tpZihzPD1sKXtpZihNbChmLl8sci5fKSl7ZT1mLG4ubmV4dD1lLGUucHJldmlvdXM9biwtLXU7Y29udGludWUgdH1zKz1mLl8ucixmPWYubmV4dH1lbHNle2lmKE1sKGMuXyxyLl8pKXsobj1jKS5uZXh0PWUsZS5wcmV2aW91cz1uLC0tdTtjb250aW51ZSB0fWwrPWMuXy5yLGM9Yy5wcmV2aW91c319d2hpbGUoZiE9PWMubmV4dCk7Zm9yKHIucHJldmlvdXM9bixyLm5leHQ9ZSxuLm5leHQ9ZS5wcmV2aW91cz1lPXIsbz1BbChuKTsocj1yLm5leHQpIT09ZTspKGE9QWwocikpPG8mJihuPXIsbz1hKTtlPW4ubmV4dH1mb3Iobj1bZS5fXSxyPWU7KHI9ci5uZXh0KSE9PWU7KW4ucHVzaChyLl8pO2ZvcihyPXBsKG4pLHU9MDt1PGk7Kyt1KShuPXRbdV0pLngtPXIueCxuLnktPXIueTtyZXR1cm4gci5yfWZ1bmN0aW9uIFNsKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdH1mdW5jdGlvbiBFbCgpe3JldHVybiAwfWZ1bmN0aW9uIGtsKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBDbCh0KXtyZXR1cm4gTWF0aC5zcXJ0KHQudmFsdWUpfWZ1bmN0aW9uIFBsKHQpe3JldHVybiBmdW5jdGlvbihuKXtuLmNoaWxkcmVufHwobi5yPU1hdGgubWF4KDAsK3Qobil8fDApKX19ZnVuY3Rpb24gemwodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7aWYocj1lLmNoaWxkcmVuKXt2YXIgcixpLG8sYT1yLmxlbmd0aCx1PXQoZSkqbnx8MDtpZih1KWZvcihpPTA7aTxhOysraSlyW2ldLnIrPXU7aWYobz1ObChyKSx1KWZvcihpPTA7aTxhOysraSlyW2ldLnItPXU7ZS5yPW8rdX19fWZ1bmN0aW9uIFJsKHQpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgZT1uLnBhcmVudDtuLnIqPXQsZSYmKG4ueD1lLngrdCpuLngsbi55PWUueSt0Km4ueSl9fWZ1bmN0aW9uIExsKHQpe3QueDA9TWF0aC5yb3VuZCh0LngwKSx0LnkwPU1hdGgucm91bmQodC55MCksdC54MT1NYXRoLnJvdW5kKHQueDEpLHQueTE9TWF0aC5yb3VuZCh0LnkxKX1mdW5jdGlvbiBEbCh0LG4sZSxyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4sdT0tMSxmPWEubGVuZ3RoLGM9dC52YWx1ZSYmKHItbikvdC52YWx1ZTsrK3U8ZjspKG89YVt1XSkueTA9ZSxvLnkxPWksby54MD1uLG8ueDE9bis9by52YWx1ZSpjfXZhciBVbD0iJCIscWw9e2RlcHRoOi0xfSxPbD17fTtmdW5jdGlvbiBZbCh0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBCbCh0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiBGbCh0LG4pe3JldHVybiB0LnBhcmVudD09PW4ucGFyZW50PzE6Mn1mdW5jdGlvbiBJbCh0KXt2YXIgbj10LmNoaWxkcmVuO3JldHVybiBuP25bMF06dC50fWZ1bmN0aW9uIEhsKHQpe3ZhciBuPXQuY2hpbGRyZW47cmV0dXJuIG4/bltuLmxlbmd0aC0xXTp0LnR9ZnVuY3Rpb24gamwodCxuLGUpe3ZhciByPWUvKG4uaS10LmkpO24uYy09cixuLnMrPWUsdC5jKz1yLG4ueis9ZSxuLm0rPWV9ZnVuY3Rpb24gWGwodCxuLGUpe3JldHVybiB0LmEucGFyZW50PT09bi5wYXJlbnQ/dC5hOmV9ZnVuY3Rpb24gR2wodCxuKXt0aGlzLl89dCx0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49bnVsbCx0aGlzLkE9bnVsbCx0aGlzLmE9dGhpcyx0aGlzLno9MCx0aGlzLm09MCx0aGlzLmM9MCx0aGlzLnM9MCx0aGlzLnQ9bnVsbCx0aGlzLmk9bn1mdW5jdGlvbiBWbCh0LG4sZSxyLGkpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4sdT0tMSxmPWEubGVuZ3RoLGM9dC52YWx1ZSYmKGktZSkvdC52YWx1ZTsrK3U8ZjspKG89YVt1XSkueDA9bixvLngxPXIsby55MD1lLG8ueTE9ZSs9by52YWx1ZSpjfUdsLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGhsLnByb3RvdHlwZSk7dmFyICRsPSgxK01hdGguc3FydCg1KSkvMjtmdW5jdGlvbiBXbCh0LG4sZSxyLGksbyl7Zm9yKHZhciBhLHUsZixjLHMsbCxoLGQscCx2LGcseT1bXSxfPW4uY2hpbGRyZW4sYj0wLG09MCx4PV8ubGVuZ3RoLHc9bi52YWx1ZTtiPHg7KXtmPWktZSxjPW8tcjtkb3tzPV9bbSsrXS52YWx1ZX13aGlsZSghcyYmbTx4KTtmb3IobD1oPXMsZz1zKnMqKHY9TWF0aC5tYXgoYy9mLGYvYykvKHcqdCkpLHA9TWF0aC5tYXgoaC9nLGcvbCk7bTx4OysrbSl7aWYocys9dT1fW21dLnZhbHVlLHU8bCYmKGw9dSksdT5oJiYoaD11KSxnPXMqcyp2LChkPU1hdGgubWF4KGgvZyxnL2wpKT5wKXtzLT11O2JyZWFrfXA9ZH15LnB1c2goYT17dmFsdWU6cyxkaWNlOmY8YyxjaGlsZHJlbjpfLnNsaWNlKGIsbSl9KSxhLmRpY2U/RGwoYSxlLHIsaSx3P3IrPWMqcy93Om8pOlZsKGEsZSxyLHc/ZSs9ZipzL3c6aSxvKSx3LT1zLGI9bX1yZXR1cm4geX12YXIgWmw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7V2wobix0LGUscixpLG8pfXJldHVybiBlLnJhdGlvPWZ1bmN0aW9uKG4pe3JldHVybiB0KChuPStuKT4xP246MSl9LGV9KCRsKTt2YXIgUWw9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSxyLGksbyl7aWYoKGE9dC5fc3F1YXJpZnkpJiZhLnJhdGlvPT09bilmb3IodmFyIGEsdSxmLGMscyxsPS0xLGg9YS5sZW5ndGgsZD10LnZhbHVlOysrbDxoOyl7Zm9yKGY9KHU9YVtsXSkuY2hpbGRyZW4sYz11LnZhbHVlPTAscz1mLmxlbmd0aDtjPHM7KytjKXUudmFsdWUrPWZbY10udmFsdWU7dS5kaWNlP0RsKHUsZSxyLGkscis9KG8tcikqdS52YWx1ZS9kKTpWbCh1LGUscixlKz0oaS1lKSp1LnZhbHVlL2QsbyksZC09dS52YWx1ZX1lbHNlIHQuX3NxdWFyaWZ5PWE9V2wobix0LGUscixpLG8pLGEucmF0aW89bn1yZXR1cm4gZS5yYXRpbz1mdW5jdGlvbihuKXtyZXR1cm4gdCgobj0rbik+MT9uOjEpfSxlfSgkbCk7ZnVuY3Rpb24gSmwodCxuKXtyZXR1cm4gdFswXS1uWzBdfHx0WzFdLW5bMV19ZnVuY3Rpb24gS2wodCl7Zm9yKHZhciBuLGUscixpPXQubGVuZ3RoLG89WzAsMV0sYT0yLHU9Mjt1PGk7Kyt1KXtmb3IoO2E+MSYmKG49dFtvW2EtMl1dLGU9dFtvW2EtMV1dLHI9dFt1XSwoZVswXS1uWzBdKSooclsxXS1uWzFdKS0oZVsxXS1uWzFdKSooclswXS1uWzBdKTw9MCk7KS0tYTtvW2ErK109dX1yZXR1cm4gby5zbGljZSgwLGEpfWZ1bmN0aW9uIHRoKCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9dmFyIG5oPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0LGUpe3JldHVybiB0PW51bGw9PXQ/MDordCxlPW51bGw9PWU/MTorZSwxPT09YXJndW1lbnRzLmxlbmd0aD8oZT10LHQ9MCk6ZS09dCxmdW5jdGlvbigpe3JldHVybiBuKCkqZSt0fX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCksZWg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQsZSl7dmFyIHIsaTtyZXR1cm4gdD1udWxsPT10PzA6K3QsZT1udWxsPT1lPzE6K2UsZnVuY3Rpb24oKXt2YXIgbztpZihudWxsIT1yKW89cixyPW51bGw7ZWxzZSBkb3tyPTIqbigpLTEsbz0yKm4oKS0xLGk9cipyK28qb313aGlsZSghaXx8aT4xKTtyZXR1cm4gdCtlKm8qTWF0aC5zcXJ0KC0yKk1hdGgubG9nKGkpL2kpfX1yZXR1cm4gZS5zb3VyY2U9dCxlfSh0aCkscmg9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKCl7dmFyIHQ9ZWguc291cmNlKG4pLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5leHAodCgpKX19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGloPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIGU9MCxyPTA7cjx0OysrcillKz1uKCk7cmV0dXJuIGV9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSxvaD1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7dmFyIGU9aWguc291cmNlKG4pKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlKCkvdH19cmV0dXJuIGUuc291cmNlPXQsZX0odGgpLGFoPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4tTWF0aC5sb2coMS1uKCkpL3R9fXJldHVybiBlLnNvdXJjZT10LGV9KHRoKSx1aD1BcnJheS5wcm90b3R5cGUsZmg9dWgubWFwLGNoPXVoLnNsaWNlLHNoPXtuYW1lOiJpbXBsaWNpdCJ9O2Z1bmN0aW9uIGxoKHQpe3ZhciBuPUtpKCksZT1bXSxyPXNoO2Z1bmN0aW9uIGkoaSl7dmFyIG89aSsiIixhPW4uZ2V0KG8pO2lmKCFhKXtpZihyIT09c2gpcmV0dXJuIHI7bi5zZXQobyxhPWUucHVzaChpKSl9cmV0dXJuIHRbKGEtMSkldC5sZW5ndGhdfXJldHVybiB0PW51bGw9PXQ/W106Y2guY2FsbCh0KSxpLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS5zbGljZSgpO2U9W10sbj1LaSgpO2Zvcih2YXIgcixvLGE9LTEsdT10Lmxlbmd0aDsrK2E8dTspbi5oYXMobz0ocj10W2FdKSsiIil8fG4uc2V0KG8sZS5wdXNoKHIpKTtyZXR1cm4gaX0saS5yYW5nZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1jaC5jYWxsKG4pLGkpOnQuc2xpY2UoKX0saS51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsaSk6cn0saS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGxoKCkuZG9tYWluKGUpLnJhbmdlKHQpLnVua25vd24ocil9LGl9ZnVuY3Rpb24gaGgoKXt2YXIgdCxuLGU9bGgoKS51bmtub3duKHZvaWQgMCkscj1lLmRvbWFpbixpPWUucmFuZ2Usbz1bMCwxXSxhPSExLHU9MCxmPTAsYz0uNTtmdW5jdGlvbiBzKCl7dmFyIGU9cigpLmxlbmd0aCxzPW9bMV08b1swXSxsPW9bcy0wXSxoPW9bMS1zXTt0PShoLWwpL01hdGgubWF4KDEsZS11KzIqZiksYSYmKHQ9TWF0aC5mbG9vcih0KSksbCs9KGgtbC10KihlLXUpKSpjLG49dCooMS11KSxhJiYobD1NYXRoLnJvdW5kKGwpLG49TWF0aC5yb3VuZChuKSk7dmFyIGQ9ZyhlKS5tYXAoZnVuY3Rpb24obil7cmV0dXJuIGwrdCpufSk7cmV0dXJuIGkocz9kLnJldmVyc2UoKTpkKX1yZXR1cm4gZGVsZXRlIGUudW5rbm93bixlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSxzKCkpOnIoKX0sZS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1bK3RbMF0sK3RbMV1dLHMoKSk6by5zbGljZSgpfSxlLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIG89Wyt0WzBdLCt0WzFdXSxhPSEwLHMoKX0sZS5iYW5kd2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gbn0sZS5zdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGUucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ISF0LHMoKSk6YX0sZS5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PWY9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSxzKCkpOnV9LGUucGFkZGluZ0lubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkscygpKTp1fSxlLnBhZGRpbmdPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6Zn0sZS5hbGlnbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHMoKSk6Y30sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGhoKCkuZG9tYWluKHIoKSkucmFuZ2Uobykucm91bmQoYSkucGFkZGluZ0lubmVyKHUpLnBhZGRpbmdPdXRlcihmKS5hbGlnbihjKX0scygpfWZ1bmN0aW9uIGRoKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBwaCh0KXtyZXR1cm4rdH12YXIgdmg9WzAsMV07ZnVuY3Rpb24gZ2godCxuKXtyZXR1cm4obi09dD0rdCk/ZnVuY3Rpb24oZSl7cmV0dXJuKGUtdCkvbn06ZGgobil9ZnVuY3Rpb24geWgodCxuLGUscil7dmFyIGk9dFswXSxvPXRbMV0sYT1uWzBdLHU9blsxXTtyZXR1cm4gbzxpPyhpPWUobyxpKSxhPXIodSxhKSk6KGk9ZShpLG8pLGE9cihhLHUpKSxmdW5jdGlvbih0KXtyZXR1cm4gYShpKHQpKX19ZnVuY3Rpb24gX2godCxuLGUscil7dmFyIG89TWF0aC5taW4odC5sZW5ndGgsbi5sZW5ndGgpLTEsYT1uZXcgQXJyYXkobyksdT1uZXcgQXJyYXkobyksZj0tMTtmb3IodFtvXTx0WzBdJiYodD10LnNsaWNlKCkucmV2ZXJzZSgpLG49bi5zbGljZSgpLnJldmVyc2UoKSk7KytmPG87KWFbZl09ZSh0W2ZdLHRbZisxXSksdVtmXT1yKG5bZl0sbltmKzFdKTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGU9aSh0LG4sMSxvKS0xO3JldHVybiB1W2VdKGFbZV0obikpfX1mdW5jdGlvbiBiaCh0LG4pe3JldHVybiBuLmRvbWFpbih0LmRvbWFpbigpKS5yYW5nZSh0LnJhbmdlKCkpLmludGVycG9sYXRlKHQuaW50ZXJwb2xhdGUoKSkuY2xhbXAodC5jbGFtcCgpKX1mdW5jdGlvbiBtaCh0LG4pe3ZhciBlLHIsaSxvPXZoLGE9dmgsdT1tZSxmPSExO2Z1bmN0aW9uIGMoKXtyZXR1cm4gZT1NYXRoLm1pbihvLmxlbmd0aCxhLmxlbmd0aCk+Mj9faDp5aCxyPWk9bnVsbCxzfWZ1bmN0aW9uIHMobil7cmV0dXJuKHJ8fChyPWUobyxhLGY/ZnVuY3Rpb24odCl7cmV0dXJuIGZ1bmN0aW9uKG4sZSl7dmFyIHI9dChuPStuLGU9K2UpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gdDw9bj8wOnQ+PWU/MTpyKHQpfX19KHQpOnQsdSkpKSgrbil9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybihpfHwoaT1lKGEsbyxnaCxmP2Z1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbihuLGUpe3ZhciByPXQobj0rbixlPStlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PTA/bjp0Pj0xP2U6cih0KX19fShuKTpuKSkpKCt0KX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ZmguY2FsbCh0LHBoKSxjKCkpOm8uc2xpY2UoKX0scy5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT1jaC5jYWxsKHQpLGMoKSk6YS5zbGljZSgpfSxzLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGE9Y2guY2FsbCh0KSx1PXhlLGMoKX0scy5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0hIXQsYygpKTpmfSxzLmludGVycG9sYXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsYygpKTp1fSxjKCl9ZnVuY3Rpb24geGgobil7dmFyIGU9bi5kb21haW47cmV0dXJuIG4udGlja3M9ZnVuY3Rpb24odCl7dmFyIG49ZSgpO3JldHVybiBtKG5bMF0sbltuLmxlbmd0aC0xXSxudWxsPT10PzEwOnQpfSxuLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gZnVuY3Rpb24obixlLHIpe3ZhciBpLG89blswXSxhPW5bbi5sZW5ndGgtMV0sdT13KG8sYSxudWxsPT1lPzEwOmUpO3N3aXRjaCgocj1iYShudWxsPT1yPyIsZiI6cikpLnR5cGUpe2Nhc2UicyI6dmFyIGY9TWF0aC5tYXgoTWF0aC5hYnMobyksTWF0aC5hYnMoYSkpO3JldHVybiBudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1rYSh1LGYpKXx8KHIucHJlY2lzaW9uPWkpLHQuZm9ybWF0UHJlZml4KHIsZik7Y2FzZSIiOmNhc2UiZSI6Y2FzZSJnIjpjYXNlInAiOmNhc2UiciI6bnVsbCE9ci5wcmVjaXNpb258fGlzTmFOKGk9Q2EodSxNYXRoLm1heChNYXRoLmFicyhvKSxNYXRoLmFicyhhKSkpKXx8KHIucHJlY2lzaW9uPWktKCJlIj09PXIudHlwZSkpO2JyZWFrO2Nhc2UiZiI6Y2FzZSIlIjpudWxsIT1yLnByZWNpc2lvbnx8aXNOYU4oaT1FYSh1KSl8fChyLnByZWNpc2lvbj1pLTIqKCIlIj09PXIudHlwZSkpfXJldHVybiB0LmZvcm1hdChyKX0oZSgpLG4scil9LG4ubmljZT1mdW5jdGlvbih0KXtudWxsPT10JiYodD0xMCk7dmFyIHIsaT1lKCksbz0wLGE9aS5sZW5ndGgtMSx1PWlbb10sZj1pW2FdO3JldHVybiBmPHUmJihyPXUsdT1mLGY9cixyPW8sbz1hLGE9ciksKHI9eCh1LGYsdCkpPjA/cj14KHU9TWF0aC5mbG9vcih1L3IpKnIsZj1NYXRoLmNlaWwoZi9yKSpyLHQpOnI8MCYmKHI9eCh1PU1hdGguY2VpbCh1KnIpL3IsZj1NYXRoLmZsb29yKGYqcikvcix0KSkscj4wPyhpW29dPU1hdGguZmxvb3IodS9yKSpyLGlbYV09TWF0aC5jZWlsKGYvcikqcixlKGkpKTpyPDAmJihpW29dPU1hdGguY2VpbCh1KnIpL3IsaVthXT1NYXRoLmZsb29yKGYqcikvcixlKGkpKSxufSxufWZ1bmN0aW9uIHdoKHQsbil7dmFyIGUscj0wLGk9KHQ9dC5zbGljZSgpKS5sZW5ndGgtMSxvPXRbcl0sYT10W2ldO3JldHVybiBhPG8mJihlPXIscj1pLGk9ZSxlPW8sbz1hLGE9ZSksdFtyXT1uLmZsb29yKG8pLHRbaV09bi5jZWlsKGEpLHR9ZnVuY3Rpb24gTWgodCxuKXtyZXR1cm4obj1NYXRoLmxvZyhuL3QpKT9mdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5sb2coZS90KS9ufTpkaChuKX1mdW5jdGlvbiBBaCh0LG4pe3JldHVybiB0PDA/ZnVuY3Rpb24oZSl7cmV0dXJuLU1hdGgucG93KC1uLGUpKk1hdGgucG93KC10LDEtZSl9OmZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLnBvdyhuLGUpKk1hdGgucG93KHQsMS1lKX19ZnVuY3Rpb24gVGgodCl7cmV0dXJuIGlzRmluaXRlKHQpPysoIjFlIit0KTp0PDA/MDp0fWZ1bmN0aW9uIE5oKHQpe3JldHVybiAxMD09PXQ/VGg6dD09PU1hdGguRT9NYXRoLmV4cDpmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3codCxuKX19ZnVuY3Rpb24gU2godCl7cmV0dXJuIHQ9PT1NYXRoLkU/TWF0aC5sb2c6MTA9PT10JiZNYXRoLmxvZzEwfHwyPT09dCYmTWF0aC5sb2cyfHwodD1NYXRoLmxvZyh0KSxmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5sb2cobikvdH0pfWZ1bmN0aW9uIEVoKHQpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4tdCgtbil9fWZ1bmN0aW9uIGtoKHQsbil7cmV0dXJuIHQ8MD8tTWF0aC5wb3coLXQsbik6TWF0aC5wb3codCxuKX1mdW5jdGlvbiBDaCgpe3ZhciB0PTEsbj1taChmdW5jdGlvbihuLGUpe3JldHVybihlPWtoKGUsdCktKG49a2gobix0KSkpP2Z1bmN0aW9uKHIpe3JldHVybihraChyLHQpLW4pL2V9OmRoKGUpfSxmdW5jdGlvbihuLGUpe3JldHVybiBlPWtoKGUsdCktKG49a2gobix0KSksZnVuY3Rpb24ocil7cmV0dXJuIGtoKG4rZSpyLDEvdCl9fSksZT1uLmRvbWFpbjtyZXR1cm4gbi5leHBvbmVudD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rbixlKGUoKSkpOnR9LG4uY29weT1mdW5jdGlvbigpe3JldHVybiBiaChuLENoKCkuZXhwb25lbnQodCkpfSx4aChuKX12YXIgUGg9bmV3IERhdGUsemg9bmV3IERhdGU7ZnVuY3Rpb24gUmgodCxuLGUscil7ZnVuY3Rpb24gaShuKXtyZXR1cm4gdChuPW5ldyBEYXRlKCtuKSksbn1yZXR1cm4gaS5mbG9vcj1pLGkuY2VpbD1mdW5jdGlvbihlKXtyZXR1cm4gdChlPW5ldyBEYXRlKGUtMSkpLG4oZSwxKSx0KGUpLGV9LGkucm91bmQ9ZnVuY3Rpb24odCl7dmFyIG49aSh0KSxlPWkuY2VpbCh0KTtyZXR1cm4gdC1uPGUtdD9uOmV9LGkub2Zmc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odD1uZXcgRGF0ZSgrdCksbnVsbD09ZT8xOk1hdGguZmxvb3IoZSkpLHR9LGkucmFuZ2U9ZnVuY3Rpb24oZSxyLG8pe3ZhciBhLHU9W107aWYoZT1pLmNlaWwoZSksbz1udWxsPT1vPzE6TWF0aC5mbG9vcihvKSwhKGU8ciYmbz4wKSlyZXR1cm4gdTtkb3t1LnB1c2goYT1uZXcgRGF0ZSgrZSkpLG4oZSxvKSx0KGUpfXdoaWxlKGE8ZSYmZTxyKTtyZXR1cm4gdX0saS5maWx0ZXI9ZnVuY3Rpb24oZSl7cmV0dXJuIFJoKGZ1bmN0aW9uKG4pe2lmKG4+PW4pZm9yKDt0KG4pLCFlKG4pOyluLnNldFRpbWUobi0xKX0sZnVuY3Rpb24odCxyKXtpZih0Pj10KWlmKHI8MClmb3IoOysrcjw9MDspZm9yKDtuKHQsLTEpLCFlKHQpOyk7ZWxzZSBmb3IoOy0tcj49MDspZm9yKDtuKHQsMSksIWUodCk7KTt9KX0sZSYmKGkuY291bnQ9ZnVuY3Rpb24obixyKXtyZXR1cm4gUGguc2V0VGltZSgrbiksemguc2V0VGltZSgrciksdChQaCksdCh6aCksTWF0aC5mbG9vcihlKFBoLHpoKSl9LGkuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9pLmZpbHRlcihyP2Z1bmN0aW9uKG4pe3JldHVybiByKG4pJXQ9PTB9OmZ1bmN0aW9uKG4pe3JldHVybiBpLmNvdW50KDAsbikldD09MH0pOmk6bnVsbH0pLGl9dmFyIExoPVJoKGZ1bmN0aW9uKCl7fSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4gbi10fSk7TGguZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9TWF0aC5mbG9vcih0KSxpc0Zpbml0ZSh0KSYmdD4wP3Q+MT9SaChmdW5jdGlvbihuKXtuLnNldFRpbWUoTWF0aC5mbG9vcihuL3QpKnQpfSxmdW5jdGlvbihuLGUpe24uc2V0VGltZSgrbitlKnQpfSxmdW5jdGlvbihuLGUpe3JldHVybihlLW4pL3R9KTpMaDpudWxsfTt2YXIgRGg9TGgucmFuZ2UsVWg9NmU0LHFoPTYwNDhlNSxPaD1SaChmdW5jdGlvbih0KXt0LnNldFRpbWUoMWUzKk1hdGguZmxvb3IodC8xZTMpKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrMWUzKm4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzFlM30sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDU2Vjb25kcygpfSksWWg9T2gucmFuZ2UsQmg9UmgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKE1hdGguZmxvb3IodC9VaCkqVWgpfSxmdW5jdGlvbih0LG4pe3Quc2V0VGltZSgrdCtuKlVoKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10KS9VaH0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWludXRlcygpfSksRmg9QmgucmFuZ2UsSWg9UmgoZnVuY3Rpb24odCl7dmFyIG49dC5nZXRUaW1lem9uZU9mZnNldCgpKlVoJTM2ZTU7bjwwJiYobis9MzZlNSksdC5zZXRUaW1lKDM2ZTUqTWF0aC5mbG9vcigoK3QtbikvMzZlNSkrbil9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pLEhoPUloLnJhbmdlLGpoPVJoKGZ1bmN0aW9uKHQpe3Quc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQtKG4uZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKlVoKS84NjRlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGF0ZSgpLTF9KSxYaD1qaC5yYW5nZTtmdW5jdGlvbiBHaCh0KXtyZXR1cm4gUmgoZnVuY3Rpb24obil7bi5zZXREYXRlKG4uZ2V0RGF0ZSgpLShuLmdldERheSgpKzctdCklNyksbi5zZXRIb3VycygwLDAsMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldERhdGUodC5nZXREYXRlKCkrNypuKX0sZnVuY3Rpb24odCxuKXtyZXR1cm4obi10LShuLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSpVaCkvcWh9KX12YXIgVmg9R2goMCksJGg9R2goMSksV2g9R2goMiksWmg9R2goMyksUWg9R2goNCksSmg9R2goNSksS2g9R2goNiksdGQ9VmgucmFuZ2UsbmQ9JGgucmFuZ2UsZWQ9V2gucmFuZ2UscmQ9WmgucmFuZ2UsaWQ9UWgucmFuZ2Usb2Q9SmgucmFuZ2UsYWQ9S2gucmFuZ2UsdWQ9UmgoZnVuY3Rpb24odCl7dC5zZXREYXRlKDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNb250aCgpfSksZmQ9dWQucmFuZ2UsY2Q9UmgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRGdWxsWWVhcih0LmdldEZ1bGxZZWFyKCkrbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuIG4uZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCl9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KTtjZC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP1JoKGZ1bmN0aW9uKG4pe24uc2V0RnVsbFllYXIoTWF0aC5mbG9vcihuLmdldEZ1bGxZZWFyKCkvdCkqdCksbi5zZXRNb250aCgwLDEpLG4uc2V0SG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKG4sZSl7bi5zZXRGdWxsWWVhcihuLmdldEZ1bGxZZWFyKCkrZSp0KX0pOm51bGx9O3ZhciBzZD1jZC5yYW5nZSxsZD1SaChmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0sZnVuY3Rpb24odCxuKXt0LnNldFRpbWUoK3QrbipVaCl9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvVWh9LGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pLGhkPWxkLnJhbmdlLGRkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTWludXRlcygwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRUaW1lKCt0KzM2ZTUqbil9LGZ1bmN0aW9uKHQsbil7cmV0dXJuKG4tdCkvMzZlNX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX0pLHBkPWRkLnJhbmdlLHZkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9LGZ1bmN0aW9uKHQsbil7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpLzg2NGU1fSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pLGdkPXZkLnJhbmdlO2Z1bmN0aW9uIHlkKHQpe3JldHVybiBSaChmdW5jdGlvbihuKXtuLnNldFVUQ0RhdGUobi5nZXRVVENEYXRlKCktKG4uZ2V0VVRDRGF5KCkrNy10KSU3KSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKSs3Km4pfSxmdW5jdGlvbih0LG4pe3JldHVybihuLXQpL3FofSl9dmFyIF9kPXlkKDApLGJkPXlkKDEpLG1kPXlkKDIpLHhkPXlkKDMpLHdkPXlkKDQpLE1kPXlkKDUpLEFkPXlkKDYpLFRkPV9kLnJhbmdlLE5kPWJkLnJhbmdlLFNkPW1kLnJhbmdlLEVkPXhkLnJhbmdlLGtkPXdkLnJhbmdlLENkPU1kLnJhbmdlLFBkPUFkLnJhbmdlLHpkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDRGF0ZSgxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKX0sZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTW9udGgoKX0pLFJkPXpkLnJhbmdlLExkPVJoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbih0LG4pe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK24pfSxmdW5jdGlvbih0LG4pe3JldHVybiBuLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpfSxmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSk7TGQuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9SaChmdW5jdGlvbihuKXtuLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3Iobi5nZXRVVENGdWxsWWVhcigpL3QpKnQpLG4uc2V0VVRDTW9udGgoMCwxKSxuLnNldFVUQ0hvdXJzKDAsMCwwLDApfSxmdW5jdGlvbihuLGUpe24uc2V0VVRDRnVsbFllYXIobi5nZXRVVENGdWxsWWVhcigpK2UqdCl9KTpudWxsfTt2YXIgRGQ9TGQucmFuZ2U7ZnVuY3Rpb24gVWQodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgbj1uZXcgRGF0ZSgtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCk7cmV0dXJuIG4uc2V0RnVsbFllYXIodC55KSxufXJldHVybiBuZXcgRGF0ZSh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpfWZ1bmN0aW9uIHFkKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIG49bmV3IERhdGUoRGF0ZS5VVEMoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKTtyZXR1cm4gbi5zZXRVVENGdWxsWWVhcih0LnkpLG59cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpfWZ1bmN0aW9uIE9kKHQpe3JldHVybnt5OnQsbTowLGQ6MSxIOjAsTTowLFM6MCxMOjB9fWZ1bmN0aW9uIFlkKHQpe3ZhciBuPXQuZGF0ZVRpbWUsZT10LmRhdGUscj10LnRpbWUsaT10LnBlcmlvZHMsbz10LmRheXMsYT10LnNob3J0RGF5cyx1PXQubW9udGhzLGY9dC5zaG9ydE1vbnRocyxjPVZkKGkpLHM9JGQoaSksbD1WZChvKSxoPSRkKG8pLGQ9VmQoYSkscD0kZChhKSx2PVZkKHUpLGc9JGQodSkseT1WZChmKSxfPSRkKGYpLGI9e2E6ZnVuY3Rpb24odCl7cmV0dXJuIGFbdC5nZXREYXkoKV19LEE6ZnVuY3Rpb24odCl7cmV0dXJuIG9bdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24odCl7cmV0dXJuIGZbdC5nZXRNb250aCgpXX0sQjpmdW5jdGlvbih0KXtyZXR1cm4gdVt0LmdldE1vbnRoKCldfSxjOm51bGwsZDpwcCxlOnBwLGY6YnAsSDp2cCxJOmdwLGo6eXAsTDpfcCxtOm1wLE06eHAscDpmdW5jdGlvbih0KXtyZXR1cm4gaVsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUTpXcCxzOlpwLFM6d3AsdTpNcCxVOkFwLFY6VHAsdzpOcCxXOlNwLHg6bnVsbCxYOm51bGwseTpFcCxZOmtwLFo6Q3AsIiUiOiRwfSxtPXthOmZ1bmN0aW9uKHQpe3JldHVybiBhW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uKHQpe3JldHVybiBvW3QuZ2V0VVRDRGF5KCldfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBmW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24odCl7cmV0dXJuIHVbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6UHAsZTpQcCxmOlVwLEg6enAsSTpScCxqOkxwLEw6RHAsbTpxcCxNOk9wLHA6ZnVuY3Rpb24odCl7cmV0dXJuIGlbKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19LFE6V3AsczpacCxTOllwLHU6QnAsVTpGcCxWOklwLHc6SHAsVzpqcCx4Om51bGwsWDpudWxsLHk6WHAsWTpHcCxaOlZwLCIlIjokcH0seD17YTpmdW5jdGlvbih0LG4sZSl7dmFyIHI9ZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lnc9cFtyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uKHQsbixlKXt2YXIgcj1sLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQudz1oW3JbMF0udG9Mb3dlckNhc2UoKV0sZStyWzBdLmxlbmd0aCk6LTF9LGI6ZnVuY3Rpb24odCxuLGUpe3ZhciByPXkuZXhlYyhuLnNsaWNlKGUpKTtyZXR1cm4gcj8odC5tPV9bclswXS50b0xvd2VyQ2FzZSgpXSxlK3JbMF0ubGVuZ3RoKTotMX0sQjpmdW5jdGlvbih0LG4sZSl7dmFyIHI9di5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0Lm09Z1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uKHQsZSxyKXtyZXR1cm4gQSh0LG4sZSxyKX0sZDppcCxlOmlwLGY6c3AsSDphcCxJOmFwLGo6b3AsTDpjcCxtOnJwLE06dXAscDpmdW5jdGlvbih0LG4sZSl7dmFyIHI9Yy5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LnA9c1tyWzBdLnRvTG93ZXJDYXNlKCldLGUrclswXS5sZW5ndGgpOi0xfSxROmhwLHM6ZHAsUzpmcCx1OlpkLFU6UWQsVjpKZCx3OldkLFc6S2QseDpmdW5jdGlvbih0LG4scil7cmV0dXJuIEEodCxlLG4scil9LFg6ZnVuY3Rpb24odCxuLGUpe3JldHVybiBBKHQscixuLGUpfSx5Om5wLFk6dHAsWjplcCwiJSI6bHB9O2Z1bmN0aW9uIHcodCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvLGE9W10sdT0tMSxmPTAsYz10Lmxlbmd0aDtmb3IoZSBpbnN0YW5jZW9mIERhdGV8fChlPW5ldyBEYXRlKCtlKSk7Kyt1PGM7KTM3PT09dC5jaGFyQ29kZUF0KHUpJiYoYS5wdXNoKHQuc2xpY2UoZix1KSksbnVsbCE9KGk9RmRbcj10LmNoYXJBdCgrK3UpXSk/cj10LmNoYXJBdCgrK3UpOmk9ImUiPT09cj8iICI6IjAiLChvPW5bcl0pJiYocj1vKGUsaSkpLGEucHVzaChyKSxmPXUrMSk7cmV0dXJuIGEucHVzaCh0LnNsaWNlKGYsdSkpLGEuam9pbigiIil9fWZ1bmN0aW9uIE0odCxuKXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIHIsaSxvPU9kKDE5MDApO2lmKEEobyx0LGUrPSIiLDApIT1lLmxlbmd0aClyZXR1cm4gbnVsbDtpZigiUSJpbiBvKXJldHVybiBuZXcgRGF0ZShvLlEpO2lmKCJwImluIG8mJihvLkg9by5IJTEyKzEyKm8ucCksIlYiaW4gbyl7aWYoby5WPDF8fG8uVj41MylyZXR1cm4gbnVsbDsidyJpbiBvfHwoby53PTEpLCJaImluIG8/KGk9KHI9cWQoT2Qoby55KSkpLmdldFVUQ0RheSgpLHI9aT40fHwwPT09aT9iZC5jZWlsKHIpOmJkKHIpLHI9dmQub2Zmc2V0KHIsNyooby5WLTEpKSxvLnk9ci5nZXRVVENGdWxsWWVhcigpLG8ubT1yLmdldFVUQ01vbnRoKCksby5kPXIuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KGk9KHI9bihPZChvLnkpKSkuZ2V0RGF5KCkscj1pPjR8fDA9PT1pPyRoLmNlaWwocik6JGgocikscj1qaC5vZmZzZXQociw3KihvLlYtMSkpLG8ueT1yLmdldEZ1bGxZZWFyKCksby5tPXIuZ2V0TW9udGgoKSxvLmQ9ci5nZXREYXRlKCkrKG8udys2KSU3KX1lbHNlKCJXImluIG98fCJVImluIG8pJiYoInciaW4gb3x8KG8udz0idSJpbiBvP28udSU3OiJXImluIG8/MTowKSxpPSJaImluIG8/cWQoT2Qoby55KSkuZ2V0VVRDRGF5KCk6bihPZChvLnkpKS5nZXREYXkoKSxvLm09MCxvLmQ9IlciaW4gbz8oby53KzYpJTcrNypvLlctKGkrNSklNzpvLncrNypvLlUtKGkrNiklNyk7cmV0dXJuIloiaW4gbz8oby5IKz1vLlovMTAwfDAsby5NKz1vLlolMTAwLHFkKG8pKTpuKG8pfX1mdW5jdGlvbiBBKHQsbixlLHIpe2Zvcih2YXIgaSxvLGE9MCx1PW4ubGVuZ3RoLGY9ZS5sZW5ndGg7YTx1Oyl7aWYocj49ZilyZXR1cm4tMTtpZigzNz09PShpPW4uY2hhckNvZGVBdChhKyspKSl7aWYoaT1uLmNoYXJBdChhKyspLCEobz14W2kgaW4gRmQ/bi5jaGFyQXQoYSsrKTppXSl8fChyPW8odCxlLHIpKTwwKXJldHVybi0xfWVsc2UgaWYoaSE9ZS5jaGFyQ29kZUF0KHIrKykpcmV0dXJuLTF9cmV0dXJuIHJ9cmV0dXJuIGIueD13KGUsYiksYi5YPXcocixiKSxiLmM9dyhuLGIpLG0ueD13KGUsbSksbS5YPXcocixtKSxtLmM9dyhuLG0pLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixiKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQrPSIiLFVkKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIG49dyh0Kz0iIixtKTtyZXR1cm4gbi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxufSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgbj1NKHQscWQpO3JldHVybiBuLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LG59fX12YXIgQmQsRmQ9eyItIjoiIixfOiIgIiwwOiIwIn0sSWQ9L15ccypcZCsvLEhkPS9eJS8samQ9L1tcXF4kKis/fFtcXSgpLnt9XS9nO2Z1bmN0aW9uIFhkKHQsbixlKXt2YXIgcj10PDA/Ii0iOiIiLGk9KHI/LXQ6dCkrIiIsbz1pLmxlbmd0aDtyZXR1cm4gcisobzxlP25ldyBBcnJheShlLW8rMSkuam9pbihuKStpOmkpfWZ1bmN0aW9uIEdkKHQpe3JldHVybiB0LnJlcGxhY2UoamQsIlxcJCYiKX1mdW5jdGlvbiBWZCh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrdC5tYXAoR2QpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiAkZCh0KXtmb3IodmFyIG49e30sZT0tMSxyPXQubGVuZ3RoOysrZTxyOyluW3RbZV0udG9Mb3dlckNhc2UoKV09ZTtyZXR1cm4gbn1mdW5jdGlvbiBXZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBaZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsxKSk7cmV0dXJuIHI/KHQudT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBRZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBKZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVj0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBLZCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQuVz0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB0cCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSs0KSk7cmV0dXJuIHI/KHQueT0rclswXSxlK3JbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBucCh0LG4sZSl7dmFyIHI9SWQuZXhlYyhuLnNsaWNlKGUsZSsyKSk7cmV0dXJuIHI/KHQueT0rclswXSsoK3JbMF0+Njg/MTkwMDoyZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGVwKHQsbixlKXt2YXIgcj0vXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhuLnNsaWNlKGUsZSs2KSk7cmV0dXJuIHI/KHQuWj1yWzFdPzA6LShyWzJdKyhyWzNdfHwiMDAiKSksZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcnAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlLGUrMikpO3JldHVybiByPyh0Lm09clswXS0xLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGlwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIG9wKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5tPTAsdC5kPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGFwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5IPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHVwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5NPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGZwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzIpKTtyZXR1cm4gcj8odC5TPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGNwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzMpKTtyZXR1cm4gcj8odC5MPStyWzBdLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHNwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSxlKzYpKTtyZXR1cm4gcj8odC5MPU1hdGguZmxvb3IoclswXS8xZTMpLGUrclswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGxwKHQsbixlKXt2YXIgcj1IZC5leGVjKG4uc2xpY2UoZSxlKzEpKTtyZXR1cm4gcj9lK3JbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIGhwKHQsbixlKXt2YXIgcj1JZC5leGVjKG4uc2xpY2UoZSkpO3JldHVybiByPyh0LlE9K3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gZHAodCxuLGUpe3ZhciByPUlkLmV4ZWMobi5zbGljZShlKSk7cmV0dXJuIHI/KHQuUT0xZTMqK3JbMF0sZStyWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gcHAodCxuKXtyZXR1cm4gWGQodC5nZXREYXRlKCksbiwyKX1mdW5jdGlvbiB2cCh0LG4pe3JldHVybiBYZCh0LmdldEhvdXJzKCksbiwyKX1mdW5jdGlvbiBncCh0LG4pe3JldHVybiBYZCh0LmdldEhvdXJzKCklMTJ8fDEyLG4sMil9ZnVuY3Rpb24geXAodCxuKXtyZXR1cm4gWGQoMStqaC5jb3VudChjZCh0KSx0KSxuLDMpfWZ1bmN0aW9uIF9wKHQsbil7cmV0dXJuIFhkKHQuZ2V0TWlsbGlzZWNvbmRzKCksbiwzKX1mdW5jdGlvbiBicCh0LG4pe3JldHVybiBfcCh0LG4pKyIwMDAifWZ1bmN0aW9uIG1wKHQsbil7cmV0dXJuIFhkKHQuZ2V0TW9udGgoKSsxLG4sMil9ZnVuY3Rpb24geHAodCxuKXtyZXR1cm4gWGQodC5nZXRNaW51dGVzKCksbiwyKX1mdW5jdGlvbiB3cCh0LG4pe3JldHVybiBYZCh0LmdldFNlY29uZHMoKSxuLDIpfWZ1bmN0aW9uIE1wKHQpe3ZhciBuPXQuZ2V0RGF5KCk7cmV0dXJuIDA9PT1uPzc6bn1mdW5jdGlvbiBBcCh0LG4pe3JldHVybiBYZChWaC5jb3VudChjZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFRwKHQsbil7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm4gdD1lPj00fHwwPT09ZT9RaCh0KTpRaC5jZWlsKHQpLFhkKFFoLmNvdW50KGNkKHQpLHQpKyg0PT09Y2QodCkuZ2V0RGF5KCkpLG4sMil9ZnVuY3Rpb24gTnAodCl7cmV0dXJuIHQuZ2V0RGF5KCl9ZnVuY3Rpb24gU3AodCxuKXtyZXR1cm4gWGQoJGguY291bnQoY2QodCksdCksbiwyKX1mdW5jdGlvbiBFcCh0LG4pe3JldHVybiBYZCh0LmdldEZ1bGxZZWFyKCklMTAwLG4sMil9ZnVuY3Rpb24ga3AodCxuKXtyZXR1cm4gWGQodC5nZXRGdWxsWWVhcigpJTFlNCxuLDQpfWZ1bmN0aW9uIENwKHQpe3ZhciBuPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4obj4wPyItIjoobio9LTEsIisiKSkrWGQobi82MHwwLCIwIiwyKStYZChuJTYwLCIwIiwyKX1mdW5jdGlvbiBQcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0RhdGUoKSxuLDIpfWZ1bmN0aW9uIHpwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDSG91cnMoKSxuLDIpfWZ1bmN0aW9uIFJwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDSG91cnMoKSUxMnx8MTIsbiwyKX1mdW5jdGlvbiBMcCh0LG4pe3JldHVybiBYZCgxK3ZkLmNvdW50KExkKHQpLHQpLG4sMyl9ZnVuY3Rpb24gRHAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNaWxsaXNlY29uZHMoKSxuLDMpfWZ1bmN0aW9uIFVwKHQsbil7cmV0dXJuIERwKHQsbikrIjAwMCJ9ZnVuY3Rpb24gcXAodCxuKXtyZXR1cm4gWGQodC5nZXRVVENNb250aCgpKzEsbiwyKX1mdW5jdGlvbiBPcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ01pbnV0ZXMoKSxuLDIpfWZ1bmN0aW9uIFlwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDU2Vjb25kcygpLG4sMil9ZnVuY3Rpb24gQnAodCl7dmFyIG49dC5nZXRVVENEYXkoKTtyZXR1cm4gMD09PW4/NzpufWZ1bmN0aW9uIEZwKHQsbil7cmV0dXJuIFhkKF9kLmNvdW50KExkKHQpLHQpLG4sMil9ZnVuY3Rpb24gSXAodCxuKXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiB0PWU+PTR8fDA9PT1lP3dkKHQpOndkLmNlaWwodCksWGQod2QuY291bnQoTGQodCksdCkrKDQ9PT1MZCh0KS5nZXRVVENEYXkoKSksbiwyKX1mdW5jdGlvbiBIcCh0KXtyZXR1cm4gdC5nZXRVVENEYXkoKX1mdW5jdGlvbiBqcCh0LG4pe3JldHVybiBYZChiZC5jb3VudChMZCh0KSx0KSxuLDIpfWZ1bmN0aW9uIFhwKHQsbil7cmV0dXJuIFhkKHQuZ2V0VVRDRnVsbFllYXIoKSUxMDAsbiwyKX1mdW5jdGlvbiBHcCh0LG4pe3JldHVybiBYZCh0LmdldFVUQ0Z1bGxZZWFyKCklMWU0LG4sNCl9ZnVuY3Rpb24gVnAoKXtyZXR1cm4iKzAwMDAifWZ1bmN0aW9uICRwKCl7cmV0dXJuIiUifWZ1bmN0aW9uIFdwKHQpe3JldHVybit0fWZ1bmN0aW9uIFpwKHQpe3JldHVybiBNYXRoLmZsb29yKCt0LzFlMyl9ZnVuY3Rpb24gUXAobil7cmV0dXJuIEJkPVlkKG4pLHQudGltZUZvcm1hdD1CZC5mb3JtYXQsdC50aW1lUGFyc2U9QmQucGFyc2UsdC51dGNGb3JtYXQ9QmQudXRjRm9ybWF0LHQudXRjUGFyc2U9QmQudXRjUGFyc2UsQmR9UXAoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgSnA9RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/ZnVuY3Rpb24odCl7cmV0dXJuIHQudG9JU09TdHJpbmcoKX06dC51dGNGb3JtYXQoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpO3ZhciBLcD0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2Z1bmN0aW9uKHQpe3ZhciBuPW5ldyBEYXRlKHQpO3JldHVybiBpc05hTihuKT9udWxsOm59OnQudXRjUGFyc2UoIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiIpLHR2PTFlMyxudj02MCp0dixldj02MCpudixydj0yNCpldixpdj03KnJ2LG92PTMwKnJ2LGF2PTM2NSpydjtmdW5jdGlvbiB1dih0KXtyZXR1cm4gbmV3IERhdGUodCl9ZnVuY3Rpb24gZnYodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBEYXRlPyt0OituZXcgRGF0ZSgrdCl9ZnVuY3Rpb24gY3YodCxuLHIsaSxvLGEsdSxmLGMpe3ZhciBzPW1oKGdoLHZlKSxsPXMuaW52ZXJ0LGg9cy5kb21haW4sZD1jKCIuJUwiKSxwPWMoIjolUyIpLHY9YygiJUk6JU0iKSxnPWMoIiVJICVwIikseT1jKCIlYSAlZCIpLF89YygiJWIgJWQiKSxiPWMoIiVCIiksbT1jKCIlWSIpLHg9W1t1LDEsdHZdLFt1LDUsNSp0dl0sW3UsMTUsMTUqdHZdLFt1LDMwLDMwKnR2XSxbYSwxLG52XSxbYSw1LDUqbnZdLFthLDE1LDE1Km52XSxbYSwzMCwzMCpudl0sW28sMSxldl0sW28sMywzKmV2XSxbbyw2LDYqZXZdLFtvLDEyLDEyKmV2XSxbaSwxLHJ2XSxbaSwyLDIqcnZdLFtyLDEsaXZdLFtuLDEsb3ZdLFtuLDMsMypvdl0sW3QsMSxhdl1dO2Z1bmN0aW9uIE0oZSl7cmV0dXJuKHUoZSk8ZT9kOmEoZSk8ZT9wOm8oZSk8ZT92OmkoZSk8ZT9nOm4oZSk8ZT9yKGUpPGU/eTpfOnQoZSk8ZT9iOm0pKGUpfWZ1bmN0aW9uIEEobixyLGksbyl7aWYobnVsbD09biYmKG49MTApLCJudW1iZXIiPT10eXBlb2Ygbil7dmFyIGE9TWF0aC5hYnMoaS1yKS9uLHU9ZShmdW5jdGlvbih0KXtyZXR1cm4gdFsyXX0pLnJpZ2h0KHgsYSk7dT09PXgubGVuZ3RoPyhvPXcoci9hdixpL2F2LG4pLG49dCk6dT8obz0odT14W2EveFt1LTFdWzJdPHhbdV1bMl0vYT91LTE6dV0pWzFdLG49dVswXSk6KG89TWF0aC5tYXgodyhyLGksbiksMSksbj1mKX1yZXR1cm4gbnVsbD09bz9uOm4uZXZlcnkobyl9cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZShsKHQpKX0scy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aChmaC5jYWxsKHQsZnYpKTpoKCkubWFwKHV2KX0scy50aWNrcz1mdW5jdGlvbih0LG4pe3ZhciBlLHI9aCgpLGk9clswXSxvPXJbci5sZW5ndGgtMV0sYT1vPGk7cmV0dXJuIGEmJihlPWksaT1vLG89ZSksZT0oZT1BKHQsaSxvLG4pKT9lLnJhbmdlKGksbysxKTpbXSxhP2UucmV2ZXJzZSgpOmV9LHMudGlja0Zvcm1hdD1mdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT1uP006YyhuKX0scy5uaWNlPWZ1bmN0aW9uKHQsbil7dmFyIGU9aCgpO3JldHVybih0PUEodCxlWzBdLGVbZS5sZW5ndGgtMV0sbikpP2god2goZSx0KSk6c30scy5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKHMsY3YodCxuLHIsaSxvLGEsdSxmLGMpKX0sc31mdW5jdGlvbiBzdih0KXtmb3IodmFyIG49dC5sZW5ndGgvNnwwLGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KWVbcl09IiMiK3Quc2xpY2UoNipyLDYqKytyKTtyZXR1cm4gZX12YXIgbHY9c3YoIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpLGh2PXN2KCI3ZmM5N2ZiZWFlZDRmZGMwODZmZmZmOTkzODZjYjBmMDAyN2ZiZjViMTc2NjY2NjYiKSxkdj1zdigiMWI5ZTc3ZDk1ZjAyNzU3MGIzZTcyOThhNjZhNjFlZTZhYjAyYTY3NjFkNjY2NjY2IikscHY9c3YoImE2Y2VlMzFmNzhiNGIyZGY4YTMzYTAyY2ZiOWE5OWUzMWExY2ZkYmY2ZmZmN2YwMGNhYjJkNjZhM2Q5YWZmZmY5OWIxNTkyOCIpLHZ2PXN2KCJmYmI0YWViM2NkZTNjY2ViYzVkZWNiZTRmZWQ5YTZmZmZmY2NlNWQ4YmRmZGRhZWNmMmYyZjIiKSxndj1zdigiYjNlMmNkZmRjZGFjY2JkNWU4ZjRjYWU0ZTZmNWM5ZmZmMmFlZjFlMmNjY2NjY2NjIikseXY9c3YoImU0MWExYzM3N2ViODRkYWY0YTk4NGVhM2ZmN2YwMGZmZmYzM2E2NTYyOGY3ODFiZjk5OTk5OSIpLF92PXN2KCI2NmMyYTVmYzhkNjI4ZGEwY2JlNzhhYzNhNmQ4NTRmZmQ5MmZlNWM0OTRiM2IzYjMiKSxidj1zdigiOGRkM2M3ZmZmZmIzYmViYWRhZmI4MDcyODBiMWQzZmRiNDYyYjNkZTY5ZmNjZGU1ZDlkOWQ5YmM4MGJkY2NlYmM1ZmZlZDZmIik7ZnVuY3Rpb24gbXYodCl7cmV0dXJuIGxlKHRbdC5sZW5ndGgtMV0pfXZhciB4dj1uZXcgQXJyYXkoMykuY29uY2F0KCJkOGIzNjVmNWY1ZjU1YWI0YWMiLCJhNjYxMWFkZmMyN2Q4MGNkYzEwMTg1NzEiLCJhNjYxMWFkZmMyN2RmNWY1ZjU4MGNkYzEwMTg1NzEiLCI4YzUxMGFkOGIzNjVmNmU4YzNjN2VhZTU1YWI0YWMwMTY2NWUiLCI4YzUxMGFkOGIzNjVmNmU4YzNmNWY1ZjVjN2VhZTU1YWI0YWMwMTY2NWUiLCI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLCI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLCI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiLCI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiKS5tYXAoc3YpLHd2PW12KHh2KSxNdj1uZXcgQXJyYXkoMykuY29uY2F0KCJhZjhkYzNmN2Y3Zjc3ZmJmN2IiLCI3YjMyOTRjMmE1Y2ZhNmRiYTAwMDg4MzciLCI3YjMyOTRjMmE1Y2ZmN2Y3ZjdhNmRiYTAwMDg4MzciLCI3NjJhODNhZjhkYzNlN2Q0ZThkOWYwZDM3ZmJmN2IxYjc4MzciLCI3NjJhODNhZjhkYzNlN2Q0ZThmN2Y3ZjdkOWYwZDM3ZmJmN2IxYjc4MzciLCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLCI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiLCI0MDAwNGI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzcwMDQ0MWIiKS5tYXAoc3YpLEF2PW12KE12KSxUdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlOWEzYzlmN2Y3ZjdhMWQ3NmEiLCJkMDFjOGJmMWI2ZGFiOGUxODY0ZGFjMjYiLCJkMDFjOGJmMWI2ZGFmN2Y3ZjdiOGUxODY0ZGFjMjYiLCJjNTFiN2RlOWEzYzlmZGUwZWZlNmY1ZDBhMWQ3NmE0ZDkyMjEiLCJjNTFiN2RlOWEzYzlmZGUwZWZmN2Y3ZjdlNmY1ZDBhMWQ3NmE0ZDkyMjEiLCJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLCJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLCI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiLCI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiKS5tYXAoc3YpLE52PW12KFR2KSxTdj1uZXcgQXJyYXkoMykuY29uY2F0KCI5OThlYzNmN2Y3ZjdmMWEzNDAiLCI1ZTNjOTliMmFiZDJmZGI4NjNlNjYxMDEiLCI1ZTNjOTliMmFiZDJmN2Y3ZjdmZGI4NjNlNjYxMDEiLCI1NDI3ODg5OThlYzNkOGRhZWJmZWUwYjZmMWEzNDBiMzU4MDYiLCI1NDI3ODg5OThlYzNkOGRhZWJmN2Y3ZjdmZWUwYjZmMWEzNDBiMzU4MDYiLCI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDYiLCI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmN2Y3ZjdmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDYiLCIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiLCIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmN2Y3ZjdmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiKS5tYXAoc3YpLEV2PW12KFN2KSxrdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlZjhhNjJmN2Y3Zjc2N2E5Y2YiLCJjYTAwMjBmNGE1ODI5MmM1ZGUwNTcxYjAiLCJjYTAwMjBmNGE1ODJmN2Y3Zjc5MmM1ZGUwNTcxYjAiLCJiMjE4MmJlZjhhNjJmZGRiYzdkMWU1ZjA2N2E5Y2YyMTY2YWMiLCJiMjE4MmJlZjhhNjJmZGRiYzdmN2Y3ZjdkMWU1ZjA2N2E5Y2YyMTY2YWMiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMwNTMwNjEiKS5tYXAoc3YpLEN2PW12KGt2KSxQdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlZjhhNjJmZmZmZmY5OTk5OTkiLCJjYTAwMjBmNGE1ODJiYWJhYmE0MDQwNDAiLCJjYTAwMjBmNGE1ODJmZmZmZmZiYWJhYmE0MDQwNDAiLCJiMjE4MmJlZjhhNjJmZGRiYzdlMGUwZTA5OTk5OTk0ZDRkNGQiLCJiMjE4MmJlZjhhNjJmZGRiYzdmZmZmZmZlMGUwZTA5OTk5OTk0ZDRkNGQiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLCJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiLCI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiKS5tYXAoc3YpLHp2PW12KFB2KSxSdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5MWJmZGIiLCJkNzE5MWNmZGFlNjFhYmQ5ZTkyYzdiYjYiLCJkNzE5MWNmZGFlNjFmZmZmYmZhYmQ5ZTkyYzdiYjYiLCJkNzMwMjdmYzhkNTlmZWUwOTBlMGYzZjg5MWJmZGI0NTc1YjQiLCJkNzMwMjdmYzhkNTlmZWUwOTBmZmZmYmZlMGYzZjg5MWJmZGI0NTc1YjQiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBmZmZmYmZlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBmZmZmYmZlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiKS5tYXAoc3YpLEx2PW12KFJ2KSxEdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5MWNmNjAiLCJkNzE5MWNmZGFlNjFhNmQ5NmExYTk2NDEiLCJkNzE5MWNmZGFlNjFmZmZmYmZhNmQ5NmExYTk2NDEiLCJkNzMwMjdmYzhkNTlmZWUwOGJkOWVmOGI5MWNmNjAxYTk4NTAiLCJkNzMwMjdmYzhkNTlmZWUwOGJmZmZmYmZkOWVmOGI5MWNmNjAxYTk4NTAiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAiLCJkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAiLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciLCJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciKS5tYXAoc3YpLFV2PW12KER2KSxxdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmYzhkNTlmZmZmYmY5OWQ1OTQiLCJkNzE5MWNmZGFlNjFhYmRkYTQyYjgzYmEiLCJkNzE5MWNmZGFlNjFmZmZmYmZhYmRkYTQyYjgzYmEiLCJkNTNlNGZmYzhkNTlmZWUwOGJlNmY1OTg5OWQ1OTQzMjg4YmQiLCJkNTNlNGZmYzhkNTlmZWUwOGJmZmZmYmZlNmY1OTg5OWQ1OTQzMjg4YmQiLCJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQiLCJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQiLCI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiLCI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJmZmZmYmZlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiKS5tYXAoc3YpLE92PW12KHF2KSxZdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlNWY1Zjk5OWQ4YzkyY2EyNWYiLCJlZGY4ZmJiMmUyZTI2NmMyYTQyMzhiNDUiLCJlZGY4ZmJiMmUyZTI2NmMyYTQyY2EyNWYwMDZkMmMiLCJlZGY4ZmJjY2VjZTY5OWQ4Yzk2NmMyYTQyY2EyNWYwMDZkMmMiLCJlZGY4ZmJjY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLCJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLCJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDZkMmMwMDQ0MWIiKS5tYXAoc3YpLEJ2PW12KFl2KSxGdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlMGVjZjQ5ZWJjZGE4ODU2YTciLCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODQxOWQiLCJlZGY4ZmJiM2NkZTM4Yzk2YzY4ODU2YTc4MTBmN2MiLCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4ODU2YTc4MTBmN2MiLCJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmIiLCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ2ZTAxNmIiLCJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ4MTBmN2M0ZDAwNGIiKS5tYXAoc3YpLEl2PW12KEZ2KSxIdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlMGYzZGJhOGRkYjU0M2EyY2EiLCJmMGY5ZThiYWU0YmM3YmNjYzQyYjhjYmUiLCJmMGY5ZThiYWU0YmM3YmNjYzQ0M2EyY2EwODY4YWMiLCJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0M2EyY2EwODY4YWMiLCJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLCJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLCJmN2ZjZjBlMGYzZGJjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODY4YWMwODQwODEiKS5tYXAoc3YpLGp2PW12KEh2KSxYdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWU4YzhmZGJiODRlMzRhMzMiLCJmZWYwZDlmZGNjOGFmYzhkNTlkNzMwMWYiLCJmZWYwZDlmZGNjOGFmYzhkNTllMzRhMzNiMzAwMDAiLCJmZWYwZDlmZGQ0OWVmZGJiODRmYzhkNTllMzRhMzNiMzAwMDAiLCJmZWYwZDlmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLCJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLCJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWZiMzAwMDA3ZjAwMDAiKS5tYXAoc3YpLEd2PW12KFh2KSxWdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlY2UyZjBhNmJkZGIxYzkwOTkiLCJmNmVmZjdiZGM5ZTE2N2E5Y2YwMjgxOGEiLCJmNmVmZjdiZGM5ZTE2N2E5Y2YxYzkwOTkwMTZjNTkiLCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YxYzkwOTkwMTZjNTkiLCJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTAiLCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTY0NTAiLCJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTZjNTkwMTQ2MzYiKS5tYXAoc3YpLCR2PW12KFZ2KSxXdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlY2U3ZjJhNmJkZGIyYjhjYmUiLCJmMWVlZjZiZGM5ZTE3NGE5Y2YwNTcwYjAiLCJmMWVlZjZiZGM5ZTE3NGE5Y2YyYjhjYmUwNDVhOGQiLCJmMWVlZjZkMGQxZTZhNmJkZGI3NGE5Y2YyYjhjYmUwNDVhOGQiLCJmMWVlZjZkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLCJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLCJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwNDVhOGQwMjM4NTgiKS5tYXAoc3YpLFp2PW12KFd2KSxRdj1uZXcgQXJyYXkoMykuY29uY2F0KCJlN2UxZWZjOTk0YzdkZDFjNzciLCJmMWVlZjZkN2I1ZDhkZjY1YjBjZTEyNTYiLCJmMWVlZjZkN2I1ZDhkZjY1YjBkZDFjNzc5ODAwNDMiLCJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBkZDFjNzc5ODAwNDMiLCJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLCJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5MTAwM2YiLCJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5ODAwNDM2NzAwMWYiKS5tYXAoc3YpLEp2PW12KFF2KSxLdj1uZXcgQXJyYXkoMykuY29uY2F0KCJmZGUwZGRmYTlmYjVjNTFiOGEiLCJmZWViZTJmYmI0YjlmNzY4YTFhZTAxN2UiLCJmZWViZTJmYmI0YjlmNzY4YTFjNTFiOGE3YTAxNzciLCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFjNTFiOGE3YTAxNzciLCJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLCJmZmY3ZjNmZGUwZGRmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzc0OTAwNmEiKS5tYXAoc3YpLHRnPW12KEt2KSxuZz1uZXcgQXJyYXkoMykuY29uY2F0KCJlZGY4YjE3ZmNkYmIyYzdmYjgiLCJmZmZmY2NhMWRhYjQ0MWI2YzQyMjVlYTgiLCJmZmZmY2NhMWRhYjQ0MWI2YzQyYzdmYjgyNTM0OTQiLCJmZmZmY2NjN2U5YjQ3ZmNkYmI0MWI2YzQyYzdmYjgyNTM0OTQiLCJmZmZmY2NjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLCJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLCJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgyNTM0OTQwODFkNTgiKS5tYXAoc3YpLGVnPW12KG5nKSxyZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmN2ZjYjlhZGRkOGUzMWEzNTQiLCJmZmZmY2NjMmU2OTk3OGM2NzkyMzg0NDMiLCJmZmZmY2NjMmU2OTk3OGM2NzkzMWEzNTQwMDY4MzciLCJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2NzkzMWEzNTQwMDY4MzciLCJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLCJmZmZmZTVmN2ZjYjlkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLCJmZmZmZTVmN2ZjYjlkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDY4MzcwMDQ1MjkiKS5tYXAoc3YpLGlnPW12KHJnKSxvZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZmY3YmNmZWM0NGZkOTVmMGUiLCJmZmZmZDRmZWQ5OGVmZTk5MjljYzRjMDIiLCJmZmZmZDRmZWQ5OGVmZTk5MjlkOTVmMGU5OTM0MDQiLCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjlkOTVmMGU5OTM0MDQiLCJmZmZmZDRmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLCJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI5OTM0MDQ2NjI1MDYiKS5tYXAoc3YpLGFnPW12KG9nKSx1Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZmVkYTBmZWIyNGNmMDNiMjAiLCJmZmZmYjJmZWNjNWNmZDhkM2NlMzFhMWMiLCJmZmZmYjJmZWNjNWNmZDhkM2NmMDNiMjBiZDAwMjYiLCJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmMDNiMjBiZDAwMjYiLCJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLCJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLCJmZmZmY2NmZmVkYTBmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiZDAwMjY4MDAwMjYiKS5tYXAoc3YpLGZnPW12KHVnKSxjZz1uZXcgQXJyYXkoMykuY29uY2F0KCJkZWViZjc5ZWNhZTEzMTgyYmQiLCJlZmYzZmZiZGQ3ZTc2YmFlZDYyMTcxYjUiLCJlZmYzZmZiZGQ3ZTc2YmFlZDYzMTgyYmQwODUxOWMiLCJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDYzMTgyYmQwODUxOWMiLCJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1OTQiLCJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODQ1OTQiLCJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODUxOWMwODMwNmIiKS5tYXAoc3YpLHNnPW12KGNnKSxsZz1uZXcgQXJyYXkoMykuY29uY2F0KCJlNWY1ZTBhMWQ5OWIzMWEzNTQiLCJlZGY4ZTliYWU0YjM3NGM0NzYyMzhiNDUiLCJlZGY4ZTliYWU0YjM3NGM0NzYzMWEzNTQwMDZkMmMiLCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzYzMWEzNTQwMDZkMmMiLCJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzIiLCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDVhMzIiLCJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDZkMmMwMDQ0MWIiKS5tYXAoc3YpLGhnPW12KGxnKSxkZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmMGYwZjBiZGJkYmQ2MzYzNjMiLCJmN2Y3ZjdjY2NjY2M5Njk2OTY1MjUyNTIiLCJmN2Y3ZjdjY2NjY2M5Njk2OTY2MzYzNjMyNTI1MjUiLCJmN2Y3ZjdkOWQ5ZDliZGJkYmQ5Njk2OTY2MzYzNjMyNTI1MjUiLCJmN2Y3ZjdkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLCJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLCJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUwMDAwMDAiKS5tYXAoc3YpLHBnPW12KGRnKSx2Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJlZmVkZjViY2JkZGM3NTZiYjEiLCJmMmYwZjdjYmM5ZTI5ZTlhYzg2YTUxYTMiLCJmMmYwZjdjYmM5ZTI5ZTlhYzg3NTZiYjE1NDI3OGYiLCJmMmYwZjdkYWRhZWJiY2JkZGM5ZTlhYzg3NTZiYjE1NDI3OGYiLCJmMmYwZjdkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLCJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLCJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM1NDI3OGYzZjAwN2QiKS5tYXAoc3YpLGdnPW12KHZnKSx5Zz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWUwZDJmYzkyNzJkZTJkMjYiLCJmZWU1ZDlmY2FlOTFmYjZhNGFjYjE4MWQiLCJmZWU1ZDlmY2FlOTFmYjZhNGFkZTJkMjZhNTBmMTUiLCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFkZTJkMjZhNTBmMTUiLCJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLCJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWRhNTBmMTU2NzAwMGQiKS5tYXAoc3YpLF9nPW12KHlnKSxiZz1uZXcgQXJyYXkoMykuY29uY2F0KCJmZWU2Y2VmZGFlNmJlNjU1MGQiLCJmZWVkZGVmZGJlODVmZDhkM2NkOTQ3MDEiLCJmZWVkZGVmZGJlODVmZDhkM2NlNjU1MGRhNjM2MDMiLCJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NlNjU1MGRhNjM2MDMiLCJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLCJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLCJmZmY1ZWJmZWU2Y2VmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDFhNjM2MDM3ZjI3MDQiKS5tYXAoc3YpLG1nPW12KGJnKSx4Zz1HZShLbigzMDAsLjUsMCksS24oLTI0MCwuNSwxKSksd2c9R2UoS24oLTEwMCwuNzUsLjM1KSxLbig4MCwxLjUsLjgpKSxNZz1HZShLbigyNjAsLjc1LC4zNSksS24oODAsMS41LC44KSksQWc9S24oKTt2YXIgVGc9Ym4oKSxOZz1NYXRoLlBJLzMsU2c9MipNYXRoLlBJLzM7ZnVuY3Rpb24gRWcodCl7dmFyIG49dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4obi0xLE1hdGguZmxvb3IoZSpuKSkpXX19dmFyIGtnPUVnKHN2KCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUiKSksQ2c9RWcoc3YoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwOTAyMDIwYjAyMDIwZDAzMDMwZjAzMDMxMjA0MDQxNDA1MDQxNjA2MDUxODA2MDUxYTA3MDYxYzA4MDcxZTA5MDcyMDBhMDgyMjBiMDkyNDBjMDkyNjBkMGEyOTBlMGIyYjEwMGIyZDExMGMyZjEyMGQzMTEzMGQzNDE0MGUzNjE1MGUzODE2MGYzYjE4MGYzZDE5MTAzZjFhMTA0MjFjMTA0NDFkMTE0NzFlMTE0OTIwMTE0YjIxMTE0ZTIyMTE1MDI0MTI1MzI1MTI1NTI3MTI1ODI5MTE1YTJhMTE1YzJjMTE1ZjJkMTE2MTJmMTE2MzMxMTE2NTMzMTA2NzM0MTA2OTM2MTA2YjM4MTA2YzM5MGY2ZTNiMGY3MDNkMGY3MTNmMGY3MjQwMGY3NDQyMGY3NTQ0MGY3NjQ1MTA3NzQ3MTA3ODQ5MTA3ODRhMTA3OTRjMTE3YTRlMTE3YjRmMTI3YjUxMTI3YzUyMTM3YzU0MTM3ZDU2MTQ3ZDU3MTU3ZTU5MTU3ZTVhMTY3ZTVjMTY3ZjVkMTc3ZjVmMTg3ZjYwMTg4MDYyMTk4MDY0MWE4MDY1MWE4MDY3MWI4MDY4MWM4MTZhMWM4MTZiMWQ4MTZkMWQ4MTZlMWU4MTcwMWY4MTcyMWY4MTczMjA4MTc1MjE4MTc2MjE4MTc4MjI4MTc5MjI4MjdiMjM4MjdjMjM4MjdlMjQ4MjgwMjU4MjgxMjU4MTgzMjY4MTg0MjY4MTg2Mjc4MTg4Mjc4MTg5Mjg4MThiMjk4MThjMjk4MThlMmE4MTkwMmE4MTkxMmI4MTkzMmI4MDk0MmM4MDk2MmM4MDk4MmQ4MDk5MmQ4MDliMmU3ZjljMmU3ZjllMmY3ZmEwMmY3ZmExMzA3ZWEzMzA3ZWE1MzE3ZWE2MzE3ZGE4MzI3ZGFhMzM3ZGFiMzM3Y2FkMzQ3Y2FlMzQ3YmIwMzU3YmIyMzU3YmIzMzY3YWI1MzY3YWI3Mzc3OWI4Mzc3OWJhMzg3OGJjMzk3OGJkMzk3N2JmM2E3N2MwM2E3NmMyM2I3NWM0M2M3NWM1M2M3NGM3M2Q3M2M4M2U3M2NhM2U3MmNjM2Y3MWNkNDA3MWNmNDA3MGQwNDE2ZmQyNDI2ZmQzNDM2ZWQ1NDQ2ZGQ2NDU2Y2Q4NDU2Y2Q5NDY2YmRiNDc2YWRjNDg2OWRlNDk2OGRmNGE2OGUwNGM2N2UyNGQ2NmUzNGU2NWU0NGY2NGU1NTA2NGU3NTI2M2U4NTM2MmU5NTQ2MmVhNTY2MWViNTc2MGVjNTg2MGVkNWE1ZmVlNWI1ZWVmNWQ1ZWYwNWY1ZWYxNjA1ZGYyNjI1ZGYyNjQ1Y2YzNjU1Y2Y0Njc1Y2Y0Njk1Y2Y1NmI1Y2Y2NmM1Y2Y2NmU1Y2Y3NzA1Y2Y3NzI1Y2Y4NzQ1Y2Y4NzY1Y2Y5Nzg1ZGY5Nzk1ZGY5N2I1ZGZhN2Q1ZWZhN2Y1ZWZhODE1ZmZiODM1ZmZiODU2MGZiODc2MWZjODk2MWZjOGE2MmZjOGM2M2ZjOGU2NGZjOTA2NWZkOTI2NmZkOTQ2N2ZkOTY2OGZkOTg2OWZkOWE2YWZkOWI2YmZlOWQ2Y2ZlOWY2ZGZlYTE2ZWZlYTM2ZmZlYTU3MWZlYTc3MmZlYTk3M2ZlYWE3NGZlYWM3NmZlYWU3N2ZlYjA3OGZlYjI3YWZlYjQ3YmZlYjY3Y2ZlYjc3ZWZlYjk3ZmZlYmI4MWZlYmQ4MmZlYmY4NGZlYzE4NWZlYzI4N2ZlYzQ4OGZlYzY4YWZlYzg4Y2ZlY2E4ZGZlY2M4ZmZlY2Q5MGZlY2Y5MmZlZDE5NGZlZDM5NWZlZDU5N2ZlZDc5OWZlZDg5YWZkZGE5Y2ZkZGM5ZWZkZGVhMGZkZTBhMWZkZTJhM2ZkZTNhNWZkZTVhN2ZkZTdhOWZkZTlhYWZkZWJhY2ZjZWNhZWZjZWViMGZjZjBiMmZjZjJiNGZjZjRiNmZjZjZiOGZjZjdiOWZjZjliYmZjZmJiZGZjZmRiZiIpKSxQZz1FZyhzdigiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpLHpnPUVnKHN2KCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSk7ZnVuY3Rpb24gUmcodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBMZz1NYXRoLmFicyxEZz1NYXRoLmF0YW4yLFVnPU1hdGguY29zLHFnPU1hdGgubWF4LE9nPU1hdGgubWluLFlnPU1hdGguc2luLEJnPU1hdGguc3FydCxGZz0xZS0xMixJZz1NYXRoLlBJLEhnPUlnLzIsamc9MipJZztmdW5jdGlvbiBYZyh0KXtyZXR1cm4gdD49MT9IZzp0PD0tMT8tSGc6TWF0aC5hc2luKHQpfWZ1bmN0aW9uIEdnKHQpe3JldHVybiB0LmlubmVyUmFkaXVzfWZ1bmN0aW9uIFZnKHQpe3JldHVybiB0Lm91dGVyUmFkaXVzfWZ1bmN0aW9uICRnKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gV2codCl7cmV0dXJuIHQuZW5kQW5nbGV9ZnVuY3Rpb24gWmcodCl7cmV0dXJuIHQmJnQucGFkQW5nbGV9ZnVuY3Rpb24gUWcodCxuLGUscixpLG8sYSl7dmFyIHU9dC1lLGY9bi1yLGM9KGE/bzotbykvQmcodSp1K2YqZikscz1jKmYsbD0tYyp1LGg9dCtzLGQ9bitsLHA9ZStzLHY9citsLGc9KGgrcCkvMix5PShkK3YpLzIsXz1wLWgsYj12LWQsbT1fKl8rYipiLHg9aS1vLHc9aCp2LXAqZCxNPShiPDA/LTE6MSkqQmcocWcoMCx4KngqbS13KncpKSxBPSh3KmItXypNKS9tLFQ9KC13Kl8tYipNKS9tLE49KHcqYitfKk0pL20sUz0oLXcqXytiKk0pL20sRT1BLWcsaz1ULXksQz1OLWcsUD1TLXk7cmV0dXJuIEUqRStrKms+QypDK1AqUCYmKEE9TixUPVMpLHtjeDpBLGN5OlQseDAxOi1zLHkwMTotbCx4MTE6QSooaS94LTEpLHkxMTpUKihpL3gtMSl9fWZ1bmN0aW9uIEpnKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBLZyh0KXtyZXR1cm4gbmV3IEpnKHQpfWZ1bmN0aW9uIHR5KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIG55KHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIGV5KCl7dmFyIHQ9dHksbj1ueSxlPVJnKCEwKSxyPW51bGwsaT1LZyxvPW51bGw7ZnVuY3Rpb24gYShhKXt2YXIgdSxmLGMscz1hLmxlbmd0aCxsPSExO2ZvcihudWxsPT1yJiYobz1pKGM9R2koKSkpLHU9MDt1PD1zOysrdSkhKHU8cyYmZShmPWFbdV0sdSxhKSk9PT1sJiYoKGw9IWwpP28ubGluZVN0YXJ0KCk6by5saW5lRW5kKCkpLGwmJm8ucG9pbnQoK3QoZix1LGEpLCtuKGYsdSxhKSk7aWYoYylyZXR1cm4gbz1udWxsLGMrIiJ8fG51bGx9cmV0dXJuIGEueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxhKTp0fSxhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6bn0sYS5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoISF0KSxhKTplfSxhLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQsbnVsbCE9ciYmKG89aShyKSksYSk6aX0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P3I9bz1udWxsOm89aShyPXQpLGEpOnJ9LGF9ZnVuY3Rpb24gcnkoKXt2YXIgdD10eSxuPW51bGwsZT1SZygwKSxyPW55LGk9UmcoITApLG89bnVsbCxhPUtnLHU9bnVsbDtmdW5jdGlvbiBmKGYpe3ZhciBjLHMsbCxoLGQscD1mLmxlbmd0aCx2PSExLGc9bmV3IEFycmF5KHApLHk9bmV3IEFycmF5KHApO2ZvcihudWxsPT1vJiYodT1hKGQ9R2koKSkpLGM9MDtjPD1wOysrYyl7aWYoIShjPHAmJmkoaD1mW2NdLGMsZikpPT09dilpZih2PSF2KXM9Yyx1LmFyZWFTdGFydCgpLHUubGluZVN0YXJ0KCk7ZWxzZXtmb3IodS5saW5lRW5kKCksdS5saW5lU3RhcnQoKSxsPWMtMTtsPj1zOy0tbCl1LnBvaW50KGdbbF0seVtsXSk7dS5saW5lRW5kKCksdS5hcmVhRW5kKCl9diYmKGdbY109K3QoaCxjLGYpLHlbY109K2UoaCxjLGYpLHUucG9pbnQobj8rbihoLGMsZik6Z1tjXSxyPytyKGgsYyxmKTp5W2NdKSl9aWYoZClyZXR1cm4gdT1udWxsLGQrIiJ8fG51bGx9ZnVuY3Rpb24gYygpe3JldHVybiBleSgpLmRlZmluZWQoaSkuY3VydmUoYSkuY29udGV4dChvKX1yZXR1cm4gZi54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6UmcoK2UpLG49bnVsbCxmKTp0fSxmLngwPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UmcoK24pLGYpOnR9LGYueDE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm59LGYueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxyPW51bGwsZik6ZX0sZi55MD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTplfSxmLnkxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTpyfSxmLmxpbmVYMD1mLmxpbmVZMD1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KGUpfSxmLmxpbmVZMT1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KHIpfSxmLmxpbmVYMT1mdW5jdGlvbigpe3JldHVybiBjKCkueChuKS55KGUpfSxmLmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZyghIXQpLGYpOml9LGYuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxudWxsIT1vJiYodT1hKG8pKSxmKTphfSxmLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/bz11PW51bGw6dT1hKG89dCksZik6b30sZn1mdW5jdGlvbiBpeSh0LG4pe3JldHVybiBuPHQ/LTE6bj50PzE6bj49dD8wOk5hTn1mdW5jdGlvbiBveSh0KXtyZXR1cm4gdH1KZy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5saW5lVG8odCxuKX19fTt2YXIgYXk9ZnkoS2cpO2Z1bmN0aW9uIHV5KHQpe3RoaXMuX2N1cnZlPXR9ZnVuY3Rpb24gZnkodCl7ZnVuY3Rpb24gbihuKXtyZXR1cm4gbmV3IHV5KHQobikpfXJldHVybiBuLl9jdXJ2ZT10LG59ZnVuY3Rpb24gY3kodCl7dmFyIG49dC5jdXJ2ZTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oZnkodCkpOm4oKS5fY3VydmV9LHR9ZnVuY3Rpb24gc3koKXtyZXR1cm4gY3koZXkoKS5jdXJ2ZShheSkpfWZ1bmN0aW9uIGx5KCl7dmFyIHQ9cnkoKS5jdXJ2ZShheSksbj10LmN1cnZlLGU9dC5saW5lWDAscj10LmxpbmVYMSxpPXQubGluZVkwLG89dC5saW5lWTE7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5zdGFydEFuZ2xlPXQueDAsZGVsZXRlIHQueDAsdC5lbmRBbmdsZT10LngxLGRlbGV0ZSB0LngxLHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuaW5uZXJSYWRpdXM9dC55MCxkZWxldGUgdC55MCx0Lm91dGVyUmFkaXVzPXQueTEsZGVsZXRlIHQueTEsdC5saW5lU3RhcnRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBjeShlKCkpfSxkZWxldGUgdC5saW5lWDAsdC5saW5lRW5kQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gY3kocigpKX0sZGVsZXRlIHQubGluZVgxLHQubGluZUlubmVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIGN5KGkoKSl9LGRlbGV0ZSB0LmxpbmVZMCx0LmxpbmVPdXRlclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBjeShvKCkpfSxkZWxldGUgdC5saW5lWTEsdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9uKGZ5KHQpKTpuKCkuX2N1cnZlfSx0fWZ1bmN0aW9uIGh5KHQsbil7cmV0dXJuWyhuPStuKSpNYXRoLmNvcyh0LT1NYXRoLlBJLzIpLG4qTWF0aC5zaW4odCldfXV5LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhRW5kKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX2N1cnZlLnBvaW50KG4qTWF0aC5zaW4odCksbiotTWF0aC5jb3ModCkpfX07dmFyIGR5PUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBweSh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24gdnkodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIGd5KHQpe3ZhciBuPXB5LGU9dnkscj10eSxpPW55LG89bnVsbDtmdW5jdGlvbiBhKCl7dmFyIGEsdT1keS5jYWxsKGFyZ3VtZW50cyksZj1uLmFwcGx5KHRoaXMsdSksYz1lLmFwcGx5KHRoaXMsdSk7aWYob3x8KG89YT1HaSgpKSx0KG8sK3IuYXBwbHkodGhpcywodVswXT1mLHUpKSwraS5hcHBseSh0aGlzLHUpLCtyLmFwcGx5KHRoaXMsKHVbMF09Yyx1KSksK2kuYXBwbHkodGhpcyx1KSksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEuc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsYSk6bn0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxhKTplfSxhLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6cn0sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOml9LGEuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT10P251bGw6dCxhKTpvfSxhfWZ1bmN0aW9uIHl5KHQsbixlLHIsaSl7dC5tb3ZlVG8obixlKSx0LmJlemllckN1cnZlVG8obj0obityKS8yLGUsbixpLHIsaSl9ZnVuY3Rpb24gX3kodCxuLGUscixpKXt0Lm1vdmVUbyhuLGUpLHQuYmV6aWVyQ3VydmVUbyhuLGU9KGUraSkvMixyLGUscixpKX1mdW5jdGlvbiBieSh0LG4sZSxyLGkpe3ZhciBvPWh5KG4sZSksYT1oeShuLGU9KGUraSkvMiksdT1oeShyLGUpLGY9aHkocixpKTt0Lm1vdmVUbyhvWzBdLG9bMV0pLHQuYmV6aWVyQ3VydmVUbyhhWzBdLGFbMV0sdVswXSx1WzFdLGZbMF0sZlsxXSl9dmFyIG15PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vSWcpO3QubW92ZVRvKGUsMCksdC5hcmMoMCwwLGUsMCxqZyl9fSx4eT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydChuLzUpLzI7dC5tb3ZlVG8oLTMqZSwtZSksdC5saW5lVG8oLWUsLWUpLHQubGluZVRvKC1lLC0zKmUpLHQubGluZVRvKGUsLTMqZSksdC5saW5lVG8oZSwtZSksdC5saW5lVG8oMyplLC1lKSx0LmxpbmVUbygzKmUsZSksdC5saW5lVG8oZSxlKSx0LmxpbmVUbyhlLDMqZSksdC5saW5lVG8oLWUsMyplKSx0LmxpbmVUbygtZSxlKSx0LmxpbmVUbygtMyplLGUpLHQuY2xvc2VQYXRoKCl9fSx3eT1NYXRoLnNxcnQoMS8zKSxNeT0yKnd5LEF5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTXkpLHI9ZSp3eTt0Lm1vdmVUbygwLC1lKSx0LmxpbmVUbyhyLDApLHQubGluZVRvKDAsZSksdC5saW5lVG8oLXIsMCksdC5jbG9zZVBhdGgoKX19LFR5PU1hdGguc2luKElnLzEwKS9NYXRoLnNpbig3KklnLzEwKSxOeT1NYXRoLnNpbihqZy8xMCkqVHksU3k9LU1hdGguY29zKGpnLzEwKSpUeSxFeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPU1hdGguc3FydCguODkwODEzMDkxNTI5Mjg1MipuKSxyPU55KmUsaT1TeSplO3QubW92ZVRvKDAsLWUpLHQubGluZVRvKHIsaSk7Zm9yKHZhciBvPTE7bzw1Oysrbyl7dmFyIGE9amcqby81LHU9TWF0aC5jb3MoYSksZj1NYXRoLnNpbihhKTt0LmxpbmVUbyhmKmUsLXUqZSksdC5saW5lVG8odSpyLWYqaSxmKnIrdSppKX10LmNsb3NlUGF0aCgpfX0sa3k9e2RyYXc6ZnVuY3Rpb24odCxuKXt2YXIgZT1NYXRoLnNxcnQobikscj0tZS8yO3QucmVjdChyLHIsZSxlKX19LEN5PU1hdGguc3FydCgzKSxQeT17ZHJhdzpmdW5jdGlvbih0LG4pe3ZhciBlPS1NYXRoLnNxcnQobi8oMypDeSkpO3QubW92ZVRvKDAsMiplKSx0LmxpbmVUbygtQ3kqZSwtZSksdC5saW5lVG8oQ3kqZSwtZSksdC5jbG9zZVBhdGgoKX19LHp5PU1hdGguc3FydCgzKS8yLFJ5PTEvTWF0aC5zcXJ0KDEyKSxMeT0zKihSeS8yKzEpLER5PXtkcmF3OmZ1bmN0aW9uKHQsbil7dmFyIGU9TWF0aC5zcXJ0KG4vTHkpLHI9ZS8yLGk9ZSpSeSxvPXIsYT1lKlJ5K2UsdT0tbyxmPWE7dC5tb3ZlVG8ocixpKSx0LmxpbmVUbyhvLGEpLHQubGluZVRvKHUsZiksdC5saW5lVG8oLS41KnItenkqaSx6eSpyKy0uNSppKSx0LmxpbmVUbygtLjUqby16eSphLHp5Km8rLS41KmEpLHQubGluZVRvKC0uNSp1LXp5KmYsenkqdSstLjUqZiksdC5saW5lVG8oLS41KnIrenkqaSwtLjUqaS16eSpyKSx0LmxpbmVUbygtLjUqbyt6eSphLC0uNSphLXp5Km8pLHQubGluZVRvKC0uNSp1K3p5KmYsLS41KmYtenkqdSksdC5jbG9zZVBhdGgoKX19LFV5PVtteSx4eSxBeSxreSxFeSxQeSxEeV07ZnVuY3Rpb24gcXkoKXt9ZnVuY3Rpb24gT3kodCxuLGUpe3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygoMip0Ll94MCt0Ll94MSkvMywoMip0Ll95MCt0Ll95MSkvMywodC5feDArMip0Ll94MSkvMywodC5feTArMip0Ll95MSkvMywodC5feDArNCp0Ll94MStuKS82LCh0Ll95MCs0KnQuX3kxK2UpLzYpfWZ1bmN0aW9uIFl5KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBCeSh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gRnkodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEl5KHQsbil7dGhpcy5fYmFzaXM9bmV3IFl5KHQpLHRoaXMuX2JldGE9bn1ZeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAzOk95KHRoaXMsdGhpcy5feDEsdGhpcy5feTEpO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2NvbnRleHQubGluZVRvKCg1KnRoaXMuX3gwK3RoaXMuX3gxKS82LCg1KnRoaXMuX3kwK3RoaXMuX3kxKS82KTtkZWZhdWx0Ok95KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPW59fSxCeS5wcm90b3R5cGU9e2FyZWFTdGFydDpxeSxhcmVhRW5kOnF5LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MisyKnRoaXMuX3gzKS8zLCh0aGlzLl95MisyKnRoaXMuX3kzKS8zKSx0aGlzLl9jb250ZXh0LmxpbmVUbygodGhpcy5feDMrMip0aGlzLl94MikvMywodGhpcy5feTMrMip0aGlzLl95MikvMyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95MiksdGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCl9fSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gyPXQsdGhpcy5feTI9bjticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDQ9dCx0aGlzLl95ND1uLHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsKHRoaXMuX3kwKzQqdGhpcy5feTErbikvNik7YnJlYWs7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sRnkucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7c3dpdGNoKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTM7dmFyIGU9KHRoaXMuX3gwKzQqdGhpcy5feDErdCkvNixyPSh0aGlzLl95MCs0KnRoaXMuX3kxK24pLzY7dGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyhlLHIpOnRoaXMuX2NvbnRleHQubW92ZVRvKGUscik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpPeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1ufX0sSXkucHJvdG90eXBlPXtsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W10sdGhpcy5fYmFzaXMubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LG49dGhpcy5feSxlPXQubGVuZ3RoLTE7aWYoZT4wKWZvcih2YXIgcixpPXRbMF0sbz1uWzBdLGE9dFtlXS1pLHU9bltlXS1vLGY9LTE7KytmPD1lOylyPWYvZSx0aGlzLl9iYXNpcy5wb2ludCh0aGlzLl9iZXRhKnRbZl0rKDEtdGhpcy5fYmV0YSkqKGkrciphKSx0aGlzLl9iZXRhKm5bZl0rKDEtdGhpcy5fYmV0YSkqKG8rcip1KSk7dGhpcy5feD10aGlzLl95PW51bGwsdGhpcy5fYmFzaXMubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LG4pe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtuKX19O3ZhciBIeT1mdW5jdGlvbiB0KG4pe2Z1bmN0aW9uIGUodCl7cmV0dXJuIDE9PT1uP25ldyBZeSh0KTpuZXcgSXkodCxuKX1yZXR1cm4gZS5iZXRhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjg1KTtmdW5jdGlvbiBqeSh0LG4sZSl7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtbiksdC5feTIrdC5fayoodC5feTEtZSksdC5feDIsdC5feTIpfWZ1bmN0aW9uIFh5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1YeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6ankodGhpcyx0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3N3aXRjaCh0PSt0LG49K24sdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxuKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LG4pO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gxPXQsdGhpcy5feTE9bjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0Omp5KHRoaXMsdCxuKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgR3k9ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuZXcgWHkodCxuKX1yZXR1cm4gZS50ZW5zaW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oMCk7ZnVuY3Rpb24gVnkodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1uKS82fVZ5LnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPW47YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1uKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PW47YnJlYWs7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyICR5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFZ5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFd5KHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtbikvNn1XeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpqeSh0aGlzLHQsbil9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIFp5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbmV3IFd5KHQsbil9cmV0dXJuIGUudGVuc2lvbj1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KDApO2Z1bmN0aW9uIFF5KHQsbixlKXt2YXIgcj10Ll94MSxpPXQuX3kxLG89dC5feDIsYT10Ll95MjtpZih0Ll9sMDFfYT5GZyl7dmFyIHU9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsZj0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7cj0ocip1LXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL2YsaT0oaSp1LXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL2Z9aWYodC5fbDIzX2E+Rmcpe3ZhciBjPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLHM9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qYyt0Ll94MSp0Ll9sMjNfMmEtbip0Ll9sMTJfMmEpL3MsYT0oYSpjK3QuX3kxKnQuX2wyM18yYS1lKnQuX2wxMl8yYSkvc310Ll9jb250ZXh0LmJlemllckN1cnZlVG8ocixpLG8sYSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gSnkodCxuKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9bn1KeS5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95Mil9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe2lmKHQ9K3Qsbj0rbix0aGlzLl9wb2ludCl7dmFyIGU9dGhpcy5feDItdCxyPXRoaXMuX3kyLW47dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhlKmUrcipyLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIEt5PWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgSnkodCxuKTpuZXcgWHkodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiB0Xyh0LG4pe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1ufXRfLnByb3RvdHlwZT17YXJlYVN0YXJ0OnF5LGFyZWFFbmQ6cXksbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtpZih0PSt0LG49K24sdGhpcy5fcG9pbnQpe3ZhciBlPXRoaXMuX3gyLXQscj10aGlzLl95Mi1uO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3coZSplK3Iqcix0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1uO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9bik7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1uO2JyZWFrO2RlZmF1bHQ6UXkodGhpcyx0LG4pfXRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hLHRoaXMuX2wxMl9hPXRoaXMuX2wyM19hLHRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmEsdGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYSx0aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPW59fTt2YXIgbl89ZnVuY3Rpb24gdChuKXtmdW5jdGlvbiBlKHQpe3JldHVybiBuP25ldyB0Xyh0LG4pOm5ldyBWeSh0LDApfXJldHVybiBlLmFscGhhPWZ1bmN0aW9uKG4pe3JldHVybiB0KCtuKX0sZX0oLjUpO2Z1bmN0aW9uIGVfKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPW59ZV8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsbil7aWYodD0rdCxuPStuLHRoaXMuX3BvaW50KXt2YXIgZT10aGlzLl94Mi10LHI9dGhpcy5feTItbjt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KGUqZStyKnIsdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5fcG9pbnQ9NDtkZWZhdWx0OlF5KHRoaXMsdCxuKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1ufX07dmFyIHJfPWZ1bmN0aW9uIHQobil7ZnVuY3Rpb24gZSh0KXtyZXR1cm4gbj9uZXcgZV8odCxuKTpuZXcgV3kodCwwKX1yZXR1cm4gZS5hbHBoYT1mdW5jdGlvbihuKXtyZXR1cm4gdCgrbil9LGV9KC41KTtmdW5jdGlvbiBpXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gb18odCl7cmV0dXJuIHQ8MD8tMToxfWZ1bmN0aW9uIGFfKHQsbixlKXt2YXIgcj10Ll94MS10Ll94MCxpPW4tdC5feDEsbz0odC5feTEtdC5feTApLyhyfHxpPDAmJi0wKSxhPShlLXQuX3kxKS8oaXx8cjwwJiYtMCksdT0obyppK2EqcikvKHIraSk7cmV0dXJuKG9fKG8pK29fKGEpKSpNYXRoLm1pbihNYXRoLmFicyhvKSxNYXRoLmFicyhhKSwuNSpNYXRoLmFicyh1KSl8fDB9ZnVuY3Rpb24gdV8odCxuKXt2YXIgZT10Ll94MS10Ll94MDtyZXR1cm4gZT8oMyoodC5feTEtdC5feTApL2UtbikvMjpufWZ1bmN0aW9uIGZfKHQsbixlKXt2YXIgcj10Ll94MCxpPXQuX3kwLG89dC5feDEsYT10Ll95MSx1PShvLXIpLzM7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHIrdSxpK3UqbixvLXUsYS11KmUsbyxhKX1mdW5jdGlvbiBjXyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gc18odCl7dGhpcy5fY29udGV4dD1uZXcgbF8odCl9ZnVuY3Rpb24gbF8odCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIGhfKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBkXyh0KXt2YXIgbixlLHI9dC5sZW5ndGgtMSxpPW5ldyBBcnJheShyKSxvPW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKTtmb3IoaVswXT0wLG9bMF09MixhWzBdPXRbMF0rMip0WzFdLG49MTtuPHItMTsrK24paVtuXT0xLG9bbl09NCxhW25dPTQqdFtuXSsyKnRbbisxXTtmb3IoaVtyLTFdPTIsb1tyLTFdPTcsYVtyLTFdPTgqdFtyLTFdK3Rbcl0sbj0xO248cjsrK24pZT1pW25dL29bbi0xXSxvW25dLT1lLGFbbl0tPWUqYVtuLTFdO2ZvcihpW3ItMV09YVtyLTFdL29bci0xXSxuPXItMjtuPj0wOy0tbilpW25dPShhW25dLWlbbisxXSkvb1tuXTtmb3Iob1tyLTFdPSh0W3JdK2lbci0xXSkvMixuPTA7bjxyLTE7KytuKW9bbl09Mip0W24rMV0taVtuKzFdO3JldHVybltpLG9dfWZ1bmN0aW9uIHBfKHQsbil7dGhpcy5fY29udGV4dD10LHRoaXMuX3Q9bn1mdW5jdGlvbiB2Xyh0LG4pe2lmKChpPXQubGVuZ3RoKT4xKWZvcih2YXIgZSxyLGksbz0xLGE9dFtuWzBdXSx1PWEubGVuZ3RoO288aTsrK28pZm9yKHI9YSxhPXRbbltvXV0sZT0wO2U8dTsrK2UpYVtlXVsxXSs9YVtlXVswXT1pc05hTihyW2VdWzFdKT9yW2VdWzBdOnJbZV1bMV19ZnVuY3Rpb24gZ18odCl7Zm9yKHZhciBuPXQubGVuZ3RoLGU9bmV3IEFycmF5KG4pOy0tbj49MDspZVtuXT1uO3JldHVybiBlfWZ1bmN0aW9uIHlfKHQsbil7cmV0dXJuIHRbbl19ZnVuY3Rpb24gX18odCl7dmFyIG49dC5tYXAoYl8pO3JldHVybiBnXyh0KS5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG5bdF0tbltlXX0pfWZ1bmN0aW9uIGJfKHQpe2Zvcih2YXIgbixlPTAscj0tMSxpPXQubGVuZ3RoOysrcjxpOykobj0rdFtyXVsxXSkmJihlKz1uKTtyZXR1cm4gZX1mdW5jdGlvbiBtXyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24geF8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gd18odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gTV8oKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBBXyh0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIFRfKHQsbil7dmFyIGU9bixyPW4uUixpPWUuVTtpP2kuTD09PWU/aS5MPXI6aS5SPXI6dC5fPXIsci5VPWksZS5VPXIsZS5SPXIuTCxlLlImJihlLlIuVT1lKSxyLkw9ZX1mdW5jdGlvbiBOXyh0LG4pe3ZhciBlPW4scj1uLkwsaT1lLlU7aT9pLkw9PT1lP2kuTD1yOmkuUj1yOnQuXz1yLHIuVT1pLGUuVT1yLGUuTD1yLlIsZS5MJiYoZS5MLlU9ZSksci5SPWV9ZnVuY3Rpb24gU18odCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIEVfKHQsbixlLHIpe3ZhciBpPVtudWxsLG51bGxdLG89Sl8ucHVzaChpKS0xO3JldHVybiBpLmxlZnQ9dCxpLnJpZ2h0PW4sZSYmQ18oaSx0LG4sZSksciYmQ18oaSxuLHQsciksWl9bdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksWl9bbi5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksaX1mdW5jdGlvbiBrXyh0LG4sZSl7dmFyIHI9W24sZV07cmV0dXJuIHIubGVmdD10LHJ9ZnVuY3Rpb24gQ18odCxuLGUscil7dFswXXx8dFsxXT90LmxlZnQ9PT1lP3RbMV09cjp0WzBdPXI6KHRbMF09cix0LmxlZnQ9bix0LnJpZ2h0PWUpfWZ1bmN0aW9uIFBfKHQsbixlLHIsaSl7dmFyIG8sYT10WzBdLHU9dFsxXSxmPWFbMF0sYz1hWzFdLHM9MCxsPTEsaD11WzBdLWYsZD11WzFdLWM7aWYobz1uLWYsaHx8IShvPjApKXtpZihvLz1oLGg8MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWVsc2UgaWYoaD4wKXtpZihvPmwpcmV0dXJuO28+cyYmKHM9byl9aWYobz1yLWYsaHx8IShvPDApKXtpZihvLz1oLGg8MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWVsc2UgaWYoaD4wKXtpZihvPHMpcmV0dXJuO288bCYmKGw9byl9aWYobz1lLWMsZHx8IShvPjApKXtpZihvLz1kLGQ8MCl7aWYobzxzKXJldHVybjtvPGwmJihsPW8pfWVsc2UgaWYoZD4wKXtpZihvPmwpcmV0dXJuO28+cyYmKHM9byl9aWYobz1pLWMsZHx8IShvPDApKXtpZihvLz1kLGQ8MCl7aWYobz5sKXJldHVybjtvPnMmJihzPW8pfWVsc2UgaWYoZD4wKXtpZihvPHMpcmV0dXJuO288bCYmKGw9byl9cmV0dXJuIShzPjB8fGw8MSl8fChzPjAmJih0WzBdPVtmK3MqaCxjK3MqZF0pLGw8MSYmKHRbMV09W2YrbCpoLGMrbCpkXSksITApfX19fX1mdW5jdGlvbiB6Xyh0LG4sZSxyLGkpe3ZhciBvPXRbMV07aWYobylyZXR1cm4hMDt2YXIgYSx1LGY9dFswXSxjPXQubGVmdCxzPXQucmlnaHQsbD1jWzBdLGg9Y1sxXSxkPXNbMF0scD1zWzFdLHY9KGwrZCkvMixnPShoK3ApLzI7aWYocD09PWgpe2lmKHY8bnx8dj49cilyZXR1cm47aWYobD5kKXtpZihmKXtpZihmWzFdPj1pKXJldHVybn1lbHNlIGY9W3YsZV07bz1bdixpXX1lbHNle2lmKGYpe2lmKGZbMV08ZSlyZXR1cm59ZWxzZSBmPVt2LGldO289W3YsZV19fWVsc2UgaWYodT1nLShhPShsLWQpLyhwLWgpKSp2LGE8LTF8fGE+MSlpZihsPmQpe2lmKGYpe2lmKGZbMV0+PWkpcmV0dXJufWVsc2UgZj1bKGUtdSkvYSxlXTtvPVsoaS11KS9hLGldfWVsc2V7aWYoZil7aWYoZlsxXTxlKXJldHVybn1lbHNlIGY9WyhpLXUpL2EsaV07bz1bKGUtdSkvYSxlXX1lbHNlIGlmKGg8cCl7aWYoZil7aWYoZlswXT49cilyZXR1cm59ZWxzZSBmPVtuLGEqbit1XTtvPVtyLGEqcit1XX1lbHNle2lmKGYpe2lmKGZbMF08bilyZXR1cm59ZWxzZSBmPVtyLGEqcit1XTtvPVtuLGEqbit1XX1yZXR1cm4gdFswXT1mLHRbMV09bywhMH1mdW5jdGlvbiBSXyh0LG4pe3ZhciBlPXQuc2l0ZSxyPW4ubGVmdCxpPW4ucmlnaHQ7cmV0dXJuIGU9PT1pJiYoaT1yLHI9ZSksaT9NYXRoLmF0YW4yKGlbMV0tclsxXSxpWzBdLXJbMF0pOihlPT09cj8ocj1uWzFdLGk9blswXSk6KHI9blswXSxpPW5bMV0pLE1hdGguYXRhbjIoclswXS1pWzBdLGlbMV0tclsxXSkpfWZ1bmN0aW9uIExfKHQsbil7cmV0dXJuIG5bKyhuLmxlZnQhPT10LnNpdGUpXX1mdW5jdGlvbiBEXyh0LG4pe3JldHVybiBuWysobi5sZWZ0PT09dC5zaXRlKV19aV8ucHJvdG90eXBlPXthcmVhU3RhcnQ6cXksYXJlYUVuZDpxeSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LHBvaW50OmZ1bmN0aW9uKHQsbil7dD0rdCxuPStuLHRoaXMuX3BvaW50P3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6KHRoaXMuX3BvaW50PTEsdGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKSl9fSxjXy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl95MD10aGlzLl95MT10aGlzLl90MD1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gxLHRoaXMuX3kxKTticmVhaztjYXNlIDM6Zl8odGhpcyx0aGlzLl90MCx1Xyh0aGlzLHRoaXMuX3QwKSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LG4pe3ZhciBlPU5hTjtpZihuPStuLCh0PSt0KSE9PXRoaXMuX3gxfHxuIT09dGhpcy5feTEpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pOnRoaXMuX2NvbnRleHQubW92ZVRvKHQsbik7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsZl8odGhpcyx1Xyh0aGlzLGU9YV8odGhpcyx0LG4pKSxlKTticmVhaztkZWZhdWx0OmZfKHRoaXMsdGhpcy5fdDAsZT1hXyh0aGlzLHQsbikpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9bix0aGlzLl90MD1lfX19LChzXy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShjXy5wcm90b3R5cGUpKS5wb2ludD1mdW5jdGlvbih0LG4pe2NfLnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsbix0KX0sbF8ucHJvdG90eXBlPXttb3ZlVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0Lm1vdmVUbyhuLHQpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXt0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxsaW5lVG86ZnVuY3Rpb24odCxuKXt0aGlzLl9jb250ZXh0LmxpbmVUbyhuLHQpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsbixlLHIsaSxvKXt0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8obix0LHIsZSxvLGkpfX0saF8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxuPXRoaXMuX3ksZT10Lmxlbmd0aDtpZihlKWlmKHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odFswXSxuWzBdKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0WzBdLG5bMF0pLDI9PT1lKXRoaXMuX2NvbnRleHQubGluZVRvKHRbMV0sblsxXSk7ZWxzZSBmb3IodmFyIHI9ZF8odCksaT1kXyhuKSxvPTAsYT0xO2E8ZTsrK28sKythKXRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhyWzBdW29dLGlbMF1bb10sclsxXVtvXSxpWzFdW29dLHRbYV0sblthXSk7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09ZSkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUsdGhpcy5feD10aGlzLl95PW51bGx9LHBvaW50OmZ1bmN0aW9uKHQsbil7dGhpcy5feC5wdXNoKCt0KSx0aGlzLl95LnB1c2goK24pfX0scF8ucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD10aGlzLl95PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MDx0aGlzLl90JiZ0aGlzLl90PDEmJjI9PT10aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCx0aGlzLl95KSwodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT49MCYmKHRoaXMuX3Q9MS10aGlzLl90LHRoaXMuX2xpbmU9MS10aGlzLl9saW5lKX0scG9pbnQ6ZnVuY3Rpb24odCxuKXtzd2l0Y2godD0rdCxuPStuLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsbik6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxuKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OmlmKHRoaXMuX3Q8PTApdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feCxuKSx0aGlzLl9jb250ZXh0LmxpbmVUbyh0LG4pO2Vsc2V7dmFyIGU9dGhpcy5feCooMS10aGlzLl90KSt0KnRoaXMuX3Q7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0aGlzLl95KSx0aGlzLl9jb250ZXh0LmxpbmVUbyhlLG4pfX10aGlzLl94PXQsdGhpcy5feT1ufX0sTV8ucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpNXyxpbnNlcnQ6ZnVuY3Rpb24odCxuKXt2YXIgZSxyLGk7aWYodCl7aWYobi5QPXQsbi5OPXQuTix0Lk4mJih0Lk4uUD1uKSx0Lk49bix0LlIpe2Zvcih0PXQuUjt0Lkw7KXQ9dC5MO3QuTD1ufWVsc2UgdC5SPW47ZT10fWVsc2UgdGhpcy5fPyh0PVNfKHRoaXMuXyksbi5QPW51bGwsbi5OPXQsdC5QPXQuTD1uLGU9dCk6KG4uUD1uLk49bnVsbCx0aGlzLl89bixlPW51bGwpO2ZvcihuLkw9bi5SPW51bGwsbi5VPWUsbi5DPSEwLHQ9bjtlJiZlLkM7KWU9PT0ocj1lLlUpLkw/KGk9ci5SKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5SJiYoVF8odGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsTl8odGhpcyxyKSk6KGk9ci5MKSYmaS5DPyhlLkM9aS5DPSExLHIuQz0hMCx0PXIpOih0PT09ZS5MJiYoTl8odGhpcyxlKSxlPSh0PWUpLlUpLGUuQz0hMSxyLkM9ITAsVF8odGhpcyxyKSksZT10LlU7dGhpcy5fLkM9ITF9LHJlbW92ZTpmdW5jdGlvbih0KXt0Lk4mJih0Lk4uUD10LlApLHQuUCYmKHQuUC5OPXQuTiksdC5OPXQuUD1udWxsO3ZhciBuLGUscixpPXQuVSxvPXQuTCxhPXQuUjtpZihlPW8/YT9TXyhhKTpvOmEsaT9pLkw9PT10P2kuTD1lOmkuUj1lOnRoaXMuXz1lLG8mJmE/KHI9ZS5DLGUuQz10LkMsZS5MPW8sby5VPWUsZSE9PWE/KGk9ZS5VLGUuVT10LlUsdD1lLlIsaS5MPXQsZS5SPWEsYS5VPWUpOihlLlU9aSxpPWUsdD1lLlIpKToocj10LkMsdD1lKSx0JiYodC5VPWkpLCFyKWlmKHQmJnQuQyl0LkM9ITE7ZWxzZXtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1pLkwpe2lmKChuPWkuUikuQyYmKG4uQz0hMSxpLkM9ITAsVF8odGhpcyxpKSxuPWkuUiksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5SJiZuLlIuQ3x8KG4uTC5DPSExLG4uQz0hMCxOXyh0aGlzLG4pLG49aS5SKSxuLkM9aS5DLGkuQz1uLlIuQz0hMSxUXyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKChuPWkuTCkuQyYmKG4uQz0hMSxpLkM9ITAsTl8odGhpcyxpKSxuPWkuTCksbi5MJiZuLkwuQ3x8bi5SJiZuLlIuQyl7bi5MJiZuLkwuQ3x8KG4uUi5DPSExLG4uQz0hMCxUXyh0aGlzLG4pLG49aS5MKSxuLkM9aS5DLGkuQz1uLkwuQz0hMSxOXyh0aGlzLGkpLHQ9dGhpcy5fO2JyZWFrfW4uQz0hMCx0PWksaT1pLlV9d2hpbGUoIXQuQyk7dCYmKHQuQz0hMSl9fX07dmFyIFVfLHFfPVtdO2Z1bmN0aW9uIE9fKCl7QV8odGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIFlfKHQpe3ZhciBuPXQuUCxlPXQuTjtpZihuJiZlKXt2YXIgcj1uLnNpdGUsaT10LnNpdGUsbz1lLnNpdGU7aWYociE9PW8pe3ZhciBhPWlbMF0sdT1pWzFdLGY9clswXS1hLGM9clsxXS11LHM9b1swXS1hLGw9b1sxXS11LGg9MiooZipsLWMqcyk7aWYoIShoPj0tdGIpKXt2YXIgZD1mKmYrYypjLHA9cypzK2wqbCx2PShsKmQtYypwKS9oLGc9KGYqcC1zKmQpL2gseT1xXy5wb3AoKXx8bmV3IE9fO3kuYXJjPXQseS5zaXRlPWkseS54PXYrYSx5Lnk9KHkuY3k9Zyt1KStNYXRoLnNxcnQodip2K2cqZyksdC5jaXJjbGU9eTtmb3IodmFyIF89bnVsbCxiPVFfLl87YjspaWYoeS55PGIueXx8eS55PT09Yi55JiZ5Lng8PWIueCl7aWYoIWIuTCl7Xz1iLlA7YnJlYWt9Yj1iLkx9ZWxzZXtpZighYi5SKXtfPWI7YnJlYWt9Yj1iLlJ9UV8uaW5zZXJ0KF8seSksX3x8KFVfPXkpfX19fWZ1bmN0aW9uIEJfKHQpe3ZhciBuPXQuY2lyY2xlO24mJihuLlB8fChVXz1uLk4pLFFfLnJlbW92ZShuKSxxXy5wdXNoKG4pLEFfKG4pLHQuY2lyY2xlPW51bGwpfXZhciBGXz1bXTtmdW5jdGlvbiBJXygpe0FfKHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBIXyh0KXt2YXIgbj1GXy5wb3AoKXx8bmV3IElfO3JldHVybiBuLnNpdGU9dCxufWZ1bmN0aW9uIGpfKHQpe0JfKHQpLFdfLnJlbW92ZSh0KSxGXy5wdXNoKHQpLEFfKHQpfWZ1bmN0aW9uIFhfKHQpe3ZhciBuPXQuY2lyY2xlLGU9bi54LHI9bi5jeSxpPVtlLHJdLG89dC5QLGE9dC5OLHU9W3RdO2pfKHQpO2Zvcih2YXIgZj1vO2YuY2lyY2xlJiZNYXRoLmFicyhlLWYuY2lyY2xlLngpPEtfJiZNYXRoLmFicyhyLWYuY2lyY2xlLmN5KTxLXzspbz1mLlAsdS51bnNoaWZ0KGYpLGpfKGYpLGY9bzt1LnVuc2hpZnQoZiksQl8oZik7Zm9yKHZhciBjPWE7Yy5jaXJjbGUmJk1hdGguYWJzKGUtYy5jaXJjbGUueCk8S18mJk1hdGguYWJzKHItYy5jaXJjbGUuY3kpPEtfOylhPWMuTix1LnB1c2goYyksal8oYyksYz1hO3UucHVzaChjKSxCXyhjKTt2YXIgcyxsPXUubGVuZ3RoO2ZvcihzPTE7czxsOysrcyljPXVbc10sZj11W3MtMV0sQ18oYy5lZGdlLGYuc2l0ZSxjLnNpdGUsaSk7Zj11WzBdLChjPXVbbC0xXSkuZWRnZT1FXyhmLnNpdGUsYy5zaXRlLG51bGwsaSksWV8oZiksWV8oYyl9ZnVuY3Rpb24gR18odCl7Zm9yKHZhciBuLGUscixpLG89dFswXSxhPXRbMV0sdT1XXy5fO3U7KWlmKChyPVZfKHUsYSktbyk+S18pdT11Lkw7ZWxzZXtpZighKChpPW8tJF8odSxhKSk+S18pKXtyPi1LXz8obj11LlAsZT11KTppPi1LXz8obj11LGU9dS5OKTpuPWU9dTticmVha31pZighdS5SKXtuPXU7YnJlYWt9dT11LlJ9IWZ1bmN0aW9uKHQpe1pfW3QuaW5kZXhdPXtzaXRlOnQsaGFsZmVkZ2VzOltdfX0odCk7dmFyIGY9SF8odCk7aWYoV18uaW5zZXJ0KG4sZiksbnx8ZSl7aWYobj09PWUpcmV0dXJuIEJfKG4pLGU9SF8obi5zaXRlKSxXXy5pbnNlcnQoZixlKSxmLmVkZ2U9ZS5lZGdlPUVfKG4uc2l0ZSxmLnNpdGUpLFlfKG4pLHZvaWQgWV8oZSk7aWYoZSl7Ql8obiksQl8oZSk7dmFyIGM9bi5zaXRlLHM9Y1swXSxsPWNbMV0saD10WzBdLXMsZD10WzFdLWwscD1lLnNpdGUsdj1wWzBdLXMsZz1wWzFdLWwseT0yKihoKmctZCp2KSxfPWgqaCtkKmQsYj12KnYrZypnLG09WyhnKl8tZCpiKS95K3MsKGgqYi12Kl8pL3krbF07Q18oZS5lZGdlLGMscCxtKSxmLmVkZ2U9RV8oYyx0LG51bGwsbSksZS5lZGdlPUVfKHQscCxudWxsLG0pLFlfKG4pLFlfKGUpfWVsc2UgZi5lZGdlPUVfKG4uc2l0ZSxmLnNpdGUpfX1mdW5jdGlvbiBWXyh0LG4pe3ZhciBlPXQuc2l0ZSxyPWVbMF0saT1lWzFdLG89aS1uO2lmKCFvKXJldHVybiByO3ZhciBhPXQuUDtpZighYSlyZXR1cm4tMS8wO3ZhciB1PShlPWEuc2l0ZSlbMF0sZj1lWzFdLGM9Zi1uO2lmKCFjKXJldHVybiB1O3ZhciBzPXUtcixsPTEvby0xL2MsaD1zL2M7cmV0dXJuIGw/KC1oK01hdGguc3FydChoKmgtMipsKihzKnMvKC0yKmMpLWYrYy8yK2ktby8yKSkpL2wrcjoocit1KS8yfWZ1bmN0aW9uICRfKHQsbil7dmFyIGU9dC5OO2lmKGUpcmV0dXJuIFZfKGUsbik7dmFyIHI9dC5zaXRlO3JldHVybiByWzFdPT09bj9yWzBdOjEvMH12YXIgV18sWl8sUV8sSl8sS189MWUtNix0Yj0xZS0xMjtmdW5jdGlvbiBuYih0LG4pe3JldHVybiBuWzFdLXRbMV18fG5bMF0tdFswXX1mdW5jdGlvbiBlYih0LG4pe3ZhciBlLHIsaSxvPXQuc29ydChuYikucG9wKCk7Zm9yKEpfPVtdLFpfPW5ldyBBcnJheSh0Lmxlbmd0aCksV189bmV3IE1fLFFfPW5ldyBNXzs7KWlmKGk9VV8sbyYmKCFpfHxvWzFdPGkueXx8b1sxXT09PWkueSYmb1swXTxpLngpKW9bMF09PT1lJiZvWzFdPT09cnx8KEdfKG8pLGU9b1swXSxyPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFpKWJyZWFrO1hfKGkuYXJjKX1pZihmdW5jdGlvbigpe2Zvcih2YXIgdCxuLGUscixpPTAsbz1aXy5sZW5ndGg7aTxvOysraSlpZigodD1aX1tpXSkmJihyPShuPXQuaGFsZmVkZ2VzKS5sZW5ndGgpKXt2YXIgYT1uZXcgQXJyYXkociksdT1uZXcgQXJyYXkocik7Zm9yKGU9MDtlPHI7KytlKWFbZV09ZSx1W2VdPVJfKHQsSl9bbltlXV0pO2ZvcihhLnNvcnQoZnVuY3Rpb24odCxuKXtyZXR1cm4gdVtuXS11W3RdfSksZT0wO2U8cjsrK2UpdVtlXT1uW2FbZV1dO2ZvcihlPTA7ZTxyOysrZSluW2VdPXVbZV19fSgpLG4pe3ZhciBhPStuWzBdWzBdLHU9K25bMF1bMV0sZj0rblsxXVswXSxjPStuWzFdWzFdOyFmdW5jdGlvbih0LG4sZSxyKXtmb3IodmFyIGksbz1KXy5sZW5ndGg7by0tOyl6XyhpPUpfW29dLHQsbixlLHIpJiZQXyhpLHQsbixlLHIpJiYoTWF0aC5hYnMoaVswXVswXS1pWzFdWzBdKT5LX3x8TWF0aC5hYnMoaVswXVsxXS1pWzFdWzFdKT5LXyl8fGRlbGV0ZSBKX1tvXX0oYSx1LGYsYyksZnVuY3Rpb24odCxuLGUscil7dmFyIGksbyxhLHUsZixjLHMsbCxoLGQscCx2LGc9Wl8ubGVuZ3RoLHk9ITA7Zm9yKGk9MDtpPGc7KytpKWlmKG89Wl9baV0pe2ZvcihhPW8uc2l0ZSx1PShmPW8uaGFsZmVkZ2VzKS5sZW5ndGg7dS0tOylKX1tmW3VdXXx8Zi5zcGxpY2UodSwxKTtmb3IodT0wLGM9Zi5sZW5ndGg7dTxjOylwPShkPURfKG8sSl9bZlt1XV0pKVswXSx2PWRbMV0sbD0ocz1MXyhvLEpfW2ZbKyt1JWNdXSkpWzBdLGg9c1sxXSwoTWF0aC5hYnMocC1sKT5LX3x8TWF0aC5hYnModi1oKT5LXykmJihmLnNwbGljZSh1LDAsSl8ucHVzaChrXyhhLGQsTWF0aC5hYnMocC10KTxLXyYmci12PktfP1t0LE1hdGguYWJzKGwtdCk8S18/aDpyXTpNYXRoLmFicyh2LXIpPEtfJiZlLXA+S18/W01hdGguYWJzKGgtcik8S18/bDplLHJdOk1hdGguYWJzKHAtZSk8S18mJnYtbj5LXz9bZSxNYXRoLmFicyhsLWUpPEtfP2g6bl06TWF0aC5hYnModi1uKTxLXyYmcC10PktfP1tNYXRoLmFicyhoLW4pPEtfP2w6dCxuXTpudWxsKSktMSksKytjKTtjJiYoeT0hMSl9aWYoeSl7dmFyIF8sYixtLHg9MS8wO2ZvcihpPTAseT1udWxsO2k8ZzsrK2kpKG89Wl9baV0pJiYobT0oXz0oYT1vLnNpdGUpWzBdLXQpKl8rKGI9YVsxXS1uKSpiKTx4JiYoeD1tLHk9byk7aWYoeSl7dmFyIHc9W3Qsbl0sTT1bdCxyXSxBPVtlLHJdLFQ9W2Usbl07eS5oYWxmZWRnZXMucHVzaChKXy5wdXNoKGtfKGE9eS5zaXRlLHcsTSkpLTEsSl8ucHVzaChrXyhhLE0sQSkpLTEsSl8ucHVzaChrXyhhLEEsVCkpLTEsSl8ucHVzaChrXyhhLFQsdykpLTEpfX1mb3IoaT0wO2k8ZzsrK2kpKG89Wl9baV0pJiYoby5oYWxmZWRnZXMubGVuZ3RofHxkZWxldGUgWl9baV0pfShhLHUsZixjKX10aGlzLmVkZ2VzPUpfLHRoaXMuY2VsbHM9Wl8sV189UV89Sl89Wl89bnVsbH1mdW5jdGlvbiByYih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gaWIodCxuLGUpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPW4sdGhpcy50cmFuc2Zvcm09ZX1mdW5jdGlvbiBvYih0LG4sZSl7dGhpcy5rPXQsdGhpcy54PW4sdGhpcy55PWV9ZWIucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjplYixwb2x5Z29uczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMubWFwKGZ1bmN0aW9uKG4pe3ZhciBlPW4uaGFsZmVkZ2VzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gTF8obix0W2VdKX0pO3JldHVybiBlLmRhdGE9bi5zaXRlLmRhdGEsZX0pfSx0cmlhbmdsZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXSxuPXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMuZm9yRWFjaChmdW5jdGlvbihlLHIpe2lmKG89KGk9ZS5oYWxmZWRnZXMpLmxlbmd0aClmb3IodmFyIGksbyxhLHUsZixjLHM9ZS5zaXRlLGw9LTEsaD1uW2lbby0xXV0sZD1oLmxlZnQ9PT1zP2gucmlnaHQ6aC5sZWZ0OysrbDxvOylhPWQsZD0oaD1uW2lbbF1dKS5sZWZ0PT09cz9oLnJpZ2h0OmgubGVmdCxhJiZkJiZyPGEuaW5kZXgmJnI8ZC5pbmRleCYmKGY9YSxjPWQsKCh1PXMpWzBdLWNbMF0pKihmWzFdLXVbMV0pLSh1WzBdLWZbMF0pKihjWzFdLXVbMV0pPDApJiZ0LnB1c2goW3MuZGF0YSxhLmRhdGEsZC5kYXRhXSl9KSx0fSxsaW5rczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gdC5yaWdodH0pLm1hcChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOnQubGVmdC5kYXRhLHRhcmdldDp0LnJpZ2h0LmRhdGF9fSl9LGZpbmQ6ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89dGhpcyxhPW8uX2ZvdW5kfHwwLHU9by5jZWxscy5sZW5ndGg7IShpPW8uY2VsbHNbYV0pOylpZigrK2E+PXUpcmV0dXJuIG51bGw7dmFyIGY9dC1pLnNpdGVbMF0sYz1uLWkuc2l0ZVsxXSxzPWYqZitjKmM7ZG97aT1vLmNlbGxzW3I9YV0sYT1udWxsLGkuaGFsZmVkZ2VzLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHI9by5lZGdlc1tlXSx1PXIubGVmdDtpZih1IT09aS5zaXRlJiZ1fHwodT1yLnJpZ2h0KSl7dmFyIGY9dC11WzBdLGM9bi11WzFdLGw9ZipmK2MqYztsPHMmJihzPWwsYT11LmluZGV4KX19KX13aGlsZShudWxsIT09YSk7cmV0dXJuIG8uX2ZvdW5kPXIsbnVsbD09ZXx8czw9ZSplP2kuc2l0ZTpudWxsfX0sb2IucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpvYixzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gMT09PXQ/dGhpczpuZXcgb2IodGhpcy5rKnQsdGhpcy54LHRoaXMueSl9LHRyYW5zbGF0ZTpmdW5jdGlvbih0LG4pe3JldHVybiAwPT09dCYwPT09bj90aGlzOm5ldyBvYih0aGlzLmssdGhpcy54K3RoaXMuayp0LHRoaXMueSt0aGlzLmsqbil9LGFwcGx5OmZ1bmN0aW9uKHQpe3JldHVyblt0WzBdKnRoaXMuayt0aGlzLngsdFsxXSp0aGlzLmsrdGhpcy55XX0sYXBwbHlYOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnh9LGFwcGx5WTpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy55fSxpbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuWyh0WzBdLXRoaXMueCkvdGhpcy5rLCh0WzFdLXRoaXMueSkvdGhpcy5rXX0saW52ZXJ0WDpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLngpL3RoaXMua30saW52ZXJ0WTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLnkpL3RoaXMua30scmVzY2FsZVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSxyZXNjYWxlWTpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMueCsiLCIrdGhpcy55KyIpIHNjYWxlKCIrdGhpcy5rKyIpIn19O3ZhciBhYj1uZXcgb2IoMSwwLDApO2Z1bmN0aW9uIHViKHQpe3JldHVybiB0Ll9fem9vbXx8YWJ9ZnVuY3Rpb24gZmIoKXt0LmV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIGNiKCl7dC5ldmVudC5wcmV2ZW50RGVmYXVsdCgpLHQuZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gc2IoKXtyZXR1cm4hdC5ldmVudC5idXR0b259ZnVuY3Rpb24gbGIoKXt2YXIgdCxuLGU9dGhpcztyZXR1cm4gZSBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/KHQ9KGU9ZS5vd25lclNWR0VsZW1lbnR8fGUpLndpZHRoLmJhc2VWYWwudmFsdWUsbj1lLmhlaWdodC5iYXNlVmFsLnZhbHVlKToodD1lLmNsaWVudFdpZHRoLG49ZS5jbGllbnRIZWlnaHQpLFtbMCwwXSxbdCxuXV19ZnVuY3Rpb24gaGIoKXtyZXR1cm4gdGhpcy5fX3pvb218fGFifWZ1bmN0aW9uIGRiKCl7cmV0dXJuLXQuZXZlbnQuZGVsdGFZKih0LmV2ZW50LmRlbHRhTW9kZT8xMjA6MSkvNTAwfWZ1bmN0aW9uIHBiKCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIHZiKHQsbixlKXt2YXIgcj10LmludmVydFgoblswXVswXSktZVswXVswXSxpPXQuaW52ZXJ0WChuWzFdWzBdKS1lWzFdWzBdLG89dC5pbnZlcnRZKG5bMF1bMV0pLWVbMF1bMV0sYT10LmludmVydFkoblsxXVsxXSktZVsxXVsxXTtyZXR1cm4gdC50cmFuc2xhdGUoaT5yPyhyK2kpLzI6TWF0aC5taW4oMCxyKXx8TWF0aC5tYXgoMCxpKSxhPm8/KG8rYSkvMjpNYXRoLm1pbigwLG8pfHxNYXRoLm1heCgwLGEpKX11Yi5wcm90b3R5cGU9b2IucHJvdG90eXBlLHQudmVyc2lvbj0iNS43LjAiLHQuYmlzZWN0PWksdC5iaXNlY3RSaWdodD1pLHQuYmlzZWN0TGVmdD1vLHQuYXNjZW5kaW5nPW4sdC5iaXNlY3Rvcj1lLHQuY3Jvc3M9ZnVuY3Rpb24odCxuLGUpe3ZhciByLGksbyx1LGY9dC5sZW5ndGgsYz1uLmxlbmd0aCxzPW5ldyBBcnJheShmKmMpO2ZvcihudWxsPT1lJiYoZT1hKSxyPW89MDtyPGY7KytyKWZvcih1PXRbcl0saT0wO2k8YzsrK2ksKytvKXNbb109ZSh1LG5baV0pO3JldHVybiBzfSx0LmRlc2NlbmRpbmc9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbjx0Py0xOm4+dD8xOm4+PXQ/MDpOYU59LHQuZGV2aWF0aW9uPWMsdC5leHRlbnQ9cyx0Lmhpc3RvZ3JhbT1mdW5jdGlvbigpe3ZhciB0PXYsbj1zLGU9TTtmdW5jdGlvbiByKHIpe3ZhciBvLGEsdT1yLmxlbmd0aCxmPW5ldyBBcnJheSh1KTtmb3Iobz0wO288dTsrK28pZltvXT10KHJbb10sbyxyKTt2YXIgYz1uKGYpLHM9Y1swXSxsPWNbMV0saD1lKGYscyxsKTtBcnJheS5pc0FycmF5KGgpfHwoaD13KHMsbCxoKSxoPWcoTWF0aC5jZWlsKHMvaCkqaCxsLGgpKTtmb3IodmFyIGQ9aC5sZW5ndGg7aFswXTw9czspaC5zaGlmdCgpLC0tZDtmb3IoO2hbZC0xXT5sOyloLnBvcCgpLC0tZDt2YXIgcCx2PW5ldyBBcnJheShkKzEpO2ZvcihvPTA7bzw9ZDsrK28pKHA9dltvXT1bXSkueDA9bz4wP2hbby0xXTpzLHAueDE9bzxkP2hbb106bDtmb3Iobz0wO288dTsrK28pczw9KGE9ZltvXSkmJmE8PWwmJnZbaShoLGEsMCxkKV0ucHVzaChyW29dKTtyZXR1cm4gdn1yZXR1cm4gci52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnAobikscik6dH0sci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpwKFt0WzBdLHRbMV1dKSxyKTpufSxyLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP3AoaC5jYWxsKHQpKTpwKHQpLHIpOmV9LHJ9LHQudGhyZXNob2xkRnJlZWRtYW5EaWFjb25pcz1mdW5jdGlvbih0LGUscil7cmV0dXJuIHQ9ZC5jYWxsKHQsdSkuc29ydChuKSxNYXRoLmNlaWwoKHItZSkvKDIqKEEodCwuNzUpLUEodCwuMjUpKSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFNjb3R0PWZ1bmN0aW9uKHQsbixlKXtyZXR1cm4gTWF0aC5jZWlsKChlLW4pLygzLjUqYyh0KSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0LnRocmVzaG9sZFN0dXJnZXM9TSx0Lm1heD1ULHQubWVhbj1mdW5jdGlvbih0LG4pe3ZhciBlLHI9dC5sZW5ndGgsaT1yLG89LTEsYT0wO2lmKG51bGw9PW4pZm9yKDsrK288cjspaXNOYU4oZT11KHRbb10pKT8tLWk6YSs9ZTtlbHNlIGZvcig7KytvPHI7KWlzTmFOKGU9dShuKHRbb10sbyx0KSkpPy0taTphKz1lO2lmKGkpcmV0dXJuIGEvaX0sdC5tZWRpYW49ZnVuY3Rpb24odCxlKXt2YXIgcixpPXQubGVuZ3RoLG89LTEsYT1bXTtpZihudWxsPT1lKWZvcig7KytvPGk7KWlzTmFOKHI9dSh0W29dKSl8fGEucHVzaChyKTtlbHNlIGZvcig7KytvPGk7KWlzTmFOKHI9dShlKHRbb10sbyx0KSkpfHxhLnB1c2gocik7cmV0dXJuIEEoYS5zb3J0KG4pLC41KX0sdC5tZXJnZT1OLHQubWluPVMsdC5wYWlycz1mdW5jdGlvbih0LG4pe251bGw9PW4mJihuPWEpO2Zvcih2YXIgZT0wLHI9dC5sZW5ndGgtMSxpPXRbMF0sbz1uZXcgQXJyYXkocjwwPzA6cik7ZTxyOylvW2VdPW4oaSxpPXRbKytlXSk7cmV0dXJuIG99LHQucGVybXV0ZT1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZT1uLmxlbmd0aCxyPW5ldyBBcnJheShlKTtlLS07KXJbZV09dFtuW2VdXTtyZXR1cm4gcn0sdC5xdWFudGlsZT1BLHQucmFuZ2U9Zyx0LnNjYW49ZnVuY3Rpb24odCxlKXtpZihyPXQubGVuZ3RoKXt2YXIgcixpLG89MCxhPTAsdT10W2FdO2ZvcihudWxsPT1lJiYoZT1uKTsrK288cjspKGUoaT10W29dLHUpPDB8fDAhPT1lKHUsdSkpJiYodT1pLGE9byk7cmV0dXJuIDA9PT1lKHUsdSk/YTp2b2lkIDB9fSx0LnNodWZmbGU9ZnVuY3Rpb24odCxuLGUpe2Zvcih2YXIgcixpLG89KG51bGw9PWU/dC5sZW5ndGg6ZSktKG49bnVsbD09bj8wOituKTtvOylpPU1hdGgucmFuZG9tKCkqby0tfDAscj10W28rbl0sdFtvK25dPXRbaStuXSx0W2krbl09cjtyZXR1cm4gdH0sdC5zdW09ZnVuY3Rpb24odCxuKXt2YXIgZSxyPXQubGVuZ3RoLGk9LTEsbz0wO2lmKG51bGw9PW4pZm9yKDsrK2k8cjspKGU9K3RbaV0pJiYobys9ZSk7ZWxzZSBmb3IoOysraTxyOykoZT0rbih0W2ldLGksdCkpJiYobys9ZSk7cmV0dXJuIG99LHQudGlja3M9bSx0LnRpY2tJbmNyZW1lbnQ9eCx0LnRpY2tTdGVwPXcsdC50cmFuc3Bvc2U9RSx0LnZhcmlhbmNlPWYsdC56aXA9ZnVuY3Rpb24oKXtyZXR1cm4gRShhcmd1bWVudHMpfSx0LmF4aXNUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIEIoeix0KX0sdC5heGlzUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIEIoUix0KX0sdC5heGlzQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBCKEwsdCl9LHQuYXhpc0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIEIoRCx0KX0sdC5icnVzaD1mdW5jdGlvbigpe3JldHVybiBSaSh3aSl9LHQuYnJ1c2hYPWZ1bmN0aW9uKCl7cmV0dXJuIFJpKG1pKX0sdC5icnVzaFk9ZnVuY3Rpb24oKXtyZXR1cm4gUmkoeGkpfSx0LmJydXNoU2VsZWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBuPXQuX19icnVzaDtyZXR1cm4gbj9uLmRpbS5vdXRwdXQobi5zZWxlY3Rpb24pOm51bGx9LHQuY2hvcmQ9ZnVuY3Rpb24oKXt2YXIgdD0wLG49bnVsbCxlPW51bGwscj1udWxsO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYSx1LGYsYyxzLGw9aS5sZW5ndGgsaD1bXSxkPWcobCkscD1bXSx2PVtdLHk9di5ncm91cHM9bmV3IEFycmF5KGwpLF89bmV3IEFycmF5KGwqbCk7Zm9yKG89MCxjPS0xOysrYzxsOyl7Zm9yKGE9MCxzPS0xOysrczxsOylhKz1pW2NdW3NdO2gucHVzaChhKSxwLnB1c2goZyhsKSksbys9YX1mb3IobiYmZC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oaFt0XSxoW2VdKX0pLGUmJnAuZm9yRWFjaChmdW5jdGlvbih0LG4pe3Quc29ydChmdW5jdGlvbih0LHIpe3JldHVybiBlKGlbbl1bdF0saVtuXVtyXSl9KX0pLGY9KG89WWkoMCxPaS10KmwpL28pP3Q6T2kvbCxhPTAsYz0tMTsrK2M8bDspe2Zvcih1PWEscz0tMTsrK3M8bDspe3ZhciBiPWRbY10sbT1wW2JdW3NdLHg9aVtiXVttXSx3PWEsTT1hKz14Km87X1ttKmwrYl09e2luZGV4OmIsc3ViaW5kZXg6bSxzdGFydEFuZ2xlOncsZW5kQW5nbGU6TSx2YWx1ZTp4fX15W2JdPXtpbmRleDpiLHN0YXJ0QW5nbGU6dSxlbmRBbmdsZTphLHZhbHVlOmhbYl19LGErPWZ9Zm9yKGM9LTE7KytjPGw7KWZvcihzPWMtMTsrK3M8bDspe3ZhciBBPV9bcypsK2NdLFQ9X1tjKmwrc107KEEudmFsdWV8fFQudmFsdWUpJiZ2LnB1c2goQS52YWx1ZTxULnZhbHVlP3tzb3VyY2U6VCx0YXJnZXQ6QX06e3NvdXJjZTpBLHRhcmdldDpUfSl9cmV0dXJuIHI/di5zb3J0KHIpOnZ9cmV0dXJuIGkucGFkQW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9WWkoMCxuKSxpKTp0fSxpLnNvcnRHcm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxpKTpufSxpLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxpKTplfSxpLnNvcnRDaG9yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/cj1udWxsOihuPXQscj1mdW5jdGlvbih0LGUpe3JldHVybiBuKHQuc291cmNlLnZhbHVlK3QudGFyZ2V0LnZhbHVlLGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlKX0pLl89dCxpKTpyJiZyLl87dmFyIG59LGl9LHQucmliYm9uPWZ1bmN0aW9uKCl7dmFyIHQ9Vmksbj0kaSxlPVdpLHI9WmksaT1RaSxvPW51bGw7ZnVuY3Rpb24gYSgpe3ZhciBhLHU9QmkuY2FsbChhcmd1bWVudHMpLGY9dC5hcHBseSh0aGlzLHUpLGM9bi5hcHBseSh0aGlzLHUpLHM9K2UuYXBwbHkodGhpcywodVswXT1mLHUpKSxsPXIuYXBwbHkodGhpcyx1KS1xaSxoPWkuYXBwbHkodGhpcyx1KS1xaSxkPXMqTGkobCkscD1zKkRpKGwpLHY9K2UuYXBwbHkodGhpcywodVswXT1jLHUpKSxnPXIuYXBwbHkodGhpcyx1KS1xaSx5PWkuYXBwbHkodGhpcyx1KS1xaTtpZihvfHwobz1hPUdpKCkpLG8ubW92ZVRvKGQscCksby5hcmMoMCwwLHMsbCxoKSxsPT09ZyYmaD09PXl8fChvLnF1YWRyYXRpY0N1cnZlVG8oMCwwLHYqTGkoZyksdipEaShnKSksby5hcmMoMCwwLHYsZyx5KSksby5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxkLHApLG8uY2xvc2VQYXRoKCksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RmkoK3QpLGEpOmV9LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkZpKCt0KSxhKTpyfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RmkoK3QpLGEpOml9LGEuc291cmNlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sYSk6dH0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxhKTpufSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09dD9udWxsOnQsYSk6b30sYX0sdC5uZXN0PWZ1bmN0aW9uKCl7dmFyIHQsbixlLHI9W10saT1bXTtmdW5jdGlvbiBvKGUsaSxhLHUpe2lmKGk+PXIubGVuZ3RoKXJldHVybiBudWxsIT10JiZlLnNvcnQodCksbnVsbCE9bj9uKGUpOmU7Zm9yKHZhciBmLGMscyxsPS0xLGg9ZS5sZW5ndGgsZD1yW2krK10scD1LaSgpLHY9YSgpOysrbDxoOykocz1wLmdldChmPWQoYz1lW2xdKSsiIikpP3MucHVzaChjKTpwLnNldChmLFtjXSk7cmV0dXJuIHAuZWFjaChmdW5jdGlvbih0LG4pe3UodixuLG8odCxpLGEsdSkpfSksdn1yZXR1cm4gZT17b2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBvKHQsMCx0byxubyl9LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAsZW8scm8pfSxlbnRyaWVzOmZ1bmN0aW9uKHQpe3JldHVybiBmdW5jdGlvbiB0KGUsbyl7aWYoKytvPnIubGVuZ3RoKXJldHVybiBlO3ZhciBhLHU9aVtvLTFdO3JldHVybiBudWxsIT1uJiZvPj1yLmxlbmd0aD9hPWUuZW50cmllcygpOihhPVtdLGUuZWFjaChmdW5jdGlvbihuLGUpe2EucHVzaCh7a2V5OmUsdmFsdWVzOnQobixvKX0pfSkpLG51bGwhPXU/YS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIHUodC5rZXksbi5rZXkpfSk6YX0obyh0LDAsZW8scm8pLDApfSxrZXk6ZnVuY3Rpb24odCl7cmV0dXJuIHIucHVzaCh0KSxlfSxzb3J0S2V5czpmdW5jdGlvbih0KXtyZXR1cm4gaVtyLmxlbmd0aC0xXT10LGV9LHNvcnRWYWx1ZXM6ZnVuY3Rpb24obil7cmV0dXJuIHQ9bixlfSxyb2xsdXA6ZnVuY3Rpb24odCl7cmV0dXJuIG49dCxlfX19LHQuc2V0PWFvLHQubWFwPUtpLHQua2V5cz1mdW5jdGlvbih0KXt2YXIgbj1bXTtmb3IodmFyIGUgaW4gdCluLnB1c2goZSk7cmV0dXJuIG59LHQudmFsdWVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh0W2VdKTtyZXR1cm4gbn0sdC5lbnRyaWVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2Zvcih2YXIgZSBpbiB0KW4ucHVzaCh7a2V5OmUsdmFsdWU6dFtlXX0pO3JldHVybiBufSx0LmNvbG9yPXZuLHQucmdiPWJuLHQuaHNsPU1uLHQubGFiPVVuLHQuaGNsPUhuLHQubGNoPWZ1bmN0aW9uKHQsbixlLHIpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9Jbih0KTpuZXcgam4oZSxuLHQsbnVsbD09cj8xOnIpfSx0LmdyYXk9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbmV3IHFuKHQsMCwwLG51bGw9PW4/MTpuKX0sdC5jdWJlaGVsaXg9S24sdC5jb250b3Vycz1nbyx0LmNvbnRvdXJEZW5zaXR5PWZ1bmN0aW9uKCl7dmFyIHQ9Ym8sbj1tbyxlPXhvLHI9OTYwLGk9NTAwLG89MjAsYT0yLHU9MypvLGY9cisyKnU+PmEsYz1pKzIqdT4+YSxzPWNvKDIwKTtmdW5jdGlvbiBsKHIpe3ZhciBpPW5ldyBGbG9hdDMyQXJyYXkoZipjKSxsPW5ldyBGbG9hdDMyQXJyYXkoZipjKTtyLmZvckVhY2goZnVuY3Rpb24ocixvLHMpe3ZhciBsPSt0KHIsbyxzKSt1Pj5hLGg9K24ocixvLHMpK3U+PmEsZD0rZShyLG8scyk7bD49MCYmbDxmJiZoPj0wJiZoPGMmJihpW2wraCpmXSs9ZCl9KSx5byh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0sbz4+YSksX28oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOml9LG8+PmEpLHlvKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTpsfSxvPj5hKSxfbyh7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6aX0sbz4+YSkseW8oe3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSx7d2lkdGg6ZixoZWlnaHQ6YyxkYXRhOmx9LG8+PmEpLF9vKHt3aWR0aDpmLGhlaWdodDpjLGRhdGE6bH0se3dpZHRoOmYsaGVpZ2h0OmMsZGF0YTppfSxvPj5hKTt2YXIgZD1zKGkpO2lmKCFBcnJheS5pc0FycmF5KGQpKXt2YXIgcD1UKGkpO2Q9dygwLHAsZCksKGQ9ZygwLE1hdGguZmxvb3IocC9kKSpkLGQpKS5zaGlmdCgpfXJldHVybiBnbygpLnRocmVzaG9sZHMoZCkuc2l6ZShbZixjXSkoaSkubWFwKGgpfWZ1bmN0aW9uIGgodCl7cmV0dXJuIHQudmFsdWUqPU1hdGgucG93KDIsLTIqYSksdC5jb29yZGluYXRlcy5mb3JFYWNoKGQpLHR9ZnVuY3Rpb24gZCh0KXt0LmZvckVhY2gocCl9ZnVuY3Rpb24gcCh0KXt0LmZvckVhY2godil9ZnVuY3Rpb24gdih0KXt0WzBdPXRbMF0qTWF0aC5wb3coMixhKS11LHRbMV09dFsxXSpNYXRoLnBvdygyLGEpLXV9ZnVuY3Rpb24geSgpe3JldHVybiBmPXIrMioodT0zKm8pPj5hLGM9aSsyKnU+PmEsbH1yZXR1cm4gbC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Y28oK24pLGwpOnR9LGwueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNvKCt0KSxsKTpufSxsLndlaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNvKCt0KSxsKTplfSxsLnNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW3IsaV07dmFyIG49TWF0aC5jZWlsKHRbMF0pLGU9TWF0aC5jZWlsKHRbMV0pO2lmKCEobj49MHx8bj49MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTtyZXR1cm4gcj1uLGk9ZSx5KCl9LGwuY2VsbFNpemU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIDE8PGE7aWYoISgodD0rdCk+PTEpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjZWxsIHNpemUiKTtyZXR1cm4gYT1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGguTE4yKSx5KCl9LGwudGhyZXNob2xkcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkFycmF5LmlzQXJyYXkodCk/Y28odW8uY2FsbCh0KSk6Y28odCksbCk6c30sbC5iYW5kd2lkdGg9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIE1hdGguc3FydChvKihvKzEpKTtpZighKCh0PSt0KT49MCkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGJhbmR3aWR0aCIpO3JldHVybiBvPU1hdGgucm91bmQoKE1hdGguc3FydCg0KnQqdCsxKS0xKS8yKSx5KCl9LGx9LHQuZGlzcGF0Y2g9SSx0LmRyYWc9ZnVuY3Rpb24oKXt2YXIgbixlLHIsaSxvPVd0LGE9WnQsdT1RdCxmPUp0LGM9e30scz1JKCJzdGFydCIsImRyYWciLCJlbmQiKSxsPTAsaD0wO2Z1bmN0aW9uIGQodCl7dC5vbigibW91c2Vkb3duLmRyYWciLHApLmZpbHRlcihmKS5vbigidG91Y2hzdGFydC5kcmFnIix5KS5vbigidG91Y2htb3ZlLmRyYWciLF8pLm9uKCJ0b3VjaGVuZC5kcmFnIHRvdWNoY2FuY2VsLmRyYWciLGIpLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBwKCl7aWYoIWkmJm8uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdT1tKCJtb3VzZSIsYS5hcHBseSh0aGlzLGFyZ3VtZW50cyksRnQsdGhpcyxhcmd1bWVudHMpO3UmJihEdCh0LmV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyIsdiwhMCkub24oIm1vdXNldXAuZHJhZyIsZywhMCksWHQodC5ldmVudC52aWV3KSxIdCgpLHI9ITEsbj10LmV2ZW50LmNsaWVudFgsZT10LmV2ZW50LmNsaWVudFksdSgic3RhcnQiKSl9fWZ1bmN0aW9uIHYoKXtpZihqdCgpLCFyKXt2YXIgaT10LmV2ZW50LmNsaWVudFgtbixvPXQuZXZlbnQuY2xpZW50WS1lO3I9aSppK28qbz5ofWMubW91c2UoImRyYWciKX1mdW5jdGlvbiBnKCl7RHQodC5ldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWcgbW91c2V1cC5kcmFnIixudWxsKSxHdCh0LmV2ZW50LnZpZXcsciksanQoKSxjLm1vdXNlKCJlbmQiKX1mdW5jdGlvbiB5KCl7aWYoby5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9YS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdT1yLmxlbmd0aDtmb3Iobj0wO248dTsrK24pKGU9bShyW25dLmlkZW50aWZpZXIsaSxJdCx0aGlzLGFyZ3VtZW50cykpJiYoSHQoKSxlKCJzdGFydCIpKX19ZnVuY3Rpb24gXygpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLGk9ci5sZW5ndGg7Zm9yKG49MDtuPGk7KytuKShlPWNbcltuXS5pZGVudGlmaWVyXSkmJihqdCgpLGUoImRyYWciKSl9ZnVuY3Rpb24gYigpe3ZhciBuLGUscj10LmV2ZW50LmNoYW5nZWRUb3VjaGVzLG89ci5sZW5ndGg7Zm9yKGkmJmNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpPW51bGx9LDUwMCksbj0wO248bzsrK24pKGU9Y1tyW25dLmlkZW50aWZpZXJdKSYmKEh0KCksZSgiZW5kIikpfWZ1bmN0aW9uIG0obixlLHIsaSxvKXt2YXIgYSxmLGgscD1yKGUsbiksdj1zLmNvcHkoKTtpZihDdChuZXcgJHQoZCwiYmVmb3Jlc3RhcnQiLGEsbixsLHBbMF0scFsxXSwwLDAsdiksZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KHQuZXZlbnQuc3ViamVjdD1hPXUuYXBwbHkoaSxvKSkmJihmPWEueC1wWzBdfHwwLGg9YS55LXBbMV18fDAsITApfSkpcmV0dXJuIGZ1bmN0aW9uIHQodSl7dmFyIHMsZz1wO3N3aXRjaCh1KXtjYXNlInN0YXJ0IjpjW25dPXQscz1sKys7YnJlYWs7Y2FzZSJlbmQiOmRlbGV0ZSBjW25dLC0tbDtjYXNlImRyYWciOnA9cihlLG4pLHM9bH1DdChuZXcgJHQoZCx1LGEsbixzLHBbMF0rZixwWzFdK2gscFswXS1nWzBdLHBbMV0tZ1sxXSx2KSx2LmFwcGx5LHYsW3UsaSxvXSl9fXJldHVybiBkLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ0KCEhdCksZCk6b30sZC5jb250YWluZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCh0KSxkKTphfSxkLnN1YmplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpWdCh0KSxkKTp1fSxkLnRvdWNoYWJsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlZ0KCEhdCksZCk6Zn0sZC5vbj1mdW5jdGlvbigpe3ZhciB0PXMub24uYXBwbHkocyxhcmd1bWVudHMpO3JldHVybiB0PT09cz9kOnR9LGQuY2xpY2tEaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0odD0rdCkqdCxkKTpNYXRoLnNxcnQoaCl9LGR9LHQuZHJhZ0Rpc2FibGU9WHQsdC5kcmFnRW5hYmxlPUd0LHQuZHN2Rm9ybWF0PUVvLHQuY3N2UGFyc2U9Q28sdC5jc3ZQYXJzZVJvd3M9UG8sdC5jc3ZGb3JtYXQ9em8sdC5jc3ZGb3JtYXRSb3dzPVJvLHQudHN2UGFyc2U9RG8sdC50c3ZQYXJzZVJvd3M9VW8sdC50c3ZGb3JtYXQ9cW8sdC50c3ZGb3JtYXRSb3dzPU9vLHQuZWFzZUxpbmVhcj1mdW5jdGlvbih0KXtyZXR1cm4rdH0sdC5lYXNlUXVhZD1Ecix0LmVhc2VRdWFkSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqdH0sdC5lYXNlUXVhZE91dD1mdW5jdGlvbih0KXtyZXR1cm4gdCooMi10KX0sdC5lYXNlUXVhZEluT3V0PURyLHQuZWFzZUN1YmljPVVyLHQuZWFzZUN1YmljSW49ZnVuY3Rpb24odCl7cmV0dXJuIHQqdCp0fSx0LmVhc2VDdWJpY091dD1mdW5jdGlvbih0KXtyZXR1cm4tLXQqdCp0KzF9LHQuZWFzZUN1YmljSW5PdXQ9VXIsdC5lYXNlUG9seT1Zcix0LmVhc2VQb2x5SW49cXIsdC5lYXNlUG9seU91dD1Pcix0LmVhc2VQb2x5SW5PdXQ9WXIsdC5lYXNlU2luPUlyLHQuZWFzZVNpbkluPWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguY29zKHQqRnIpfSx0LmVhc2VTaW5PdXQ9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc2luKHQqRnIpfSx0LmVhc2VTaW5Jbk91dD1Jcix0LmVhc2VFeHA9SHIsdC5lYXNlRXhwSW49ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucG93KDIsMTAqdC0xMCl9LHQuZWFzZUV4cE91dD1mdW5jdGlvbih0KXtyZXR1cm4gMS1NYXRoLnBvdygyLC0xMCp0KX0sdC5lYXNlRXhwSW5PdXQ9SHIsdC5lYXNlQ2lyY2xlPWpyLHQuZWFzZUNpcmNsZUluPWZ1bmN0aW9uKHQpe3JldHVybiAxLU1hdGguc3FydCgxLXQqdCl9LHQuZWFzZUNpcmNsZU91dD1mdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5zcXJ0KDEtIC0tdCp0KX0sdC5lYXNlQ2lyY2xlSW5PdXQ9anIsdC5lYXNlQm91bmNlPW5pLHQuZWFzZUJvdW5jZUluPWZ1bmN0aW9uKHQpe3JldHVybiAxLW5pKDEtdCl9LHQuZWFzZUJvdW5jZU91dD1uaSx0LmVhc2VCb3VuY2VJbk91dD1mdW5jdGlvbih0KXtyZXR1cm4oKHQqPTIpPD0xPzEtbmkoMS10KTpuaSh0LTEpKzEpLzJ9LHQuZWFzZUJhY2s9aWksdC5lYXNlQmFja0luPWVpLHQuZWFzZUJhY2tPdXQ9cmksdC5lYXNlQmFja0luT3V0PWlpLHQuZWFzZUVsYXN0aWM9dWksdC5lYXNlRWxhc3RpY0luPWFpLHQuZWFzZUVsYXN0aWNPdXQ9dWksdC5lYXNlRWxhc3RpY0luT3V0PWZpLHQuYmxvYj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oWW8pfSx0LmJ1ZmZlcj1mdW5jdGlvbih0LG4pe3JldHVybiBmZXRjaCh0LG4pLnRoZW4oQm8pfSx0LmRzdj1mdW5jdGlvbih0LG4sZSxyKXszPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIGUmJihyPWUsZT12b2lkIDApO3ZhciBpPUVvKHQpO3JldHVybiBJbyhuLGUpLnRoZW4oZnVuY3Rpb24odCl7cmV0dXJuIGkucGFyc2UodCxyKX0pfSx0LmNzdj1qbyx0LnRzdj1Ybyx0LmltYWdlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUscil7dmFyIGk9bmV3IEltYWdlO2Zvcih2YXIgbyBpbiBuKWlbb109bltvXTtpLm9uZXJyb3I9cixpLm9ubG9hZD1mdW5jdGlvbigpe2UoaSl9LGkuc3JjPXR9KX0sdC5qc29uPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGZldGNoKHQsbikudGhlbihHbyl9LHQudGV4dD1Jbyx0LnhtbD0kbyx0Lmh0bWw9V28sdC5zdmc9Wm8sdC5mb3JjZUNlbnRlcj1mdW5jdGlvbih0LG4pe3ZhciBlO2Z1bmN0aW9uIHIoKXt2YXIgcixpLG89ZS5sZW5ndGgsYT0wLHU9MDtmb3Iocj0wO3I8bzsrK3IpYSs9KGk9ZVtyXSkueCx1Kz1pLnk7Zm9yKGE9YS9vLXQsdT11L28tbixyPTA7cjxvOysrcikoaT1lW3JdKS54LT1hLGkueS09dX1yZXR1cm4gbnVsbD09dCYmKHQ9MCksbnVsbD09biYmKG49MCksci5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2U9dH0sci54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStuLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCxyKTpufSxyfSx0LmZvcmNlQ29sbGlkZT1mdW5jdGlvbih0KXt2YXIgbixlLHI9MSxpPTE7ZnVuY3Rpb24gbygpe2Zvcih2YXIgdCxvLHUsZixjLHMsbCxoPW4ubGVuZ3RoLGQ9MDtkPGk7KytkKWZvcihvPXJhKG4sdWEsZmEpLnZpc2l0QWZ0ZXIoYSksdD0wO3Q8aDsrK3QpdT1uW3RdLHM9ZVt1LmluZGV4XSxsPXMqcyxmPXUueCt1LnZ4LGM9dS55K3Uudnksby52aXNpdChwKTtmdW5jdGlvbiBwKHQsbixlLGksbyl7dmFyIGE9dC5kYXRhLGg9dC5yLGQ9cytoO2lmKCFhKXJldHVybiBuPmYrZHx8aTxmLWR8fGU+YytkfHxvPGMtZDtpZihhLmluZGV4PnUuaW5kZXgpe3ZhciBwPWYtYS54LWEudngsdj1jLWEueS1hLnZ5LGc9cCpwK3YqdjtnPGQqZCYmKDA9PT1wJiYoZys9KHA9Sm8oKSkqcCksMD09PXYmJihnKz0odj1KbygpKSp2KSxnPShkLShnPU1hdGguc3FydChnKSkpL2cqcix1LnZ4Kz0ocCo9ZykqKGQ9KGgqPWgpLyhsK2gpKSx1LnZ5Kz0odio9ZykqZCxhLnZ4LT1wKihkPTEtZCksYS52eS09dipkKX19fWZ1bmN0aW9uIGEodCl7aWYodC5kYXRhKXJldHVybiB0LnI9ZVt0LmRhdGEuaW5kZXhdO2Zvcih2YXIgbj10LnI9MDtuPDQ7KytuKXRbbl0mJnRbbl0ucj50LnImJih0LnI9dFtuXS5yKX1mdW5jdGlvbiB1KCl7aWYobil7dmFyIHIsaSxvPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShvKSxyPTA7cjxvOysrcilpPW5bcl0sZVtpLmluZGV4XT0rdChpLHIsbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzE6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LHUoKX0sby5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG8pOml9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3Qsbyk6cn0sby5yYWRpdXM9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksdSgpLG8pOnR9LG99LHQuZm9yY2VMaW5rPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpLG8sYT1jYSx1PWZ1bmN0aW9uKHQpe3JldHVybiAxL01hdGgubWluKGlbdC5zb3VyY2UuaW5kZXhdLGlbdC50YXJnZXQuaW5kZXhdKX0sZj1RbygzMCksYz0xO2Z1bmN0aW9uIHMocil7Zm9yKHZhciBpPTAsYT10Lmxlbmd0aDtpPGM7KytpKWZvcih2YXIgdSxmLHMsbCxoLGQscCx2PTA7djxhOysrdilmPSh1PXRbdl0pLnNvdXJjZSxsPShzPXUudGFyZ2V0KS54K3MudngtZi54LWYudnh8fEpvKCksaD1zLnkrcy52eS1mLnktZi52eXx8Sm8oKSxsKj1kPSgoZD1NYXRoLnNxcnQobCpsK2gqaCkpLWVbdl0pL2QqcipuW3ZdLGgqPWQscy52eC09bCoocD1vW3ZdKSxzLnZ5LT1oKnAsZi52eCs9bCoocD0xLXApLGYudnkrPWgqcH1mdW5jdGlvbiBsKCl7aWYocil7dmFyIHUsZixjPXIubGVuZ3RoLHM9dC5sZW5ndGgsbD1LaShyLGEpO2Zvcih1PTAsaT1uZXcgQXJyYXkoYyk7dTxzOysrdSkoZj10W3VdKS5pbmRleD11LCJvYmplY3QiIT10eXBlb2YgZi5zb3VyY2UmJihmLnNvdXJjZT1zYShsLGYuc291cmNlKSksIm9iamVjdCIhPXR5cGVvZiBmLnRhcmdldCYmKGYudGFyZ2V0PXNhKGwsZi50YXJnZXQpKSxpW2Yuc291cmNlLmluZGV4XT0oaVtmLnNvdXJjZS5pbmRleF18fDApKzEsaVtmLnRhcmdldC5pbmRleF09KGlbZi50YXJnZXQuaW5kZXhdfHwwKSsxO2Zvcih1PTAsbz1uZXcgQXJyYXkocyk7dTxzOysrdSlmPXRbdV0sb1t1XT1pW2Yuc291cmNlLmluZGV4XS8oaVtmLnNvdXJjZS5pbmRleF0raVtmLnRhcmdldC5pbmRleF0pO249bmV3IEFycmF5KHMpLGgoKSxlPW5ldyBBcnJheShzKSxkKCl9fWZ1bmN0aW9uIGgoKXtpZihyKWZvcih2YXIgZT0wLGk9dC5sZW5ndGg7ZTxpOysrZSluW2VdPSt1KHRbZV0sZSx0KX1mdW5jdGlvbiBkKCl7aWYocilmb3IodmFyIG49MCxpPXQubGVuZ3RoO248aTsrK24pZVtuXT0rZih0W25dLG4sdCl9cmV0dXJuIG51bGw9PXQmJih0PVtdKSxzLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7cj10LGwoKX0scy5saW5rcz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1uLGwoKSxzKTp0fSxzLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQscyk6YX0scy5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSt0LHMpOmN9LHMuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksaCgpLHMpOnV9LHMuZGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRbygrdCksZCgpLHMpOmZ9LHN9LHQuZm9yY2VNYW55Qm9keT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGk9UW8oLTMwKSxvPTEsYT0xLzAsdT0uODE7ZnVuY3Rpb24gZihyKXt2YXIgaSxvPXQubGVuZ3RoLGE9cmEodCxsYSxoYSkudmlzaXRBZnRlcihzKTtmb3IoZT1yLGk9MDtpPG87KytpKW49dFtpXSxhLnZpc2l0KGwpfWZ1bmN0aW9uIGMoKXtpZih0KXt2YXIgbixlLG89dC5sZW5ndGg7Zm9yKHI9bmV3IEFycmF5KG8pLG49MDtuPG87KytuKWU9dFtuXSxyW2UuaW5kZXhdPStpKGUsbix0KX19ZnVuY3Rpb24gcyh0KXt2YXIgbixlLGksbyxhLHU9MCxmPTA7aWYodC5sZW5ndGgpe2ZvcihpPW89YT0wO2E8NDsrK2EpKG49dFthXSkmJihlPU1hdGguYWJzKG4udmFsdWUpKSYmKHUrPW4udmFsdWUsZis9ZSxpKz1lKm4ueCxvKz1lKm4ueSk7dC54PWkvZix0Lnk9by9mfWVsc2V7KG49dCkueD1uLmRhdGEueCxuLnk9bi5kYXRhLnk7ZG97dSs9cltuLmRhdGEuaW5kZXhdfXdoaWxlKG49bi5uZXh0KX10LnZhbHVlPXV9ZnVuY3Rpb24gbCh0LGksZixjKXtpZighdC52YWx1ZSlyZXR1cm4hMDt2YXIgcz10Lngtbi54LGw9dC55LW4ueSxoPWMtaSxkPXMqcytsKmw7aWYoaCpoL3U8ZClyZXR1cm4gZDxhJiYoMD09PXMmJihkKz0ocz1KbygpKSpzKSwwPT09bCYmKGQrPShsPUpvKCkpKmwpLGQ8byYmKGQ9TWF0aC5zcXJ0KG8qZCkpLG4udngrPXMqdC52YWx1ZSplL2Qsbi52eSs9bCp0LnZhbHVlKmUvZCksITA7aWYoISh0Lmxlbmd0aHx8ZD49YSkpeyh0LmRhdGEhPT1ufHx0Lm5leHQpJiYoMD09PXMmJihkKz0ocz1KbygpKSpzKSwwPT09bCYmKGQrPShsPUpvKCkpKmwpLGQ8byYmKGQ9TWF0aC5zcXJ0KG8qZCkpKTtkb3t0LmRhdGEhPT1uJiYoaD1yW3QuZGF0YS5pbmRleF0qZS9kLG4udngrPXMqaCxuLnZ5Kz1sKmgpfXdoaWxlKHQ9dC5uZXh0KX19cmV0dXJuIGYuaW5pdGlhbGl6ZT1mdW5jdGlvbihuKXt0PW4sYygpfSxmLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGMoKSxmKTppfSxmLmRpc3RhbmNlTWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQqdCxmKTpNYXRoLnNxcnQobyl9LGYuZGlzdGFuY2VNYXg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCp0LGYpOk1hdGguc3FydChhKX0sZi50aGV0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10KnQsZik6TWF0aC5zcXJ0KHUpfSxmfSx0LmZvcmNlUmFkaWFsPWZ1bmN0aW9uKHQsbixlKXt2YXIgcixpLG8sYT1RbyguMSk7ZnVuY3Rpb24gdSh0KXtmb3IodmFyIGE9MCx1PXIubGVuZ3RoO2E8dTsrK2Epe3ZhciBmPXJbYV0sYz1mLngtbnx8MWUtNixzPWYueS1lfHwxZS02LGw9TWF0aC5zcXJ0KGMqYytzKnMpLGg9KG9bYV0tbCkqaVthXSp0L2w7Zi52eCs9YypoLGYudnkrPXMqaH19ZnVuY3Rpb24gZigpe2lmKHIpe3ZhciBuLGU9ci5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KGUpLG89bmV3IEFycmF5KGUpLG49MDtuPGU7KytuKW9bbl09K3QocltuXSxuLHIpLGlbbl09aXNOYU4ob1tuXSk/MDorYShyW25dLG4scil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbygrdCkpLG51bGw9PW4mJihuPTApLG51bGw9PWUmJihlPTApLHUuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtyPXQsZigpfSx1LnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGYoKSx1KTphfSx1LnJhZGl1cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlFvKCtuKSxmKCksdSk6dH0sdS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LHUpOm59LHUueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCx1KTplfSx1fSx0LmZvcmNlU2ltdWxhdGlvbj1mdW5jdGlvbih0KXt2YXIgbixlPTEscj0uMDAxLGk9MS1NYXRoLnBvdyhyLDEvMzAwKSxvPTAsYT0uNix1PUtpKCksZj11cihzKSxjPUkoInRpY2siLCJlbmQiKTtmdW5jdGlvbiBzKCl7bCgpLGMuY2FsbCgidGljayIsbiksZTxyJiYoZi5zdG9wKCksYy5jYWxsKCJlbmQiLG4pKX1mdW5jdGlvbiBsKCl7dmFyIG4scixmPXQubGVuZ3RoO2ZvcihlKz0oby1lKSppLHUuZWFjaChmdW5jdGlvbih0KXt0KGUpfSksbj0wO248ZjsrK24pbnVsbD09KHI9dFtuXSkuZng/ci54Kz1yLnZ4Kj1hOihyLng9ci5meCxyLnZ4PTApLG51bGw9PXIuZnk/ci55Kz1yLnZ5Kj1hOihyLnk9ci5meSxyLnZ5PTApfWZ1bmN0aW9uIGgoKXtmb3IodmFyIG4sZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSl7aWYoKG49dFtlXSkuaW5kZXg9ZSxpc05hTihuLngpfHxpc05hTihuLnkpKXt2YXIgaT1kYSpNYXRoLnNxcnQoZSksbz1lKnBhO24ueD1pKk1hdGguY29zKG8pLG4ueT1pKk1hdGguc2luKG8pfShpc05hTihuLnZ4KXx8aXNOYU4obi52eSkpJiYobi52eD1uLnZ5PTApfX1mdW5jdGlvbiBkKG4pe3JldHVybiBuLmluaXRpYWxpemUmJm4uaW5pdGlhbGl6ZSh0KSxufXJldHVybiBudWxsPT10JiYodD1bXSksaCgpLG49e3RpY2s6bCxyZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIGYucmVzdGFydChzKSxufSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIGYuc3RvcCgpLG59LG5vZGVzOmZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsaCgpLHUuZWFjaChkKSxuKTp0fSxhbHBoYTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxuKTplfSxhbHBoYU1pbjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0rdCxuKTpyfSxhbHBoYURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LG4pOitpfSxhbHBoYVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxuKTpvfSx2ZWxvY2l0eURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPTEtdCxuKToxLWF9LGZvcmNlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09ZT91LnJlbW92ZSh0KTp1LnNldCh0LGQoZSkpLG4pOnUuZ2V0KHQpfSxmaW5kOmZ1bmN0aW9uKG4sZSxyKXt2YXIgaSxvLGEsdSxmLGM9MCxzPXQubGVuZ3RoO2ZvcihudWxsPT1yP3I9MS8wOnIqPXIsYz0wO2M8czsrK2MpKGE9KGk9bi0odT10W2NdKS54KSppKyhvPWUtdS55KSpvKTxyJiYoZj11LHI9YSk7cmV0dXJuIGZ9LG9uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8oYy5vbih0LGUpLG4pOmMub24odCl9fX0sdC5mb3JjZVg9ZnVuY3Rpb24odCl7dmFyIG4sZSxyLGk9UW8oLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciBpLG89MCxhPW4ubGVuZ3RoO288YTsrK28pKGk9bltvXSkudngrPShyW29dLWkueCkqZVtvXSp0fWZ1bmN0aW9uIGEoKXtpZihuKXt2YXIgbyxhPW4ubGVuZ3RoO2ZvcihlPW5ldyBBcnJheShhKSxyPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyllW29dPWlzTmFOKHJbb109K3QobltvXSxvLG4pKT8wOitpKG5bb10sbyxuKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVFvKG51bGw9PXQ/MDordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtuPXQsYSgpfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UW8oK3QpLGEoKSxvKTppfSxvLng9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpRbygrbiksYSgpLG8pOnR9LG99LHQuZm9yY2VZPWZ1bmN0aW9uKHQpe3ZhciBuLGUscixpPVFvKC4xKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgaSxvPTAsYT1uLmxlbmd0aDtvPGE7KytvKShpPW5bb10pLnZ5Kz0ocltvXS1pLnkpKmVbb10qdH1mdW5jdGlvbiBhKCl7aWYobil7dmFyIG8sYT1uLmxlbmd0aDtmb3IoZT1uZXcgQXJyYXkoYSkscj1uZXcgQXJyYXkoYSksbz0wO288YTsrK28pZVtvXT1pc05hTihyW29dPSt0KG5bb10sbyxuKSk/MDoraShuW29dLG8sbil9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbyhudWxsPT10PzA6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7bj10LGEoKX0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFvKCt0KSxhKCksbyk6aX0sby55PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UW8oK24pLGEoKSxvKTp0fSxvfSx0LmZvcm1hdERlZmF1bHRMb2NhbGU9U2EsdC5mb3JtYXRMb2NhbGU9TmEsdC5mb3JtYXRTcGVjaWZpZXI9YmEsdC5wcmVjaXNpb25GaXhlZD1FYSx0LnByZWNpc2lvblByZWZpeD1rYSx0LnByZWNpc2lvblJvdW5kPUNhLHQuZ2VvQXJlYT1mdW5jdGlvbih0KXtyZXR1cm4geXUucmVzZXQoKSxzdSh0LF91KSwyKnl1fSx0Lmdlb0JvdW5kcz1mdW5jdGlvbih0KXt2YXIgbixlLHIsaSxvLGEsdTtpZihSdT16dT0tKEN1PVB1PTEvMCksT3U9W10sc3UodCxyZiksZT1PdS5sZW5ndGgpe2ZvcihPdS5zb3J0KGRmKSxuPTEsbz1bcj1PdVswXV07bjxlOysrbilwZihyLChpPU91W25dKVswXSl8fHBmKHIsaVsxXSk/KGhmKHJbMF0saVsxXSk+aGYoclswXSxyWzFdKSYmKHJbMV09aVsxXSksaGYoaVswXSxyWzFdKT5oZihyWzBdLHJbMV0pJiYoclswXT1pWzBdKSk6by5wdXNoKHI9aSk7Zm9yKGE9LTEvMCxuPTAscj1vW2U9by5sZW5ndGgtMV07bjw9ZTtyPWksKytuKWk9b1tuXSwodT1oZihyWzFdLGlbMF0pKT5hJiYoYT11LEN1PWlbMF0senU9clsxXSl9cmV0dXJuIE91PVl1PW51bGwsQ3U9PT0xLzB8fFB1PT09MS8wP1tbTmFOLE5hTl0sW05hTixOYU5dXTpbW0N1LFB1XSxbenUsUnVdXX0sdC5nZW9DZW50cm9pZD1mdW5jdGlvbih0KXtCdT1GdT1JdT1IdT1qdT1YdT1HdT1WdT0kdT1XdT1adT0wLHN1KHQsdmYpO3ZhciBuPSR1LGU9V3Uscj1adSxpPW4qbitlKmUrcipyO3JldHVybiBpPFVhJiYobj1YdSxlPUd1LHI9VnUsRnU8RGEmJihuPUl1LGU9SHUscj1qdSksKGk9bipuK2UqZStyKnIpPFVhKT9bTmFOLE5hTl06W1hhKGUsbikqRmEsZXUoci9LYShpKSkqRmFdfSx0Lmdlb0NpcmNsZT1mdW5jdGlvbigpe3ZhciB0LG4sZT1OZihbMCwwXSkscj1OZig5MCksaT1OZig2KSxvPXtwb2ludDpmdW5jdGlvbihlLHIpe3QucHVzaChlPW4oZSxyKSksZVswXSo9RmEsZVsxXSo9RmF9fTtmdW5jdGlvbiBhKCl7dmFyIGE9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksdT1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpJYSxmPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpKklhO3JldHVybiB0PVtdLG49a2YoLWFbMF0qSWEsLWFbMV0qSWEsMCkuaW52ZXJ0LExmKG8sdSxmLDEpLGE9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOlt0XX0sdD1uPW51bGwsYX1yZXR1cm4gYS5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpOZihbK3RbMF0sK3RbMV1dKSxhKTplfSxhLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5mKCt0KSxhKTpyfSxhLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5mKCt0KSxhKTppfSxhfSx0Lmdlb0NsaXBBbnRpbWVyaWRpYW49R2YsdC5nZW9DbGlwQ2lyY2xlPVZmLHQuZ2VvQ2xpcEV4dGVudD1mdW5jdGlvbigpe3ZhciB0LG4sZSxyPTAsaT0wLG89OTYwLGE9NTAwO3JldHVybiBlPXtzdHJlYW06ZnVuY3Rpb24oZSl7cmV0dXJuIHQmJm49PT1lP3Q6dD1aZihyLGksbyxhKShuPWUpfSxleHRlbnQ6ZnVuY3Rpb24odSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3VbMF1bMF0saT0rdVswXVsxXSxvPSt1WzFdWzBdLGE9K3VbMV1bMV0sdD1uPW51bGwsZSk6W1tyLGldLFtvLGFdXX19fSx0Lmdlb0NsaXBSZWN0YW5nbGU9WmYsdC5nZW9Db250YWlucz1mdW5jdGlvbih0LG4pe3JldHVybih0JiZjYy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP2NjW3QudHlwZV06bGMpKHQsbil9LHQuZ2VvRGlzdGFuY2U9ZmMsdC5nZW9HcmF0aWN1bGU9YmMsdC5nZW9HcmF0aWN1bGUxMD1mdW5jdGlvbigpe3JldHVybiBiYygpKCl9LHQuZ2VvSW50ZXJwb2xhdGU9ZnVuY3Rpb24odCxuKXt2YXIgZT10WzBdKklhLHI9dFsxXSpJYSxpPW5bMF0qSWEsbz1uWzFdKklhLGE9R2EociksdT1RYShyKSxmPUdhKG8pLGM9UWEobykscz1hKkdhKGUpLGw9YSpRYShlKSxoPWYqR2EoaSksZD1mKlFhKGkpLHA9MipldShLYShydShvLXIpK2EqZipydShpLWUpKSksdj1RYShwKSxnPXA/ZnVuY3Rpb24odCl7dmFyIG49UWEodCo9cCkvdixlPVFhKHAtdCkvdixyPWUqcytuKmgsaT1lKmwrbipkLG89ZSp1K24qYztyZXR1cm5bWGEoaSxyKSpGYSxYYShvLEthKHIqcitpKmkpKSpGYV19OmZ1bmN0aW9uKCl7cmV0dXJuW2UqRmEscipGYV19O3JldHVybiBnLmRpc3RhbmNlPXAsZ30sdC5nZW9MZW5ndGg9b2MsdC5nZW9QYXRoPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPTQuNTtmdW5jdGlvbiBvKHQpe3JldHVybiB0JiYoImZ1bmN0aW9uIj09dHlwZW9mIGkmJnIucG9pbnRSYWRpdXMoK2kuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxzdSh0LGUocikpKSxyLnJlc3VsdCgpfXJldHVybiBvLmFyZWE9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShTYykpLFNjLnJlc3VsdCgpfSxvLm1lYXN1cmU9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShkcykpLGRzLnJlc3VsdCgpfSxvLmJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gc3UodCxlKFVjKSksVWMucmVzdWx0KCl9LG8uY2VudHJvaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIHN1KHQsZShaYykpLFpjLnJlc3VsdCgpfSxvLnByb2plY3Rpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09bj8odD1udWxsLG1jKToodD1uKS5zdHJlYW0sbyk6dH0sby5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPW51bGw9PXQ/KG49bnVsbCxuZXcgZ3MpOm5ldyBhcyhuPXQpLCJmdW5jdGlvbiIhPXR5cGVvZiBpJiZyLnBvaW50UmFkaXVzKGkpLG8pOm59LG8ucG9pbnRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDooci5wb2ludFJhZGl1cygrdCksK3QpLG8pOml9LG8ucHJvamVjdGlvbih0KS5jb250ZXh0KG4pfSx0Lmdlb0FsYmVycz1Ecyx0Lmdlb0FsYmVyc1VzYT1mdW5jdGlvbigpe3ZhciB0LG4sZSxyLGksbyxhPURzKCksdT1McygpLnJvdGF0ZShbMTU0LDBdKS5jZW50ZXIoWy0yLDU4LjVdKS5wYXJhbGxlbHMoWzU1LDY1XSksZj1McygpLnJvdGF0ZShbMTU3LDBdKS5jZW50ZXIoWy0zLDE5LjldKS5wYXJhbGxlbHMoWzgsMThdKSxjPXtwb2ludDpmdW5jdGlvbih0LG4pe289W3Qsbl19fTtmdW5jdGlvbiBzKHQpe3ZhciBuPXRbMF0sYT10WzFdO3JldHVybiBvPW51bGwsZS5wb2ludChuLGEpLG98fChyLnBvaW50KG4sYSksbyl8fChpLnBvaW50KG4sYSksbyl9ZnVuY3Rpb24gbCgpe3JldHVybiB0PW49bnVsbCxzfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0KXt2YXIgbj1hLnNjYWxlKCksZT1hLnRyYW5zbGF0ZSgpLHI9KHRbMF0tZVswXSkvbixpPSh0WzFdLWVbMV0pL247cmV0dXJuKGk+PS4xMiYmaTwuMjM0JiZyPj0tLjQyNSYmcjwtLjIxND91Omk+PS4xNjYmJmk8LjIzNCYmcj49LS4yMTQmJnI8LS4xMTU/ZjphKS5pbnZlcnQodCl9LHMuc3RyZWFtPWZ1bmN0aW9uKGUpe3JldHVybiB0JiZuPT09ZT90OihyPVthLnN0cmVhbShuPWUpLHUuc3RyZWFtKGUpLGYuc3RyZWFtKGUpXSxpPXIubGVuZ3RoLHQ9e3BvaW50OmZ1bmN0aW9uKHQsbil7Zm9yKHZhciBlPS0xOysrZTxpOylyW2VdLnBvaW50KHQsbil9LHNwaGVyZTpmdW5jdGlvbigpe2Zvcih2YXIgdD0tMTsrK3Q8aTspclt0XS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PS0xOysrdDxpOylyW3RdLnBvbHlnb25FbmQoKX19KTt2YXIgcixpfSxzLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5wcmVjaXNpb24odCksdS5wcmVjaXNpb24odCksZi5wcmVjaXNpb24odCksbCgpKTphLnByZWNpc2lvbigpfSxzLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhLnNjYWxlKHQpLHUuc2NhbGUoLjM1KnQpLGYuc2NhbGUodCkscy50cmFuc2xhdGUoYS50cmFuc2xhdGUoKSkpOmEuc2NhbGUoKX0scy50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGEudHJhbnNsYXRlKCk7dmFyIG49YS5zY2FsZSgpLG89K3RbMF0scz0rdFsxXTtyZXR1cm4gZT1hLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbby0uNDU1Km4scy0uMjM4Km5dLFtvKy40NTUqbixzKy4yMzgqbl1dKS5zdHJlYW0oYykscj11LnRyYW5zbGF0ZShbby0uMzA3Km4scysuMjAxKm5dKS5jbGlwRXh0ZW50KFtbby0uNDI1Km4rRGEscysuMTIqbitEYV0sW28tLjIxNCpuLURhLHMrLjIzNCpuLURhXV0pLnN0cmVhbShjKSxpPWYudHJhbnNsYXRlKFtvLS4yMDUqbixzKy4yMTIqbl0pLmNsaXBFeHRlbnQoW1tvLS4yMTQqbitEYSxzKy4xNjYqbitEYV0sW28tLjExNSpuLURhLHMrLjIzNCpuLURhXV0pLnN0cmVhbShjKSxsKCl9LHMuZml0RXh0ZW50PWZ1bmN0aW9uKHQsbil7cmV0dXJuIHhzKHMsdCxuKX0scy5maXRTaXplPWZ1bmN0aW9uKHQsbil7cmV0dXJuIHdzKHMsdCxuKX0scy5maXRXaWR0aD1mdW5jdGlvbih0LG4pe3JldHVybiBNcyhzLHQsbil9LHMuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIEFzKHMsdCxuKX0scy5zY2FsZSgxMDcwKX0sdC5nZW9BemltdXRoYWxFcXVhbEFyZWE9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MoT3MpLnNjYWxlKDEyNC43NSkuY2xpcEFuZ2xlKDE3OS45OTkpfSx0Lmdlb0F6aW11dGhhbEVxdWFsQXJlYVJhdz1Pcyx0Lmdlb0F6aW11dGhhbEVxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIENzKFlzKS5zY2FsZSg3OS40MTg4KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LHQuZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnRSYXc9WXMsdC5nZW9Db25pY0NvbmZvcm1hbD1mdW5jdGlvbigpe3JldHVybiB6cyhIcykuc2NhbGUoMTA5LjUpLnBhcmFsbGVscyhbMzAsMzBdKX0sdC5nZW9Db25pY0NvbmZvcm1hbFJhdz1Icyx0Lmdlb0NvbmljRXF1YWxBcmVhPUxzLHQuZ2VvQ29uaWNFcXVhbEFyZWFSYXc9UnMsdC5nZW9Db25pY0VxdWlkaXN0YW50PWZ1bmN0aW9uKCl7cmV0dXJuIHpzKFhzKS5zY2FsZSgxMzEuMTU0KS5jZW50ZXIoWzAsMTMuOTM4OV0pfSx0Lmdlb0NvbmljRXF1aWRpc3RhbnRSYXc9WHMsdC5nZW9FcXVhbEVhcnRoPWZ1bmN0aW9uKCl7cmV0dXJuIENzKFFzKS5zY2FsZSgxNzcuMTU4KX0sdC5nZW9FcXVhbEVhcnRoUmF3PVFzLHQuZ2VvRXF1aXJlY3Rhbmd1bGFyPWZ1bmN0aW9uKCl7cmV0dXJuIENzKGpzKS5zY2FsZSgxNTIuNjMpfSx0Lmdlb0VxdWlyZWN0YW5ndWxhclJhdz1qcyx0Lmdlb0dub21vbmljPWZ1bmN0aW9uKCl7cmV0dXJuIENzKEpzKS5zY2FsZSgxNDQuMDQ5KS5jbGlwQW5nbGUoNjApfSx0Lmdlb0dub21vbmljUmF3PUpzLHQuZ2VvSWRlbnRpdHk9ZnVuY3Rpb24oKXt2YXIgdCxuLGUscixpLG8sYT0xLHU9MCxmPTAsYz0xLHM9MSxsPW1jLGg9bnVsbCxkPW1jO2Z1bmN0aW9uIHAoKXtyZXR1cm4gcj1pPW51bGwsb31yZXR1cm4gbz17c3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiByJiZpPT09dD9yOnI9bChkKGk9dCkpfSxwb3N0Y2xpcDpmdW5jdGlvbihyKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD1yLGg9dD1uPWU9bnVsbCxwKCkpOmR9LGNsaXBFeHRlbnQ6ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9bnVsbD09cj8oaD10PW49ZT1udWxsLG1jKTpaZihoPStyWzBdWzBdLHQ9K3JbMF1bMV0sbj0rclsxXVswXSxlPStyWzFdWzFdKSxwKCkpOm51bGw9PWg/bnVsbDpbW2gsdF0sW24sZV1dfSxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcygoYT0rdCkqYyxhKnMsdSxmKSxwKCkpOmF9LHRyYW5zbGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcyhhKmMsYSpzLHU9K3RbMF0sZj0rdFsxXSkscCgpKTpbdSxmXX0scmVmbGVjdFg6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9S3MoYSooYz10Py0xOjEpLGEqcyx1LGYpLHAoKSk6YzwwfSxyZWZsZWN0WTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD1LcyhhKmMsYSoocz10Py0xOjEpLHUsZikscCgpKTpzPDB9LGZpdEV4dGVudDpmdW5jdGlvbih0LG4pe3JldHVybiB4cyhvLHQsbil9LGZpdFNpemU6ZnVuY3Rpb24odCxuKXtyZXR1cm4gd3Mobyx0LG4pfSxmaXRXaWR0aDpmdW5jdGlvbih0LG4pe3JldHVybiBNcyhvLHQsbil9LGZpdEhlaWdodDpmdW5jdGlvbih0LG4pe3JldHVybiBBcyhvLHQsbil9fX0sdC5nZW9Qcm9qZWN0aW9uPUNzLHQuZ2VvUHJvamVjdGlvbk11dGF0b3I9UHMsdC5nZW9NZXJjYXRvcj1mdW5jdGlvbigpe3JldHVybiBGcyhCcykuc2NhbGUoOTYxL0JhKX0sdC5nZW9NZXJjYXRvclJhdz1Ccyx0Lmdlb05hdHVyYWxFYXJ0aDE9ZnVuY3Rpb24oKXtyZXR1cm4gQ3ModGwpLnNjYWxlKDE3NS4yOTUpfSx0Lmdlb05hdHVyYWxFYXJ0aDFSYXc9dGwsdC5nZW9PcnRob2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MobmwpLnNjYWxlKDI0OS41KS5jbGlwQW5nbGUoOTArRGEpfSx0Lmdlb09ydGhvZ3JhcGhpY1Jhdz1ubCx0Lmdlb1N0ZXJlb2dyYXBoaWM9ZnVuY3Rpb24oKXtyZXR1cm4gQ3MoZWwpLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9LHQuZ2VvU3RlcmVvZ3JhcGhpY1Jhdz1lbCx0Lmdlb1RyYW5zdmVyc2VNZXJjYXRvcj1mdW5jdGlvbigpe3ZhciB0PUZzKHJsKSxuPXQuY2VudGVyLGU9dC5yb3RhdGU7cmV0dXJuIHQuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP24oWy10WzFdLHRbMF1dKTpbKHQ9bigpKVsxXSwtdFswXV19LHQucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoW3RbMF0sdFsxXSx0Lmxlbmd0aD4yP3RbMl0rOTA6OTBdKTpbKHQ9ZSgpKVswXSx0WzFdLHRbMl0tOTBdfSxlKFswLDAsOTBdKS5zY2FsZSgxNTkuMTU1KX0sdC5nZW9UcmFuc3ZlcnNlTWVyY2F0b3JSYXc9cmwsdC5nZW9Sb3RhdGlvbj1SZix0Lmdlb1N0cmVhbT1zdSx0Lmdlb1RyYW5zZm9ybT1mdW5jdGlvbih0KXtyZXR1cm57c3RyZWFtOl9zKHQpfX0sdC5jbHVzdGVyPWZ1bmN0aW9uKCl7dmFyIHQ9aWwsbj0xLGU9MSxyPSExO2Z1bmN0aW9uIGkoaSl7dmFyIG8sYT0wO2kuZWFjaEFmdGVyKGZ1bmN0aW9uKG4pe3ZhciBlPW4uY2hpbGRyZW47ZT8obi54PWZ1bmN0aW9uKHQpe3JldHVybiB0LnJlZHVjZShvbCwwKS90Lmxlbmd0aH0oZSksbi55PWZ1bmN0aW9uKHQpe3JldHVybiAxK3QucmVkdWNlKGFsLDApfShlKSk6KG4ueD1vP2ErPXQobixvKTowLG4ueT0wLG89bil9KTt2YXIgdT1mdW5jdGlvbih0KXtmb3IodmFyIG47bj10LmNoaWxkcmVuOyl0PW5bMF07cmV0dXJuIHR9KGkpLGY9ZnVuY3Rpb24odCl7Zm9yKHZhciBuO249dC5jaGlsZHJlbjspdD1uW24ubGVuZ3RoLTFdO3JldHVybiB0fShpKSxjPXUueC10KHUsZikvMixzPWYueCt0KGYsdSkvMjtyZXR1cm4gaS5lYWNoQWZ0ZXIocj9mdW5jdGlvbih0KXt0Lng9KHQueC1pLngpKm4sdC55PShpLnktdC55KSplfTpmdW5jdGlvbih0KXt0Lng9KHQueC1jKS8ocy1jKSpuLHQueT0oMS0oaS55P3QueS9pLnk6MSkpKmV9KX1yZXR1cm4gaS5zZXBhcmF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4saSk6dH0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSExLG49K3RbMF0sZT0rdFsxXSxpKTpyP251bGw6W24sZV19LGkubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITAsbj0rdFswXSxlPSt0WzFdLGkpOnI/W24sZV06bnVsbH0saX0sdC5oaWVyYXJjaHk9ZmwsdC5wYWNrPWZ1bmN0aW9uKCl7dmFyIHQ9bnVsbCxuPTEsZT0xLHI9RWw7ZnVuY3Rpb24gaShpKXtyZXR1cm4gaS54PW4vMixpLnk9ZS8yLHQ/aS5lYWNoQmVmb3JlKFBsKHQpKS5lYWNoQWZ0ZXIoemwociwuNSkpLmVhY2hCZWZvcmUoUmwoMSkpOmkuZWFjaEJlZm9yZShQbChDbCkpLmVhY2hBZnRlcih6bChFbCwxKSkuZWFjaEFmdGVyKHpsKHIsaS5yL01hdGgubWluKG4sZSkpKS5lYWNoQmVmb3JlKFJsKE1hdGgubWluKG4sZSkvKDIqaS5yKSkpLGl9cmV0dXJuIGkucmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW51bGw9PShlPW4pP251bGw6U2woZSksaSk6dDt2YXIgZX0saS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0WzBdLGU9K3RbMV0saSk6W24sZV19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmtsKCt0KSxpKTpyfSxpfSx0LnBhY2tTaWJsaW5ncz1mdW5jdGlvbih0KXtyZXR1cm4gTmwodCksdH0sdC5wYWNrRW5jbG9zZT1wbCx0LnBhcnRpdGlvbj1mdW5jdGlvbigpe3ZhciB0PTEsbj0xLGU9MCxyPSExO2Z1bmN0aW9uIGkoaSl7dmFyIG89aS5oZWlnaHQrMTtyZXR1cm4gaS54MD1pLnkwPWUsaS54MT10LGkueTE9bi9vLGkuZWFjaEJlZm9yZShmdW5jdGlvbih0LG4pe3JldHVybiBmdW5jdGlvbihyKXtyLmNoaWxkcmVuJiZEbChyLHIueDAsdCooci5kZXB0aCsxKS9uLHIueDEsdCooci5kZXB0aCsyKS9uKTt2YXIgaT1yLngwLG89ci55MCxhPXIueDEtZSx1PXIueTEtZTthPGkmJihpPWE9KGkrYSkvMiksdTxvJiYobz11PShvK3UpLzIpLHIueDA9aSxyLnkwPW8sci54MT1hLHIueTE9dX19KG4sbykpLHImJmkuZWFjaEJlZm9yZShMbCksaX1yZXR1cm4gaS5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hIXQsaSk6cn0saS5zaXplPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStlWzBdLG49K2VbMV0saSk6W3Qsbl19LGkucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxpKTplfSxpfSx0LnN0cmF0aWZ5PWZ1bmN0aW9uKCl7dmFyIHQ9WWwsbj1CbDtmdW5jdGlvbiBlKGUpe3ZhciByLGksbyxhLHUsZixjLHM9ZS5sZW5ndGgsbD1uZXcgQXJyYXkocyksaD17fTtmb3IoaT0wO2k8czsrK2kpcj1lW2ldLHU9bFtpXT1uZXcgaGwociksbnVsbCE9KGY9dChyLGksZSkpJiYoZis9IiIpJiYoaFtjPVVsKyh1LmlkPWYpXT1jIGluIGg/T2w6dSk7Zm9yKGk9MDtpPHM7KytpKWlmKHU9bFtpXSxudWxsIT0oZj1uKGVbaV0saSxlKSkmJihmKz0iIikpe2lmKCEoYT1oW1VsK2ZdKSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrZik7aWYoYT09PU9sKXRocm93IG5ldyBFcnJvcigiYW1iaWd1b3VzOiAiK2YpO2EuY2hpbGRyZW4/YS5jaGlsZHJlbi5wdXNoKHUpOmEuY2hpbGRyZW49W3VdLHUucGFyZW50PWF9ZWxzZXtpZihvKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgcm9vdHMiKTtvPXV9aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJubyByb290Iik7aWYoby5wYXJlbnQ9cWwsby5lYWNoQmVmb3JlKGZ1bmN0aW9uKHQpe3QuZGVwdGg9dC5wYXJlbnQuZGVwdGgrMSwtLXN9KS5lYWNoQmVmb3JlKGxsKSxvLnBhcmVudD1udWxsLHM+MCl0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7cmV0dXJuIG99cmV0dXJuIGUuaWQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9U2wobiksZSk6dH0sZS5wYXJlbnRJZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1TbCh0KSxlKTpufSxlfSx0LnRyZWU9ZnVuY3Rpb24oKXt2YXIgdD1GbCxuPTEsZT0xLHI9bnVsbDtmdW5jdGlvbiBpKGkpe3ZhciBmPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbixlLHIsaSxvLGE9bmV3IEdsKHQsMCksdT1bYV07bj11LnBvcCgpOylpZihyPW4uXy5jaGlsZHJlbilmb3Iobi5jaGlsZHJlbj1uZXcgQXJyYXkobz1yLmxlbmd0aCksaT1vLTE7aT49MDstLWkpdS5wdXNoKGU9bi5jaGlsZHJlbltpXT1uZXcgR2wocltpXSxpKSksZS5wYXJlbnQ9bjtyZXR1cm4oYS5wYXJlbnQ9bmV3IEdsKG51bGwsMCkpLmNoaWxkcmVuPVthXSxhfShpKTtpZihmLmVhY2hBZnRlcihvKSxmLnBhcmVudC5tPS1mLnosZi5lYWNoQmVmb3JlKGEpLHIpaS5lYWNoQmVmb3JlKHUpO2Vsc2V7dmFyIGM9aSxzPWksbD1pO2kuZWFjaEJlZm9yZShmdW5jdGlvbih0KXt0Lng8Yy54JiYoYz10KSx0Lng+cy54JiYocz10KSx0LmRlcHRoPmwuZGVwdGgmJihsPXQpfSk7dmFyIGg9Yz09PXM/MTp0KGMscykvMixkPWgtYy54LHA9bi8ocy54K2grZCksdj1lLyhsLmRlcHRofHwxKTtpLmVhY2hCZWZvcmUoZnVuY3Rpb24odCl7dC54PSh0LngrZCkqcCx0Lnk9dC5kZXB0aCp2fSl9cmV0dXJuIGl9ZnVuY3Rpb24gbyhuKXt2YXIgZT1uLmNoaWxkcmVuLHI9bi5wYXJlbnQuY2hpbGRyZW4saT1uLmk/cltuLmktMV06bnVsbDtpZihlKXshZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9MCxyPTAsaT10LmNoaWxkcmVuLG89aS5sZW5ndGg7LS1vPj0wOykobj1pW29dKS56Kz1lLG4ubSs9ZSxlKz1uLnMrKHIrPW4uYyl9KG4pO3ZhciBvPShlWzBdLnorZVtlLmxlbmd0aC0xXS56KS8yO2k/KG4uej1pLnordChuLl8saS5fKSxuLm09bi56LW8pOm4uej1vfWVsc2UgaSYmKG4uej1pLnordChuLl8saS5fKSk7bi5wYXJlbnQuQT1mdW5jdGlvbihuLGUscil7aWYoZSl7Zm9yKHZhciBpLG89bixhPW4sdT1lLGY9by5wYXJlbnQuY2hpbGRyZW5bMF0sYz1vLm0scz1hLm0sbD11Lm0saD1mLm07dT1IbCh1KSxvPUlsKG8pLHUmJm87KWY9SWwoZiksKGE9SGwoYSkpLmE9biwoaT11LnorbC1vLnotYyt0KHUuXyxvLl8pKT4wJiYoamwoWGwodSxuLHIpLG4saSksYys9aSxzKz1pKSxsKz11Lm0sYys9by5tLGgrPWYubSxzKz1hLm07dSYmIUhsKGEpJiYoYS50PXUsYS5tKz1sLXMpLG8mJiFJbChmKSYmKGYudD1vLGYubSs9Yy1oLHI9bil9cmV0dXJuIHJ9KG4saSxuLnBhcmVudC5BfHxyWzBdKX1mdW5jdGlvbiBhKHQpe3QuXy54PXQueit0LnBhcmVudC5tLHQubSs9dC5wYXJlbnQubX1mdW5jdGlvbiB1KHQpe3QueCo9bix0Lnk9dC5kZXB0aCplfXJldHVybiBpLnNlcGFyYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9bixpKTp0fSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ITEsbj0rdFswXSxlPSt0WzFdLGkpOnI/bnVsbDpbbixlXX0saS5ub2RlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hMCxuPSt0WzBdLGU9K3RbMV0saSk6cj9bbixlXTpudWxsfSxpfSx0LnRyZWVtYXA9ZnVuY3Rpb24oKXt2YXIgdD1abCxuPSExLGU9MSxyPTEsaT1bMF0sbz1FbCxhPUVsLHU9RWwsZj1FbCxjPUVsO2Z1bmN0aW9uIHModCl7cmV0dXJuIHQueDA9dC55MD0wLHQueDE9ZSx0LnkxPXIsdC5lYWNoQmVmb3JlKGwpLGk9WzBdLG4mJnQuZWFjaEJlZm9yZShMbCksdH1mdW5jdGlvbiBsKG4pe3ZhciBlPWlbbi5kZXB0aF0scj1uLngwK2Uscz1uLnkwK2UsbD1uLngxLWUsaD1uLnkxLWU7bDxyJiYocj1sPShyK2wpLzIpLGg8cyYmKHM9aD0ocytoKS8yKSxuLngwPXIsbi55MD1zLG4ueDE9bCxuLnkxPWgsbi5jaGlsZHJlbiYmKGU9aVtuLmRlcHRoKzFdPW8obikvMixyKz1jKG4pLWUscys9YShuKS1lLChsLT11KG4pLWUpPHImJihyPWw9KHIrbCkvMiksKGgtPWYobiktZSk8cyYmKHM9aD0ocytoKS8yKSx0KG4scixzLGwsaCkpfXJldHVybiBzLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSEhdCxzKTpufSxzLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3RbMF0scj0rdFsxXSxzKTpbZSxyXX0scy50aWxlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PVNsKG4pLHMpOnR9LHMucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9zLnBhZGRpbmdJbm5lcih0KS5wYWRkaW5nT3V0ZXIodCk6cy5wYWRkaW5nSW5uZXIoKX0scy5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6b30scy5wYWRkaW5nT3V0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/cy5wYWRkaW5nVG9wKHQpLnBhZGRpbmdSaWdodCh0KS5wYWRkaW5nQm90dG9tKHQpLnBhZGRpbmdMZWZ0KHQpOnMucGFkZGluZ1RvcCgpfSxzLnBhZGRpbmdUb3A9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6YX0scy5wYWRkaW5nUmlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6dX0scy5wYWRkaW5nQm90dG9tPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2woK3QpLHMpOmZ9LHMucGFkZGluZ0xlZnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprbCgrdCkscyk6Y30sc30sdC50cmVlbWFwQmluYXJ5PWZ1bmN0aW9uKHQsbixlLHIsaSl7dmFyIG8sYSx1PXQuY2hpbGRyZW4sZj11Lmxlbmd0aCxjPW5ldyBBcnJheShmKzEpO2ZvcihjWzBdPWE9bz0wO288ZjsrK28pY1tvKzFdPWErPXVbb10udmFsdWU7IWZ1bmN0aW9uIHQobixlLHIsaSxvLGEsZil7aWYobj49ZS0xKXt2YXIgcz11W25dO3JldHVybiBzLngwPWkscy55MD1vLHMueDE9YSx2b2lkKHMueTE9Zil9Zm9yKHZhciBsPWNbbl0saD1yLzIrbCxkPW4rMSxwPWUtMTtkPHA7KXt2YXIgdj1kK3A+Pj4xO2Nbdl08aD9kPXYrMTpwPXZ9aC1jW2QtMV08Y1tkXS1oJiZuKzE8ZCYmLS1kO3ZhciBnPWNbZF0tbCx5PXItZztpZihhLWk+Zi1vKXt2YXIgXz0oaSp5K2EqZykvcjt0KG4sZCxnLGksbyxfLGYpLHQoZCxlLHksXyxvLGEsZil9ZWxzZXt2YXIgYj0obyp5K2YqZykvcjt0KG4sZCxnLGksbyxhLGIpLHQoZCxlLHksaSxiLGEsZil9fSgwLGYsdC52YWx1ZSxuLGUscixpKX0sdC50cmVlbWFwRGljZT1EbCx0LnRyZWVtYXBTbGljZT1WbCx0LnRyZWVtYXBTbGljZURpY2U9ZnVuY3Rpb24odCxuLGUscixpKXsoMSZ0LmRlcHRoP1ZsOkRsKSh0LG4sZSxyLGkpfSx0LnRyZWVtYXBTcXVhcmlmeT1abCx0LnRyZWVtYXBSZXNxdWFyaWZ5PVFsLHQuaW50ZXJwb2xhdGU9bWUsdC5pbnRlcnBvbGF0ZUFycmF5PWRlLHQuaW50ZXJwb2xhdGVCYXNpcz1lZSx0LmludGVycG9sYXRlQmFzaXNDbG9zZWQ9cmUsdC5pbnRlcnBvbGF0ZURhdGU9cGUsdC5pbnRlcnBvbGF0ZURpc2NyZXRlPWZ1bmN0aW9uKHQpe3ZhciBuPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKG4tMSxNYXRoLmZsb29yKGUqbikpKV19fSx0LmludGVycG9sYXRlSHVlPWZ1bmN0aW9uKHQsbil7dmFyIGU9YWUoK3QsK24pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1lKHQpO3JldHVybiBuLTM2MCpNYXRoLmZsb29yKG4vMzYwKX19LHQuaW50ZXJwb2xhdGVOdW1iZXI9dmUsdC5pbnRlcnBvbGF0ZU9iamVjdD1nZSx0LmludGVycG9sYXRlUm91bmQ9eGUsdC5pbnRlcnBvbGF0ZVN0cmluZz1iZSx0LmludGVycG9sYXRlVHJhbnNmb3JtQ3NzPUNlLHQuaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc9UGUsdC5pbnRlcnBvbGF0ZVpvb209cWUsdC5pbnRlcnBvbGF0ZVJnYj1jZSx0LmludGVycG9sYXRlUmdiQmFzaXM9bGUsdC5pbnRlcnBvbGF0ZVJnYkJhc2lzQ2xvc2VkPWhlLHQuaW50ZXJwb2xhdGVIc2w9WWUsdC5pbnRlcnBvbGF0ZUhzbExvbmc9QmUsdC5pbnRlcnBvbGF0ZUxhYj1mdW5jdGlvbih0LG4pe3ZhciBlPWZlKCh0PVVuKHQpKS5sLChuPVVuKG4pKS5sKSxyPWZlKHQuYSxuLmEpLGk9ZmUodC5iLG4uYiksbz1mZSh0Lm9wYWNpdHksbi5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQubD1lKG4pLHQuYT1yKG4pLHQuYj1pKG4pLHQub3BhY2l0eT1vKG4pLHQrIiJ9fSx0LmludGVycG9sYXRlSGNsPUllLHQuaW50ZXJwb2xhdGVIY2xMb25nPUhlLHQuaW50ZXJwb2xhdGVDdWJlaGVsaXg9WGUsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmc9R2UsdC5waWVjZXdpc2U9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9MCxyPW4ubGVuZ3RoLTEsaT1uWzBdLG89bmV3IEFycmF5KHI8MD8wOnIpO2U8cjspb1tlXT10KGksaT1uWysrZV0pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj1NYXRoLm1heCgwLE1hdGgubWluKHItMSxNYXRoLmZsb29yKHQqPXIpKSk7cmV0dXJuIG9bbl0odC1uKX19LHQucXVhbnRpemU9ZnVuY3Rpb24odCxuKXtmb3IodmFyIGU9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWVbcl09dChyLyhuLTEpKTtyZXR1cm4gZX0sdC5wYXRoPUdpLHQucG9seWdvbkFyZWE9ZnVuY3Rpb24odCl7Zm9yKHZhciBuLGU9LTEscj10Lmxlbmd0aCxpPXRbci0xXSxvPTA7KytlPHI7KW49aSxpPXRbZV0sbys9blsxXSppWzBdLW5bMF0qaVsxXTtyZXR1cm4gby8yfSx0LnBvbHlnb25DZW50cm9pZD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz0wLGE9MCx1PXRbaS0xXSxmPTA7KytyPGk7KW49dSx1PXRbcl0sZis9ZT1uWzBdKnVbMV0tdVswXSpuWzFdLG8rPShuWzBdK3VbMF0pKmUsYSs9KG5bMV0rdVsxXSkqZTtyZXR1cm5bby8oZio9MyksYS9mXX0sdC5wb2x5Z29uSHVsbD1mdW5jdGlvbih0KXtpZigoZT10Lmxlbmd0aCk8MylyZXR1cm4gbnVsbDt2YXIgbixlLHI9bmV3IEFycmF5KGUpLGk9bmV3IEFycmF5KGUpO2ZvcihuPTA7bjxlOysrbilyW25dPVsrdFtuXVswXSwrdFtuXVsxXSxuXTtmb3Ioci5zb3J0KEpsKSxuPTA7bjxlOysrbilpW25dPVtyW25dWzBdLC1yW25dWzFdXTt2YXIgbz1LbChyKSxhPUtsKGkpLHU9YVswXT09PW9bMF0sZj1hW2EubGVuZ3RoLTFdPT09b1tvLmxlbmd0aC0xXSxjPVtdO2ZvcihuPW8ubGVuZ3RoLTE7bj49MDstLW4pYy5wdXNoKHRbcltvW25dXVsyXV0pO2ZvcihuPSt1O248YS5sZW5ndGgtZjsrK24pYy5wdXNoKHRbclthW25dXVsyXV0pO3JldHVybiBjfSx0LnBvbHlnb25Db250YWlucz1mdW5jdGlvbih0LG4pe2Zvcih2YXIgZSxyLGk9dC5sZW5ndGgsbz10W2ktMV0sYT1uWzBdLHU9blsxXSxmPW9bMF0sYz1vWzFdLHM9ITEsbD0wO2w8aTsrK2wpZT0obz10W2xdKVswXSwocj1vWzFdKT51IT1jPnUmJmE8KGYtZSkqKHUtcikvKGMtcikrZSYmKHM9IXMpLGY9ZSxjPXI7cmV0dXJuIHN9LHQucG9seWdvbkxlbmd0aD1mdW5jdGlvbih0KXtmb3IodmFyIG4sZSxyPS0xLGk9dC5sZW5ndGgsbz10W2ktMV0sYT1vWzBdLHU9b1sxXSxmPTA7KytyPGk7KW49YSxlPXUsbi09YT0obz10W3JdKVswXSxlLT11PW9bMV0sZis9TWF0aC5zcXJ0KG4qbitlKmUpO3JldHVybiBmfSx0LnF1YWR0cmVlPXJhLHQucmFuZG9tVW5pZm9ybT1uaCx0LnJhbmRvbU5vcm1hbD1laCx0LnJhbmRvbUxvZ05vcm1hbD1yaCx0LnJhbmRvbUJhdGVzPW9oLHQucmFuZG9tSXJ3aW5IYWxsPWloLHQucmFuZG9tRXhwb25lbnRpYWw9YWgsdC5zY2FsZUJhbmQ9aGgsdC5zY2FsZVBvaW50PWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uIHQobil7dmFyIGU9bi5jb3B5O3JldHVybiBuLnBhZGRpbmc9bi5wYWRkaW5nT3V0ZXIsZGVsZXRlIG4ucGFkZGluZ0lubmVyLGRlbGV0ZSBuLnBhZGRpbmdPdXRlcixuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChlKCkpfSxufShoaCgpLnBhZGRpbmdJbm5lcigxKSl9LHQuc2NhbGVJZGVudGl0eT1mdW5jdGlvbiB0KCl7dmFyIG49WzAsMV07ZnVuY3Rpb24gZSh0KXtyZXR1cm4rdH1yZXR1cm4gZS5pbnZlcnQ9ZSxlLmRvbWFpbj1lLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPWZoLmNhbGwodCxwaCksZSk6bi5zbGljZSgpfSxlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKX0seGgoZSl9LHQuc2NhbGVMaW5lYXI9ZnVuY3Rpb24gdCgpe3ZhciBuPW1oKGdoLHZlKTtyZXR1cm4gbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKG4sdCgpKX0seGgobil9LHQuc2NhbGVMb2c9ZnVuY3Rpb24gbigpe3ZhciBlPW1oKE1oLEFoKS5kb21haW4oWzEsMTBdKSxyPWUuZG9tYWluLGk9MTAsbz1TaCgxMCksYT1OaCgxMCk7ZnVuY3Rpb24gdSgpe3JldHVybiBvPVNoKGkpLGE9TmgoaSkscigpWzBdPDAmJihvPUVoKG8pLGE9RWgoYSkpLGV9cmV0dXJuIGUuYmFzZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCx1KCkpOml9LGUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyKHQpLHUoKSk6cigpfSxlLnRpY2tzPWZ1bmN0aW9uKHQpe3ZhciBuLGU9cigpLHU9ZVswXSxmPWVbZS5sZW5ndGgtMV07KG49Zjx1KSYmKGg9dSx1PWYsZj1oKTt2YXIgYyxzLGwsaD1vKHUpLGQ9byhmKSxwPW51bGw9PXQ/MTA6K3Qsdj1bXTtpZighKGklMSkmJmQtaDxwKXtpZihoPU1hdGgucm91bmQoaCktMSxkPU1hdGgucm91bmQoZCkrMSx1PjApe2Zvcig7aDxkOysraClmb3Iocz0xLGM9YShoKTtzPGk7KytzKWlmKCEoKGw9YypzKTx1KSl7aWYobD5mKWJyZWFrO3YucHVzaChsKX19ZWxzZSBmb3IoO2g8ZDsrK2gpZm9yKHM9aS0xLGM9YShoKTtzPj0xOy0tcylpZighKChsPWMqcyk8dSkpe2lmKGw+ZilicmVhazt2LnB1c2gobCl9fWVsc2Ugdj1tKGgsZCxNYXRoLm1pbihkLWgscCkpLm1hcChhKTtyZXR1cm4gbj92LnJldmVyc2UoKTp2fSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24obixyKXtpZihudWxsPT1yJiYocj0xMD09PWk/Ii4wZSI6IiwiKSwiZnVuY3Rpb24iIT10eXBlb2YgciYmKHI9dC5mb3JtYXQocikpLG49PT0xLzApcmV0dXJuIHI7bnVsbD09biYmKG49MTApO3ZhciB1PU1hdGgubWF4KDEsaSpuL2UudGlja3MoKS5sZW5ndGgpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10L2EoTWF0aC5yb3VuZChvKHQpKSk7cmV0dXJuIG4qaTxpLS41JiYobio9aSksbjw9dT9yKHQpOiIifX0sZS5uaWNlPWZ1bmN0aW9uKCl7cmV0dXJuIHIod2gocigpLHtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gYShNYXRoLmZsb29yKG8odCkpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gYShNYXRoLmNlaWwobyh0KSkpfX0pKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIGJoKGUsbigpLmJhc2UoaSkpfSxlfSx0LnNjYWxlT3JkaW5hbD1saCx0LnNjYWxlSW1wbGljaXQ9c2gsdC5zY2FsZVBvdz1DaCx0LnNjYWxlU3FydD1mdW5jdGlvbigpe3JldHVybiBDaCgpLmV4cG9uZW50KC41KX0sdC5zY2FsZVF1YW50aWxlPWZ1bmN0aW9uIHQoKXt2YXIgZT1bXSxyPVtdLG89W107ZnVuY3Rpb24gYSgpe3ZhciB0PTAsbj1NYXRoLm1heCgxLHIubGVuZ3RoKTtmb3Iobz1uZXcgQXJyYXkobi0xKTsrK3Q8bjspb1t0LTFdPUEoZSx0L24pO3JldHVybiB1fWZ1bmN0aW9uIHUodCl7aWYoIWlzTmFOKHQ9K3QpKXJldHVybiByW2kobyx0KV19cmV0dXJuIHUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBuPXIuaW5kZXhPZih0KTtyZXR1cm4gbjwwP1tOYU4sTmFOXTpbbj4wP29bbi0xXTplWzBdLG48by5sZW5ndGg/b1tuXTplW2UubGVuZ3RoLTFdXX0sdS5kb21haW49ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdO2Zvcih2YXIgcixpPTAsbz10Lmxlbmd0aDtpPG87KytpKW51bGw9PShyPXRbaV0pfHxpc05hTihyPStyKXx8ZS5wdXNoKHIpO3JldHVybiBlLnNvcnQobiksYSgpfSx1LnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPWNoLmNhbGwodCksYSgpKTpyLnNsaWNlKCl9LHUucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIG8uc2xpY2UoKX0sdS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oZSkucmFuZ2Uocil9LHV9LHQuc2NhbGVRdWFudGl6ZT1mdW5jdGlvbiB0KCl7dmFyIG49MCxlPTEscj0xLG89Wy41XSxhPVswLDFdO2Z1bmN0aW9uIHUodCl7aWYodDw9dClyZXR1cm4gYVtpKG8sdCwwLHIpXX1mdW5jdGlvbiBmKCl7dmFyIHQ9LTE7Zm9yKG89bmV3IEFycmF5KHIpOysrdDxyOylvW3RdPSgodCsxKSplLSh0LXIpKm4pLyhyKzEpO3JldHVybiB1fXJldHVybiB1LmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdFswXSxlPSt0WzFdLGYoKSk6W24sZV19LHUucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9KGE9Y2guY2FsbCh0KSkubGVuZ3RoLTEsZigpKTphLnNsaWNlKCl9LHUuaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBpPWEuaW5kZXhPZih0KTtyZXR1cm4gaTwwP1tOYU4sTmFOXTppPDE/W24sb1swXV06aT49cj9bb1tyLTFdLGVdOltvW2ktMV0sb1tpXV19LHUuY29weT1mdW5jdGlvbigpe3JldHVybiB0KCkuZG9tYWluKFtuLGVdKS5yYW5nZShhKX0seGgodSl9LHQuc2NhbGVUaHJlc2hvbGQ9ZnVuY3Rpb24gdCgpe3ZhciBuPVsuNV0sZT1bMCwxXSxyPTE7ZnVuY3Rpb24gbyh0KXtpZih0PD10KXJldHVybiBlW2kobix0LDAscildfXJldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1jaC5jYWxsKHQpLHI9TWF0aC5taW4obi5sZW5ndGgsZS5sZW5ndGgtMSksbyk6bi5zbGljZSgpfSxvLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWNoLmNhbGwodCkscj1NYXRoLm1pbihuLmxlbmd0aCxlLmxlbmd0aC0xKSxvKTplLnNsaWNlKCl9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciByPWUuaW5kZXhPZih0KTtyZXR1cm5bbltyLTFdLG5bcl1dfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKS5yYW5nZShlKX0sb30sdC5zY2FsZVRpbWU9ZnVuY3Rpb24oKXtyZXR1cm4gY3YoY2QsdWQsVmgsamgsSWgsQmgsT2gsTGgsdC50aW1lRm9ybWF0KS5kb21haW4oW25ldyBEYXRlKDJlMywwLDEpLG5ldyBEYXRlKDJlMywwLDIpXSl9LHQuc2NhbGVVdGM9ZnVuY3Rpb24oKXtyZXR1cm4gY3YoTGQsemQsX2QsdmQsZGQsbGQsT2gsTGgsdC51dGNGb3JtYXQpLmRvbWFpbihbRGF0ZS5VVEMoMmUzLDAsMSksRGF0ZS5VVEMoMmUzLDAsMildKX0sdC5zY2FsZVNlcXVlbnRpYWw9ZnVuY3Rpb24gdChuKXt2YXIgZT0wLHI9MSxpPTEsbz0hMTtmdW5jdGlvbiBhKHQpe3ZhciByPSh0LWUpKmk7cmV0dXJuIG4obz9NYXRoLm1heCgwLE1hdGgubWluKDEscikpOnIpfXJldHVybiBhLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdFswXSxyPSt0WzFdLGk9ZT09PXI/MDoxLyhyLWUpLGEpOltlLHJdfSxhLmNsYW1wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSEhdCxhKTpvfSxhLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGEpOm59LGEuY29weT1mdW5jdGlvbigpe3JldHVybiB0KG4pLmRvbWFpbihbZSxyXSkuY2xhbXAobyl9LHhoKGEpfSx0LnNjYWxlRGl2ZXJnaW5nPWZ1bmN0aW9uIHQobil7dmFyIGU9MCxyPS41LGk9MSxvPTEsYT0xLHU9ITE7ZnVuY3Rpb24gZih0KXt2YXIgZT0uNSsoKHQ9K3QpLXIpKih0PHI/bzphKTtyZXR1cm4gbih1P01hdGgubWF4KDAsTWF0aC5taW4oMSxlKSk6ZSl9cmV0dXJuIGYuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLHI9K3RbMV0saT0rdFsyXSxvPWU9PT1yPzA6LjUvKHItZSksYT1yPT09aT8wOi41LyhpLXIpLGYpOltlLHIsaV19LGYuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ISF0LGYpOnV9LGYuaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZik6bn0sZi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQobikuZG9tYWluKFtlLHIsaV0pLmNsYW1wKHUpfSx4aChmKX0sdC5zY2hlbWVDYXRlZ29yeTEwPWx2LHQuc2NoZW1lQWNjZW50PWh2LHQuc2NoZW1lRGFyazI9ZHYsdC5zY2hlbWVQYWlyZWQ9cHYsdC5zY2hlbWVQYXN0ZWwxPXZ2LHQuc2NoZW1lUGFzdGVsMj1ndix0LnNjaGVtZVNldDE9eXYsdC5zY2hlbWVTZXQyPV92LHQuc2NoZW1lU2V0Mz1idix0LmludGVycG9sYXRlQnJCRz13dix0LnNjaGVtZUJyQkc9eHYsdC5pbnRlcnBvbGF0ZVBSR249QXYsdC5zY2hlbWVQUkduPU12LHQuaW50ZXJwb2xhdGVQaVlHPU52LHQuc2NoZW1lUGlZRz1Udix0LmludGVycG9sYXRlUHVPcj1Fdix0LnNjaGVtZVB1T3I9U3YsdC5pbnRlcnBvbGF0ZVJkQnU9Q3YsdC5zY2hlbWVSZEJ1PWt2LHQuaW50ZXJwb2xhdGVSZEd5PXp2LHQuc2NoZW1lUmRHeT1Qdix0LmludGVycG9sYXRlUmRZbEJ1PUx2LHQuc2NoZW1lUmRZbEJ1PVJ2LHQuaW50ZXJwb2xhdGVSZFlsR249VXYsdC5zY2hlbWVSZFlsR249RHYsdC5pbnRlcnBvbGF0ZVNwZWN0cmFsPU92LHQuc2NoZW1lU3BlY3RyYWw9cXYsdC5pbnRlcnBvbGF0ZUJ1R249QnYsdC5zY2hlbWVCdUduPVl2LHQuaW50ZXJwb2xhdGVCdVB1PUl2LHQuc2NoZW1lQnVQdT1Gdix0LmludGVycG9sYXRlR25CdT1qdix0LnNjaGVtZUduQnU9SHYsdC5pbnRlcnBvbGF0ZU9yUmQ9R3YsdC5zY2hlbWVPclJkPVh2LHQuaW50ZXJwb2xhdGVQdUJ1R249JHYsdC5zY2hlbWVQdUJ1R249VnYsdC5pbnRlcnBvbGF0ZVB1QnU9WnYsdC5zY2hlbWVQdUJ1PVd2LHQuaW50ZXJwb2xhdGVQdVJkPUp2LHQuc2NoZW1lUHVSZD1Rdix0LmludGVycG9sYXRlUmRQdT10Zyx0LnNjaGVtZVJkUHU9S3YsdC5pbnRlcnBvbGF0ZVlsR25CdT1lZyx0LnNjaGVtZVlsR25CdT1uZyx0LmludGVycG9sYXRlWWxHbj1pZyx0LnNjaGVtZVlsR249cmcsdC5pbnRlcnBvbGF0ZVlsT3JCcj1hZyx0LnNjaGVtZVlsT3JCcj1vZyx0LmludGVycG9sYXRlWWxPclJkPWZnLHQuc2NoZW1lWWxPclJkPXVnLHQuaW50ZXJwb2xhdGVCbHVlcz1zZyx0LnNjaGVtZUJsdWVzPWNnLHQuaW50ZXJwb2xhdGVHcmVlbnM9aGcsdC5zY2hlbWVHcmVlbnM9bGcsdC5pbnRlcnBvbGF0ZUdyZXlzPXBnLHQuc2NoZW1lR3JleXM9ZGcsdC5pbnRlcnBvbGF0ZVB1cnBsZXM9Z2csdC5zY2hlbWVQdXJwbGVzPXZnLHQuaW50ZXJwb2xhdGVSZWRzPV9nLHQuc2NoZW1lUmVkcz15Zyx0LmludGVycG9sYXRlT3Jhbmdlcz1tZyx0LnNjaGVtZU9yYW5nZXM9YmcsdC5pbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQ9eGcsdC5pbnRlcnBvbGF0ZVJhaW5ib3c9ZnVuY3Rpb24odCl7KHQ8MHx8dD4xKSYmKHQtPU1hdGguZmxvb3IodCkpO3ZhciBuPU1hdGguYWJzKHQtLjUpO3JldHVybiBBZy5oPTM2MCp0LTEwMCxBZy5zPTEuNS0xLjUqbixBZy5sPS44LS45Km4sQWcrIiJ9LHQuaW50ZXJwb2xhdGVXYXJtPXdnLHQuaW50ZXJwb2xhdGVDb29sPU1nLHQuaW50ZXJwb2xhdGVTaW5lYm93PWZ1bmN0aW9uKHQpe3ZhciBuO3JldHVybiB0PSguNS10KSpNYXRoLlBJLFRnLnI9MjU1KihuPU1hdGguc2luKHQpKSpuLFRnLmc9MjU1KihuPU1hdGguc2luKHQrTmcpKSpuLFRnLmI9MjU1KihuPU1hdGguc2luKHQrU2cpKSpuLFRnKyIifSx0LmludGVycG9sYXRlVmlyaWRpcz1rZyx0LmludGVycG9sYXRlTWFnbWE9Q2csdC5pbnRlcnBvbGF0ZUluZmVybm89UGcsdC5pbnRlcnBvbGF0ZVBsYXNtYT16Zyx0LmNyZWF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gRHQoVyh0KS5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpfSx0LmNyZWF0b3I9Vyx0LmxvY2FsPXF0LHQubWF0Y2hlcj1ydCx0Lm1vdXNlPUZ0LHQubmFtZXNwYWNlPSQsdC5uYW1lc3BhY2VzPVYsdC5jbGllbnRQb2ludD1CdCx0LnNlbGVjdD1EdCx0LnNlbGVjdEFsbD1mdW5jdGlvbih0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFJ0KFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IFJ0KFtudWxsPT10P1tdOnRdLHp0KX0sdC5zZWxlY3Rpb249THQsdC5zZWxlY3Rvcj1RLHQuc2VsZWN0b3JBbGw9Syx0LnN0eWxlPWx0LHQudG91Y2g9SXQsdC50b3VjaGVzPWZ1bmN0aW9uKHQsbil7bnVsbD09biYmKG49WXQoKS50b3VjaGVzKTtmb3IodmFyIGU9MCxyPW4/bi5sZW5ndGg6MCxpPW5ldyBBcnJheShyKTtlPHI7KytlKWlbZV09QnQodCxuW2VdKTtyZXR1cm4gaX0sdC53aW5kb3c9c3QsdC5jdXN0b21FdmVudD1DdCx0LmFyYz1mdW5jdGlvbigpe3ZhciB0PUdnLG49VmcsZT1SZygwKSxyPW51bGwsaT0kZyxvPVdnLGE9WmcsdT1udWxsO2Z1bmN0aW9uIGYoKXt2YXIgZixjLHMsbD0rdC5hcHBseSh0aGlzLGFyZ3VtZW50cyksaD0rbi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1IZyxwPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLUhnLHY9TGcocC1kKSxnPXA+ZDtpZih1fHwodT1mPUdpKCkpLGg8bCYmKGM9aCxoPWwsbD1jKSxoPkZnKWlmKHY+amctRmcpdS5tb3ZlVG8oaCpVZyhkKSxoKllnKGQpKSx1LmFyYygwLDAsaCxkLHAsIWcpLGw+RmcmJih1Lm1vdmVUbyhsKlVnKHApLGwqWWcocCkpLHUuYXJjKDAsMCxsLHAsZCxnKSk7ZWxzZXt2YXIgeSxfLGI9ZCxtPXAseD1kLHc9cCxNPXYsQT12LFQ9YS5hcHBseSh0aGlzLGFyZ3VtZW50cykvMixOPVQ+RmcmJihyPytyLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpCZyhsKmwraCpoKSksUz1PZyhMZyhoLWwpLzIsK2UuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxFPVMsaz1TO2lmKE4+Rmcpe3ZhciBDPVhnKE4vbCpZZyhUKSksUD1YZyhOL2gqWWcoVCkpOyhNLT0yKkMpPkZnPyh4Kz1DKj1nPzE6LTEsdy09Qyk6KE09MCx4PXc9KGQrcCkvMiksKEEtPTIqUCk+Rmc/KGIrPVAqPWc/MTotMSxtLT1QKTooQT0wLGI9bT0oZCtwKS8yKX12YXIgej1oKlVnKGIpLFI9aCpZZyhiKSxMPWwqVWcodyksRD1sKllnKHcpO2lmKFM+Rmcpe3ZhciBVPWgqVWcobSkscT1oKllnKG0pLE89bCpVZyh4KSxZPWwqWWcoeCk7aWYodjxJZyl7dmFyIEI9TT5GZz9mdW5jdGlvbih0LG4sZSxyLGksbyxhLHUpe3ZhciBmPWUtdCxjPXItbixzPWEtaSxsPXUtbyxoPShzKihuLW8pLWwqKHQtaSkpLyhsKmYtcypjKTtyZXR1cm5bdCtoKmYsbitoKmNdfSh6LFIsTyxZLFUscSxMLEQpOltMLERdLEY9ei1CWzBdLEk9Ui1CWzFdLEg9VS1CWzBdLGo9cS1CWzFdLFg9MS9ZZygoKHM9KEYqSCtJKmopLyhCZyhGKkYrSSpJKSpCZyhIKkgraipqKSkpPjE/MDpzPC0xP0lnOk1hdGguYWNvcyhzKSkvMiksRz1CZyhCWzBdKkJbMF0rQlsxXSpCWzFdKTtFPU9nKFMsKGwtRykvKFgtMSkpLGs9T2coUywoaC1HKS8oWCsxKSl9fUE+Rmc/az5GZz8oeT1RZyhPLFkseixSLGgsayxnKSxfPVFnKFUscSxMLEQsaCxrLGcpLHUubW92ZVRvKHkuY3greS54MDEseS5jeSt5LnkwMSksazxTP3UuYXJjKHkuY3gseS5jeSxrLERnKHkueTAxLHkueDAxKSxEZyhfLnkwMSxfLngwMSksIWcpOih1LmFyYyh5LmN4LHkuY3ksayxEZyh5LnkwMSx5LngwMSksRGcoeS55MTEseS54MTEpLCFnKSx1LmFyYygwLDAsaCxEZyh5LmN5K3kueTExLHkuY3greS54MTEpLERnKF8uY3krXy55MTEsXy5jeCtfLngxMSksIWcpLHUuYXJjKF8uY3gsXy5jeSxrLERnKF8ueTExLF8ueDExKSxEZyhfLnkwMSxfLngwMSksIWcpKSk6KHUubW92ZVRvKHosUiksdS5hcmMoMCwwLGgsYixtLCFnKSk6dS5tb3ZlVG8oeixSKSxsPkZnJiZNPkZnP0U+Rmc/KHk9UWcoTCxELFUscSxsLC1FLGcpLF89UWcoeixSLE8sWSxsLC1FLGcpLHUubGluZVRvKHkuY3greS54MDEseS5jeSt5LnkwMSksRTxTP3UuYXJjKHkuY3gseS5jeSxFLERnKHkueTAxLHkueDAxKSxEZyhfLnkwMSxfLngwMSksIWcpOih1LmFyYyh5LmN4LHkuY3ksRSxEZyh5LnkwMSx5LngwMSksRGcoeS55MTEseS54MTEpLCFnKSx1LmFyYygwLDAsbCxEZyh5LmN5K3kueTExLHkuY3greS54MTEpLERnKF8uY3krXy55MTEsXy5jeCtfLngxMSksZyksdS5hcmMoXy5jeCxfLmN5LEUsRGcoXy55MTEsXy54MTEpLERnKF8ueTAxLF8ueDAxKSwhZykpKTp1LmFyYygwLDAsbCx3LHgsZyk6dS5saW5lVG8oTCxEKX1lbHNlIHUubW92ZVRvKDAsMCk7aWYodS5jbG9zZVBhdGgoKSxmKXJldHVybiB1PW51bGwsZisiInx8bnVsbH1yZXR1cm4gZi5jZW50cm9pZD1mdW5jdGlvbigpe3ZhciBlPSgrdC5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMixyPSgraS5hcHBseSh0aGlzLGFyZ3VtZW50cykrICtvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkvMi1JZy8yO3JldHVybltVZyhyKSplLFlnKHIpKmVdfSxmLmlubmVyUmFkaXVzPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246UmcoK24pLGYpOnR9LGYub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6bn0sZi5jb3JuZXJSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6ZX0sZi5wYWRSYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOnJ9LGYuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxmKTppfSxmLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGYpOm99LGYucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksZik6YX0sZi5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PW51bGw9PXQ/bnVsbDp0LGYpOnV9LGZ9LHQuYXJlYT1yeSx0LmxpbmU9ZXksdC5waWU9ZnVuY3Rpb24oKXt2YXIgdD1veSxuPWl5LGU9bnVsbCxyPVJnKDApLGk9UmcoamcpLG89UmcoMCk7ZnVuY3Rpb24gYShhKXt2YXIgdSxmLGMscyxsLGg9YS5sZW5ndGgsZD0wLHA9bmV3IEFycmF5KGgpLHY9bmV3IEFycmF5KGgpLGc9K3IuYXBwbHkodGhpcyxhcmd1bWVudHMpLHk9TWF0aC5taW4oamcsTWF0aC5tYXgoLWpnLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpLWcpKSxfPU1hdGgubWluKE1hdGguYWJzKHkpL2gsby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGI9XyooeTwwPy0xOjEpO2Zvcih1PTA7dTxoOysrdSkobD12W3BbdV09dV09K3QoYVt1XSx1LGEpKT4wJiYoZCs9bCk7Zm9yKG51bGwhPW4/cC5zb3J0KGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odlt0XSx2W2VdKX0pOm51bGwhPWUmJnAuc29ydChmdW5jdGlvbih0LG4pe3JldHVybiBlKGFbdF0sYVtuXSl9KSx1PTAsYz1kPyh5LWgqYikvZDowO3U8aDsrK3UsZz1zKWY9cFt1XSxzPWcrKChsPXZbZl0pPjA/bCpjOjApK2IsdltmXT17ZGF0YTphW2ZdLGluZGV4OnUsdmFsdWU6bCxzdGFydEFuZ2xlOmcsZW5kQW5nbGU6cyxwYWRBbmdsZTpffTtyZXR1cm4gdn1yZXR1cm4gYS52YWx1ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKCtuKSxhKTp0fSxhLnNvcnRWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlPW51bGwsYSk6bn0sYS5zb3J0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsbj1udWxsLGEpOmV9LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJnKCt0KSxhKTpyfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLGEpOml9LGEucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksYSk6b30sYX0sdC5hcmVhUmFkaWFsPWx5LHQucmFkaWFsQXJlYT1seSx0LmxpbmVSYWRpYWw9c3ksdC5yYWRpYWxMaW5lPXN5LHQucG9pbnRSYWRpYWw9aHksdC5saW5rSG9yaXpvbnRhbD1mdW5jdGlvbigpe3JldHVybiBneSh5eSl9LHQubGlua1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIGd5KF95KX0sdC5saW5rUmFkaWFsPWZ1bmN0aW9uKCl7dmFyIHQ9Z3koYnkpO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQucmFkaXVzPXQueSxkZWxldGUgdC55LHR9LHQuc3ltYm9sPWZ1bmN0aW9uKCl7dmFyIHQ9UmcobXkpLG49UmcoNjQpLGU9bnVsbDtmdW5jdGlvbiByKCl7dmFyIHI7aWYoZXx8KGU9cj1HaSgpKSx0LmFwcGx5KHRoaXMsYXJndW1lbnRzKS5kcmF3KGUsK24uYXBwbHkodGhpcyxhcmd1bWVudHMpKSxyKXJldHVybiBlPW51bGwscisiInx8bnVsbH1yZXR1cm4gci50eXBlPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246Umcobikscik6dH0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoK3QpLHIpOm59LHIuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6dCxyKTplfSxyfSx0LnN5bWJvbHM9VXksdC5zeW1ib2xDaXJjbGU9bXksdC5zeW1ib2xDcm9zcz14eSx0LnN5bWJvbERpYW1vbmQ9QXksdC5zeW1ib2xTcXVhcmU9a3ksdC5zeW1ib2xTdGFyPUV5LHQuc3ltYm9sVHJpYW5nbGU9UHksdC5zeW1ib2xXeWU9RHksdC5jdXJ2ZUJhc2lzQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgQnkodCl9LHQuY3VydmVCYXNpc09wZW49ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBGeSh0KX0sdC5jdXJ2ZUJhc2lzPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgWXkodCl9LHQuY3VydmVCdW5kbGU9SHksdC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkPSR5LHQuY3VydmVDYXJkaW5hbE9wZW49WnksdC5jdXJ2ZUNhcmRpbmFsPUd5LHQuY3VydmVDYXRtdWxsUm9tQ2xvc2VkPW5fLHQuY3VydmVDYXRtdWxsUm9tT3Blbj1yXyx0LmN1cnZlQ2F0bXVsbFJvbT1LeSx0LmN1cnZlTGluZWFyQ2xvc2VkPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaV8odCl9LHQuY3VydmVMaW5lYXI9S2csdC5jdXJ2ZU1vbm90b25lWD1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IGNfKHQpfSx0LmN1cnZlTW9ub3RvbmVZPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgc18odCl9LHQuY3VydmVOYXR1cmFsPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgaF8odCl9LHQuY3VydmVTdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgcF8odCwuNSl9LHQuY3VydmVTdGVwQWZ0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBwXyh0LDEpfSx0LmN1cnZlU3RlcEJlZm9yZT1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHBfKHQsMCl9LHQuc3RhY2s9ZnVuY3Rpb24oKXt2YXIgdD1SZyhbXSksbj1nXyxlPXZfLHI9eV87ZnVuY3Rpb24gaShpKXt2YXIgbyxhLHU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksZj1pLmxlbmd0aCxjPXUubGVuZ3RoLHM9bmV3IEFycmF5KGMpO2ZvcihvPTA7bzxjOysrbyl7Zm9yKHZhciBsLGg9dVtvXSxkPXNbb109bmV3IEFycmF5KGYpLHA9MDtwPGY7KytwKWRbcF09bD1bMCwrcihpW3BdLGgscCxpKV0sbC5kYXRhPWlbcF07ZC5rZXk9aH1mb3Iobz0wLGE9bihzKTtvPGM7KytvKXNbYVtvXV0uaW5kZXg9bztyZXR1cm4gZShzLGEpLHN9cmV0dXJuIGkua2V5cz1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOlJnKGR5LmNhbGwobikpLGkpOnR9LGkudmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpSZygrdCksaSk6cn0saS5vcmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P2dfOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6UmcoZHkuY2FsbCh0KSksaSk6bn0saS5vZmZzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD92Xzp0LGkpOmV9LGl9LHQuc3RhY2tPZmZzZXRFeHBhbmQ9ZnVuY3Rpb24odCxuKXtpZigocj10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHIsaSxvPTAsYT10WzBdLmxlbmd0aDtvPGE7KytvKXtmb3IoaT1lPTA7ZTxyOysrZSlpKz10W2VdW29dWzFdfHwwO2lmKGkpZm9yKGU9MDtlPHI7KytlKXRbZV1bb11bMV0vPWl9dl8odCxuKX19LHQuc3RhY2tPZmZzZXREaXZlcmdpbmc9ZnVuY3Rpb24odCxuKXtpZigodT10Lmxlbmd0aCk+MSlmb3IodmFyIGUscixpLG8sYSx1LGY9MCxjPXRbblswXV0ubGVuZ3RoO2Y8YzsrK2YpZm9yKG89YT0wLGU9MDtlPHU7KytlKShpPShyPXRbbltlXV1bZl0pWzFdLXJbMF0pPj0wPyhyWzBdPW8sclsxXT1vKz1pKTppPDA/KHJbMV09YSxyWzBdPWErPWkpOnJbMF09b30sdC5zdGFja09mZnNldE5vbmU9dl8sdC5zdGFja09mZnNldFNpbGhvdWV0dGU9ZnVuY3Rpb24odCxuKXtpZigoZT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBlLHI9MCxpPXRbblswXV0sbz1pLmxlbmd0aDtyPG87KytyKXtmb3IodmFyIGE9MCx1PTA7YTxlOysrYSl1Kz10W2FdW3JdWzFdfHwwO2lbcl1bMV0rPWlbcl1bMF09LXUvMn12Xyh0LG4pfX0sdC5zdGFja09mZnNldFdpZ2dsZT1mdW5jdGlvbih0LG4pe2lmKChpPXQubGVuZ3RoKT4wJiYocj0oZT10W25bMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgZSxyLGksbz0wLGE9MTthPHI7KythKXtmb3IodmFyIHU9MCxmPTAsYz0wO3U8aTsrK3Upe2Zvcih2YXIgcz10W25bdV1dLGw9c1thXVsxXXx8MCxoPShsLShzW2EtMV1bMV18fDApKS8yLGQ9MDtkPHU7KytkKXt2YXIgcD10W25bZF1dO2grPShwW2FdWzFdfHwwKS0ocFthLTFdWzFdfHwwKX1mKz1sLGMrPWgqbH1lW2EtMV1bMV0rPWVbYS0xXVswXT1vLGYmJihvLT1jL2YpfWVbYS0xXVsxXSs9ZVthLTFdWzBdPW8sdl8odCxuKX19LHQuc3RhY2tPcmRlckFzY2VuZGluZz1fXyx0LnN0YWNrT3JkZXJEZXNjZW5kaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBfXyh0KS5yZXZlcnNlKCl9LHQuc3RhY2tPcmRlckluc2lkZU91dD1mdW5jdGlvbih0KXt2YXIgbixlLHI9dC5sZW5ndGgsaT10Lm1hcChiXyksbz1nXyh0KS5zb3J0KGZ1bmN0aW9uKHQsbil7cmV0dXJuIGlbbl0taVt0XX0pLGE9MCx1PTAsZj1bXSxjPVtdO2ZvcihuPTA7bjxyOysrbillPW9bbl0sYTx1PyhhKz1pW2VdLGYucHVzaChlKSk6KHUrPWlbZV0sYy5wdXNoKGUpKTtyZXR1cm4gYy5yZXZlcnNlKCkuY29uY2F0KGYpfSx0LnN0YWNrT3JkZXJOb25lPWdfLHQuc3RhY2tPcmRlclJldmVyc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGdfKHQpLnJldmVyc2UoKX0sdC50aW1lSW50ZXJ2YWw9UmgsdC50aW1lTWlsbGlzZWNvbmQ9TGgsdC50aW1lTWlsbGlzZWNvbmRzPURoLHQudXRjTWlsbGlzZWNvbmQ9TGgsdC51dGNNaWxsaXNlY29uZHM9RGgsdC50aW1lU2Vjb25kPU9oLHQudGltZVNlY29uZHM9WWgsdC51dGNTZWNvbmQ9T2gsdC51dGNTZWNvbmRzPVloLHQudGltZU1pbnV0ZT1CaCx0LnRpbWVNaW51dGVzPUZoLHQudGltZUhvdXI9SWgsdC50aW1lSG91cnM9SGgsdC50aW1lRGF5PWpoLHQudGltZURheXM9WGgsdC50aW1lV2Vlaz1WaCx0LnRpbWVXZWVrcz10ZCx0LnRpbWVTdW5kYXk9VmgsdC50aW1lU3VuZGF5cz10ZCx0LnRpbWVNb25kYXk9JGgsdC50aW1lTW9uZGF5cz1uZCx0LnRpbWVUdWVzZGF5PVdoLHQudGltZVR1ZXNkYXlzPWVkLHQudGltZVdlZG5lc2RheT1aaCx0LnRpbWVXZWRuZXNkYXlzPXJkLHQudGltZVRodXJzZGF5PVFoLHQudGltZVRodXJzZGF5cz1pZCx0LnRpbWVGcmlkYXk9SmgsdC50aW1lRnJpZGF5cz1vZCx0LnRpbWVTYXR1cmRheT1LaCx0LnRpbWVTYXR1cmRheXM9YWQsdC50aW1lTW9udGg9dWQsdC50aW1lTW9udGhzPWZkLHQudGltZVllYXI9Y2QsdC50aW1lWWVhcnM9c2QsdC51dGNNaW51dGU9bGQsdC51dGNNaW51dGVzPWhkLHQudXRjSG91cj1kZCx0LnV0Y0hvdXJzPXBkLHQudXRjRGF5PXZkLHQudXRjRGF5cz1nZCx0LnV0Y1dlZWs9X2QsdC51dGNXZWVrcz1UZCx0LnV0Y1N1bmRheT1fZCx0LnV0Y1N1bmRheXM9VGQsdC51dGNNb25kYXk9YmQsdC51dGNNb25kYXlzPU5kLHQudXRjVHVlc2RheT1tZCx0LnV0Y1R1ZXNkYXlzPVNkLHQudXRjV2VkbmVzZGF5PXhkLHQudXRjV2VkbmVzZGF5cz1FZCx0LnV0Y1RodXJzZGF5PXdkLHQudXRjVGh1cnNkYXlzPWtkLHQudXRjRnJpZGF5PU1kLHQudXRjRnJpZGF5cz1DZCx0LnV0Y1NhdHVyZGF5PUFkLHQudXRjU2F0dXJkYXlzPVBkLHQudXRjTW9udGg9emQsdC51dGNNb250aHM9UmQsdC51dGNZZWFyPUxkLHQudXRjWWVhcnM9RGQsdC50aW1lRm9ybWF0RGVmYXVsdExvY2FsZT1RcCx0LnRpbWVGb3JtYXRMb2NhbGU9WWQsdC5pc29Gb3JtYXQ9SnAsdC5pc29QYXJzZT1LcCx0Lm5vdz1pcix0LnRpbWVyPXVyLHQudGltZXJGbHVzaD1mcix0LnRpbWVvdXQ9aHIsdC5pbnRlcnZhbD1mdW5jdGlvbih0LG4sZSl7dmFyIHI9bmV3IGFyLGk9bjtyZXR1cm4gbnVsbD09bj8oci5yZXN0YXJ0KHQsbixlKSxyKToobj0rbixlPW51bGw9PWU/aXIoKTorZSxyLnJlc3RhcnQoZnVuY3Rpb24gbyhhKXthKz1pLHIucmVzdGFydChvLGkrPW4sZSksdChhKX0sbixlKSxyKX0sdC50cmFuc2l0aW9uPXpyLHQuYWN0aXZlPWZ1bmN0aW9uKHQsbil7dmFyIGUscixpPXQuX190cmFuc2l0aW9uO2lmKGkpZm9yKHIgaW4gbj1udWxsPT1uP251bGw6bisiIixpKWlmKChlPWlbcl0pLnN0YXRlPmdyJiZlLm5hbWU9PT1uKXJldHVybiBuZXcgUHIoW1t0XV0sbGksbiwrcik7cmV0dXJuIG51bGx9LHQuaW50ZXJydXB0PU5yLHQudm9yb25vaT1mdW5jdGlvbigpe3ZhciB0PXhfLG49d18sZT1udWxsO2Z1bmN0aW9uIHIocil7cmV0dXJuIG5ldyBlYihyLm1hcChmdW5jdGlvbihlLGkpe3ZhciBvPVtNYXRoLnJvdW5kKHQoZSxpLHIpL0tfKSpLXyxNYXRoLnJvdW5kKG4oZSxpLHIpL0tfKSpLX107cmV0dXJuIG8uaW5kZXg9aSxvLmRhdGE9ZSxvfSksZSl9cmV0dXJuIHIucG9seWdvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIHIodCkucG9seWdvbnMoKX0sci5saW5rcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS5saW5rcygpfSxyLnRyaWFuZ2xlcz1mdW5jdGlvbih0KXtyZXR1cm4gcih0KS50cmlhbmdsZXMoKX0sci54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246bV8oK24pLHIpOnR9LHIueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Om1fKCt0KSxyKTpufSxyLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P251bGw6W1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0scik6ZSYmW1tlWzBdWzBdLGVbMF1bMV1dLFtlWzFdWzBdLGVbMV1bMV1dXX0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/bnVsbDpbWzAsMF0sWyt0WzBdLCt0WzFdXV0scik6ZSYmW2VbMV1bMF0tZVswXVswXSxlWzFdWzFdLWVbMF1bMV1dfSxyfSx0Lnpvb209ZnVuY3Rpb24oKXt2YXIgbixlLHI9c2IsaT1sYixvPXZiLGE9ZGIsdT1wYixmPVswLDEvMF0sYz1bWy0xLzAsLTEvMF0sWzEvMCwxLzBdXSxzPTI1MCxsPXFlLGg9W10sZD1JKCJzdGFydCIsInpvb20iLCJlbmQiKSxwPTUwMCx2PTE1MCxnPTA7ZnVuY3Rpb24geSh0KXt0LnByb3BlcnR5KCJfX3pvb20iLGhiKS5vbigid2hlZWwuem9vbSIsQSkub24oIm1vdXNlZG93bi56b29tIixUKS5vbigiZGJsY2xpY2suem9vbSIsTikuZmlsdGVyKHUpLm9uKCJ0b3VjaHN0YXJ0Lnpvb20iLFMpLm9uKCJ0b3VjaG1vdmUuem9vbSIsRSkub24oInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbSIsaykuc3R5bGUoInRvdWNoLWFjdGlvbiIsIm5vbmUiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIF8odCxuKXtyZXR1cm4obj1NYXRoLm1heChmWzBdLE1hdGgubWluKGZbMV0sbikpKT09PXQuaz90Om5ldyBvYihuLHQueCx0LnkpfWZ1bmN0aW9uIGIodCxuLGUpe3ZhciByPW5bMF0tZVswXSp0LmssaT1uWzFdLWVbMV0qdC5rO3JldHVybiByPT09dC54JiZpPT09dC55P3Q6bmV3IG9iKHQuayxyLGkpfWZ1bmN0aW9uIG0odCl7cmV0dXJuWygrdFswXVswXSsgK3RbMV1bMF0pLzIsKCt0WzBdWzFdKyArdFsxXVsxXSkvMl19ZnVuY3Rpb24geCh0LG4sZSl7dC5vbigic3RhcnQuem9vbSIsZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpfSkub24oImludGVycnVwdC56b29tIGVuZC56b29tIixmdW5jdGlvbigpe3codGhpcyxhcmd1bWVudHMpLmVuZCgpfSkudHdlZW4oInpvb20iLGZ1bmN0aW9uKCl7dmFyIHQ9YXJndW1lbnRzLHI9dyh0aGlzLHQpLG89aS5hcHBseSh0aGlzLHQpLGE9ZXx8bShvKSx1PU1hdGgubWF4KG9bMV1bMF0tb1swXVswXSxvWzFdWzFdLW9bMF1bMV0pLGY9dGhpcy5fX3pvb20sYz0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsdCk6bixzPWwoZi5pbnZlcnQoYSkuY29uY2F0KHUvZi5rKSxjLmludmVydChhKS5jb25jYXQodS9jLmspKTtyZXR1cm4gZnVuY3Rpb24odCl7aWYoMT09PXQpdD1jO2Vsc2V7dmFyIG49cyh0KSxlPXUvblsyXTt0PW5ldyBvYihlLGFbMF0tblswXSplLGFbMV0tblsxXSplKX1yLnpvb20obnVsbCx0KX19KX1mdW5jdGlvbiB3KHQsbil7Zm9yKHZhciBlLHI9MCxpPWgubGVuZ3RoO3I8aTsrK3IpaWYoKGU9aFtyXSkudGhhdD09PXQpcmV0dXJuIGU7cmV0dXJuIG5ldyBNKHQsbil9ZnVuY3Rpb24gTSh0LG4pe3RoaXMudGhhdD10LHRoaXMuYXJncz1uLHRoaXMuaW5kZXg9LTEsdGhpcy5hY3RpdmU9MCx0aGlzLmV4dGVudD1pLmFwcGx5KHQsbil9ZnVuY3Rpb24gQSgpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD13KHRoaXMsYXJndW1lbnRzKSxuPXRoaXMuX196b29tLGU9TWF0aC5tYXgoZlswXSxNYXRoLm1pbihmWzFdLG4uaypNYXRoLnBvdygyLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpKSkpLGk9RnQodGhpcyk7aWYodC53aGVlbCl0Lm1vdXNlWzBdWzBdPT09aVswXSYmdC5tb3VzZVswXVsxXT09PWlbMV18fCh0Lm1vdXNlWzFdPW4uaW52ZXJ0KHQubW91c2VbMF09aSkpLGNsZWFyVGltZW91dCh0LndoZWVsKTtlbHNle2lmKG4uaz09PWUpcmV0dXJuO3QubW91c2U9W2ksbi5pbnZlcnQoaSldLE5yKHRoaXMpLHQuc3RhcnQoKX1jYigpLHQud2hlZWw9c2V0VGltZW91dChmdW5jdGlvbigpe3Qud2hlZWw9bnVsbCx0LmVuZCgpfSx2KSx0Lnpvb20oIm1vdXNlIixvKGIoXyhuLGUpLHQubW91c2VbMF0sdC5tb3VzZVsxXSksdC5leHRlbnQsYykpfX1mdW5jdGlvbiBUKCl7aWYoIWUmJnIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj13KHRoaXMsYXJndW1lbnRzKSxpPUR0KHQuZXZlbnQudmlldykub24oIm1vdXNlbW92ZS56b29tIixmdW5jdGlvbigpe2lmKGNiKCksIW4ubW92ZWQpe3ZhciBlPXQuZXZlbnQuY2xpZW50WC11LHI9dC5ldmVudC5jbGllbnRZLWY7bi5tb3ZlZD1lKmUrcipyPmd9bi56b29tKCJtb3VzZSIsbyhiKG4udGhhdC5fX3pvb20sbi5tb3VzZVswXT1GdChuLnRoYXQpLG4ubW91c2VbMV0pLG4uZXh0ZW50LGMpKX0sITApLm9uKCJtb3VzZXVwLnpvb20iLGZ1bmN0aW9uKCl7aS5vbigibW91c2Vtb3ZlLnpvb20gbW91c2V1cC56b29tIixudWxsKSxHdCh0LmV2ZW50LnZpZXcsbi5tb3ZlZCksY2IoKSxuLmVuZCgpfSwhMCksYT1GdCh0aGlzKSx1PXQuZXZlbnQuY2xpZW50WCxmPXQuZXZlbnQuY2xpZW50WTtYdCh0LmV2ZW50LnZpZXcpLGZiKCksbi5tb3VzZT1bYSx0aGlzLl9fem9vbS5pbnZlcnQoYSldLE5yKHRoaXMpLG4uc3RhcnQoKX19ZnVuY3Rpb24gTigpe2lmKHIuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbj10aGlzLl9fem9vbSxlPUZ0KHRoaXMpLGE9bi5pbnZlcnQoZSksdT1uLmsqKHQuZXZlbnQuc2hpZnRLZXk/LjU6MiksZj1vKGIoXyhuLHUpLGUsYSksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyksYyk7Y2IoKSxzPjA/RHQodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKHMpLmNhbGwoeCxmLGUpOkR0KHRoaXMpLmNhbGwoeS50cmFuc2Zvcm0sZil9fWZ1bmN0aW9uIFMoKXtpZihyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGUsaSxvLGEsdT13KHRoaXMsYXJndW1lbnRzKSxmPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYz1mLmxlbmd0aDtmb3IoZmIoKSxpPTA7aTxjOysraSlhPVthPUl0KHRoaXMsZiwobz1mW2ldKS5pZGVudGlmaWVyKSx0aGlzLl9fem9vbS5pbnZlcnQoYSksby5pZGVudGlmaWVyXSx1LnRvdWNoMD91LnRvdWNoMXx8KHUudG91Y2gxPWEpOih1LnRvdWNoMD1hLGU9ITApO2lmKG4mJihuPWNsZWFyVGltZW91dChuKSwhdS50b3VjaDEpKXJldHVybiB1LmVuZCgpLHZvaWQoKGE9RHQodGhpcykub24oImRibGNsaWNrLnpvb20iKSkmJmEuYXBwbHkodGhpcyxhcmd1bWVudHMpKTtlJiYobj1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bj1udWxsfSxwKSxOcih0aGlzKSx1LnN0YXJ0KCkpfX1mdW5jdGlvbiBFKCl7dmFyIGUscixpLGEsdT13KHRoaXMsYXJndW1lbnRzKSxmPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMscz1mLmxlbmd0aDtmb3IoY2IoKSxuJiYobj1jbGVhclRpbWVvdXQobikpLGU9MDtlPHM7KytlKWk9SXQodGhpcyxmLChyPWZbZV0pLmlkZW50aWZpZXIpLHUudG91Y2gwJiZ1LnRvdWNoMFsyXT09PXIuaWRlbnRpZmllcj91LnRvdWNoMFswXT1pOnUudG91Y2gxJiZ1LnRvdWNoMVsyXT09PXIuaWRlbnRpZmllciYmKHUudG91Y2gxWzBdPWkpO2lmKHI9dS50aGF0Ll9fem9vbSx1LnRvdWNoMSl7dmFyIGw9dS50b3VjaDBbMF0saD11LnRvdWNoMFsxXSxkPXUudG91Y2gxWzBdLHA9dS50b3VjaDFbMV0sdj0odj1kWzBdLWxbMF0pKnYrKHY9ZFsxXS1sWzFdKSp2LGc9KGc9cFswXS1oWzBdKSpnKyhnPXBbMV0taFsxXSkqZztyPV8ocixNYXRoLnNxcnQodi9nKSksaT1bKGxbMF0rZFswXSkvMiwobFsxXStkWzFdKS8yXSxhPVsoaFswXStwWzBdKS8yLChoWzFdK3BbMV0pLzJdfWVsc2V7aWYoIXUudG91Y2gwKXJldHVybjtpPXUudG91Y2gwWzBdLGE9dS50b3VjaDBbMV19dS56b29tKCJ0b3VjaCIsbyhiKHIsaSxhKSx1LmV4dGVudCxjKSl9ZnVuY3Rpb24gaygpe3ZhciBuLHIsaT13KHRoaXMsYXJndW1lbnRzKSxvPXQuZXZlbnQuY2hhbmdlZFRvdWNoZXMsYT1vLmxlbmd0aDtmb3IoZmIoKSxlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZT1udWxsfSxwKSxuPTA7bjxhOysrbilyPW9bbl0saS50b3VjaDAmJmkudG91Y2gwWzJdPT09ci5pZGVudGlmaWVyP2RlbGV0ZSBpLnRvdWNoMDppLnRvdWNoMSYmaS50b3VjaDFbMl09PT1yLmlkZW50aWZpZXImJmRlbGV0ZSBpLnRvdWNoMTtpLnRvdWNoMSYmIWkudG91Y2gwJiYoaS50b3VjaDA9aS50b3VjaDEsZGVsZXRlIGkudG91Y2gxKSxpLnRvdWNoMD9pLnRvdWNoMFsxXT10aGlzLl9fem9vbS5pbnZlcnQoaS50b3VjaDBbMF0pOmkuZW5kKCl9cmV0dXJuIHkudHJhbnNmb3JtPWZ1bmN0aW9uKHQsbil7dmFyIGU9dC5zZWxlY3Rpb24/dC5zZWxlY3Rpb24oKTp0O2UucHJvcGVydHkoIl9fem9vbSIsaGIpLHQhPT1lP3godCxuKTplLmludGVycnVwdCgpLmVhY2goZnVuY3Rpb24oKXt3KHRoaXMsYXJndW1lbnRzKS5zdGFydCgpLnpvb20obnVsbCwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKS5lbmQoKX0pfSx5LnNjYWxlQnk9ZnVuY3Rpb24odCxuKXt5LnNjYWxlVG8odCxmdW5jdGlvbigpe3JldHVybiB0aGlzLl9fem9vbS5rKigiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKX0pfSx5LnNjYWxlVG89ZnVuY3Rpb24odCxuKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyksZT10aGlzLl9fem9vbSxyPW0odCksYT1lLmludmVydChyKSx1PSJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOm47cmV0dXJuIG8oYihfKGUsdSkscixhKSx0LGMpfSl9LHkudHJhbnNsYXRlQnk9ZnVuY3Rpb24odCxuLGUpe3kudHJhbnNmb3JtKHQsZnVuY3Rpb24oKXtyZXR1cm4gbyh0aGlzLl9fem9vbS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6biwiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxjKX0pfSx5LnRyYW5zbGF0ZVRvPWZ1bmN0aW9uKHQsbixlKXt5LnRyYW5zZm9ybSh0LGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cykscj10aGlzLl9fem9vbSxhPW0odCk7cmV0dXJuIG8oYWIudHJhbnNsYXRlKGFbMF0sYVsxXSkuc2NhbGUoci5rKS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIG4/LW4uYXBwbHkodGhpcyxhcmd1bWVudHMpOi1uLCJmdW5jdGlvbiI9PXR5cGVvZiBlPy1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotZSksdCxjKX0pfSxNLnByb3RvdHlwZT17c3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gMT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMuaW5kZXg9aC5wdXNoKHRoaXMpLTEsdGhpcy5lbWl0KCJzdGFydCIpKSx0aGlzfSx6b29tOmZ1bmN0aW9uKHQsbil7cmV0dXJuIHRoaXMubW91c2UmJiJtb3VzZSIhPT10JiYodGhpcy5tb3VzZVsxXT1uLmludmVydCh0aGlzLm1vdXNlWzBdKSksdGhpcy50b3VjaDAmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDBbMV09bi5pbnZlcnQodGhpcy50b3VjaDBbMF0pKSx0aGlzLnRvdWNoMSYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMVsxXT1uLmludmVydCh0aGlzLnRvdWNoMVswXSkpLHRoaXMudGhhdC5fX3pvb209bix0aGlzLmVtaXQoInpvb20iKSx0aGlzfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gMD09LS10aGlzLmFjdGl2ZSYmKGguc3BsaWNlKHRoaXMuaW5kZXgsMSksdGhpcy5pbmRleD0tMSx0aGlzLmVtaXQoImVuZCIpKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKHQpe0N0KG5ldyBpYih5LHQsdGhpcy50aGF0Ll9fem9vbSksZC5hcHBseSxkLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LHkud2hlZWxEZWx0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKCt0KSx5KTphfSx5LmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnJiKCEhdCkseSk6cn0seS50b3VjaGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpyYighIXQpLHkpOnV9LHkuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6cmIoW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLHkpOml9LHkuc2NhbGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGZbMF09K3RbMF0sZlsxXT0rdFsxXSx5KTpbZlswXSxmWzFdXX0seS50cmFuc2xhdGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGNbMF1bMF09K3RbMF1bMF0sY1sxXVswXT0rdFsxXVswXSxjWzBdWzFdPSt0WzBdWzFdLGNbMV1bMV09K3RbMV1bMV0seSk6W1tjWzBdWzBdLGNbMF1bMV1dLFtjWzFdWzBdLGNbMV1bMV1dXX0seS5jb25zdHJhaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCx5KTpvfSx5LmR1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LHkpOnN9LHkuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9dCx5KTpsfSx5Lm9uPWZ1bmN0aW9uKCl7dmFyIHQ9ZC5vbi5hcHBseShkLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1kP3k6dH0seS5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPSh0PSt0KSp0LHkpOk1hdGguc3FydChnKX0seX0sdC56b29tVHJhbnNmb3JtPXViLHQuem9vbUlkZW50aXR5PWFiLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNvbG9yLXNjYWxlL3BhbGV0dGVzLmpzCnZhciBwZjsKKGZ1bmN0aW9uKGIpe2IucGFsZXR0ZXM9e2dvb2dsZVN0YW5kYXJkOiIjZGI0NDM3ICNmZjcwNDMgI2Y0YjQwMCAjMGY5ZDU4ICMwMDc5NmIgIzAwYWNjMSAjNDI4NWY0ICM1YzZiYzAgI2FiNDdiYyIuc3BsaXQoIiAiKSxnb29nbGVDb29sOiIjOWU5ZDI0ICMwZjlkNTggIzAwNzk2YiAjMDBhY2MxICM0Mjg1ZjQgIzVjNmJjMCAjNjA3ZDhiIi5zcGxpdCgiICIpLGdvb2dsZVdhcm06IiM3OTU1NDggI2FiNDdiYyAjZjA2MjkyICNjMjE4NWIgI2RiNDQzNyAjZmY3MDQzICNmNGI0MDAiLnNwbGl0KCIgIiksZ29vZ2xlQ29sb3JCbGluZEFzc2lzdDoiI2ZmNzA0MyAjMDBBQ0MxICNBQjQ3QkMgIzJBNTZDNiAjMGI4MDQzICNGN0NCNEQgI2MwY2EzMyAjNWUzNWIxICNBNTI3MTQiLnNwbGl0KCIgIiksdGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0OiIjZmY3MDQzICMwMDc3YmIgI2NjMzMxMSAjMzNiYmVlICNlZTMzNzcgIzAwOTk4OCAjYmJiYmJiIi5zcGxpdCgiICIpLGNvbG9yQmxpbmRBc3Npc3QxOiIjNDQ3N2FhICM0NGFhYWEgI2FhYWE0NCAjYWE3NzQ0ICNhYTQ0NTUgI2FhNDQ4OCIuc3BsaXQoIiAiKSxjb2xvckJsaW5kQXNzaXN0MjoiIzg4Y2NlZSAjNDRhYTk5ICMxMTc3MzMgIzk5OTkzMyAjZGRjYzc3ICNjYzY2NzcgIzg4MjI1NSAjYWE0NDk5Ii5zcGxpdCgiICIpLApjb2xvckJsaW5kQXNzaXN0MzoiIzMzMjI4OCAjNjY5OWNjICM4OGNjZWUgIzQ0YWE5OSAjMTE3NzMzICM5OTk5MzMgI2RkY2M3NyAjY2M2Njc3ICNhYTQ0NjYgIzg4MjI1NSAjNjYxMTAwICNhYTQ0OTkiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDQ6IiM0NDc3YWEgIzY2Y2NlZSAjMjI4ODMzICNjY2JiNDQgI2VlNjY3NyAjYWEzMzc3ICNiYmJiYmIiLnNwbGl0KCIgIiksY29sb3JCbGluZEFzc2lzdDU6IiNGRjZEQjYgIzkyMDAwMCAjOTI0OTAwICNEQkQxMDAgIzI0RkYyNCAjMDA2RERCICM0OTAwOTIiLnNwbGl0KCIgIiksbWxkYXNoOiIjRTQ3RUFEICNGNDY0MEQgI0ZBQTMwMCAjRjVFNjM2ICMwMEEwNzcgIzAwNzdCOCAjMDBCN0VEIi5zcGxpdCgiICIpfTtiLnN0YW5kYXJkPWIucGFsZXR0ZXMudGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0fSkocGZ8fChwZj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWNvbG9yLXNjYWxlL2NvbG9yU2NhbGUuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoaCxrKXtmdW5jdGlvbiB0KCl7bC5zZXREb21haW4oaygpKX1jb25zdCBsPW5ldyBmO2guYWRkTGlzdGVuZXIodCk7dCgpO3JldHVybiBwPT5sLmdldENvbG9yKHApfWNsYXNzIGZ7Y29uc3RydWN0b3IoaD1iLnN0YW5kYXJkKXt0aGlzLnBhbGV0dGU9aDt0aGlzLmlkZW50aWZpZXJzPWQzLm1hcCgpfXNldERvbWFpbihoKXt0aGlzLmlkZW50aWZpZXJzPWQzLm1hcCgpO2guZm9yRWFjaCgoayx0KT0+e3RoaXMuaWRlbnRpZmllcnMuc2V0KGssdGhpcy5wYWxldHRlW3QldGhpcy5wYWxldHRlLmxlbmd0aF0pfSl9Z2V0Q29sb3IoaCl7aWYoIXRoaXMuaWRlbnRpZmllcnMuaGFzKGgpKXRocm93IEVycm9yKGBTdHJpbmcgJHtofSB3YXMgbm90IGluIHRoZSBkb21haW4uYCk7cmV0dXJuIHRoaXMuaWRlbnRpZmllcnMuZ2V0KGgpfX1iLkNvbG9yU2NhbGU9ZjtiLnJ1bnNDb2xvclNjYWxlPWQodmMucnVuc1N0b3JlLCgpPT52Yy5ydW5zU3RvcmUuZ2V0UnVucygpKTsKYi5leHBlcmltZW50c0NvbG9yU2NhbGU9ZCh2Yy5leHBlcmltZW50c1N0b3JlLCgpPT52Yy5leHBlcmltZW50c1N0b3JlLmdldEV4cGVyaW1lbnRzKCkubWFwKCh7bmFtZTpofSk9PmgpKX0pKHBmfHwocGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1pY29uLWJ1dHRvbi9wYXBlci1pY29uLWJ1dHRvbi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1pY29uLWJ1dHRvbiIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAifSxiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcl0scHJvcGVydGllczp7c3JjOnt0eXBlOlN0cmluZ30saWNvbjp7dHlwZTpTdHJpbmd9LGFsdDp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9hbHRDaGFuZ2VkIn19LF9hbHRDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dmFyIGY9dGhpcy5nZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiKTtmJiZkIT1mfHx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsYil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGFzaGJvYXJkLWNvbW1vbi90Zi1tdWx0aS1jaGVja2JveC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbXVsdGktY2hlY2tib3giLHByb3BlcnRpZXM6e25hbWVzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sY29sb3Jpbmc6e3R5cGU6T2JqZWN0LHZhbHVlOntnZXRDb2xvcjooKT0+IiJ9fSxyZWdleDp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwLHZhbHVlOiIifSxfcmVnZXg6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfbWFrZVJlZ2V4KHJlZ2V4KSJ9LG5hbWVzTWF0Y2hpbmdSZWdleDp7dHlwZTpBcnJheSxjb21wdXRlZDoiY29tcHV0ZU5hbWVzTWF0Y2hpbmdSZWdleChuYW1lcy4qLCBfcmVnZXgpIn0sc2VsZWN0aW9uU3RhdGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTooKT0+KHt9KX0sb3V0U2VsZWN0ZWQ6e3R5cGU6QXJyYXksbm90aWZ5OiEwLGNvbXB1dGVkOiJjb21wdXRlT3V0U2VsZWN0ZWQobmFtZXNNYXRjaGluZ1JlZ2V4LiosIHNlbGVjdGlvblN0YXRlLiopIn0sbWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDp7dHlwZTpOdW1iZXIsCnZhbHVlOjQwfSxfZGVib3VuY2VkUmVnZXhDaGFuZ2U6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7dmFyIGI9Xy5kZWJvdW5jZShkPT57dGhpcy5yZWdleD1kfSwxNTAse2xlYWRpbmc6ITF9KTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZD10aGlzLiQkKCIjbmFtZXMtcmVnZXgiKS52YWx1ZTsiIj09ZD90aGlzLmFzeW5jKCgpPT57dGhpcy5yZWdleD1kfSwzMCk6YihkKX19fX0sb2JzZXJ2ZXJzOlsiX3NldElzb2xhdG9ySWNvbihzZWxlY3Rpb25TdGF0ZSwgbmFtZXMpIl0sX21ha2VSZWdleDpmdW5jdGlvbihiKXt0cnl7cmV0dXJuIG5ldyBSZWdFeHAoYil9Y2F0Y2goZCl7cmV0dXJuIG51bGx9fSxfc2V0SXNvbGF0b3JJY29uOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5zZWxlY3Rpb25TdGF0ZSxkPV8uZmlsdGVyKF8udmFsdWVzKGIpKS5sZW5ndGg7QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5pc29sYXRvciIpKS5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuaWNvbj0KMT09PWQmJmJbZi5uYW1lXT8icmFkaW8tYnV0dG9uLWNoZWNrZWQiOiJyYWRpby1idXR0b24tdW5jaGVja2VkIn0pfSxjb21wdXRlTmFtZXNNYXRjaGluZ1JlZ2V4OmZ1bmN0aW9uKCl7Y29uc3QgYj10aGlzLl9yZWdleDtyZXR1cm4gYj90aGlzLm5hbWVzLmZpbHRlcihkPT5iLnRlc3QoZCkpOnRoaXMubmFtZXN9LGNvbXB1dGVPdXRTZWxlY3RlZDpmdW5jdGlvbigpe3ZhciBiPXRoaXMuc2VsZWN0aW9uU3RhdGUsZD10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5sZW5ndGg8PXRoaXMubWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDtyZXR1cm4gdGhpcy5uYW1lc01hdGNoaW5nUmVnZXguZmlsdGVyKGY9Pm51bGw9PWJbZl0/ZDpiW2ZdKX0sc3luY2hyb25pemVDb2xvcnM6ZnVuY3Rpb24oKXt0aGlzLl9zZXRJc29sYXRvckljb24oKTt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgicGFwZXItY2hlY2tib3giKS5mb3JFYWNoKGI9Pntjb25zdCBkPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IoYi5uYW1lKTsKYi51cGRhdGVTdHlsZXMoeyItLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3IiOmQsIi0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3IiOmQsIi0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yIjpkLCItLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3IiOmR9KX0pO3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuaXNvbGF0b3IiKS5mb3JFYWNoKGI9Pntjb25zdCBkPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IoYi5uYW1lKTtiLnN0eWxlLmNvbG9yPWR9KTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy51cGRhdGVTdHlsZXMoKX0pfSxfaXNvbGF0ZU5hbWU6ZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20oYikubG9jYWxUYXJnZXQubmFtZSxmPXt9O3RoaXMubmFtZXMuZm9yRWFjaChmdW5jdGlvbihoKXtmW2hdPWg9PWR9KTt0aGlzLnNlbGVjdGlvblN0YXRlPWZ9LF9jaGVja2JveENoYW5nZTpmdW5jdGlvbihiKXtiPQpQb2x5bWVyLmRvbShiKS5sb2NhbFRhcmdldDtjb25zdCBkPV8uY2xvbmUodGhpcy5zZWxlY3Rpb25TdGF0ZSk7ZFtiLm5hbWVdPWIuY2hlY2tlZDt0aGlzLnNlbGVjdGlvblN0YXRlPWR9LF9pc0NoZWNrZWQ6ZnVuY3Rpb24oYil7cmV0dXJuLTEhPXRoaXMub3V0U2VsZWN0ZWQuaW5kZXhPZihiKX0sdG9nZ2xlQWxsOmZ1bmN0aW9uKCl7Y29uc3QgYj10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5zb21lKGY9PnRoaXMub3V0U2VsZWN0ZWQuaW5jbHVkZXMoZikpLGQ9e307dGhpcy5uYW1lcy5mb3JFYWNoKGY9PntkW2ZdPSFifSk7dGhpcy5zZWxlY3Rpb25TdGF0ZT1kfX0pfSkocWR8fChxZD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXJ1bnMtc2VsZWN0b3IvdGYtd2JyLXN0cmluZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi13YnItc3RyaW5nIixwcm9wZXJ0aWVzOnt2YWx1ZTpTdHJpbmcsX3BhcnRzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVBhcnRzKHZhbHVlKSJ9fSxfY29tcHV0ZVBhcnRzKGIpe2NvbnN0IGQ9W10sZj0vWy89XywtXS87Zm9yKG51bGw9PWImJihiPSIiKTs7KXtjb25zdCBoPWIuc2VhcmNoKGYpO2lmKC0xPT09aCl7ZC5wdXNoKGIpO2JyZWFrfWVsc2UgZC5wdXNoKGIuc2xpY2UoMCxoKzEpKSxiPWIuc2xpY2UoaCsxKX1yZXR1cm4gZH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ydW5zLXNlbGVjdG9yL3RmLXJ1bnMtc2VsZWN0b3IuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcnVucy1zZWxlY3RvciIscHJvcGVydGllczp7cnVuU2VsZWN0aW9uU3RhdGU6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZSIsdmFsdWU6cGQuZ2V0T2JqZWN0SW5pdGlhbGl6ZXIoInJ1blNlbGVjdGlvblN0YXRlIix7ZGVmYXVsdFZhbHVlOnt9fSl9LHJlZ2V4SW5wdXQ6e3R5cGU6U3RyaW5nLHZhbHVlOnBkLmdldFN0cmluZ0luaXRpYWxpemVyKCJyZWdleElucHV0Iix7ZGVmYXVsdFZhbHVlOiIifSksb2JzZXJ2ZXI6Il9yZWdleE9ic2VydmVyIn0sc2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LG5vdGlmeTohMH0scnVuczpBcnJheSxkYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2NsaXBwZWREYXRhTG9jYXRpb246e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfZ2V0Q2xpcHBlZERhdGFMb2NhdGlvbihkYXRhTG9jYXRpb24sIF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoKSJ9LF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoOnt0eXBlOk51bWJlciwKdmFsdWU6MjUwLHJlYWRPbmx5OiEwfSxjb2xvcmluZzp7dHlwZTpPYmplY3QsdmFsdWU6e2dldENvbG9yOnBmLnJ1bnNDb2xvclNjYWxlfX19LGF0dGFjaGVkKCl7dGhpcy5fcnVuU3RvcmVMaXN0ZW5lcj12Yy5ydW5zU3RvcmUuYWRkTGlzdGVuZXIoKCk9Pnt0aGlzLnNldCgicnVucyIsdmMucnVuc1N0b3JlLmdldFJ1bnMoKSl9KTt0aGlzLnNldCgicnVucyIsdmMucnVuc1N0b3JlLmdldFJ1bnMoKSk7dGhpcy5fZW52U3RvcmVMaXN0ZW5lcj12Yy5lbnZpcm9ubWVudFN0b3JlLmFkZExpc3RlbmVyKCgpPT57dGhpcy5zZXQoImRhdGFMb2NhdGlvbiIsdmMuZW52aXJvbm1lbnRTdG9yZS5nZXREYXRhTG9jYXRpb24oKSl9KTt0aGlzLnNldCgiZGF0YUxvY2F0aW9uIix2Yy5lbnZpcm9ubWVudFN0b3JlLmdldERhdGFMb2NhdGlvbigpKX0sZGV0YWNoZWQoKXt2Yy5ydW5zU3RvcmUucmVtb3ZlTGlzdGVuZXJCeUtleSh0aGlzLl9ydW5TdG9yZUxpc3RlbmVyKTt2Yy5lbnZpcm9ubWVudFN0b3JlLnJlbW92ZUxpc3RlbmVyQnlLZXkodGhpcy5fZW52U3RvcmVMaXN0ZW5lcil9LApfdG9nZ2xlQWxsOmZ1bmN0aW9uKCl7dGhpcy4kLm11bHRpQ2hlY2tib3gudG9nZ2xlQWxsKCl9LF9nZXRDbGlwcGVkRGF0YUxvY2F0aW9uOmZ1bmN0aW9uKGIsZCl7aWYodm9pZCAwIT09YiYmIShiLmxlbmd0aD5kKSlyZXR1cm4gYn0sX29wZW5EYXRhTG9jYXRpb25EaWFsb2c6ZnVuY3Rpb24oYil7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuJCQoIiNkYXRhLWxvY2F0aW9uLWRpYWxvZyIpLm9wZW4oKX0sX3Nob3VsZFNob3dFeHBhbmREYXRhTG9jYXRpb25CdXR0b24oYixkKXtyZXR1cm4gYiYmYi5sZW5ndGg+ZH0sX3N0b3JlUnVuU2VsZWN0aW9uU3RhdGU6cGQuZ2V0T2JqZWN0T2JzZXJ2ZXIoInJ1blNlbGVjdGlvblN0YXRlIix7ZGVmYXVsdFZhbHVlOnt9fSksX3JlZ2V4T2JzZXJ2ZXI6cGQuZ2V0U3RyaW5nT2JzZXJ2ZXIoInJlZ2V4SW5wdXQiLHtkZWZhdWx0VmFsdWU6IiJ9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL3JlZ2lzdHJ5LmpzCnZhciBxZjsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXtkLk5PVF9MT0FERUQ9Ik5PVF9MT0FERUQiO2QuTE9BREVEPSJMT0FERUQiO2QuRkFJTEVEPSJGQUlMRUQifSkoYi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlfHwoYi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlPXt9KSk7Yi5kYXNoYm9hcmRSZWdpc3RyeT17fTtiLnJlZ2lzdGVyRGFzaGJvYXJkPWZ1bmN0aW9uKCl7dmFyIGQ9e3BsdWdpbjoiYmVob2xkZXIiLGVsZW1lbnROYW1lOiJ0Zi1iZWhvbGRlci1kYXNoYm9hcmQiLHNob3VsZFJlbW92ZURvbTohMH07aWYoIWQucGx1Z2luKXRocm93IEVycm9yKCJEYXNoYm9hcmQucGx1Z2luIG11c3QgYmUgcHJlc2VudCIpO2lmKCFkLmVsZW1lbnROYW1lKXRocm93IEVycm9yKCJEYXNoYm9hcmQuZWxlbWVudE5hbWUgbXVzdCBiZSBwcmVzZW50Iik7aWYoZC5wbHVnaW4gaW4gYi5kYXNoYm9hcmRSZWdpc3RyeSl0aHJvdyBFcnJvcihgUGx1Z2luIGFscmVhZHkgcmVnaXN0ZXJlZDogJHtkLnBsdWdpbn1gKTtkLnRhYk5hbWV8fAooZC50YWJOYW1lPWQucGx1Z2luKTtiLmRhc2hib2FyZFJlZ2lzdHJ5W2QucGx1Z2luXT1kfX0pKHFmfHwocWY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi11dGlscy91dGlscy5qcwp2YXIgcmY7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYsaCxrKXtyZXR1cm4gMT09PWY/aDprfWIuYWdncmVnYXRlVGFnSW5mbz1mdW5jdGlvbihmLGgpe2xldCBrPXZvaWQgMDtjb25zdCB0PXt9O09iamVjdC5rZXlzKGYpLmZvckVhY2gocD0+e2NvbnN0IG09ZltwXTt2b2lkIDA9PT1rJiYoaz1tLmRpc3BsYXlOYW1lKTtrIT09bS5kaXNwbGF5TmFtZSYmKGs9bnVsbCk7dm9pZCAwPT09dFttLmRlc2NyaXB0aW9uXSYmKHRbbS5kZXNjcmlwdGlvbl09W10pO3RbbS5kZXNjcmlwdGlvbl0ucHVzaChwKX0pO2g9bnVsbCE9az9rOmg7Y29uc3QgbD0oKCk9Pntjb25zdCBwPU9iamVjdC5rZXlzKHQpO3JldHVybiAwPT09cC5sZW5ndGg/IiI6MT09PXAubGVuZ3RoP3BbMF06YCR7Ilx4M2NwXHgzZVx4M2NzdHJvbmdceDNlTXVsdGlwbGUgZGVzY3JpcHRpb25zOlx4M2Mvc3Ryb25nXHgzZVx4M2MvcFx4M2UifTx1bD4ke3AubWFwKG09Pntjb25zdCBuPXRbbV0ubWFwKHU9PmA8Y29kZT4ke3UucmVwbGFjZSgvPC9nLCJceDI2bHQ7IikucmVwbGFjZSgvPi9nLAoiXHgyNmd0OyIpLnJlcGxhY2UoLyYvZywiXHgyNmFtcDsiKX08L2NvZGU+YCkscT0yPG4ubGVuZ3RoP24uc2xpY2UoMCxuLmxlbmd0aC0xKS5qb2luKCIsICIpKyIsIGFuZCAiK25bbi5sZW5ndGgtMV06bi5qb2luKCIgYW5kICIpO3JldHVybmA8bGk+PHA+Rm9yICR7ZChuLmxlbmd0aCwicnVuIiwicnVucyIpfSAke3F9OjwvcD4ke219PC9saT5gfSkuam9pbigiIil9PC91bD5gfSkoKTtyZXR1cm57ZGlzcGxheU5hbWU6aCxkZXNjcmlwdGlvbjpsfX19KShyZnx8KHJmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItc3Bpbm5lci9wYXBlci1zcGlubmVyLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5QYXBlclNwaW5uZXJCZWhhdmlvcj17cHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfX2FjdGl2ZUNoYW5nZWQifSxhbHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJsb2FkaW5nIixvYnNlcnZlcjoiX19hbHRDaGFuZ2VkIn0sX19jb29saW5nRG93bjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sX19jb21wdXRlQ29udGFpbmVyQ2xhc3NlczpmdW5jdGlvbihiLGQpe3JldHVybltifHxkPyJhY3RpdmUiOiIiLGQ/ImNvb2xkb3duIjoiIl0uam9pbigiICIpfSxfX2FjdGl2ZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXt0aGlzLl9fc2V0QXJpYUhpZGRlbighYik7dGhpcy5fX2Nvb2xpbmdEb3duPSFiJiZkfSxfX2FsdENoYW5nZWQ6ZnVuY3Rpb24oYil7ImxvYWRpbmciPT09Yj90aGlzLmFsdD10aGlzLmdldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIpfHxiOih0aGlzLl9fc2V0QXJpYUhpZGRlbigiIj09PQpiKSx0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsYikpfSxfX3NldEFyaWFIaWRkZW46ZnVuY3Rpb24oYil7Yj90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIil9LF9fcmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLl9fY29vbGluZ0Rvd249dGhpcy5hY3RpdmU9ITF9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1zcGlubmVyL3BhcGVyLXNwaW5uZXItbGl0ZS5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci1zcGlubmVyLWxpdGUiLGJlaGF2aW9yczpbUG9seW1lci5QYXBlclNwaW5uZXJCZWhhdmlvcl19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kYXNoYm9hcmQtY29tbW9uL2RhdGEtbG9hZGVyLWJlaGF2aW9yLmpzCihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oZil7ZltmLkxPQURJTkc9MF09IkxPQURJTkciO2ZbZi5MT0FERUQ9MV09IkxPQURFRCJ9KShkfHwoZD17fSkpO2IuRGF0YUxvYWRlckJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthY3RpdmU6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2xvYWREYXRhSWZBY3RpdmUifSxsb2FkS2V5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sZGF0YVRvTG9hZDp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LGdldERhdGFMb2FkTmFtZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Zj0+U3RyaW5nKGYpfSxsb2FkRGF0YUNhbGxiYWNrOkZ1bmN0aW9uLHJlcXVlc3REYXRhOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGY9PnRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0aGlzLmdldERhdGFMb2FkVXJsKGYpKX19LGdldERhdGFMb2FkVXJsOkZ1bmN0aW9uLGRhdGFMb2FkaW5nOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLAp2YWx1ZTohMX0sX2RhdGFMb2FkU3RhdGU6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgTWFwfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX2xvYWREYXRhQXN5bmM6e3R5cGU6TnVtYmVyLHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfZGF0YVRvTG9hZENoYW5nZWQoaXNBdHRhY2hlZCwgZGF0YVRvTG9hZC4qKSJdLG9uTG9hZEZpbmlzaCgpe30scmVsb2FkKCl7dGhpcy5fZGF0YUxvYWRTdGF0ZS5jbGVhcigpO3RoaXMuX2xvYWREYXRhKCl9LHJlc2V0KCl7bnVsbCE9dGhpcy5fbG9hZERhdGFBc3luYyYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbG9hZERhdGFBc3luYyksdGhpcy5fbG9hZERhdGFBc3luYz1udWxsKTt0aGlzLl9jYW5jZWxsZXImJnRoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKTt0aGlzLl9kYXRhTG9hZFN0YXRlJiZ0aGlzLl9kYXRhTG9hZFN0YXRlLmNsZWFyKCk7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9sb2FkRGF0YSgpfSwKX2RhdGFUb0xvYWRDaGFuZ2VkKCl7dGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9sb2FkRGF0YSgpfSxjcmVhdGVkKCl7dGhpcy5fbG9hZERhdGE9Xy50aHJvdHRsZSh0aGlzLl9sb2FkRGF0YUltcGwsMTAwLHtsZWFkaW5nOiEwLHRyYWlsaW5nOiEwfSl9LGRldGFjaGVkKCl7bnVsbCE9dGhpcy5fbG9hZERhdGFBc3luYyYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbG9hZERhdGFBc3luYyksdGhpcy5fbG9hZERhdGFBc3luYz1udWxsKX0sX2xvYWREYXRhSWZBY3RpdmUoKXt0aGlzLmFjdGl2ZSYmdGhpcy5fbG9hZERhdGEoKX0sX2xvYWREYXRhSW1wbCgpe3RoaXMuYWN0aXZlJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9sb2FkRGF0YUFzeW5jKSx0aGlzLl9sb2FkRGF0YUFzeW5jPXRoaXMuYXN5bmModGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKGY9PntpZighZi5jYW5jZWxsZWQpcmV0dXJuIHRoaXMuX3NldERhdGFMb2FkaW5nKCEwKSxmPXRoaXMuZGF0YVRvTG9hZC5maWx0ZXIoaD0+CntoPXRoaXMuZ2V0RGF0YUxvYWROYW1lKGgpO3JldHVybiF0aGlzLl9kYXRhTG9hZFN0YXRlLmhhcyhoKX0pLm1hcChoPT57Y29uc3Qgaz10aGlzLmdldERhdGFMb2FkTmFtZShoKTt0aGlzLl9kYXRhTG9hZFN0YXRlLnNldChrLGQuTE9BRElORyk7cmV0dXJuIHRoaXMucmVxdWVzdERhdGEoaCkudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUodD0+e3QuY2FuY2VsbGVkfHwodGhpcy5fZGF0YUxvYWRTdGF0ZS5zZXQoayxkLkxPQURFRCksdGhpcy5sb2FkRGF0YUNhbGxiYWNrKHRoaXMsaCx0LnZhbHVlKSk7cmV0dXJuIGt9KSl9KSxQcm9taXNlLmFsbChmKS50aGVuKHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShoPT57aWYoIWguY2FuY2VsbGVkKXtjb25zdCBrPW5ldyBTZXQoaC52YWx1ZSk7aWYodGhpcy5kYXRhVG9Mb2FkLnNvbWUodD0+ay5oYXModGhpcy5nZXREYXRhTG9hZE5hbWUodCkpKSl0aGlzLm9uTG9hZEZpbmlzaCgpfUFycmF5LmZyb20odGhpcy5fZGF0YUxvYWRTdGF0ZS52YWx1ZXMoKSkuc29tZShrPT4Kaz09PWQuTE9BRElORyl8fHRoaXMuX3NldERhdGFMb2FkaW5nKCExKX0pLCgpPT57fSkudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoKHtjYW5jZWxsZWQ6aH0pPT57aHx8KHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCl9KSl9KSkpfX19KShxZHx8KHFkPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9wbG90dGFibGUuanMKLyoKIE1JVAogTUlUCiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudHMgdGhlIFNpZ25hdHVyZSBBUEkgdG8gaGVscCBpbiBjb21wYXJpbmcgd2hlbiB0d28KIFBsb3R0YWJsZSBvYmplY3RzIGhhdmUgImNoYW5nZWQiLgoKIE1lbW9pemF0aW9uIGluIFBsb3R0YWJsZSBpcyBjb21wbGljYXRlZCBieSBtdXRhYmxlIHNjYWxlcyBhbmQgZGF0YXNldHMuIFdlIGNhbm5vdCBzaW1wbHkKIHJlZmVyZW5jZSBjb21wYXJlIHR3byBlLmcuIHNjYWxlcyBzaW5jZSBpdCBtYXkgaGF2ZSBpbnRlcm5hbGx5IG11dGF0ZWQuIFRvIHJlc29sdmUgdGhpcywKIHdlIHdyaXRlIGEgcmVjdXJzaXZlIFNpZ25hdHVyZSBpbnRlcmZhY2UgdGhhdCBob2xkcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2Ygd2hhdGV2ZXIKIHN0YXRlIHRoZSBzY2FsZS9kYXRhIHdhcyBpbiBhdCB0aGUgdGltZS4gVGhlbiBvbiBtZW1vaXplZCBmdW5jdGlvbiBpbnZvY2F0aW9uIHdlIHNpZ24gdGhlCiBuZXcgaW5wdXRzIGFuZCBjb21wYXJlIHRoZSBzaWduYXR1cmVzIHRvIGRlY2lkZSBpZiB3ZSBzaG91bGQgcmVjb21wdXRlLgoKIFdlIG11c3QgaGFuZC13cml0ZSBhIHNpZ25hdHVyZSBmb3IgZWFjaCBjdXN0b20gY2xhc3Mgd2Ugd2lzaCB0byBzdXBwb3J0LgogTUlUCgogQGZpbGVvdmVydmlldyBtYW51YWxseSBhZGQgZDMtc2VsZWN0aW9uLW11bHRpIHRvIGQzIGRlZmF1bHQgYnVuZGxlLiBNb3N0IG9mIHRoaXMgY29kZSBpcwogY29waWVkIGZyb20gZDMtc2VsZWN0aW9uLW11bHRpQDEuMC4wLgogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1zZWxlY3Rpb24tbXVsdGkvaXNzdWVzLzExIGZvciB3aHkgd2UgaGF2ZSB0byBkbyB0aGlzCiBNSVQKIEBmaWxlb3ZlcnZpZXcgSW1wbGVtZW50cyBhIGNvbnZlbmllbnQgdGh1bmsgZnVuY3Rpb24gdG8gaGFuZGxlIHRoZSBjb21tb24gY2FzZQogb2YgY3JlYXRpbmcgYSBtZW1vaXplZCBmdW5jdGlvbiB0aGF0IHRha2VzIGl0cyBpbnB1dHMgZnJvbSBtdXRhYmxlIGNsYXNzIHByb3BlcnRpZXMuCiBNSVQKIEBmaWxlb3ZlcnZpZXcgSW1wbGVtZW50cyBhIGZ1bmN0aW9uIG1lbW9pemVyIHVzaW5nIHRoZSBTaWduYXR1cmUgQVBJLgogUGxvdHRhYmxlIDMuNy4wIChodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvcGxvdHRhYmxlKQogQ29weXJpZ2h0IDIwMTQtMjAxNyBQYWxhbnRpciBUZWNobm9sb2dpZXMKIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL3Bsb3R0YWJsZS9ibG9iL21hc3Rlci9MSUNFTlNFKQogaXMtcGxhaW4tb2JqZWN0IDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9pcy1wbGFpbi1vYmplY3Q+CgogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIEpvbiBTY2hsaW5rZXJ0LgogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogaXNvYmplY3QgPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25zY2hsaW5rZXJ0L2lzb2JqZWN0PgoKIENvcHlyaWdodCAoYykgMjAxNC0yMDE3LCBKb24gU2NobGlua2VydC4KIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4KKi8KKGZ1bmN0aW9uKGIsZCl7Im9iamVjdCI9PT10eXBlb2YgZXhwb3J0cyYmIm9iamVjdCI9PT10eXBlb2YgbW9kdWxlP21vZHVsZS5leHBvcnRzPWQocmVxdWlyZSgiZDMiKSk6ImZ1bmN0aW9uIj09PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFsiZDMiXSxkKToib2JqZWN0Ij09PXR5cGVvZiBleHBvcnRzP2V4cG9ydHMuUGxvdHRhYmxlPWQocmVxdWlyZSgiZDMiKSk6Yi5QbG90dGFibGU9ZChiLmQzKX0pKHRoaXMsZnVuY3Rpb24oYil7cmV0dXJuIGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYoayl7aWYoaFtrXSlyZXR1cm4gaFtrXS5leHBvcnRzO3ZhciB0PWhba109e2k6ayxsOiExLGV4cG9ydHM6e319O2Rba10uY2FsbCh0LmV4cG9ydHMsdCx0LmV4cG9ydHMsZik7dC5sPSEwO3JldHVybiB0LmV4cG9ydHN9dmFyIGg9e307Zi5tPWQ7Zi5jPWg7Zi5pPWZ1bmN0aW9uKGspe3JldHVybiBrfTtmLmQ9ZnVuY3Rpb24oayx0LGwpe2YubyhrLHQpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoaywKdCx7Y29uZmlndXJhYmxlOiExLGVudW1lcmFibGU6ITAsZ2V0Omx9KX07Zi5uPWZ1bmN0aW9uKGspe3ZhciB0PWsmJmsuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiBrWyJkZWZhdWx0Il19OmZ1bmN0aW9uKCl7cmV0dXJuIGt9O2YuZCh0LCJhIix0KTtyZXR1cm4gdH07Zi5vPWZ1bmN0aW9uKGssdCl7cmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChrLHQpfTtmLnA9IiI7cmV0dXJuIGYoZi5zPTE0MCl9KFtmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1kPWgoMTA3KTtmLkFycmF5PWQ7ZD1oKDExMCk7Zi5Db2xvcj1kO2Q9aCg1NSk7Zi5ET009ZDtkPWgoNTYpO2YuTWF0aD1kO2Q9aCgxMTMpO2YuT2JqZWN0PWQ7ZD1oKDU3KTtmLlJUcmVlPWQ7ZD1oKDExNSk7Zi5TdGFja2luZz1kO2Q9aCgzNSk7Zi5XaW5kb3c9ZDtrKGgoMTA4KSk7ayhoKDEwOSkpO2soaCgxMikpOwprKGgoMTExKSk7ayhoKDExMikpO2soaCg1OCkpO2soaCgxMTYpKX0sZnVuY3Rpb24oZCl7ZC5leHBvcnRzPWJ9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKEcsRCxCKXt2YXIgST1ELmFjY2Vzc29yO0Q9RC5zY2FsZTtpZihudWxsPT1EKXJldHVybltdO3ZhciBOPUcuZGF0YSgpO251bGwhPUImJihOPU4uZmlsdGVyKGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEIoTyxILEcpfSkpO049Ti5tYXAoZnVuY3Rpb24oTyxIKXtyZXR1cm4gSShPLEgsRyl9KTtyZXR1cm4gRC5leHRlbnRPZlZhbHVlcyhOKX12YXIgdD10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oRyxEKXtmdW5jdGlvbiBCKCl7dGhpcy5jb25zdHJ1Y3Rvcj1HfWZvcih2YXIgSSBpbiBEKUQuaGFzT3duUHJvcGVydHkoSSkmJihHW0ldPURbSV0pO0cucHJvdG90eXBlPW51bGw9PT1EP09iamVjdC5jcmVhdGUoRCk6KEIucHJvdG90eXBlPUQucHJvdG90eXBlLG5ldyBCKX0sbD1oKDEpLHA9aCg3KTtkPWgoNCk7dmFyIG09CmgoMTgpLG49aCg2KSxxPWgoOSksdT1oKDIwKSx4PWgoMCksQT1oKDEyKSx5PWgoMTApLHc9aCg1MSksQz1oKDUyKTtmLlJlbmRlcmVyPXkubWFrZUVudW0oWyJzdmciLCJjYW52YXMiXSk7aD1mdW5jdGlvbihHKXtmdW5jdGlvbiBEKCl7dmFyIEI9Ry5jYWxsKHRoaXMpfHx0aGlzO0IuX2RhdGFDaGFuZ2VkPSExO0IuX2F0dHJFeHRlbnRzPXt9O0IuX2FuaW1hdGU9ITE7Qi5fYW5pbWF0b3JzPXt9O0IuX3Byb3BlcnR5RXh0ZW50cz17fTtCLl9yZXNldEVudGl0eVN0b3JlPWZ1bmN0aW9uKCl7Qi5fY2FjaGVkRW50aXR5U3RvcmU9dm9pZCAwfTtCLl9vdmVyZmxvd0hpZGRlbj0hMDtCLmFkZENsYXNzKCJwbG90Iik7Qi5fZGF0YXNldFRvRHJhd2VyPW5ldyB4Lk1hcDtCLl9hdHRyQmluZGluZ3M9bC5tYXAoKTtCLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyPWZ1bmN0aW9uKE4sTyl7cmV0dXJuIEIuX2luY2x1ZGVkVmFsdWVzRm9yU2NhbGUoTixPKX07Qi5fcmVuZGVyQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gQi5yZW5kZXIoKX07CkIuX29uRGF0YXNldFVwZGF0ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuIEIuX29uRGF0YXNldFVwZGF0ZSgpfTtCLl9wcm9wZXJ0eUJpbmRpbmdzPWwubWFwKCk7dmFyIEk9KG5ldyBwLkVhc2luZykubWF4VG90YWxEdXJhdGlvbihELl9BTklNQVRJT05fTUFYX0RVUkFUSU9OKTtCLmFuaW1hdG9yKHcuQW5pbWF0b3IuTUFJTixJKTtCLmFuaW1hdG9yKHcuQW5pbWF0b3IuUkVTRVQsbmV3IHAuTnVsbCk7Qi5fZGVmZXJyZWRSZXNldEVudGl0eVN0b3JlPXguV2luZG93LmRlYm91bmNlKEMuRGVmZXJyZWRSZW5kZXJlci5ERUZFUlJFRF9SRU5ERVJJTkdfREVMQVksQi5fcmVzZXRFbnRpdHlTdG9yZSk7cmV0dXJuIEJ9dChELEcpO0QuZ2V0VG90YWxEcmF3VGltZT1mdW5jdGlvbihCLEkpe3JldHVybiBJLnJlZHVjZShmdW5jdGlvbihOLE8pe3JldHVybiBOK08uYW5pbWF0b3IudG90YWxUaW1lKEIubGVuZ3RoKX0sMCl9O0QuYXBwbHlEcmF3U3RlcHM9ZnVuY3Rpb24oQixJKXtyZXR1cm4gQi5tYXAoZnVuY3Rpb24oTil7dmFyIE89Ck4uYXR0clRvUHJvamVjdG9yLEg9e307T2JqZWN0LmtleXMoTykuZm9yRWFjaChmdW5jdGlvbihLKXtIW0tdPWZ1bmN0aW9uKE0sTCl7cmV0dXJuIE9bS10oTSxMLEkpfX0pO3JldHVybnthdHRyVG9BcHBsaWVkUHJvamVjdG9yOkgsYW5pbWF0b3I6Ti5hbmltYXRvcn19KX07RC5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKEIpe0I9QS5jb2VyY2VFeHRlcm5hbEQzKEIpO0cucHJvdG90eXBlLmFuY2hvci5jYWxsKHRoaXMsQik7dGhpcy5fZGF0YUNoYW5nZWQ9ITA7dGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpO3RoaXMuX3VwZGF0ZUV4dGVudHMoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dmFyIEI9dGhpczt0aGlzLl9pc1NldHVwfHwoRy5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksbnVsbCE9dGhpcy5fY2FudmFzJiZ0aGlzLl9hcHBlbmRDYW52YXNOb2RlKCksdGhpcy5fcmVuZGVyQXJlYT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJyZW5kZXItYXJlYSIsCiEwKSx0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihJKXtyZXR1cm4gQi5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0KEkpfSkpfTtELnByb3RvdHlwZS5fYXBwZW5kQ2FudmFzTm9kZT1mdW5jdGlvbigpe3ZhciBCPXRoaXMuZWxlbWVudCgpLnNlbGVjdCgiLnBsb3QtY2FudmFzLWNvbnRhaW5lciIpO0IuZW1wdHkoKSYmKEI9dGhpcy5lbGVtZW50KCkuYXBwZW5kKCJkaXYiKS5jbGFzc2VkKCJwbG90LWNhbnZhcy1jb250YWluZXIiLCEwKSxCLm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9jYW52YXMubm9kZSgpKSl9O0QucHJvdG90eXBlLnNldEJvdW5kcz1mdW5jdGlvbihCLEksTixPKXtHLnByb3RvdHlwZS5zZXRCb3VuZHMuY2FsbCh0aGlzLEIsSSxOLE8pO3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKTtudWxsIT10aGlzLl9jYW52YXMmJih0aGlzLl9idWZmZXJDYW52YXMmJiF0aGlzLl9idWZmZXJDYW52YXNWYWxpZCYmKHRoaXMuX2J1ZmZlckNhbnZhcy5hdHRyKCJ3aWR0aCIsCnRoaXMuX2NhbnZhcy5hdHRyKCJ3aWR0aCIpKSx0aGlzLl9idWZmZXJDYW52YXMuYXR0cigiaGVpZ2h0Iix0aGlzLl9jYW52YXMuYXR0cigiaGVpZ2h0IikpLChOPXRoaXMuX2J1ZmZlckNhbnZhcy5ub2RlKCkuZ2V0Q29udGV4dCgiMmQiKSkmJk4uZHJhd0ltYWdlKHRoaXMuX2NhbnZhcy5ub2RlKCksMCwwKSx0aGlzLl9idWZmZXJDYW52YXNWYWxpZD0hMCksTj1udWxsIT13aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbz93aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzoxLHRoaXMuX2NhbnZhcy5hdHRyKCJ3aWR0aCIsQipOKSx0aGlzLl9jYW52YXMuYXR0cigiaGVpZ2h0IixJKk4pLE89dGhpcy5fY2FudmFzLm5vZGUoKS5nZXRDb250ZXh0KCIyZCIpKSYmKE8uc2V0VHJhbnNmb3JtKE4sMCwwLE4sMCwwKSx0aGlzLl9idWZmZXJDYW52YXMmJk8uZHJhd0ltYWdlKHRoaXMuX2J1ZmZlckNhbnZhcy5ub2RlKCksMCwwLEIsSSkpfTtELnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIEI9dGhpczsKRy5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3NjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oSSl7cmV0dXJuIEkub2ZmVXBkYXRlKEIuX3JlbmRlckNhbGxiYWNrKX0pO3RoaXMuZGF0YXNldHMoW10pfTtELnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKEIpe0I9dGhpcy5fZGF0YXNldFRvRHJhd2VyLmdldChCKTsic3ZnIj09PXRoaXMucmVuZGVyZXIoKT9CLnVzZVNWRyh0aGlzLl9yZW5kZXJBcmVhKTpCLnVzZUNhbnZhcyh0aGlzLl9jYW52YXMpO3JldHVybiBCfTtELnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBuLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBxLlNWR0RyYXdlcigicGF0aCIsIiIpfSxmdW5jdGlvbihCKXtyZXR1cm4gbmV3IG0uQ2FudmFzRHJhd2VyKEIsZnVuY3Rpb24oKXt9KX0pfTtELnByb3RvdHlwZS5fZ2V0QW5pbWF0b3I9ZnVuY3Rpb24oQil7cmV0dXJuIHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKT8KdGhpcy5fYW5pbWF0b3JzW0JdfHxuZXcgcC5OdWxsOm5ldyBwLk51bGx9O0QucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVFeHRlbnRzKCk7dGhpcy5fZGF0YUNoYW5nZWQ9ITA7dGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpO3RoaXMucmVuZGVyTG93UHJpb3JpdHkoKX07RC5wcm90b3R5cGUuYXR0cj1mdW5jdGlvbihCLEksTil7aWYobnVsbD09SSlyZXR1cm4gdGhpcy5fYXR0ckJpbmRpbmdzLmdldChCKTt0aGlzLl9iaW5kQXR0cihCLEksTik7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuX2JpbmRQcm9wZXJ0eT1mdW5jdGlvbihCLEksTixPKXt2YXIgSD10aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChCKTtIPW51bGwhPUg/SC5zY2FsZTpudWxsO3RoaXMuX3Byb3BlcnR5QmluZGluZ3Muc2V0KEIse2FjY2Vzc29yOiJmdW5jdGlvbiI9PT10eXBlb2YgST9JOmZ1bmN0aW9uKCl7cmV0dXJuIEl9LHNjYWxlOk4scG9zdFNjYWxlOk99KTsKbnVsbCE9SCYmdGhpcy5fdW5pbnN0YWxsU2NhbGVGb3JLZXkoSCxCKTtudWxsIT1OJiZ0aGlzLl9pbnN0YWxsU2NhbGVGb3JLZXkoTixCKTt0aGlzLl9jbGVhckF0dHJUb1Byb2plY3RvckNhY2hlKCl9O0QucHJvdG90eXBlLl9iaW5kQXR0cj1mdW5jdGlvbihCLEksTil7dmFyIE89dGhpcy5fYXR0ckJpbmRpbmdzLmdldChCKTtPPW51bGwhPU8/Ty5zY2FsZTpudWxsO3RoaXMuX2F0dHJCaW5kaW5ncy5zZXQoQix7YWNjZXNzb3I6ImZ1bmN0aW9uIj09PXR5cGVvZiBJP0k6ZnVuY3Rpb24oKXtyZXR1cm4gSX0sc2NhbGU6Tn0pO251bGwhPU8mJnRoaXMuX3VuaW5zdGFsbFNjYWxlRm9yS2V5KE8sQik7bnVsbCE9TiYmdGhpcy5faW5zdGFsbFNjYWxlRm9yS2V5KE4sQik7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpfTtELnByb3RvdHlwZS5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZT1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3J9O0QucHJvdG90eXBlLl9nZXRBdHRyVG9Qcm9qZWN0b3I9CmZ1bmN0aW9uKCl7bnVsbD09dGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yJiYodGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yPXRoaXMuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yKCkpO3JldHVybiB4Lk9iamVjdC5hc3NpZ24oe30sdGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yKX07RC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIEI9e307dGhpcy5fYXR0ckJpbmRpbmdzLmVhY2goZnVuY3Rpb24oTixPKXtCW09dPUQuX3NjYWxlZEFjY2Vzc29yKE4pfSk7dmFyIEk9dGhpcy5fcHJvcGVydHlQcm9qZWN0b3JzKCk7T2JqZWN0LmtleXMoSSkuZm9yRWFjaChmdW5jdGlvbihOKXtudWxsPT1CW05dJiYoQltOXT1JW05dKX0pO3JldHVybiBCfTtELnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe0cucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5faXNBbmNob3JlZCYmKHRoaXMuX3BhaW50KCksCnRoaXMuX2RhdGFDaGFuZ2VkPSExKTtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUucmVuZGVyTG93UHJpb3JpdHk9ZnVuY3Rpb24oKXt0aGlzLl9yZW5kZXJDYWxsYmFjaygpfTtELnByb3RvdHlwZS5hbmltYXRlZD1mdW5jdGlvbihCKXtpZihudWxsPT1CKXJldHVybiB0aGlzLl9hbmltYXRlO3RoaXMuX2FuaW1hdGU9QjtyZXR1cm4gdGhpc307RC5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7Ry5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyk7dGhpcy5fdXBkYXRlRXh0ZW50cygpO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5fc2NhbGVzPWZ1bmN0aW9uKCl7dmFyIEI9W107dGhpcy5fYXR0ckJpbmRpbmdzLmVhY2goZnVuY3Rpb24oSSl7ST1JLnNjYWxlO251bGwhPUkmJi0xPT09Qi5pbmRleE9mKEkpJiZCLnB1c2goSSl9KTt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmVhY2goZnVuY3Rpb24oSSl7ST1JLnNjYWxlO251bGwhPUkmJi0xPT09Qi5pbmRleE9mKEkpJiZCLnB1c2goSSl9KTsKcmV0dXJuIEJ9O0QucHJvdG90eXBlLl91cGRhdGVFeHRlbnRzPWZ1bmN0aW9uKCl7dmFyIEI9dGhpczt0aGlzLl9yZXNldEVudGl0eVN0b3JlKCk7dGhpcy5fc2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihJKXtyZXR1cm4gSS5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKEIuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfSl9O0QucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eT1mdW5jdGlvbigpe3JldHVybiBudWxsfTtELnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yQXR0cj1mdW5jdGlvbihCKXt2YXIgST10aGlzO251bGw9PXRoaXMuX2F0dHJFeHRlbnRzW0JdJiYodGhpcy5fYXR0ckV4dGVudHNbQl09dS5tZW1UaHVuayhmdW5jdGlvbigpe3JldHVybiBJLmRhdGFzZXRzKCl9LGZ1bmN0aW9uKCl7cmV0dXJuIEkuX2F0dHJCaW5kaW5ncy5nZXQoQil9LGZ1bmN0aW9uKE4sTyl7cmV0dXJuIG51bGw9PU98fG51bGw9PU8uYWNjZXNzb3I/bnVsbDpOLm1hcChmdW5jdGlvbihIKXtyZXR1cm4gayhILApPLG51bGwpfSl9KSk7cmV0dXJuIHRoaXMuX2F0dHJFeHRlbnRzW0JdKCl9O0QucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihCKXt2YXIgST10aGlzO251bGw9PXRoaXMuX3Byb3BlcnR5RXh0ZW50c1tCXSYmKHRoaXMuX3Byb3BlcnR5RXh0ZW50c1tCXT11Lm1lbVRodW5rKGZ1bmN0aW9uKCl7cmV0dXJuIEkuZGF0YXNldHMoKX0sZnVuY3Rpb24oKXtyZXR1cm4gSS5fcHJvcGVydHlCaW5kaW5ncy5nZXQoQil9LGZ1bmN0aW9uKCl7cmV0dXJuIEkuX2ZpbHRlckZvclByb3BlcnR5KEIpfSxmdW5jdGlvbihOLE8sSCl7cmV0dXJuIG51bGw9PU98fG51bGw9PU8uYWNjZXNzb3I/bnVsbDpOLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gayhLLE8sSCl9KX0pKTtyZXR1cm4gdGhpcy5fcHJvcGVydHlFeHRlbnRzW0JdKCl9O0QucHJvdG90eXBlLl9pbmNsdWRlZFZhbHVlc0ZvclNjYWxlPWZ1bmN0aW9uKEIsSSl7dmFyIE49dGhpcztpZighdGhpcy5faXNBbmNob3JlZCYmCiFJKXJldHVybltdO3ZhciBPPVtdO3RoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uKEgsSyl7SC5zY2FsZT09PUImJihIPU4uZ2V0RXh0ZW50c0ZvckF0dHIoSyksbnVsbCE9SCYmKE89Ty5jb25jYXQobC5tZXJnZShIKSkpKX0pO3RoaXMuX3Byb3BlcnR5QmluZGluZ3MuZWFjaChmdW5jdGlvbihILEspe0guc2NhbGU9PT1CJiYoSD1OLmdldEV4dGVudHNGb3JQcm9wZXJ0eShLKSxudWxsIT1IJiYoTz1PLmNvbmNhdChsLm1lcmdlKEgpKSkpfSk7cmV0dXJuIE99O0QucHJvdG90eXBlLmFuaW1hdG9yPWZ1bmN0aW9uKEIsSSl7aWYodm9pZCAwPT09SSlyZXR1cm4gdGhpcy5fYW5pbWF0b3JzW0JdO3RoaXMuX2FuaW1hdG9yc1tCXT1JO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5yZW5kZXJlcj1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLl9jYW52YXM/InN2ZyI6ImNhbnZhcyJ9O0QucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oQil7dGhpcy5fYWRkRGF0YXNldChCKTsKdGhpcy5fb25EYXRhc2V0VXBkYXRlKCl9O0QucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKEIpe3RoaXMuX3JlbW92ZURhdGFzZXQoQik7dmFyIEk9dGhpcy5fY3JlYXRlRHJhd2VyKEIpO3RoaXMuX2RhdGFzZXRUb0RyYXdlci5zZXQoQixJKTt0aGlzLl9pc1NldHVwJiZ0aGlzLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQoQik7Qi5vblVwZGF0ZSh0aGlzLl9vbkRhdGFzZXRVcGRhdGVDYWxsYmFjayk7cmV0dXJuIHRoaXN9O0QucHJvdG90eXBlLnJlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oQil7dGhpcy5fcmVtb3ZlRGF0YXNldChCKTt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKX07RC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oQil7aWYoLTE9PT10aGlzLmRhdGFzZXRzKCkuaW5kZXhPZihCKSlyZXR1cm4gdGhpczt0aGlzLl9yZW1vdmVEYXRhc2V0Tm9kZXMoQik7Qi5vZmZVcGRhdGUodGhpcy5fb25EYXRhc2V0VXBkYXRlQ2FsbGJhY2spO3RoaXMuX2RhdGFzZXRUb0RyYXdlci5kZWxldGUoQik7CnJldHVybiB0aGlzfTtELnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzPWZ1bmN0aW9uKEIpe3RoaXMuX2RhdGFzZXRUb0RyYXdlci5nZXQoQikucmVtb3ZlKCl9O0QucHJvdG90eXBlLmRhdGFzZXRzPWZ1bmN0aW9uKEIpe3ZhciBJPXRoaXMsTj1bXTt0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZm9yRWFjaChmdW5jdGlvbihPLEgpe3JldHVybiBOLnB1c2goSCl9KTtpZihudWxsPT1CKXJldHVybiBOO04uZm9yRWFjaChmdW5jdGlvbihPKXtyZXR1cm4gSS5fcmVtb3ZlRGF0YXNldChPKX0pO0IuZm9yRWFjaChmdW5jdGlvbihPKXtyZXR1cm4gSS5fYWRkRGF0YXNldChPKX0pO3RoaXMuX29uRGF0YXNldFVwZGF0ZSgpO3JldHVybiB0aGlzfTtELnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjpuZXcgcC5OdWxsfV19O0QucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9CmZ1bmN0aW9uKCl7fTtELnByb3RvdHlwZS5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcz1mdW5jdGlvbihCKXt2YXIgST10aGlzLE49W107Qi5mb3JFYWNoKGZ1bmN0aW9uKE8sSCl7dmFyIEs9SS5fZGF0YXNldFRvRHJhd2VyLmdldChPKSxNPTA7Ty5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbihMLFEpe3ZhciBUPUkuX3BpeGVsUG9pbnQoTCxRLE8pO3guTWF0aC5pc05hTihULngpfHx4Lk1hdGguaXNOYU4oVC55KXx8KE4ucHVzaCh7ZGF0dW06TCxnZXQgcG9zaXRpb24oKXtyZXR1cm4gSS5fcGl4ZWxQb2ludC5jYWxsKEksTCxRLE8pfSxpbmRleDpRLGRhdGFzZXQ6TyxkYXRhc2V0SW5kZXg6SCxjb21wb25lbnQ6SSxkcmF3ZXI6Syx2YWxpZERhdHVtSW5kZXg6TX0pLE0rKyl9KX0pO3JldHVybiBOfTtELnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBCPW5ldyB4Lk1hcDt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihJKXtyZXR1cm4gQi5zZXQoSSwKSS5kYXRhKCkpfSk7cmV0dXJuIEJ9O0QucHJvdG90eXBlLl9wYWludD1mdW5jdGlvbigpe3ZhciBCPXRoaXM7ZGVsZXRlIHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3Rvcjt2YXIgST10aGlzLl9nZW5lcmF0ZURyYXdTdGVwcygpLE49dGhpcy5fZ2V0RGF0YVRvRHJhdygpLE89dGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gQi5fZGF0YXNldFRvRHJhd2VyLmdldChLKX0pO2lmKCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXt2YXIgSD10aGlzLl9jYW52YXMubm9kZSgpO0guZ2V0Q29udGV4dCgiMmQiKS5jbGVhclJlY3QoMCwwLEguY2xpZW50V2lkdGgsSC5jbGllbnRIZWlnaHQpO3RoaXMuX2J1ZmZlckNhbnZhc1ZhbGlkPSExfXRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEssTSl7dmFyIEw9RC5hcHBseURyYXdTdGVwcyhJLEspO09bTV0uZHJhdyhOLmdldChLKSxMKX0pO0g9dGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihLKXtyZXR1cm4gRC5nZXRUb3RhbERyYXdUaW1lKE4uZ2V0KEspLApJKX0pO0g9eC5NYXRoLm1heChILDApO3RoaXMuX2FkZGl0aW9uYWxQYWludChIKX07RC5wcm90b3R5cGUuc2VsZWN0aW9ucz1mdW5jdGlvbihCKXt2YXIgST10aGlzO3ZvaWQgMD09PUImJihCPXRoaXMuZGF0YXNldHMoKSk7aWYoImNhbnZhcyI9PT10aGlzLnJlbmRlcmVyKCkpcmV0dXJuIGwuc2VsZWN0QWxsKCk7dmFyIE49W107Qi5mb3JFYWNoKGZ1bmN0aW9uKE8pe089SS5fZGF0YXNldFRvRHJhd2VyLmdldChPKTtudWxsIT1PJiYoTz1PLmdldFZpc3VhbFByaW1pdGl2ZXMoKSxOLnB1c2guYXBwbHkoTixPKSl9KTtyZXR1cm4gbC5zZWxlY3RBbGwoTil9O0QucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKEIpe3ZhciBJPXRoaXM7cmV0dXJuIHRoaXMuX2dldEVudGl0eVN0b3JlKEIpLmVudGl0aWVzKCkubWFwKGZ1bmN0aW9uKE4pe3JldHVybiBJLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoTil9KX07RC5wcm90b3R5cGUuX2dldEVudGl0eVN0b3JlPWZ1bmN0aW9uKEIpe2Z1bmN0aW9uIEkoSCl7cmV0dXJuIE4uX2VudGl0eUJvdW5kcyhIKX0KdmFyIE49dGhpcztpZih2b2lkIDAhPT1CKXt2YXIgTz1uZXcgeC5FbnRpdHlTdG9yZTtPLmFkZEFsbCh0aGlzLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzKEIpLEksdGhpcy5fbG9jYWxPcmlnaW5Cb3VuZHMoKSk7cmV0dXJuIE99dm9pZCAwPT09dGhpcy5fY2FjaGVkRW50aXR5U3RvcmUmJihPPW5ldyB4LkVudGl0eVN0b3JlLE8uYWRkQWxsKHRoaXMuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXModGhpcy5kYXRhc2V0cygpKSxJLHRoaXMuX2xvY2FsT3JpZ2luQm91bmRzKCkpLHRoaXMuX2NhY2hlZEVudGl0eVN0b3JlPU8pO3JldHVybiB0aGlzLl9jYWNoZWRFbnRpdHlTdG9yZX07RC5wcm90b3R5cGUuX2xvY2FsT3JpZ2luQm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJue3RvcExlZnQ6e3g6MCx5OjB9LGJvdHRvbVJpZ2h0Ont4OnRoaXMud2lkdGgoKSx5OnRoaXMuaGVpZ2h0KCl9fX07RC5wcm90b3R5cGUuX2VudGl0eUJvdW5kcz1mdW5jdGlvbihCKXtCPXRoaXMuX3BpeGVsUG9pbnQoQi5kYXR1bSwKQi5pbmRleCxCLmRhdGFzZXQpO3JldHVybnt4OkIueCx5OkIueSx3aWR0aDowLGhlaWdodDowfX07RC5wcm90b3R5cGUuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eT1mdW5jdGlvbihCKXtyZXR1cm57Ym91bmRzOnRoaXMuX2VudGl0eUJvdW5kcyhCKSxjb21wb25lbnQ6Qi5jb21wb25lbnQsZGF0YXNldDpCLmRhdGFzZXQsZGF0YXNldEluZGV4OkIuZGF0YXNldEluZGV4LGRhdHVtOkIuZGF0dW0saW5kZXg6Qi5pbmRleCxwb3NpdGlvbjpCLnBvc2l0aW9uLHNlbGVjdGlvbjpsLnNlbGVjdChCLmRyYXdlci5nZXRWaXN1YWxQcmltaXRpdmVzKClbQi52YWxpZERhdHVtSW5kZXhdKX19O0QucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigicGxvdHMgbXVzdCBpbXBsZW1lbnQgZW50aXRpZXNBdCIpO307RC5wcm90b3R5cGUuZW50aXR5TmVhcmVzdD1mdW5jdGlvbihCKXtCPXRoaXMuX2dldEVudGl0eVN0b3JlKCkuZW50aXR5TmVhcmVzdChCKTsKcmV0dXJuIHZvaWQgMD09PUI/dm9pZCAwOnRoaXMuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShCKX07RC5wcm90b3R5cGUuZW50aXRpZXNJbj1mdW5jdGlvbihCLEkpe3JldHVybiB0aGlzLmVudGl0aWVzSW5Cb3VuZHMobnVsbD09ST97eDpCLnRvcExlZnQueCx5OkIudG9wTGVmdC55LHdpZHRoOkIuYm90dG9tUmlnaHQueC1CLnRvcExlZnQueCxoZWlnaHQ6Qi5ib3R0b21SaWdodC55LUIudG9wTGVmdC55fTp7eDpCLm1pbix5OkkubWluLHdpZHRoOkIubWF4LUIubWluLGhlaWdodDpJLm1heC1JLm1pbn0pfTtELnByb3RvdHlwZS5lbnRpdGllc0luQm91bmRzPWZ1bmN0aW9uKEIpe3ZhciBJPXRoaXM7aWYoQj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzSW5Cb3VuZHMoQikpcmV0dXJuIEIubWFwKGZ1bmN0aW9uKE4pe3JldHVybiBJLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoTil9KX07RC5wcm90b3R5cGUuZW50aXRpZXNJblhCb3VuZHM9CmZ1bmN0aW9uKEIpe3ZhciBJPXRoaXM7aWYoQj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzSW5YQm91bmRzKEIpKXJldHVybiBCLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gSS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KE4pfSl9O0QucHJvdG90eXBlLmVudGl0aWVzSW5ZQm91bmRzPWZ1bmN0aW9uKEIpe3ZhciBJPXRoaXM7aWYoQj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzSW5ZQm91bmRzKEIpKXJldHVybiBCLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gSS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KE4pfSl9O0QucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbihCKXtCLm9mZlVwZGF0ZSh0aGlzLl9yZW5kZXJDYWxsYmFjayk7Qi5vZmZVcGRhdGUodGhpcy5fZGVmZXJyZWRSZXNldEVudGl0eVN0b3JlKTtCLnJlbW92ZUluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcil9OwpELnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5PWZ1bmN0aW9uKEIpe0Iub25VcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spO0Iub25VcGRhdGUodGhpcy5fZGVmZXJyZWRSZXNldEVudGl0eVN0b3JlKTtCLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcil9O0QucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXtyZXR1cm57fX07RC5fc2NhbGVkQWNjZXNzb3I9ZnVuY3Rpb24oQil7dmFyIEk9Qi5zY2FsZSxOPUIuYWNjZXNzb3IsTz1CLnBvc3RTY2FsZSxIPW51bGw9PUk/TjpmdW5jdGlvbihLLE0sTCl7cmV0dXJuIEkuc2NhbGUoTihLLE0sTCkpfTtyZXR1cm4gbnVsbD09Tz9IOmZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gTyhIKEssTSxMKSxLLE0sTCl9fTtELnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbigpe3JldHVybnt4OjAseTowfX07RC5wcm90b3R5cGUuX2FuaW1hdGVPbk5leHRSZW5kZXI9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGUmJnRoaXMuX2RhdGFDaGFuZ2VkfTtyZXR1cm4gRH0oZC5Db21wb25lbnQpO2guX0FOSU1BVElPTl9NQVhfRFVSQVRJT049NjAwO2YuUGxvdD1ofSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhwKXtmb3IodmFyIG0gaW4gcClmLmhhc093blByb3BlcnR5KG0pfHwoZlttXT1wW21dKX1kPWgoMTA1KTtmLlRpY2tHZW5lcmF0b3JzPWQ7ayhoKDU0KSk7ayhoKDEwMSkpO2soaCgxMDIpKTtrKGgoMTAzKSk7ayhoKDEwNCkpO2soaCgxMDYpKTt2YXIgdD1oKDU0KSxsPWgoMTEpO2YuaXNUcmFuc2Zvcm1hYmxlPWZ1bmN0aW9uKHApe3JldHVybiBwIGluc3RhbmNlb2YgbC5RdWFudGl0YXRpdmVTY2FsZXx8cCBpbnN0YW5jZW9mIHQuQ2F0ZWdvcnl9fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgxKSx0PWgoMzApLGw9aCgwKSxwPWgoMTIpO2Q9aCgxMCk7Zi5YQWxpZ25tZW50PWQubWFrZUVudW0oWyJsZWZ0IiwiY2VudGVyIiwicmlnaHQiXSk7CmYuWUFsaWdubWVudD1kLm1ha2VFbnVtKFsidG9wIiwiY2VudGVyIiwiYm90dG9tIl0pO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBtKCl7dGhpcy5fb3ZlcmZsb3dIaWRkZW49ITE7dGhpcy5fb3JpZ2luPXt4OjAseTowfTt0aGlzLl94QWxpZ25tZW50PSJsZWZ0Ijt0aGlzLl95QWxpZ25tZW50PSJ0b3AiO3RoaXMuX2lzQW5jaG9yZWQ9dGhpcy5faXNTZXR1cD0hMTt0aGlzLl9jc3NDbGFzc2VzPW5ldyBsLlNldDt0aGlzLl9kZXN0cm95ZWQ9ITE7dGhpcy5fb25BbmNob3JDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7dGhpcy5fb25EZXRhY2hDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7dGhpcy5fY3NzQ2xhc3Nlcy5hZGQoImNvbXBvbmVudCIpfW0ucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbihuKXtuPXAuY29lcmNlRXh0ZXJuYWxEMyhuKTtpZih0aGlzLl9kZXN0cm95ZWQpdGhyb3cgRXJyb3IoIkNhbid0IHJldXNlIGRlc3Ryb3koKS1lZCBDb21wb25lbnRzISIpO3RoaXMuaXNSb290KCkmJgoodGhpcy5fcm9vdEVsZW1lbnQ9bix0aGlzLl9yb290RWxlbWVudC5jbGFzc2VkKCJwbG90dGFibGUiLCEwKSk7bnVsbCE9dGhpcy5fZWxlbWVudD9uLm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9lbGVtZW50Lm5vZGUoKSk6KHRoaXMuX2VsZW1lbnQ9bi5hcHBlbmQoImRpdiIpLHRoaXMuX3NldHVwKCkpO3RoaXMuX2lzQW5jaG9yZWQ9ITA7dGhpcy5fb25BbmNob3JDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25BbmNob3I9ZnVuY3Rpb24obil7dGhpcy5faXNBbmNob3JlZCYmbih0aGlzKTt0aGlzLl9vbkFuY2hvckNhbGxiYWNrcy5hZGQobil9O20ucHJvdG90eXBlLm9mZkFuY2hvcj1mdW5jdGlvbihuKXt0aGlzLl9vbkFuY2hvckNhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3ZhciBuPXRoaXM7dGhpcy5faXNTZXR1cHx8KHRoaXMuX2Nzc0NsYXNzZXMuZm9yRWFjaChmdW5jdGlvbihxKXtuLl9lbGVtZW50LmNsYXNzZWQocSwKITApfSksdGhpcy5fY3NzQ2xhc3Nlcz1uZXcgbC5TZXQsdGhpcy5fYmFja2dyb3VuZENvbnRhaW5lcj10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiYmFja2dyb3VuZC1jb250YWluZXIiLCEwKSx0aGlzLl9jb250ZW50PXRoaXMuX2VsZW1lbnQuYXBwZW5kKCJzdmciKS5jbGFzc2VkKCJjb250ZW50IiwhMCksdGhpcy5fZm9yZWdyb3VuZENvbnRhaW5lcj10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiZm9yZWdyb3VuZC1jb250YWluZXIiLCEwKSx0aGlzLl9vdmVyZmxvd0hpZGRlbj90aGlzLl9jb250ZW50LmNsYXNzZWQoImNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4iLCEwKTp0aGlzLl9jb250ZW50LmNsYXNzZWQoImNvbXBvbmVudC1vdmVyZmxvdy12aXNpYmxlIiwhMCksdGhpcy5faXNTZXR1cD0hMCl9O20ucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKCl7cmV0dXJue21pbldpZHRoOjAsbWluSGVpZ2h0OjB9fTttLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PQpmdW5jdGlvbihuLHEsdSl7aWYobnVsbD09bnx8bnVsbD09cXx8bnVsbD09dSl7aWYobnVsbD09dGhpcy5fZWxlbWVudCl0aHJvdyBFcnJvcigiYW5jaG9yKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNvbXB1dGVMYXlvdXQoKSIpO2lmKG51bGwhPXRoaXMuX3Jvb3RFbGVtZW50KW49e3g6MCx5OjB9LHU9dGhpcy5fcm9vdEVsZW1lbnQubm9kZSgpLHE9bC5ET00uZWxlbWVudFdpZHRoKHUpLHU9bC5ET00uZWxlbWVudEhlaWdodCh1KTtlbHNlIHRocm93IEVycm9yKCJudWxsIGFyZ3VtZW50cyBjYW5ub3QgYmUgcGFzc2VkIHRvIGNvbXB1dGVMYXlvdXQoKSBvbiBhIG5vbi1yb290LCB1bmFuY2hvcmVkIG5vZGUiKTt9dmFyIHg9dGhpcy5fc2l6ZUZyb21PZmZlcihxLHUpLEE9eC5oZWlnaHQ7eD14LndpZHRoO3RoaXMuc2V0Qm91bmRzKHgsQSxuLngrKHEteCkqbS5feEFsaWduVG9Qcm9wb3J0aW9uW3RoaXMuX3hBbGlnbm1lbnRdLG4ueSsodS1BKSptLl95QWxpZ25Ub1Byb3BvcnRpb25bdGhpcy5feUFsaWdubWVudF0pOwpyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuc2V0Qm91bmRzPWZ1bmN0aW9uKG4scSx1LHgpe3ZvaWQgMD09PXUmJih1PTApO3ZvaWQgMD09PXgmJih4PTApO3RoaXMuX3dpZHRoPW47dGhpcy5faGVpZ2h0PXE7dGhpcy5fb3JpZ2luPXt4OnUseTp4fTtudWxsIT10aGlzLl9lbGVtZW50JiZ0aGlzLl9lbGVtZW50LnN0eWxlcyh7bGVmdDp1KyJweCIsaGVpZ2h0OnErInB4Iix0b3A6eCsicHgiLHdpZHRoOm4rInB4In0pO251bGwhPXRoaXMuX3Jlc2l6ZUhhbmRsZXImJnRoaXMuX3Jlc2l6ZUhhbmRsZXIoe3dpZHRoOm4saGVpZ2h0OnF9KX07bS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24obixxKXt2YXIgdT10aGlzLnJlcXVlc3RlZFNwYWNlKG4scSk7cmV0dXJue3dpZHRoOnRoaXMuZml4ZWRXaWR0aCgpP01hdGgubWluKG4sdS5taW5XaWR0aCk6bixoZWlnaHQ6dGhpcy5maXhlZEhlaWdodCgpP01hdGgubWluKHEsdS5taW5IZWlnaHQpOnF9fTttLnByb3RvdHlwZS5yZW5kZXI9CmZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5faXNTZXR1cCYmMDw9dGhpcy53aWR0aCgpJiYwPD10aGlzLmhlaWdodCgpJiZ0LnJlZ2lzdGVyVG9SZW5kZXIodGhpcyk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJlbmRlckxvd1ByaW9yaXR5PWZ1bmN0aW9uKCl7dGhpcy5yZW5kZXIoKX07bS5wcm90b3R5cGUuX3NjaGVkdWxlQ29tcHV0ZUxheW91dD1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2lzU2V0dXAmJnQucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXIodGhpcyl9O20ucHJvdG90eXBlLm9uUmVzaXplPWZ1bmN0aW9uKG4pe3RoaXMuX3Jlc2l6ZUhhbmRsZXI9bjtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUucmVkcmF3PWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5faXNTZXR1cCYmKHRoaXMuaXNSb290KCk/dGhpcy5fc2NoZWR1bGVDb21wdXRlTGF5b3V0KCk6CnRoaXMucGFyZW50KCkucmVkcmF3KCkpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt9O20ucHJvdG90eXBlLnJlbmRlclRvPWZ1bmN0aW9uKG4pe3RoaXMuZGV0YWNoKCk7aWYobnVsbCE9bil7bj0ic3RyaW5nIj09PXR5cGVvZiBuP2suc2VsZWN0KG4pOm4gaW5zdGFuY2VvZiBFbGVtZW50P2suc2VsZWN0KG4pOnAuY29lcmNlRXh0ZXJuYWxEMyhuKTtpZighbi5ub2RlKCl8fG51bGw9PW4ubm9kZSgpLm5vZGVOYW1lKXRocm93IEVycm9yKCJQbG90dGFibGUgcmVxdWlyZXMgYSB2YWxpZCBFbGVtZW50IHRvIHJlbmRlclRvIik7aWYoInN2ZyI9PT1uLm5vZGUoKS5ub2RlTmFtZSl0aHJvdyBFcnJvcigiUGxvdHRhYmxlIDMueCBhbmQgbGF0ZXIgY2FuIG9ubHkgcmVuZGVyVG8gYW4gSFRNTCBjb21wb25lbnQ7IHBhc3MgYSBkaXYgaW5zdGVhZCEiKTt0aGlzLmFuY2hvcihuKX1pZihudWxsPT10aGlzLl9lbGVtZW50KXRocm93IEVycm9yKCJJZiBhIENvbXBvbmVudCBoYXMgbmV2ZXIgYmVlbiByZW5kZXJlZCBiZWZvcmUsIHRoZW4gcmVuZGVyVG8gbXVzdCBiZSBnaXZlbiBhIG5vZGUgdG8gcmVuZGVyIHRvLCBvciBhIGQzLlNlbGVjdGlvbiwgb3IgYSBzZWxlY3RvciBzdHJpbmciKTsKdC5yZWdpc3RlclRvQ29tcHV0ZUxheW91dEFuZFJlbmRlcih0aGlzKTt0LmZsdXNoKCl9O20ucHJvdG90eXBlLnhBbGlnbm1lbnQ9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5feEFsaWdubWVudDtuPW4udG9Mb3dlckNhc2UoKTtpZihudWxsPT1tLl94QWxpZ25Ub1Byb3BvcnRpb25bbl0pdGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIGFsaWdubWVudDogIituKTt0aGlzLl94QWxpZ25tZW50PW47dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUueUFsaWdubWVudD1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl95QWxpZ25tZW50O249bi50b0xvd2VyQ2FzZSgpO2lmKG51bGw9PW0uX3lBbGlnblRvUHJvcG9ydGlvbltuXSl0aHJvdyBFcnJvcigiVW5zdXBwb3J0ZWQgYWxpZ25tZW50OiAiK24pO3RoaXMuX3lBbGlnbm1lbnQ9bjt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5oYXNDbGFzcz1mdW5jdGlvbihuKXtyZXR1cm4gbnVsbD09Cm4/ITE6bnVsbD09dGhpcy5fZWxlbWVudD90aGlzLl9jc3NDbGFzc2VzLmhhcyhuKTp0aGlzLl9lbGVtZW50LmNsYXNzZWQobil9O20ucHJvdG90eXBlLmFkZENsYXNzPWZ1bmN0aW9uKG4pe251bGwhPW4mJihudWxsPT10aGlzLl9lbGVtZW50P3RoaXMuX2Nzc0NsYXNzZXMuYWRkKG4pOnRoaXMuX2VsZW1lbnQuY2xhc3NlZChuLCEwKSl9O20ucHJvdG90eXBlLnJlbW92ZUNsYXNzPWZ1bmN0aW9uKG4pe251bGwhPW4mJihudWxsPT10aGlzLl9lbGVtZW50P3RoaXMuX2Nzc0NsYXNzZXMuZGVsZXRlKG4pOnRoaXMuX2VsZW1lbnQuY2xhc3NlZChuLCExKSl9O20ucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMX07bS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMX07bS5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7dGhpcy5wYXJlbnQobnVsbCk7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5fZWxlbWVudC5yZW1vdmUoKTt0aGlzLl9pc0FuY2hvcmVkPQohMTt0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vbkRldGFjaD1mdW5jdGlvbihuKXt0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5hZGQobil9O20ucHJvdG90eXBlLm9mZkRldGFjaD1mdW5jdGlvbihuKXt0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLnBhcmVudD1mdW5jdGlvbihuKXtpZih2b2lkIDA9PT1uKXJldHVybiB0aGlzLl9wYXJlbnQ7aWYobnVsbCE9PW4mJiFuLmhhcyh0aGlzKSl0aHJvdyBFcnJvcigiUGFzc2VkIGludmFsaWQgcGFyZW50Iik7dGhpcy5fcGFyZW50PW47cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmJvdW5kcz1mdW5jdGlvbigpe3ZhciBuPXRoaXMub3JpZ2luKCk7cmV0dXJue3RvcExlZnQ6bixib3R0b21SaWdodDp7eDpuLngrdGhpcy53aWR0aCgpLHk6bi55K3RoaXMuaGVpZ2h0KCl9fX07bS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3RoaXMuX2Rlc3Ryb3llZD0KITA7dGhpcy5kZXRhY2goKX07bS5wcm90b3R5cGUud2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd2lkdGh9O20ucHJvdG90eXBlLmhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9oZWlnaHR9O20ucHJvdG90eXBlLm9yaWdpbj1mdW5jdGlvbigpe3JldHVybnt4OnRoaXMuX29yaWdpbi54LHk6dGhpcy5fb3JpZ2luLnl9fTttLnByb3RvdHlwZS5vcmlnaW5Ub1Jvb3Q9ZnVuY3Rpb24oKXtmb3IodmFyIG49dGhpcy5vcmlnaW4oKSxxPXRoaXMucGFyZW50KCk7bnVsbCE9cTspe3ZhciB1PXEub3JpZ2luKCk7bi54Kz11Lng7bi55Kz11Lnk7cT1xLnBhcmVudCgpfXJldHVybiBufTttLnByb3RvdHlwZS5yb290PWZ1bmN0aW9uKCl7Zm9yKHZhciBuPXRoaXM7IW4uaXNSb290KCk7KW49bi5wYXJlbnQoKTtyZXR1cm4gbn07bS5wcm90b3R5cGUuaXNSb290PWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXRoaXMucGFyZW50KCl9O20ucHJvdG90eXBlLmZvcmVncm91bmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZm9yZWdyb3VuZENvbnRhaW5lcn07Cm0ucHJvdG90eXBlLmNvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGVudH07bS5wcm90b3R5cGUuZWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGVtZW50fTttLnByb3RvdHlwZS5yb290RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJvb3QoKS5fcm9vdEVsZW1lbnR9O20ucHJvdG90eXBlLmJhY2tncm91bmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2dyb3VuZENvbnRhaW5lcn07cmV0dXJuIG19KCk7ZC5feEFsaWduVG9Qcm9wb3J0aW9uPXtsZWZ0OjAsY2VudGVyOi41LHJpZ2h0OjF9O2QuX3lBbGlnblRvUHJvcG9ydGlvbj17dG9wOjAsY2VudGVyOi41LGJvdHRvbToxfTtmLkNvbXBvbmVudD1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoNTkpKTtrKGgoNjIpKTtrKGgoMTMzKSk7ayhoKDIxKSk7ayhoKDY0KSk7ayhoKDY2KSl9LApmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGssdCl7dGhpcy5fc3ZnRHJhd2VyRmFjdG9yeT1rO3RoaXMuX2NhbnZhc0RyYXdlckZhY3Rvcnk9dH1oLnByb3RvdHlwZS51c2VTVkc9ZnVuY3Rpb24oayl7bnVsbCE9dGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKTt2YXIgdD10aGlzLl9zdmdEcmF3ZXJGYWN0b3J5KCk7dC5hdHRhY2hUbyhrKTt0aGlzLl9jdXJyZW50RHJhd2VyPXR9O2gucHJvdG90eXBlLnVzZUNhbnZhcz1mdW5jdGlvbihrKXtudWxsIT10aGlzLl9jdXJyZW50RHJhd2VyJiZ0aGlzLl9jdXJyZW50RHJhd2VyLnJlbW92ZSgpO3RoaXMuX2N1cnJlbnREcmF3ZXI9dGhpcy5fY2FudmFzRHJhd2VyRmFjdG9yeShrLm5vZGUoKS5nZXRDb250ZXh0KCIyZCIpKX07aC5wcm90b3R5cGUuZ2V0RHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXJ9O2gucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe251bGwhPQp0aGlzLl9jdXJyZW50RHJhd2VyJiZ0aGlzLl9jdXJyZW50RHJhd2VyLnJlbW92ZSgpfTtoLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKGssdCl7dGhpcy5fY3VycmVudERyYXdlci5kcmF3KGssdCl9O2gucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY3VycmVudERyYXdlci5nZXRWaXN1YWxQcmltaXRpdmVzKCl9O2gucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24oayl7cmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleChrKX07cmV0dXJuIGh9KCk7Zi5Qcm94eURyYXdlcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoNzApKTtrKGgoNzEpKX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocCl7dm9pZCAwPT09cCYmKHA9Myk7dChwKTtyZXR1cm4gZnVuY3Rpb24obSl7cmV0dXJuIG0udG9GaXhlZChwKX19CmZ1bmN0aW9uIHQocCl7aWYoMD5wfHwyMDxwKXRocm93IG5ldyBSYW5nZUVycm9yKCJGb3JtYXR0ZXIgcHJlY2lzaW9uIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAyMCIpO2lmKHAhPT1NYXRoLmZsb29yKHApKXRocm93IG5ldyBSYW5nZUVycm9yKCJGb3JtYXR0ZXIgcHJlY2lzaW9uIG11c3QgYmUgYW4gaW50ZWdlciIpO312YXIgbD1oKDEpO2YuY3VycmVuY3k9ZnVuY3Rpb24ocCxtLG4pe3ZvaWQgMD09PXAmJihwPTIpO3ZvaWQgMD09PW0mJihtPSIkIik7dm9pZCAwPT09biYmKG49ITApO3ZhciBxPWsocCk7cmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciB4PXEoTWF0aC5hYnModSkpOyIiIT09eCYmKHg9bj9tK3g6eCttLDA+dSYmKHg9Ii0iK3gpKTtyZXR1cm4geH19O2YuZml4ZWQ9aztmLmdlbmVyYWw9ZnVuY3Rpb24oKXt2YXIgcDt2b2lkIDA9PT1wJiYocD0zKTt0KHApO3JldHVybiBmdW5jdGlvbihtKXtpZigibnVtYmVyIj09PXR5cGVvZiBtKXt2YXIgbj1NYXRoLnBvdygxMCxwKTtyZXR1cm4gU3RyaW5nKE1hdGgucm91bmQobSoKbikvbil9cmV0dXJuIFN0cmluZyhtKX19O2YuaWRlbnRpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24ocCl7cmV0dXJuIFN0cmluZyhwKX19O2YucGVyY2VudGFnZT1mdW5jdGlvbihwKXt2b2lkIDA9PT1wJiYocD0wKTt2YXIgbT1rKHApO3JldHVybiBmdW5jdGlvbihuKXt2YXIgcT1uLnRvU3RyaW5nKCk7cT1NYXRoLnBvdygxMCxxLmxlbmd0aC0ocS5pbmRleE9mKCIuIikrMSkpO3JldHVybiBtKHBhcnNlSW50KCgxMDAqbipxKS50b1N0cmluZygpLDEwKS9xKSsiJSJ9fTtmLnNpU3VmZml4PWZ1bmN0aW9uKHApe3ZvaWQgMD09PXAmJihwPTMpO3QocCk7cmV0dXJuIGZ1bmN0aW9uKG0pe3JldHVybiBsLmZvcm1hdCgiLiIrcCsicyIpKG0pfX07Zi5zaG9ydFNjYWxlPWZ1bmN0aW9uKHApe3ZvaWQgMD09PXAmJihwPTMpO3QocCk7dmFyIG09bC5mb3JtYXQoIi4iK3ArImUiKSxuPWwuZm9ybWF0KCIuIitwKyJmIikscT1NYXRoLnBvdygxMCwxOCksdT1NYXRoLnBvdygxMCwtcCk7CnJldHVybiBmdW5jdGlvbih4KXt2YXIgQT1NYXRoLmFicyh4KTtpZigoQTx1fHxBPj1xKSYmMCE9PUEpcmV0dXJuIG0oeCk7Zm9yKHZhciB5PS0xO0E+PU1hdGgucG93KDFFMyx5KzIpJiY0Pnk7KXkrKztBPS0xPT09eT9uKHgpOm4oeC9NYXRoLnBvdygxRTMseSsxKSkrIktNQlRRIlt5XTtpZigwPHgmJiIxMDAwIj09PUEuc3Vic3RyKDAsNCl8fDA+eCYmIi0xMDAwIj09PUEuc3Vic3RyKDAsNSkpND55Pyh5KyssQT1uKHgvTWF0aC5wb3coMUUzLHkrMSkpKyJLTUJUUSJbeV0pOkE9bSh4KTtyZXR1cm4gQX19O2YubXVsdGlUaW1lPWZ1bmN0aW9uKCl7dmFyIHA9W3tzcGVjaWZpZXI6Ii4lTCIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09bS5nZXRNaWxsaXNlY29uZHMoKX19LHtzcGVjaWZpZXI6IjolUyIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09bS5nZXRTZWNvbmRzKCl9fSx7c3BlY2lmaWVyOiIlSTolTSIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09Cm0uZ2V0TWludXRlcygpfX0se3NwZWNpZmllcjoiJUkgJXAiLHByZWRpY2F0ZTpmdW5jdGlvbihtKXtyZXR1cm4gMCE9PW0uZ2V0SG91cnMoKX19LHtzcGVjaWZpZXI6IiVhICVkIixwcmVkaWNhdGU6ZnVuY3Rpb24obSl7cmV0dXJuIDAhPT1tLmdldERheSgpJiYxIT09bS5nZXREYXRlKCl9fSx7c3BlY2lmaWVyOiIlYiAlZCIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAxIT09bS5nZXREYXRlKCl9fSx7c3BlY2lmaWVyOiIlYiIscHJlZGljYXRlOmZ1bmN0aW9uKG0pe3JldHVybiAwIT09bS5nZXRNb250aCgpfX1dO3JldHVybiBmdW5jdGlvbihtKXt2YXIgbj1wLmZpbHRlcihmdW5jdGlvbihxKXtyZXR1cm4gcS5wcmVkaWNhdGUobSl9KTtyZXR1cm4gbC50aW1lRm9ybWF0KDA8bi5sZW5ndGg/blswXS5zcGVjaWZpZXI6IiVZIikobSl9fTtmLnRpbWU9ZnVuY3Rpb24ocCl7cmV0dXJuIGwudGltZUZvcm1hdChwKX19LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDEpLHQ9aCgwKTsKZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGwocCxtKXt0aGlzLl9yb290PWsuc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpO3RoaXMuX2NsYXNzTmFtZT1tO3RoaXMuX3N2Z0VsZW1lbnROYW1lPXB9bC5wcm90b3R5cGUuZHJhdz1mdW5jdGlvbihwLG0pe3ZhciBuPXRoaXM7dGhpcy5fY3JlYXRlQW5kRGVzdHJveURPTUVsZW1lbnRzKHApO3ZhciBxPTA7bS5mb3JFYWNoKGZ1bmN0aW9uKHUpe3QuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gbi5fZHJhd1N0ZXAodSl9LHEpO3ErPXUuYW5pbWF0b3IudG90YWxUaW1lKHAubGVuZ3RoKX0pfTtsLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7bnVsbD09dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzJiYodGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzPXRoaXMuX3NlbGVjdGlvbi5ub2RlcygpKTtyZXR1cm4gdGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzfTsKbC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5nZXRWaXN1YWxQcmltaXRpdmVzKClbcF19O2wucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuX3Jvb3QucmVtb3ZlKCl9O2wucHJvdG90eXBlLmF0dGFjaFRvPWZ1bmN0aW9uKHApe3Aubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuX3Jvb3Qubm9kZSgpKX07bC5wcm90b3R5cGUuZ2V0Um9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fTtsLnByb3RvdHlwZS5zZWxlY3Rvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdmdFbGVtZW50TmFtZX07bC5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXt9O2wucHJvdG90eXBlLl9jcmVhdGVBbmREZXN0cm95RE9NRWxlbWVudHM9ZnVuY3Rpb24ocCl7cD1wLmZpbHRlcihmdW5jdGlvbihtKXtyZXR1cm4gbnVsbCE9bX0pO3A9dGhpcy5fcm9vdC5zZWxlY3RBbGwodGhpcy5zZWxlY3RvcigpKS5kYXRhKHApOwp0aGlzLl9zZWxlY3Rpb249cC5lbnRlcigpLmFwcGVuZCh0aGlzLl9zdmdFbGVtZW50TmFtZSkubWVyZ2UocCk7cC5leGl0KCkucmVtb3ZlKCk7dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzPW51bGw7bnVsbCE9dGhpcy5fY2xhc3NOYW1lJiZ0aGlzLl9zZWxlY3Rpb24uY2xhc3NlZCh0aGlzLl9jbGFzc05hbWUsITApO3RoaXMuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXModGhpcy5fc2VsZWN0aW9uKX07bC5wcm90b3R5cGUuX2RyYXdTdGVwPWZ1bmN0aW9uKHApe3ZhciBtPXRoaXM7WyJmaWxsIiwic3Ryb2tlIl0uZm9yRWFjaChmdW5jdGlvbihuKXtudWxsIT1wLmF0dHJUb0FwcGxpZWRQcm9qZWN0b3Jbbl0mJm0uX3NlbGVjdGlvbi5hdHRyKG4scC5hdHRyVG9BcHBsaWVkUHJvamVjdG9yW25dKX0pO3AuYW5pbWF0b3IuYW5pbWF0ZSh0aGlzLl9zZWxlY3Rpb24scC5hdHRyVG9BcHBsaWVkUHJvamVjdG9yKTtudWxsIT10aGlzLl9jbGFzc05hbWUmJnRoaXMuX3NlbGVjdGlvbi5jbGFzc2VkKHRoaXMuX2NsYXNzTmFtZSwKITApfTtyZXR1cm4gbH0oKTtmLlNWR0RyYXdlcj1kfSxmdW5jdGlvbihkLGYpe2YubWFrZUVudW09ZnVuY3Rpb24oaCl7cmV0dXJuIGgucmVkdWNlKGZ1bmN0aW9uKGssdCl7a1t0XT10O3JldHVybiBrfSx7fSl9fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG0sbil7ZnVuY3Rpb24gcSgpe3RoaXMuY29uc3RydWN0b3I9bX1mb3IodmFyIHUgaW4gbiluLmhhc093blByb3BlcnR5KHUpJiYobVt1XT1uW3VdKTttLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihxLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgcSl9LHQ9aCgxKSxsPWgoMjYpLHA9aCgwKTtkPWZ1bmN0aW9uKG0pe2Z1bmN0aW9uIG4oKXt2YXIgcT1tLmNhbGwodGhpcyl8fHRoaXM7cS5fdGlja0dlbmVyYXRvcj1mdW5jdGlvbih1KXtyZXR1cm4gdS5kZWZhdWx0VGlja3MoKX07cS5fcGFkUHJvcG9ydGlvbj0uMDU7cS5fc25hcHBpbmdEb21haW5FbmFibGVkPQohMDtxLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycz1uZXcgcC5TZXQ7cmV0dXJuIHF9ayhuLG0pO24ucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt0aGlzLl9kb21haW5NYXg9dGhpcy5fZG9tYWluTWluPW51bGw7bS5wcm90b3R5cGUuYXV0b0RvbWFpbi5jYWxsKHRoaXMpfTtuLnByb3RvdHlwZS5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZT1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuX2RvbWFpbk1pbiYmbnVsbCE9dGhpcy5fZG9tYWluTWF4KXRoaXMuX3NldERvbWFpbihbdGhpcy5fZG9tYWluTWluLHRoaXMuX2RvbWFpbk1heF0pO2Vsc2V7dmFyIHE9dGhpcy5fZ2V0RXh0ZW50KCk7bnVsbCE9dGhpcy5fZG9tYWluTWluPyhxPXFbMV0sdGhpcy5fZG9tYWluTWluPj1xJiYocT10aGlzLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbihbdGhpcy5fZG9tYWluTWluLHRoaXMuX2RvbWFpbk1pbl0pWzFdKSx0aGlzLl9zZXREb21haW4oW3RoaXMuX2RvbWFpbk1pbixxXSkpOgpudWxsIT10aGlzLl9kb21haW5NYXg/KHE9cVswXSx0aGlzLl9kb21haW5NYXg8PXEmJihxPXRoaXMuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluKFt0aGlzLl9kb21haW5NYXgsdGhpcy5fZG9tYWluTWF4XSlbMF0pLHRoaXMuX3NldERvbWFpbihbcSx0aGlzLl9kb21haW5NYXhdKSk6bS5wcm90b3R5cGUuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUuY2FsbCh0aGlzKX19O24ucHJvdG90eXBlLl9nZXRVbmJvdW5kZWRFeHRlbnQ9ZnVuY3Rpb24ocSl7dm9pZCAwPT09cSYmKHE9ITEpO3E9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMocSk7dmFyIHU9dGhpcy5fZGVmYXVsdEV4dGVudCgpOzAhPT1xLmxlbmd0aCYmKHE9W3AuTWF0aC5taW4ocSx1WzBdKSxwLk1hdGgubWF4KHEsdVsxXSldLHU9dGhpcy5fcGFkRG9tYWluKHEpKTtyZXR1cm4gdX07bi5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3ZhciBxPXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCgpO251bGwhPXRoaXMuX2RvbWFpbk1pbiYmCihxWzBdPXRoaXMuX2RvbWFpbk1pbik7bnVsbCE9dGhpcy5fZG9tYWluTWF4JiYocVsxXT10aGlzLl9kb21haW5NYXgpO3JldHVybiBxfTtuLnByb3RvdHlwZS5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyPWZ1bmN0aW9uKHEpe3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmFkZChxKTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCl9O24ucHJvdG90eXBlLnJlbW92ZVBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXI9ZnVuY3Rpb24ocSl7dGhpcy5fcGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcnMuZGVsZXRlKHEpO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKX07bi5wcm90b3R5cGUucGFkUHJvcG9ydGlvbj1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLl9wYWRQcm9wb3J0aW9uO2lmKDA+cSl0aHJvdyBFcnJvcigicGFkUHJvcG9ydGlvbiBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpO3RoaXMuX3BhZFByb3BvcnRpb249cTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7CnJldHVybiB0aGlzfTtuLnByb3RvdHlwZS5fcGFkRG9tYWluPWZ1bmN0aW9uKHEpe3ZhciB1PXRoaXM7aWYocVswXS52YWx1ZU9mKCk9PT1xWzFdLnZhbHVlT2YoKSlyZXR1cm4gdGhpcy5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW4ocSk7aWYoMD09PXRoaXMuX3BhZFByb3BvcnRpb24pcmV0dXJuIHE7dmFyIHg9dGhpcy5fcGFkUHJvcG9ydGlvbi8yLEE9cVswXSx5PXFbMV0sdz0hMSxDPSExO3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24oRCl7RCh1KS5mb3JFYWNoKGZ1bmN0aW9uKEIpe0IudmFsdWVPZigpPT09QS52YWx1ZU9mKCkmJih3PSEwKTtCLnZhbHVlT2YoKT09PXkudmFsdWVPZigpJiYoQz0hMCl9KX0pO3ZhciBHPXRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpO3RoaXMuX2JhY2tpbmdTY2FsZURvbWFpbihxKTtxPXc/QTp0aGlzLmludmVydCh0aGlzLnNjYWxlKEEpLSh0aGlzLnNjYWxlKHkpLXRoaXMuc2NhbGUoQSkpKngpO3g9Qz8KeTp0aGlzLmludmVydCh0aGlzLnNjYWxlKHkpKyh0aGlzLnNjYWxlKHkpLXRoaXMuc2NhbGUoQSkpKngpO3RoaXMuX2JhY2tpbmdTY2FsZURvbWFpbihHKTtyZXR1cm4gdGhpcy5fc25hcHBpbmdEb21haW5FbmFibGVkP3RoaXMuX25pY2VEb21haW4oW3EseF0pOltxLHhdfTtuLnByb3RvdHlwZS5zbmFwcGluZ0RvbWFpbkVuYWJsZWQ9ZnVuY3Rpb24ocSl7bnVsbCE9cSYmKHRoaXMuX3NuYXBwaW5nRG9tYWluRW5hYmxlZD1xLHRoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKSl9O24ucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj1mdW5jdGlvbihxKXtyZXR1cm4gcX07bi5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGludmVydCIpO307bi5wcm90b3R5cGUuZG9tYWluPWZ1bmN0aW9uKHEpe251bGwhPXEmJih0aGlzLl9kb21haW5NaW49cVswXSx0aGlzLl9kb21haW5NYXg9cVsxXSk7CnJldHVybiBtLnByb3RvdHlwZS5kb21haW4uY2FsbCh0aGlzLHEpfTtuLnByb3RvdHlwZS5kb21haW5NaW49ZnVuY3Rpb24ocSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5kb21haW4oKVswXTt0aGlzLl9kb21haW5NaW49cTt0aGlzLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLmRvbWFpbk1heD1mdW5jdGlvbihxKXtpZihudWxsPT1xKXJldHVybiB0aGlzLmRvbWFpbigpWzFdO3RoaXMuX2RvbWFpbk1heD1xO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKTtyZXR1cm4gdGhpc307bi5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24ocSl7cT10LmV4dGVudChxLmZpbHRlcihmdW5jdGlvbih1KXtyZXR1cm4gcC5NYXRoLmlzVmFsaWROdW1iZXIoK3UpfSkpO3JldHVybiBudWxsPT1xWzBdfHxudWxsPT1xWzFdP1tdOnF9O24ucHJvdG90eXBlLnpvb209ZnVuY3Rpb24ocSx1KXt2YXIgeD10aGlzO3RoaXMuZG9tYWluKHRoaXMucmFuZ2UoKS5tYXAoZnVuY3Rpb24oQSl7cmV0dXJuIHguaW52ZXJ0KGwuem9vbU91dChBLApxLHUpKX0pKX07bi5wcm90b3R5cGUucGFuPWZ1bmN0aW9uKHEpe3ZhciB1PXRoaXM7dGhpcy5kb21haW4odGhpcy5yYW5nZSgpLm1hcChmdW5jdGlvbih4KXtyZXR1cm4gdS5pbnZlcnQoeCtxKX0pKX07bi5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzY2FsZVRyYW5zZm9ybWF0aW9uIik7fTtuLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGludmVydGVkVHJhbnNmb3JtYXRpb24iKTt9O24ucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGdldFRyYW5zZm9ybWF0aW9uRXh0ZW50Iik7fTtuLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBnZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbiIpOwp9O24ucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHNldFRyYW5zZm9ybWF0aW9uRG9tYWluIik7fTtuLnByb3RvdHlwZS5fc2V0RG9tYWluPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHUoeCl7cmV0dXJuIHAuTWF0aC5pc05hTih4KXx8SW5maW5pdHk9PT14fHwtSW5maW5pdHk9PT14fXUocVswXSl8fHUocVsxXSk/cC5XaW5kb3cud2FybigiV2FybmluZzogUXVhbnRpdGF0aXZlU2NhbGVzIGNhbm5vdCB0YWtlIE5hTiBvciBJbmZpbml0eSBhcyBhIGRvbWFpbiB2YWx1ZS4gSWdub3JpbmcuIik6bS5wcm90b3R5cGUuX3NldERvbWFpbi5jYWxsKHRoaXMscSl9O24ucHJvdG90eXBlLmRlZmF1bHRUaWNrcz1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0RGVmYXVsdFRpY2tzIik7fTtuLnByb3RvdHlwZS50aWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl90aWNrR2VuZXJhdG9yKHRoaXMpfTsKbi5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX25pY2VEb21haW4iKTt9O24ucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50PWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9kZWZhdWx0RXh0ZW50Iik7fTtuLnByb3RvdHlwZS50aWNrR2VuZXJhdG9yPWZ1bmN0aW9uKCl7dmFyIHE9UGxvdHRhYmxlLlNjYWxlcy5UaWNrR2VuZXJhdG9ycy5pbnRlZ2VyVGlja0dlbmVyYXRvcigpO251bGwhPXEmJih0aGlzLl90aWNrR2VuZXJhdG9yPXEpfTtyZXR1cm4gbn0oaCgxNykuU2NhbGUpO2QuX0RFRkFVTFRfTlVNX1RJQ0tTPTEwO2YuUXVhbnRpdGF0aXZlU2NhbGU9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMSk7Zi5jb2VyY2VFeHRlcm5hbEQzPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQuYXR0cnMpe2lmKG51bGw9PXQubm9kZXMpe3ZhciBsPVtdO3QuZWFjaChmdW5jdGlvbigpe2wucHVzaCh0aGlzKX0pOwpyZXR1cm4gay5zZWxlY3RBbGwobCl9cmV0dXJuIGsuc2VsZWN0QWxsKHQubm9kZXMoKSl9cmV0dXJuIHR9fSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoODMpKTtrKGgoODQpKTtrKGgoODUpKX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDQ0KSk7ayhoKDQ1KSk7ayhoKDQ2KSk7ayhoKDE4KSk7ayhoKDYpKTtrKGgoMzMpKTtrKGgoMzQpKTtrKGgoNDcpKTtrKGgoOSkpO2soaCg0OCkpfSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKCl7dmFyIGs9dGhpczt0aGlzLl9hbmNob3JDYWxsYmFjaz1mdW5jdGlvbih0KXtyZXR1cm4gay5fYW5jaG9yKHQpfTt0aGlzLl9lbmFibGVkPSEwfWgucHJvdG90eXBlLmF0dGFjaFRvPWZ1bmN0aW9uKGspe3RoaXMuX2Rpc2Nvbm5lY3QoKTsKdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbz1rO3RoaXMuX2Nvbm5lY3QoKTtyZXR1cm4gdGhpc307aC5wcm90b3R5cGUuZGV0YWNoRnJvbT1mdW5jdGlvbigpe3RoaXMuZGV0YWNoKCl9O2gucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuX2Rpc2Nvbm5lY3QoKTt0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvPW51bGw7cmV0dXJuIHRoaXN9O2gucHJvdG90eXBlLmVuYWJsZWQ9ZnVuY3Rpb24oayl7aWYobnVsbD09aylyZXR1cm4gdGhpcy5fZW5hYmxlZDsodGhpcy5fZW5hYmxlZD1rKT90aGlzLl9jb25uZWN0KCk6dGhpcy5fZGlzY29ubmVjdCgpO3JldHVybiB0aGlzfTtoLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZD0hMH07aC5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZD0hMX07aC5wcm90b3R5cGUuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2U9ZnVuY3Rpb24oayl7dmFyIHQ9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5vcmlnaW5Ub1Jvb3QoKTsKcmV0dXJue3g6ay54LXQueCx5OmsueS10Lnl9fTtoLnByb3RvdHlwZS5faXNJbnNpZGVDb21wb25lbnQ9ZnVuY3Rpb24oayl7cmV0dXJuIDA8PWsueCYmMDw9ay55JiZrLng8PXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ud2lkdGgoKSYmay55PD10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpfTtoLnByb3RvdHlwZS5fY29ubmVjdD1mdW5jdGlvbigpe2lmKHRoaXMuZW5hYmxlZCgpJiZudWxsIT10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvJiYhdGhpcy5faXNBbmNob3JlZCl0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLm9uQW5jaG9yKHRoaXMuX2FuY2hvckNhbGxiYWNrKX07aC5wcm90b3R5cGUuX2Rpc2Nvbm5lY3Q9ZnVuY3Rpb24oKXt0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl91bmFuY2hvcigpO251bGwhPXRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8mJnRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ub2ZmQW5jaG9yKHRoaXMuX2FuY2hvckNhbGxiYWNrKX07cmV0dXJuIGh9KCk7CmYuSW50ZXJhY3Rpb249ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB4IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh4KSYmKG5beF09cVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoMyksbD1oKDApLHA9aCg1MiksbT1oKDIpO2Q9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcSgpe3ZhciB1PW4uY2FsbCh0aGlzKXx8dGhpczt1Ll9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSExO3UuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITE7dS5fZGVmZXJyZWRSZW5kZXJpbmc9ITE7dS5fYXBwbHlEZWZlcnJlZFJlbmRlcmluZ1RyYW5zZm9ybT1mdW5jdGlvbih4LEEseSx3KXt1Ll9pc0FuY2hvcmVkJiYobnVsbCE9dS5fcmVuZGVyQXJlYSYmdS5fcmVuZGVyQXJlYS5hdHRyKCJ0cmFuc2Zvcm0iLAoidHJhbnNsYXRlKCIreCsiLCAiK0ErIikgc2NhbGUoIit5KyIsICIrdysiKSIpLG51bGwhPXUuX2NhbnZhcyYmdS5fY2FudmFzLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit4KyJweCwgIitBKyJweCkgc2NhbGUoIit5KyIsICIrdysiKSIpKX07dS5hZGRDbGFzcygieHktcGxvdCIpO3UuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gdS5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVgoKX07dS5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiB1Ll9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWSgpfTt1Ll9yZW5kZXJDYWxsYmFjaz1mdW5jdGlvbigpe2lmKHUuZGVmZXJyZWRSZW5kZXJpbmcoKSl7dmFyIHg9dS54KCkmJnUueCgpLnNjYWxlLEE9dS55KCkmJnUueSgpLnNjYWxlO3UuX2RlZmVycmVkUmVuZGVyZXIudXBkYXRlRG9tYWlucyh4LEEpfWVsc2UgdS5yZW5kZXIoKX07CnUuX2RlZmVycmVkUmVuZGVyZXI9bmV3IHAuRGVmZXJyZWRSZW5kZXJlcihmdW5jdGlvbigpe3JldHVybiB1LnJlbmRlcigpfSx1Ll9hcHBseURlZmVycmVkUmVuZGVyaW5nVHJhbnNmb3JtKTtyZXR1cm4gdX1rKHEsbik7cS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dGhpcy5kZWZlcnJlZFJlbmRlcmluZygpJiZ0aGlzLl9kZWZlcnJlZFJlbmRlcmVyLnJlc2V0VHJhbnNmb3JtcygpO3JldHVybiBuLnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKX07cS5wcm90b3R5cGUuZGVmZXJyZWRSZW5kZXJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVmZXJyZWRSZW5kZXJpbmd9O3EucHJvdG90eXBlLng9ZnVuY3Rpb24odSx4LEEpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHEuX1hfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkocS5fWF9LRVksdSx4LEEpO3U9dGhpcy53aWR0aCgpO251bGwhPXgmJm51bGwhPXUmJngucmFuZ2UoWzAsdV0pOwp0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS55PWZ1bmN0aW9uKHUseCxBKXtpZihudWxsPT11KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChxLl9ZX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KHEuX1lfS0VZLHUseCxBKTt1PXRoaXMuaGVpZ2h0KCk7bnVsbCE9eCYmbnVsbCE9dSYmKHggaW5zdGFuY2VvZiB0LkNhdGVnb3J5P3gucmFuZ2UoWzAsdV0pOngucmFuZ2UoW3UsMF0pKTt0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24odSl7cmV0dXJuIngiPT09dSYmdGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj90aGlzLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eSgieSIpOgoieSI9PT11JiZ0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluP3RoaXMuX21ha2VGaWx0ZXJCeVByb3BlcnR5KCJ4Iik6bnVsbH07cS5wcm90b3R5cGUuX21ha2VGaWx0ZXJCeVByb3BlcnR5PWZ1bmN0aW9uKHUpe3U9dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQodSk7aWYobnVsbCE9dSl7dmFyIHg9dS5hY2Nlc3NvcixBPXUuc2NhbGU7aWYobnVsbCE9QSlyZXR1cm4gZnVuY3Rpb24oeSx3LEMpe3ZhciBHPUEucmFuZ2UoKTtyZXR1cm4gbC5NYXRoLmluUmFuZ2UoQS5zY2FsZSh4KHksdyxDKSksR1swXSxHWzFdKX19cmV0dXJuIG51bGx9O3EucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbih1LHgpe24ucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsdSx4KTt1Lm9mZlVwZGF0ZSh4PT09cS5fWF9LRVk/dGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjazp0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrKX07CnEucHJvdG90eXBlLl9pbnN0YWxsU2NhbGVGb3JLZXk9ZnVuY3Rpb24odSx4KXtuLnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5LmNhbGwodGhpcyx1LHgpO3Uub25VcGRhdGUoeD09PXEuX1hfS0VZP3RoaXMuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YQ2FsbGJhY2s6dGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjayl9O3EucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy54KCkuc2NhbGUmJnRoaXMueCgpLnNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrKTt0aGlzLnkoKS5zY2FsZSYmdGhpcy55KCkuc2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2spO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4/CiJ4Ijp0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPyJ5Ijoibm9uZSI7c3dpdGNoKHUpe2Nhc2UgIngiOnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITA7dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj0hMTt0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWSgpO2JyZWFrO2Nhc2UgInkiOnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITE7dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj0hMDt0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWCgpO2JyZWFrO2Nhc2UgIm5vbmUiOnRoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49dGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj0hMTticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJJbnZhbGlkIHNjYWxlIG5hbWUgJyIrdSsiJywgbXVzdCBiZSAneCcsICd5JyBvciAnbm9uZSciKTt9cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24odSx4LEEpe24ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLAp1LHgsQSk7dT0odT10aGlzLngoKSkmJnUuc2NhbGU7bnVsbCE9dSYmdS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTt1PSh1PXRoaXMueSgpKSYmdS5zY2FsZTtudWxsIT11JiYodSBpbnN0YW5jZW9mIHQuQ2F0ZWdvcnk/dS5yYW5nZShbMCx0aGlzLmhlaWdodCgpXSk6dS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSkpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy54KCkuc2NhbGU7bnVsbCE9dSYmdS5hdXRvRG9tYWluKCl9O3EucHJvdG90eXBlLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW49ZnVuY3Rpb24oKXt2YXIgdT10aGlzLnkoKS5zY2FsZTtudWxsIT11JiZ1LmF1dG9Eb21haW4oKX07cS5wcm90b3R5cGUuc2hvd0FsbERhdGE9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKTt0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKTtyZXR1cm4gdGhpc307CnEucHJvdG90eXBlLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWD1mdW5jdGlvbigpe3RoaXMuX3Byb2plY3RvcnNSZWFkeSgpJiZ0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKX07cS5wcm90b3R5cGUuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZPWZ1bmN0aW9uKCl7dGhpcy5fcHJvamVjdG9yc1JlYWR5KCkmJnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4mJnRoaXMuX3VwZGF0ZVhFeHRlbnRzQW5kQXV0b2RvbWFpbigpfTtxLnByb3RvdHlwZS5fcHJvamVjdG9yc1JlYWR5PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy54KCkseD10aGlzLnkoKTtyZXR1cm4gbnVsbCE9dSYmbnVsbCE9dS5hY2Nlc3NvciYmbnVsbCE9eCYmbnVsbCE9eC5hY2Nlc3Nvcn07cS5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24odSx4LEEpe3ZhciB5PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHc9bS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7CnJldHVybnt4OnkodSx4LEEpLHk6dyh1LHgsQSl9fTtxLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe2Z1bmN0aW9uIHUoeSx3LEMpe3ZhciBHPW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IoeC54KCkpKHksdyxDKTt5PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IoeC55KCkpKHksdyxDKTtyZXR1cm4gbC5NYXRoLmlzVmFsaWROdW1iZXIoRykmJmwuTWF0aC5pc1ZhbGlkTnVtYmVyKHkpfXZhciB4PXRoaXMsQT1uLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdy5jYWxsKHRoaXMpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKHkpe0Euc2V0KHksQS5nZXQoeSkuZmlsdGVyKGZ1bmN0aW9uKHcsQyl7cmV0dXJuIHUodyxDLHkpfSkpfSk7cmV0dXJuIEF9O3JldHVybiBxfShtLlBsb3QpO2QuX1hfS0VZPSJ4IjtkLl9ZX0tFWT0ieSI7Zi5YWVBsb3Q9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMCk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0KITA7dGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMTt0aGlzLl91cGRhdGVJZD0wO3RoaXMuX2NhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldDt0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycz1uZXcgay5TZXR9dC5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm5bXX07dC5wcm90b3R5cGUuX2dldEFsbEluY2x1ZGVkVmFsdWVzPWZ1bmN0aW9uKGwpe3ZhciBwPXRoaXM7dm9pZCAwPT09bCYmKGw9ITEpO3ZhciBtPVtdO3RoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24obil7bj1uKHAsbCk7bT1tLmNvbmNhdChuKX0pO3JldHVybiBtfTt0LnByb3RvdHlwZS5fZ2V0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuW119O3QucHJvdG90eXBlLm9uVXBkYXRlPWZ1bmN0aW9uKGwpe3RoaXMuX2NhbGxiYWNrcy5hZGQobCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLm9mZlVwZGF0ZT1mdW5jdGlvbihsKXt0aGlzLl9jYWxsYmFja3MuZGVsZXRlKGwpOwpyZXR1cm4gdGhpc307dC5wcm90b3R5cGUuX2Rpc3BhdGNoVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWQrKzt0aGlzLl9jYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKX07dC5wcm90b3R5cGUuYXV0b0RvbWFpbj1mdW5jdGlvbigpe3RoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5PSEwO3RoaXMuX3NldERvbWFpbih0aGlzLl9nZXRFeHRlbnQoKSl9O3QucHJvdG90eXBlLl9hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlPWZ1bmN0aW9uKCl7dGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHkmJnRoaXMuYXV0b0RvbWFpbigpfTt0LnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzY2FsZSIpO307dC5wcm90b3R5cGUudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07dC5wcm90b3R5cGUuZG9tYWluPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwpcmV0dXJuIHRoaXMuX2dldERvbWFpbigpOwp0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0hMTt0aGlzLl9zZXREb21haW4obCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2dldERvbWFpbiIpO307dC5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihsKXt0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzfHwodGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMCx0aGlzLl9iYWNraW5nU2NhbGVEb21haW4obCksdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKSx0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzPSExKX07dC5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfYmFja2luZ0RvbWFpbiIpO307dC5wcm90b3R5cGUucmFuZ2U9ZnVuY3Rpb24obCl7aWYobnVsbD09bClyZXR1cm4gdGhpcy5fZ2V0UmFuZ2UoKTsKdGhpcy5fc2V0UmFuZ2UobCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0UmFuZ2UiKTt9O3QucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbigpe3Rocm93IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfc2V0UmFuZ2UiKTt9O3QucHJvdG90eXBlLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXI9ZnVuY3Rpb24obCl7dGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnMuYWRkKGwpO3RoaXMuX2F1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUucmVtb3ZlSW5jbHVkZWRWYWx1ZXNQcm92aWRlcj1mdW5jdGlvbihsKXt0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycy5kZWxldGUobCk7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpfTt0LnByb3RvdHlwZS51cGRhdGVJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVJZH07CnJldHVybiB0fSgpO2YuU2NhbGU9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocSx1LHgsQSl7Zm9yKHZhciB5PXt9LHc9MDt3PHUubGVuZ3RoO3crKyl7dmFyIEM9dVt3XTtxLmhhc093blByb3BlcnR5KEMpJiYoeVtDXT1xW0NdKHgsQSkpfXJldHVybiB5fWZ1bmN0aW9uIHQocSl7cmV0dXJuKG51bGwhPXFbInN0cm9rZS1vcGFjaXR5Il0/cGFyc2VGbG9hdChxWyJzdHJva2Utb3BhY2l0eSJdKToxKSoobnVsbCE9cS5vcGFjaXR5P3BhcnNlRmxvYXQocS5vcGFjaXR5KToxKX1mdW5jdGlvbiBsKHEpe3JldHVybihudWxsIT1xWyJmaWxsLW9wYWNpdHkiXT9wYXJzZUZsb2F0KHFbImZpbGwtb3BhY2l0eSJdKToxKSoobnVsbCE9cS5vcGFjaXR5P3BhcnNlRmxvYXQocS5vcGFjaXR5KToxKX1mdW5jdGlvbiBwKHEpe3JldHVybiBudWxsIT1xWyJzdHJva2Utd2lkdGgiXT9wYXJzZUZsb2F0KHFbInN0cm9rZS13aWR0aCJdKToxfWZ1bmN0aW9uIG0ocSx1KXtpZih1LnN0cm9rZSl7cS5saW5lV2lkdGg9CnAodSk7dmFyIHg9bi5jb2xvcih1LnN0cm9rZSk7eC5vcGFjaXR5Kj10KHUpO3Euc3Ryb2tlU3R5bGU9eC50b1N0cmluZygpO3Euc3Ryb2tlKCl9dS5maWxsJiYoeD1uLmNvbG9yKHUuZmlsbCkseC5vcGFjaXR5Kj1sKHUpLHEuZmlsbFN0eWxlPXgudG9TdHJpbmcoKSxxLmZpbGwoKSl9dmFyIG49aCgxKTtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcSh1LHgpe3RoaXMuX2NvbnRleHQ9dTt0aGlzLl9kcmF3U3RlcD14fXEucHJvdG90eXBlLmdldERyYXdTdGVwPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYXdTdGVwfTtxLnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKHUseCl7eD14W3gubGVuZ3RoLTFdLmF0dHJUb0FwcGxpZWRQcm9qZWN0b3I7dGhpcy5fY29udGV4dC5zYXZlKCk7dGhpcy5fZHJhd1N0ZXAodGhpcy5fY29udGV4dCx1LHgpO3RoaXMuX2NvbnRleHQucmVzdG9yZSgpfTtxLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7cmV0dXJuW119O3EucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9CmZ1bmN0aW9uKCl7cmV0dXJuIG51bGx9O3EucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe307cmV0dXJuIHF9KCk7Zi5DYW52YXNEcmF3ZXI9ZDtmLkNvbnRleHRTdHlsZUF0dHJzPSJmaWxsLW9wYWNpdHkgZmlsbCBvcGFjaXR5IHN0cm9rZS1vcGFjaXR5IHN0cm9rZS13aWR0aCBzdHJva2UiLnNwbGl0KCIgIik7Zi5yZXNvbHZlQXR0cmlidXRlc1N1YnNldFdpdGhTdHlsZXM9ZnVuY3Rpb24ocSx1LHgsQSl7cmV0dXJuIGsocSxmLkNvbnRleHRTdHlsZUF0dHJzLmNvbmNhdCh1KSx4LEEpfTtmLnJlc29sdmVBdHRyaWJ1dGVzPWs7Zi5nZXRTdHJva2VXaWR0aD1wO2YucmVuZGVyQXJlYT1mdW5jdGlvbihxLHUseCxBKXtxLnNhdmUoKTtxLmJlZ2luUGF0aCgpO3UuY29udGV4dChxKTt1KHgpO3EubGluZUpvaW49InJvdW5kIjttKHEsQSk7cS5yZXN0b3JlKCl9O2YucmVuZGVyTGluZT1mdW5jdGlvbihxLHUseCxBKXtxLnNhdmUoKTtxLmJlZ2luUGF0aCgpO3UuY29udGV4dChxKTt1KHgpOwpxLmxpbmVKb2luPSJyb3VuZCI7bShxLEEpO3EucmVzdG9yZSgpfTtmLnJlbmRlclBhdGhXaXRoU3R5bGU9bX0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDUwKSk7ayhoKDI3KSk7ayhoKDUxKSk7ayhoKDkzKSk7ayhoKDUzKSk7ayhoKDk0KSk7ayhoKDk1KSk7ayhoKDk2KSk7ayhoKDk3KSk7ayhoKDk4KSk7ayhoKDk5KSk7ayhoKDEwMCkpfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoOTIpKTtrKGgoOTEpKTtkPWgoNDkpO2Yuc2lnbj1kLnNpZ259LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCgxMzQpKTtrKGgoMTM1KSk7ayhoKDEzNikpO2soaCgxMzcpKX0sZnVuY3Rpb24oZCwKZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgeCBpbiBxKXEuaGFzT3duUHJvcGVydHkoeCkmJihuW3hdPXFbeF0pO24ucHJvdG90eXBlPW51bGw9PT1xP09iamVjdC5jcmVhdGUocSk6KHUucHJvdG90eXBlPXEucHJvdG90eXBlLG5ldyB1KX0sdD1oKDEpLGw9aCg1KTtkPWgoNCk7dmFyIHA9aCg4KSxtPWgoMCk7aD1oKDEwKTtmLkF4aXNPcmllbnRhdGlvbj1oLm1ha2VFbnVtKFsiYm90dG9tIiwibGVmdCIsInJpZ2h0IiwidG9wIl0pO2g9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcSh1LHgpe3ZhciBBPW4uY2FsbCh0aGlzKXx8dGhpcztBLl9lbmRUaWNrTGVuZ3RoPTU7QS5faW5uZXJUaWNrTGVuZ3RoPTU7QS5fdGlja0xhYmVsUGFkZGluZz0xMDtBLl9tYXJnaW49MTU7QS5fc2hvd0VuZFRpY2tMYWJlbHM9ITE7QS5fYW5ub3RhdGlvbnNFbmFibGVkPSExO0EuX2Fubm90YXRpb25UaWVyQ291bnQ9CjE7aWYobnVsbD09dXx8bnVsbD09eCl0aHJvdyBFcnJvcigiQXhpcyByZXF1aXJlcyBhIHNjYWxlIGFuZCBvcmllbnRhdGlvbiIpO0EuX3NjYWxlPXU7QS5vcmllbnRhdGlvbih4KTtBLl9zZXREZWZhdWx0QWxpZ25tZW50KCk7QS5hZGRDbGFzcygiYXhpcyIpO0EuaXNIb3Jpem9udGFsKCk/QS5hZGRDbGFzcygieC1heGlzIik6QS5hZGRDbGFzcygieS1heGlzIik7QS5mb3JtYXR0ZXIocC5pZGVudGl0eSgpKTtBLl9yZXNjYWxlQ2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4gQS5fcmVzY2FsZSgpfTtBLl9zY2FsZS5vblVwZGF0ZShBLl9yZXNjYWxlQ2FsbGJhY2spO0EuX2Fubm90YXRlZFRpY2tzPVtdO0EuX2Fubm90YXRpb25Gb3JtYXR0ZXI9cC5pZGVudGl0eSgpO3JldHVybiBBfWsocSxuKTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3NjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZXNjYWxlQ2FsbGJhY2spfTsKcS5wcm90b3R5cGUudGlja0xhYmVsRGF0YU9uRWxlbWVudD1mdW5jdGlvbih1KXtpZihudWxsIT11KXtmb3IodmFyIHg7bnVsbCE9dSYmdS5jbGFzc0xpc3QmJnZvaWQgMD09PXg7KXUuY2xhc3NMaXN0LmNvbnRhaW5zKHEuVElDS19MQUJFTF9DTEFTUyk/eD11OnU9dS5wYXJlbnROb2RlO3JldHVybiB2b2lkIDA9PT11P3ZvaWQgMDp0LnNlbGVjdCh1KS5kYXR1bSgpfX07cS5wcm90b3R5cGUuX2NvbXB1dGVXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKX07cS5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCl9O3EucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKCl7dmFyIHU9MCx4PTA7aWYodGhpcy5pc0hvcml6b250YWwoKSl7aWYoeD10aGlzLl9jb21wdXRlSGVpZ2h0KCkrdGhpcy5fbWFyZ2luLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkpe3ZhciBBPQp0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCsyKnEuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORzt4Kz1BKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpfX1lbHNlIHU9dGhpcy5fY29tcHV0ZVdpZHRoKCkrdGhpcy5fbWFyZ2luLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkmJihBPXRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqcS5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HLHUrPUEqdGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCkpO3JldHVybnttaW5XaWR0aDp1LG1pbkhlaWdodDp4fX07cS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKX07cS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzSG9yaXpvbnRhbCgpfTtxLnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyKCl9O3EucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9CmZ1bmN0aW9uKHUseCxBKXtuLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyx1LHgsQSk7dGhpcy5pc0hvcml6b250YWwoKT90aGlzLl9zY2FsZS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTp0aGlzLl9zY2FsZS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHUseCl7dmFyIEE9dGhpcy5yZXF1ZXN0ZWRTcGFjZSh1LHgpO3JldHVybiB0aGlzLmlzSG9yaXpvbnRhbCgpP3t3aWR0aDp1LGhlaWdodDpBLm1pbkhlaWdodH06e2hlaWdodDp4LHdpZHRoOkEubWluV2lkdGh9fTtxLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl90aWNrTWFya0NvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHEuVElDS19NQVJLX0NMQVNTKyItY29udGFpbmVyIiwhMCk7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyPQp0aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKHEuVElDS19MQUJFTF9DTEFTUysiLWNvbnRhaW5lciIsITApO3RoaXMuX2Jhc2VsaW5lPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCk7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWNvbnRhaW5lciIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1saW5lLWNvbnRhaW5lciIsITApO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1jaXJjbGUtY29udGFpbmVyIiwhMCk7dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiwhMCk7dmFyIHU9dGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWxhYmVsLWNvbnRhaW5lciIsCiEwKTt1PW5ldyBsLlN2Z0NvbnRleHQodS5ub2RlKCkpO3RoaXMuX2Fubm90YXRpb25NZWFzdXJlcj1uZXcgbC5DYWNoZU1lYXN1cmVyKHUpO3RoaXMuX2Fubm90YXRpb25Xcml0ZXI9bmV3IGwuV3JpdGVyKHRoaXMuX2Fubm90YXRpb25NZWFzdXJlcix1KX07cS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm5bXX07cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgdT10aGlzLl9nZXRUaWNrVmFsdWVzKCkseD10aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuVElDS19NQVJLX0NMQVNTKS5kYXRhKHUpLEE9eC5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQocS5USUNLX01BUktfQ0xBU1MsITApLm1lcmdlKHgpO0EuYXR0cnModGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCkpO3Quc2VsZWN0KEEubm9kZXMoKVswXSkuY2xhc3NlZChxLkVORF9USUNLX01BUktfQ0xBU1MsITApLmF0dHJzKHRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCghMCkpOwp0LnNlbGVjdChBLm5vZGVzKClbdS5sZW5ndGgtMV0pLmNsYXNzZWQocS5FTkRfVElDS19NQVJLX0NMQVNTLCEwKS5hdHRycyh0aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goITApKTt4LmV4aXQoKS5yZW1vdmUoKTt0aGlzLl9iYXNlbGluZS5hdHRycyh0aGlzLl9nZW5lcmF0ZUJhc2VsaW5lQXR0ckhhc2goKSk7dGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKT90aGlzLl9kcmF3QW5ub3RhdGlvbnMoKTp0aGlzLl9yZW1vdmVBbm5vdGF0aW9ucygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5hbm5vdGF0ZWRUaWNrcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0ZWRUaWNrc307cS5wcm90b3R5cGUuYW5ub3RhdGlvbkZvcm1hdHRlcj1mdW5jdGlvbih1KXtpZihudWxsPT11KXJldHVybiB0aGlzLl9hbm5vdGF0aW9uRm9ybWF0dGVyO3RoaXMuX2Fubm90YXRpb25Gb3JtYXR0ZXI9dTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5hbm5vdGF0aW9uc0VuYWJsZWQ9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25zRW5hYmxlZH07cS5wcm90b3R5cGUuYW5ub3RhdGlvblRpZXJDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uVGllckNvdW50fTtxLnByb3RvdHlwZS5fZHJhd0Fubm90YXRpb25zPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gdShhYSl7c3dpdGNoKEMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpjYXNlICJyaWdodCI6cmV0dXJuIHkoYWEpO2Nhc2UgInRvcCI6Y2FzZSAibGVmdCI6cmV0dXJuIHkoYWEpLUQuZ2V0KGFhKS5oZWlnaHR9fWZ1bmN0aW9uIHgoYWEpe3JldHVybiBPLmhhcyhhYSk/ImhpZGRlbiI6InZpc2libGUifWZ1bmN0aW9uIEEoYWEpe3JldHVybiBDLl9zY2FsZS5zY2FsZShhYSl9ZnVuY3Rpb24geShhYSl7c3dpdGNoKEMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpjYXNlICJyaWdodCI6cmV0dXJuIE4uZ2V0KGFhKSpJK0s7Y2FzZSAidG9wIjpjYXNlICJsZWZ0IjpyZXR1cm4gSC0KSy1OLmdldChhYSkqSX19ZnVuY3Rpb24gdyhhYSxsYSxaKXthYT1hYS5zZWxlY3RBbGwoIi4iK1opLmRhdGEoQik7bGE9YWEuZW50ZXIoKS5hcHBlbmQobGEpLmNsYXNzZWQoWiwhMCkubWVyZ2UoYWEpO2FhLmV4aXQoKS5yZW1vdmUoKTtyZXR1cm4gbGF9dmFyIEM9dGhpcyxHPXEuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORyxEPW5ldyBtLk1hcCxCPXRoaXMuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXIoKTtCLmZvckVhY2goZnVuY3Rpb24oYWEpe3ZhciBsYT1DLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZShDLmFubm90YXRpb25Gb3JtYXR0ZXIoKShhYSkpO0Quc2V0KGFhLHt3aWR0aDpsYS53aWR0aCsyKkcsaGVpZ2h0OmxhLmhlaWdodCsyKkd9KX0pO3ZhciBJPXRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqRyxOPXRoaXMuX2Fubm90YXRpb25Ub1RpZXIoRCksTz1uZXcgbS5TZXQsSD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuaGVpZ2h0KCk6CnRoaXMud2lkdGgoKSxLPXRoaXMuX2NvcmVTaXplKCksTT1NYXRoLm1pbih0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKSxNYXRoLmZsb29yKChILUspL0kpKTtOLmZvckVhY2goZnVuY3Rpb24oYWEsbGEpeygtMT09PWFhfHxhYT49TSkmJk8uYWRkKGxhKX0pO3N3aXRjaCh0aGlzLm9yaWVudGF0aW9uKCkpe2Nhc2UgImJvdHRvbSI6Y2FzZSAicmlnaHQiOnZhciBMPTA7YnJlYWs7Y2FzZSAidG9wIjpMPXRoaXMuaGVpZ2h0KCk7YnJlYWs7Y2FzZSAibGVmdCI6TD10aGlzLndpZHRoKCl9dmFyIFE9dGhpcy5pc0hvcml6b250YWwoKTt3KHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1saW5lLWNvbnRhaW5lciIpLCJsaW5lIixxLkFOTk9UQVRJT05fTElORV9DTEFTUykuYXR0cnMoe3gxOlE/QTpMLHgyOlE/QTp5LHkxOlE/TDpBLHkyOlE/eTpBLHZpc2liaWxpdHk6eH0pO3codGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLWNpcmNsZS1jb250YWluZXIiKSwKImNpcmNsZSIscS5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUykuYXR0cnMoe2N4OlE/QTpMLGN5OlE/TDpBLHI6M30pO3codGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiksInJlY3QiLHEuQU5OT1RBVElPTl9SRUNUX0NMQVNTKS5hdHRycyh7eDpRP0E6dSx5OlE/dTpBLHdpZHRoOlE/ZnVuY3Rpb24oYWEpe3JldHVybiBELmdldChhYSkud2lkdGh9OmZ1bmN0aW9uKGFhKXtyZXR1cm4gRC5nZXQoYWEpLmhlaWdodH0saGVpZ2h0OlE/ZnVuY3Rpb24oYWEpe3JldHVybiBELmdldChhYSkuaGVpZ2h0fTpmdW5jdGlvbihhYSl7cmV0dXJuIEQuZ2V0KGFhKS53aWR0aH0sdmlzaWJpbGl0eTp4fSk7dmFyIFQ9dGhpcy5fYW5ub3RhdGlvbldyaXRlcixYPXRoaXMuYW5ub3RhdGlvbkZvcm1hdHRlcigpO0w9dyh0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdCgiLmFubm90YXRpb24tbGFiZWwtY29udGFpbmVyIiksImciLHEuQU5OT1RBVElPTl9MQUJFTF9DTEFTUyk7Ckwuc2VsZWN0QWxsKCIudGV4dC1jb250YWluZXIiKS5yZW1vdmUoKTtMLmF0dHJzKHt0cmFuc2Zvcm06ZnVuY3Rpb24oYWEpe3ZhciBsYT1RP0EoYWEpOnUoYWEpO2FhPVE/dShhYSk6QShhYSk7cmV0dXJuInRyYW5zbGF0ZSgiK2xhKyIsIithYSsiKSJ9LHZpc2liaWxpdHk6eH0pLmVhY2goZnVuY3Rpb24oYWEpe1Qud3JpdGUoWChhYSksUT9ELmdldChhYSkud2lkdGg6RC5nZXQoYWEpLmhlaWdodCxRP0QuZ2V0KGFhKS5oZWlnaHQ6RC5nZXQoYWEpLndpZHRoLHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIiLHRleHRSb3RhdGlvbjpRPzA6OTB9LHQuc2VsZWN0KHRoaXMpLm5vZGUoKSl9KX07cS5wcm90b3R5cGUuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdT10aGlzLHg9dGhpcy5fc2NhbGUucmFuZ2UoKTtyZXR1cm4gbS5BcnJheS51bmlxKHRoaXMuYW5ub3RhdGVkVGlja3MoKS5maWx0ZXIoZnVuY3Rpb24oQSl7cmV0dXJuIG51bGw9PUE/ITE6bS5NYXRoLmluUmFuZ2UodS5fc2NhbGUuc2NhbGUoQSksCnhbMF0seFsxXSl9KSl9O3EucHJvdG90eXBlLl9jb3JlU2l6ZT1mdW5jdGlvbigpe3ZhciB1PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCkseD10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuX2NvbXB1dGVIZWlnaHQoKTp0aGlzLl9jb21wdXRlV2lkdGgoKTtyZXR1cm4gTWF0aC5taW4oeCx1KX07cS5wcm90b3R5cGUuX2Fubm90YXRpb25UaWVySGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqcS5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HfTtxLnByb3RvdHlwZS5fYW5ub3RhdGlvblRvVGllcj1mdW5jdGlvbih1KXt2YXIgeD10aGlzLEE9W1tdXSx5PW5ldyBtLk1hcCx3PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy53aWR0aCgpOnRoaXMuaGVpZ2h0KCk7dGhpcy5fYW5ub3RhdGVkVGlja3NUb1JlbmRlcigpLmZvckVhY2goZnVuY3Rpb24oQyl7dmFyIEc9eC5fc2NhbGUuc2NhbGUoQyksCkQ9dS5nZXQoQykud2lkdGg7aWYoMD5HfHxHK0Q+dyl5LnNldChDLC0xKTtlbHNle2Zvcih2YXIgQj1mdW5jdGlvbihOKXtyZXR1cm4gQVtOXS5zb21lKGZ1bmN0aW9uKE8pe3ZhciBIPXguX3NjYWxlLnNjYWxlKE8pO089dS5nZXQoTykud2lkdGg7cmV0dXJuIEcrRD49SCYmRzw9SCtPfSl9LEk9MDtCKEkpOylJKyssQS5sZW5ndGg9PT1JJiZBLnB1c2goW10pO0FbSV0ucHVzaChDKTt5LnNldChDLEkpfX0pO3JldHVybiB5fTtxLnByb3RvdHlwZS5fcmVtb3ZlQW5ub3RhdGlvbnM9ZnVuY3Rpb24oKXt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tbGluZSIpLnJlbW92ZSgpO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1jaXJjbGUiKS5yZW1vdmUoKTt0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tcmVjdCIpLnJlbW92ZSgpO3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1sYWJlbCIpLnJlbW92ZSgpfTsKcS5wcm90b3R5cGUuX2dlbmVyYXRlQmFzZWxpbmVBdHRySGFzaD1mdW5jdGlvbigpe3ZhciB1PXt4MTowLHkxOjAseDI6MCx5MjowfTtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6dS54Mj10aGlzLndpZHRoKCk7YnJlYWs7Y2FzZSAidG9wIjp1LngyPXRoaXMud2lkdGgoKTt1LnkxPXRoaXMuaGVpZ2h0KCk7dS55Mj10aGlzLmhlaWdodCgpO2JyZWFrO2Nhc2UgImxlZnQiOnUueDE9dGhpcy53aWR0aCgpO3UueDI9dGhpcy53aWR0aCgpO3UueTI9dGhpcy5oZWlnaHQoKTticmVhaztjYXNlICJyaWdodCI6dS55Mj10aGlzLmhlaWdodCgpfXJldHVybiB1fTtxLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHgodyl7cmV0dXJuIEEuX3NjYWxlLnNjYWxlKHcpfXZhciBBPXRoaXM7dm9pZCAwPT09dSYmKHU9ITEpO3ZhciB5PXt4MTowLHkxOjAseDI6MCx5MjowfTt0aGlzLmlzSG9yaXpvbnRhbCgpPyh5LngxPQp4LHkueDI9eCk6KHkueTE9eCx5LnkyPXgpO3U9dT90aGlzLl9lbmRUaWNrTGVuZ3RoOnRoaXMuX2lubmVyVGlja0xlbmd0aDtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6eS55Mj11O2JyZWFrO2Nhc2UgInRvcCI6eS55MT10aGlzLmhlaWdodCgpO3kueTI9dGhpcy5oZWlnaHQoKS11O2JyZWFrO2Nhc2UgImxlZnQiOnkueDE9dGhpcy53aWR0aCgpO3kueDI9dGhpcy53aWR0aCgpLXU7YnJlYWs7Y2FzZSAicmlnaHQiOnkueDI9dX1yZXR1cm4geX07cS5wcm90b3R5cGUuX3NldERlZmF1bHRBbGlnbm1lbnQ9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UgImJvdHRvbSI6dGhpcy55QWxpZ25tZW50KCJ0b3AiKTticmVhaztjYXNlICJ0b3AiOnRoaXMueUFsaWdubWVudCgiYm90dG9tIik7YnJlYWs7Y2FzZSAibGVmdCI6dGhpcy54QWxpZ25tZW50KCJyaWdodCIpO2JyZWFrO2Nhc2UgInJpZ2h0Ijp0aGlzLnhBbGlnbm1lbnQoImxlZnQiKX19OwpxLnByb3RvdHlwZS5pc0hvcml6b250YWw9ZnVuY3Rpb24oKXtyZXR1cm4idG9wIj09PXRoaXMuX29yaWVudGF0aW9ufHwiYm90dG9tIj09PXRoaXMuX29yaWVudGF0aW9ufTtxLnByb3RvdHlwZS5nZXRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zY2FsZX07cS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2Zvcm1hdHRlcjt0aGlzLl9mb3JtYXR0ZXI9dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5pbm5lclRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faW5uZXJUaWNrTGVuZ3RofTtxLnByb3RvdHlwZS5lbmRUaWNrTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VuZFRpY2tMZW5ndGh9O3EucHJvdG90eXBlLl9tYXhMYWJlbFRpY2tMZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zaG93RW5kVGlja0xhYmVscygpP01hdGgubWF4KHRoaXMuaW5uZXJUaWNrTGVuZ3RoKCksCnRoaXMuZW5kVGlja0xlbmd0aCgpKTp0aGlzLmlubmVyVGlja0xlbmd0aCgpfTtxLnByb3RvdHlwZS50aWNrTGFiZWxQYWRkaW5nPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBhZGRpbmc7aWYoMD51KXRocm93IEVycm9yKCJ0aWNrIGxhYmVsIHBhZGRpbmcgbXVzdCBiZSBwb3NpdGl2ZSIpO3RoaXMuX3RpY2tMYWJlbFBhZGRpbmc9dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5tYXJnaW49ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fbWFyZ2luO2lmKDA+dSl0aHJvdyBFcnJvcigibWFyZ2luIHNpemUgbXVzdCBiZSBwb3NpdGl2ZSIpO3RoaXMuX21hcmdpbj11O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uO3U9dS50b0xvd2VyQ2FzZSgpO2lmKCJ0b3AiIT09dSYmImJvdHRvbSIhPT0KdSYmImxlZnQiIT09dSYmInJpZ2h0IiE9PXUpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIG9yaWVudGF0aW9uIik7dGhpcy5fb3JpZW50YXRpb249dTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5zaG93RW5kVGlja0xhYmVscz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zaG93RW5kVGlja0xhYmVsc307cS5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTWFya3M9ZnVuY3Rpb24oKXt0aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuVElDS19NQVJLX0NMQVNTKS5lYWNoKGZ1bmN0aW9uKCl7dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KX07cS5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKS5lYWNoKGZ1bmN0aW9uKCl7dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KX07CnEucHJvdG90eXBlLl9oaWRlT3ZlcmZsb3dpbmdUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHU9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHg9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKTt4LmVtcHR5KCl8fHguZWFjaChmdW5jdGlvbigpe20uRE9NLmNsaWVudFJlY3RJbnNpZGUodGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx1KXx8dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTtxLnByb3RvdHlwZS5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbD1mdW5jdGlvbigpe3ZhciB1PXRoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX01BUktfQ0xBU1MpLHg9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrcS5USUNLX0xBQkVMX0NMQVNTKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgQT10LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpOwpyZXR1cm4iaW5oZXJpdCI9PT1BfHwidmlzaWJsZSI9PT1BfSkuZGF0YSgpO3UuZWFjaChmdW5jdGlvbihBKXstMT09PXguaW5kZXhPZihBKSYmdC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pfTtxLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtuLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHF9KGQuQ29tcG9uZW50KTtoLkVORF9USUNLX01BUktfQ0xBU1M9ImVuZC10aWNrLW1hcmsiO2guVElDS19NQVJLX0NMQVNTPSJ0aWNrLW1hcmsiO2guVElDS19MQUJFTF9DTEFTUz0idGljay1sYWJlbCI7aC5BTk5PVEFUSU9OX0xJTkVfQ0xBU1M9ImFubm90YXRpb24tbGluZSI7aC5BTk5PVEFUSU9OX1JFQ1RfQ0xBU1M9ImFubm90YXRpb24tcmVjdCI7aC5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUz0iYW5ub3RhdGlvbi1jaXJjbGUiO2guQU5OT1RBVElPTl9MQUJFTF9DTEFTUz0KImFubm90YXRpb24tbGFiZWwiO2guX0FOTk9UQVRJT05fTEFCRUxfUEFERElORz00O2YuQXhpcz1ofSxmdW5jdGlvbihkLGYpe2YuU0hPV19XQVJOSU5HUz0hMDtmLkFERF9USVRMRV9FTEVNRU5UUz0hMH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMCk7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uPXt9O3RoaXMuX2V2ZW50VGFyZ2V0PWRvY3VtZW50O3RoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXQ9e307dGhpcy5fY29ubmVjdGVkPSExfXQucHJvdG90eXBlLl9oYXNOb0NhbGxiYWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgbD1PYmplY3Qua2V5cyh0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0KSxwPTA7cDxsLmxlbmd0aDtwKyspaWYoMCE9PXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbbFtwXV0uc2l6ZSlyZXR1cm4hMTtyZXR1cm4hMH07dC5wcm90b3R5cGUuX2Nvbm5lY3Q9ZnVuY3Rpb24oKXt2YXIgbD10aGlzOwp0aGlzLl9jb25uZWN0ZWR8fChPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKHApe2wuX2V2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIocCxsLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3BdKX0pLHRoaXMuX2Nvbm5lY3RlZD0hMCl9O3QucHJvdG90eXBlLl9kaXNjb25uZWN0PWZ1bmN0aW9uKCl7dmFyIGw9dGhpczt0aGlzLl9jb25uZWN0ZWQmJnRoaXMuX2hhc05vQ2FsbGJhY2tzKCkmJihPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKGZ1bmN0aW9uKHApe2wuX2V2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIocCxsLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3BdKX0pLHRoaXMuX2Nvbm5lY3RlZD0hMSl9O3QucHJvdG90eXBlLl9hZGRDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKGwscCl7bnVsbD09dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXSYmCih0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2xdPW5ldyBrLkNhbGxiYWNrU2V0KTt0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2xdLmFkZChwKTt0aGlzLl9jb25uZWN0KCl9O3QucHJvdG90eXBlLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKGwscCl7bnVsbCE9dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXSYmdGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXS5kZWxldGUocCk7dGhpcy5fZGlzY29ubmVjdCgpfTt0LnByb3RvdHlwZS5fY2FsbENhbGxiYWNrc0ZvckV2ZW50PWZ1bmN0aW9uKGwpe2Zvcih2YXIgcD1bXSxtPTE7bTxhcmd1bWVudHMubGVuZ3RoO20rKylwW20tMV09YXJndW1lbnRzW21dO209dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtsXTtudWxsIT1tJiZtLmNhbGxDYWxsYmFja3MuYXBwbHkobSxwKX07cmV0dXJuIHR9KCk7Zi5EaXNwYXRjaGVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fAooZltsXT10W2xdKX1rKGgoODcpKTtrKGgoODgpKTtrKGgoNDApKTtrKGgoODkpKTtrKGgoOTApKTtkPWgoMjYpO2Yuem9vbU91dD1kLnpvb21PdXR9LGZ1bmN0aW9uKGQsZil7ZnVuY3Rpb24gaChuLHEsdSl7cmV0dXJuIHUtKHUtbikqcX1mdW5jdGlvbiBrKG4scSx1KXtyZXR1cm4obipxLXUpLyhxLTEpfWZ1bmN0aW9uIHQobixxLHUseCl7dmFyIEE9MTxxO3U9QT94OnU7aWYobnVsbD09dSlyZXR1cm4gcTtuPW4uZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTtyZXR1cm4oQT9NYXRoLm1pbjpNYXRoLm1heCkocSx1L01hdGguYWJzKG5bMV0tblswXSkpfWZ1bmN0aW9uIGwobixxLHUseCxBKXtpZigxPj1xKXJldHVybntjZW50ZXJQb2ludDp1LHpvb21BbW91bnQ6cX07aWYobnVsbD09eCYmbnVsbD09QSlyZXR1cm57Y2VudGVyUG9pbnQ6dSx6b29tQW1vdW50OnF9O3ZhciB5PXAobiksdz1tKG4pLEM9dz9JbmZpbml0eTotSW5maW5pdHk7dz13Py1JbmZpbml0eTpJbmZpbml0eTt4PW51bGw9PQp4P0M6eDtBPW51bGw9PUE/dzpBO3c9bi5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpO0M9d1swXTt3PXdbMV07QT1uLnNjYWxlVHJhbnNmb3JtYXRpb24oQSk7dz1uLnNjYWxlVHJhbnNmb3JtYXRpb24odyk7dmFyIEc9aCh3LHEsdSk7eD1uLnNjYWxlVHJhbnNmb3JtYXRpb24oeCk7bj1uLnNjYWxlVHJhbnNmb3JtYXRpb24oQyk7Qz1oKG4scSx1KTtyZXR1cm4gTWF0aC5hYnMoRy1DKT5NYXRoLmFicyhBLXgpPyhxPShBLXgpLyh3LW4pLDEhPT1xP3tjZW50ZXJQb2ludDprKHcscSxBKSx6b29tQW1vdW50OnF9OntjZW50ZXJQb2ludDp1LHpvb21BbW91bnQ6cX0pOkc+QSE9eT97Y2VudGVyUG9pbnQ6ayh3LHEsQSksem9vbUFtb3VudDpxfTpDPHghPXk/e2NlbnRlclBvaW50OmsobixxLHgpLHpvb21BbW91bnQ6cX06e2NlbnRlclBvaW50OnUsem9vbUFtb3VudDpxfX1mdW5jdGlvbiBwKG4pe249bi5yYW5nZSgpO3JldHVybiBuWzFdPG5bMF19ZnVuY3Rpb24gbShuKXtuPW4uZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTsKcmV0dXJuIG5bMV08blswXX1mLnpvb21PdXQ9aDtmLmNvbnN0cmFpbmVkWm9vbT1mdW5jdGlvbihuLHEsdSx4LEEseSx3KXtxPXQobixxLHgsQSk7cmV0dXJuIGwobixxLHUseSx3KX07Zi5jb25zdHJhaW5ab29tRXh0ZW50cz10O2YuY29uc3RyYWluWm9vbVZhbHVlcz1sO2YuY29uc3RyYWluZWRUcmFuc2xhdGlvbj1mdW5jdGlvbihuLHEsdSx4KXt2YXIgQT1uLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCkseT1BWzBdLHc9QVsxXTtBPXAobik7MDxxIT09QT8odT14LG51bGwhPXUmJih5PW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih3KSxuPW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih1KSxxPShBP01hdGgubWF4Ok1hdGgubWluKSh5K3EsbikteSkpOm51bGwhPXUmJih5PW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih5KSxuPW4uc2NhbGVUcmFuc2Zvcm1hdGlvbih1KSxxPShBP01hdGgubWluOk1hdGgubWF4KSh5K3EsbikteSk7cmV0dXJuIHF9fSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhJLApOLE8pe3ZhciBIPUkuc2NhbGU7aWYoSCBpbnN0YW5jZW9mIHkuQ2F0ZWdvcnkpTz1ILnJhbmdlQmFuZCgpO2Vsc2V7dmFyIEs9SS5hY2Nlc3NvcjtJPWwuc2V0KEMuQXJyYXkuZmxhdHRlbihOLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gTS5kYXRhKCkubWFwKGZ1bmN0aW9uKEwsUSl7cmV0dXJuIEsoTCxRLE0pfSkuZmlsdGVyKGZ1bmN0aW9uKEwpe3JldHVybiBudWxsIT1MfSkubWFwKGZ1bmN0aW9uKEwpe3JldHVybiBMLnZhbHVlT2YoKX0pfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24oTSl7cmV0dXJuK019KTtJLnNvcnQoZnVuY3Rpb24oTSxMKXtyZXR1cm4gTS1MfSk7ST1JLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gSC5zY2FsZShNKX0pO0k9bC5wYWlycyhJKTtPPUMuTWF0aC5taW4oSSxmdW5jdGlvbihNKXtyZXR1cm4gTWF0aC5hYnMoTVsxXS1NWzBdKX0sTypCLl9TSU5HTEVfQkFSX0RJTUVOU0lPTl9SQVRJTyk7Tyo9Qi5fQkFSX1RISUNLTkVTU19SQVRJT31yZXR1cm4gT30KdmFyIHQ9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKEksTil7ZnVuY3Rpb24gTygpe3RoaXMuY29uc3RydWN0b3I9SX1mb3IodmFyIEggaW4gTilOLmhhc093blByb3BlcnR5KEgpJiYoSVtIXT1OW0hdKTtJLnByb3RvdHlwZT1udWxsPT09Tj9PYmplY3QuY3JlYXRlKE4pOihPLnByb3RvdHlwZT1OLnByb3RvdHlwZSxuZXcgTyl9LGw9aCgxKSxwPWgoNSksbT1oKDcpLG49aCg4KSxxPWgoMTQpLHU9aCg2KSx4PWgoMzQpLEE9aCgyMCkseT1oKDMpLHc9aCgxMSksQz1oKDApO2Q9aCgxMCk7dmFyIEc9aCgxOSksRD1oKDIpO2g9aCgxNik7Zi5CYXJPcmllbnRhdGlvbj1kLm1ha2VFbnVtKFsidmVydGljYWwiLCJob3Jpem9udGFsIl0pO2YuTGFiZWxzUG9zaXRpb249ZC5tYWtlRW51bShbInN0YXJ0IiwibWlkZGxlIiwiZW5kIiwib3V0c2lkZSJdKTtmLkJhckFsaWdubWVudD1kLm1ha2VFbnVtKFsic3RhcnQiLCJtaWRkbGUiLCJlbmQiXSk7dmFyIEI9ZnVuY3Rpb24oSSl7ZnVuY3Rpb24gTihPKXt2b2lkIDA9PT0KTyYmKE89InZlcnRpY2FsIik7dmFyIEg9SS5jYWxsKHRoaXMpfHx0aGlzO0guX2xhYmVsRm9ybWF0dGVyPW4uaWRlbnRpdHkoKTtILl9sYWJlbHNFbmFibGVkPSExO0guX2xhYmVsc1Bvc2l0aW9uPWYuTGFiZWxzUG9zaXRpb24uZW5kO0guX2hpZGVCYXJzSWZBbnlBcmVUb29XaWRlPSEwO0guX2JhckFsaWdubWVudD0ibWlkZGxlIjtILl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3M9QS5tZW1vaXplKGspO0guX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITA7SC5hZGRDbGFzcygiYmFyLXBsb3QiKTtpZigidmVydGljYWwiIT09TyYmImhvcml6b250YWwiIT09Tyl0aHJvdyBFcnJvcihPKyIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIFBsb3RzLkJhciIpO0guX2lzVmVydGljYWw9InZlcnRpY2FsIj09PU87SC5hbmltYXRvcigiYmFzZWxpbmUiLG5ldyBtLk51bGwpO0guYXR0cigiZmlsbCIsKG5ldyB5LkNvbG9yKS5yYW5nZSgpWzBdKTtILmF0dHIoTi5fQkFSX1RISUNLTkVTU19LRVksCmZ1bmN0aW9uKCl7cmV0dXJuIEguX2JhclBpeGVsVGhpY2tuZXNzKCl9KTtILl9sYWJlbENvbmZpZz1uZXcgQy5NYXA7SC5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuW0guYmFzZWxpbmVWYWx1ZSgpXX07cmV0dXJuIEh9dChOLEkpO04ucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oTyxILEspe0kucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLE8sSCxLKTt0aGlzLl91cGRhdGVFeHRlbnRzKCk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLng9ZnVuY3Rpb24oTyxIKXtpZihudWxsPT1PKXJldHVybiBJLnByb3RvdHlwZS54LmNhbGwodGhpcyk7bnVsbD09SD9JLnByb3RvdHlwZS54LmNhbGwodGhpcyxPKTpJLnByb3RvdHlwZS54LmNhbGwodGhpcyxPLEgpO3RoaXMuX3VwZGF0ZVRoaWNrbmVzc0F0dHIoKTt0aGlzLl91cGRhdGVMZW5ndGhTY2FsZSgpO3JldHVybiB0aGlzfTtOLnByb3RvdHlwZS55PWZ1bmN0aW9uKE8sSCl7aWYobnVsbD09Ck8pcmV0dXJuIEkucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT1IP0kucHJvdG90eXBlLnkuY2FsbCh0aGlzLE8pOkkucHJvdG90eXBlLnkuY2FsbCh0aGlzLE8sSCk7dGhpcy5fdXBkYXRlTGVuZ3RoU2NhbGUoKTtyZXR1cm4gdGhpc307Ti5wcm90b3R5cGUubGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/dGhpcy55KCk6dGhpcy54KCl9O04ucHJvdG90eXBlLnBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/dGhpcy54KCk6dGhpcy55KCl9O04ucHJvdG90eXBlLmJhckVuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChOLl9CQVJfRU5EX0tFWSl9O04ucHJvdG90eXBlLmJhckFsaWdubWVudD1mdW5jdGlvbihPKXtpZihudWxsPT1PKXJldHVybiB0aGlzLl9iYXJBbGlnbm1lbnQ7dGhpcy5fYmFyQWxpZ25tZW50PU87dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7CnJldHVybiB0aGlzfTtOLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwifTtOLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1LlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB4LlJlY3RhbmdsZVNWR0RyYXdlcihOLl9CQVJfQVJFQV9DTEFTUyl9LGZ1bmN0aW9uKE8pe3JldHVybiBuZXcgcS5SZWN0YW5nbGVDYW52YXNEcmF3ZXIoTyl9KX07Ti5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7SS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dGhpcy5fYmFzZWxpbmU9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApfTtOLnByb3RvdHlwZS5iYXNlbGluZVZhbHVlPWZ1bmN0aW9uKCl7aWYobnVsbCE9dGhpcy5fYmFzZWxpbmVWYWx1ZSlyZXR1cm4gdGhpcy5fYmFzZWxpbmVWYWx1ZTtpZighdGhpcy5fcHJvamVjdG9yc1JlYWR5KCkpcmV0dXJuIDA7CnZhciBPPXRoaXMubGVuZ3RoKCkuc2NhbGU7cmV0dXJuIE8/TyBpbnN0YW5jZW9mIHkuVGltZT9uZXcgRGF0ZSgwKTowOjB9O04ucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oTyl7SS5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsTyl9O04ucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKE8pe0kucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyxPKTtyZXR1cm4gdGhpc307Ti5wcm90b3R5cGUucmVtb3ZlRGF0YXNldD1mdW5jdGlvbihPKXtJLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxPKX07Ti5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oTyl7SS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQuY2FsbCh0aGlzLE8pO3JldHVybiB0aGlzfTtOLnByb3RvdHlwZS5kYXRhc2V0cz1mdW5jdGlvbihPKXtpZihudWxsPT1PKXJldHVybiBJLnByb3RvdHlwZS5kYXRhc2V0cy5jYWxsKHRoaXMpO0kucHJvdG90eXBlLmRhdGFzZXRzLmNhbGwodGhpcywKTyk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oTyxIKXtpZihudWxsPT1PKXJldHVybiB0aGlzLl9sYWJlbHNFbmFibGVkO3RoaXMuX2xhYmVsc0VuYWJsZWQ9TztudWxsIT1IJiYodGhpcy5fbGFiZWxzUG9zaXRpb249SCk7dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLmxhYmVsRm9ybWF0dGVyPWZ1bmN0aW9uKE8pe2lmKG51bGw9PU8pcmV0dXJuIHRoaXMuX2xhYmVsRm9ybWF0dGVyO3RoaXMuX2xhYmVsRm9ybWF0dGVyPU87dGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O04ucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24oTyl7dmFyIEg9SS5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldC5jYWxsKHRoaXMsTyksSz10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoTi5fTEFCRUxfQVJFQV9DTEFTUywKITApLE09bmV3IHAuU3ZnQ29udGV4dChLLm5vZGUoKSksTD1uZXcgcC5DYWNoZU1lYXN1cmVyKE0pO009bmV3IHAuV3JpdGVyKEwsTSk7dGhpcy5fbGFiZWxDb25maWcuc2V0KE8se2xhYmVsQXJlYTpLLG1lYXN1cmVyOkwsd3JpdGVyOk19KTtyZXR1cm4gSH07Ti5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihPKXtJLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzLmNhbGwodGhpcyxPKTt2YXIgSD10aGlzLl9sYWJlbENvbmZpZy5nZXQoTyk7bnVsbCE9SCYmKEgubGFiZWxBcmVhLnJlbW92ZSgpLHRoaXMuX2xhYmVsQ29uZmlnLmRlbGV0ZShPKSl9O04ucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24oTyl7dmFyIEg9dGhpcztyZXR1cm4gdGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzLmRvTG9ja2VkKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gSyhjYSxrYSxZLEVhKXtyZXR1cm4gSC5fcGl4ZWxQb2ludEJhcihhYShjYSxrYSxZKSxsYSxFYSl9CnZhciBNPUguX2lzVmVydGljYWw/Ty54Ok8ueSxMPUguX2lzVmVydGljYWw/Ty55Ok8ueCxRPUguYm91bmRzKCksVD17bWluOjAsbWF4OlEuYm90dG9tUmlnaHQueC1RLnRvcExlZnQueH0sWD17bWluOjAsbWF4OlEuYm90dG9tUmlnaHQueS1RLnRvcExlZnQueX0sYWE9RC5QbG90Ll9zY2FsZWRBY2Nlc3NvcihILmxlbmd0aCgpKSxsYT1ILmxlbmd0aCgpLnNjYWxlLnNjYWxlKEguYmFzZWxpbmVWYWx1ZSgpKSxaPUluZmluaXR5LGJhPUluZmluaXR5LGVhO0guX2dldEVudGl0eVN0b3JlKCkuZW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKGNhKXt2YXIga2E9SC5fZW50aXR5Qm91bmRzKGNhKTtpZihDLkRPTS5pbnRlcnNlY3RzQkJveChULFgsa2EpKXt2YXIgWT0wLEVhPTA7aWYoIUMuRE9NLmludGVyc2VjdHNCQm94KE8ueCxPLnksa2EsLjUpKXtFYT1LKGNhLmRhdHVtLGNhLmluZGV4LGNhLmRhdGFzZXQsa2EpO1k9TWF0aC5hYnMoTS0oSC5faXNWZXJ0aWNhbD9FYS54OkVhLnkpKTsKdmFyIHZhPUguX2lzVmVydGljYWw/a2EueTprYS54O2thPXZhKyhILl9pc1ZlcnRpY2FsP2thLmhlaWdodDprYS53aWR0aCk7RWE9TD49dmEtLjUmJkw8PWthKy41PzA6TWF0aC5hYnMoTC0oSC5faXNWZXJ0aWNhbD9FYS55OkVhLngpKX1pZihZPFp8fFk9PT1aJiZFYTxiYSllYT1jYSxaPVksYmE9RWF9fSk7aWYodm9pZCAwIT09ZWEpcmV0dXJuIEguX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShlYSl9KX07Ti5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbihPKXtyZXR1cm4gdGhpcy5fZW50aXRpZXNJbnRlcnNlY3RpbmcoTy54LE8ueSl9O04ucHJvdG90eXBlLl9lbnRpdGllc0ludGVyc2VjdGluZz1mdW5jdGlvbihPLEgpe3ZhciBLPXRoaXMsTT1bXTt0aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzKCkuZm9yRWFjaChmdW5jdGlvbihMKXtDLkRPTS5pbnRlcnNlY3RzQkJveChPLEgsSy5fZW50aXR5Qm91bmRzKEwpKSYmTS5wdXNoKEsuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShMKSl9KTsKcmV0dXJuIE19O04ucHJvdG90eXBlLl91cGRhdGVMZW5ndGhTY2FsZT1mdW5jdGlvbigpe2lmKHRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXt2YXIgTz10aGlzLmxlbmd0aCgpLnNjYWxlO08gaW5zdGFuY2VvZiB3LlF1YW50aXRhdGl2ZVNjYWxlJiYoTy5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlciksTy5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcikpfX07Ti5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgTz10aGlzO3RoaXMuX2JhclBpeGVsVGhpY2tuZXNzKCk7cmV0dXJuIHRoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcy5kb0xvY2tlZChmdW5jdGlvbigpe3JldHVybiBJLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKE8pfSl9O04ucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oTyl7dmFyIEg9dGhpcyxLPXRoaXMubGVuZ3RoKCkuc2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpOwpLPXt4MTp0aGlzLl9pc1ZlcnRpY2FsPzA6Syx5MTp0aGlzLl9pc1ZlcnRpY2FsP0s6MCx4Mjp0aGlzLl9pc1ZlcnRpY2FsP3RoaXMud2lkdGgoKTpLLHkyOnRoaXMuX2lzVmVydGljYWw/Szp0aGlzLmhlaWdodCgpfTt0aGlzLl9nZXRBbmltYXRvcigiYmFzZWxpbmUiKS5hbmltYXRlKHRoaXMuX2Jhc2VsaW5lLEspO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKE0pe3JldHVybiBILl9sYWJlbENvbmZpZy5nZXQoTSkubGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpfSk7dGhpcy5fbGFiZWxzRW5hYmxlZCYmQy5XaW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiBILl9kcmF3TGFiZWxzKCl9LE8pfTtOLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oTyl7dmFyIEg9dGhpcyxLPUkucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsTyk7aWYoIngiPT09TyYmdGhpcy5faXNWZXJ0aWNhbClPPXRoaXMueCgpOwplbHNle2lmKCJ5IiE9PU98fHRoaXMuX2lzVmVydGljYWwpcmV0dXJuIEs7Tz10aGlzLnkoKX1pZighKE8mJk8uc2NhbGUmJk8uc2NhbGUgaW5zdGFuY2VvZiB3LlF1YW50aXRhdGl2ZVNjYWxlKSlyZXR1cm4gSzt2YXIgTT1PLnNjYWxlLEw9dGhpcy5fYmFyUGl4ZWxUaGlja25lc3MoKTtyZXR1cm4gSz1LLm1hcChmdW5jdGlvbihRKXtyZXR1cm4gbC5leHRlbnQoW00uaW52ZXJ0KEguX2dldFBvc2l0aW9uQXR0cihNLnNjYWxlKFFbMF0pLEwpKSxNLmludmVydChILl9nZXRQb3NpdGlvbkF0dHIoTS5zY2FsZShRWzBdKSxMKStMKSxNLmludmVydChILl9nZXRQb3NpdGlvbkF0dHIoTS5zY2FsZShRWzFdKSxMKSksTS5pbnZlcnQoSC5fZ2V0UG9zaXRpb25BdHRyKE0uc2NhbGUoUVsxXSksTCkrTCldKX0pfTtOLnByb3RvdHlwZS5fZ2V0UG9zaXRpb25BdHRyPWZ1bmN0aW9uKE8sSCl7dGhpcy5faXNWZXJ0aWNhbHx8KE8tPUgsSCo9LTEpO3N3aXRjaCh0aGlzLl9iYXJBbGlnbm1lbnQpe2Nhc2UgInN0YXJ0IjpyZXR1cm4gTzsKY2FzZSAiZW5kIjpyZXR1cm4gTy1IO2RlZmF1bHQ6cmV0dXJuIE8tSC8yfX07Ti5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgTz10aGlzLEg9dGhpcy5fZ2V0RGF0YVRvRHJhdygpLEs9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksTT10aGlzLmRhdGFzZXRzKCkuc29tZShmdW5jdGlvbihMKXtyZXR1cm4gSC5nZXQoTCkuc29tZShmdW5jdGlvbihRLFQpe3JldHVybiBudWxsPT1RPyExOk8uX2RyYXdMYWJlbChRLFQsTCxLKX0pfSk7dGhpcy5faGlkZUJhcnNJZkFueUFyZVRvb1dpZGUmJk0mJnRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEwpe3JldHVybiBPLl9sYWJlbENvbmZpZy5nZXQoTCkubGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpfSl9O04ucHJvdG90eXBlLl9kcmF3TGFiZWw9ZnVuY3Rpb24oTyxILEssTSl7dmFyIEw9dGhpcy5fbGFiZWxDb25maWcuZ2V0KEspLFE9TC5sYWJlbEFyZWEsVD1MLm1lYXN1cmVyO0w9TC53cml0ZXI7CnZhciBYPXRoaXMubGVuZ3RoKCkuYWNjZXNzb3IsYWE9WChPLEgsSyk7WD10aGlzLmxlbmd0aCgpLnNjYWxlO3ZhciBsYT1udWxsIT1YP1guc2NhbGUoYWEpOmFhLFo9bnVsbCE9WD9YLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKTp0aGlzLmJhc2VsaW5lVmFsdWUoKSxiYT17eDpNLngoTyxILEspLHk6TS55KE8sSCxLKX07WD17d2lkdGg6TS53aWR0aChPLEgsSyksaGVpZ2h0Ok0uaGVpZ2h0KE8sSCxLKX07YWE9dGhpcy5fbGFiZWxGb3JtYXR0ZXIoYWEsTyxILEspO1Q9VC5tZWFzdXJlKGFhKTt2YXIgZWE9dGhpcy5fc2hvdWxkU2hvd0xhYmVsT25CYXIoYmEsWCxUKTtiYT10aGlzLl9jYWxjdWxhdGVMYWJlbFByb3BlcnRpZXMoYmEsWCxULGVhLHRoaXMuX2lzVmVydGljYWw/bGE8PVo6bGE8Wik7bGE9YmEuY29udGFpbmVyRGltZW5zaW9ucztaPWJhLmxhYmVsQ29udGFpbmVyT3JpZ2luO2JhPWJhLmFsaWdubWVudDtPPU0uZmlsbChPLEgsSyk7UT10aGlzLl9jcmVhdGVMYWJlbENvbnRhaW5lcihRLApaLGVhLE8pO0wud3JpdGUoYWEsbGEud2lkdGgsbGEuaGVpZ2h0LHt4QWxpZ246YmEueCx5QWxpZ246YmEueX0sUS5ub2RlKCkpO3JldHVybiB0aGlzLl9pc1ZlcnRpY2FsP1gud2lkdGg8VC53aWR0aDpYLmhlaWdodDxULmhlaWdodH07Ti5wcm90b3R5cGUuX3Nob3VsZFNob3dMYWJlbE9uQmFyPWZ1bmN0aW9uKE8sSCxLKXtpZih0aGlzLl9sYWJlbHNQb3NpdGlvbj09PWYuTGFiZWxzUG9zaXRpb24ub3V0c2lkZSlyZXR1cm4hMTtPPXRoaXMuX2lzVmVydGljYWw/Ty55Ok8ueDt2YXIgTT10aGlzLl9pc1ZlcnRpY2FsP0guaGVpZ2h0Okgud2lkdGg7SD10aGlzLl9pc1ZlcnRpY2FsP3RoaXMuaGVpZ2h0KCk6dGhpcy53aWR0aCgpO0s9dGhpcy5faXNWZXJ0aWNhbD9LLmhlaWdodDpLLndpZHRoO3ZhciBMPU8rTTtMPkg/TT1ILU86MD5PJiYoTT1MKTtyZXR1cm4gSytOLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjw9TX07Ti5wcm90b3R5cGUuX2NhbGN1bGF0ZUxhYmVsUHJvcGVydGllcz0KZnVuY3Rpb24oTyxILEssTSxMKXtmdW5jdGlvbiBRKGthKXtzd2l0Y2goa2Epe2Nhc2UgInRvcExlZnQiOlo9VC5faXNWZXJ0aWNhbD8idG9wIjoibGVmdCI7ZWErPU4uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSO2NhKz1OLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjticmVhaztjYXNlICJjZW50ZXIiOmNhKz0oYWErbGEpLzI7YnJlYWs7Y2FzZSAiYm90dG9tUmlnaHQiOlo9VC5faXNWZXJ0aWNhbD8iYm90dG9tIjoicmlnaHQiLGVhLT1OLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUixjYSs9YmEtTi5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVItbGF9fXZhciBUPXRoaXMsWD10aGlzLl9pc1ZlcnRpY2FsP08ueTpPLngsYWE9dGhpcy5faXNWZXJ0aWNhbD9ILmhlaWdodDpILndpZHRoLGxhPXRoaXMuX2lzVmVydGljYWw/Sy5oZWlnaHQ6Sy53aWR0aCxaPSJjZW50ZXIiLGJhPWFhLGVhPVgsY2E9WDtpZihNKXN3aXRjaCh0aGlzLl9sYWJlbHNQb3NpdGlvbil7Y2FzZSBmLkxhYmVsc1Bvc2l0aW9uLnN0YXJ0Okw/ClEoImJvdHRvbVJpZ2h0Iik6USgidG9wTGVmdCIpO2JyZWFrO2Nhc2UgZi5MYWJlbHNQb3NpdGlvbi5taWRkbGU6USgiY2VudGVyIik7YnJlYWs7Y2FzZSBmLkxhYmVsc1Bvc2l0aW9uLmVuZDpMP1EoInRvcExlZnQiKTpRKCJib3R0b21SaWdodCIpfWVsc2UgTD8oWj10aGlzLl9pc1ZlcnRpY2FsPyJ0b3AiOiJsZWZ0IixiYT1hYStOLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUitsYSxlYS09Ti5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrbGEsY2EtPU4uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSK2xhKTooWj10aGlzLl9pc1ZlcnRpY2FsPyJib3R0b20iOiJyaWdodCIsYmE9YWErTi5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrbGEsY2ErPWFhK04uX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSKTtyZXR1cm57Y29udGFpbmVyRGltZW5zaW9uczp7d2lkdGg6dGhpcy5faXNWZXJ0aWNhbD9ILndpZHRoOmJhLGhlaWdodDp0aGlzLl9pc1ZlcnRpY2FsP2JhOkguaGVpZ2h0fSxsYWJlbENvbnRhaW5lck9yaWdpbjp7eDp0aGlzLl9pc1ZlcnRpY2FsPwpPLng6ZWEseTp0aGlzLl9pc1ZlcnRpY2FsP2VhOk8ueX0sbGFiZWxPcmlnaW46e3g6dGhpcy5faXNWZXJ0aWNhbD9PLngrSC53aWR0aC8yLUsud2lkdGgvMjpjYSx5OnRoaXMuX2lzVmVydGljYWw/Y2E6Ty55K0guaGVpZ2h0LzItSy5oZWlnaHQvMn0sYWxpZ25tZW50Ont4OnRoaXMuX2lzVmVydGljYWw/ImNlbnRlciI6Wix5OnRoaXMuX2lzVmVydGljYWw/WjoiY2VudGVyIn19fTtOLnByb3RvdHlwZS5fY3JlYXRlTGFiZWxDb250YWluZXI9ZnVuY3Rpb24oTyxILEssTSl7Tz1PLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0gueCsiLCAiK0gueSsiKSIpO0s/KE8uY2xhc3NlZCgib24tYmFyLWxhYmVsIiwhMCksSz0xLjYqQy5Db2xvci5jb250cmFzdCgid2hpdGUiLE0pPEMuQ29sb3IuY29udHJhc3QoImJsYWNrIixNKSxPLmNsYXNzZWQoSz8iZGFyay1sYWJlbCI6ImxpZ2h0LWxhYmVsIiwhMCkpOk8uY2xhc3NlZCgib2ZmLWJhci1sYWJlbCIsITApO3JldHVybiBPfTsKTi5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIE89W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgSD10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxLPXRoaXMubGVuZ3RoKCkuc2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpLE09dGhpcy5faXNWZXJ0aWNhbD8iaGVpZ2h0Ijoid2lkdGgiO0hbdGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiXT1mdW5jdGlvbigpe3JldHVybiBLfTtIW01dPWZ1bmN0aW9uKCl7cmV0dXJuIDB9O08ucHVzaCh7YXR0clRvUHJvamVjdG9yOkgsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoRy5BbmltYXRvci5SRVNFVCl9KX1PLnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihHLkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIE99O04ucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe2Z1bmN0aW9uIE8oYmEsCmVhLGNhKXtyZXR1cm4gTWF0aC5hYnMoTS1YKGJhLGVhLGNhKSl9dmFyIEg9dGhpcyxLPUkucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLE09dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSksTD10aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCIsUT10aGlzLl9pc1ZlcnRpY2FsPyJ4IjoieSIsVD1ELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMucG9zaXRpb24oKSksWD1ELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMubGVuZ3RoKCkpLGFhPUtbTi5fQkFSX1RISUNLTkVTU19LRVldLGxhPUsuZ2FwLFo9bnVsbD09bGE/YWE6ZnVuY3Rpb24oYmEsZWEsY2Epe3JldHVybiBhYShiYSxlYSxjYSktbGEoYmEsZWEsY2EpfTtLLndpZHRoPXRoaXMuX2lzVmVydGljYWw/WjpPO0suaGVpZ2h0PXRoaXMuX2lzVmVydGljYWw/TzpaO0tbTF09ZnVuY3Rpb24oYmEsZWEsY2Epe2JhPVgoYmEsZWEsY2EpO3JldHVybiBiYT5NP006YmF9OwpLW1FdPWZ1bmN0aW9uKGJhLGVhLGNhKXtyZXR1cm4gSC5fZ2V0UG9zaXRpb25BdHRyKFQoYmEsZWEsY2EpLGFhKGJhLGVhLGNhKSl9O3JldHVybiBLfTtOLnByb3RvdHlwZS5fdXBkYXRlVGhpY2tuZXNzQXR0cj1mdW5jdGlvbigpe3ZhciBPPXRoaXMsSD10aGlzLnBvc2l0aW9uKCksSz10aGlzLmJhckVuZCgpO251bGwhPUgmJm51bGwhPUs/KHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITEsdGhpcy5hdHRyKE4uX0JBUl9USElDS05FU1NfS0VZLGZ1bmN0aW9uKE0sTCxRKXt2YXIgVD1ILmFjY2Vzc29yKE0sTCxRKTtNPUsuYWNjZXNzb3IoTSxMLFEpO1Q9SC5zY2FsZT9ILnNjYWxlLnNjYWxlKFQpOlQ7TT1LLnNjYWxlP0suc2NhbGUuc2NhbGUoTSk6TTtyZXR1cm4gTWF0aC5hYnMoTS1UKX0pKToodGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz0hMCx0aGlzLmF0dHIoTi5fQkFSX1RISUNLTkVTU19LRVksZnVuY3Rpb24oKXtyZXR1cm4gTy5fYmFyUGl4ZWxUaGlja25lc3MoKX0pKX07Ck4ucHJvdG90eXBlLl9iYXJQaXhlbFRoaWNrbmVzcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzP3RoaXMuX3Byb2plY3RvcnNSZWFkeSgpP3RoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcyh0aGlzLnBvc2l0aW9uKCksdGhpcy5kYXRhc2V0cygpLHRoaXMuX2lzVmVydGljYWw/dGhpcy53aWR0aCgpOnRoaXMuaGVpZ2h0KCkpOjA6MH07Ti5wcm90b3R5cGUuZW50aXRpZXM9ZnVuY3Rpb24oTyl7dm9pZCAwPT09TyYmKE89dGhpcy5kYXRhc2V0cygpKTtyZXR1cm4gdGhpcy5fcHJvamVjdG9yc1JlYWR5KCk/SS5wcm90b3R5cGUuZW50aXRpZXMuY2FsbCh0aGlzLE8pOltdfTtOLnByb3RvdHlwZS5fZW50aXR5Qm91bmRzPWZ1bmN0aW9uKE8pe3JldHVybiB0aGlzLl9waXhlbEJvdW5kcyhPLmRhdHVtLE8uaW5kZXgsTy5kYXRhc2V0KX07Ti5wcm90b3R5cGUuX3BpeGVsQm91bmRzPWZ1bmN0aW9uKE8sSCxLKXt2YXIgTT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTsKcmV0dXJue3g6TS54KE8sSCxLKSx5Ok0ueShPLEgsSyksd2lkdGg6TS53aWR0aChPLEgsSyksaGVpZ2h0Ok0uaGVpZ2h0KE8sSCxLKX19O04ucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKE8sSCxLKXt2YXIgTT10aGlzLl9waXhlbEJvdW5kcyhPLEgsSyk7Tz0odGhpcy5faXNWZXJ0aWNhbD9ELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTpELlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSkoTyxILEspO0g9KHRoaXMuX2lzVmVydGljYWw/dGhpcy55KCkuc2NhbGU6dGhpcy54KCkuc2NhbGUpLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKTtyZXR1cm4gdGhpcy5fcGl4ZWxQb2ludEJhcihPLEgsTSl9O04ucHJvdG90eXBlLl9waXhlbFBvaW50QmFyPWZ1bmN0aW9uKE8sSCxLKXtpZih0aGlzLl9pc1ZlcnRpY2FsKXt2YXIgTT1LLngrSy53aWR0aC8yO089Tzw9SD9LLnk6Sy55K0suaGVpZ2h0fWVsc2UgTT1PPj1IP0sueCtLLndpZHRoOksueCxPPUsueStLLmhlaWdodC8KMjtyZXR1cm57eDpNLHk6T319O04ucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbihPLEgpe0kucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsTyxIKX07Ti5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt2YXIgTz10aGlzLEg9bmV3IEMuTWFwLEs9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksTT10aGlzLndpZHRoKCksTD10aGlzLmhlaWdodCgpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKFEpe3ZhciBUPVEuZGF0YSgpLm1hcChmdW5jdGlvbihYLGFhKXtyZXR1cm4gTy5faXNEYXR1bU9uU2NyZWVuKEssTSxMLFgsYWEsUSk/WDpudWxsfSk7SC5zZXQoUSxUKX0pO3JldHVybiBIfTtOLnByb3RvdHlwZS5faXNEYXR1bU9uU2NyZWVuPWZ1bmN0aW9uKE8sSCxLLE0sTCxRKXt2YXIgVD1PLngoTSxMLFEpLFg9Ty55KE0sTCxRKSxhYT1PLndpZHRoKE0sTCxRKTtPPU8uaGVpZ2h0KE0sTCxRKTtyZXR1cm4gQy5NYXRoLmlzVmFsaWROdW1iZXIoVCkmJgpDLk1hdGguaXNWYWxpZE51bWJlcihYKSYmQy5NYXRoLmlzVmFsaWROdW1iZXIoYWEpJiZDLk1hdGguaXNWYWxpZE51bWJlcihPKT9DLk1hdGguYm91bmRzSW50ZXJzZWN0cyhULFgsYWEsTyxILEspOiExfTtyZXR1cm4gTn0oaC5YWVBsb3QpO0IuX0JBUl9USElDS05FU1NfUkFUSU89Ljk1O0IuX1NJTkdMRV9CQVJfRElNRU5TSU9OX1JBVElPPS40O0IuX0JBUl9BUkVBX0NMQVNTPSJiYXItYXJlYSI7Qi5fQkFSX0VORF9LRVk9ImJhckVuZCI7Qi5fQkFSX1RISUNLTkVTU19LRVk9IndpZHRoIjtCLl9MQUJFTF9BUkVBX0NMQVNTPSJiYXItbGFiZWwtdGV4dC1hcmVhIjtCLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUj0xMDtmLkJhcj1CfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHgsQSl7ZnVuY3Rpb24geSgpe3RoaXMuY29uc3RydWN0b3I9eH1mb3IodmFyIHcgaW4gQSlBLmhhc093blByb3BlcnR5KHcpJiYoeFt3XT1BW3ddKTt4LnByb3RvdHlwZT0KbnVsbD09PUE/T2JqZWN0LmNyZWF0ZShBKTooeS5wcm90b3R5cGU9QS5wcm90b3R5cGUsbmV3IHkpfSx0PWgoMSksbD1oKDUpLHA9aCg4KSxtPWgoMyksbj1oKDApO2Q9aCgxMCk7dmFyIHE9aCgyMik7Zi5UaW1lSW50ZXJ2YWw9ZC5tYWtlRW51bSgic2Vjb25kIG1pbnV0ZSBob3VyIGRheSB3ZWVrIG1vbnRoIHllYXIiLnNwbGl0KCIgIikpO2YuVGltZUF4aXNPcmllbnRhdGlvbj1kLm1ha2VFbnVtKFsidG9wIiwiYm90dG9tIl0pO2YuVGllckxhYmVsUG9zaXRpb249ZC5tYWtlRW51bShbImJldHdlZW4iLCJjZW50ZXIiXSk7aD1mdW5jdGlvbih4KXtmdW5jdGlvbiBBKHksdyl7eT14LmNhbGwodGhpcyx5LHcpfHx0aGlzO3kuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbj1udWxsO3kuX3RpZXJMYWJlbFBvc2l0aW9ucz1bXTt5LmFkZENsYXNzKCJ0aW1lLWF4aXMiKTt5LnRpY2tMYWJlbFBhZGRpbmcoNSk7eS5heGlzQ29uZmlndXJhdGlvbnMoQS5fREVGQVVMVF9USU1FX0FYSVNfQ09ORklHVVJBVElPTlMpOwp5LmFubm90YXRpb25Gb3JtYXR0ZXIocC50aW1lKCIlYSAlYiAlZCwgJVkiKSk7cmV0dXJuIHl9ayhBLHgpO0EucHJvdG90eXBlLnRpZXJMYWJlbFBvc2l0aW9ucz1mdW5jdGlvbih5KXtpZihudWxsPT15KXJldHVybiB0aGlzLl90aWVyTGFiZWxQb3NpdGlvbnM7aWYoIXkuZXZlcnkoZnVuY3Rpb24odyl7cmV0dXJuImJldHdlZW4iPT09dy50b0xvd2VyQ2FzZSgpfHwiY2VudGVyIj09PXcudG9Mb3dlckNhc2UoKX0pKXRocm93IEVycm9yKCJVbnN1cHBvcnRlZCBwb3NpdGlvbiBmb3IgdGllciBsYWJlbHMiKTt0aGlzLl90aWVyTGFiZWxQb3NpdGlvbnM9eTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtBLnByb3RvdHlwZS5tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb249ZnVuY3Rpb24oeSl7aWYobnVsbD09eSlyZXR1cm4gdGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uO3RoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbj15O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O0EucHJvdG90eXBlLmN1cnJlbnRBeGlzQ29uZmlndXJhdGlvbj0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXhdfTtBLnByb3RvdHlwZS5heGlzQ29uZmlndXJhdGlvbnM9ZnVuY3Rpb24oeSl7aWYobnVsbCE9eSl7dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zPXk7dGhpcy5fbnVtVGllcnM9bi5NYXRoLm1heCh0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubWFwKGZ1bmN0aW9uKEcpe3JldHVybiBHLmxlbmd0aH0pLDApO3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX3NldHVwRG9tRWxlbWVudHMoKTt5PXRoaXMudGllckxhYmVsUG9zaXRpb25zKCk7Zm9yKHZhciB3PVtdLEM9MDtDPHRoaXMuX251bVRpZXJzO0MrKyl3LnB1c2goeVtDXXx8ImJldHdlZW4iKTt0aGlzLnRpZXJMYWJlbFBvc2l0aW9ucyh3KTt0aGlzLnJlZHJhdygpfX07QS5wcm90b3R5cGUuX2dldE1vc3RQcmVjaXNlQ29uZmlndXJhdGlvbkluZGV4PQpmdW5jdGlvbigpe3ZhciB5PXRoaXMsdz10aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMubGVuZ3RoO3RoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKEMsRyl7Rzx3JiZDLmV2ZXJ5KGZ1bmN0aW9uKEQpe3JldHVybiB5Ll9jaGVja1RpbWVBeGlzVGllckNvbmZpZ3VyYXRpb24oRCl9KSYmKHc9Ryl9KTt3PT09dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLmxlbmd0aCYmKG4uV2luZG93Lndhcm4oInpvb21lZCBvdXQgdG9vIGZhcjogY291bGQgbm90IGZpbmQgc3VpdGFibGUgaW50ZXJ2YWwgdG8gZGlzcGxheSBsYWJlbHMiKSwtLXcpO3JldHVybiB3fTtBLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbih5KXtpZih5JiYoInJpZ2h0Ij09PXkudG9Mb3dlckNhc2UoKXx8ImxlZnQiPT09eS50b0xvd2VyQ2FzZSgpKSl0aHJvdyBFcnJvcih5KyIgaXMgbm90IGEgc3VwcG9ydGVkIG9yaWVudGF0aW9uIGZvciBUaW1lQXhpcyAtIG9ubHkgaG9yaXpvbnRhbCBvcmllbnRhdGlvbnMgYXJlIHN1cHBvcnRlZCIpOwpyZXR1cm4geC5wcm90b3R5cGUub3JpZW50YXRpb24uY2FsbCh0aGlzLHkpfTtBLnByb3RvdHlwZS5fY29tcHV0ZUhlaWdodD1mdW5jdGlvbigpe3ZhciB5PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQ7dGhpcy5fdGllckhlaWdodHM9W107Zm9yKHZhciB3PTA7dzx0aGlzLl9udW1UaWVyczt3KyspdGhpcy5fdGllckhlaWdodHMucHVzaCh5K3RoaXMudGlja0xhYmVsUGFkZGluZygpKygiYmV0d2VlbiI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbd10/MDp0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSkpO3JldHVybiB0LnN1bSh0aGlzLl90aWVySGVpZ2h0cyl9O0EucHJvdG90eXBlLl9nZXRJbnRlcnZhbExlbmd0aD1mdW5jdGlvbih5KXt2YXIgdz10aGlzLl9zY2FsZS5kb21haW4oKVswXTt5PW0uVGltZS50aW1lSW50ZXJ2YWxUb0QzVGltZSh5LmludGVydmFsKS5vZmZzZXQodyx5LnN0ZXApO3JldHVybiB5PnRoaXMuX3NjYWxlLmRvbWFpbigpWzFdP3RoaXMud2lkdGgoKToKTWF0aC5hYnModGhpcy5fc2NhbGUuc2NhbGUoeSktdGhpcy5fc2NhbGUuc2NhbGUodykpfTtBLnByb3RvdHlwZS5fbWF4V2lkdGhGb3JJbnRlcnZhbD1mdW5jdGlvbih5KXtyZXR1cm4gdGhpcy5fbWVhc3VyZXIubWVhc3VyZSh5LmZvcm1hdHRlcihBLl9MT05HX0RBVEUpKS53aWR0aH07QS5wcm90b3R5cGUuX2NoZWNrVGltZUF4aXNUaWVyQ29uZmlndXJhdGlvbj1mdW5jdGlvbih5KXtpZihudWxsIT10aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb24pe3ZhciB3PUEuX1NPUlRFRF9USU1FX0lOVEVSVkFMX0lOREVYW3RoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbl0sQz1BLl9TT1JURURfVElNRV9JTlRFUlZBTF9JTkRFWFt5LmludGVydmFsXTtpZihudWxsIT13JiZudWxsIT1DJiZDPHcpcmV0dXJuITF9dz10aGlzLl9tYXhXaWR0aEZvckludGVydmFsKHkpKzIqdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7cmV0dXJuIE1hdGgubWluKHRoaXMuX2dldEludGVydmFsTGVuZ3RoKHkpLAp0aGlzLndpZHRoKCkpPj13fTtBLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbih5LHcpe3ZhciBDPXgucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyLmNhbGwodGhpcyx5LHcpO3k9dGhpcy5fdGllckhlaWdodHMucmVkdWNlKGZ1bmN0aW9uKEcsRCl7cmV0dXJuIEcrRD5DLmhlaWdodD9HOkcrRH0pO3c9dGhpcy5tYXJnaW4oKSsodGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKT90aGlzLmFubm90YXRpb25UaWVyQ291bnQoKSp0aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpOjApO0MuaGVpZ2h0PU1hdGgubWluKEMuaGVpZ2h0LHkrdyk7cmV0dXJuIEN9O0EucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3gucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3NldHVwRG9tRWxlbWVudHMoKX07QS5wcm90b3R5cGUuX3NldHVwRG9tRWxlbWVudHM9ZnVuY3Rpb24oKXt0aGlzLmNvbnRlbnQoKS5zZWxlY3RBbGwoIi4iK0EuVElNRV9BWElTX1RJRVJfQ0xBU1MpLnJlbW92ZSgpOwp0aGlzLl90aWVyTGFiZWxDb250YWluZXJzPVtdO3RoaXMuX3RpZXJNYXJrQ29udGFpbmVycz1bXTt0aGlzLl90aWVyQmFzZWxpbmVzPVtdO3RoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5yZW1vdmUoKTt0aGlzLl9iYXNlbGluZS5yZW1vdmUoKTtmb3IodmFyIHk9MDt5PHRoaXMuX251bVRpZXJzOysreSl7dmFyIHc9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChBLlRJTUVfQVhJU19USUVSX0NMQVNTLCEwKTt0aGlzLl90aWVyTGFiZWxDb250YWluZXJzLnB1c2gody5hcHBlbmQoImciKS5jbGFzc2VkKHEuQXhpcy5USUNLX0xBQkVMX0NMQVNTKyItY29udGFpbmVyIiwhMCkpO3RoaXMuX3RpZXJNYXJrQ29udGFpbmVycy5wdXNoKHcuYXBwZW5kKCJnIikuY2xhc3NlZChxLkF4aXMuVElDS19NQVJLX0NMQVNTKyItY29udGFpbmVyIiwhMCkpO3RoaXMuX3RpZXJCYXNlbGluZXMucHVzaCh3LmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCkpfXk9bmV3IGwuU3ZnQ29udGV4dCh0aGlzLl90aWVyTGFiZWxDb250YWluZXJzWzBdLm5vZGUoKSk7CnRoaXMuX21lYXN1cmVyPW5ldyBsLkNhY2hlTWVhc3VyZXIoeSl9O0EucHJvdG90eXBlLl9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXM9ZnVuY3Rpb24oeSl7cmV0dXJuIHRoaXMuX3NjYWxlLnRpY2tJbnRlcnZhbCh5LmludGVydmFsLHkuc3RlcCl9O0EucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7dmFyIHk9dGhpcztyZXR1cm4gdGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXhdLnJlZHVjZShmdW5jdGlvbih3LEMpe3JldHVybiB3LmNvbmNhdCh5Ll9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXMoQykpfSxbXSl9O0EucHJvdG90eXBlLl9jbGVhblRpZXJzPWZ1bmN0aW9uKCl7Zm9yKHZhciB5PTA7eTx0aGlzLl90aWVyTGFiZWxDb250YWluZXJzLmxlbmd0aDt5KyspdGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1t5XS5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5yZW1vdmUoKSx0aGlzLl90aWVyTWFya0NvbnRhaW5lcnNbeV0uc2VsZWN0QWxsKCIuIisKcS5BeGlzLlRJQ0tfTUFSS19DTEFTUykucmVtb3ZlKCksdGhpcy5fdGllckJhc2VsaW5lc1t5XS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfTtBLnByb3RvdHlwZS5fZ2V0VGlja1ZhbHVlc0ZvckNvbmZpZ3VyYXRpb249ZnVuY3Rpb24oeSl7eT10aGlzLl9zY2FsZS50aWNrSW50ZXJ2YWwoeS5pbnRlcnZhbCx5LnN0ZXApO3ZhciB3PXRoaXMuX3NjYWxlLmRvbWFpbigpLEM9eS5tYXAoZnVuY3Rpb24oRyl7cmV0dXJuIEcudmFsdWVPZigpfSk7LTE9PT1DLmluZGV4T2Yod1swXS52YWx1ZU9mKCkpJiZ5LnVuc2hpZnQod1swXSk7LTE9PT1DLmluZGV4T2Yod1sxXS52YWx1ZU9mKCkpJiZ5LnB1c2god1sxXSk7cmV0dXJuIHl9O0EucHJvdG90eXBlLl9yZW5kZXJUaWVyTGFiZWxzPWZ1bmN0aW9uKHksdyxDKXt2YXIgRz10aGlzLEQ9dGhpcy5fZ2V0VGlja1ZhbHVlc0ZvckNvbmZpZ3VyYXRpb24odyksQj1bXTsiYmV0d2VlbiI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbQ10mJgoxPT09dy5zdGVwP0QubWFwKGZ1bmN0aW9uKEssTSl7TSsxPj1ELmxlbmd0aHx8Qi5wdXNoKG5ldyBEYXRlKChEW00rMV0udmFsdWVPZigpLURbTV0udmFsdWVPZigpKS8yK0RbTV0udmFsdWVPZigpKSl9KTpCPUQ7eT15LnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEoQixmdW5jdGlvbihLKXtyZXR1cm4gU3RyaW5nKEsudmFsdWVPZigpKX0pO3ZhciBJPXkuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKHEuQXhpcy5USUNLX0xBQkVMX0NMQVNTLCEwKTtJLmFwcGVuZCgidGV4dCIpO3ZhciBOPSJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW0NdfHwxPT09dy5zdGVwPzA6dGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7dmFyIE89ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/dC5zdW0odGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCxDKzEpKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKToiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tDXT8KdGhpcy5oZWlnaHQoKS10LnN1bSh0aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLEMpKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKS10aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKTp0aGlzLmhlaWdodCgpLXQuc3VtKHRoaXMuX3RpZXJIZWlnaHRzLnNsaWNlKDAsQykpLXRoaXMudGlja0xhYmVsUGFkZGluZygpO0k9eS5tZXJnZShJKTt2YXIgSD1JLnNlbGVjdEFsbCgidGV4dCIpOzA8SC5zaXplKCkmJkguYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTisiLCIrTysiKSIpO3kuZXhpdCgpLnJlbW92ZSgpO0kuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihLKXtyZXR1cm4idHJhbnNsYXRlKCIrRy5fc2NhbGUuc2NhbGUoSykrIiwwKSJ9KTtDPSJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW0NdfHwxPT09dy5zdGVwPyJtaWRkbGUiOiJzdGFydCI7SS5zZWxlY3RBbGwoInRleHQiKS50ZXh0KHcuZm9ybWF0dGVyKS5zdHlsZSgidGV4dC1hbmNob3IiLEMpfTtBLnByb3RvdHlwZS5fcmVuZGVyVGlja01hcmtzPQpmdW5jdGlvbih5LHcpe3k9dGhpcy5fdGllck1hcmtDb250YWluZXJzW3ddLnNlbGVjdEFsbCgiLiIrcS5BeGlzLlRJQ0tfTUFSS19DTEFTUykuZGF0YSh5KTt2YXIgQz15LmVudGVyKCkuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChxLkF4aXMuVElDS19NQVJLX0NMQVNTLCEwKS5tZXJnZSh5KSxHPXRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpLEQ9dGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCx3KS5yZWR1Y2UoZnVuY3Rpb24oQixJKXtyZXR1cm4gQitJfSwwKTsiYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT8oRy55MT1ELEcueTI9RCsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbd10/dGhpcy5pbm5lclRpY2tMZW5ndGgoKTp0aGlzLl90aWVySGVpZ2h0c1t3XSkpOihHLnkxPXRoaXMuaGVpZ2h0KCktRCxHLnkyPXRoaXMuaGVpZ2h0KCktKEQrKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3ddP3RoaXMuaW5uZXJUaWNrTGVuZ3RoKCk6CnRoaXMuX3RpZXJIZWlnaHRzW3ddKSkpO0MuYXR0cnMoRyk7ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/KEcueTE9RCxHLnkyPUQrKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW3ddP3RoaXMuZW5kVGlja0xlbmd0aCgpOnRoaXMuX3RpZXJIZWlnaHRzW3ddKSk6KEcueTE9dGhpcy5oZWlnaHQoKS1ELEcueTI9dGhpcy5oZWlnaHQoKS0oRCsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbd10/dGhpcy5lbmRUaWNrTGVuZ3RoKCk6dGhpcy5fdGllckhlaWdodHNbd10pKSk7dC5zZWxlY3QoQy5ub2RlcygpWzBdKS5hdHRycyhHKTt0LnNlbGVjdChDLm5vZGVzKClbQy5zaXplKCktMV0pLmF0dHJzKEcpO3Quc2VsZWN0KEMubm9kZXMoKVswXSkuY2xhc3NlZChxLkF4aXMuRU5EX1RJQ0tfTUFSS19DTEFTUywhMCk7dC5zZWxlY3QoQy5ub2RlcygpW0Muc2l6ZSgpLTFdKS5jbGFzc2VkKHEuQXhpcy5FTkRfVElDS19NQVJLX0NMQVNTLCEwKTt5LmV4aXQoKS5yZW1vdmUoKX07CkEucHJvdG90eXBlLl9yZW5kZXJMYWJlbGxlc3NUaWNrTWFya3M9ZnVuY3Rpb24oeSl7eT10aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX01BUktfQ0xBU1MpLmRhdGEoeSk7dmFyIHc9eS5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQocS5BeGlzLlRJQ0tfTUFSS19DTEFTUywhMCkubWVyZ2UoeSksQz10aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goKTtDLnkyPSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMudGlja0xhYmVsUGFkZGluZygpOnRoaXMuaGVpZ2h0KCktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7dy5hdHRycyhDKTt5LmV4aXQoKS5yZW1vdmUoKX07QS5wcm90b3R5cGUuX2dlbmVyYXRlTGFiZWxsZXNzVGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gMT50aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4P1tdOnRoaXMuX2dldFRpY2tJbnRlcnZhbFZhbHVlcyh0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleC0KMV1bMF0pfTtBLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB5PXRoaXM7dGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleD10aGlzLl9nZXRNb3N0UHJlY2lzZUNvbmZpZ3VyYXRpb25JbmRleCgpO3ZhciB3PXRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4XTt0aGlzLl9jbGVhblRpZXJzKCk7dy5mb3JFYWNoKGZ1bmN0aW9uKEksTil7cmV0dXJuIHkuX3JlbmRlclRpZXJMYWJlbHMoeS5fdGllckxhYmVsQ29udGFpbmVyc1tOXSxJLE4pfSk7Zm9yKHZhciBDPXcubWFwKGZ1bmN0aW9uKEkpe3JldHVybiB5Ll9nZXRUaWNrVmFsdWVzRm9yQ29uZmlndXJhdGlvbihJKX0pLEc9MCxEPTA7RDxNYXRoLm1heCh3Lmxlbmd0aCwxKTsrK0Qpe3ZhciBCPXRoaXMuX2dlbmVyYXRlQmFzZWxpbmVBdHRySGFzaCgpO0IueTErPSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP0c6LUc7Qi55Mj1CLnkxOwp0aGlzLl90aWVyQmFzZWxpbmVzW0RdLmF0dHJzKEIpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpO0crPXRoaXMuX3RpZXJIZWlnaHRzW0RdfUc9W107RD10aGlzLl9zY2FsZS5kb21haW4oKTtEPXRoaXMuX3NjYWxlLnNjYWxlKERbMV0pLXRoaXMuX3NjYWxlLnNjYWxlKERbMF0pOzEuNSp0aGlzLl9nZXRJbnRlcnZhbExlbmd0aCh3WzBdKT49RCYmKEc9dGhpcy5fZ2VuZXJhdGVMYWJlbGxlc3NUaWNrcygpKTt0aGlzLl9yZW5kZXJMYWJlbGxlc3NUaWNrTWFya3MoRyk7dGhpcy5faGlkZU92ZXJmbG93aW5nVGllcnMoKTtmb3IoRD0wO0Q8dy5sZW5ndGg7KytEKXRoaXMuX3JlbmRlclRpY2tNYXJrcyhDW0RdLEQpLHRoaXMuX2hpZGVPdmVybGFwcGluZ0FuZEN1dE9mZkxhYmVscyhEKTt0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpP3RoaXMuX2RyYXdBbm5vdGF0aW9ucygpOnRoaXMuX3JlbW92ZUFubm90YXRpb25zKCk7cmV0dXJuIHRoaXN9O0EucHJvdG90eXBlLl9oaWRlT3ZlcmZsb3dpbmdUaWVycz0KZnVuY3Rpb24oKXt2YXIgeT10aGlzLHc9dGhpcy5oZWlnaHQoKSxDPTA7dGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIitBLlRJTUVfQVhJU19USUVSX0NMQVNTKS5hdHRyKCJ2aXNpYmlsaXR5IixmdW5jdGlvbihHLEQpe0MrPXkuX3RpZXJIZWlnaHRzW0RdO3JldHVybiBDPD13PyJpbmhlcml0IjoiaGlkZGVuIn0pfTtBLnByb3RvdHlwZS5faGlkZU92ZXJsYXBwaW5nQW5kQ3V0T2ZmTGFiZWxzPWZ1bmN0aW9uKHkpe2Z1bmN0aW9uIHcoSSl7cmV0dXJuIE1hdGguZmxvb3IoRy5sZWZ0KTw9TWF0aC5jZWlsKEkubGVmdCkmJk1hdGguZmxvb3IoRy50b3ApPD1NYXRoLmNlaWwoSS50b3ApJiZNYXRoLmZsb29yKEkucmlnaHQpPD1NYXRoLmNlaWwoRy5sZWZ0K0Mud2lkdGgoKSkmJk1hdGguZmxvb3IoSS5ib3R0b20pPD1NYXRoLmNlaWwoRy50b3ArQy5oZWlnaHQoKSl9dmFyIEM9dGhpcyxHPXRoaXMuZWxlbWVudCgpLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxEPXRoaXMuX3RpZXJNYXJrQ29udGFpbmVyc1t5XS5zZWxlY3RBbGwoIi4iKwpxLkF4aXMuVElDS19NQVJLX0NMQVNTKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgST10LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpO3JldHVybiJ2aXNpYmxlIj09PUl8fCJpbmhlcml0Ij09PUl9KS5ub2RlcygpLm1hcChmdW5jdGlvbihJKXtyZXR1cm4gSS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0pLEI7dGhpcy5fdGllckxhYmVsQ29udGFpbmVyc1t5XS5zZWxlY3RBbGwoIi4iK3EuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgST10LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpO3JldHVybiJ2aXNpYmxlIj09PUl8fCJpbmhlcml0Ij09PUl9KS5lYWNoKGZ1bmN0aW9uKEksTil7ST10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBPPXQuc2VsZWN0KHRoaXMpLEg9RFtOXSxLPURbTisxXTtOPW51bGwhPUImJm4uRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChJLEIpO0g9bnVsbCE9SCYmbi5ET00uY2xpZW50UmVjdHNPdmVybGFwKEksCkgpO0s9bnVsbCE9SyYmbi5ET00uY2xpZW50UmVjdHNPdmVybGFwKEksSyk7IXcoSSl8fE58fEh8fEs/Ty5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpOihCPUksTy5zdHlsZSgidmlzaWJpbGl0eSIsImluaGVyaXQiKSl9KX07QS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7eC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIEF9KHEuQXhpcyk7aC5USU1FX0FYSVNfVElFUl9DTEFTUz0idGltZS1heGlzLXRpZXIiO2guX1NPUlRFRF9USU1FX0lOVEVSVkFMX0lOREVYPSh1PXt9LHVbZi5UaW1lSW50ZXJ2YWwuc2Vjb25kXT0wLHVbZi5UaW1lSW50ZXJ2YWwubWludXRlXT0xLHVbZi5UaW1lSW50ZXJ2YWwuaG91cl09Mix1W2YuVGltZUludGVydmFsLmRheV09Myx1W2YuVGltZUludGVydmFsLndlZWtdPTQsdVtmLlRpbWVJbnRlcnZhbC5tb250aF09NSx1W2YuVGltZUludGVydmFsLnllYXJdPQo2LHUpO2guX0RFRkFVTFRfVElNRV9BWElTX0NPTkZJR1VSQVRJT05TPVtbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjUsZm9ybWF0dGVyOnAudGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjEwLGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDoxNSwKZm9ybWF0dGVyOnAudGltZSgiJUk6JU06JVMgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjMwLGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDo1LGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sClt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MTAsZm9ybWF0dGVyOnAudGltZSgiJUk6JU0gJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjE1LGZvcm1hdHRlcjpwLnRpbWUoIiVJOiVNICVwIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDozMCxmb3JtYXR0ZXI6cC50aW1lKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUkgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSwKc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5ob3VyLHN0ZXA6Myxmb3JtYXR0ZXI6cC50aW1lKCIlSSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuaG91cixzdGVwOjYsZm9ybWF0dGVyOnAudGltZSgiJUkgJXAiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLmhvdXIsc3RlcDoxMixmb3JtYXR0ZXI6cC50aW1lKCIlSSAlcCIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlYSAlZSIpfSwKe2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlQiAlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVlIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJUIgJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVCIil9LHtpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJWIiKX0se2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6Myxmb3JtYXR0ZXI6cC50aW1lKCIlYiIpfSwKe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6Nixmb3JtYXR0ZXI6cC50aW1lKCIlYiIpfSx7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOnAudGltZSgiJXkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjUsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjI1LGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDo1MCxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sClt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEwMCxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV0sW3tpbnRlcnZhbDpmLlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MjAwLGZvcm1hdHRlcjpwLnRpbWUoIiVZIil9XSxbe2ludGVydmFsOmYuVGltZUludGVydmFsLnllYXIsc3RlcDo1MDAsZm9ybWF0dGVyOnAudGltZSgiJVkiKX1dLFt7aW50ZXJ2YWw6Zi5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjFFMyxmb3JtYXR0ZXI6cC50aW1lKCIlWSIpfV1dO2guX0xPTkdfREFURT1uZXcgRGF0ZSg5OTk5LDgsMjksMTIsNTksOTk5OSk7Zi5UaW1lPWg7dmFyIHV9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPQpwLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgxMik7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKCl7dmFyIG09bC5jYWxsKHRoaXMpfHx0aGlzO20uX2RldGFjaENhbGxiYWNrPWZ1bmN0aW9uKG4pe3JldHVybiBtLnJlbW92ZShuKX07cmV0dXJuIG19ayhwLGwpO3AucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbihtKXt2YXIgbj10aGlzO209dC5jb2VyY2VFeHRlcm5hbEQzKG0pO2wucHJvdG90eXBlLmFuY2hvci5jYWxsKHRoaXMsbSk7dGhpcy5fZm9yRWFjaChmdW5jdGlvbihxKXtyZXR1cm4gcS5hbmNob3Iobi5lbGVtZW50KCkpfSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3RoaXMuX2ZvckVhY2goZnVuY3Rpb24obSl7cmV0dXJuIG0ucmVuZGVyKCl9KTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoImhhcygpIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBDb21wb25lbnRDb250YWluZXIiKTt9O3AucHJvdG90eXBlLl9hZG9wdEFuZEFuY2hvcj0KZnVuY3Rpb24obSl7bS5wYXJlbnQodGhpcyk7bS5vbkRldGFjaCh0aGlzLl9kZXRhY2hDYWxsYmFjayk7dGhpcy5faXNBbmNob3JlZCYmbS5hbmNob3IodGhpcy5lbGVtZW50KCkpfTtwLnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24obSl7dGhpcy5oYXMobSkmJihtLm9mZkRldGFjaCh0aGlzLl9kZXRhY2hDYWxsYmFjayksdGhpcy5fcmVtb3ZlKG0pLG0uZGV0YWNoKCksdGhpcy5yZWRyYXcoKSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24oKXt9O3AucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIl9mb3JFYWNoKCkgaXMgbm90IGltcGxlbWVudGVkIG9uIENvbXBvbmVudENvbnRhaW5lciIpO307cC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2wucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTt0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uKG0pe3JldHVybiBtLmRlc3Ryb3koKX0pfTtwLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9CmZ1bmN0aW9uKCl7dGhpcy5fZm9yRWFjaChmdW5jdGlvbihtKXtyZXR1cm4gbS5pbnZhbGlkYXRlQ2FjaGUoKX0pfTtyZXR1cm4gcH0oaCg0KS5Db21wb25lbnQpO2YuQ29tcG9uZW50Q29udGFpbmVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKEEpe24uYWRkKEEpO20uYWRkKEEpO3QoKX1mdW5jdGlvbiB0KCl7cXx8KHE9ITAseC5yZW5kZXIoKSl9dmFyIGw9aCgwKTtkPWgoMTApO3ZhciBwPWgoMzkpLG09bmV3IGwuU2V0LG49bmV3IGwuU2V0LHE9ITEsdT0hMTtmLlBvbGljeT1kLm1ha2VFbnVtKFsiaW1tZWRpYXRlIiwiYW5pbWF0aW9uRnJhbWUiLCJ0aW1lb3V0Il0pO3ZhciB4PW5ldyBwLkFuaW1hdGlvbkZyYW1lO2YucmVuZGVyUG9saWN5PWZ1bmN0aW9uKEEpe2lmKG51bGw9PUEpcmV0dXJuIHg7c3dpdGNoKEEpe2Nhc2UgZi5Qb2xpY3kuaW1tZWRpYXRlOng9bmV3IHAuSW1tZWRpYXRlO2JyZWFrO2Nhc2UgZi5Qb2xpY3kuYW5pbWF0aW9uRnJhbWU6eD1uZXcgcC5BbmltYXRpb25GcmFtZTsKYnJlYWs7Y2FzZSBmLlBvbGljeS50aW1lb3V0Ong9bmV3IHAuVGltZW91dDticmVhaztkZWZhdWx0OmwuV2luZG93Lndhcm4oIlVucmVjb2duaXplZCByZW5kZXJQb2xpY3k6ICIrQSl9fTtmLnJlZ2lzdGVyVG9SZW5kZXI9ZnVuY3Rpb24oQSl7dSYmbC5XaW5kb3cud2FybigiUmVnaXN0ZXJlZCB0byByZW5kZXIgd2hpbGUgb3RoZXIgY29tcG9uZW50cyBhcmUgZmx1c2hpbmc6IHJlcXVlc3QgbWF5IGJlIGlnbm9yZWQiKTttLmFkZChBKTt0KCl9O2YucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXI9aztmLnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0PWZ1bmN0aW9uKEEpe2soQSl9O2YuZmx1c2g9ZnVuY3Rpb24oKXtpZihxKXtuLmZvckVhY2goZnVuY3Rpb24oeSl7cmV0dXJuIHkuY29tcHV0ZUxheW91dCgpfSk7bS5mb3JFYWNoKGZ1bmN0aW9uKHkpe3JldHVybiB5LnJlbmRlcigpfSk7dT0hMDt2YXIgQT1uZXcgbC5TZXQ7bS5mb3JFYWNoKGZ1bmN0aW9uKHkpe3RyeXt5LnJlbmRlckltbWVkaWF0ZWx5KCl9Y2F0Y2godyl7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyB3Owp9LDApLEEuYWRkKHkpfX0pO249bmV3IGwuU2V0O209QTt1PXE9ITF9fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMSk7Zi5jaXJjbGU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7cmV0dXJuIGsuc3ltYm9sKCkudHlwZShrLnN5bWJvbENpcmNsZSkuc2l6ZShNYXRoLlBJKk1hdGgucG93KGwvMiwyKSl9fTtmLnNxdWFyZT1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sU3F1YXJlKS5zaXplKE1hdGgucG93KGwsMikpfX07Zi5jcm9zcz1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sQ3Jvc3MpLnNpemUoNS85Kk1hdGgucG93KGwsMikpfX07Zi5kaWFtb25kPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3JldHVybiBrLnN5bWJvbCgpLnR5cGUoay5zeW1ib2xEaWFtb25kKS5zaXplKE1hdGgudGFuKE1hdGguUEkvNikqTWF0aC5wb3cobCwyKS8KMil9fTtmLnRyaWFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKGwpe3JldHVybiBrLnN5bWJvbCgpLnR5cGUoay5zeW1ib2xUcmlhbmdsZSkuc2l6ZShNYXRoLnNxcnQoMykqTWF0aC5wb3cobC8yLDIpKX19O2Yuc3Rhcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbihsKXtyZXR1cm4gay5zeW1ib2woKS50eXBlKGsuc3ltYm9sU3Rhcikuc2l6ZSguODkwODEzMDkxNTI5Mjg1MipNYXRoLnBvdyhsLzIsMikpfX07dmFyIHQ9MyooMS9NYXRoLnNxcnQoMTIpLzIrMSk7Zi53eWU9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obCl7cmV0dXJuIGsuc3ltYm9sKCkudHlwZShrLnN5bWJvbFd5ZSkuc2l6ZSh0Kk1hdGgucG93KGwvMi40LDIpKX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHggaW4gcSlxLmhhc093blByb3BlcnR5KHgpJiYoblt4XT0KcVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoMjUpLGw9aCgwKSxwPWgoMTIpLG09aCgzNyk7ZD1mdW5jdGlvbihuKXtmdW5jdGlvbiBxKCl7dmFyIHU9bi5jYWxsKHRoaXMpfHx0aGlzO3UuX2RldGVjdGlvblJhZGl1cz0zO3UuX3Jlc2l6YWJsZT0hMTt1Ll9tb3ZhYmxlPSExO3UuX2hhc0Nvcm5lcnM9ITA7dS5hZGRDbGFzcygiZHJhZy1ib3gtbGF5ZXIiKTt1Ll9kcmFnSW50ZXJhY3Rpb249bmV3IHQuRHJhZzt1Ll9zZXRVcENhbGxiYWNrcygpO3UuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh1KTt1Ll9kcmFnU3RhcnRDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7dS5fZHJhZ0NhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDt1Ll9kcmFnRW5kQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3JldHVybiB1fWsocSxuKTtxLnByb3RvdHlwZS5fc2V0VXBDYWxsYmFja3M9ZnVuY3Rpb24oKXtmdW5jdGlvbiB1KEksCk4pezA9PT1CJiZJLng9PT1OLngmJkkueT09PU4ueSYmeS5ib3hWaXNpYmxlKCExKTt5Ll9kcmFnRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeS5ib3VuZHMoKSl9ZnVuY3Rpb24geChJLE4pe3N3aXRjaChCKXtjYXNlIDA6Ry54PU4ueDtHLnk9Ti55O2JyZWFrO2Nhc2UgMTp3LmJvdHRvbT9HLnk9Ti55OncudG9wJiYoQy55PU4ueSk7dy5yaWdodD9HLng9Ti54OncubGVmdCYmKEMueD1OLngpO2JyZWFrO2Nhc2UgMjpJPU4ueC1ELng7dmFyIE89Ti55LUQueTtDLngrPUk7Qy55Kz1PO0cueCs9STtHLnkrPU87RD1OfXkuX3NldEJvdW5kcyh7dG9wTGVmdDpDLGJvdHRvbVJpZ2h0Okd9KTt5Ll94Qm91bmRzTW9kZT09PW0uUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT15LnhTY2FsZSgpJiZ5Ll9zZXRYRXh0ZW50KFt5LnhTY2FsZSgpLmludmVydChDLngpLHkueFNjYWxlKCkuaW52ZXJ0KEcueCldKTt5Ll95Qm91bmRzTW9kZT09PW0uUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT15LnlTY2FsZSgpJiYKeS5fc2V0WUV4dGVudChbeS55U2NhbGUoKS5pbnZlcnQoQy55KSx5LnlTY2FsZSgpLmludmVydChHLnkpXSk7eS5yZW5kZXIoKTt5Ll9kcmFnQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoeS5ib3VuZHMoKSl9ZnVuY3Rpb24gQShJKXt3PXkuX2dldFJlc2l6aW5nRWRnZXMoSSk7dmFyIE49eS5ib3VuZHMoKTtOPU4udG9wTGVmdC54PD1JLngmJkkueDw9Ti5ib3R0b21SaWdodC54JiZOLnRvcExlZnQueTw9SS55JiZJLnk8PU4uYm90dG9tUmlnaHQueTt5LmJveFZpc2libGUoKSYmKHcudG9wfHx3LmJvdHRvbXx8dy5sZWZ0fHx3LnJpZ2h0KT9CPTE6eS5ib3hWaXNpYmxlKCkmJnkubW92YWJsZSgpJiZOP0I9MjooQj0wLHkuX3NldEJvdW5kcyh7dG9wTGVmdDpJLGJvdHRvbVJpZ2h0Okl9KSx5Ll94Qm91bmRzTW9kZT09PW0uUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT15LnhTY2FsZSgpJiZ5Ll9zZXRYRXh0ZW50KFt5LnhTY2FsZSgpLmludmVydChJLngpLHkueFNjYWxlKCkuaW52ZXJ0KEkueCldKSwKeS5feUJvdW5kc01vZGU9PT1tLlByb3BlcnR5TW9kZS5WQUxVRSYmbnVsbCE9eS55U2NhbGUoKSYmeS5fc2V0WUV4dGVudChbeS55U2NhbGUoKS5pbnZlcnQoSS55KSx5LnlTY2FsZSgpLmludmVydChJLnkpXSkseS5yZW5kZXIoKSk7eS5ib3hWaXNpYmxlKCEwKTtOPXkuYm91bmRzKCk7Qz17eDpOLnRvcExlZnQueCx5Ok4udG9wTGVmdC55fTtHPXt4Ok4uYm90dG9tUmlnaHQueCx5Ok4uYm90dG9tUmlnaHQueX07RD1JO3kuX2RyYWdTdGFydENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKE4pfXZhciB5PXRoaXMsdyxDLEcsRCxCPTA7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ1N0YXJ0KEEpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcoeCk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZCh1KTt0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb249ZnVuY3Rpb24oKXt5Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ1N0YXJ0KEEpO3kuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnKHgpOwp5Ll9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ0VuZCh1KTt5Ll9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCl9fTtxLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtmdW5jdGlvbiB1KCl7cmV0dXJuIHguX2JveC5hcHBlbmQoImxpbmUiKS5zdHlsZXMoe29wYWNpdHk6MCxzdHJva2U6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVTdHJva2UifSl9dmFyIHg9dGhpcztuLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlVD11KCkuY2xhc3NlZCgiZHJhZy1lZGdlLXRiIiwhMCk7dGhpcy5fZGV0ZWN0aW9uRWRnZUI9dSgpLmNsYXNzZWQoImRyYWctZWRnZS10YiIsITApO3RoaXMuX2RldGVjdGlvbkVkZ2VMPXUoKS5jbGFzc2VkKCJkcmFnLWVkZ2UtbHIiLCEwKTt0aGlzLl9kZXRlY3Rpb25FZGdlUj11KCkuY2xhc3NlZCgiZHJhZy1lZGdlLWxyIiwhMCk7aWYodGhpcy5faGFzQ29ybmVycyl7dmFyIEE9ZnVuY3Rpb24oKXtyZXR1cm4geC5fYm94LmFwcGVuZCgiY2lyY2xlIikuc3R5bGVzKHtvcGFjaXR5OjAsCmZpbGw6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVGaWxsIn0pfTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJUTD1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItdGwiLCEwKTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUj1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItdHIiLCEwKTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJCTD1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItYmwiLCEwKTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJCUj1BKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItYnIiLCEwKX19O3EucHJvdG90eXBlLl9nZXRSZXNpemluZ0VkZ2VzPWZ1bmN0aW9uKHUpe3ZhciB4PXt0b3A6ITEsYm90dG9tOiExLGxlZnQ6ITEscmlnaHQ6ITF9O2lmKCF0aGlzLnJlc2l6YWJsZSgpKXJldHVybiB4O3ZhciBBPXRoaXMuYm91bmRzKCkseT1BLnRvcExlZnQueSx3PUEuYm90dG9tUmlnaHQueSxDPUEudG9wTGVmdC54O0E9QS5ib3R0b21SaWdodC54O3ZhciBHPXRoaXMuX2RldGVjdGlvblJhZGl1czsKQy1HPD11LngmJnUueDw9QStHJiYoeC50b3A9eS1HPD11LnkmJnUueTw9eStHLHguYm90dG9tPXctRzw9dS55JiZ1Lnk8PXcrRyk7eS1HPD11LnkmJnUueTw9dytHJiYoeC5sZWZ0PUMtRzw9dS54JiZ1Lng8PUMrRyx4LnJpZ2h0PUEtRzw9dS54JiZ1Lng8PUErRyk7cmV0dXJuIHh9O3EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTtpZih0aGlzLmJveFZpc2libGUoKSl7dmFyIHU9dGhpcy5ib3VuZHMoKSx4PXUudG9wTGVmdC55LEE9dS5ib3R0b21SaWdodC55LHk9dS50b3BMZWZ0Lng7dT11LmJvdHRvbVJpZ2h0Lng7dGhpcy5fZGV0ZWN0aW9uRWRnZVQuYXR0cnMoe3gxOnkseTE6eCx4Mjp1LHkyOngsInN0cm9rZS13aWR0aCI6Mip0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KTt0aGlzLl9kZXRlY3Rpb25FZGdlQi5hdHRycyh7eDE6eSx5MTpBLHgyOnUseTI6QSwic3Ryb2tlLXdpZHRoIjoyKgp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KTt0aGlzLl9kZXRlY3Rpb25FZGdlTC5hdHRycyh7eDE6eSx5MTp4LHgyOnkseTI6QSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pO3RoaXMuX2RldGVjdGlvbkVkZ2VSLmF0dHJzKHt4MTp1LHkxOngseDI6dSx5MjpBLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7dGhpcy5faGFzQ29ybmVycyYmKHRoaXMuX2RldGVjdGlvbkNvcm5lclRMLmF0dHJzKHtjeDp5LGN5Ongscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUi5hdHRycyh7Y3g6dSxjeTp4LHI6dGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksdGhpcy5fZGV0ZWN0aW9uQ29ybmVyQkwuYXR0cnMoe2N4OnksY3k6QSxyOnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkNvcm5lckJSLmF0dHJzKHtjeDp1LGN5OkEscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSl9cmV0dXJuIHRoaXN9OwpxLnByb3RvdHlwZS5kZXRlY3Rpb25SYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfTtxLnByb3RvdHlwZS5yZXNpemFibGU9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fcmVzaXphYmxlO3RoaXMuX3Jlc2l6YWJsZT11O3RoaXMuX3NldFJlc2l6YWJsZUNsYXNzZXModSk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLl9zZXRSZXNpemFibGVDbGFzc2VzPWZ1bmN0aW9uKHUpe3UmJnRoaXMuZW5hYmxlZCgpPyh0aGlzLmFkZENsYXNzKCJ4LXJlc2l6YWJsZSIpLHRoaXMuYWRkQ2xhc3MoInktcmVzaXphYmxlIikpOih0aGlzLnJlbW92ZUNsYXNzKCJ4LXJlc2l6YWJsZSIpLHRoaXMucmVtb3ZlQ2xhc3MoInktcmVzaXphYmxlIikpfTtxLnByb3RvdHlwZS5tb3ZhYmxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vdmFibGV9O3EucHJvdG90eXBlLl9zZXRNb3ZhYmxlQ2xhc3M9ZnVuY3Rpb24oKXt0aGlzLm1vdmFibGUoKSYmdGhpcy5lbmFibGVkKCk/CnRoaXMuYWRkQ2xhc3MoIm1vdmFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJtb3ZhYmxlIil9O3EucHJvdG90eXBlLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKHUpe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5hZGQodSl9O3EucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbih1KXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHUpfTtxLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24odSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5hZGQodSk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24odSl7dGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUodSl9O3EucHJvdG90eXBlLm9uRHJhZ0VuZD1mdW5jdGlvbih1KXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZCh1KX07cS5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbih1KXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZSh1KX07cS5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdJbnRlcmFjdGlvbn07CnEucHJvdG90eXBlLmVuYWJsZWQ9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQoKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZCh1KTt0aGlzLl9zZXRSZXNpemFibGVDbGFzc2VzKHRoaXMucmVzaXphYmxlKCkpO3RoaXMuX3NldE1vdmFibGVDbGFzcygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcztuLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24oeCl7cmV0dXJuIHUuX2RyYWdDYWxsYmFja3MuZGVsZXRlKHgpfSk7dGhpcy5fZHJhZ0NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHgpe3JldHVybiB1Ll9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh4KX0pO3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbih4KXtyZXR1cm4gdS5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUoeCl9KTsKdGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uKCl9O3EucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3RoaXMuX3Jlc2V0U3RhdGUoKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCk7bi5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyk7cmV0dXJuIHRoaXN9O3EucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbih1KXt1PXAuY29lcmNlRXh0ZXJuYWxEMyh1KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyk7bi5wcm90b3R5cGUuYW5jaG9yLmNhbGwodGhpcyx1KTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX3Jlc2V0U3RhdGU9ZnVuY3Rpb24oKXt0aGlzLmJvdW5kcyh7dG9wTGVmdDp7eDowLHk6MH0sYm90dG9tUmlnaHQ6e3g6MCx5OjB9fSl9O3JldHVybiBxfShoKDQzKS5TZWxlY3Rpb25Cb3hMYXllcik7Zi5EcmFnQm94TGF5ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPQpwfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDE4KTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXtyZXR1cm4gcC5jYWxsKHRoaXMsInBhdGgiLCJsaW5lIil8fHRoaXN9ayhtLHApO20ucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKG4pe24uc3R5bGUoImZpbGwiLCJub25lIil9O20ucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleC5jYWxsKHRoaXMsMCl9O3JldHVybiBtfShoKDkpLlNWR0RyYXdlcik7Zi5MaW5lU1ZHRHJhd2VyPWQ7dmFyIGw9WyJvcGFjaXR5Iiwic3Ryb2tlLW9wYWNpdHkiLCJzdHJva2Utd2lkdGgiLCJzdHJva2UiXTtmLm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXA9CmZ1bmN0aW9uKHApe3JldHVybiBmdW5jdGlvbihtLG4scSl7cT10LnJlc29sdmVBdHRyaWJ1dGVzKHEsbCxuWzBdLDApO3QucmVuZGVyTGluZShtLHAoKSxuWzBdLHEpfX19LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDE4KTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0obil7dm9pZCAwPT09biYmKG49IiIpO3ZhciBxPXAuY2FsbCh0aGlzLCJyZWN0IiwiIil8fHRoaXM7cS5fcm9vdENsYXNzTmFtZT1uO3EuX3Jvb3QuY2xhc3NlZChxLl9yb290Q2xhc3NOYW1lLCEwKTtyZXR1cm4gcX1rKG0scCk7cmV0dXJuIG19KGgoOSkuU1ZHRHJhd2VyKTtmLlJlY3RhbmdsZVNWR0RyYXdlcj0KZDt2YXIgbD1bIngiLCJ5Iiwid2lkdGgiLCJoZWlnaHQiXTtmLlJlY3RhbmdsZUNhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uKHAsbSxuKXtwLnNhdmUoKTttLmZvckVhY2goZnVuY3Rpb24ocSx1KXtudWxsIT1xJiYocT10LnJlc29sdmVBdHRyaWJ1dGVzU3Vic2V0V2l0aFN0eWxlcyhuLGwscSx1KSxwLmJlZ2luUGF0aCgpLHAucmVjdChxLngscS55LHEud2lkdGgscS5oZWlnaHQpLHQucmVuZGVyUGF0aFdpdGhTdHlsZShwLHEpKX0pO3AucmVzdG9yZSgpfTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0obil7cmV0dXJuIHAuY2FsbCh0aGlzLG4sZi5SZWN0YW5nbGVDYW52YXNEcmF3U3RlcCl8fHRoaXN9ayhtLHApO3JldHVybiBtfSh0LkNhbnZhc0RyYXdlcik7Zi5SZWN0YW5nbGVDYW52YXNEcmF3ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsocCl7bC5TSE9XX1dBUk5JTkdTJiZjb25zb2xlLndhcm4ocCl9ZnVuY3Rpb24gdChwLG0pe2Zvcih2YXIgbj1bXSxxPTI7cTxhcmd1bWVudHMubGVuZ3RoO3ErKyluW3EtCjJdPWFyZ3VtZW50c1txXTtyZXR1cm4gMD09PW0/KHAobiksLTEpOndpbmRvdy5zZXRUaW1lb3V0KHAsbSxuKX12YXIgbD1oKDIzKTtmLndhcm49aztmLnNldFRpbWVvdXQ9dDtmLmRlYm91bmNlPWZ1bmN0aW9uKHAsbSxuKXtmdW5jdGlvbiBxKCl7bS5hcHBseShuLHgpfXZhciB1PW51bGwseD1bXTtyZXR1cm4gZnVuY3Rpb24oKXt4PUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cyk7Y2xlYXJUaW1lb3V0KHUpO3U9dChxLHApfX07Zi5kZXByZWNhdGVkPWZ1bmN0aW9uKHAsbSxuKXt2b2lkIDA9PT1uJiYobj0iIik7aygiTWV0aG9kICIrcCsiIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gdmVyc2lvbiAiK20rIi4gUGxlYXNlIHJlZmVyIHRvIHRoZSByZWxlYXNlIG5vdGVzLiAiK24pfX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrKXt0aGlzLnJ1bGVyPW51bGwhPWsuY3JlYXRlUnVsZXI/ay5jcmVhdGVSdWxlcigpOmt9aC5wcm90b3R5cGUubWVhc3VyZT0KZnVuY3Rpb24oayl7dm9pZCAwPT09ayYmKGs9aC5IRUlHSFRfVEVYVCk7cmV0dXJuIHRoaXMucnVsZXIoayl9O3JldHVybiBofSgpO2QuSEVJR0hUX1RFWFQ9ImJkcHFsIjtmLkFic3RyYWN0TWVhc3VyZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9ayhoKDMyKSk7ayhoKDc0KSk7ayhoKDc1KSk7ayhoKDQxKSk7ayhoKDQyKSk7ayhoKDc2KSk7ayhoKDc3KSk7ayhoKDc4KSk7ayhoKDc5KSk7ayhoKDQzKSk7ayhoKDgwKSk7ayhoKDgxKSk7ayhoKDgyKSl9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDApO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KGwscCl7dm9pZCAwPT09bCYmKGw9W10pO3ZvaWQgMD09PXAmJihwPXt9KTt0aGlzLl91cGRhdGVJZD0wO3RoaXMuX2RhdGE9bDt0aGlzLl9tZXRhZGF0YT1wO3RoaXMuX2NhbGxiYWNrcz1uZXcgay5DYWxsYmFja1NldH10LnByb3RvdHlwZS5vblVwZGF0ZT0KZnVuY3Rpb24obCl7dGhpcy5fY2FsbGJhY2tzLmFkZChsKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUub2ZmVXBkYXRlPWZ1bmN0aW9uKGwpe3RoaXMuX2NhbGxiYWNrcy5kZWxldGUobCk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLmRhdGE9ZnVuY3Rpb24obCl7aWYobnVsbD09bClyZXR1cm4gdGhpcy5fZGF0YTt0aGlzLl9kYXRhPWw7dGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTtyZXR1cm4gdGhpc307dC5wcm90b3R5cGUubWV0YWRhdGE9ZnVuY3Rpb24obCl7aWYobnVsbD09bClyZXR1cm4gdGhpcy5fbWV0YWRhdGE7dGhpcy5fbWV0YWRhdGE9bDt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTt0LnByb3RvdHlwZS51cGRhdGVJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVJZH07dC5wcm90b3R5cGUuX2Rpc3BhdGNoVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWQrKzt0aGlzLl9jYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKX07cmV0dXJuIHR9KCk7CmYuRGF0YXNldD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgwKSx0PWgoMzApO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7fWwucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3QuZmx1c2goKX07cmV0dXJuIGx9KCk7Zi5JbW1lZGlhdGU9ZDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe31sLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtrLkRPTS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbCh0LmZsdXNoKX07cmV0dXJuIGx9KCk7Zi5BbmltYXRpb25GcmFtZT1kO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7dGhpcy5fdGltZW91dE1zZWM9ay5ET00uU0NSRUVOX1JFRlJFU0hfUkFURV9NSUxMSVNFQ09ORFN9bC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7c2V0VGltZW91dCh0LmZsdXNoLHRoaXMuX3RpbWVvdXRNc2VjKX07cmV0dXJuIGx9KCk7Zi5UaW1lb3V0PWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCwKbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxMyksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3ZhciBuPW51bGwhPT1wJiZwLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztuLl9rZXlQcmVzc0NhbGxiYWNrcz17fTtuLl9rZXlSZWxlYXNlQ2FsbGJhY2tzPXt9O24uX21vdXNlTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7cmV0dXJuITF9O24uX2Rvd25lZEtleXM9bmV3IGwuU2V0O24uX2tleURvd25DYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVLZXlEb3duRXZlbnQocSx1KX07bi5fa2V5VXBDYWxsYmFjaz1mdW5jdGlvbihxKXtyZXR1cm4gbi5faGFuZGxlS2V5VXBFdmVudChxKX07cmV0dXJuIG59ayhtLHApOwptLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKG4pe3AucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLG4pO3RoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlcj10Lk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl9rZXlEaXNwYXRjaGVyPXQuS2V5LmdldERpc3BhdGNoZXIoKTt0aGlzLl9rZXlEaXNwYXRjaGVyLm9uS2V5RG93bih0aGlzLl9rZXlEb3duQ2FsbGJhY2spO3RoaXMuX2tleURpc3BhdGNoZXIub25LZXlVcCh0aGlzLl9rZXlVcENhbGxiYWNrKX07bS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyPW51bGw7CnRoaXMuX2tleURpc3BhdGNoZXIub2ZmS2V5RG93bih0aGlzLl9rZXlEb3duQ2FsbGJhY2spO3RoaXMuX2tleURpc3BhdGNoZXIub2ZmS2V5VXAodGhpcy5fa2V5VXBDYWxsYmFjayk7dGhpcy5fa2V5RGlzcGF0Y2hlcj1udWxsfTttLnByb3RvdHlwZS5faGFuZGxlS2V5RG93bkV2ZW50PWZ1bmN0aW9uKG4scSl7dmFyIHU9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZSh0aGlzLl9wb3NpdGlvbkRpc3BhdGNoZXIubGFzdE1vdXNlUG9zaXRpb24oKSk7dGhpcy5faXNJbnNpZGVDb21wb25lbnQodSkmJiFxLnJlcGVhdCYmKHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dJiZ0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXS5jYWxsQ2FsbGJhY2tzKG4pLHRoaXMuX2Rvd25lZEtleXMuYWRkKG4pKX07bS5wcm90b3R5cGUuX2hhbmRsZUtleVVwRXZlbnQ9ZnVuY3Rpb24obil7dGhpcy5fZG93bmVkS2V5cy5oYXMobikmJnRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl0mJnRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl0uY2FsbENhbGxiYWNrcyhuKTsKdGhpcy5fZG93bmVkS2V5cy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uS2V5UHJlc3M9ZnVuY3Rpb24obixxKXt0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXXx8KHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW25dPW5ldyBsLkNhbGxiYWNrU2V0KTt0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXS5hZGQocSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9mZktleVByZXNzPWZ1bmN0aW9uKG4scSl7dGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nbbl0uZGVsZXRlKHEpOzA9PT10aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1tuXS5zaXplJiZkZWxldGUgdGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nbbl07cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uS2V5UmVsZWFzZT1mdW5jdGlvbihuLHEpe3RoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nbbl18fCh0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dPW5ldyBsLkNhbGxiYWNrU2V0KTt0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dLmFkZChxKTtyZXR1cm4gdGhpc307Cm0ucHJvdG90eXBlLm9mZktleVJlbGVhc2U9ZnVuY3Rpb24obixxKXt0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW25dLmRlbGV0ZShxKTswPT09dGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXS5zaXplJiZkZWxldGUgdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1tuXTtyZXR1cm4gdGhpc307cmV0dXJuIG19KGgoMTUpLkludGVyYWN0aW9uKTtmLktleT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgwKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSl7dm9pZCAwPT09bSYmKG09W10pO3ZhciBuPWwuY2FsbCh0aGlzKXx8dGhpcztuLl9jb21wb25lbnRzPQpbXTtuLmFkZENsYXNzKCJjb21wb25lbnQtZ3JvdXAiKTttLmZvckVhY2goZnVuY3Rpb24ocSl7cmV0dXJuIG4uYXBwZW5kKHEpfSk7cmV0dXJuIG59ayhwLGwpO3AucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKG0pe3RoaXMuY29tcG9uZW50cygpLmZvckVhY2gobSl9O3AucHJvdG90eXBlLmhhcz1mdW5jdGlvbihtKXtyZXR1cm4gMDw9dGhpcy5fY29tcG9uZW50cy5pbmRleE9mKG0pfTtwLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbihtLG4pe3ZhciBxPXRoaXMuX2NvbXBvbmVudHMubWFwKGZ1bmN0aW9uKHUpe3JldHVybiB1LnJlcXVlc3RlZFNwYWNlKG0sbil9KTtyZXR1cm57bWluV2lkdGg6dC5NYXRoLm1heChxLGZ1bmN0aW9uKHUpe3JldHVybiB1Lm1pbldpZHRofSwwKSxtaW5IZWlnaHQ6dC5NYXRoLm1heChxLGZ1bmN0aW9uKHUpe3JldHVybiB1Lm1pbkhlaWdodH0sMCl9fTtwLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKG0sbixxKXt2YXIgdT0KdGhpcztsLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxtLG4scSk7dGhpcy5fZm9yRWFjaChmdW5jdGlvbih4KXt4LmNvbXB1dGVMYXlvdXQoe3g6MCx5OjB9LHUud2lkdGgoKSx1LmhlaWdodCgpKX0pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlcj1mdW5jdGlvbihtLG4pe3JldHVybnt3aWR0aDptLGhlaWdodDpufX07cC5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLmV2ZXJ5KGZ1bmN0aW9uKG0pe3JldHVybiBtLmZpeGVkV2lkdGgoKX0pfTtwLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLmV2ZXJ5KGZ1bmN0aW9uKG0pe3JldHVybiBtLmZpeGVkSGVpZ2h0KCl9KX07cC5wcm90b3R5cGUuY29tcG9uZW50cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLnNsaWNlKCl9O3AucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihtKXtudWxsPT0KbXx8dGhpcy5oYXMobSl8fChtLmRldGFjaCgpLHRoaXMuX2NvbXBvbmVudHMucHVzaChtKSx0aGlzLl9hZG9wdEFuZEFuY2hvcihtKSx0aGlzLnJlZHJhdygpKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbihtKXttPXRoaXMuX2NvbXBvbmVudHMuaW5kZXhPZihtKTswPD1tJiZ0aGlzLl9jb21wb25lbnRzLnNwbGljZShtLDEpfTtyZXR1cm4gcH0oaCgyOSkuQ29tcG9uZW50Q29udGFpbmVyKTtmLkdyb3VwPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX07aCgwKTtkPWgoNCk7dmFyIHQ7KGZ1bmN0aW9uKGwpe2xbbC5WQUxVRT0wXT0KIlZBTFVFIjtsW2wuUElYRUw9MV09IlBJWEVMIn0pKHR8fCh0PXt9KSk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0pe3ZhciBuPWwuY2FsbCh0aGlzKXx8dGhpcztuLl9tb2RlPXQuVkFMVUU7aWYobSE9PXAuT1JJRU5UQVRJT05fVkVSVElDQUwmJm0hPT1wLk9SSUVOVEFUSU9OX0hPUklaT05UQUwpdGhyb3cgRXJyb3IobSsiIGlzIG5vdCBhIHZhbGlkIG9yaWVudGF0aW9uIGZvciBHdWlkZUxpbmVMYXllciIpO24uX29yaWVudGF0aW9uPW07bi5fb3ZlcmZsb3dIaWRkZW49ITA7bi5hZGRDbGFzcygiZ3VpZGUtbGluZS1sYXllciIpO24uX2lzVmVydGljYWwoKT9uLmFkZENsYXNzKCJ2ZXJ0aWNhbCIpOm4uYWRkQ2xhc3MoImhvcml6b250YWwiKTtuLl9zY2FsZVVwZGF0ZUNhbGxiYWNrPWZ1bmN0aW9uKCl7bi5fc3luY1BpeGVsUG9zaXRpb25BbmRWYWx1ZSgpO24ucmVuZGVyKCl9O3JldHVybiBufWsocCxsKTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5fZ3VpZGVMaW5lPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImd1aWRlLWxpbmUiLCEwKX07cC5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24obSxuKXtyZXR1cm57d2lkdGg6bSxoZWlnaHQ6bn19O3AucHJvdG90eXBlLl9pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9uPT09cC5PUklFTlRBVElPTl9WRVJUSUNBTH07cC5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiEwfTtwLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiEwfTtwLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKG0sbixxKXtsLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxtLG4scSk7bnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMuc2NhbGUoKS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTp0aGlzLnNjYWxlKCkucmFuZ2UoW3RoaXMuaGVpZ2h0KCksCjBdKSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7dGhpcy5fZ3VpZGVMaW5lLmF0dHJzKHt4MTp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6MCx5MTp0aGlzLl9pc1ZlcnRpY2FsKCk/MDp0aGlzLnBpeGVsUG9zaXRpb24oKSx4Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6dGhpcy53aWR0aCgpLHkyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLmhlaWdodCgpOnRoaXMucGl4ZWxQb3NpdGlvbigpfSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlPWZ1bmN0aW9uKCl7bnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5fbW9kZT09PXQuVkFMVUUmJm51bGwhPXRoaXMudmFsdWUoKT90aGlzLl9waXhlbFBvc2l0aW9uPQp0aGlzLnNjYWxlKCkuc2NhbGUodGhpcy52YWx1ZSgpKTp0aGlzLl9tb2RlPT09dC5QSVhFTCYmbnVsbCE9dGhpcy5waXhlbFBvc2l0aW9uKCkmJih0aGlzLl92YWx1ZT10aGlzLnNjYWxlKCkuaW52ZXJ0KHRoaXMucGl4ZWxQb3NpdGlvbigpKSkpfTtwLnByb3RvdHlwZS5fc2V0UGl4ZWxQb3NpdGlvbldpdGhvdXRDaGFuZ2luZ01vZGU9ZnVuY3Rpb24obSl7dGhpcy5fcGl4ZWxQb3NpdGlvbj1tO251bGwhPXRoaXMuc2NhbGUoKSYmKHRoaXMuX3ZhbHVlPXRoaXMuc2NhbGUoKS5pbnZlcnQodGhpcy5waXhlbFBvc2l0aW9uKCkpKTt0aGlzLnJlbmRlcigpfTtwLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9zY2FsZTt2YXIgbj10aGlzLl9zY2FsZTtudWxsIT1uJiZuLm9mZlVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKTt0aGlzLl9zY2FsZT1tO3RoaXMuX3NjYWxlLm9uVXBkYXRlKHRoaXMuX3NjYWxlVXBkYXRlQ2FsbGJhY2spOwp0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUudmFsdWU9ZnVuY3Rpb24obSl7aWYobnVsbD09bSlyZXR1cm4gdGhpcy5fdmFsdWU7dGhpcy5fdmFsdWU9bTt0aGlzLl9tb2RlPXQuVkFMVUU7dGhpcy5fc3luY1BpeGVsUG9zaXRpb25BbmRWYWx1ZSgpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnBpeGVsUG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGl4ZWxQb3NpdGlvbn07cC5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe2wucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTtudWxsIT10aGlzLnNjYWxlKCkmJnRoaXMuc2NhbGUoKS5vZmZVcGRhdGUodGhpcy5fc2NhbGVVcGRhdGVDYWxsYmFjayl9O3JldHVybiBwfShkLkNvbXBvbmVudCk7ZC5PUklFTlRBVElPTl9WRVJUSUNBTD0idmVydGljYWwiO2QuT1JJRU5UQVRJT05fSE9SSVpPTlRBTD0iaG9yaXpvbnRhbCI7CmYuR3VpZGVMaW5lTGF5ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMCk7ZD1oKDQpO3ZhciBsOyhmdW5jdGlvbihwKXtwW3AuVkFMVUU9MF09IlZBTFVFIjtwW3AuUElYRUw9MV09IlBJWEVMIn0pKGw9Zi5Qcm9wZXJ0eU1vZGV8fChmLlByb3BlcnR5TW9kZT17fSkpO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3ZhciBuPXAuY2FsbCh0aGlzKXx8dGhpcztuLl9ib3hWaXNpYmxlPSExO24uX2JveEJvdW5kcz17dG9wTGVmdDp7eDowLHk6MH0sYm90dG9tUmlnaHQ6e3g6MCx5OjB9fTtuLl94Qm91bmRzTW9kZT1sLlBJWEVMO24uX3lCb3VuZHNNb2RlPQpsLlBJWEVMO24uYWRkQ2xhc3MoInNlbGVjdGlvbi1ib3gtbGF5ZXIiKTtuLl9hZGp1c3RCb3VuZHNDYWxsYmFjaz1mdW5jdGlvbigpe24ucmVuZGVyKCl9O24uX292ZXJmbG93SGlkZGVuPSEwO24uX3hFeHRlbnQ9W3ZvaWQgMCx2b2lkIDBdO24uX3lFeHRlbnQ9W3ZvaWQgMCx2b2lkIDBdO3JldHVybiBufWsobSxwKTttLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtwLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9ib3g9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgic2VsZWN0aW9uLWJveCIsITApLnJlbW92ZSgpO3RoaXMuX2JveEFyZWE9dGhpcy5fYm94LmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInNlbGVjdGlvbi1hcmVhIiwhMCl9O20ucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKG4scSl7cmV0dXJue3dpZHRoOm4saGVpZ2h0OnF9fTttLnByb3RvdHlwZS5ib3VuZHM9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fZ2V0Qm91bmRzKCk7CnRoaXMuX3NldEJvdW5kcyhuKTt0aGlzLl95Qm91bmRzTW9kZT10aGlzLl94Qm91bmRzTW9kZT1sLlBJWEVMO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLl9zZXRCb3VuZHM9ZnVuY3Rpb24obil7dGhpcy5fYm94Qm91bmRzPXt0b3BMZWZ0Ont4Ok1hdGgubWluKG4udG9wTGVmdC54LG4uYm90dG9tUmlnaHQueCkseTpNYXRoLm1pbihuLnRvcExlZnQueSxuLmJvdHRvbVJpZ2h0LnkpfSxib3R0b21SaWdodDp7eDpNYXRoLm1heChuLnRvcExlZnQueCxuLmJvdHRvbVJpZ2h0LngpLHk6TWF0aC5tYXgobi50b3BMZWZ0Lnksbi5ib3R0b21SaWdodC55KX19fTttLnByb3RvdHlwZS5fZ2V0Qm91bmRzPWZ1bmN0aW9uKCl7cmV0dXJue3RvcExlZnQ6e3g6dGhpcy5feEJvdW5kc01vZGU9PT1sLlBJWEVMP3RoaXMuX2JveEJvdW5kcy50b3BMZWZ0Lng6bnVsbD09dGhpcy5feFNjYWxlPzA6TWF0aC5taW4odGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVswXSksCnRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMV0pKSx5OnRoaXMuX3lCb3VuZHNNb2RlPT09bC5QSVhFTD90aGlzLl9ib3hCb3VuZHMudG9wTGVmdC55Om51bGw9PXRoaXMuX3lTY2FsZT8wOk1hdGgubWluKHRoaXMueVNjYWxlKCkuc2NhbGUodGhpcy55RXh0ZW50KClbMF0pLHRoaXMueVNjYWxlKCkuc2NhbGUodGhpcy55RXh0ZW50KClbMV0pKX0sYm90dG9tUmlnaHQ6e3g6dGhpcy5feEJvdW5kc01vZGU9PT1sLlBJWEVMP3RoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC54Om51bGw9PXRoaXMuX3hTY2FsZT8wOk1hdGgubWF4KHRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMF0pLHRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMV0pKSx5OnRoaXMuX3lCb3VuZHNNb2RlPT09bC5QSVhFTD90aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueTpudWxsPT10aGlzLl95U2NhbGU/MDpNYXRoLm1heCh0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzBdKSwKdGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVsxXSkpfX19O20ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTtpZih0aGlzLl9ib3hWaXNpYmxlKXt2YXIgbj10aGlzLmJvdW5kcygpLHE9bi50b3BMZWZ0LnksdT1uLmJvdHRvbVJpZ2h0LnkseD1uLnRvcExlZnQueDtuPW4uYm90dG9tUmlnaHQueDtpZighKHQuTWF0aC5pc1ZhbGlkTnVtYmVyKHEpJiZ0Lk1hdGguaXNWYWxpZE51bWJlcih1KSYmdC5NYXRoLmlzVmFsaWROdW1iZXIoeCkmJnQuTWF0aC5pc1ZhbGlkTnVtYmVyKG4pKSl0aHJvdyBFcnJvcigiYm91bmRzIGhhdmUgbm90IGJlZW4gcHJvcGVybHkgc2V0Iik7dGhpcy5fYm94QXJlYS5hdHRycyh7eCx5OnEsd2lkdGg6bi14LGhlaWdodDp1LXF9KTt0aGlzLmNvbnRlbnQoKS5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fYm94Lm5vZGUoKSl9ZWxzZSB0aGlzLl9ib3gucmVtb3ZlKCk7CnJldHVybiB0aGlzfTttLnByb3RvdHlwZS5ib3hWaXNpYmxlPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2JveFZpc2libGU7dGhpcy5fYm94VmlzaWJsZT1uO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH07bS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07bS5wcm90b3R5cGUueFNjYWxlPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX3hTY2FsZTtudWxsIT10aGlzLl94U2NhbGUmJnRoaXMuX3hTY2FsZS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spO3RoaXMuX3hTY2FsZT1uO3RoaXMuX3hCb3VuZHNNb2RlPWwuVkFMVUU7dGhpcy5feFNjYWxlLm9uVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS55U2NhbGU9ZnVuY3Rpb24obil7aWYobnVsbD09Cm4pcmV0dXJuIHRoaXMuX3lTY2FsZTtudWxsIT10aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spO3RoaXMuX3lTY2FsZT1uO3RoaXMuX3lCb3VuZHNNb2RlPWwuVkFMVUU7dGhpcy5feVNjYWxlLm9uVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS54RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFhFeHRlbnQoKX07bS5wcm90b3R5cGUuX2dldFhFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feEJvdW5kc01vZGU9PT1sLlZBTFVFP3RoaXMuX3hFeHRlbnQ6bnVsbD09dGhpcy5feFNjYWxlP1t2b2lkIDAsdm9pZCAwXTpbdGhpcy5feFNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMudG9wTGVmdC54KSx0aGlzLl94U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC54KV19O20ucHJvdG90eXBlLl9zZXRYRXh0ZW50PQpmdW5jdGlvbihuKXt0aGlzLl94RXh0ZW50PW59O20ucHJvdG90eXBlLnlFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0WUV4dGVudCgpfTttLnByb3RvdHlwZS5fZ2V0WUV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl95Qm91bmRzTW9kZT09PWwuVkFMVUU/dGhpcy5feUV4dGVudDpudWxsPT10aGlzLl95U2NhbGU/W3ZvaWQgMCx2b2lkIDBdOlt0aGlzLl95U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy50b3BMZWZ0LnkpLHRoaXMuX3lTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0LnkpXX07bS5wcm90b3R5cGUuX3NldFlFeHRlbnQ9ZnVuY3Rpb24obil7dGhpcy5feUV4dGVudD1ufTttLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO251bGwhPXRoaXMuX3hTY2FsZSYmdGhpcy54U2NhbGUoKS5vZmZVcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spO251bGwhPXRoaXMuX3lTY2FsZSYmCnRoaXMueVNjYWxlKCkub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKX07cmV0dXJuIG19KGQuQ29tcG9uZW50KTtmLlNlbGVjdGlvbkJveExheWVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odCxsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJih0W21dPWxbbV0pO3QucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBsKCl7cmV0dXJuIHQuY2FsbCh0aGlzLCJwYXRoIiwiYXJjIGZpbGwiKXx8dGhpc31rKGwsdCk7bC5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24ocCl7cC5zdHlsZSgic3Ryb2tlIiwibm9uZSIpfTtyZXR1cm4gbH0oaCg5KS5TVkdEcmF3ZXIpO2YuQXJjU1ZHRHJhd2VyPQpkfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3JldHVybiB0LmNhbGwodGhpcywicGF0aCIsImFyYyBvdXRsaW5lIil8fHRoaXN9ayhsLHQpO2wucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHApe3Auc3R5bGUoImZpbGwiLCJub25lIil9O3JldHVybiBsfShoKDkpLlNWR0RyYXdlcik7Zi5BcmNPdXRsaW5lU1ZHRHJhd2VyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxOCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7cmV0dXJuIHAuY2FsbCh0aGlzLCJwYXRoIiwiYXJlYSIpfHx0aGlzfWsobSxwKTttLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcz1mdW5jdGlvbihuKXtuLnN0eWxlKCJzdHJva2UiLCJub25lIil9O20ucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleC5jYWxsKHRoaXMsMCl9O3JldHVybiBtfShoKDkpLlNWR0RyYXdlcik7Zi5BcmVhU1ZHRHJhd2VyPWQ7dmFyIGw9WyJmaWxsIiwib3BhY2l0eSIsImZpbGwtb3BhY2l0eSJdO2YubWFrZUFyZWFDYW52YXNEcmF3U3RlcD1mdW5jdGlvbihwKXtyZXR1cm4gZnVuY3Rpb24obSwKbixxKXtxPXQucmVzb2x2ZUF0dHJpYnV0ZXMocSxsLG5bMF0sMCk7dC5yZW5kZXJBcmVhKG0scCgpLG5bMF0scSl9fX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih0LGwpe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciBtIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShtKSYmKHRbbV09bFttXSk7dC5wcm90b3R5cGU9bnVsbD09PWw/T2JqZWN0LmNyZWF0ZShsKToocC5wcm90b3R5cGU9bC5wcm90b3R5cGUsbmV3IHApfTtkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGwoKXtyZXR1cm4gdC5jYWxsKHRoaXMsImxpbmUiLCIiKXx8dGhpc31rKGwsdCk7cmV0dXJuIGx9KGgoOSkuU1ZHRHJhd2VyKTtmLlNlZ21lbnRTVkdEcmF3ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsobixxLHUseCxBKXtyZXR1cm4gMDw9dStBJiZ1LUE8PW4mJjA8PXgrQSYmeC1BPD1xfWZ1bmN0aW9uIHQobixxLHUpe2lmKG51bGw9PW4pcmV0dXJuITE7CmZvcih2YXIgeD0wO3g8dS5sZW5ndGg7eCsrKXt2YXIgQT11W3hdO2lmKG5bQV0hPXFbQV0pcmV0dXJuITF9cmV0dXJuITB9dmFyIGw9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSgpe3RoaXMuY29uc3RydWN0b3I9bn1mb3IodmFyIHggaW4gcSlxLmhhc093blByb3BlcnR5KHgpJiYoblt4XT1xW3hdKTtuLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOih1LnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgdSl9LHA9aCg4NiksbT1oKDE4KTtkPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEoKXtyZXR1cm4gbi5jYWxsKHRoaXMsInBhdGgiLCJzeW1ib2wiKXx8dGhpc31sKHEsbik7cmV0dXJuIHF9KGgoOSkuU1ZHRHJhd2VyKTtmLlN5bWJvbFNWR0RyYXdlcj1kO2YubWFrZVN5bWJvbENhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uKG4scSx1KXt2YXIgeD10aGlzO3JldHVybiBmdW5jdGlvbihBLHksdyl7dmFyIEM9QS5jYW52YXMsRz1DLmNsaWVudFdpZHRoOwpDPUMuY2xpZW50SGVpZ2h0O2Zvcih2YXIgRD1uZXcgcC5DYW52YXNCdWZmZXIoMCwwKSxCPXEoKSxJPXUoKSxOPW51bGwsTz1udWxsLEg9bnVsbCxLPTA7Szx5Lmxlbmd0aDtLKyspe3ZhciBNPXlbS107aWYobnVsbCE9TSl7dmFyIEw9bS5yZXNvbHZlQXR0cmlidXRlc1N1YnNldFdpdGhTdHlsZXModyxbIngiLCJ5Il0sTSxLKSxRPUkoTSxLLG4pO2lmKGsoRyxDLEwueCxMLnksUSkpe3ZhciBUPXQoTixMLG0uQ29udGV4dFN0eWxlQXR0cnMpO009QihNLEsseC5fZGF0YXNldCk7VCYmSD09USYmTz09TXx8KE49bS5nZXRTdHJva2VXaWR0aChMKSxOPVErTisxLChOPkQuc2NyZWVuV2lkdGh8fE4+RC5zY3JlZW5IZWlnaHQpJiZELnJlc2l6ZShOLE4sITApLEQuY2xlYXIoKSxOPUQuY3R4LE4uYmVnaW5QYXRoKCksTShRKS5jb250ZXh0KE4pKG51bGwpLE4uY2xvc2VQYXRoKCksbS5yZW5kZXJQYXRoV2l0aFN0eWxlKE4sTCksTz1NLEg9USxOPUwpO0QuYmxpdENlbnRlcihBLEwueCxMLnkpfX19fX19LApmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhEKXtyZXR1cm4gRCBpbnN0YW5jZW9mIHk/RDpEIGluc3RhbmNlb2YgRGF0ZT9wKEQudmFsdWVPZigpKTpEIGluc3RhbmNlb2YgQS5TY2FsZT90KEQpOkQgaW5zdGFuY2VvZiB4LkRhdGFzZXQ/bChEKTp1KEQpP24oRCk6QXJyYXkuaXNBcnJheShEKT9tKEQpOnAoRCl9ZnVuY3Rpb24gdChEKXtEPXtkb21haW46RC5kb21haW4oKSxyYW5nZTpELnJhbmdlKCksdXBkYXRlSWQ6RC51cGRhdGVJZCgpLHJlZjpwKEQpfTtyZXR1cm4gbihEKX1mdW5jdGlvbiBsKEQpe0Q9e3JlZjpwKEQpLHVwZGF0ZUlkOkQudXBkYXRlSWQoKX07cmV0dXJuIG4oRCl9ZnVuY3Rpb24gcChEKXtyZXR1cm4gbmV3IEMoRCl9ZnVuY3Rpb24gbShEKXtyZXR1cm4gbmV3IHcoRC5tYXAoZnVuY3Rpb24oQil7cmV0dXJuIGsoQil9KSl9ZnVuY3Rpb24gbihEKXt2YXIgQj17fSxJO2ZvcihJIGluIEQpRC5oYXNPd25Qcm9wZXJ0eShJKSYmKEJbSV09ayhEW0ldKSk7cmV0dXJuIG5ldyBHKEIpfQp2YXIgcT10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oRCxCKXtmdW5jdGlvbiBJKCl7dGhpcy5jb25zdHJ1Y3Rvcj1EfWZvcih2YXIgTiBpbiBCKUIuaGFzT3duUHJvcGVydHkoTikmJihEW05dPUJbTl0pO0QucHJvdG90eXBlPW51bGw9PT1CP09iamVjdC5jcmVhdGUoQik6KEkucHJvdG90eXBlPUIucHJvdG90eXBlLG5ldyBJKX0sdT1oKDEyOCkseD1oKDM4KSxBPWgoMTcpO2Yuc2lnbj1rO2Yuc2lnblNjYWxlPXQ7Zi5zaWduRGF0YXNldD1sO2Yuc2lnblJlZj1wO2Yuc2lnbkFycmF5PW07Zi5zaWduT2JqPW47dmFyIHk9ZnVuY3Rpb24oKXtmdW5jdGlvbiBEKCl7fUQucHJvdG90eXBlLmlzRGlmZmVyZW50PWZ1bmN0aW9uKEIpe3JldHVybiBCIGluc3RhbmNlb2YgdGhpcy5jb25zdHJ1Y3Rvcj90aGlzLmlzU2lnbmF0dXJlRGlmZmVyZW50KEIpOiEwfTtyZXR1cm4gRH0oKTtmLlNpZ25hdHVyZT15O3ZhciB3PWZ1bmN0aW9uKEQpe2Z1bmN0aW9uIEIoSSl7dmFyIE49RC5jYWxsKHRoaXMpfHwKdGhpcztOLmFycmF5PUk7cmV0dXJuIE59cShCLEQpO0IucHJvdG90eXBlLmlzU2lnbmF0dXJlRGlmZmVyZW50PWZ1bmN0aW9uKEkpe2lmKEkuYXJyYXkubGVuZ3RoIT09dGhpcy5hcnJheS5sZW5ndGgpcmV0dXJuITA7Zm9yKHZhciBOPTA7Tjx0aGlzLmFycmF5Lmxlbmd0aDtOKyspaWYodGhpcy5hcnJheVtOXS5pc0RpZmZlcmVudChJLmFycmF5W05dKSlyZXR1cm4hMDtyZXR1cm4hMX07cmV0dXJuIEJ9KHkpO2YuQXJyYXlTaWduYXR1cmU9dzt2YXIgQz1mdW5jdGlvbihEKXtmdW5jdGlvbiBCKEkpe3ZhciBOPUQuY2FsbCh0aGlzKXx8dGhpcztOLnJlZj1JO3JldHVybiBOfXEoQixEKTtCLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbihJKXtyZXR1cm4gdGhpcy5yZWYhPT1JLnJlZn07cmV0dXJuIEJ9KHkpO2YuUmVmZXJlbmNlU2lnbmF0dXJlPUM7dmFyIEc9ZnVuY3Rpb24oRCl7ZnVuY3Rpb24gQihJKXt2YXIgTj1ELmNhbGwodGhpcyl8fHRoaXM7Ti5vYmo9Ckk7cmV0dXJuIE59cShCLEQpO0IucHJvdG90eXBlLmlzU2lnbmF0dXJlRGlmZmVyZW50PWZ1bmN0aW9uKEkpe3ZhciBOPU9iamVjdC5rZXlzKHRoaXMub2JqKSxPPU9iamVjdC5rZXlzKEkub2JqKTtpZihOLmxlbmd0aCE9PU8ubGVuZ3RoKXJldHVybiEwO2ZvcihPPTA7TzxOLmxlbmd0aDtPKyspe3ZhciBIPU5bT107aWYoIUkub2JqLmhhc093blByb3BlcnR5KEgpfHx0aGlzLm9ialtIXS5pc0RpZmZlcmVudChJLm9ialtIXSkpcmV0dXJuITB9cmV0dXJuITF9O3JldHVybiBCfSh5KTtmLk9iamVjdFNpZ25hdHVyZT1HfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHksdyl7ZnVuY3Rpb24gQygpe3RoaXMuY29uc3RydWN0b3I9eX1mb3IodmFyIEcgaW4gdyl3Lmhhc093blByb3BlcnR5KEcpJiYoeVtHXT13W0ddKTt5LnByb3RvdHlwZT1udWxsPT09dz9PYmplY3QuY3JlYXRlKHcpOihDLnByb3RvdHlwZT13LnByb3RvdHlwZSxuZXcgQyl9LAp0PWgoMSksbD1oKDMpLHA9aCgwKSxtPWgoMTQpLG49aCg0NikscT1oKDYpLHU9aCgzMykseD1oKDE5KTtkPWgoNTMpO3ZhciBBPWgoMik7aD1mdW5jdGlvbih5KXtmdW5jdGlvbiB3KCl7dmFyIEM9eS5jYWxsKHRoaXMpfHx0aGlzO0MuYWRkQ2xhc3MoImFyZWEtcGxvdCIpO0MueTAoMCk7Qy5hdHRyKCJmaWxsLW9wYWNpdHkiLC4yNSk7Qy5hdHRyKCJmaWxsIiwobmV3IGwuQ29sb3IpLnJhbmdlKClbMF0pO0MuX2xpbmVEcmF3ZXJzPW5ldyBwLk1hcDtyZXR1cm4gQ31rKHcseSk7dy5wcm90b3R5cGUueT1mdW5jdGlvbihDLEcpe2lmKG51bGw9PUMpcmV0dXJuIHkucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtudWxsPT1HP3kucHJvdG90eXBlLnkuY2FsbCh0aGlzLEMpOnkucHJvdG90eXBlLnkuY2FsbCh0aGlzLEMsRyk7bnVsbCE9RyYmKEM9dGhpcy55MCgpLmFjY2Vzc29yLG51bGwhPUMmJnRoaXMuX2JpbmRQcm9wZXJ0eSh3Ll9ZMF9LRVksQyxHKSx0aGlzLl91cGRhdGVZU2NhbGUoKSk7CnJldHVybiB0aGlzfTt3LnByb3RvdHlwZS55MD1mdW5jdGlvbihDKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh3Ll9ZMF9LRVkpO3ZhciBHPXRoaXMueSgpO3RoaXMuX2JpbmRQcm9wZXJ0eSh3Ll9ZMF9LRVksQyxHJiZHLnNjYWxlKTt0aGlzLl91cGRhdGVZU2NhbGUoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7eS5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZS5jYWxsKHRoaXMpO3RoaXMuX3VwZGF0ZVlTY2FsZSgpfTt3LnByb3RvdHlwZS5fYWRkRGF0YXNldD1mdW5jdGlvbihDKXt2YXIgRz10aGlzO3RoaXMuX2xpbmVEcmF3ZXJzLnNldChDLG5ldyBtLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1LkxpbmVTVkdEcmF3ZXJ9LGZ1bmN0aW9uKEQpe3JldHVybiBuZXcgbS5DYW52YXNEcmF3ZXIoRCx1Lm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXAoZnVuY3Rpb24oKXt2YXIgQj0KQS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLngoKSksST1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEcueSgpKTtyZXR1cm4gRy5fZDNMaW5lRmFjdG9yeShDLEIsSSl9KSl9KSk7eS5wcm90b3R5cGUuX2FkZERhdGFzZXQuY2FsbCh0aGlzLEMpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKEMpe3kucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLEMpO0M9dGhpcy5fbGluZURyYXdlcnMuZ2V0KEMpOyJzdmciPT09dGhpcy5yZW5kZXJlcigpP0MudXNlU1ZHKHRoaXMuX3JlbmRlckFyZWEpOkMudXNlQ2FudmFzKHRoaXMuX2NhbnZhcyk7cmV0dXJuIEN9O3cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oQyl7eS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsQyk7dGhpcy5fbGluZURyYXdlcnMuZ2V0KEMpLnJlbW92ZSgpfTt3LnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PQpmdW5jdGlvbigpe3ZhciBDPXRoaXMsRz10aGlzLl9nZW5lcmF0ZUxpbmVEcmF3U3RlcHMoKSxEPXRoaXMuX2dldERhdGFUb0RyYXcoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihCKXt2YXIgST1BLlBsb3QuYXBwbHlEcmF3U3RlcHMoRyxCKTtDLl9saW5lRHJhd2Vycy5nZXQoQikuZHJhdyhELmdldChCKSxJKX0pfTt3LnByb3RvdHlwZS5fZ2VuZXJhdGVMaW5lRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIEM9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgRz10aGlzLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3IoKTtHLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3RvcihBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSx0aGlzLl9nZXRSZXNldFlGdW5jdGlvbigpKTtDLnB1c2goe2F0dHJUb1Byb2plY3RvcjpHLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHguQW5pbWF0b3IuUkVTRVQpfSl9Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2VuZXJhdGVMaW5lQXR0clRvUHJvamVjdG9yKCksCmFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKHguQW5pbWF0b3IuTUFJTil9KTtyZXR1cm4gQ307dy5wcm90b3R5cGUuX2dlbmVyYXRlTGluZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciBDPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO0MuZD10aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKTtyZXR1cm4gQ307dy5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbihDKXt2YXIgRz10aGlzO3JldHVybiBuZXcgcS5Qcm94eURyYXdlcihmdW5jdGlvbigpe3JldHVybiBuZXcgbi5BcmVhU1ZHRHJhd2VyfSxmdW5jdGlvbihEKXtyZXR1cm4gbmV3IG0uQ2FudmFzRHJhd2VyKEQsbi5tYWtlQXJlYUNhbnZhc0RyYXdTdGVwKGZ1bmN0aW9uKCl7dmFyIEI9QS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLngoKSksST1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEcueSgpKSwKTj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKEcueTAoKSk7cmV0dXJuIEcuX2NyZWF0ZUFyZWFHZW5lcmF0b3IoQixJLE4sRy5fY3JlYXRlRGVmaW5lZFByb2plY3RvcihCLEkpLEMpfSkpfSl9O3cucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3ZhciBDPVtdO2lmKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSl7dmFyIEc9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7Ry5kPXRoaXMuX2NvbnN0cnVjdEFyZWFQcm9qZWN0b3IoQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksdGhpcy5fZ2V0UmVzZXRZRnVuY3Rpb24oKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSkpO0MucHVzaCh7YXR0clRvUHJvamVjdG9yOkcsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoeC5BbmltYXRvci5SRVNFVCl9KX1DLnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih4LkFuaW1hdG9yLk1BSU4pfSk7CnJldHVybiBDfTt3LnByb3RvdHlwZS5fdXBkYXRlWVNjYWxlPWZ1bmN0aW9uKCl7dmFyIEM9dGhpcy5nZXRFeHRlbnRzRm9yUHJvcGVydHkoInkwIik7Qz1wLkFycmF5LnVuaXEocC5BcnJheS5mbGF0dGVuKEMpKTt2YXIgRz0xPT09Qy5sZW5ndGg/Q1swXTpudWxsO0M9KEM9dGhpcy55KCkpJiZDLnNjYWxlO251bGwhPUMmJihudWxsIT10aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlciYmKEMucmVtb3ZlUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcih0aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlciksdGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXI9bnVsbCksbnVsbCE9RyYmKHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuW0ddfSxDLmFkZFBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXIpKSl9O3cucHJvdG90eXBlLl9nZXRSZXNldFlGdW5jdGlvbj0KZnVuY3Rpb24oKXtyZXR1cm4gQS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkwKCkpfTt3LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIEM9eS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpO0MuZD10aGlzLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yKEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLEEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MCgpKSk7cmV0dXJuIEN9O3cucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpczt2b2lkIDA9PT1DJiYoQz10aGlzLmRhdGFzZXRzKCkpO2lmKCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXJldHVybiB0LnNlbGVjdEFsbCgpO3ZhciBEPXkucHJvdG90eXBlLnNlbGVjdGlvbnMuY2FsbCh0aGlzLEMpLm5vZGVzKCk7Qy5tYXAoZnVuY3Rpb24oQil7cmV0dXJuIEcuX2xpbmVEcmF3ZXJzLmdldChCKX0pLmZpbHRlcihmdW5jdGlvbihCKXtyZXR1cm4gbnVsbCE9CkJ9KS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3JldHVybiBELnB1c2guYXBwbHkoRCxCLmdldFZpc3VhbFByaW1pdGl2ZXMoKSl9KTtyZXR1cm4gdC5zZWxlY3RBbGwoRCl9O3cucHJvdG90eXBlLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yPWZ1bmN0aW9uKEMsRyxEKXt2YXIgQj10aGlzLEk9dGhpcy5fY3JlYXRlRGVmaW5lZFByb2plY3RvcihBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxBLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSk7cmV0dXJuIGZ1bmN0aW9uKE4sTyxIKXtyZXR1cm4gQi5fY3JlYXRlQXJlYUdlbmVyYXRvcihDLEcsRCxJLEgpKE4pfX07dy5wcm90b3R5cGUuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3I9ZnVuY3Rpb24oQyxHKXtyZXR1cm4gZnVuY3Rpb24oRCxCLEkpe3ZhciBOPUMoRCxCLEkpO0Q9RyhELEIsSSk7cmV0dXJuIHAuTWF0aC5pc1ZhbGlkTnVtYmVyKE4pJiZwLk1hdGguaXNWYWxpZE51bWJlcihEKX19O3cucHJvdG90eXBlLl9jcmVhdGVBcmVhR2VuZXJhdG9yPQpmdW5jdGlvbihDLEcsRCxCLEkpe3ZhciBOPXRoaXMuX2dldEN1cnZlRmFjdG9yeSgpO3JldHVybiB0LmFyZWEoKS54KGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEMoTyxILEkpfSkueTEoZnVuY3Rpb24oTyxIKXtyZXR1cm4gRyhPLEgsSSl9KS55MChmdW5jdGlvbihPLEgpe3JldHVybiBEKE8sSCxJKX0pLmN1cnZlKE4pLmRlZmluZWQoZnVuY3Rpb24oTyxIKXtyZXR1cm4gQihPLEgsSSl9KX07cmV0dXJuIHd9KGQuTGluZSk7aC5fWTBfS0VZPSJ5MCI7Zi5BcmVhPWh9LGZ1bmN0aW9uKGQsZil7KGZ1bmN0aW9uKGgpe2guTUFJTj0ibWFpbiI7aC5SRVNFVD0icmVzZXQifSkoZi5BbmltYXRvcnx8KGYuQW5pbWF0b3I9e30pKX0sZnVuY3Rpb24oZCxmKXt2YXIgaD1mdW5jdGlvbigpe2Z1bmN0aW9uIGsoKXt2YXIgdD10aGlzO3RoaXMudHJhbnNsYXRlPXRoaXMuc2NhbGU9MDt0aGlzLmNhY2hlZERvbWFpbj1bbnVsbCxudWxsXTt0aGlzLmxhc3RTZWVuRG9tYWluPVtudWxsLG51bGxdO3RoaXMudXBkYXRlRG9tYWluPQpmdW5jdGlvbihsKXt0Lmxhc3RTZWVuRG9tYWluPWwuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTt2YXIgcD1sLnNjYWxlVHJhbnNmb3JtYXRpb24odC5jYWNoZWREb21haW5bMV0pLWwuc2NhbGVUcmFuc2Zvcm1hdGlvbih0LmNhY2hlZERvbWFpblswXSksbT1sLnNjYWxlVHJhbnNmb3JtYXRpb24odC5sYXN0U2VlbkRvbWFpblsxXSktbC5zY2FsZVRyYW5zZm9ybWF0aW9uKHQubGFzdFNlZW5Eb21haW5bMF0pO3Quc2NhbGU9cC9tfHwxO3QudHJhbnNsYXRlPWwuc2NhbGVUcmFuc2Zvcm1hdGlvbih0LmNhY2hlZERvbWFpblswXSktbC5zY2FsZVRyYW5zZm9ybWF0aW9uKHQubGFzdFNlZW5Eb21haW5bMF0pKnQuc2NhbGV8fDB9fWsucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5zY2FsZT0xO3RoaXMudHJhbnNsYXRlPTA7dGhpcy5jYWNoZWREb21haW49dGhpcy5sYXN0U2VlbkRvbWFpbn07ay5wcm90b3R5cGUuc2V0RG9tYWluPWZ1bmN0aW9uKHQpe3RoaXMuY2FjaGVkRG9tYWluPQp0LmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCl9O3JldHVybiBrfSgpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBrKHQsbCl7dmFyIHA9dGhpczt0aGlzLnJlbmRlckNhbGxiYWNrPXQ7dGhpcy5hcHBseVRyYW5zZm9ybUNhbGxiYWNrPWw7dGhpcy5kb21haW5UcmFuc2Zvcm1YPW5ldyBoO3RoaXMuZG9tYWluVHJhbnNmb3JtWT1uZXcgaDt0aGlzLnJlbmRlckRlZmVycmVkPWZ1bmN0aW9uKCl7cC5hcHBseVRyYW5zZm9ybSgpO2NsZWFyVGltZW91dChwLnRpbWVvdXRUb2tlbik7cC50aW1lb3V0VG9rZW49c2V0VGltZW91dChmdW5jdGlvbigpe3AucmVuZGVyQ2FsbGJhY2soKX0say5ERUZFUlJFRF9SRU5ERVJJTkdfREVMQVkpfX1rLnByb3RvdHlwZS5zZXREb21haW5zPWZ1bmN0aW9uKHQsbCl7dCYmdGhpcy5kb21haW5UcmFuc2Zvcm1YLnNldERvbWFpbih0KTtsJiZ0aGlzLmRvbWFpblRyYW5zZm9ybVkuc2V0RG9tYWluKGwpO3RoaXMucmVuZGVyRGVmZXJyZWQoKX07ay5wcm90b3R5cGUudXBkYXRlRG9tYWlucz0KZnVuY3Rpb24odCxsKXt0JiZ0aGlzLmRvbWFpblRyYW5zZm9ybVgudXBkYXRlRG9tYWluKHQpO2wmJnRoaXMuZG9tYWluVHJhbnNmb3JtWS51cGRhdGVEb21haW4obCk7dGhpcy5yZW5kZXJEZWZlcnJlZCgpfTtrLnByb3RvdHlwZS5yZXNldFRyYW5zZm9ybXM9ZnVuY3Rpb24oKXt0aGlzLmRvbWFpblRyYW5zZm9ybVgucmVzZXQoKTt0aGlzLmRvbWFpblRyYW5zZm9ybVkucmVzZXQoKTt0aGlzLmFwcGx5VHJhbnNmb3JtKCl9O2sucHJvdG90eXBlLmFwcGx5VHJhbnNmb3JtPWZ1bmN0aW9uKCl7dGhpcy5hcHBseVRyYW5zZm9ybUNhbGxiYWNrKHRoaXMuZG9tYWluVHJhbnNmb3JtWC50cmFuc2xhdGUsdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnRyYW5zbGF0ZSx0aGlzLmRvbWFpblRyYW5zZm9ybVguc2NhbGUsdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnNjYWxlKX07cmV0dXJuIGt9KCk7ZC5ERUZFUlJFRF9SRU5ERVJJTkdfREVMQVk9MjAwO2YuRGVmZXJyZWRSZW5kZXJlcj1kfSxmdW5jdGlvbihkLApmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihDLEcpe2Z1bmN0aW9uIEQoKXt0aGlzLmNvbnN0cnVjdG9yPUN9Zm9yKHZhciBCIGluIEcpRy5oYXNPd25Qcm9wZXJ0eShCKSYmKENbQl09R1tCXSk7Qy5wcm90b3R5cGU9bnVsbD09PUc/T2JqZWN0LmNyZWF0ZShHKTooRC5wcm90b3R5cGU9Ry5wcm90b3R5cGUsbmV3IEQpfSx0PWgoMSksbD1oKDcpLHA9aCgxNCksbT1oKDYpLG49aCgzMykscT1oKDMpLHU9aCgxMSkseD1oKDApO2Q9aCgxMCk7dmFyIEE9aCgxOSkseT1oKDIpO2g9aCgxNik7dmFyIHc9e2xpbmVhcjp0LmN1cnZlTGluZWFyLGxpbmVhckNsb3NlZDp0LmN1cnZlTGluZWFyQ2xvc2VkLHN0ZXA6dC5jdXJ2ZVN0ZXAsc3RlcEJlZm9yZTp0LmN1cnZlU3RlcEJlZm9yZSxzdGVwQWZ0ZXI6dC5jdXJ2ZVN0ZXBBZnRlcixiYXNpczp0LmN1cnZlQmFzaXMsYmFzaXNPcGVuOnQuY3VydmVCYXNpc09wZW4sYmFzaXNDbG9zZWQ6dC5jdXJ2ZUJhc2lzQ2xvc2VkLApidW5kbGU6dC5jdXJ2ZUJ1bmRsZSxjYXJkaW5hbDp0LmN1cnZlQ2FyZGluYWwsY2FyZGluYWxPcGVuOnQuY3VydmVDYXJkaW5hbE9wZW4sY2FyZGluYWxDbG9zZWQ6dC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkLG1vbm90b25lOnQuY3VydmVNb25vdG9uZVh9O2YuQ3VydmVOYW1lPWQubWFrZUVudW0oImxpbmVhciBsaW5lYXJDbG9zZWQgc3RlcCBzdGVwQmVmb3JlIHN0ZXBBZnRlciBiYXNpcyBiYXNpc09wZW4gYmFzaXNDbG9zZWQgYnVuZGxlIGNhcmRpbmFsIGNhcmRpbmFsT3BlbiBjYXJkaW5hbENsb3NlZCBtb25vdG9uZSIuc3BsaXQoIiAiKSk7aD1mdW5jdGlvbihDKXtmdW5jdGlvbiBHKCl7dmFyIEQ9Qy5jYWxsKHRoaXMpfHx0aGlzO0QuX2N1cnZlPSJsaW5lYXIiO0QuX2F1dG9yYW5nZVNtb290aD0hMTtELl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD0hMDtELl9jb2xsYXBzZURlbnNlVmVydGljYWxMaW5lc0VuYWJsZWQ9ITE7RC5fZG93bnNhbXBsaW5nRW5hYmxlZD0hMTtELmFkZENsYXNzKCJsaW5lLXBsb3QiKTsKdmFyIEI9bmV3IGwuRWFzaW5nO0Iuc3RlcER1cmF0aW9uKHkuUGxvdC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTik7Qi5lYXNpbmdNb2RlKCJleHBJbk91dCIpO0IubWF4VG90YWxEdXJhdGlvbih5LlBsb3QuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO0QuYW5pbWF0b3IoQS5BbmltYXRvci5NQUlOLEIpO0QuYXR0cigic3Ryb2tlIiwobmV3IHEuQ29sb3IpLnJhbmdlKClbMF0pO0QuYXR0cigic3Ryb2tlLXdpZHRoIiwiMnB4Iik7cmV0dXJuIER9ayhHLEMpO0cucHJvdG90eXBlLng9ZnVuY3Rpb24oRCxCLEkpe2lmKG51bGw9PUQpcmV0dXJuIEMucHJvdG90eXBlLnguY2FsbCh0aGlzKTtDLnByb3RvdHlwZS54LmNhbGwodGhpcyxELEIsSSk7dGhpcy5fc2V0U2NhbGVTbmFwcGluZygpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS55PWZ1bmN0aW9uKEQsQixJKXtpZihudWxsPT1EKXJldHVybiBDLnByb3RvdHlwZS55LmNhbGwodGhpcyk7Qy5wcm90b3R5cGUueS5jYWxsKHRoaXMsRCxCLApJKTt0aGlzLl9zZXRTY2FsZVNuYXBwaW5nKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmF1dG9yYW5nZU1vZGU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gQy5wcm90b3R5cGUuYXV0b3JhbmdlTW9kZS5jYWxsKHRoaXMpO0MucHJvdG90eXBlLmF1dG9yYW5nZU1vZGUuY2FsbCh0aGlzLEQpO3RoaXMuX3NldFNjYWxlU25hcHBpbmcoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUuYXV0b3JhbmdlU21vb3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2F1dG9yYW5nZVNtb290aH07Ry5wcm90b3R5cGUuX3NldFNjYWxlU25hcHBpbmc9ZnVuY3Rpb24oKXsieCI9PT10aGlzLmF1dG9yYW5nZU1vZGUoKSYmdGhpcy54KCkmJnRoaXMueCgpLnNjYWxlJiZ0aGlzLngoKS5zY2FsZSBpbnN0YW5jZW9mIHUuUXVhbnRpdGF0aXZlU2NhbGUmJnRoaXMueCgpLnNjYWxlLnNuYXBwaW5nRG9tYWluRW5hYmxlZCghdGhpcy5hdXRvcmFuZ2VTbW9vdGgoKSk7InkiPT09dGhpcy5hdXRvcmFuZ2VNb2RlKCkmJgp0aGlzLnkoKSYmdGhpcy55KCkuc2NhbGUmJnRoaXMueSgpLnNjYWxlIGluc3RhbmNlb2YgdS5RdWFudGl0YXRpdmVTY2FsZSYmdGhpcy55KCkuc2NhbGUuc25hcHBpbmdEb21haW5FbmFibGVkKCF0aGlzLmF1dG9yYW5nZVNtb290aCgpKX07Ry5wcm90b3R5cGUuY3VydmU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fY3VydmU7dGhpcy5fY3VydmU9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rvd25zYW1wbGluZ0VuYWJsZWR9O0cucHJvdG90eXBlLmNyb3BwZWRSZW5kZXJpbmdFbmFibGVkPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkO3RoaXMuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkPUQ7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUuY29sbGFwc2VEZW5zZUxpbmVzRW5hYmxlZD0KZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkO3RoaXMuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZD1EO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpcztyZXR1cm4gbmV3IG0uUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4uTGluZVNWR0RyYXdlcn0sZnVuY3Rpb24oSSl7cmV0dXJuIG5ldyBwLkNhbnZhc0RyYXdlcihJLG4ubWFrZUxpbmVDYW52YXNEcmF3U3RlcChmdW5jdGlvbigpe3JldHVybiBCLl9kM0xpbmVGYWN0b3J5KEQpfSkpfSl9O0cucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihEKXt2YXIgQj1DLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLEQpO2lmKCF0aGlzLl9hdXRvcmFuZ2VTbW9vdGh8fHRoaXMuYXV0b3JhbmdlTW9kZSgpIT09CkR8fCJ4IiE9PXRoaXMuYXV0b3JhbmdlTW9kZSgpJiYieSIhPT10aGlzLmF1dG9yYW5nZU1vZGUoKSlyZXR1cm4gQjtEPXRoaXMuX2dldEVkZ2VJbnRlcnNlY3Rpb25Qb2ludHMoKTt2YXIgST0ieSI9PT10aGlzLmF1dG9yYW5nZU1vZGUoKT9ELmxlZnQuY29uY2F0KEQucmlnaHQpLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gTi55fSk6RC50b3AuY29uY2F0KEQuYm90dG9tKS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIE4ueH0pO3JldHVybiBCLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gdC5leHRlbnQodC5tZXJnZShbTixJXSkpfSl9O0cucHJvdG90eXBlLl9nZXRFZGdlSW50ZXJzZWN0aW9uUG9pbnRzPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcztpZighKHRoaXMueSgpLnNjYWxlIGluc3RhbmNlb2YgdS5RdWFudGl0YXRpdmVTY2FsZSYmdGhpcy54KCkuc2NhbGUgaW5zdGFuY2VvZiB1LlF1YW50aXRhdGl2ZVNjYWxlKSlyZXR1cm57bGVmdDpbXSxyaWdodDpbXSx0b3A6W10sYm90dG9tOltdfTsKdmFyIEI9dGhpcy55KCkuc2NhbGUsST10aGlzLngoKS5zY2FsZSxOPXtsZWZ0OltdLHJpZ2h0OltdLHRvcDpbXSxib3R0b206W119LE89SS5zY2FsZShJLmRvbWFpbigpWzBdKSxIPUkuc2NhbGUoSS5kb21haW4oKVsxXSksSz1CLnNjYWxlKEIuZG9tYWluKClbMF0pLE09Qi5zY2FsZShCLmRvbWFpbigpWzFdKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihMKXtmb3IodmFyIFE9TC5kYXRhKCksVCxYLGFhLGxhLFosYmEsZWEsY2E9MTtjYTxRLmxlbmd0aDtjYSsrKWxhPWJhfHxJLnNjYWxlKEQueCgpLmFjY2Vzc29yKFFbY2EtMV0sY2EtMSxMKSksWj1lYXx8Qi5zY2FsZShELnkoKS5hY2Nlc3NvcihRW2NhLTFdLGNhLTEsTCkpLGJhPUkuc2NhbGUoRC54KCkuYWNjZXNzb3IoUVtjYV0sY2EsTCkpLGVhPUIuc2NhbGUoRC55KCkuYWNjZXNzb3IoUVtjYV0sY2EsTCkpLGxhPE89PT1PPD1iYSYmKFQ9Ty1sYSxYPWJhLWxhLGFhPWVhLVosVD1UKmFhL1gsTi5sZWZ0LnB1c2goe3g6TywKeTpCLmludmVydChaK1QpfSkpLGxhPEg9PT1IPD1iYSYmKFQ9SC1sYSxYPWJhLWxhLGFhPWVhLVosVD1UKmFhL1gsTi5yaWdodC5wdXNoKHt4OkgseTpCLmludmVydChaK1QpfSkpLFo8TT09PU08PWVhJiYoWD1iYS1sYSxUPU0tWixhYT1lYS1aLFQ9VCpYL2FhLE4udG9wLnB1c2goe3g6SS5pbnZlcnQobGErVCkseTpNfSkpLFo8Sz09PUs8PWVhJiYoWD1iYS1sYSxUPUstWixhYT1lYS1aLFQ9VCpYL2FhLE4uYm90dG9tLnB1c2goe3g6SS5pbnZlcnQobGErVCkseTpLfSkpfSk7cmV0dXJuIE59O0cucHJvdG90eXBlLl9nZXRSZXNldFlGdW5jdGlvbj1mdW5jdGlvbigpe3ZhciBEPXRoaXMueSgpLnNjYWxlLmRvbWFpbigpLEI9TWF0aC5tYXgoRFswXSxEWzFdKTtEPU1hdGgubWluKERbMF0sRFsxXSk7Qj0wPkImJkJ8fDA8RCYmRHx8MDt2YXIgST10aGlzLnkoKS5zY2FsZS5zY2FsZShCKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gSX19O0cucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz0KZnVuY3Rpb24oKXt2YXIgRD1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBCPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO0IuZD10aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCkpO0QucHVzaCh7YXR0clRvUHJvamVjdG9yOkIsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoQS5BbmltYXRvci5SRVNFVCl9KX1ELnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihBLkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIER9O0cucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciBEPUMucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpO09iamVjdC5rZXlzKEQpLmZvckVhY2goZnVuY3Rpb24oQil7aWYoImQiIT09CkIpe3ZhciBJPURbQl07RFtCXT1mdW5jdGlvbihOLE8sSCl7cmV0dXJuIDA8Ti5sZW5ndGg/SShOWzBdLE8sSCk6bnVsbH19fSk7cmV0dXJuIER9O0cucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oRCl7RD10aGlzLmVudGl0eU5lYXJlc3RCeVhUaGVuWShEKTtyZXR1cm4gbnVsbCE9RD9bRF06W119O0cucHJvdG90eXBlLmVudGl0eU5lYXJlc3RCeVhUaGVuWT1mdW5jdGlvbihEKXt2YXIgQj1JbmZpbml0eSxJPUluZmluaXR5LE4sTz10aGlzLmJvdW5kcygpO3RoaXMuZW50aXRpZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEgpe2lmKHguTWF0aC53aXRoaW4oSC5wb3NpdGlvbixPKSl7dmFyIEs9TWF0aC5hYnMoRC54LUgucG9zaXRpb24ueCksTT1NYXRoLmFicyhELnktSC5wb3NpdGlvbi55KTtpZihLPEJ8fEs9PT1CJiZNPEkpTj1ILEI9SyxJPU19fSk7cmV0dXJuIE59O0cucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgRD1DLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7CkQuZD10aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKTtyZXR1cm4gRH07Ry5wcm90b3R5cGUuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3I9ZnVuY3Rpb24oRCxCKXt2YXIgST10aGlzO3JldHVybiBmdW5jdGlvbihOLE8sSCl7cmV0dXJuIEkuX2QzTGluZUZhY3RvcnkoSCxELEIpKE4pfX07Ry5wcm90b3R5cGUuX2QzTGluZUZhY3Rvcnk9ZnVuY3Rpb24oRCxCLEkpe2Z1bmN0aW9uIE4oTyxILEspe3ZhciBNPUIoTyxILEspO089SShPLEgsSyk7cmV0dXJuIHguTWF0aC5pc1ZhbGlkTnVtYmVyKE0pJiZ4Lk1hdGguaXNWYWxpZE51bWJlcihPKX12b2lkIDA9PT1CJiYoQj15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSk7dm9pZCAwPT09SSYmKEk9eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpO3JldHVybiB0LmxpbmUoKS54KGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEIoTywKSCxEKX0pLnkoZnVuY3Rpb24oTyxIKXtyZXR1cm4gSShPLEgsRCl9KS5jdXJ2ZSh0aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKSkuZGVmaW5lZChmdW5jdGlvbihPLEgpe3JldHVybiBOKE8sSCxEKX0pfTtHLnByb3RvdHlwZS5fZ2V0Q3VydmVGYWN0b3J5PWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcy5jdXJ2ZSgpO3JldHVybiJzdHJpbmciPT09dHlwZW9mIEQ/KEQ9d1tEXSxudWxsPT1EP3cubGluZWFyOkQpOkR9O0cucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcyxCPW5ldyB4Lk1hcDt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbihJKXt2YXIgTj1JLmRhdGEoKTtpZihELl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZHx8RC5fZG93bnNhbXBsaW5nRW5hYmxlZCl7dmFyIE89Ti5tYXAoZnVuY3Rpb24oSCxLKXtyZXR1cm4gS30pO0QuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkJiYoTz1ELl9maWx0ZXJDcm9wcGVkUmVuZGVyaW5nKEksTykpO0QuX2Rvd25zYW1wbGluZ0VuYWJsZWQmJgooTz1ELl9maWx0ZXJEb3duc2FtcGxpbmcoSSxPKSk7RC5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkJiYoTz1ELl9maWx0ZXJEZW5zZUxpbmVzKEksTykpO0Iuc2V0KEksW08ubWFwKGZ1bmN0aW9uKEgpe3JldHVybiBOW0hdfSldKX1lbHNlIEIuc2V0KEksW05dKX0pO3JldHVybiBCfTtHLnByb3RvdHlwZS5fZmlsdGVyQ3JvcHBlZFJlbmRlcmluZz1mdW5jdGlvbihELEIpe2Z1bmN0aW9uIEkoYWEsbGEpe3JldHVybiB4Lk1hdGguaW5SYW5nZShhYSwwLE4ud2lkdGgoKSkmJnguTWF0aC5pblJhbmdlKGxhLDAsTi5oZWlnaHQoKSl9Zm9yKHZhciBOPXRoaXMsTz15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxIPXkuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLEs9RC5kYXRhKCksTT1bXSxMPTA7TDxCLmxlbmd0aDtMKyspe3ZhciBRPU8oS1tCW0xdXSxCW0xdLEQpLFQ9SChLW0JbTF1dLEJbTF0sRCk7UT1JKFEsVCk7aWYoIVEmJm51bGwhPUJbTC0KMV0mJm51bGwhPUtbQltMLTFdXSl7VD1PKEtbQltMLTFdXSxCW0wtMV0sRCk7dmFyIFg9SChLW0JbTC0xXV0sQltMLTFdLEQpO1E9UXx8SShULFgpfVF8fG51bGw9PUJbTCsxXXx8bnVsbD09S1tCW0wrMV1dfHwoVD1PKEtbQltMKzFdXSxCW0wrMV0sRCksWD1IKEtbQltMKzFdXSxCW0wrMV0sRCksUT1RfHxJKFQsWCkpO1EmJk0ucHVzaChCW0xdKX1yZXR1cm4gTX07Ry5wcm90b3R5cGUuX2ZpbHRlckRvd25zYW1wbGluZz1mdW5jdGlvbihELEIpe2Z1bmN0aW9uIEkoZWEsY2Epe3ZhciBrYT1PKE5bQltlYV1dLEJbZWFdLEQpLFk9SChOW0JbZWFdXSxCW2VhXSxEKSxFYT1PKE5bQltlYSsxXV0sQltlYSsxXSxEKTtlYT1IKE5bQltlYSsxXV0sQltlYSsxXSxEKTtyZXR1cm4gSW5maW5pdHk9PT1jYT9NYXRoLmZsb29yKGthKT09PU1hdGguZmxvb3IoRWEpOk1hdGguZmxvb3IoZWEpPT09TWF0aC5mbG9vcihZKyhFYS1rYSkqY2EpfWlmKDA9PT1CLmxlbmd0aClyZXR1cm5bXTtmb3IodmFyIE49CkQuZGF0YSgpLE89eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksSD15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxLPVtCWzBdXSxNPTA7TTxCLmxlbmd0aC0xOyl7dmFyIEw9QltNXSxRPU8oTltCW01dXSxCW01dLEQpLFQ9SChOW0JbTV1dLEJbTV0sRCksWD1PKE5bQltNKzFdXSxCW00rMV0sRCksYWE9SChOW0JbTSsxXV0sQltNKzFdLEQpO2FhPU1hdGguZmxvb3IoUSk9PT1NYXRoLmZsb29yKFgpP0luZmluaXR5OihhYS1UKS8oWC1RKTtYPUJbTV07VD1JbmZpbml0eT09PWFhP1Q6UTtRPVg7Zm9yKHZhciBsYT1ULFo9ITA7TTxCLmxlbmd0aC0xJiYoWnx8SShNLGFhKSk7KXtNKys7Wj0hMTt2YXIgYmE9SW5maW5pdHk9PT1hYT9IKE5bQltNXV0sQltNXSxEKTpPKE5bQltNXV0sQltNXSxEKTtiYT5sYSYmKGxhPWJhLFE9QltNXSk7YmE8VCYmKFQ9YmEsWD1CW01dKX1hYT1CW01dO1ghPT1MJiZLLnB1c2goWCk7USE9PVgmJlEhPT1MJiZLLnB1c2goUSk7YWEhPT0KTCYmYWEhPT1YJiZhYSE9PVEmJksucHVzaChhYSl9cmV0dXJuIEt9O0cucHJvdG90eXBlLl9maWx0ZXJEZW5zZUxpbmVzPWZ1bmN0aW9uKEQsQil7aWYoMD09PUIubGVuZ3RoKXJldHVybltdO3ZhciBJPUQuZGF0YSgpLE49eS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksTz15LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTtyZXR1cm4gdGhpcy5fYnVja2V0QnlYKEQsQixmdW5jdGlvbihIKXtyZXR1cm4gTihJW0hdLEgsRCl9LGZ1bmN0aW9uKEgpe3JldHVybiBPKElbSF0sSCxEKX0pfTtHLnByb3RvdHlwZS5fYnVja2V0QnlYPWZ1bmN0aW9uKEQsQixJLE4pe3ZhciBPPVtdO0Q9RC5kYXRhKCk7Zm9yKHZhciBIPW51bGwsSz0wO0s8PUIubGVuZ3RoOysrSyl7dmFyIE09QltLXTtpZihudWxsIT1EW01dKXt2YXIgTD1NYXRoLmZsb29yKEkoTSkpLFE9TihNKTtudWxsPT1IP0g9bmV3IHguQnVja2V0KE0sTCxRKTpILmlzSW5CdWNrZXQoTCk/SC5hZGRUb0J1Y2tldChRLApNKTooTy5wdXNoLmFwcGx5KE8sSC5nZXRVbmlxdWVJbmRpY2VzKCkpLEg9bmV3IHguQnVja2V0KE0sTCxRKSl9fW51bGwhPUgmJk8ucHVzaC5hcHBseShPLEguZ2V0VW5pcXVlSW5kaWNlcygpKTtyZXR1cm4gT307cmV0dXJuIEd9KGguWFlQbG90KTtmLkxpbmU9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB4IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh4KSYmKG5beF09cVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoMSksbD1oKDI2KSxwPWgoMCksbT1bMCwxXTtkPWZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHEoKXt2YXIgdT1uLmNhbGwodGhpcyl8fHRoaXM7dS5fcmFuZ2U9WzAsMV07dS5fZDNTY2FsZT10LnNjYWxlQmFuZCgpO3UuX2QzU2NhbGUucmFuZ2UobSk7CnUuX2QzVHJhbnNmb3JtYXRpb25TY2FsZT10LnNjYWxlTGluZWFyKCk7dS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbihtKTt1Ll9pbm5lclBhZGRpbmc9cS5fY29udmVydFRvUGxvdHRhYmxlSW5uZXJQYWRkaW5nKCk7dS5fb3V0ZXJQYWRkaW5nPXEuX2NvbnZlcnRUb1Bsb3R0YWJsZU91dGVyUGFkZGluZygpO3JldHVybiB1fWsocSxuKTtxLnByb3RvdHlwZS5jbG9uZVdpdGhvdXRQcm92aWRlcnM9ZnVuY3Rpb24oKXt2YXIgdT0obmV3IHEpLmRvbWFpbih0aGlzLmRvbWFpbigpKS5yYW5nZSh0aGlzLnJhbmdlKCkpLmlubmVyUGFkZGluZyh0aGlzLmlubmVyUGFkZGluZygpKS5vdXRlclBhZGRpbmcodGhpcy5vdXRlclBhZGRpbmcoKSk7dS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKCkpO3JldHVybiB1fTtxLnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcz1mdW5jdGlvbih1KXtyZXR1cm4gcC5BcnJheS51bmlxKHUpfTsKcS5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3JldHVybiBwLkFycmF5LnVuaXEodGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKSl9O3EucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbih1KXtyZXR1cm4gbi5wcm90b3R5cGUuZG9tYWluLmNhbGwodGhpcyx1KX07cS5wcm90b3R5cGUuaW52ZXJ0UmFuZ2U9ZnVuY3Rpb24oKXt2YXIgdSx4PXRoaXM7dm9pZCAwPT09dSYmKHU9dGhpcy5yYW5nZSgpKTt2YXIgQT10aGlzLl9kM1NjYWxlLmJhbmR3aWR0aCgpLHk9dGhpcy5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKHVbMF0pLHc9dGhpcy5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKHVbMV0pO3U9dGhpcy5fZDNTY2FsZS5kb21haW4oKTt2YXIgQz11Lm1hcChmdW5jdGlvbihHKXtyZXR1cm4geC5fZDNTY2FsZShHKStBLzJ9KTt5PXQuYmlzZWN0KEMseSk7dz10LmJpc2VjdChDLHcpO3JldHVybiB1LnNsaWNlKHksdyl9O3EucHJvdG90eXBlLnJhbmdlPWZ1bmN0aW9uKHUpe3JldHVybiBuLnByb3RvdHlwZS5yYW5nZS5jYWxsKHRoaXMsCnUpfTtxLl9jb252ZXJ0VG9QbG90dGFibGVJbm5lclBhZGRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gMS8uNy0xfTtxLl9jb252ZXJ0VG9QbG90dGFibGVPdXRlclBhZGRpbmc9ZnVuY3Rpb24oKXtyZXR1cm4uNS8uN307cS5wcm90b3R5cGUuX3NldEJhbmRzPWZ1bmN0aW9uKCl7dmFyIHU9MS0xLygxK3RoaXMuaW5uZXJQYWRkaW5nKCkpLHg9dGhpcy5vdXRlclBhZGRpbmcoKS8oMSt0aGlzLmlubmVyUGFkZGluZygpKTt0aGlzLl9kM1NjYWxlLnBhZGRpbmdJbm5lcih1KTt0aGlzLl9kM1NjYWxlLnBhZGRpbmdPdXRlcih4KX07cS5wcm90b3R5cGUucmFuZ2VCYW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc2NhbGVCYW5kKHRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkpfTtxLnByb3RvdHlwZS5zdGVwV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVzY2FsZUJhbmQodGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKSooMSt0aGlzLmlubmVyUGFkZGluZygpKSl9O3EucHJvdG90eXBlLnRpY2tzPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfTtxLnByb3RvdHlwZS5pbm5lclBhZGRpbmc9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5faW5uZXJQYWRkaW5nO3RoaXMuX2lubmVyUGFkZGluZz11O3RoaXMucmFuZ2UodGhpcy5yYW5nZSgpKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5vdXRlclBhZGRpbmc9ZnVuY3Rpb24odSl7aWYobnVsbD09dSlyZXR1cm4gdGhpcy5fb3V0ZXJQYWRkaW5nO3RoaXMuX291dGVyUGFkZGluZz11O3RoaXMucmFuZ2UodGhpcy5yYW5nZSgpKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih1KXt1PXRoaXMuX2QzU2NhbGUodSkrdGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKS8yO3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUodSl9O3EucHJvdG90eXBlLnpvb209ZnVuY3Rpb24odSx4KXt2YXIgQT10aGlzOwp0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSgpLm1hcChmdW5jdGlvbih5KXtyZXR1cm4gQS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydChsLnpvb21PdXQoeSx1LHgpKX0pKTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtxLnByb3RvdHlwZS5wYW49ZnVuY3Rpb24odSl7dmFyIHg9dGhpczt0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSgpLm1hcChmdW5jdGlvbihBKXtyZXR1cm4geC5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydChBK3UpfSkpO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCl9O3EucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odSl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSh1KX07cS5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih1KXtyZXR1cm4gdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydCh1KX07CnEucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIG19O3EucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4oKX07cS5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24odSl7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih1KTt0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfTtxLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfTtxLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHUpe2lmKG51bGw9PXUpcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4odSk7dGhpcy5fc2V0QmFuZHMoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhbmdlfTsKcS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHUpe3RoaXMuX3JhbmdlPXU7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLnJhbmdlKHUpO3RoaXMuX3NldEJhbmRzKCl9O3EucHJvdG90eXBlLl9yZXNjYWxlQmFuZD1mdW5jdGlvbih1KXtyZXR1cm4gTWF0aC5hYnModGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlKHUpLXRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSgwKSl9O3JldHVybiBxfShoKDE3KS5TY2FsZSk7Zi5DYXRlZ29yeT1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh3KXt0cnl7dmFyIEM9dy5ub2RlKCkuZ2V0QkJveCgpfWNhdGNoKEcpe0M9e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH19cmV0dXJuIEN9ZnVuY3Rpb24gdCh3KXtpZigibnVtYmVyIj09PXR5cGVvZiB3KXJldHVybnttaW46dyxtYXg6d307aWYodyBpbnN0YW5jZW9mIE9iamVjdCYmIm1pbiJpbiB3JiYibWF4ImluIHcpcmV0dXJuIHc7dGhyb3cgRXJyb3IoImlucHV0ICciK3crIicgY2FuJ3QgYmUgcGFyc2VkIGFzIGFuIFJhbmdlIik7Cn1mdW5jdGlvbiBsKHcsQyl7dz13LmdldFByb3BlcnR5VmFsdWUoQyk7cmV0dXJuIHBhcnNlRmxvYXQodyl8fDB9ZnVuY3Rpb24gcCh3KXtpZihudWxsPT13fHwibm9uZSI9PT13KXJldHVybiBudWxsO3c9dy5tYXRjaChBKTtpZihudWxsPT13fHwyPncubGVuZ3RoKXJldHVybiBudWxsO3c9d1sxXS5zcGxpdCh5KS5tYXAoZnVuY3Rpb24oQyl7cmV0dXJuIHBhcnNlRmxvYXQoQyl9KTtyZXR1cm4gNiE9dy5sZW5ndGg/bnVsbDp3fXZhciBtPWgoMSksbj1NYXRoO2YuY29udGFpbnM9ZnVuY3Rpb24odyxDKXtmb3IoO251bGwhPUMmJkMhPT13OylDPUMucGFyZW50Tm9kZTtyZXR1cm4gQz09PXd9O2YuZWxlbWVudEJCb3g9aztmLmVudGl0eUJvdW5kcz1mdW5jdGlvbih3KXtyZXR1cm4gdyBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/ayhtLnNlbGVjdCh3KSk6dyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50Pyh3PXcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkse3g6dy5sZWZ0LHk6dy50b3Asd2lkdGg6dy53aWR0aCwKaGVpZ2h0OncuaGVpZ2h0fSk6e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH19O2YuU0NSRUVOX1JFRlJFU0hfUkFURV9NSUxMSVNFQ09ORFM9MUUzLzYwO2YucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGw9ZnVuY3Rpb24odyl7bnVsbCE9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHcpOnNldFRpbWVvdXQodyxmLlNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTKX07Zi5lbGVtZW50V2lkdGg9ZnVuY3Rpb24odyl7dz13IGluc3RhbmNlb2YgbS5zZWxlY3Rpb24/dy5ub2RlKCk6dzt3PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHcpO3JldHVybiBsKHcsIndpZHRoIikrbCh3LCJwYWRkaW5nLWxlZnQiKStsKHcsInBhZGRpbmctcmlnaHQiKStsKHcsImJvcmRlci1sZWZ0LXdpZHRoIikrbCh3LCJib3JkZXItcmlnaHQtd2lkdGgiKX07Zi5lbGVtZW50SGVpZ2h0PWZ1bmN0aW9uKHcpe3c9dyBpbnN0YW5jZW9mIG0uc2VsZWN0aW9uPwp3Lm5vZGUoKTp3O3c9d2luZG93LmdldENvbXB1dGVkU3R5bGUodyk7cmV0dXJuIGwodywiaGVpZ2h0IikrbCh3LCJwYWRkaW5nLXRvcCIpK2wodywicGFkZGluZy1ib3R0b20iKStsKHcsImJvcmRlci10b3Atd2lkdGgiKStsKHcsImJvcmRlci1ib3R0b20td2lkdGgiKX07dmFyIHE9L3RyYW5zbGF0ZVxzKlwoXHMqKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkoPzooPzooPzpccyssP1xzKil8KD86LFxzKikpKCg/OlstK10/WzAtOV0qXC4/WzAtOV0rKSkpP1xzKlwpLyx1PS9yb3RhdGVccypcKFxzKigoPzpbLStdP1swLTldKlwuP1swLTldKykpXHMqXCkvLHg9L3NjYWxlXHMqXChccyooKD86Wy0rXT9bMC05XSpcLj9bMC05XSspKSg/Oig/Oig/OlxzKyw/XHMqKXwoPzosXHMqKSkoKD86Wy0rXT9bMC05XSpcLj9bMC05XSspKSk/XHMqXCkvO2YuZ2V0VHJhbnNsYXRlVmFsdWVzPWZ1bmN0aW9uKHcpe3c9cS5leGVjKHcuYXR0cigidHJhbnNmb3JtIikpO2lmKG51bGwhPXcpe3ZhciBDPQp3WzJdO3JldHVyblsrd1sxXSwrKHZvaWQgMD09PUM/MDpDKV19cmV0dXJuWzAsMF19O2YuZ2V0Um90YXRlPWZ1bmN0aW9uKHcpe3c9dS5leGVjKHcuYXR0cigidHJhbnNmb3JtIikpO3JldHVybiBudWxsIT13Pyt3WzFdOjB9O2YuZ2V0U2NhbGVWYWx1ZXM9ZnVuY3Rpb24odyl7dmFyIEM9eC5leGVjKHcuYXR0cigidHJhbnNmb3JtIikpO3JldHVybiBudWxsIT1DPyh3PUNbMV0sQz1DWzJdLFsrdyxudWxsPT1DPyt3OitDXSk6WzAsMF19O2YuY2xpZW50UmVjdHNPdmVybGFwPWZ1bmN0aW9uKHcsQyl7cmV0dXJuIG4uZmxvb3Iody5yaWdodCk8PW4uY2VpbChDLmxlZnQpfHxuLmNlaWwody5sZWZ0KT49bi5mbG9vcihDLnJpZ2h0KXx8bi5mbG9vcih3LmJvdHRvbSk8PW4uY2VpbChDLnRvcCl8fG4uY2VpbCh3LnRvcCk+PW4uZmxvb3IoQy5ib3R0b20pPyExOiEwfTtmLmV4cGFuZFJlY3Q9ZnVuY3Rpb24odyxDKXtyZXR1cm57bGVmdDp3LmxlZnQtQyx0b3A6dy50b3AtQyxyaWdodDp3LnJpZ2h0KwpDLGJvdHRvbTp3LmJvdHRvbStDLHdpZHRoOncud2lkdGgrMipDLGhlaWdodDp3LmhlaWdodCsyKkN9fTtmLmNsaWVudFJlY3RJbnNpZGU9ZnVuY3Rpb24odyxDKXtyZXR1cm4gbi5mbG9vcihDLmxlZnQpPD1uLmNlaWwody5sZWZ0KSYmbi5mbG9vcihDLnRvcCk8PW4uY2VpbCh3LnRvcCkmJm4uZmxvb3Iody5yaWdodCk8PW4uY2VpbChDLnJpZ2h0KSYmbi5mbG9vcih3LmJvdHRvbSk8PW4uY2VpbChDLmJvdHRvbSl9O2YuaW50ZXJzZWN0c0JCb3g9ZnVuY3Rpb24odyxDLEcsRCl7dm9pZCAwPT09RCYmKEQ9LjUpO3c9dCh3KTtDPXQoQyk7cmV0dXJuIEcueCtHLndpZHRoPj13Lm1pbi1EJiZHLng8PXcubWF4K0QmJkcueStHLmhlaWdodD49Qy5taW4tRCYmRy55PD1DLm1heCtEfTtmLmdldEh0bWxFbGVtZW50QW5jZXN0b3JzPWZ1bmN0aW9uKHcpe2Zvcih2YXIgQz1bXTt3JiZ3IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7KUMucHVzaCh3KSx3PXcucGFyZW50RWxlbWVudDtyZXR1cm4gQ307CmYuZ2V0RWxlbWVudFRyYW5zZm9ybT1mdW5jdGlvbih3KXt3PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHcsbnVsbCk7dz13LmdldFByb3BlcnR5VmFsdWUoIi13ZWJraXQtdHJhbnNmb3JtIil8fHcuZ2V0UHJvcGVydHlWYWx1ZSgiLW1vei10cmFuc2Zvcm0iKXx8dy5nZXRQcm9wZXJ0eVZhbHVlKCItbXMtdHJhbnNmb3JtIil8fHcuZ2V0UHJvcGVydHlWYWx1ZSgiLW8tdHJhbnNmb3JtIil8fHcuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIik7cmV0dXJuIHAodyl9O3ZhciBBPS9ebWF0cml4XCgoW14pXSspXCkkLyx5PS9bLCBdKy99LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHUseCl7cmV0dXJuW3VbMF0qeFswXSt1WzJdKnhbMV0sdVsxXSp4WzBdK3VbM10qeFsxXSx1WzBdKnhbMl0rdVsyXSp4WzNdLHVbMV0qeFsyXSt1WzNdKnhbM10sdVswXSp4WzRdK3VbMl0qeFs1XSt1WzRdLHVbMV0qeFs0XSt1WzNdKnhbNV0rdVs1XV19ZnVuY3Rpb24gdCh1LHgpe3JldHVyblt1WzBdLAp1WzFdLHVbMl0sdVszXSx1WzBdKnhbMF0rdVsyXSp4WzFdK3VbNF0sdVsxXSp4WzBdK3VbM10qeFsxXSt1WzVdXX1mdW5jdGlvbiBsKHUpe3ZhciB4PXVbMF0qdVszXS11WzFdKnVbMl07aWYoMD09PXgpdGhyb3cgRXJyb3IoInNpbmd1bGFyIG1hdHJpeCIpO3g9MS94O3JldHVyblt4KnVbM10seCotdVsxXSx4Ki11WzJdLHgqdVswXSx4KigtdVszXSp1WzRdK3VbMl0qdVs1XSkseCoodVsxXSp1WzRdKy11WzBdKnVbNV0pXX12YXIgcD1oKDEpLG09aCg1NSksbj1NYXRoLHE9WzEsMCwwLDEsMCwwXTtmLmluUmFuZ2U9ZnVuY3Rpb24odSx4LEEpe3JldHVybiBuLm1pbih4LEEpPD11JiZ1PD1uLm1heCh4LEEpfTtmLmNsYW1wPWZ1bmN0aW9uKHUseCxBKXtyZXR1cm4gbi5taW4obi5tYXgoeCx1KSxBKX07Zi5tYXg9ZnVuY3Rpb24odSx4LEEpe3ZhciB5PSJmdW5jdGlvbiI9PT10eXBlb2YgeD94Om51bGw7eD1udWxsPT15P3g6QTt1PW51bGw9PXk/cC5tYXgodSk6cC5tYXgodSx5KTtyZXR1cm4gdm9pZCAwIT09CnU/dTp4fTtmLm1pbj1mdW5jdGlvbih1LHgsQSl7dmFyIHk9ImZ1bmN0aW9uIj09PXR5cGVvZiB4P3g6bnVsbDt4PW51bGw9PXk/eDpBO3U9bnVsbD09eT9wLm1pbih1KTpwLm1pbih1LHkpO3JldHVybiB2b2lkIDAhPT11P3U6eH07Zi5pc05hTj1mdW5jdGlvbih1KXtyZXR1cm4gdSE9PXV9O2YuaXNWYWxpZE51bWJlcj1mdW5jdGlvbih1KXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiB1JiYxPnUtdX07Zi5yYW5nZT1mdW5jdGlvbih1LHgsQSl7dm9pZCAwPT09QSYmKEE9MSk7aWYoMD09PUEpdGhyb3cgRXJyb3IoInN0ZXAgY2Fubm90IGJlIDAiKTt4PW4ubWF4KG4uY2VpbCgoeC11KS9BKSwwKTtmb3IodmFyIHk9W10sdz0wO3c8eDsrK3cpeVt3XT11K0EqdztyZXR1cm4geX07Zi5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24odSx4KXtyZXR1cm4gbi5wb3coeC55LXUueSwyKStuLnBvdyh4LngtdS54LDIpfTtmLmRlZ3JlZXNUb1JhZGlhbnM9ZnVuY3Rpb24odSl7cmV0dXJuIHUvMzYwKgpuLlBJKjJ9O2Yud2l0aGluPWZ1bmN0aW9uKHUseCl7cmV0dXJuIHgudG9wTGVmdC54PD11LngmJnguYm90dG9tUmlnaHQueD49dS54JiZ4LnRvcExlZnQueTw9dS55JiZ4LmJvdHRvbVJpZ2h0Lnk+PXUueX07Zi5ib3VuZHNJbnRlcnNlY3RzPWZ1bmN0aW9uKHUseCxBLHksdyxDKXtyZXR1cm4gdTw9MCt3JiYwPD11K0EmJng8PTArQyYmMDw9eCt5fTtmLmdldEN1bXVsYXRpdmVUcmFuc2Zvcm09ZnVuY3Rpb24odSl7dT1tLmdldEh0bWxFbGVtZW50QW5jZXN0b3JzKHUpO2Zvcih2YXIgeD1xLEE9bnVsbCx5PTA7eTx1Lmxlbmd0aDt5Kyspe3ZhciB3PXVbeV0sQz1tLmdldEVsZW1lbnRUcmFuc2Zvcm0odyk7aWYobnVsbCE9Qyl7dmFyIEc9dy5jbGllbnRXaWR0aC8yLEQ9dy5jbGllbnRIZWlnaHQvMjt4PXQoeCxbRyxEXSk7eD1rKHgsbChDKSk7eD10KHgsWy1HLC1EXSl9Qz13LnNjcm9sbExlZnQ7Rz13LnNjcm9sbFRvcDtpZihudWxsPT09QXx8dz09PUEpQy09dy5vZmZzZXRMZWZ0K3cuY2xpZW50TGVmdCwKRy09dy5vZmZzZXRUb3Ardy5jbGllbnRUb3AsQT13Lm9mZnNldFBhcmVudDt4PXQoeCxbQyxHXSl9cmV0dXJuIHh9O2YubXVsdGlwbHlNYXRyaXg9aztmLnByZW11bHRpcGx5VHJhbnNsYXRlPWZ1bmN0aW9uKHUseCl7cmV0dXJuW3hbMF0seFsxXSx4WzJdLHhbM10seFs0XSt1WzBdLHhbNV0rdVsxXV19O2YubXVsdGlwbHlUcmFuc2xhdGU9dDtmLmludmVydE1hdHJpeD1sO2YuYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24odSx4KXtyZXR1cm57eDp1WzBdKngueCt1WzJdKngueSt1WzRdLHk6dVsxXSp4LngrdVszXSp4LnkrdVs1XX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9bmV3IChoKDExNCkuU3BsaXRTdHJhdGVneUxpbmVhcik7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIHAobSxuKXt2b2lkIDA9PT1tJiYobT01KTt2b2lkIDA9PT1uJiYobj1rKTt0aGlzLm1heE5vZGVDaGlsZHJlbj1tO3RoaXMuc3BsaXRTdHJhdGVneT1uO3RoaXMucm9vdD1uZXcgdCghMCk7dGhpcy5zaXplPTB9cC5wcm90b3R5cGUuZ2V0Um9vdD0KZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yb290fTtwLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMucm9vdD1uZXcgdCghMCk7dGhpcy5zaXplPTB9O3AucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbihtLG4pe2Zvcih2YXIgcT10aGlzLnJvb3Q7IXEubGVhZjspcT1xLnN1YnRyZWUobSk7bT10LnZhbHVlTm9kZShtLG4pO3EuaW5zZXJ0KG0pO2Zvcih0aGlzLnNpemUrPTE7cS5vdmVyZmxvdyh0aGlzLm1heE5vZGVDaGlsZHJlbik7KXE9cS5zcGxpdCh0aGlzLnNwbGl0U3RyYXRlZ3kpLG51bGw9PXEucGFyZW50JiYodGhpcy5yb290PXEpfTtwLnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMucXVlcnkoZnVuY3Rpb24obil7cmV0dXJuIG4uY29udGFpbnMobSl9KX07cC5wcm90b3R5cGUuaW50ZXJzZWN0PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcEJvdW5kcyhuLG0pfSl9O3AucHJvdG90eXBlLmludGVyc2VjdFg9CmZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcFgobixtKX0pfTtwLnByb3RvdHlwZS5pbnRlcnNlY3RZPWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBsLmlzQm91bmRzT3ZlcmxhcFkobixtKX0pfTtwLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbihtKXt2YXIgbj1bXTtpZihudWxsIT10aGlzLnJvb3QuYm91bmRzJiYhbSh0aGlzLnJvb3QuYm91bmRzKSlyZXR1cm4gbjtmb3IodmFyIHE9W3RoaXMucm9vdF07MDxxLmxlbmd0aDspZm9yKHZhciB1PXEuc2hpZnQoKSx4PTA7eDx1LmVudHJpZXMubGVuZ3RoO3grKyl7dmFyIEE9dS5lbnRyaWVzW3hdO20oQS5ib3VuZHMpJiYodS5sZWFmP24ucHVzaChBLnZhbHVlKTpxLnB1c2goQSkpfXJldHVybiBufTtyZXR1cm4gcH0oKTtmLlJUcmVlPWQ7dmFyIHQ9ZnVuY3Rpb24oKXtmdW5jdGlvbiBwKG0pe3RoaXMubGVhZj1tO3RoaXMuYm91bmRzPQpudWxsO3RoaXMuZW50cmllcz1bXTt0aGlzLnZhbHVlPXRoaXMucGFyZW50PW51bGx9cC52YWx1ZU5vZGU9ZnVuY3Rpb24obSxuKXt2YXIgcT1uZXcgcCghMCk7cS5ib3VuZHM9bTtxLnZhbHVlPW47cmV0dXJuIHF9O3AucHJvdG90eXBlLm92ZXJmbG93PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoPm19O3AucHJvdG90eXBlLmluc2VydD1mdW5jdGlvbihtKXt0aGlzLmVudHJpZXMucHVzaChtKTttLnBhcmVudD10aGlzO2Zvcih2YXIgbj10aGlzO251bGwhPW47KW4uYm91bmRzPWwudW5pb25BbGwoW24uYm91bmRzLG0uYm91bmRzXSksbj1uLnBhcmVudH07cC5wcm90b3R5cGUucmVtb3ZlPWZ1bmN0aW9uKG0pe209dGhpcy5lbnRyaWVzLmluZGV4T2YobSk7aWYoMDw9bSlmb3IodGhpcy5lbnRyaWVzLnNwbGljZShtLDEpLG09dGhpcztudWxsIT1tOyltLmJvdW5kcz1sLnVuaW9uQWxsKG0uZW50cmllcy5tYXAoZnVuY3Rpb24obil7cmV0dXJuIG4uYm91bmRzfSkpLAptPW0ucGFyZW50O3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5zdWJ0cmVlPWZ1bmN0aW9uKG0pe2Zvcih2YXIgbj1udWxsLHE9MDtxPHRoaXMuZW50cmllcy5sZW5ndGg7cSsrKXt2YXIgdT10aGlzLmVudHJpZXNbcV0seD11LnVuaW9uQXJlYURpZmZlcmVuY2UobSk7aWYoSW5maW5pdHk+eHx8SW5maW5pdHk9PT14JiZudWxsIT1uJiZ1LmVudHJpZXMubGVuZ3RoPG4uZW50cmllcy5sZW5ndGgpbj11fXJldHVybiBufTtwLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbihtKXtudWxsIT10aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmVtb3ZlKHRoaXMpO3ZhciBuPVtuZXcgcCh0aGlzLmxlYWYpLG5ldyBwKHRoaXMubGVhZildO20uc3BsaXQodGhpcy5lbnRyaWVzLG4pO209bnVsbCE9dGhpcy5wYXJlbnQ/dGhpcy5wYXJlbnQ6bmV3IHAoITEpO20uaW5zZXJ0KG5bMF0pO20uaW5zZXJ0KG5bMV0pO3JldHVybiBtfTtwLnByb3RvdHlwZS51bmlvbkFyZWFEaWZmZXJlbmNlPWZ1bmN0aW9uKG0pe3JldHVybiBNYXRoLmFicyhsLnVuaW9uKHRoaXMuYm91bmRzLAptKS5hcmVhKCktdGhpcy5ib3VuZHMuYXJlYSgpKX07cC5wcm90b3R5cGUubWF4RGVwdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5sZWFmPzE6MSt0aGlzLmVudHJpZXMubWFwKGZ1bmN0aW9uKG0pe3JldHVybiBtLm1heERlcHRoKCl9KS5yZWR1Y2UoZnVuY3Rpb24obSxuKXtyZXR1cm4gTWF0aC5tYXgobSxuKX0pfTtyZXR1cm4gcH0oKTtmLlJUcmVlTm9kZT10O3ZhciBsPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcChtLG4scSx1KXt0aGlzLnhsPW07dGhpcy55bD1uO3RoaXMueGg9cTt0aGlzLnloPXU7dGhpcy53aWR0aD10aGlzLnhoLXRoaXMueGw7dGhpcy5oZWlnaHQ9dGhpcy55aC10aGlzLnlsfXAueHl3aD1mdW5jdGlvbihtLG4scSx1KXtyZXR1cm4gbmV3IHAobSxuLG0rcSxuK3UpfTtwLmVudGl0eUJvdW5kcz1mdW5jdGlvbihtKXtyZXR1cm4gbmV3IHAobS54LG0ueSxtLngrbS53aWR0aCxtLnkrbS5oZWlnaHQpfTtwLmJvdW5kcz1mdW5jdGlvbihtKXtyZXR1cm4gcC5wb2ludFBhaXIobS50b3BMZWZ0LAptLmJvdHRvbVJpZ2h0KX07cC5wb2ludFBhaXI9ZnVuY3Rpb24obSxuKXtyZXR1cm4gbmV3IHAoTWF0aC5taW4obS54LG4ueCksTWF0aC5taW4obS55LG4ueSksTWF0aC5tYXgobS54LG4ueCksTWF0aC5tYXgobS55LG4ueSkpfTtwLnBvaW50cz1mdW5jdGlvbihtKXtpZigyPm0ubGVuZ3RoKXRocm93IEVycm9yKCJuZWVkIGF0IGxlYXN0IDIgcG9pbnRzIHRvIGNyZWF0ZSBib3VuZHMiKTt2YXIgbj1tLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gcS54fSk7bT1tLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gcS55fSk7cmV0dXJuIG5ldyBwKG4ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWluKHEsdSl9KSxtLnJlZHVjZShmdW5jdGlvbihxLHUpe3JldHVybiBNYXRoLm1pbihxLHUpfSksbi5yZWR1Y2UoZnVuY3Rpb24ocSx1KXtyZXR1cm4gTWF0aC5tYXgocSx1KX0pLG0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWF4KHEsdSl9KSl9O3AudW5pb249ZnVuY3Rpb24obSwKbil7cmV0dXJuIG5ldyBwKE1hdGgubWluKG0ueGwsbi54bCksTWF0aC5taW4obS55bCxuLnlsKSxNYXRoLm1heChtLnhoLG4ueGgpLE1hdGgubWF4KG0ueWgsbi55aCkpfTtwLnVuaW9uQWxsPWZ1bmN0aW9uKG0pe209bS5maWx0ZXIoZnVuY3Rpb24obil7cmV0dXJuIG51bGwhPW59KTtyZXR1cm4gMD09PW0ubGVuZ3RoP251bGw6bS5yZWR1Y2UoZnVuY3Rpb24obixxKXtyZXR1cm4gcC51bmlvbihuLHEpfSl9O3AuaXNCb3VuZHNPdmVybGFwQm91bmRzPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHAuaXNCb3VuZHNPdmVybGFwWChtLG4pJiZwLmlzQm91bmRzT3ZlcmxhcFkobSxuKX07cC5pc0JvdW5kc092ZXJsYXBYPWZ1bmN0aW9uKG0sbil7cmV0dXJuIShtLnhoPG4ueGwpJiYhKG0ueGw+bi54aCl9O3AuaXNCb3VuZHNPdmVybGFwWT1mdW5jdGlvbihtLG4pe3JldHVybiEobS55aDxuLnlsKSYmIShtLnlsPm4ueWgpfTtwLnByb3RvdHlwZS5hcmVhPWZ1bmN0aW9uKCl7bnVsbD09dGhpcy5hcmVhQ2FjaGVkJiYKKHRoaXMuYXJlYUNhY2hlZD0odGhpcy54aC10aGlzLnhsKSoodGhpcy55aC10aGlzLnlsKSk7cmV0dXJuIHRoaXMuYXJlYUNhY2hlZH07cC5wcm90b3R5cGUuY29udGFpbnM9ZnVuY3Rpb24obSl7cmV0dXJuIHRoaXMueGw8PW0ueCYmdGhpcy54aD49bS54JiZ0aGlzLnlsPD1tLnkmJnRoaXMueWg+PW0ueX07cmV0dXJuIHB9KCk7Zi5SVHJlZUJvdW5kcz1sfSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKCl7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuU2V0P3RoaXMuX2VzNlNldD1uZXcgd2luZG93LlNldDp0aGlzLl92YWx1ZXM9W107dGhpcy5zaXplPTB9aC5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGspe2lmKG51bGwhPXRoaXMuX2VzNlNldClyZXR1cm4gdGhpcy5fZXM2U2V0LmFkZChrKSx0aGlzLnNpemU9dGhpcy5fZXM2U2V0LnNpemUsdGhpczt0aGlzLmhhcyhrKXx8KHRoaXMuX3ZhbHVlcy5wdXNoKGspLHRoaXMuc2l6ZT10aGlzLl92YWx1ZXMubGVuZ3RoKTsKcmV0dXJuIHRoaXN9O2gucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihrKXtpZihudWxsIT10aGlzLl9lczZTZXQpcmV0dXJuIGs9dGhpcy5fZXM2U2V0LmRlbGV0ZShrKSx0aGlzLnNpemU9dGhpcy5fZXM2U2V0LnNpemUsaztrPXRoaXMuX3ZhbHVlcy5pbmRleE9mKGspO3JldHVybi0xIT09az8odGhpcy5fdmFsdWVzLnNwbGljZShrLDEpLHRoaXMuc2l6ZT10aGlzLl92YWx1ZXMubGVuZ3RoLCEwKTohMX07aC5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKGspe3JldHVybiBudWxsIT10aGlzLl9lczZTZXQ/dGhpcy5fZXM2U2V0LmhhcyhrKTotMSE9PXRoaXMuX3ZhbHVlcy5pbmRleE9mKGspfTtoLnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKGssdCl7dmFyIGw9dGhpcztudWxsIT10aGlzLl9lczZTZXQ/dGhpcy5fZXM2U2V0LmZvckVhY2goZnVuY3Rpb24ocCxtKXtyZXR1cm4gay5jYWxsKHQscCxtLGwpfSx0KTp0aGlzLl92YWx1ZXMuZm9yRWFjaChmdW5jdGlvbihwKXtrLmNhbGwodCwKcCxwLGwpfSl9O3JldHVybiBofSgpO2YuU2V0PWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCgxMzEpKTtrKGgoMTMwKSl9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obCxwKXtmdW5jdGlvbiBtKCl7dGhpcy5jb25zdHJ1Y3Rvcj1sfWZvcih2YXIgbiBpbiBwKXAuaGFzT3duUHJvcGVydHkobikmJihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX0sdD1oKDIxKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXt2YXIgcT1sLmNhbGwodGhpcyxtLG4pfHx0aGlzO3EuY2FjaGU9bmV3IHQuQ2FjaGUoZnVuY3Rpb24odSl7cmV0dXJuIHEuX21lYXN1cmVDaGFyYWN0ZXJOb3RGcm9tQ2FjaGUodSl9KTtyZXR1cm4gcX1rKHAsbCk7cC5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXJOb3RGcm9tQ2FjaGU9CmZ1bmN0aW9uKG0pe3JldHVybiBsLnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlci5jYWxsKHRoaXMsbSl9O3AucHJvdG90eXBlLl9tZWFzdXJlQ2hhcmFjdGVyPWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLmNhY2hlLmdldChtKX07cC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmNhY2hlLmNsZWFyKCl9O3JldHVybiBwfShoKDYxKS5DaGFyYWN0ZXJNZWFzdXJlcik7Zi5DYWNoZUNoYXJhY3Rlck1lYXN1cmVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odCxsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJih0W21dPWxbbV0pO3QucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBsKCl7cmV0dXJuIHQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHwKdGhpc31rKGwsdCk7bC5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXI9ZnVuY3Rpb24ocCl7cmV0dXJuIHQucHJvdG90eXBlLl9tZWFzdXJlTGluZS5jYWxsKHRoaXMscCl9O2wucHJvdG90eXBlLl9tZWFzdXJlTGluZT1mdW5jdGlvbihwKXt2YXIgbT10aGlzO3A9cC5zcGxpdCgiIikubWFwKGZ1bmN0aW9uKG4pe3JldHVybiBtLl9tZWFzdXJlQ2hhcmFjdGVyKG4pfSk7cmV0dXJue2hlaWdodDpwLnJlZHVjZShmdW5jdGlvbihuLHEpe3JldHVybiBNYXRoLm1heChuLHEuaGVpZ2h0KX0sMCksd2lkdGg6cC5yZWR1Y2UoZnVuY3Rpb24obixxKXtyZXR1cm4gbitxLndpZHRofSwwKX19O3JldHVybiBsfShoKDYzKS5NZWFzdXJlcik7Zi5DaGFyYWN0ZXJNZWFzdXJlcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayh0KXtmb3IodmFyIGwgaW4gdClmLmhhc093blByb3BlcnR5KGwpfHwoZltsXT10W2xdKX1rKGgoMzYpKTtrKGgoNjApKTtrKGgoMTMyKSk7ayhoKDYxKSk7ayhoKDYzKSl9LApmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgzNik7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0sbil7dm9pZCAwPT09biYmKG49ITEpO209bC5jYWxsKHRoaXMsbSl8fHRoaXM7bS51c2VHdWFyZHM9bjtyZXR1cm4gbX1rKHAsbCk7cC5wcm90b3R5cGUuX2FkZEd1YXJkcz1mdW5jdGlvbihtKXtyZXR1cm4gdC5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUK20rdC5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUfTtwLnByb3RvdHlwZS5fbWVhc3VyZUxpbmU9ZnVuY3Rpb24obSl7dmFyIG47dm9pZCAwPT09biYmKG49ITEpO249dGhpcy51c2VHdWFyZHN8fApufHwvXltcdCBdJC8udGVzdChtKTttPWwucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLG4/dGhpcy5fYWRkR3VhcmRzKG0pOm0pO20ud2lkdGgtPW4/Mip0aGlzLmdldEd1YXJkV2lkdGgoKTowO3JldHVybiBtfTtwLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKG0pe3ZhciBuPXRoaXM7dm9pZCAwPT09bSYmKG09dC5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUKTtpZigiIj09PW0udHJpbSgpKXJldHVybnt3aWR0aDowLGhlaWdodDowfTttPW0udHJpbSgpLnNwbGl0KCJcbiIpLm1hcChmdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUxpbmUocSl9KTtyZXR1cm57aGVpZ2h0Om0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIHErdS5oZWlnaHR9LDApLHdpZHRoOm0ucmVkdWNlKGZ1bmN0aW9uKHEsdSl7cmV0dXJuIE1hdGgubWF4KHEsdS53aWR0aCl9LDApfX07cC5wcm90b3R5cGUuZ2V0R3VhcmRXaWR0aD1mdW5jdGlvbigpe251bGw9PXRoaXMuZ3VhcmRXaWR0aCYmCih0aGlzLmd1YXJkV2lkdGg9bC5wcm90b3R5cGUubWVhc3VyZS5jYWxsKHRoaXMpLndpZHRoKTtyZXR1cm4gdGhpcy5ndWFyZFdpZHRofTtyZXR1cm4gcH0odC5BYnN0cmFjdE1lYXN1cmVyKTtmLk1lYXN1cmVyPWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCgxMzgpKTtrKGgoNjUpKX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMjEpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5tYXhMaW5lcyhJbmZpbml0eSk7dGhpcy50ZXh0VHJpbW1pbmcoKTt0aGlzLmFsbG93QnJlYWtpbmdXb3JkcygpO3RoaXMuX3Rva2VuaXplcj1uZXcgay5Ub2tlbml6ZXI7dGhpcy5fYnJlYWtpbmdDaGFyYWN0ZXI9Ii0ifXQucHJvdG90eXBlLm1heExpbmVzPWZ1bmN0aW9uKGwpe2lmKG51bGw9PWwpcmV0dXJuIHRoaXMuX21heExpbmVzO3RoaXMuX21heExpbmVzPWw7cmV0dXJuIHRoaXN9Owp0LnByb3RvdHlwZS50ZXh0VHJpbW1pbmc9ZnVuY3Rpb24oKXt0aGlzLl90ZXh0VHJpbW1pbmc9ImVsbGlwc2lzIn07dC5wcm90b3R5cGUuYWxsb3dCcmVha2luZ1dvcmRzPWZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dCcmVha2luZ1dvcmRzPSEwfTt0LnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKGwscCxtLG4pe3ZhciBxPXRoaXM7dm9pZCAwPT09biYmKG49SW5maW5pdHkpO3ZhciB1PXtub0Jyb2tlV29yZHM6MCxub0xpbmVzOjAsb3JpZ2luYWxUZXh0OmwsdHJ1bmNhdGVkVGV4dDoiIix3cmFwcGVkVGV4dDoiIn07bT17YXZhaWxhYmxlTGluZXM6TWF0aC5taW4oTWF0aC5mbG9vcihuL3AubWVhc3VyZSgpLmhlaWdodCksdGhpcy5fbWF4TGluZXMpLGF2YWlsYWJsZVdpZHRoOm0sY2FuRml0VGV4dDohMCxjdXJyZW50TGluZToiIix3cmFwcGluZzp1fTt2YXIgeD1sLnNwbGl0KCJcbiIpO3JldHVybiB4LnJlZHVjZShmdW5jdGlvbihBLHksdyl7cmV0dXJuIHEuYnJlYWtMaW5lVG9GaXRXaWR0aChBLAp5LHchPT14Lmxlbmd0aC0xLHApfSxtKS53cmFwcGluZ307dC5wcm90b3R5cGUuYnJlYWtMaW5lVG9GaXRXaWR0aD1mdW5jdGlvbihsLHAsbSxuKXt2YXIgcT10aGlzO2wuY2FuRml0VGV4dHx8IiI9PT1sLndyYXBwaW5nLnRydW5jYXRlZFRleHR8fChsLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPSJcbiIpO2w9dGhpcy5fdG9rZW5pemVyLnRva2VuaXplKHApLnJlZHVjZShmdW5jdGlvbih1LHgpe3JldHVybiBxLndyYXBOZXh0VG9rZW4oeCx1LG4pfSxsKTtwPWsuU3RyaW5nTWV0aG9kcy50cmltRW5kKGwuY3VycmVudExpbmUpO2wud3JhcHBpbmcubm9MaW5lcys9KygiIiE9PXApO2wud3JhcHBpbmcubm9MaW5lcz09PWwuYXZhaWxhYmxlTGluZXMmJiJub25lIiE9PXRoaXMuX3RleHRUcmltbWluZyYmbT9sLmNhbkZpdFRleHQ9ITE6bC53cmFwcGluZy53cmFwcGVkVGV4dCs9cDtsLmN1cnJlbnRMaW5lPSJcbiI7cmV0dXJuIGx9O3QucHJvdG90eXBlLmNhbkZpdFRva2VuPWZ1bmN0aW9uKGwsCnAsbSl7dmFyIG49dGhpcyxxPXRoaXMuX2FsbG93QnJlYWtpbmdXb3Jkcz9sLnNwbGl0KCIiKS5tYXAoZnVuY3Rpb24odSx4KXtyZXR1cm4geCE9PWwubGVuZ3RoLTE/dStuLl9icmVha2luZ0NoYXJhY3Rlcjp1fSk6W2xdO3JldHVybiBtLm1lYXN1cmUobCkud2lkdGg8PXB8fHEuZXZlcnkoZnVuY3Rpb24odSl7cmV0dXJuIG0ubWVhc3VyZSh1KS53aWR0aDw9cH0pfTt0LnByb3RvdHlwZS5hZGRFbGxpcHNpcz1mdW5jdGlvbihsLHAsbSl7aWYoIm5vbmUiPT09dGhpcy5fdGV4dFRyaW1taW5nKXJldHVybntyZW1haW5pbmdUb2tlbjoiIix3cmFwcGVkVG9rZW46bH07dmFyIG49bC5zdWJzdHJpbmcoMCkudHJpbSgpLHE9bS5tZWFzdXJlKG4pLndpZHRoLHU9bS5tZWFzdXJlKCIuLi4iKS53aWR0aCx4PTA8bC5sZW5ndGgmJiJcbiI9PT1sWzBdPyJcbiI6IiI7aWYocDw9dSlyZXR1cm57cmVtYWluaW5nVG9rZW46bCx3cmFwcGVkVG9rZW46eCsiLi4uIi5zdWJzdHIoMCxNYXRoLmZsb29yKHAvCih1LzMpKSl9O2Zvcig7cSt1PnA7KW49ay5TdHJpbmdNZXRob2RzLnRyaW1FbmQobi5zdWJzdHIoMCxuLmxlbmd0aC0xKSkscT1tLm1lYXN1cmUobikud2lkdGg7cmV0dXJue3JlbWFpbmluZ1Rva2VuOmsuU3RyaW5nTWV0aG9kcy50cmltRW5kKGwuc3Vic3RyaW5nKG4ubGVuZ3RoKSwiLSIpLnRyaW0oKSx3cmFwcGVkVG9rZW46eCtuKyIuLi4ifX07dC5wcm90b3R5cGUud3JhcE5leHRUb2tlbj1mdW5jdGlvbihsLHAsbSl7aWYoIXAuY2FuRml0VGV4dHx8cC5hdmFpbGFibGVMaW5lcz09PXAud3JhcHBpbmcubm9MaW5lc3x8IXRoaXMuY2FuRml0VG9rZW4obCxwLmF2YWlsYWJsZVdpZHRoLG0pKXJldHVybiB0aGlzLmZpbmlzaFdyYXBwaW5nKGwscCxtKTtmb3IoO2w7KXt2YXIgbj10aGlzLmJyZWFrVG9rZW5Ub0ZpdEluV2lkdGgobCxwLmN1cnJlbnRMaW5lLHAuYXZhaWxhYmxlV2lkdGgsbSk7cC5jdXJyZW50TGluZT1uLmxpbmU7bD1uLnJlbWFpbmluZ1Rva2VuO2lmKG51bGwhPWwpaWYocC53cmFwcGluZy5ub0Jyb2tlV29yZHMrPQorbi5icmVha1dvcmQsKytwLndyYXBwaW5nLm5vTGluZXMscC5hdmFpbGFibGVMaW5lcz09PXAud3JhcHBpbmcubm9MaW5lcyl7bT10aGlzLmFkZEVsbGlwc2lzKHAuY3VycmVudExpbmUscC5hdmFpbGFibGVXaWR0aCxtKTtwLndyYXBwaW5nLndyYXBwZWRUZXh0Kz1tLndyYXBwZWRUb2tlbjtwLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPW0ucmVtYWluaW5nVG9rZW4rbDtwLmN1cnJlbnRMaW5lPSJcbiI7YnJlYWt9ZWxzZSBwLndyYXBwaW5nLndyYXBwZWRUZXh0Kz1rLlN0cmluZ01ldGhvZHMudHJpbUVuZChwLmN1cnJlbnRMaW5lKSxwLmN1cnJlbnRMaW5lPSJcbiJ9cmV0dXJuIHB9O3QucHJvdG90eXBlLmZpbmlzaFdyYXBwaW5nPWZ1bmN0aW9uKGwscCxtKXtwLmNhbkZpdFRleHQmJnAuYXZhaWxhYmxlTGluZXMhPT1wLndyYXBwaW5nLm5vTGluZXMmJnRoaXMuX2FsbG93QnJlYWtpbmdXb3JkcyYmIm5vbmUiIT09dGhpcy5fdGV4dFRyaW1taW5nPyhtPXRoaXMuYWRkRWxsaXBzaXMocC5jdXJyZW50TGluZSsKbCxwLmF2YWlsYWJsZVdpZHRoLG0pLHAud3JhcHBpbmcud3JhcHBlZFRleHQrPW0ud3JhcHBlZFRva2VuLHAud3JhcHBpbmcudHJ1bmNhdGVkVGV4dCs9bS5yZW1haW5pbmdUb2tlbixwLndyYXBwaW5nLm5vQnJva2VXb3Jkcys9KyhtLnJlbWFpbmluZ1Rva2VuLmxlbmd0aDxsLmxlbmd0aCkscC53cmFwcGluZy5ub0xpbmVzKz0rKDA8bS53cmFwcGVkVG9rZW4ubGVuZ3RoKSxwLmN1cnJlbnRMaW5lPSIiKTpwLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPWw7cC5jYW5GaXRUZXh0PSExO3JldHVybiBwfTt0LnByb3RvdHlwZS5icmVha1Rva2VuVG9GaXRJbldpZHRoPWZ1bmN0aW9uKGwscCxtLG4pe2lmKHZvaWQgMD09PXEpdmFyIHE9dGhpcy5fYnJlYWtpbmdDaGFyYWN0ZXI7aWYobi5tZWFzdXJlKHArbCkud2lkdGg8PW0pcmV0dXJue2JyZWFrV29yZDohMSxsaW5lOnArbCxyZW1haW5pbmdUb2tlbjpudWxsfTtpZigiIj09PWwudHJpbSgpKXJldHVybnticmVha1dvcmQ6ITEsbGluZTpwLApyZW1haW5pbmdUb2tlbjoiIn07aWYoIXRoaXMuX2FsbG93QnJlYWtpbmdXb3JkcylyZXR1cm57YnJlYWtXb3JkOiExLGxpbmU6cCxyZW1haW5pbmdUb2tlbjpsfTtmb3IodmFyIHU9MDt1PGwubGVuZ3RoOylpZihuLm1lYXN1cmUocCtsLnN1YnN0cmluZygwLHUrMSkrcSkud2lkdGg8PW0pKyt1O2Vsc2UgYnJlYWs7bT0iIjswPHUmJihtPXEpO3JldHVybnticmVha1dvcmQ6MDx1LGxpbmU6cCtsLnN1YnN0cmluZygwLHUpK20scmVtYWluaW5nVG9rZW46bC5zdWJzdHJpbmcodSl9fTtyZXR1cm4gdH0oKTtmLldyYXBwZXI9ZH0sZnVuY3Rpb24oZCxmLGgpeyhmdW5jdGlvbihrKXtmb3IodmFyIHQgaW4gaylmLmhhc093blByb3BlcnR5KHQpfHwoZlt0XT1rW3RdKX0pKGgoMTM5KSl9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHQpe2Zvcih2YXIgbCBpbiB0KWYuaGFzT3duUHJvcGVydHkobCl8fChmW2xdPXRbbF0pfWsoaCg3MikpO2soaCg3MykpO2soaCgyOCkpfSxmdW5jdGlvbihkLApmKXtmLnZlcnNpb249IjMuNy4wIn0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodyxDKXtyZXR1cm4gdy5lYWNoKGZ1bmN0aW9uKCl7dmFyIEc9Qy5hcHBseSh0aGlzLGFyZ3VtZW50cyksRD15LnNlbGVjdCh0aGlzKSxCO2ZvcihCIGluIEcpRC5hdHRyKEIsR1tCXSl9KX1mdW5jdGlvbiB0KHcsQyl7Zm9yKHZhciBHIGluIEMpdy5hdHRyKEcsQ1tHXSk7cmV0dXJuIHd9ZnVuY3Rpb24gbCh3LEMsRyl7cmV0dXJuIHcuZWFjaChmdW5jdGlvbigpe3ZhciBEPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEI9eS5zZWxlY3QodGhpcyksSTtmb3IoSSBpbiBEKUIuc3R5bGUoSSxEW0ldLEcpfSl9ZnVuY3Rpb24gcCh3LEMsRyl7Zm9yKHZhciBEIGluIEMpdy5zdHlsZShELENbRF0sRyk7cmV0dXJuIHd9ZnVuY3Rpb24gbSh3LEMpe3JldHVybiB3LmVhY2goZnVuY3Rpb24oKXt2YXIgRz1DLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxEPXkuc2VsZWN0KHRoaXMpLEI7Zm9yKEIgaW4gRylELnByb3BlcnR5KEIsCkdbQl0pfSl9ZnVuY3Rpb24gbih3LEMpe2Zvcih2YXIgRyBpbiBDKXcucHJvcGVydHkoRyxDW0ddKTtyZXR1cm4gd31mdW5jdGlvbiBxKHcsQyl7cmV0dXJuIHcuZWFjaChmdW5jdGlvbigpe3ZhciBHPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEQ9eS5zZWxlY3QodGhpcykudHJhbnNpdGlvbih3KSxCO2ZvcihCIGluIEcpRC5hdHRyKEIsR1tCXSl9KX1mdW5jdGlvbiB1KHcsQyl7Zm9yKHZhciBHIGluIEMpdy5hdHRyKEcsQ1tHXSk7cmV0dXJuIHd9ZnVuY3Rpb24geCh3LEMsRyl7cmV0dXJuIHcuZWFjaChmdW5jdGlvbigpe3ZhciBEPUMuYXBwbHkodGhpcyxhcmd1bWVudHMpLEI9eS5zZWxlY3QodGhpcykudHJhbnNpdGlvbih3KSxJO2ZvcihJIGluIEQpQi5zdHlsZShJLERbSV0sRyl9KX1mdW5jdGlvbiBBKHcsQyxHKXtmb3IodmFyIEQgaW4gQyl3LnN0eWxlKEQsQ1tEXSxHKTtyZXR1cm4gd312YXIgeT1kPWgoMSk7eS5zZWxlY3Rpb24ucHJvdG90eXBlLmF0dHJzPWZ1bmN0aW9uKHcpe3JldHVybigiZnVuY3Rpb24iPT09CnR5cGVvZiB3P2s6dCkodGhpcyx3KX07eS5zZWxlY3Rpb24ucHJvdG90eXBlLnN0eWxlcz1mdW5jdGlvbih3KXtyZXR1cm4oImZ1bmN0aW9uIj09PXR5cGVvZiB3P2w6cCkodGhpcyx3LCIiKX07eS5zZWxlY3Rpb24ucHJvdG90eXBlLnByb3BlcnRpZXM9ZnVuY3Rpb24odyl7cmV0dXJuKCJmdW5jdGlvbiI9PT10eXBlb2Ygdz9tOm4pKHRoaXMsdyl9O2QudHJhbnNpdGlvbi5wcm90b3R5cGUuYXR0cnM9ZnVuY3Rpb24odyl7cmV0dXJuKCJmdW5jdGlvbiI9PT10eXBlb2Ygdz9xOnUpKHRoaXMsdyl9O2QudHJhbnNpdGlvbi5wcm90b3R5cGUuc3R5bGVzPWZ1bmN0aW9uKHcpe3JldHVybigiZnVuY3Rpb24iPT09dHlwZW9mIHc/eDpBKSh0aGlzLHcsIiIpfX0sZnVuY3Rpb24oZCxmLGgpe2Q9aCgxMTcpO3ZhciBrPWgoMTIpO2g9aCgxMCk7dmFyIHQ9e2xpbmVhcjpkLmVhc2VMaW5lYXIscXVhZDpkLmVhc2VRdWFkLHF1YWRJbjpkLmVhc2VRdWFkSW4scXVhZE91dDpkLmVhc2VRdWFkT3V0LApxdWFkSW5PdXQ6ZC5lYXNlUXVhZEluT3V0LGN1YmljOmQuZWFzZUN1YmljLGN1YmljSW46ZC5lYXNlQ3ViaWNJbixjdWJpY091dDpkLmVhc2VDdWJpY091dCxjdWJpY0luT3V0OmQuZWFzZUN1YmljSW5PdXQscG9seTpkLmVhc2VQb2x5LHBvbHlJbjpkLmVhc2VQb2x5SW4scG9seU91dDpkLmVhc2VQb2x5T3V0LHBvbHlJbk91dDpkLmVhc2VQb2x5SW5PdXQsc2luOmQuZWFzZVNpbixzaW5JbjpkLmVhc2VTaW5JbixzaW5PdXQ6ZC5lYXNlU2luT3V0LHNpbkluT3V0OmQuZWFzZVNpbkluT3V0LGV4cDpkLmVhc2VFeHAsZXhwSW46ZC5lYXNlRXhwSW4sZXhwT3V0OmQuZWFzZUV4cE91dCxleHBJbk91dDpkLmVhc2VFeHBJbk91dCxjaXJjbGU6ZC5lYXNlQ2lyY2xlLGNpcmNsZUluOmQuZWFzZUNpcmNsZUluLGNpcmNsZU91dDpkLmVhc2VDaXJjbGVPdXQsY2lyY2xlSW5PdXQ6ZC5lYXNlQ2lyY2xlSW5PdXQsYm91bmNlOmQuZWFzZUJvdW5jZSxib3VuY2VJbjpkLmVhc2VCb3VuY2VJbixib3VuY2VPdXQ6ZC5lYXNlQm91bmNlT3V0LApib3VuY2VJbk91dDpkLmVhc2VCb3VuY2VJbk91dCxiYWNrOmQuZWFzZUJhY2ssYmFja0luOmQuZWFzZUJhY2tJbixiYWNrT3V0OmQuZWFzZUJhY2tPdXQsYmFja0luT3V0OmQuZWFzZUJhY2tJbk91dCxlbGFzdGljOmQuZWFzZUVsYXN0aWMsZWxhc3RpY0luOmQuZWFzZUVsYXN0aWNJbixlbGFzdGljT3V0OmQuZWFzZUVsYXN0aWNPdXQsZWxhc3RpY0luT3V0OmQuZWFzZUVsYXN0aWNJbk91dH07Zi5FYXNlTmFtZT1oLm1ha2VFbnVtKCJsaW5lYXIgcXVhZCBxdWFkSW4gcXVhZE91dCBxdWFkSW5PdXQgY3ViaWMgY3ViaWNJbiBjdWJpY091dCBjdWJpY0luT3V0IHBvbHkgcG9seUluIHBvbHlPdXQgcG9seUluT3V0IHNpbiBzaW5JbiBzaW5PdXQgc2luSW5PdXQgZXhwIGV4cEluIGV4cE91dCBleHBJbk91dCBjaXJjbGUgY2lyY2xlSW4gY2lyY2xlT3V0IGNpcmNsZUluT3V0IGJvdW5jZSBib3VuY2VJbiBib3VuY2VPdXQgYm91bmNlSW5PdXQgYmFjayBiYWNrSW4gYmFja091dCBiYWNrSW5PdXQgZWxhc3RpYyBlbGFzdGljSW4gZWxhc3RpY091dCBlbGFzdGljSW5PdXQiLnNwbGl0KCIgIikpOwpoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gbCgpe3RoaXMuX3N0YXJ0RGVsYXk9bC5fREVGQVVMVF9TVEFSVF9ERUxBWV9NSUxMSVNFQ09ORFM7dGhpcy5fc3RlcER1cmF0aW9uPWwuX0RFRkFVTFRfU1RFUF9EVVJBVElPTl9NSUxMSVNFQ09ORFM7dGhpcy5fc3RlcERlbGF5PWwuX0RFRkFVTFRfSVRFUkFUSVZFX0RFTEFZX01JTExJU0VDT05EUzt0aGlzLl9tYXhUb3RhbER1cmF0aW9uPWwuX0RFRkFVTFRfTUFYX1RPVEFMX0RVUkFUSU9OX01JTExJU0VDT05EUzt0aGlzLl9lYXNpbmdNb2RlPWwuX0RFRkFVTFRfRUFTSU5HX01PREV9bC5wcm90b3R5cGUudG90YWxUaW1lPWZ1bmN0aW9uKHApe3ZhciBtPXRoaXMuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkocCk7cmV0dXJuIHRoaXMuc3RhcnREZWxheSgpK20qTWF0aC5tYXgocC0xLDApK3RoaXMuc3RlcER1cmF0aW9uKCl9O2wucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24ocCxtKXt2YXIgbj10aGlzO3A9ay5jb2VyY2VFeHRlcm5hbEQzKHApOwp2YXIgcT1wLnNpemUoKSx1PXRoaXMuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkocSk7cmV0dXJuIHAudHJhbnNpdGlvbigpLmVhc2UodGhpcy5fZ2V0RWFzZUZhY3RvcnkoKSkuZHVyYXRpb24odGhpcy5zdGVwRHVyYXRpb24oKSkuZGVsYXkoZnVuY3Rpb24oeCxBKXtyZXR1cm4gbi5zdGFydERlbGF5KCkrdSpBfSkuYXR0cnMobSl9O2wucHJvdG90eXBlLnN0YXJ0RGVsYXk9ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdGhpcy5fc3RhcnREZWxheTt0aGlzLl9zdGFydERlbGF5PXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnN0ZXBEdXJhdGlvbj1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiBNYXRoLm1pbih0aGlzLl9zdGVwRHVyYXRpb24sdGhpcy5fbWF4VG90YWxEdXJhdGlvbik7dGhpcy5fc3RlcER1cmF0aW9uPXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnN0ZXBEZWxheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdGVwRGVsYXl9O2wucHJvdG90eXBlLm1heFRvdGFsRHVyYXRpb249CmZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX21heFRvdGFsRHVyYXRpb247dGhpcy5fbWF4VG90YWxEdXJhdGlvbj1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5lYXNpbmdNb2RlPWZ1bmN0aW9uKHApe2lmKG51bGw9PXApcmV0dXJuIHRoaXMuX2Vhc2luZ01vZGU7dGhpcy5fZWFzaW5nTW9kZT1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS5fZ2V0RWFzZUZhY3Rvcnk9ZnVuY3Rpb24oKXt2YXIgcD10aGlzLmVhc2luZ01vZGUoKTtyZXR1cm4ic3RyaW5nIj09PXR5cGVvZiBwPyhwPXRbcF0sbnVsbD09cD90LmxpbmVhcjpwKTpwfTtsLnByb3RvdHlwZS5fZ2V0QWRqdXN0ZWRJdGVyYXRpdmVEZWxheT1mdW5jdGlvbihwKXt2YXIgbT10aGlzLm1heFRvdGFsRHVyYXRpb24oKS10aGlzLnN0ZXBEdXJhdGlvbigpO209TWF0aC5tYXgobSwwKTtwPW0vTWF0aC5tYXgocC0xLDEpO3JldHVybiBNYXRoLm1pbih0aGlzLnN0ZXBEZWxheSgpLHApfTtyZXR1cm4gbH0oKTtoLl9ERUZBVUxUX1NUQVJUX0RFTEFZX01JTExJU0VDT05EUz0KMDtoLl9ERUZBVUxUX1NURVBfRFVSQVRJT05fTUlMTElTRUNPTkRTPTMwMDtoLl9ERUZBVUxUX0lURVJBVElWRV9ERUxBWV9NSUxMSVNFQ09ORFM9MTU7aC5fREVGQVVMVF9NQVhfVE9UQUxfRFVSQVRJT05fTUlMTElTRUNPTkRTPUluZmluaXR5O2guX0RFRkFVTFRfRUFTSU5HX01PREU9ImV4cE91dCI7Zi5FYXNpbmc9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoMTIpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXQucHJvdG90eXBlLnRvdGFsVGltZT1mdW5jdGlvbigpe3JldHVybiAwfTt0LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGwscCl7bD1rLmNvZXJjZUV4dGVybmFsRDMobCk7cmV0dXJuIGwuYXR0cnMocCl9O3JldHVybiB0fSgpO2YuTnVsbD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHEsdSl7ZnVuY3Rpb24geCgpe3RoaXMuY29uc3RydWN0b3I9cX1mb3IodmFyIEEgaW4gdSl1Lmhhc093blByb3BlcnR5KEEpJiYKKHFbQV09dVtBXSk7cS5wcm90b3R5cGU9bnVsbD09PXU/T2JqZWN0LmNyZWF0ZSh1KTooeC5wcm90b3R5cGU9dS5wcm90b3R5cGUsbmV3IHgpfSx0PWgoMSksbD1oKDUpLHA9aCg0KSxtPWgoMCksbj1oKDIyKTtkPWZ1bmN0aW9uKHEpe2Z1bmN0aW9uIHUoeCxBKXt2b2lkIDA9PT1BJiYoQT0iYm90dG9tIik7eD1xLmNhbGwodGhpcyx4LEEpfHx0aGlzO3guX3RpY2tMYWJlbEFuZ2xlPTA7eC5fdGlja0xhYmVsU2hlYXJBbmdsZT0wO3guYWRkQ2xhc3MoImNhdGVnb3J5LWF4aXMiKTtyZXR1cm4geH1rKHUscSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHUucHJvdG90eXBlLCJfd3JhcHBlciIse2dldDpmdW5jdGlvbigpe3ZhciB4PW5ldyBsLldyYXBwZXI7bnVsbCE9dGhpcy5fdGlja0xhYmVsTWF4TGluZXMmJngubWF4TGluZXModGhpcy5fdGlja0xhYmVsTWF4TGluZXMpO3JldHVybiB4fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh1LnByb3RvdHlwZSwKIl93cml0ZXIiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGwuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHRoaXMuX3R5cGVzZXR0ZXJDb250ZXh0LHRoaXMuX3dyYXBwZXIpfSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO3UucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3EucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3R5cGVzZXR0ZXJDb250ZXh0PW5ldyBsLlN2Z0NvbnRleHQodGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLm5vZGUoKSk7dGhpcy5fbWVhc3VyZXI9bmV3IGwuQ2FjaGVNZWFzdXJlcih0aGlzLl90eXBlc2V0dGVyQ29udGV4dCl9O3UucHJvdG90eXBlLl9yZXNjYWxlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmVkcmF3KCl9O3UucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHgsQSl7dmFyIHk9dGhpcy5pc0hvcml6b250YWwoKT8wOnRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkrdGhpcy5tYXJnaW4oKSx3PXRoaXMuaXNIb3Jpem9udGFsKCk/CnRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCkrdGhpcy5tYXJnaW4oKTowO2lmKDA9PT10aGlzLl9zY2FsZS5kb21haW4oKS5sZW5ndGgpcmV0dXJue21pbldpZHRoOjAsbWluSGVpZ2h0OjB9O2lmKHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkpe3ZhciBDPXRoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCkqdGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCk7dGhpcy5pc0hvcml6b250YWwoKT93Kz1DOnkrPUN9eD10aGlzLl9tZWFzdXJlVGlja0xhYmVscyh4LEEpO3JldHVybnttaW5XaWR0aDp4LnVzZWRXaWR0aCt5LG1pbkhlaWdodDp4LnVzZWRIZWlnaHQrd319O3UucHJvdG90eXBlLl9jb3JlU2l6ZT1mdW5jdGlvbigpe3ZhciB4PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCksQT10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMucmVxdWVzdGVkU3BhY2UodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpLm1pbkhlaWdodDp0aGlzLnJlcXVlc3RlZFNwYWNlKHRoaXMud2lkdGgoKSwKdGhpcy5oZWlnaHQoKSkubWluV2lkdGgseT10aGlzLm1hcmdpbigpK3RoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCk7cmV0dXJuIE1hdGgubWluKEEteSx4KX07dS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXREb3duc2FtcGxlSW5mbygpLmRvbWFpbn07dS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24oeCxBKXtyZXR1cm4gcC5Db21wb25lbnQucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyLmNhbGwodGhpcyx4LEEpfTt1LnByb3RvdHlwZS5nZXREb3duc2FtcGxlSW5mbz1mdW5jdGlvbih4KXt2YXIgQTt2b2lkIDA9PT14JiYoeD10aGlzLl9zY2FsZSk7dm9pZCAwPT09QSYmKEE9eC5pbnZlcnRSYW5nZSgpKTt2YXIgeT1NYXRoLmNlaWwodS5fTUlOSU1VTV9XSURUSF9QRVJfTEFCRUxfUFgqKDA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT8xOjEvTWF0aC5jb3ModGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZS8xODAqTWF0aC5QSSkpLwp4LnN0ZXBXaWR0aCgpKTtyZXR1cm57ZG9tYWluOkEuZmlsdGVyKGZ1bmN0aW9uKHcsQyl7cmV0dXJuIDA9PT1DJXl9KSxzdGVwV2lkdGg6eSp4LnN0ZXBXaWR0aCgpfX07dS5wcm90b3R5cGUudGlja0xhYmVsQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja0xhYmVsQW5nbGU7dGhyb3cgRXJyb3IoIkFuZ2xlIHVuZGVmaW5lZCBub3Qgc3VwcG9ydGVkOyBvbmx5IDAsIDkwLCBhbmQgLTkwIGFyZSB2YWxpZCB2YWx1ZXMiKTt9O3UucHJvdG90eXBlLnRpY2tMYWJlbFNoZWFyQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZX07dS5wcm90b3R5cGUudGlja0xhYmVsTWF4V2lkdGg9ZnVuY3Rpb24oeCl7aWYoMD09PWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbE1heFdpZHRoO3RoaXMuX3RpY2tMYWJlbE1heFdpZHRoPXg7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUudGlja0xhYmVsTWF4TGluZXM9CmZ1bmN0aW9uKHgpe2lmKDA9PT1hcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl90aWNrTGFiZWxNYXhMaW5lczt0aGlzLl90aWNrTGFiZWxNYXhMaW5lcz14O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLl90aWNrU3BhY2VSZXF1aXJlZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSt0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKX07dS5wcm90b3R5cGUuX2RyYXdUaWNrcz1mdW5jdGlvbih4LEEpe3ZhciB5PXRoaXM7c3dpdGNoKHRoaXMudGlja0xhYmVsQW5nbGUoKSl7Y2FzZSAwOnZhciB3PXtsZWZ0OiJyaWdodCIscmlnaHQ6ImxlZnQiLHRvcDoiY2VudGVyIixib3R0b206ImNlbnRlciJ9O3ZhciBDPXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoiYm90dG9tIixib3R0b206InRvcCJ9O2JyZWFrO2Nhc2UgOTA6dz17bGVmdDoiY2VudGVyIixyaWdodDoiY2VudGVyIix0b3A6InJpZ2h0Iixib3R0b206ImxlZnQifTsKQz17bGVmdDoidG9wIixyaWdodDoiYm90dG9tIix0b3A6ImNlbnRlciIsYm90dG9tOiJjZW50ZXIifTticmVhaztjYXNlIC05MDp3PXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoibGVmdCIsYm90dG9tOiJyaWdodCJ9LEM9e2xlZnQ6ImJvdHRvbSIscmlnaHQ6InRvcCIsdG9wOiJjZW50ZXIiLGJvdHRvbToiY2VudGVyIn19QS5lYWNoKGZ1bmN0aW9uKEcpe3ZhciBEPXQuc2VsZWN0KHRoaXMpLEI9eS5pc0hvcml6b250YWwoKT94Onkud2lkdGgoKS15Ll90aWNrU3BhY2VSZXF1aXJlZCgpLEk9eS5pc0hvcml6b250YWwoKT95LmhlaWdodCgpLXkuX3RpY2tTcGFjZVJlcXVpcmVkKCk6eCxOPXt4QWxpZ246d1t5Lm9yaWVudGF0aW9uKCldLHlBbGlnbjpDW3kub3JpZW50YXRpb24oKV0sdGV4dFJvdGF0aW9uOnkudGlja0xhYmVsQW5nbGUoKSx0ZXh0U2hlYXI6eS50aWNrTGFiZWxTaGVhckFuZ2xlKCl9O2lmKG51bGwhPXkuX3RpY2tMYWJlbE1heFdpZHRoKXtpZigibGVmdCI9PT0KeS5vcmllbnRhdGlvbigpJiZCPnkuX3RpY2tMYWJlbE1heFdpZHRoKXt2YXIgTz1CLXkuX3RpY2tMYWJlbE1heFdpZHRoO089RC5hdHRyKCJ0cmFuc2Zvcm0iKSsiIHRyYW5zbGF0ZSgiK08rIiwgMCkiO0QuYXR0cigidHJhbnNmb3JtIixPKX1CPU1hdGgubWluKEIseS5fdGlja0xhYmVsTWF4V2lkdGgpfXkuX3dyaXRlci53cml0ZSh5LmZvcm1hdHRlcigpKEcpLEIsSSxOLEQubm9kZSgpKX0pfTt1LnByb3RvdHlwZS5fbWVhc3VyZVRpY2tMYWJlbHM9ZnVuY3Rpb24oeCxBKXt2YXIgeT10aGlzLHc9dGhpcy5fc2NhbGUuY2xvbmVXaXRob3V0UHJvdmlkZXJzKCkucmFuZ2UoWzAsdGhpcy5pc0hvcml6b250YWwoKT94OkFdKSxDPXRoaXMuZ2V0RG93bnNhbXBsZUluZm8odyk7dz1DLmRvbWFpbjtDPUMuc3RlcFdpZHRoO3ZhciBHPXgtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKTt0aGlzLmlzSG9yaXpvbnRhbCgpJiYoRz1DLDAhPT10aGlzLl90aWNrTGFiZWxBbmdsZSYmKEc9QS10aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpKSwKRz1NYXRoLm1heChHLDApKTt2YXIgRD1DO3RoaXMuaXNIb3Jpem9udGFsKCkmJihEPUEtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSwwIT09dGhpcy5fdGlja0xhYmVsQW5nbGUmJihEPXgtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSksRD1NYXRoLm1heChELDApKTtudWxsIT10aGlzLl90aWNrTGFiZWxNYXhXaWR0aCYmKEc9TWF0aC5taW4oRyx0aGlzLl90aWNrTGFiZWxNYXhXaWR0aCkpO0E9dy5tYXAoZnVuY3Rpb24oQil7cmV0dXJuIHkuX3dyYXBwZXIud3JhcCh5LmZvcm1hdHRlcigpKEIpLHkuX21lYXN1cmVyLEcsRCl9KTt4PXRoaXMuaXNIb3Jpem9udGFsKCkmJjA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT90LnN1bTptLk1hdGgubWF4O3c9dGhpcy5pc0hvcml6b250YWwoKSYmMD09PXRoaXMuX3RpY2tMYWJlbEFuZ2xlP20uTWF0aC5tYXg6dC5zdW07eD14KEEsZnVuY3Rpb24oQil7cmV0dXJuIHkuX21lYXN1cmVyLm1lYXN1cmUoQi53cmFwcGVkVGV4dCkud2lkdGh9LDApOwpBPXcoQSxmdW5jdGlvbihCKXtyZXR1cm4geS5fbWVhc3VyZXIubWVhc3VyZShCLndyYXBwZWRUZXh0KS5oZWlnaHR9LDApOzAhPT10aGlzLl90aWNrTGFiZWxBbmdsZSYmKEE9W0EseF0seD1BWzBdLEE9QVsxXSk7cmV0dXJue3VzZWRXaWR0aDp4LHVzZWRIZWlnaHQ6QX19O3UucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHg9dGhpcztxLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciBBPXRoaXMuX3NjYWxlLHk9dGhpcy5nZXREb3duc2FtcGxlSW5mbyhBKSx3PXkuZG9tYWluLEM9eT15LnN0ZXBXaWR0aDt0aGlzLmlzSG9yaXpvbnRhbCgpJiZudWxsIT10aGlzLl90aWNrTGFiZWxNYXhXaWR0aCYmKEM9TWF0aC5taW4oQyx0aGlzLl90aWNrTGFiZWxNYXhXaWR0aCkpO3c9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrbi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEodyk7dmFyIEc9dy5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQobi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MsCiEwKS5tZXJnZSh3KTt3LmV4aXQoKS5yZW1vdmUoKTtHLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oRCl7dmFyIEI9QS5zY2FsZShEKS1DLzI7RD14LmlzSG9yaXpvbnRhbCgpP0I6MDtCPXguaXNIb3Jpem9udGFsKCk/MDpCO3JldHVybiJ0cmFuc2xhdGUoIitEKyIsIitCKyIpIn0pO0cudGV4dCgiIik7dGhpcy5fZHJhd1RpY2tzKHksRyk7eT0icmlnaHQiPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk6MDt3PSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP3RoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk6MDt0aGlzLl90aWNrTGFiZWxDb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIreSsiLCIrdysiKSIpO3RoaXMuX3Nob3dBbGxUaWNrTWFya3MoKTt0aGlzLl9zaG93QWxsVGlja0xhYmVscygpO3RoaXMuX2hpZGVUaWNrTWFya3NXaXRob3V0TGFiZWwoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD0KZnVuY3Rpb24oeCxBLHkpe3EucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHgsQSx5KTt0aGlzLmlzSG9yaXpvbnRhbCgpfHx0aGlzLl9zY2FsZS5yYW5nZShbMCx0aGlzLmhlaWdodCgpXSk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3EucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpO3RoaXMuX21lYXN1cmVyLnJlc2V0KCl9O3JldHVybiB1fShuLkF4aXMpO2QuX01JTklNVU1fV0lEVEhfUEVSX0xBQkVMX1BYPTE1O2YuQ2F0ZWdvcnk9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHgoKXt0aGlzLmNvbnN0cnVjdG9yPXF9Zm9yKHZhciBBIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShBKSYmKHFbQV09dVtBXSk7cS5wcm90b3R5cGU9bnVsbD09PXU/T2JqZWN0LmNyZWF0ZSh1KTooeC5wcm90b3R5cGU9dS5wcm90b3R5cGUsbmV3IHgpfSwKdD1oKDEpLGw9aCg1KSxwPWgoOCksbT1oKDApLG49aCgyMik7ZD1mdW5jdGlvbihxKXtmdW5jdGlvbiB1KHgsQSl7eD1xLmNhbGwodGhpcyx4LEEpfHx0aGlzO3guX3RpY2tMYWJlbFBvc2l0aW9uaW5nPSJjZW50ZXIiO3guX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uPSExO3guZm9ybWF0dGVyKHAuZ2VuZXJhbCgpKTtyZXR1cm4geH1rKHUscSk7dS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIHg9bmV3IGwuU3ZnQ29udGV4dCh0aGlzLl90aWNrTGFiZWxDb250YWluZXIubm9kZSgpLG4uQXhpcy5USUNLX0xBQkVMX0NMQVNTKTt0aGlzLl9tZWFzdXJlcj1uZXcgbC5DYWNoZU1lYXN1cmVyKHgpO3RoaXMuX3dyYXBwZXI9KG5ldyBsLldyYXBwZXIpLm1heExpbmVzKDEpfTt1LnByb3RvdHlwZS5fY29tcHV0ZVdpZHRoPWZ1bmN0aW9uKCl7dmFyIHg9dGhpcy5fdXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24/dGhpcy5fY29tcHV0ZUFwcHJveGltYXRlVGV4dFdpZHRoKCk6CnRoaXMuX2NvbXB1dGVFeGFjdFRleHRXaWR0aCgpO3JldHVybiJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkreDpNYXRoLm1heCh0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSt4KX07dS5wcm90b3R5cGUuX2NvbXB1dGVFeGFjdFRleHRXaWR0aD1mdW5jdGlvbigpe3ZhciB4PXRoaXMsQT10aGlzLl9nZXRUaWNrVmFsdWVzKCkubWFwKGZ1bmN0aW9uKHkpe3k9eC5mb3JtYXR0ZXIoKSh5KTtyZXR1cm4geC5fbWVhc3VyZXIubWVhc3VyZSh5KS53aWR0aH0pO3JldHVybiBtLk1hdGgubWF4KEEsMCl9O3UucHJvdG90eXBlLl9jb21wdXRlQXBwcm94aW1hdGVUZXh0V2lkdGg9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLEE9dGhpcy5fZ2V0VGlja1ZhbHVlcygpLHk9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgiTSIpLndpZHRoO0E9QS5tYXAoZnVuY3Rpb24odyl7cmV0dXJuIHguZm9ybWF0dGVyKCkodykubGVuZ3RoKgp5fSk7cmV0dXJuIG0uTWF0aC5tYXgoQSwwKX07dS5wcm90b3R5cGUuX2NvbXB1dGVIZWlnaHQ9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0O3JldHVybiJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkreDpNYXRoLm1heCh0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSt4KX07dS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLl9zY2FsZSxBPXguZG9tYWluKCkseT1BWzBdPD1BWzFdP0FbMF06QVsxXSx3PUFbMF0+PUFbMV0/QVswXTpBWzFdO3JldHVybiB4LnRpY2tzKCkuZmlsdGVyKGZ1bmN0aW9uKEMpe3JldHVybiBDPj15JiZDPD13fSl9O3UucHJvdG90eXBlLl9yZXNjYWxlPWZ1bmN0aW9uKCl7aWYodGhpcy5faXNTZXR1cCl7aWYoIXRoaXMuaXNIb3Jpem9udGFsKCkpe3ZhciB4PQp0aGlzLl9jb21wdXRlV2lkdGgoKTtpZih4PnRoaXMud2lkdGgoKXx8eDx0aGlzLndpZHRoKCktdGhpcy5tYXJnaW4oKSl7dGhpcy5yZWRyYXcoKTtyZXR1cm59fXRoaXMucmVuZGVyKCl9fTt1LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB4PXRoaXM7cS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt2YXIgQT17eDowLHk6MCxkeDoiMGVtIixkeToiMC4zZW0ifSx5PXRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpLHc9dGhpcy50aWNrTGFiZWxQYWRkaW5nKCksQz0ibWlkZGxlIixHPTAsRD0wLEI9MCxJPTA7aWYodGhpcy5pc0hvcml6b250YWwoKSlzd2l0Y2godGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmcpe2Nhc2UgImxlZnQiOkM9ImVuZCI7Rz0tdztJPXc7YnJlYWs7Y2FzZSAiY2VudGVyIjpJPXkrdzticmVhaztjYXNlICJyaWdodCI6Qz0ic3RhcnQiLEk9Rz13fWVsc2Ugc3dpdGNoKHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nKXtjYXNlICJ0b3AiOkEuZHk9CiItMC4zZW0iO0I9dztEPS13O2JyZWFrO2Nhc2UgImNlbnRlciI6Qj15K3c7YnJlYWs7Y2FzZSAiYm90dG9tIjpBLmR5PSIxZW0iLEQ9Qj13fXk9dGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCk7c3dpdGNoKHRoaXMub3JpZW50YXRpb24oKSl7Y2FzZSAiYm90dG9tIjpBLng9eS54MTtBLmR5PSIwLjk1ZW0iO0Q9eS55MStJO2JyZWFrO2Nhc2UgInRvcCI6QS54PXkueDE7QS5keT0iLS4yNWVtIjtEPXkueTEtSTticmVhaztjYXNlICJsZWZ0IjpDPSJlbmQiO0c9eS54MS1CO0EueT15LnkxO2JyZWFrO2Nhc2UgInJpZ2h0IjpDPSJzdGFydCIsRz15LngxK0IsQS55PXkueTF9Qj10aGlzLl9nZXRUaWNrVmFsdWVzKCk7Qj10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIituLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZGF0YShCKTtCLmV4aXQoKS5yZW1vdmUoKTtCLmVudGVyKCkuYXBwZW5kKCJ0ZXh0IikuY2xhc3NlZChuLkF4aXMuVElDS19MQUJFTF9DTEFTUywKITApLm1lcmdlKEIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsQykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0IikuYXR0cnMoQSkudGV4dChmdW5jdGlvbihOKXtyZXR1cm4geC5mb3JtYXR0ZXIoKShOKX0pO3RoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitHKyIsICIrRCsiKSIpO3RoaXMuX3Nob3dBbGxUaWNrTWFya3MoKTt0aGlzLnNob3dFbmRUaWNrTGFiZWxzKCl8fHRoaXMuX2hpZGVFbmRUaWNrTGFiZWxzKCk7dGhpcy5faGlkZU92ZXJmbG93aW5nVGlja0xhYmVscygpO3RoaXMuX2hpZGVPdmVybGFwcGluZ1RpY2tMYWJlbHMoKTsiY2VudGVyIiE9PXRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nJiZ0aGlzLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsKCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLnRpY2tMYWJlbFBvc2l0aW9uPWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nOwp4PXgudG9Mb3dlckNhc2UoKTtpZih0aGlzLmlzSG9yaXpvbnRhbCgpKXtpZigibGVmdCIhPT14JiYiY2VudGVyIiE9PXgmJiJyaWdodCIhPT14KXRocm93IEVycm9yKHgrIiBpcyBub3QgYSB2YWxpZCB0aWNrIGxhYmVsIHBvc2l0aW9uIGZvciBhIGhvcml6b250YWwgTnVtZXJpY0F4aXMiKTt9ZWxzZSBpZigidG9wIiE9PXgmJiJjZW50ZXIiIT09eCYmImJvdHRvbSIhPT14KXRocm93IEVycm9yKHgrIiBpcyBub3QgYSB2YWxpZCB0aWNrIGxhYmVsIHBvc2l0aW9uIGZvciBhIHZlcnRpY2FsIE51bWVyaWNBeGlzIik7dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc9eDt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt1LnByb3RvdHlwZS51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbj1mdW5jdGlvbigpe3RoaXMuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uPSEwfTt1LnByb3RvdHlwZS5faGlkZUVuZFRpY2tMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLmVsZW1lbnQoKS5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksCkE9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrbi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpO2lmKDAhPT1BLnNpemUoKSl7dmFyIHk9QS5ub2RlcygpWzBdO20uRE9NLmNsaWVudFJlY3RJbnNpZGUoeS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx4KXx8dC5zZWxlY3QoeSkuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKTtBPUEubm9kZXMoKVtBLnNpemUoKS0xXTttLkRPTS5jbGllbnRSZWN0SW5zaWRlKEEuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkseCl8fHQuc2VsZWN0KEEpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9fTt1LnByb3RvdHlwZS5faGlkZU92ZXJsYXBwaW5nVGlja0xhYmVscz1mdW5jdGlvbigpe2Zvcih2YXIgeD10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIituLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZmlsdGVyKGZ1bmN0aW9uKCl7dmFyIHc9dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTtyZXR1cm4iaW5oZXJpdCI9PT0Kd3x8InZpc2libGUiPT09d30pLEE9eC5ub2RlcygpLm1hcChmdW5jdGlvbih3KXtyZXR1cm4gdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0pLHk9MTshdGhpcy5faGFzT3ZlcmxhcFdpdGhJbnRlcnZhbCh5LEEpJiZ5PEEubGVuZ3RoOyl5Kz0xO3guZWFjaChmdW5jdGlvbih3LEMpe3c9dC5zZWxlY3QodGhpcyk7MCE9PUMleSYmdy5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfSl9O3UucHJvdG90eXBlLl9oYXNPdmVybGFwV2l0aEludGVydmFsPWZ1bmN0aW9uKHgsQSl7dmFyIHk9ImNlbnRlciI9PT10aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZz90aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTozKnRoaXMudGlja0xhYmVsUGFkZGluZygpO0E9QS5tYXAoZnVuY3Rpb24oQyl7cmV0dXJuIG0uRE9NLmV4cGFuZFJlY3QoQyx5KX0pO2Zvcih2YXIgdz0wO3c8QS5sZW5ndGgteDt3Kz14KWlmKG0uRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChBW3ddLEFbdyt4XSkpcmV0dXJuITE7cmV0dXJuITB9Owp1LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtxLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gdX0obi5BeGlzKTtmLk51bWVyaWM9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfTtkPWgoNDIpO3ZhciB0PWgoMjUpLGw9aCgwKTtoPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0obil7ZnVuY3Rpb24gcSgpe3cmJih3PSExLHkuX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24gdShDLEcpe3cmJih5Ll9zZXRQaXhlbFBvc2l0aW9uV2l0aG91dENoYW5naW5nTW9kZSh5Ll9pc1ZlcnRpY2FsKCk/CkcueDpHLnkpLHkuX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24geChDKXtBKEMpJiYodz0hMCx5Ll9kcmFnU3RhcnRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh5KSl9ZnVuY3Rpb24gQShDKXtyZXR1cm4geS5faXNWZXJ0aWNhbCgpJiZ5LnBpeGVsUG9zaXRpb24oKS15LmRldGVjdGlvblJhZGl1cygpPD1DLngmJkMueDw9eS5waXhlbFBvc2l0aW9uKCkreS5kZXRlY3Rpb25SYWRpdXMoKXx8IXkuX2lzVmVydGljYWwoKSYmeS5waXhlbFBvc2l0aW9uKCkteS5kZXRlY3Rpb25SYWRpdXMoKTw9Qy55JiZDLnk8PXkucGl4ZWxQb3NpdGlvbigpK3kuZGV0ZWN0aW9uUmFkaXVzKCl9dmFyIHk9cC5jYWxsKHRoaXMsbil8fHRoaXM7eS5fZGV0ZWN0aW9uUmFkaXVzPTM7eS5fZW5hYmxlZD0hMDt5LmFkZENsYXNzKCJkcmFnLWxpbmUtbGF5ZXIiKTt5LmFkZENsYXNzKCJlbmFibGVkIik7eS5fZHJhZ0ludGVyYWN0aW9uPW5ldyB0LkRyYWc7eS5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHkpOwp2YXIgdz0hMTt5Ll9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQoeCk7eS5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZyh1KTt5Ll9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKHEpO3kuX2Rpc2Nvbm5lY3RJbnRlcmFjdGlvbj1mdW5jdGlvbigpe3kuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnU3RhcnQoeCk7eS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWcodSk7eS5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWdFbmQocSk7eS5fZHJhZ0ludGVyYWN0aW9uLmRldGFjaCgpfTt5Ll9kcmFnU3RhcnRDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7eS5fZHJhZ0NhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDt5Ll9kcmFnRW5kQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O3JldHVybiB5fWsobSxwKTttLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtwLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLnN0eWxlcyh7b3BhY2l0eTowLApzdHJva2U6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVTdHJva2UifSkuY2xhc3NlZCgiZHJhZy1lZGdlIiwhMCl9O20ucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9kZXRlY3Rpb25FZGdlLmF0dHJzKHt4MTp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6MCx5MTp0aGlzLl9pc1ZlcnRpY2FsKCk/MDp0aGlzLnBpeGVsUG9zaXRpb24oKSx4Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6dGhpcy53aWR0aCgpLHkyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLmhlaWdodCgpOnRoaXMucGl4ZWxQb3NpdGlvbigpLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZXRlY3Rpb25SYWRpdXN9OwptLnByb3RvdHlwZS5lbmFibGVkPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2VuYWJsZWQ7KHRoaXMuX2VuYWJsZWQ9bik/dGhpcy5hZGRDbGFzcygiZW5hYmxlZCIpOnRoaXMucmVtb3ZlQ2xhc3MoImVuYWJsZWQiKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25EcmFnU3RhcnQ9ZnVuY3Rpb24obil7dGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZChuKX07bS5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUub25EcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKG4pfTsKbS5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3ZhciBuPXRoaXM7cC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3JldHVybiBuLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKHEpfSk7dGhpcy5fZHJhZ0NhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3JldHVybiBuLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShxKX0pO3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbihxKXtyZXR1cm4gbi5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUocSl9KTt0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb24oKX07cmV0dXJuIG19KGQuR3VpZGVMaW5lTGF5ZXIpO2YuRHJhZ0xpbmVMYXllcj1ofSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhsLHAsbSl7dmFyIG49Cnt9O2lmKHZvaWQgMCE9PW0pZm9yKHZhciBxPTA7cTxtLmxlbmd0aDtxKyspblttW3FdXT1tW3EtMV07cmV0dXJuIGZ1bmN0aW9uKHUpe3ZhciB4PWwuc2NhbGUodSk7aWYoIXApcmV0dXJuIHg7dmFyIEE7dT12b2lkIDA9PT1uW3VdP3ZvaWQgMDpsLnNjYWxlKG5bdV0pO3ZvaWQgMCE9PXUmJihBPXUrKHgtdSkvMik7cmV0dXJuIEF9fXZhciB0PXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXt2YXIgcT1sLmNhbGwodGhpcyl8fHRoaXM7cS5hZGRDbGFzcygiZ3JpZGxpbmVzIik7cS5feFNjYWxlPW07cS5feVNjYWxlPW47cS5fcmVuZGVyQ2FsbGJhY2s9CmZ1bmN0aW9uKCl7cmV0dXJuIHEucmVuZGVyKCl9O2lmKHEuX3hTY2FsZSlxLl94U2NhbGUub25VcGRhdGUocS5fcmVuZGVyQ2FsbGJhY2spO2lmKHEuX3lTY2FsZSlxLl95U2NhbGUub25VcGRhdGUocS5fcmVuZGVyQ2FsbGJhY2spO3JldHVybiBxfXQocCxsKTtwLnByb3RvdHlwZS5iZXR3ZWVuWD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iZXR3ZWVuWH07cC5wcm90b3R5cGUuYmV0d2Vlblk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmV0d2Vlbll9O3AucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5feFNjYWxlJiZ0aGlzLl94U2NhbGUub2ZmVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKTt0aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKdGhpcy5feExpbmVzQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoIngtZ3JpZGxpbmVzIiwhMCk7dGhpcy5feUxpbmVzQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktZ3JpZGxpbmVzIiwhMCl9O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7bC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt0aGlzLl9yZWRyYXdYTGluZXMoKTt0aGlzLl9yZWRyYXdZTGluZXMoKTtyZXR1cm4gdGhpc307cC5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihtLG4scSl7bC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsbSxuLHEpO251bGwhPXRoaXMuX3hTY2FsZSYmdGhpcy5feFNjYWxlLnJhbmdlKFswLHRoaXMud2lkdGgoKV0pO251bGwhPXRoaXMuX3lTY2FsZSYmdGhpcy5feVNjYWxlLnJhbmdlKFt0aGlzLmhlaWdodCgpLDBdKTtyZXR1cm4gdGhpc307CnAucHJvdG90eXBlLl9yZWRyYXdYTGluZXM9ZnVuY3Rpb24oKXtpZih0aGlzLl94U2NhbGUpe3ZhciBtPXRoaXMuYmV0d2VlblgoKSxuPXRoaXMuX3hTY2FsZS50aWNrcygpLnNsaWNlKG0/MTowKTtuPXRoaXMuX3hMaW5lc0NvbnRhaW5lci5zZWxlY3RBbGwoImxpbmUiKS5kYXRhKG4pO24uZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5tZXJnZShuKS5hdHRyKCJ4MSIsayh0aGlzLl94U2NhbGUsbSx0aGlzLl94U2NhbGUudGlja3MoKSkpLmF0dHIoInkxIiwwKS5hdHRyKCJ4MiIsayh0aGlzLl94U2NhbGUsbSx0aGlzLl94U2NhbGUudGlja3MoKSkpLmF0dHIoInkyIix0aGlzLmhlaWdodCgpKS5jbGFzc2VkKCJiZXR3ZWVubGluZSIsbSkuY2xhc3NlZCgiemVyb2xpbmUiLGZ1bmN0aW9uKHEpe3JldHVybiAwPT09cX0pO24uZXhpdCgpLnJlbW92ZSgpfX07cC5wcm90b3R5cGUuX3JlZHJhd1lMaW5lcz1mdW5jdGlvbigpe2lmKHRoaXMuX3lTY2FsZSl7dmFyIG09dGhpcy5iZXR3ZWVuWSgpLApuPXRoaXMuX3lTY2FsZS50aWNrcygpLnNsaWNlKG0/MTowKTtuPXRoaXMuX3lMaW5lc0NvbnRhaW5lci5zZWxlY3RBbGwoImxpbmUiKS5kYXRhKG4pO24uZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5tZXJnZShuKS5hdHRyKCJ4MSIsMCkuYXR0cigieTEiLGsodGhpcy5feVNjYWxlLG0sdGhpcy5feVNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ4MiIsdGhpcy53aWR0aCgpKS5hdHRyKCJ5MiIsayh0aGlzLl95U2NhbGUsbSx0aGlzLl95U2NhbGUudGlja3MoKSkpLmNsYXNzZWQoImJldHdlZW5saW5lIixtKS5jbGFzc2VkKCJ6ZXJvbGluZSIsZnVuY3Rpb24ocSl7cmV0dXJuIDA9PT1xfSk7bi5leGl0KCkucmVtb3ZlKCl9fTtyZXR1cm4gcH0oaCg0KS5Db21wb25lbnQpO2YuR3JpZGxpbmVzPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obixxKXtmdW5jdGlvbiB1KCl7dGhpcy5jb25zdHJ1Y3Rvcj1ufWZvcih2YXIgeCBpbiBxKXEuaGFzT3duUHJvcGVydHkoeCkmJgooblt4XT1xW3hdKTtuLnByb3RvdHlwZT1udWxsPT09cT9PYmplY3QuY3JlYXRlKHEpOih1LnByb3RvdHlwZT1xLnByb3RvdHlwZSxuZXcgdSl9LHQ9aCg1KSxsPWgoMjMpLHA9aCg4KSxtPWgoMCk7ZD1mdW5jdGlvbihuKXtmdW5jdGlvbiBxKHUpe3ZhciB4PW4uY2FsbCh0aGlzKXx8dGhpczt4Ll90ZXh0UGFkZGluZz01O2lmKG51bGw9PXUpdGhyb3cgRXJyb3IoIkludGVycG9sYXRlZENvbG9yTGVnZW5kIHJlcXVpcmVzIGEgaW50ZXJwb2xhdGVkQ29sb3JTY2FsZSIpO3guX3NjYWxlPXU7eC5fcmVkcmF3Q2FsbGJhY2s9ZnVuY3Rpb24oKXtyZXR1cm4geC5yZWRyYXcoKX07eC5fc2NhbGUub25VcGRhdGUoeC5fcmVkcmF3Q2FsbGJhY2spO3guX2Zvcm1hdHRlcj1wLmdlbmVyYWwoKTt4Ll9vcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI7eC5fZXhwYW5kcz0hMTt4LmFkZENsYXNzKCJsZWdlbmQiKTt4LmFkZENsYXNzKCJpbnRlcnBvbGF0ZWQtY29sb3ItbGVnZW5kIik7cmV0dXJuIHh9ayhxLApuKTtxLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7bi5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpO3RoaXMuX3NjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZWRyYXdDYWxsYmFjayl9O3EucHJvdG90eXBlLmZvcm1hdHRlcj1mdW5jdGlvbih1KXtpZih2b2lkIDA9PT11KXJldHVybiB0aGlzLl9mb3JtYXR0ZXI7dGhpcy5fZm9ybWF0dGVyPXU7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307cS5wcm90b3R5cGUuZXhwYW5kcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9leHBhbmRzfTtxLl9lbnN1cmVPcmllbnRhdGlvbj1mdW5jdGlvbih1KXt1PXUudG9Mb3dlckNhc2UoKTtpZigiaG9yaXpvbnRhbCI9PT11fHwibGVmdCI9PT11fHwicmlnaHQiPT09dSlyZXR1cm4gdTt0aHJvdyBFcnJvcignIicrdSsnIiBpcyBub3QgYSB2YWxpZCBvcmllbnRhdGlvbiBmb3IgSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQnKTt9O3EucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHUpe2lmKG51bGw9PQp1KXJldHVybiB0aGlzLl9vcmllbnRhdGlvbjt0aGlzLl9vcmllbnRhdGlvbj1xLl9lbnN1cmVPcmllbnRhdGlvbih1KTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtxLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZXhwYW5kcygpfHx0aGlzLl9pc1ZlcnRpY2FsKCl9O3EucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIXRoaXMuZXhwYW5kcygpfHwhdGhpcy5faXNWZXJ0aWNhbCgpfTtxLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrcz1mdW5jdGlvbih1KXt2b2lkIDA9PT11JiYodT1xLl9ERUZBVUxUX05VTV9TV0FUQ0hFUyk7dmFyIHg9dGhpcy5fc2NhbGUuZG9tYWluKCk7aWYoMT09PXUpcmV0dXJuW3hbMF1dO2Zvcih2YXIgQT0oeFsxXS14WzBdKS8odS0xKSx5PVtdLHc9MDt3PHU7dysrKXkucHVzaCh4WzBdK0Eqdyk7cmV0dXJuIHl9O3EucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe24ucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpOwp0aGlzLl9zd2F0Y2hDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgic3dhdGNoLWNvbnRhaW5lciIsITApO3RoaXMuX3N3YXRjaEJvdW5kaW5nQm94PXRoaXMuY29udGVudCgpLmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInN3YXRjaC1ib3VuZGluZy1ib3giLCEwKTt0aGlzLl9sb3dlckxhYmVsPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQocS5MRUdFTkRfTEFCRUxfQ0xBU1MsITApO3RoaXMuX3VwcGVyTGFiZWw9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChxLkxFR0VORF9MQUJFTF9DTEFTUywhMCk7dmFyIHU9bmV3IHQuU3ZnQ29udGV4dCh0aGlzLmNvbnRlbnQoKS5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyB0Lk1lYXN1cmVyKHUpO3RoaXMuX3dyYXBwZXI9bmV3IHQuV3JhcHBlcjt0aGlzLl93cml0ZXI9bmV3IHQuV3JpdGVyKHRoaXMuX21lYXN1cmVyLHUsdGhpcy5fd3JhcHBlcil9O3EucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPQpmdW5jdGlvbigpe3ZhciB1PXRoaXMseD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEE9dGhpcy5fc2NhbGUuZG9tYWluKCkubWFwKGZ1bmN0aW9uKEMpe3JldHVybiB1Ll9tZWFzdXJlci5tZWFzdXJlKHUuX2Zvcm1hdHRlcihDKSkud2lkdGh9KSx5PXEuX0RFRkFVTFRfTlVNX1NXQVRDSEVTO2lmKHRoaXMuX2lzVmVydGljYWwoKSl7dmFyIHc9bS5NYXRoLm1heChBLDApO0E9eCt4K3RoaXMuX3RleHRQYWRkaW5nK3crdGhpcy5fdGV4dFBhZGRpbmc7dz15Knh9ZWxzZSB3PXgreCt4LEE9dGhpcy5fdGV4dFBhZGRpbmcrQVswXSt5KngrQVsxXSt0aGlzLl90ZXh0UGFkZGluZztyZXR1cm57bWluV2lkdGg6QSxtaW5IZWlnaHQ6d319O3EucHJvdG90eXBlLl9pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuImhvcml6b250YWwiIT09dGhpcy5fb3JpZW50YXRpb259O3EucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7dmFyIHU9dGhpcztuLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpOwp2YXIgeD10aGlzLl9zY2FsZS5kb21haW4oKSxBPXRoaXMuX2Zvcm1hdHRlcih4WzBdKSx5PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoQSkud2lkdGgsdz10aGlzLl9mb3JtYXR0ZXIoeFsxXSk7eD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKHcpLndpZHRoO3ZhciBDPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQsRz10aGlzLl90ZXh0UGFkZGluZyxEPTAsQj0wLEk9MCxOPTAsTz17eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246MH0sSD17eEFsaWduOiJjZW50ZXIiLHlBbGlnbjoiY2VudGVyIix0ZXh0Um90YXRpb246MH0sSz17eDowLHk6MCx3aWR0aDowLGhlaWdodDowfTtpZih0aGlzLl9pc1ZlcnRpY2FsKCkpe3ZhciBNPU1hdGguZmxvb3IodGhpcy5oZWlnaHQoKSk7dmFyIEw9TWF0aC5tYXgoeSx4KTt2YXIgUT0odGhpcy53aWR0aCgpLUwtMip0aGlzLl90ZXh0UGFkZGluZykvMjt4PU1hdGgubWF4KHRoaXMud2lkdGgoKS1RLTIqRy1MLDApOwpDPTE7dmFyIFQ9ZnVuY3Rpb24oYWEsbGEpe3JldHVybiB1LmhlaWdodCgpLShsYSsxKX07SC55QWxpZ249InRvcCI7Qj0wO08ueUFsaWduPSJib3R0b20iO049MDtpZigibGVmdCI9PT10aGlzLl9vcmllbnRhdGlvbil7dmFyIFg9ZnVuY3Rpb24oKXtyZXR1cm4gRytMK0d9O0gueEFsaWduPSJyaWdodCI7RD0tKFEreCtHKTtPLnhBbGlnbj0icmlnaHQiO0k9LShRK3grRyl9ZWxzZSBYPWZ1bmN0aW9uKCl7cmV0dXJuIFF9LEgueEFsaWduPSJsZWZ0IixEPVEreCtHLE8ueEFsaWduPSJsZWZ0IixJPVEreCtHO0sud2lkdGg9eDtLLmhlaWdodD1NKkN9ZWxzZSBRPU1hdGgubWF4KEcsKHRoaXMuaGVpZ2h0KCktQykvMiksTT1NYXRoLm1heChNYXRoLmZsb29yKHRoaXMud2lkdGgoKS00KkcteS14KSwwKSx4PTEsQz1NYXRoLm1heCh0aGlzLmhlaWdodCgpLTIqUSwwKSxYPWZ1bmN0aW9uKGFhLGxhKXtyZXR1cm4gTWF0aC5mbG9vcih5KzIqRykrbGF9LFQ9ZnVuY3Rpb24oKXtyZXR1cm4gUX0sCkgueEFsaWduPSJyaWdodCIsRD0tRyxPLnhBbGlnbj0ibGVmdCIsST1HLEsueT1RLEsud2lkdGg9TSp4LEsuaGVpZ2h0PUM7Sy54PVgobnVsbCwwKTt0aGlzLl91cHBlckxhYmVsLnRleHQoIiIpO3RoaXMuX3dyaXRlci53cml0ZSh3LHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpLEgsdGhpcy5fdXBwZXJMYWJlbC5ub2RlKCkpO3RoaXMuX3VwcGVyTGFiZWwuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrRCsiLCAiK0IrIikiKTt0aGlzLl9sb3dlckxhYmVsLnRleHQoIiIpO3RoaXMuX3dyaXRlci53cml0ZShBLHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpLE8sdGhpcy5fbG93ZXJMYWJlbC5ub2RlKCkpO3RoaXMuX2xvd2VyTGFiZWwuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrSSsiLCAiK04rIikiKTt0aGlzLl9zd2F0Y2hCb3VuZGluZ0JveC5hdHRycyhLKTtBPXRoaXMuX2dlbmVyYXRlVGlja3MoTSk7QT10aGlzLl9zd2F0Y2hDb250YWluZXIuc2VsZWN0QWxsKCJyZWN0LnN3YXRjaCIpLmRhdGEoQSk7Cnc9QS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInN3YXRjaCIsITApO0Q9QS5tZXJnZSh3KTtBLmV4aXQoKS5yZW1vdmUoKTtELmF0dHJzKHtmaWxsOmZ1bmN0aW9uKGFhKXtyZXR1cm4gdS5fc2NhbGUuc2NhbGUoYWEpfSx3aWR0aDp4LGhlaWdodDpDLHg6WCx5OlQsInNoYXBlLXJlbmRlcmluZyI6ImNyaXNwRWRnZXMifSk7bC5BRERfVElUTEVfRUxFTUVOVFMmJncuYXBwZW5kKCJ0aXRsZSIpLnRleHQoZnVuY3Rpb24oYWEpe3JldHVybiB1Ll9mb3JtYXR0ZXIoYWEpfSk7cmV0dXJuIHRoaXN9O3JldHVybiBxfShoKDQpLkNvbXBvbmVudCk7ZC5fREVGQVVMVF9OVU1fU1dBVENIRVM9MTE7ZC5MRUdFTkRfTEFCRUxfQ0xBU1M9ImxlZ2VuZC1sYWJlbCI7Zi5JbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYKKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfSx0PWgoNSk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0sbil7dm9pZCAwPT09bSYmKG09IiIpO3ZvaWQgMD09PW4mJihuPTApO3ZhciBxPWwuY2FsbCh0aGlzKXx8dGhpcztxLmFkZENsYXNzKCJsYWJlbCIpO3EudGV4dChtKTtxLmFuZ2xlKG4pO3EueEFsaWdubWVudCgiY2VudGVyIikueUFsaWdubWVudCgiY2VudGVyIik7cS5fcGFkZGluZz0wO3JldHVybiBxfWsocCxsKTtwLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbigpe3ZhciBtPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUodGhpcy5fdGV4dCksbj0oMD09PXRoaXMuYW5nbGUoKT9tLndpZHRoOm0uaGVpZ2h0KSsyKnRoaXMucGFkZGluZygpO209KDA9PT10aGlzLmFuZ2xlKCk/bS5oZWlnaHQ6bS53aWR0aCkrMip0aGlzLnBhZGRpbmcoKTtyZXR1cm57bWluV2lkdGg6biwKbWluSGVpZ2h0Om19fTtwLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl90ZXh0Q29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpO3ZhciBtPW5ldyB0LlN2Z0NvbnRleHQodGhpcy5fdGV4dENvbnRhaW5lci5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyB0LkNhY2hlTWVhc3VyZXIobSk7dGhpcy5fd3JhcHBlcj1uZXcgdC5XcmFwcGVyO3RoaXMuX3dyaXRlcj1uZXcgdC5Xcml0ZXIodGhpcy5fbWVhc3VyZXIsbSx0aGlzLl93cmFwcGVyKTt0aGlzLnRleHQodGhpcy5fdGV4dCl9O3AucHJvdG90eXBlLnRleHQ9ZnVuY3Rpb24obSl7aWYobnVsbD09bSlyZXR1cm4gdGhpcy5fdGV4dDtpZigic3RyaW5nIiE9PXR5cGVvZiBtKXRocm93IEVycm9yKCJMYWJlbC50ZXh0KCkgb25seSB0YWtlcyBzdHJpbmdzIGFzIGlucHV0Iik7dGhpcy5fdGV4dD1tO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLmFuZ2xlPQpmdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9hbmdsZTttJT0zNjA7MTgwPG0/bS09MzYwOi0xODA+bSYmKG0rPTM2MCk7aWYoLTkwPT09bXx8MD09PW18fDkwPT09bSl0aGlzLl9hbmdsZT1tO2Vsc2UgdGhyb3cgRXJyb3IobSsiIGlzIG5vdCBhIHZhbGlkIGFuZ2xlIGZvciBMYWJlbCIpO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLnBhZGRpbmc9ZnVuY3Rpb24obSl7aWYobnVsbD09bSlyZXR1cm4gdGhpcy5fcGFkZGluZzttPSttO2lmKDA+bSl0aHJvdyBFcnJvcihtKyIgaXMgbm90IGEgdmFsaWQgcGFkZGluZyB2YWx1ZS4gQ2Fubm90IGJlIGxlc3MgdGhhbiAwLiIpO3RoaXMuX3BhZGRpbmc9bTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9O3AucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9O3AucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PQpmdW5jdGlvbigpe2wucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dGhpcy5fdGV4dENvbnRhaW5lci5zZWxlY3RBbGwoImciKS5yZW1vdmUoKTt2YXIgbT10aGlzLl9tZWFzdXJlci5tZWFzdXJlKHRoaXMuX3RleHQpLG49TWF0aC5tYXgoTWF0aC5taW4oKHRoaXMuaGVpZ2h0KCktbS5oZWlnaHQpLzIsdGhpcy5wYWRkaW5nKCkpLDApO209TWF0aC5tYXgoTWF0aC5taW4oKHRoaXMud2lkdGgoKS1tLndpZHRoKS8yLHRoaXMucGFkZGluZygpKSwwKTt0aGlzLl90ZXh0Q29udGFpbmVyLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK20rIiwiK24rIikiKTttPXRoaXMud2lkdGgoKS0yKm07bj10aGlzLmhlaWdodCgpLTIqbjt2YXIgcT17eEFsaWduOnRoaXMueEFsaWdubWVudCgpLHlBbGlnbjp0aGlzLnlBbGlnbm1lbnQoKSx0ZXh0Um90YXRpb246dGhpcy5hbmdsZSgpfTt0aGlzLl93cml0ZXIud3JpdGUodGhpcy5fdGV4dCxtLG4scSk7cmV0dXJuIHRoaXN9OwpwLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXtsLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4gcH0oaCg0KS5Db21wb25lbnQpO2YuTGFiZWw9ZDtoPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXttPWwuY2FsbCh0aGlzLG0sbil8fHRoaXM7bS5hZGRDbGFzcyhwLlRJVExFX0xBQkVMX0NMQVNTKTtyZXR1cm4gbX1rKHAsbCk7cmV0dXJuIHB9KGQpO2guVElUTEVfTEFCRUxfQ0xBU1M9InRpdGxlLWxhYmVsIjtmLlRpdGxlTGFiZWw9aDtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAobSxuKXttPWwuY2FsbCh0aGlzLG0sbil8fHRoaXM7bS5hZGRDbGFzcyhwLkFYSVNfTEFCRUxfQ0xBU1MpO3JldHVybiBtfWsocCxsKTtyZXR1cm4gcH0oZCk7ZC5BWElTX0xBQkVMX0NMQVNTPSJheGlzLWxhYmVsIjtmLkF4aXNMYWJlbD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fApmdW5jdGlvbihBLHkpe2Z1bmN0aW9uIHcoKXt0aGlzLmNvbnN0cnVjdG9yPUF9Zm9yKHZhciBDIGluIHkpeS5oYXNPd25Qcm9wZXJ0eShDKSYmKEFbQ109eVtDXSk7QS5wcm90b3R5cGU9bnVsbD09PXk/T2JqZWN0LmNyZWF0ZSh5KToody5wcm90b3R5cGU9eS5wcm90b3R5cGUsbmV3IHcpfSx0PWgoMSksbD1oKDUpLHA9aCgyMyksbT1oKDgpLG49aCgzMSkscT1oKDApO2Q9aCg0KTt2YXIgdT1mdW5jdGlvbigpe2Z1bmN0aW9uIEEoeSx3LEMpe3ZvaWQgMD09PXkmJih5PVtdKTt2b2lkIDA9PT13JiYodz0wKTt2b2lkIDA9PT1DJiYoQz1JbmZpbml0eSk7dGhpcy5jb2x1bW5zPXk7dGhpcy5ib3R0b21QYWRkaW5nPXc7dGhpcy5tYXhXaWR0aD1DfUEucHJvdG90eXBlLmFkZENvbHVtbj1mdW5jdGlvbih5KXt2YXIgdz15LndpZHRoLEM9dGhpcy5nZXRXaWR0aEF2YWlsYWJsZSgpO3kud2lkdGg9TWF0aC5taW4oQyx3KTt0aGlzLmNvbHVtbnMucHVzaCh5KX07QS5wcm90b3R5cGUuZ2V0Qm91bmRzPQpmdW5jdGlvbih5KXtmb3IodmFyIHc9dGhpcy5jb2x1bW5zW3ldLEM9MCxHPTA7Rzx5O0crKylDKz10aGlzLmNvbHVtbnNbR10ud2lkdGg7cmV0dXJue3RvcExlZnQ6e3g6Qyx5OjB9LGJvdHRvbVJpZ2h0Ont4OkMrdy53aWR0aCx5OncuaGVpZ2h0fX19O0EucHJvdG90eXBlLmdldEhlaWdodD1mdW5jdGlvbigpe3JldHVybiBxLk1hdGgubWF4KHRoaXMuY29sdW1ucy5tYXAoZnVuY3Rpb24oeSl7cmV0dXJuIHkuaGVpZ2h0fSksMCkrdGhpcy5ib3R0b21QYWRkaW5nfTtBLnByb3RvdHlwZS5nZXRXaWR0aD1mdW5jdGlvbigpe3JldHVybiBNYXRoLm1pbih0aGlzLmNvbHVtbnMucmVkdWNlKGZ1bmN0aW9uKHksdyl7cmV0dXJuIHkrdy53aWR0aH0sMCksdGhpcy5tYXhXaWR0aCl9O0EucHJvdG90eXBlLmdldFdpZHRoQXZhaWxhYmxlPWZ1bmN0aW9uKCl7dmFyIHk9dGhpcy5nZXRXaWR0aCgpO3JldHVybiBNYXRoLm1heCh0aGlzLm1heFdpZHRoLXksMCl9O3JldHVybiBBfSgpLHg9ZnVuY3Rpb24oKXtmdW5jdGlvbiBBKHksCncsQyxHKXt2b2lkIDA9PT15JiYoeT1JbmZpbml0eSk7dm9pZCAwPT09dyYmKHc9SW5maW5pdHkpO3ZvaWQgMD09PUMmJihDPTApO3ZvaWQgMD09PUcmJihHPVtdKTt0aGlzLm1heFdpZHRoPXk7dGhpcy5tYXhIZWlnaHQ9dzt0aGlzLnBhZGRpbmc9Qzt0aGlzLnJvd3M9R31BLnByb3RvdHlwZS5hZGRSb3c9ZnVuY3Rpb24oeSl7eS5tYXhXaWR0aD10aGlzLm1heFdpZHRoLTIqdGhpcy5wYWRkaW5nO3RoaXMucm93cy5wdXNoKHkpfTtBLnByb3RvdHlwZS5nZXRDb2x1bW5Cb3VuZHM9ZnVuY3Rpb24oeSx3KXt2YXIgQz10aGlzLmdldFJvd0JvdW5kcyh5KTt5PXRoaXMucm93c1t5XS5nZXRCb3VuZHModyk7eS50b3BMZWZ0LngrPUMudG9wTGVmdC54O3kuYm90dG9tUmlnaHQueCs9Qy50b3BMZWZ0Lng7eS50b3BMZWZ0LnkrPUMudG9wTGVmdC55O3kuYm90dG9tUmlnaHQueSs9Qy50b3BMZWZ0Lnk7cmV0dXJuIHl9O0EucHJvdG90eXBlLmdldFJvd0JvdW5kcz1mdW5jdGlvbih5KXtmb3IodmFyIHc9CnRoaXMucGFkZGluZyxDPXRoaXMucGFkZGluZyxHPTA7Rzx5O0crKylDKz10aGlzLnJvd3NbR10uZ2V0SGVpZ2h0KCk7cmV0dXJue3RvcExlZnQ6e3g6dyx5OkN9LGJvdHRvbVJpZ2h0Ont4OncrdGhpcy5yb3dzW3ldLmdldFdpZHRoKCkseTpDK3RoaXMucm93c1t5XS5nZXRIZWlnaHQoKX19fTtBLnByb3RvdHlwZS5nZXRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5yb3dzLnJlZHVjZShmdW5jdGlvbih5LHcpe3JldHVybiB5K3cuZ2V0SGVpZ2h0KCl9LDApKzIqdGhpcy5wYWRkaW5nLHRoaXMubWF4SGVpZ2h0KX07QS5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4ocS5NYXRoLm1heCh0aGlzLnJvd3MubWFwKGZ1bmN0aW9uKHkpe3JldHVybiB5LmdldFdpZHRoKCl9KSwwKSsyKnRoaXMucGFkZGluZyx0aGlzLm1heFdpZHRoKX07cmV0dXJuIEF9KCk7ZD1mdW5jdGlvbihBKXtmdW5jdGlvbiB5KHcpe3ZhciBDPUEuY2FsbCh0aGlzKXx8CnRoaXM7Qy5fcGFkZGluZz01O0MuX3Jvd0JvdHRvbVBhZGRpbmc9MztDLmFkZENsYXNzKCJsZWdlbmQiKTtDLm1heEVudHJpZXNQZXJSb3coMSk7aWYobnVsbD09dyl0aHJvdyBFcnJvcigiTGVnZW5kIHJlcXVpcmVzIGEgY29sb3JTY2FsZSIpO0MuX2NvbG9yU2NhbGU9dztDLl9yZWRyYXdDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBDLnJlZHJhdygpfTtDLl9jb2xvclNjYWxlLm9uVXBkYXRlKEMuX3JlZHJhd0NhbGxiYWNrKTtDLl9mb3JtYXR0ZXI9bS5pZGVudGl0eSgpO0MubWF4TGluZXNQZXJFbnRyeSgxKTtDLnhBbGlnbm1lbnQoInJpZ2h0IikueUFsaWdubWVudCgidG9wIik7Qy5jb21wYXJhdG9yKGZ1bmN0aW9uKEcsRCl7dmFyIEI9Qy5fY29sb3JTY2FsZS5kb21haW4oKS5zbGljZSgpLm1hcChmdW5jdGlvbihJKXtyZXR1cm4gQy5fZm9ybWF0dGVyKEkpfSk7cmV0dXJuIEIuaW5kZXhPZihHKS1CLmluZGV4T2YoRCl9KTtDLl9zeW1ib2xGYWN0b3J5QWNjZXNzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gbi5jaXJjbGUoKX07CkMuX3N5bWJvbE9wYWNpdHlBY2Nlc3Nvcj1mdW5jdGlvbigpe3JldHVybiAxfTtyZXR1cm4gQ31rKHksQSk7eS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7QS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIHc9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCh5LkxFR0VORF9ST1dfQ0xBU1MsITApO3cuYXBwZW5kKCJnIikuY2xhc3NlZCh5LkxFR0VORF9FTlRSWV9DTEFTUywhMCkuYXBwZW5kKCJ0ZXh0Iik7dz1uZXcgbC5TdmdDb250ZXh0KHcubm9kZSgpLG51bGwscC5BRERfVElUTEVfRUxFTUVOVFMpO3RoaXMuX21lYXN1cmVyPW5ldyBsLkNhY2hlTWVhc3VyZXIodyk7dGhpcy5fd3JhcHBlcj0obmV3IGwuV3JhcHBlcikubWF4TGluZXModGhpcy5tYXhMaW5lc1BlckVudHJ5KCkpO3RoaXMuX3dyaXRlcj1uZXcgbC5Xcml0ZXIodGhpcy5fbWVhc3VyZXIsdyx0aGlzLl93cmFwcGVyKX07eS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHcpe2lmKG51bGw9PQp3KXJldHVybiB0aGlzLl9mb3JtYXR0ZXI7dGhpcy5fZm9ybWF0dGVyPXc7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUubWF4RW50cmllc1BlclJvdz1mdW5jdGlvbih3KXtpZihudWxsPT13KXJldHVybiB0aGlzLl9tYXhFbnRyaWVzUGVyUm93O3RoaXMuX21heEVudHJpZXNQZXJSb3c9dzt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTt5LnByb3RvdHlwZS5tYXhMaW5lc1BlckVudHJ5PWZ1bmN0aW9uKHcpe2lmKG51bGw9PXcpcmV0dXJuIHRoaXMuX21heExpbmVzUGVyRW50cnk7dGhpcy5fbWF4TGluZXNQZXJFbnRyeT13O3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O3kucHJvdG90eXBlLm1heFdpZHRoPWZ1bmN0aW9uKHcpe2lmKG51bGw9PXcpcmV0dXJuIHRoaXMuX21heFdpZHRoO3RoaXMuX21heFdpZHRoPXc7dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuY29tcGFyYXRvcj1mdW5jdGlvbih3KXtudWxsIT13JiYodGhpcy5fY29tcGFyYXRvcj0Kdyx0aGlzLnJlZHJhdygpKX07eS5wcm90b3R5cGUuY29sb3JTY2FsZT1mdW5jdGlvbih3KXtyZXR1cm4gbnVsbCE9dz8odGhpcy5fY29sb3JTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spLHRoaXMuX2NvbG9yU2NhbGU9dyx0aGlzLl9jb2xvclNjYWxlLm9uVXBkYXRlKHRoaXMuX3JlZHJhd0NhbGxiYWNrKSx0aGlzLnJlZHJhdygpLHRoaXMpOnRoaXMuX2NvbG9yU2NhbGV9O3kucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXtBLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7dGhpcy5fY29sb3JTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spfTt5LnByb3RvdHlwZS5fYnVpbGRMZWdlbmRUYWJsZT1mdW5jdGlvbih3LEMpe3ZhciBHPXRoaXMsRD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LEI9bmV3IHgodyxDLHRoaXMuX3BhZGRpbmcpO3c9dGhpcy5fY29sb3JTY2FsZS5kb21haW4oKS5zbGljZSgpLnNvcnQoZnVuY3Rpb24oTiwKTyl7cmV0dXJuIEcuX2NvbXBhcmF0b3IoRy5fZm9ybWF0dGVyKE4pLEcuX2Zvcm1hdHRlcihPKSl9KTt2YXIgST1uZXcgdTtCLmFkZFJvdyhJKTtJLmJvdHRvbVBhZGRpbmc9dGhpcy5fcm93Qm90dG9tUGFkZGluZzt3LmZvckVhY2goZnVuY3Rpb24oTil7SS5jb2x1bW5zLmxlbmd0aC8yPT09Ry5tYXhFbnRyaWVzUGVyUm93KCkmJihJPW5ldyB1LEkuYm90dG9tUGFkZGluZz1HLl9yb3dCb3R0b21QYWRkaW5nLEIuYWRkUm93KEkpKTt2YXIgTz1JLmdldFdpZHRoQXZhaWxhYmxlKCksSD1HLl9mb3JtYXR0ZXIoTiksSz1HLl9tZWFzdXJlci5tZWFzdXJlKEgpLndpZHRoOzA+Ty1ELUsmJjE8SS5jb2x1bW5zLmxlbmd0aCYmKEk9bmV3IHUsSS5ib3R0b21QYWRkaW5nPUcuX3Jvd0JvdHRvbVBhZGRpbmcsQi5hZGRSb3coSSkpO0kuYWRkQ29sdW1uKHt3aWR0aDpELGhlaWdodDpELGRhdGE6e25hbWU6Tix0eXBlOiJzeW1ib2wifX0pO089SS5nZXRXaWR0aEF2YWlsYWJsZSgpO089TWF0aC5taW4oTywKSyk7Ry5fd3JhcHBlci5tYXhMaW5lcyhHLm1heExpbmVzUGVyRW50cnkoKSk7SD1HLl93cmFwcGVyLndyYXAoSCxHLl9tZWFzdXJlcixPKS5ub0xpbmVzKkQ7SS5hZGRDb2x1bW4oe3dpZHRoOk8saGVpZ2h0OkgsZGF0YTp7bmFtZTpOLHR5cGU6InRleHQifX0pfSk7cmV0dXJuIEJ9O3kucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHcsQyl7dz10aGlzLl9idWlsZExlZ2VuZFRhYmxlKHEuTWF0aC5taW4oW3RoaXMubWF4V2lkdGgoKSx3XSx3KSxDKTtyZXR1cm57bWluSGVpZ2h0OncuZ2V0SGVpZ2h0KCksbWluV2lkdGg6dy5nZXRXaWR0aCgpfX07eS5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih3KXt2YXIgQz10aGlzO2lmKCF0aGlzLl9pc1NldHVwKXJldHVybltdO3ZhciBHPXRoaXMuX2J1aWxkTGVnZW5kVGFibGUodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpO3JldHVybiBHLnJvd3MucmVkdWNlKGZ1bmN0aW9uKEQsQixJKXtpZigwIT09RC5sZW5ndGgpcmV0dXJuIEQ7CnZhciBOPUcuZ2V0Um93Qm91bmRzKEkpO3JldHVybiBxLk1hdGgud2l0aGluKHcsTik/Qi5jb2x1bW5zLnJlZHVjZShmdW5jdGlvbihPLEgsSyl7dmFyIE09Ry5nZXRDb2x1bW5Cb3VuZHMoSSxLKTtpZihxLk1hdGgud2l0aGluKHcsTSkpe089Qy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIit5LkxFR0VORF9ST1dfQ0xBU1MpLm5vZGVzKClbSV07Sz10LnNlbGVjdChPKS5zZWxlY3RBbGwoIi4iK3kuTEVHRU5EX0VOVFJZX0NMQVNTKS5ub2RlcygpW01hdGguZmxvb3IoSy8yKV07dmFyIEw9dC5zZWxlY3QoSykuc2VsZWN0KCIuIit5LkxFR0VORF9TWU1CT0xfQ0xBU1MpO009cS5ET00uZ2V0VHJhbnNsYXRlVmFsdWVzKHQuc2VsZWN0KE8pKTtMPXEuRE9NLmdldFRyYW5zbGF0ZVZhbHVlcyhMKTtyZXR1cm5be2JvdW5kczpxLkRPTS5lbGVtZW50QkJveCh0LnNlbGVjdChPKSksZGF0dW06SC5kYXRhLm5hbWUscG9zaXRpb246e3g6TVswXStMWzBdLHk6TVsxXStMWzFdfSxzZWxlY3Rpb246dC5zZWxlY3QoSyksCmNvbXBvbmVudDpDfV19cmV0dXJuIE99LEQpOkR9LFtdKX07eS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtBLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpO3ZhciB3PXRoaXMuX2J1aWxkTGVnZW5kVGFibGUodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpO3RoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO3ZhciBDPXRoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiZy4iK3kuTEVHRU5EX1JPV19DTEFTUykuZGF0YSh3LnJvd3MpLEc9Qy5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5MRUdFTkRfUk9XX0NMQVNTLCEwKS5tZXJnZShDKTtDLmV4aXQoKS5yZW1vdmUoKTtHLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oQixJKXtCPXcuZ2V0Um93Qm91bmRzKEkpO3JldHVybiJ0cmFuc2xhdGUoIitCLnRvcExlZnQueCsiLCAiK0IudG9wTGVmdC55KyIpIn0pO3ZhciBEPXRoaXM7Ry5lYWNoKGZ1bmN0aW9uKEIsSSl7Zm9yKHZhciBOPQpbXSxPPTA7TzxCLmNvbHVtbnMubGVuZ3RoO08rPTIpTi5wdXNoKFtCLmNvbHVtbnNbT10sQi5jb2x1bW5zW08rMV1dKTtCPXQuc2VsZWN0KHRoaXMpLnNlbGVjdEFsbCgiZy4iK3kuTEVHRU5EX0VOVFJZX0NMQVNTKS5kYXRhKE4pO049Qi5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoeS5MRUdFTkRfRU5UUllfQ0xBU1MsITApLm1lcmdlKEIpO04uYXBwZW5kKCJwYXRoIikuYXR0cigiZCIsZnVuY3Rpb24oSCl7SD1IWzBdO3JldHVybiBELnN5bWJvbCgpKEguZGF0YS5uYW1lLEkpKC42KkguaGVpZ2h0KShudWxsKX0pLmF0dHIoInRyYW5zZm9ybSIsZnVuY3Rpb24oSCl7SD1IWzBdO3JldHVybiJ0cmFuc2xhdGUoIisody5nZXRDb2x1bW5Cb3VuZHMoSSx3LnJvd3NbSV0uY29sdW1ucy5pbmRleE9mKEgpKS50b3BMZWZ0LngrSC53aWR0aC8yKSsiLCAiK0guaGVpZ2h0LzIrIikifSkuYXR0cigiZmlsbCIsZnVuY3Rpb24oSCl7cmV0dXJuIEQuX2NvbG9yU2NhbGUuc2NhbGUoSFswXS5kYXRhLm5hbWUpfSkuYXR0cigib3BhY2l0eSIsCmZ1bmN0aW9uKEgpe3JldHVybiBELnN5bWJvbE9wYWNpdHkoKShIWzBdLmRhdGEubmFtZSxJKX0pLmNsYXNzZWQoeS5MRUdFTkRfU1lNQk9MX0NMQVNTLCEwKTtOLmFwcGVuZCgiZyIpLmNsYXNzZWQoInRleHQtY29udGFpbmVyIiwhMCkuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihIKXtyZXR1cm4idHJhbnNsYXRlKCIrdy5nZXRDb2x1bW5Cb3VuZHMoSSx3LnJvd3NbSV0uY29sdW1ucy5pbmRleE9mKEhbMV0pKS50b3BMZWZ0LngrIiwgMCkifSkuZWFjaChmdW5jdGlvbihIKXt2YXIgSz10LnNlbGVjdCh0aGlzKTtIPUhbMV07RC5fd3JpdGVyLndyaXRlKEQuX2Zvcm1hdHRlcihILmRhdGEubmFtZSksSC53aWR0aCxELmhlaWdodCgpLHt4QWxpZ246ImxlZnQiLHlBbGlnbjoidG9wIix0ZXh0Um90YXRpb246MH0sSy5ub2RlKCkpfSk7Qi5leGl0KCkucmVtb3ZlKCl9KTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuc3ltYm9sPWZ1bmN0aW9uKHcpe2lmKG51bGw9PXcpcmV0dXJuIHRoaXMuX3N5bWJvbEZhY3RvcnlBY2Nlc3NvcjsKdGhpcy5fc3ltYm9sRmFjdG9yeUFjY2Vzc29yPXc7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307eS5wcm90b3R5cGUuc3ltYm9sT3BhY2l0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zeW1ib2xPcGFjaXR5QWNjZXNzb3J9O3kucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH07eS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH07eS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5fbWVhc3VyZXIucmVzZXQoKX07cmV0dXJuIHl9KGQuQ29tcG9uZW50KTtkLkxFR0VORF9ST1dfQ0xBU1M9ImxlZ2VuZC1yb3ciO2QuTEVHRU5EX0VOVFJZX0NMQVNTPSJsZWdlbmQtZW50cnkiO2QuTEVHRU5EX1NZTUJPTF9DTEFTUz0ibGVnZW5kLXN5bWJvbCI7Zi5MZWdlbmQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPQpwfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDIpLGw9aCgwKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXtyZXR1cm4gbnVsbCE9PXAmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfWsobSxwKTttLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKG4pe3ZhciBxLHU9SW5maW5pdHk7dGhpcy5jb21wb25lbnRzKCkuZm9yRWFjaChmdW5jdGlvbih4KXt4PXguZW50aXR5TmVhcmVzdChuKTtpZihudWxsIT14KXt2YXIgQT1sLk1hdGguZGlzdGFuY2VTcXVhcmVkKHgucG9zaXRpb24sbik7QTw9dSYmKHU9QSxxPXgpfX0pO3JldHVybiBxfTttLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24obil7aWYobnVsbCE9biYmIShuIGluc3RhbmNlb2YgdC5QbG90KSl0aHJvdyBFcnJvcigiUGxvdCBHcm91cCBvbmx5IGFjY2VwdHMgcGxvdHMiKTsKcC5wcm90b3R5cGUuYXBwZW5kLmNhbGwodGhpcyxuKTtyZXR1cm4gdGhpc307cmV0dXJuIG19KGgoNDEpLkdyb3VwKTtmLlBsb3RHcm91cD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxKSxsPWgoMCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKG4pe3ZvaWQgMD09PW4mJihuPVtdKTt2YXIgcT1wLmNhbGwodGhpcyl8fHRoaXM7cS5fcm93UGFkZGluZz0wO3EuX2NvbHVtblBhZGRpbmc9MDtxLl9yb3dzPVtdO3EuX3Jvd1dlaWdodHM9W107cS5fY29sdW1uV2VpZ2h0cz1bXTtxLl9uUm93cz0wO3EuX25Db2xzPTA7cS5fY2FsY3VsYXRlZExheW91dD0KbnVsbDtxLmFkZENsYXNzKCJ0YWJsZSIpO24uZm9yRWFjaChmdW5jdGlvbih1LHgpe3UuZm9yRWFjaChmdW5jdGlvbihBLHkpe251bGwhPUEmJnEuYWRkKEEseCx5KX0pfSk7cmV0dXJuIHF9ayhtLHApO20ucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKG4pe2Zvcih2YXIgcT0wO3E8dGhpcy5fblJvd3M7cSsrKWZvcih2YXIgdT0wO3U8dGhpcy5fbkNvbHM7dSsrKW51bGwhPXRoaXMuX3Jvd3NbcV1bdV0mJm4odGhpcy5fcm93c1txXVt1XSl9O20ucHJvdG90eXBlLmhhcz1mdW5jdGlvbihuKXtmb3IodmFyIHE9MDtxPHRoaXMuX25Sb3dzO3ErKylmb3IodmFyIHU9MDt1PHRoaXMuX25Db2xzO3UrKylpZih0aGlzLl9yb3dzW3FdW3VdPT09bilyZXR1cm4hMDtyZXR1cm4hMX07bS5wcm90b3R5cGUuY29tcG9uZW50QXQ9ZnVuY3Rpb24obixxKXtyZXR1cm4gMD5ufHxuPj10aGlzLl9uUm93c3x8MD5xfHxxPj10aGlzLl9uQ29scz9udWxsOnRoaXMuX3Jvd3Nbbl1bcV19O20ucHJvdG90eXBlLmFkZD0KZnVuY3Rpb24obixxLHUpe2lmKG51bGw9PW4pdGhyb3cgRXJyb3IoIkNhbm5vdCBhZGQgbnVsbCB0byBhIHRhYmxlIGNlbGwiKTtpZighdGhpcy5oYXMobikpe2lmKG51bGwhPSh0aGlzLl9yb3dzW3FdJiZ0aGlzLl9yb3dzW3FdW3VdKSl0aHJvdyBFcnJvcigiY2VsbCBpcyBvY2N1cGllZCIpO24uZGV0YWNoKCk7dGhpcy5fblJvd3M9TWF0aC5tYXgocSsxLHRoaXMuX25Sb3dzKTt0aGlzLl9uQ29scz1NYXRoLm1heCh1KzEsdGhpcy5fbkNvbHMpO3RoaXMuX3BhZFRhYmxlVG9TaXplKHRoaXMuX25Sb3dzLHRoaXMuX25Db2xzKTt0aGlzLl9yb3dzW3FdW3VdPW47dGhpcy5fYWRvcHRBbmRBbmNob3Iobik7dGhpcy5yZWRyYXcoKX1yZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbihuKXtmb3IodmFyIHE9MDtxPHRoaXMuX25Sb3dzO3ErKylmb3IodmFyIHU9MDt1PHRoaXMuX25Db2xzO3UrKylpZih0aGlzLl9yb3dzW3FdW3VdPT09bil7dGhpcy5fcm93c1txXVt1XT0KbnVsbDtyZXR1cm59fTttLnByb3RvdHlwZS5faXRlcmF0ZUxheW91dD1mdW5jdGlvbihuLHEsdSl7dm9pZCAwPT09dSYmKHU9ITEpO3ZhciB4PXRoaXMuX3Jvd3MsQT10LnRyYW5zcG9zZSh0aGlzLl9yb3dzKTtuLT10aGlzLl9jb2x1bW5QYWRkaW5nKih0aGlzLl9uQ29scy0xKTtxLT10aGlzLl9yb3dQYWRkaW5nKih0aGlzLl9uUm93cy0xKTt4PW0uX2NhbGNDb21wb25lbnRXZWlnaHRzKHRoaXMuX3Jvd1dlaWdodHMseCxmdW5jdGlvbihMKXtyZXR1cm4gbnVsbD09THx8TC5maXhlZEhlaWdodCgpfSk7QT1tLl9jYWxjQ29tcG9uZW50V2VpZ2h0cyh0aGlzLl9jb2x1bW5XZWlnaHRzLEEsZnVuY3Rpb24oTCl7cmV0dXJuIG51bGw9PUx8fEwuZml4ZWRXaWR0aCgpfSk7dmFyIHk9QS5tYXAoZnVuY3Rpb24oTCl7cmV0dXJuIDA9PT1MPy41Okx9KSx3PXgubWFwKGZ1bmN0aW9uKEwpe3JldHVybiAwPT09TD8uNTpMfSk7eT1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoeSxuKTt2YXIgQz1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UodywKcSksRz1sLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KDAsdGhpcy5fbkNvbHMpLEQ9bC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Sb3dzKTt3PTA7Zm9yKHZhciBCLEksTjs7KXtEPWwuQXJyYXkuYWRkKEQsQyk7eT1sLkFycmF5LmFkZChHLHkpO0I9dGhpcy5fZGV0ZXJtaW5lR3VhcmFudGVlcyh5LEQsdSk7Rz1CLmd1YXJhbnRlZWRXaWR0aHM7RD1CLmd1YXJhbnRlZWRIZWlnaHRzO0k9Qi53YW50c1dpZHRoQXJyLnNvbWUoZnVuY3Rpb24oTCl7cmV0dXJuIEx9KTtOPUIud2FudHNIZWlnaHRBcnIuc29tZShmdW5jdGlvbihMKXtyZXR1cm4gTH0pO3ZhciBPPUssSD1NO3ZhciBLPW4tdC5zdW0oQi5ndWFyYW50ZWVkV2lkdGhzKTt2YXIgTT1xLXQuc3VtKEIuZ3VhcmFudGVlZEhlaWdodHMpO3k9dm9pZCAwO0k/KHk9Qi53YW50c1dpZHRoQXJyLm1hcChmdW5jdGlvbihMKXtyZXR1cm4gTD8uMTowfSkseT1sLkFycmF5LmFkZCh5LEEpKTp5PUE7Qz12b2lkIDA7Tj8oQz1CLndhbnRzSGVpZ2h0QXJyLm1hcChmdW5jdGlvbihMKXtyZXR1cm4gTD8KLjE6MH0pLEM9bC5BcnJheS5hZGQoQyx4KSk6Qz14O3k9bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHksSyk7Qz1tLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoQyxNKTt3Kys7SD0wPE0mJk0hPT1IO2lmKCEoMDxLJiZLIT09T3x8SCkpYnJlYWs7aWYoNTx3KWJyZWFrfUs9bi10LnN1bShCLmd1YXJhbnRlZWRXaWR0aHMpO009cS10LnN1bShCLmd1YXJhbnRlZWRIZWlnaHRzKTt5PW0uX2NhbGNQcm9wb3J0aW9uYWxTcGFjZShBLEspO0M9bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHgsTSk7cmV0dXJue2NvbFByb3BvcnRpb25hbFNwYWNlOnkscm93UHJvcG9ydGlvbmFsU3BhY2U6QyxndWFyYW50ZWVkV2lkdGhzOkIuZ3VhcmFudGVlZFdpZHRocyxndWFyYW50ZWVkSGVpZ2h0czpCLmd1YXJhbnRlZWRIZWlnaHRzLHdhbnRzV2lkdGg6SSx3YW50c0hlaWdodDpOfX07bS5wcm90b3R5cGUuX2RldGVybWluZUd1YXJhbnRlZXM9ZnVuY3Rpb24obixxLHUpe3ZvaWQgMD09PXUmJih1PSExKTt2YXIgeD0KbC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Db2xzKSxBPWwuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uUm93cykseT1sLkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KCExLHRoaXMuX25Db2xzKSx3PWwuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoITEsdGhpcy5fblJvd3MpO3RoaXMuX3Jvd3MuZm9yRWFjaChmdW5jdGlvbihDLEcpe0MuZm9yRWFjaChmdW5jdGlvbihELEIpe0Q9bnVsbCE9RD9ELnJlcXVlc3RlZFNwYWNlKG5bQl0scVtHXSk6e21pbldpZHRoOjAsbWluSGVpZ2h0OjB9O3hbQl09TWF0aC5tYXgoeFtCXSx1P01hdGgubWluKEQubWluV2lkdGgsbltCXSk6RC5taW5XaWR0aCk7QVtHXT1NYXRoLm1heChBW0ddLHU/TWF0aC5taW4oRC5taW5IZWlnaHQscVtHXSk6RC5taW5IZWlnaHQpO3ZhciBJPUQubWluV2lkdGg+bltCXTt5W0JdPXlbQl18fEk7Qj1ELm1pbkhlaWdodD5xW0ddO3dbR109d1tHXXx8Qn0pfSk7cmV0dXJue2d1YXJhbnRlZWRXaWR0aHM6eCwKZ3VhcmFudGVlZEhlaWdodHM6QSx3YW50c1dpZHRoQXJyOnksd2FudHNIZWlnaHRBcnI6d319O20ucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKG4scSl7dGhpcy5fY2FsY3VsYXRlZExheW91dD10aGlzLl9pdGVyYXRlTGF5b3V0KG4scSk7cmV0dXJue21pbldpZHRoOnQuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZFdpZHRocyksbWluSGVpZ2h0OnQuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZEhlaWdodHMpfX07bS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihuLHEsdSl7dmFyIHg9dGhpcztwLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxuLHEsdSk7bj10LnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRXaWR0aHMpO3E9dC5zdW0odGhpcy5fY2FsY3VsYXRlZExheW91dC5ndWFyYW50ZWVkSGVpZ2h0cyk7dT10aGlzLl9jYWxjdWxhdGVkTGF5b3V0O2lmKG4+dGhpcy53aWR0aCgpfHwKcT50aGlzLmhlaWdodCgpKXU9dGhpcy5faXRlcmF0ZUxheW91dCh0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSwhMCk7dmFyIEE9MCx5PWwuQXJyYXkuYWRkKHUucm93UHJvcG9ydGlvbmFsU3BhY2UsdS5ndWFyYW50ZWVkSGVpZ2h0cyksdz1sLkFycmF5LmFkZCh1LmNvbFByb3BvcnRpb25hbFNwYWNlLHUuZ3VhcmFudGVlZFdpZHRocyk7dGhpcy5fcm93cy5mb3JFYWNoKGZ1bmN0aW9uKEMsRyl7dmFyIEQ9MDtDLmZvckVhY2goZnVuY3Rpb24oQixJKXtudWxsIT1CJiZCLmNvbXB1dGVMYXlvdXQoe3g6RCx5OkF9LHdbSV0seVtHXSk7RCs9d1tJXSt4Ll9jb2x1bW5QYWRkaW5nfSk7QSs9eVtHXSt4Ll9yb3dQYWRkaW5nfSk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJvd1BhZGRpbmc9ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fcm93UGFkZGluZztpZighbC5NYXRoLmlzVmFsaWROdW1iZXIobil8fDA+bil0aHJvdyBFcnJvcigicm93UGFkZGluZyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpOwp0aGlzLl9yb3dQYWRkaW5nPW47dGhpcy5yZWRyYXcoKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuY29sdW1uUGFkZGluZz1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9jb2x1bW5QYWRkaW5nO2lmKCFsLk1hdGguaXNWYWxpZE51bWJlcihuKXx8MD5uKXRocm93IEVycm9yKCJjb2x1bW5QYWRkaW5nIG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7dGhpcy5fY29sdW1uUGFkZGluZz1uO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnJvd1dlaWdodD1mdW5jdGlvbihuLHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX3Jvd1dlaWdodHNbbl07aWYoIWwuTWF0aC5pc1ZhbGlkTnVtYmVyKHEpfHwwPnEpdGhyb3cgRXJyb3IoInJvd1dlaWdodCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpO3RoaXMuX3Jvd1dlaWdodHNbbl09cTt0aGlzLnJlZHJhdygpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5jb2x1bW5XZWlnaHQ9CmZ1bmN0aW9uKG4scSl7aWYobnVsbD09cSlyZXR1cm4gdGhpcy5fY29sdW1uV2VpZ2h0c1tuXTtpZighbC5NYXRoLmlzVmFsaWROdW1iZXIocSl8fDA+cSl0aHJvdyBFcnJvcigiY29sdW1uV2VpZ2h0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7dGhpcy5fY29sdW1uV2VpZ2h0c1tuXT1xO3RoaXMucmVkcmF3KCk7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXt2YXIgbj10LnRyYW5zcG9zZSh0aGlzLl9yb3dzKTtyZXR1cm4gbS5fZml4ZWRTcGFjZShuLGZ1bmN0aW9uKHEpe3JldHVybiBudWxsPT1xfHxxLmZpeGVkV2lkdGgoKX0pfTttLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiBtLl9maXhlZFNwYWNlKHRoaXMuX3Jvd3MsZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PW58fG4uZml4ZWRIZWlnaHQoKX0pfTttLnByb3RvdHlwZS5fcGFkVGFibGVUb1NpemU9ZnVuY3Rpb24obixxKXtmb3IodmFyIHU9CjA7dTxuO3UrKyl7dm9pZCAwPT09dGhpcy5fcm93c1t1XSYmKHRoaXMuX3Jvd3NbdV09W10sdGhpcy5fcm93V2VpZ2h0c1t1XT1udWxsKTtmb3IodmFyIHg9MDt4PHE7eCsrKXZvaWQgMD09PXRoaXMuX3Jvd3NbdV1beF0mJih0aGlzLl9yb3dzW3VdW3hdPW51bGwpfWZvcih4PTA7eDxxO3grKyl2b2lkIDA9PT10aGlzLl9jb2x1bW5XZWlnaHRzW3hdJiYodGhpcy5fY29sdW1uV2VpZ2h0c1t4XT1udWxsKX07bS5fY2FsY0NvbXBvbmVudFdlaWdodHM9ZnVuY3Rpb24obixxLHUpe3JldHVybiBuLm1hcChmdW5jdGlvbih4LEEpe3JldHVybiBudWxsIT14P3g6cVtBXS5tYXAodSkucmVkdWNlKGZ1bmN0aW9uKHksdyl7cmV0dXJuIHkmJnd9LCEwKT8wOjF9KX07bS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlPWZ1bmN0aW9uKG4scSl7dmFyIHU9dC5zdW0obik7cmV0dXJuIDA9PT11P2wuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCxuLmxlbmd0aCk6bi5tYXAoZnVuY3Rpb24oeCl7cmV0dXJuIHEqCngvdX0pfTttLl9maXhlZFNwYWNlPWZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSh4KXtyZXR1cm4geC5yZWR1Y2UoZnVuY3Rpb24oQSx5KXtyZXR1cm4gQSYmeX0sITApfXJldHVybiB1KG4ubWFwKGZ1bmN0aW9uKHgpe3JldHVybiB1KHgubWFwKHEpKX0pKX07cmV0dXJuIG19KGgoMjkpLkNvbXBvbmVudENvbnRhaW5lcik7Zi5UYWJsZT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3ZhciBwPXQuY2FsbCh0aGlzKXx8dGhpcztwLmFkZENsYXNzKCJ4LWRyYWctYm94LWxheWVyIik7cC5faGFzQ29ybmVycz0hMTsKcmV0dXJuIHB9ayhsLHQpO2wucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24ocCxtLG4pe3QucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLHAsbSxuKTt0aGlzLl9zZXRCb3VuZHModGhpcy5ib3VuZHMoKSk7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLl9zZXRCb3VuZHM9ZnVuY3Rpb24ocCl7dC5wcm90b3R5cGUuX3NldEJvdW5kcy5jYWxsKHRoaXMse3RvcExlZnQ6e3g6cC50b3BMZWZ0LngseTowfSxib3R0b21SaWdodDp7eDpwLmJvdHRvbVJpZ2h0LngseTp0aGlzLmhlaWdodCgpfX0pfTtsLnByb3RvdHlwZS5fc2V0UmVzaXphYmxlQ2xhc3Nlcz1mdW5jdGlvbihwKXtwJiZ0aGlzLmVuYWJsZWQoKT90aGlzLmFkZENsYXNzKCJ4LXJlc2l6YWJsZSIpOnRoaXMucmVtb3ZlQ2xhc3MoIngtcmVzaXphYmxlIil9O2wucHJvdG90eXBlLnlTY2FsZT1mdW5jdGlvbihwKXtpZihudWxsPT1wKXJldHVybiB0LnByb3RvdHlwZS55U2NhbGUuY2FsbCh0aGlzKTt0aHJvdyBFcnJvcigieVNjYWxlcyBjYW5ub3QgYmUgc2V0IG9uIGFuIFhEcmFnQm94TGF5ZXIiKTsKfTtsLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLnlFeHRlbnQuY2FsbCh0aGlzKTt0aHJvdyBFcnJvcigiWERyYWdCb3hMYXllciBoYXMgbm8geUV4dGVudCIpO307cmV0dXJuIGx9KGgoMzIpLkRyYWdCb3hMYXllcik7Zi5YRHJhZ0JveExheWVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odCxsKXtmdW5jdGlvbiBwKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fWZvcih2YXIgbSBpbiBsKWwuaGFzT3duUHJvcGVydHkobSkmJih0W21dPWxbbV0pO3QucHJvdG90eXBlPW51bGw9PT1sP09iamVjdC5jcmVhdGUobCk6KHAucHJvdG90eXBlPWwucHJvdG90eXBlLG5ldyBwKX07ZD1mdW5jdGlvbih0KXtmdW5jdGlvbiBsKCl7dmFyIHA9dC5jYWxsKHRoaXMpfHx0aGlzO3AuYWRkQ2xhc3MoInktZHJhZy1ib3gtbGF5ZXIiKTtwLl9oYXNDb3JuZXJzPSExO3JldHVybiBwfWsobCx0KTtsLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PQpmdW5jdGlvbihwLG0sbil7dC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMscCxtLG4pO3RoaXMuX3NldEJvdW5kcyh0aGlzLmJvdW5kcygpKTtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUuX3NldEJvdW5kcz1mdW5jdGlvbihwKXt0LnByb3RvdHlwZS5fc2V0Qm91bmRzLmNhbGwodGhpcyx7dG9wTGVmdDp7eDowLHk6cC50b3BMZWZ0Lnl9LGJvdHRvbVJpZ2h0Ont4OnRoaXMud2lkdGgoKSx5OnAuYm90dG9tUmlnaHQueX19KX07bC5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24ocCl7cCYmdGhpcy5lbmFibGVkKCk/dGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJ5LXJlc2l6YWJsZSIpfTtsLnByb3RvdHlwZS54U2NhbGU9ZnVuY3Rpb24ocCl7aWYobnVsbD09cClyZXR1cm4gdC5wcm90b3R5cGUueFNjYWxlLmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoInhTY2FsZXMgY2Fubm90IGJlIHNldCBvbiBhbiBZRHJhZ0JveExheWVyIik7Cn07bC5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0LnByb3RvdHlwZS54RXh0ZW50LmNhbGwodGhpcyk7dGhyb3cgRXJyb3IoIllEcmFnQm94TGF5ZXIgaGFzIG5vIHhFeHRlbnQiKTt9O3JldHVybiBsfShoKDMyKS5EcmFnQm94TGF5ZXIpO2YuWURyYWdCb3hMYXllcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3ZhciBwPXQuY2FsbCh0aGlzKXx8dGhpcztwLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2wuX0tFWURPV05fRVZFTlRfTkFNRV09ZnVuY3Rpb24obSl7cmV0dXJuIHAuX3Byb2Nlc3NLZXlkb3duKG0pfTsKcC5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltsLl9LRVlVUF9FVkVOVF9OQU1FXT1mdW5jdGlvbihtKXtyZXR1cm4gcC5fcHJvY2Vzc0tleXVwKG0pfTtyZXR1cm4gcH1rKGwsdCk7bC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKCl7dmFyIHA9ZG9jdW1lbnRbbC5fRElTUEFUQ0hFUl9LRVldO251bGw9PXAmJihwPW5ldyBsLGRvY3VtZW50W2wuX0RJU1BBVENIRVJfS0VZXT1wKTtyZXR1cm4gcH07bC5wcm90b3R5cGUuX3Byb2Nlc3NLZXlkb3duPWZ1bmN0aW9uKHApe3RoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChsLl9LRVlET1dOX0VWRU5UX05BTUUscC5rZXlDb2RlLHApfTtsLnByb3RvdHlwZS5fcHJvY2Vzc0tleXVwPWZ1bmN0aW9uKHApe3RoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChsLl9LRVlVUF9FVkVOVF9OQU1FLHAua2V5Q29kZSxwKX07bC5wcm90b3R5cGUub25LZXlEb3duPWZ1bmN0aW9uKHApe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQobC5fS0VZRE9XTl9FVkVOVF9OQU1FLApwKX07bC5wcm90b3R5cGUub2ZmS2V5RG93bj1mdW5jdGlvbihwKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGwuX0tFWURPV05fRVZFTlRfTkFNRSxwKX07bC5wcm90b3R5cGUub25LZXlVcD1mdW5jdGlvbihwKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGwuX0tFWVVQX0VWRU5UX05BTUUscCl9O2wucHJvdG90eXBlLm9mZktleVVwPWZ1bmN0aW9uKHApe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQobC5fS0VZVVBfRVZFTlRfTkFNRSxwKX07cmV0dXJuIGx9KGgoMjQpLkRpc3BhdGNoZXIpO2QuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX0tleSI7ZC5fS0VZRE9XTl9FVkVOVF9OQU1FPSJrZXlkb3duIjtkLl9LRVlVUF9FVkVOVF9OQU1FPSJrZXl1cCI7Zi5LZXk9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmCihsW25dPXBbbl0pO2wucHJvdG90eXBlPW51bGw9PT1wP09iamVjdC5jcmVhdGUocCk6KG0ucHJvdG90eXBlPXAucHJvdG90eXBlLG5ldyBtKX0sdD1oKDApO2Q9ZnVuY3Rpb24obCl7ZnVuY3Rpb24gcChtKXtmdW5jdGlvbiBuKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFTU9WRV9FVkVOVF9OQU1FLCJwYWdlIil9dmFyIHE9bC5jYWxsKHRoaXMpfHx0aGlzO3EuX2xhc3RNb3VzZVBvc2l0aW9uPXt4Oi0xLHk6LTF9O3EuX3RyYW5zbGF0b3I9dC5nZXRUcmFuc2xhdG9yKG0pO3EuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bcC5fTU9VU0VPVkVSX0VWRU5UX05BTUVdPW47cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRU1PVkVfRVZFTlRfTkFNRV09bjtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX01PVVNFT1VUX0VWRU5UX05BTUVdPW47cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRURPV05fRVZFTlRfTkFNRV09CmZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFRE9XTl9FVkVOVF9OQU1FKX07cS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9NT1VTRVVQX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX01PVVNFVVBfRVZFTlRfTkFNRSwicGFnZSIpfTtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1dIRUVMX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX1dIRUVMX0VWRU5UX05BTUUpfTtxLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX0RCTENMSUNLX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHUpe3JldHVybiBxLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSx1LHAuX0RCTENMSUNLX0VWRU5UX05BTUUpfTtyZXR1cm4gcX1rKHAsbCk7cC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKG0pe3ZhciBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCksCnE9bltwLl9ESVNQQVRDSEVSX0tFWV07bnVsbD09cSYmKHE9bmV3IHAobSksbltwLl9ESVNQQVRDSEVSX0tFWV09cSk7cmV0dXJuIHF9O3AucHJvdG90eXBlLm9uTW91c2VNb3ZlPWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fTU9VU0VNT1ZFX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9mZk1vdXNlTW92ZT1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFTU9WRV9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vbk1vdXNlRG93bj1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFRE9XTl9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZNb3VzZURvd249ZnVuY3Rpb24obSl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChwLl9NT1VTRURPV05fRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25Nb3VzZVVwPWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fTU9VU0VVUF9FVkVOVF9OQU1FLAptKX07cC5wcm90b3R5cGUub2ZmTW91c2VVcD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX01PVVNFVVBfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25XaGVlbD1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX1dIRUVMX0VWRU5UX05BTUUsbSk7cmV0dXJuIHRoaXN9O3AucHJvdG90eXBlLm9mZldoZWVsPWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fV0hFRUxfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUub25EYmxDbGljaz1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX0RCTENMSUNLX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9mZkRibENsaWNrPWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fREJMQ0xJQ0tfRVZFTlRfTkFNRSxtKX07cC5wcm90b3R5cGUuX21lYXN1cmVBbmREaXNwYXRjaD1mdW5jdGlvbihtLG4scSwKdSl7dm9pZCAwPT09dSYmKHU9ImVsZW1lbnQiKTtpZigicGFnZSIhPT11JiYiZWxlbWVudCIhPT11KXRocm93IEVycm9yKCJJbnZhbGlkIHNjb3BlICciK3UrIicsIG11c3QgYmUgJ2VsZW1lbnQnIG9yICdwYWdlJyIpO2lmKCJwYWdlIj09PXV8fHRoaXMuZXZlbnRJbnNpZGUobSxuKSl0aGlzLl9sYXN0TW91c2VQb3NpdGlvbj10aGlzLl90cmFuc2xhdG9yLmNvbXB1dGVQb3NpdGlvbihuLmNsaWVudFgsbi5jbGllbnRZKSx0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQocSx0aGlzLmxhc3RNb3VzZVBvc2l0aW9uKCksbil9O3AucHJvdG90eXBlLmV2ZW50SW5zaWRlPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHQuVHJhbnNsYXRvci5pc0V2ZW50SW5zaWRlKG0sbil9O3AucHJvdG90eXBlLmxhc3RNb3VzZVBvc2l0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhc3RNb3VzZVBvc2l0aW9ufTtyZXR1cm4gcH0oaCgyNCkuRGlzcGF0Y2hlcik7ZC5fRElTUEFUQ0hFUl9LRVk9Il9fUGxvdHRhYmxlX0Rpc3BhdGNoZXJfTW91c2UiOwpkLl9NT1VTRU9WRVJfRVZFTlRfTkFNRT0ibW91c2VvdmVyIjtkLl9NT1VTRU1PVkVfRVZFTlRfTkFNRT0ibW91c2Vtb3ZlIjtkLl9NT1VTRU9VVF9FVkVOVF9OQU1FPSJtb3VzZW91dCI7ZC5fTU9VU0VET1dOX0VWRU5UX05BTUU9Im1vdXNlZG93biI7ZC5fTU9VU0VVUF9FVkVOVF9OQU1FPSJtb3VzZXVwIjtkLl9XSEVFTF9FVkVOVF9OQU1FPSJ3aGVlbCI7ZC5fREJMQ0xJQ0tfRVZFTlRfTkFNRT0iZGJsY2xpY2siO2YuTW91c2U9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihsLHApe2Z1bmN0aW9uIG0oKXt0aGlzLmNvbnN0cnVjdG9yPWx9Zm9yKHZhciBuIGluIHApcC5oYXNPd25Qcm9wZXJ0eShuKSYmKGxbbl09cFtuXSk7bC5wcm90b3R5cGU9bnVsbD09PXA/T2JqZWN0LmNyZWF0ZShwKToobS5wcm90b3R5cGU9cC5wcm90b3R5cGUsbmV3IG0pfSx0PWgoMCk7ZD1mdW5jdGlvbihsKXtmdW5jdGlvbiBwKG0pe3ZhciBuPWwuY2FsbCh0aGlzKXx8CnRoaXM7bi5fdHJhbnNsYXRvcj10LmdldFRyYW5zbGF0b3IobSk7bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9UT1VDSFNUQVJUX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHEpe3JldHVybiBuLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSxxLHAuX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSwicGFnZSIpfTtuLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1RPVUNITU9WRV9FVkVOVF9OQU1FXT1mdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUFuZERpc3BhdGNoKG0scSxwLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSwicGFnZSIpfTtuLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW3AuX1RPVUNIRU5EX0VWRU5UX05BTUVdPWZ1bmN0aW9uKHEpe3JldHVybiBuLl9tZWFzdXJlQW5kRGlzcGF0Y2gobSxxLHAuX1RPVUNIRU5EX0VWRU5UX05BTUUsInBhZ2UiKX07bi5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltwLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FXT1mdW5jdGlvbihxKXtyZXR1cm4gbi5fbWVhc3VyZUFuZERpc3BhdGNoKG0sCnEscC5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSwicGFnZSIpfTtyZXR1cm4gbn1rKHAsbCk7cC5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKG0pe3ZhciBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCkscT1uW3AuX0RJU1BBVENIRVJfS0VZXTtudWxsPT1xJiYocT1uZXcgcChtKSxuW3AuX0RJU1BBVENIRVJfS0VZXT1xKTtyZXR1cm4gcX07cC5wcm90b3R5cGUub25Ub3VjaFN0YXJ0PWZ1bmN0aW9uKG0pe3RoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQocC5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaFN0YXJ0PWZ1bmN0aW9uKG0pe3RoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQocC5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vblRvdWNoTW92ZT1mdW5jdGlvbihtKXt0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNITU9WRV9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaE1vdmU9ZnVuY3Rpb24obSl7dGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSwKbSl9O3AucHJvdG90eXBlLm9uVG91Y2hFbmQ9ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSEVORF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaEVuZD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNIRU5EX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLm9uVG91Y2hDYW5jZWw9ZnVuY3Rpb24obSl7dGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChwLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FLG0pfTtwLnByb3RvdHlwZS5vZmZUb3VjaENhbmNlbD1mdW5jdGlvbihtKXt0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KHAuX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUUsbSl9O3AucHJvdG90eXBlLl9tZWFzdXJlQW5kRGlzcGF0Y2g9ZnVuY3Rpb24obSxuLHEsdSl7dm9pZCAwPT09dSYmKHU9ImVsZW1lbnQiKTtpZigicGFnZSIhPT11JiYiZWxlbWVudCIhPT11KXRocm93IEVycm9yKCJJbnZhbGlkIHNjb3BlICciKwp1KyInLCBtdXN0IGJlICdlbGVtZW50JyBvciAncGFnZSciKTtpZigiZWxlbWVudCIhPT11fHx0aGlzLmV2ZW50SW5zaWRlKG0sbikpe209bi5jaGFuZ2VkVG91Y2hlczt1PXt9O2Zvcih2YXIgeD1bXSxBPTA7QTxtLmxlbmd0aDtBKyspe3ZhciB5PW1bQV0sdz15LmlkZW50aWZpZXI7eT10aGlzLl90cmFuc2xhdG9yLmNvbXB1dGVQb3NpdGlvbih5LmNsaWVudFgseS5jbGllbnRZKTtudWxsIT15JiYodVt3XT15LHgucHVzaCh3KSl9MDx4Lmxlbmd0aCYmdGhpcy5fY2FsbENhbGxiYWNrc0ZvckV2ZW50KHEseCx1LG4pfX07cC5wcm90b3R5cGUuZXZlbnRJbnNpZGU9ZnVuY3Rpb24obSxuKXtyZXR1cm4gdC5UcmFuc2xhdG9yLmlzRXZlbnRJbnNpZGUobSxuKX07cmV0dXJuIHB9KGgoMjQpLkRpc3BhdGNoZXIpO2QuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX1RvdWNoIjtkLl9UT1VDSFNUQVJUX0VWRU5UX05BTUU9InRvdWNoc3RhcnQiO2QuX1RPVUNITU9WRV9FVkVOVF9OQU1FPQoidG91Y2htb3ZlIjtkLl9UT1VDSEVORF9FVkVOVF9OQU1FPSJ0b3VjaGVuZCI7ZC5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRT0idG91Y2hjYW5jZWwiO2YuVG91Y2g9ZH0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHQsbCl7dm9pZCAwPT09bCYmKGw9d2luZG93LmRldmljZVBpeGVsUmF0aW8pO3RoaXMuc2NyZWVuV2lkdGg9azt0aGlzLnNjcmVlbkhlaWdodD10O3RoaXMuZGV2aWNlUGl4ZWxSYXRpbz1sO3RoaXMucGl4ZWxXaWR0aD1rKmw7dGhpcy5waXhlbEhlaWdodD10Kmw7dGhpcy5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIik7dGhpcy5jdHg9dGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKTtoLnNpemVQaXhlbHModGhpcy5jdHgsayx0LGwpfWguc2l6ZVBpeGVscz1mdW5jdGlvbihrLHQsbCxwKXt2YXIgbT1rLmNhbnZhczttLndpZHRoPXQqcDttLmhlaWdodD1sKnA7bS5zdHlsZS53aWR0aD10KyJweCI7bS5zdHlsZS5oZWlnaHQ9CmwrInB4IjtrLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCk7ay5zY2FsZShwLHApfTtoLnByb3RvdHlwZS5ibGl0PWZ1bmN0aW9uKGssdCxsKXt2b2lkIDA9PT10JiYodD0wKTt2b2lkIDA9PT1sJiYobD0wKTtrLmRyYXdJbWFnZSh0aGlzLmNhbnZhcyx0LGwsdGhpcy5zY3JlZW5XaWR0aCx0aGlzLnNjcmVlbkhlaWdodCl9O2gucHJvdG90eXBlLmJsaXRDZW50ZXI9ZnVuY3Rpb24oayx0LGwpe3ZvaWQgMD09PXQmJih0PTApO3ZvaWQgMD09PWwmJihsPTApO3RoaXMuYmxpdChrLE1hdGguZmxvb3IodC10aGlzLnNjcmVlbldpZHRoLzIpLE1hdGguZmxvb3IobC10aGlzLnNjcmVlbkhlaWdodC8yKSl9O2gucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihrLHQsbCl7dm9pZCAwPT09bCYmKGw9ITEpO3ZhciBwPXRoaXMuZGV2aWNlUGl4ZWxSYXRpbzt0aGlzLnNjcmVlbldpZHRoPWs7dGhpcy5zY3JlZW5IZWlnaHQ9dDt0aGlzLnBpeGVsV2lkdGg9aypwO3RoaXMucGl4ZWxIZWlnaHQ9dCpwOwpoLnNpemVQaXhlbHModGhpcy5jdHgsayx0LHApO2wmJnRoaXMuY3R4LnRyYW5zbGF0ZShrLzIsay8yKTtyZXR1cm4gdGhpc307aC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oayl7dmFyIHQ9dGhpcy5waXhlbFdpZHRoLGw9dGhpcy5waXhlbEhlaWdodCxwPXRoaXMuY3R4O3Auc2F2ZSgpO3Auc2V0VHJhbnNmb3JtKDEsMCwwLDEsMCwwKTtudWxsPT1rP3AuY2xlYXJSZWN0KDAsMCx0LGwpOihwLmZpbGxTdHlsZT1rLHAuZmlsbFJlY3QoMCwwLHQsbCkpO3AucmVzdG9yZSgpO3JldHVybiB0aGlzfTtoLnByb3RvdHlwZS5nZXRJbWFnZURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHguZ2V0SW1hZ2VEYXRhKDAsMCx0aGlzLnBpeGVsV2lkdGgsdGhpcy5waXhlbEhlaWdodCl9O3JldHVybiBofSgpO2YuQ2FudmFzQnVmZmVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgxMyksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbSgpe3ZhciBuPW51bGwhPT1wJiZwLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztuLl9jbGlja2VkRG93bj0hMTtuLl9kb3VibGVDbGlja2luZz0hMTtuLl9vbkNsaWNrQ2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O24uX29uRG91YmxlQ2xpY2tDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7bi5fbW91c2VEb3duQ2FsbGJhY2s9ZnVuY3Rpb24ocSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrRG93bihxKX07bi5fbW91c2VVcENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrVXAocSx1KX07bi5fZGJsQ2xpY2tDYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVEYmxDbGljayhxLAp1KX07bi5fdG91Y2hTdGFydENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrRG93bih1W3FbMF1dKX07bi5fdG91Y2hFbmRDYWxsYmFjaz1mdW5jdGlvbihxLHUseCl7cmV0dXJuIG4uX2hhbmRsZUNsaWNrVXAodVtxWzBdXSx4KX07bi5fdG91Y2hDYW5jZWxDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBuLl9jbGlja2VkRG93bj0hMX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24obil7cC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsbik7dGhpcy5fbW91c2VEaXNwYXRjaGVyPXQuTW91c2UuZ2V0RGlzcGF0Y2hlcihuKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25EYmxDbGljayh0aGlzLl9kYmxDbGlja0NhbGxiYWNrKTsKdGhpcy5fdG91Y2hEaXNwYXRjaGVyPXQuVG91Y2guZ2V0RGlzcGF0Y2hlcihuKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayl9O20ucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3AucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZkRibENsaWNrKHRoaXMuX2RibENsaWNrQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7CnRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9O20ucHJvdG90eXBlLl9oYW5kbGVDbGlja0Rvd249ZnVuY3Rpb24obil7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3RoaXMuX2lzSW5zaWRlQ29tcG9uZW50KG4pJiYodGhpcy5fY2xpY2tlZERvd249ITAsdGhpcy5fY2xpY2tlZFBvaW50PW4pfTttLnByb3RvdHlwZS5faGFuZGxlQ2xpY2tVcD1mdW5jdGlvbihuLHEpe3ZhciB1PXRoaXMseD10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3RoaXMuX2NsaWNrZWREb3duJiZtLl9wb2ludHNFcXVhbCh4LHRoaXMuX2NsaWNrZWRQb2ludCkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXt1Ll9kb3VibGVDbGlja2luZ3x8dS5fb25DbGlja0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHgsCnEpfSwwKTt0aGlzLl9jbGlja2VkRG93bj0hMX07bS5wcm90b3R5cGUuX2hhbmRsZURibENsaWNrPWZ1bmN0aW9uKG4scSl7dmFyIHU9dGhpcztuPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2Uobik7dGhpcy5fZG91YmxlQ2xpY2tpbmc9ITA7dGhpcy5fb25Eb3VibGVDbGlja0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKG4scSk7c2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB1Ll9kb3VibGVDbGlja2luZz0hMX0sMCl9O20uX3BvaW50c0VxdWFsPWZ1bmN0aW9uKG4scSl7cmV0dXJuIG4ueD09PXEueCYmbi55PT09cS55fTttLnByb3RvdHlwZS5vbkNsaWNrPWZ1bmN0aW9uKG4pe3RoaXMuX29uQ2xpY2tDYWxsYmFja3MuYWRkKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vZmZDbGljaz1mdW5jdGlvbihuKXt0aGlzLl9vbkNsaWNrQ2FsbGJhY2tzLmRlbGV0ZShuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub25Eb3VibGVDbGljaz1mdW5jdGlvbihuKXt0aGlzLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzLmFkZChuKX07Cm0ucHJvdG90eXBlLm9mZkRvdWJsZUNsaWNrPWZ1bmN0aW9uKG4pe3RoaXMuX29uRG91YmxlQ2xpY2tDYWxsYmFja3MuZGVsZXRlKG4pO3JldHVybiB0aGlzfTtyZXR1cm4gbX0oaCgxNSkuSW50ZXJhY3Rpb24pO2YuQ2xpY2s9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMTMpLGw9aCgwKTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXt2YXIgbj1udWxsIT09cCYmcC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7bi5fZHJhZ2dpbmc9ITE7bi5fY29uc3RyYWluZWRUb0NvbXBvbmVudD0hMDtuLl9tb3VzZUZpbHRlcj1tLl9ERUZBVUxUX01PVVNFX0ZJTFRFUjsKbi5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBsLkNhbGxiYWNrU2V0O24uX2RyYWdDYWxsYmFja3M9bmV3IGwuQ2FsbGJhY2tTZXQ7bi5fZHJhZ0VuZENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9tb3VzZURvd25DYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9zdGFydERyYWcocSx1KX07bi5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24ocSl7cmV0dXJuIG4uX2RvRHJhZyhxKX07bi5fbW91c2VVcENhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2VuZERyYWcocSx1KX07bi5fdG91Y2hTdGFydENhbGxiYWNrPWZ1bmN0aW9uKHEsdSx4KXtyZXR1cm4gbi5fc3RhcnREcmFnKHVbcVswXV0seCl9O24uX3RvdWNoTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKHEsdSl7cmV0dXJuIG4uX2RvRHJhZyh1W3FbMF1dKX07bi5fdG91Y2hFbmRDYWxsYmFjaz1mdW5jdGlvbihxLHUseCl7cmV0dXJuIG4uX2VuZERyYWcodVtxWzBdXSx4KX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9CmZ1bmN0aW9uKG4pe3AucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLG4pO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj10Lk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9dC5Ub3VjaC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spfTsKbS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlRG93bih0aGlzLl9tb3VzZURvd25DYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKTt0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbDt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbH07bS5wcm90b3R5cGUuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbj0KZnVuY3Rpb24obil7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3JldHVybiB0aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50P3t4OmwuTWF0aC5jbGFtcChuLngsMCx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkpLHk6bC5NYXRoLmNsYW1wKG4ueSwwLHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8uaGVpZ2h0KCkpfTpufTttLnByb3RvdHlwZS5fc3RhcnREcmFnPWZ1bmN0aW9uKG4scSl7cSBpbnN0YW5jZW9mIE1vdXNlRXZlbnQmJiF0aGlzLl9tb3VzZUZpbHRlcihxKXx8KG49dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShuKSx0aGlzLl9pc0luc2lkZUNvbXBvbmVudChuKSYmKHEucHJldmVudERlZmF1bHQoKSx0aGlzLl9kcmFnZ2luZz0hMCx0aGlzLl9kcmFnT3JpZ2luPW4sdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcy5fZHJhZ09yaWdpbikpKX07bS5wcm90b3R5cGUuX2RvRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnZ2luZyYmCnRoaXMuX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzLl9kcmFnT3JpZ2luLHRoaXMuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbihuKSl9O20ucHJvdG90eXBlLl9lbmREcmFnPWZ1bmN0aW9uKG4scSl7cSBpbnN0YW5jZW9mIE1vdXNlRXZlbnQmJjAhPT1xLmJ1dHRvbnx8IXRoaXMuX2RyYWdnaW5nfHwodGhpcy5fZHJhZ2dpbmc9ITEsdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMuX2RyYWdPcmlnaW4sdGhpcy5fdHJhbnNsYXRlQW5kQ29uc3RyYWluKG4pKSl9O20ucHJvdG90eXBlLmNvbnN0cmFpbmVkVG9Db21wb25lbnQ9ZnVuY3Rpb24oKXt0aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50PSExfTttLnByb3RvdHlwZS5tb3VzZUZpbHRlcj1mdW5jdGlvbihuKXswIT09YXJndW1lbnRzLmxlbmd0aCYmKHRoaXMuX21vdXNlRmlsdGVyPW4pfTttLnByb3RvdHlwZS5vbkRyYWdTdGFydD1mdW5jdGlvbihuKXt0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuYWRkKG4pfTsKbS5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0PWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUobil9O20ucHJvdG90eXBlLm9uRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZChuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUub2ZmRHJhZz1mdW5jdGlvbihuKXt0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShuKX07bS5wcm90b3R5cGUub25EcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZEcmFnRW5kPWZ1bmN0aW9uKG4pe3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKG4pfTtyZXR1cm4gbX0oaCgxNSkuSW50ZXJhY3Rpb24pO2QuX0RFRkFVTFRfTU9VU0VfRklMVEVSPWZ1bmN0aW9uKHApe3JldHVybiAwPT09cC5idXR0b259O2YuRHJhZz1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHUseCl7ZnVuY3Rpb24gQSgpe3RoaXMuY29uc3RydWN0b3I9CnV9Zm9yKHZhciB5IGluIHgpeC5oYXNPd25Qcm9wZXJ0eSh5KSYmKHVbeV09eFt5XSk7dS5wcm90b3R5cGU9bnVsbD09PXg/T2JqZWN0LmNyZWF0ZSh4KTooQS5wcm90b3R5cGU9eC5wcm90b3R5cGUsbmV3IEEpfSx0PWgoMSksbD1oKDEzKSxwPWgoMyksbT1oKDApLG49aCgyNSk7ZD1oKDE1KTt2YXIgcT1oKDI2KTtoPWZ1bmN0aW9uKHUpe2Z1bmN0aW9uIHgoQSx5KXt2YXIgdz11LmNhbGwodGhpcyl8fHRoaXM7dy5fd2hlZWxGaWx0ZXI9ZnVuY3Rpb24oKXtyZXR1cm4hMH07dy5fd2hlZWxDYWxsYmFjaz1mdW5jdGlvbihDLEcpe3JldHVybiB3Ll9oYW5kbGVXaGVlbEV2ZW50KEMsRyl9O3cuX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihDLEcpe3JldHVybiB3Ll9oYW5kbGVUb3VjaFN0YXJ0KEMsRyl9O3cuX3RvdWNoTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKEMsRyl7cmV0dXJuIHcuX2hhbmRsZVBpbmNoKEMsRyl9O3cuX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24oQyl7cmV0dXJuIHcuX2hhbmRsZVRvdWNoRW5kKEMpfTsKdy5fdG91Y2hDYW5jZWxDYWxsYmFjaz1mdW5jdGlvbihDKXtyZXR1cm4gdy5faGFuZGxlVG91Y2hFbmQoQyl9O3cuX3BhbkVuZENhbGxiYWNrcz1uZXcgbS5DYWxsYmFja1NldDt3Ll96b29tRW5kQ2FsbGJhY2tzPW5ldyBtLkNhbGxiYWNrU2V0O3cuX3Bhblpvb21VcGRhdGVDYWxsYmFja3M9bmV3IG0uQ2FsbGJhY2tTZXQ7dy5feFNjYWxlcz1uZXcgbS5TZXQ7dy5feVNjYWxlcz1uZXcgbS5TZXQ7dy5fZHJhZ0ludGVyYWN0aW9uPW5ldyBuLkRyYWc7dy5fc2V0dXBEcmFnSW50ZXJhY3Rpb24oKTt3Ll90b3VjaElkcz10Lm1hcCgpO3cuX21pbkRvbWFpbkV4dGVudHM9bmV3IG0uTWFwO3cuX21heERvbWFpbkV4dGVudHM9bmV3IG0uTWFwO3cuX21pbkRvbWFpblZhbHVlcz1uZXcgbS5NYXA7dy5fbWF4RG9tYWluVmFsdWVzPW5ldyBtLk1hcDtudWxsIT1BJiZ3LmFkZFhTY2FsZShBKTtudWxsIT15JiZ3LmFkZFlTY2FsZSh5KTtyZXR1cm4gd31rKHgsdSk7eC5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb259O3gucHJvdG90eXBlLndoZWVsRmlsdGVyPWZ1bmN0aW9uKEEpezAhPT1hcmd1bWVudHMubGVuZ3RoJiYodGhpcy5fd2hlZWxGaWx0ZXI9QSl9O3gucHJvdG90eXBlLnBhbj1mdW5jdGlvbihBKXt2YXIgeT10aGlzO3RoaXMueFNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24odyl7dy5wYW4oeS5fY29uc3RyYWluZWRUcmFuc2xhdGlvbih3LEEueCkpfSk7dGhpcy55U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbih3KXt3LnBhbih5Ll9jb25zdHJhaW5lZFRyYW5zbGF0aW9uKHcsQS55KSl9KTt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKX07eC5wcm90b3R5cGUuem9vbT1mdW5jdGlvbihBLHksdyl7dmFyIEM9dGhpczt2b2lkIDA9PT13JiYodz0hMCk7aWYobnVsbCE9eSl7dmFyIEc9eS54O3ZhciBEPXkueTt3JiYodGhpcy54U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbihCKXtCPUMuX2NvbnN0cmFpbmVkWm9vbShCLApBLEcpO0c9Qi5jZW50ZXJQb2ludDtBPUIuem9vbUFtb3VudH0pLHRoaXMueVNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24oQil7Qj1DLl9jb25zdHJhaW5lZFpvb20oQixBLEQpO0Q9Qi5jZW50ZXJQb2ludDtBPUIuem9vbUFtb3VudH0pKX10aGlzLnhTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3ZhciBJPUIucmFuZ2UoKTtCLnpvb20oQSxudWxsPT1HPyhJWzFdK0lbMF0pLzI6Ryl9KTt0aGlzLnlTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKEIpe3ZhciBJPUIucmFuZ2UoKTtCLnpvb20oQSxudWxsPT1EPyhJWzFdK0lbMF0pLzI6RCl9KTt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKTtyZXR1cm57em9vbUFtb3VudDpBLGNlbnRlclZhbHVlOntjZW50ZXJYOkcsY2VudGVyWTpEfX19O3gucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24oQSl7dS5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsQSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKEEpOwp0aGlzLl9tb3VzZURpc3BhdGNoZXI9bC5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbldoZWVsKHRoaXMuX3doZWVsQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1sLlRvdWNoLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayl9O3gucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3UucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZXaGVlbCh0aGlzLl93aGVlbENhbGxiYWNrKTsKdGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGw7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hNb3ZlKHRoaXMuX3RvdWNoTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj1udWxsO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX07eC5wcm90b3R5cGUuX2hhbmRsZVRvdWNoU3RhcnQ9ZnVuY3Rpb24oQSx5KXtmb3IodmFyIHc9MDt3PEEubGVuZ3RoJiYyPnRoaXMuX3RvdWNoSWRzLnNpemUoKTt3Kyspe3ZhciBDPUFbd107dGhpcy5fdG91Y2hJZHMuc2V0KEMudG9TdHJpbmcoKSx0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHlbQ10pKX19Owp4LnByb3RvdHlwZS5faGFuZGxlUGluY2g9ZnVuY3Rpb24oQSx5KXt2YXIgdz10aGlzO2lmKCEoMj50aGlzLl90b3VjaElkcy5zaXplKCkpKXt2YXIgQz10aGlzLl90b3VjaElkcy52YWx1ZXMoKTtpZih0aGlzLl9pc0luc2lkZUNvbXBvbmVudCh0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKENbMF0pKSYmdGhpcy5faXNJbnNpZGVDb21wb25lbnQodGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShDWzFdKSkpe3ZhciBHPXguX3BvaW50RGlzdGFuY2UoQ1swXSxDWzFdKTtpZigwIT09Ryl7QS5mb3JFYWNoKGZ1bmN0aW9uKE8pe3cuX3RvdWNoSWRzLmhhcyhPLnRvU3RyaW5nKCkpJiZ3Ll90b3VjaElkcy5zZXQoTy50b1N0cmluZygpLHcuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UoeVtPXSkpfSk7QT10aGlzLl90b3VjaElkcy52YWx1ZXMoKTt2YXIgRD14Ll9wb2ludERpc3RhbmNlKEFbMF0sQVsxXSk7aWYoMCE9PUQpe3ZhciBCPUcvRCxJPUEubWFwKGZ1bmN0aW9uKE8sCkgpe3JldHVybnt4OihPLngtQ1tIXS54KS9CLHk6KE8ueS1DW0hdLnkpL0J9fSk7Rz14LmNlbnRlclBvaW50KENbMF0sQ1sxXSk7Rz10aGlzLnpvb20oQixHKTtBPUcuY2VudGVyVmFsdWU7dmFyIE49Ry56b29tQW1vdW50O0c9QS5jZW50ZXJYO0E9QS5jZW50ZXJZO0Q9Qy5tYXAoZnVuY3Rpb24oTyxIKXtyZXR1cm57eDpJW0hdLngqTitPLngseTpJW0hdLnkqTitPLnl9fSk7dGhpcy5wYW4oe3g6Ry0oRFswXS54K0RbMV0ueCkvMix5OkEtKERbMF0ueStEWzFdLnkpLzJ9KX19fX19O3guY2VudGVyUG9pbnQ9ZnVuY3Rpb24oQSx5KXtyZXR1cm57eDooTWF0aC5taW4oQS54LHkueCkrTWF0aC5tYXgoQS54LHkueCkpLzIseTooTWF0aC5tYXgoQS55LHkueSkrTWF0aC5taW4oQS55LHkueSkpLzJ9fTt4Ll9wb2ludERpc3RhbmNlPWZ1bmN0aW9uKEEseSl7cmV0dXJuIE1hdGguc3FydChNYXRoLnBvdyhNYXRoLm1heChBLngseS54KS1NYXRoLm1pbihBLngseS54KSwyKStNYXRoLnBvdyhNYXRoLm1heChBLnksCnkueSktTWF0aC5taW4oQS55LHkueSksMikpfTt4LnByb3RvdHlwZS5faGFuZGxlVG91Y2hFbmQ9ZnVuY3Rpb24oQSl7dmFyIHk9dGhpcztBLmZvckVhY2goZnVuY3Rpb24odyl7eS5fdG91Y2hJZHMucmVtb3ZlKHcudG9TdHJpbmcoKSl9KTswPHRoaXMuX3RvdWNoSWRzLnNpemUoKSYmdGhpcy5fem9vbUVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9O3gucHJvdG90eXBlLl9oYW5kbGVXaGVlbEV2ZW50PWZ1bmN0aW9uKEEseSl7dGhpcy5fd2hlZWxGaWx0ZXIoeSkmJihBPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UoQSksdGhpcy5faXNJbnNpZGVDb21wb25lbnQoQSkmJih5LnByZXZlbnREZWZhdWx0KCksdGhpcy56b29tKE1hdGgucG93KDIsKDAhPT15LmRlbHRhWT95LmRlbHRhWTp5LmRlbHRhWCkqKHkuZGVsdGFNb2RlP3guX1BJWEVMU19QRVJfTElORToxKSouMDAyKSxBKSx0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKSkpfTt4LnByb3RvdHlwZS5fY29uc3RyYWluZWRab29tPQpmdW5jdGlvbihBLHksdyl7cmV0dXJuIHEuY29uc3RyYWluZWRab29tKEEseSx3LHRoaXMubWluRG9tYWluRXh0ZW50KEEpLHRoaXMubWF4RG9tYWluRXh0ZW50KEEpLHRoaXMubWluRG9tYWluVmFsdWUoQSksdGhpcy5tYXhEb21haW5WYWx1ZShBKSl9O3gucHJvdG90eXBlLl9jb25zdHJhaW5lZFRyYW5zbGF0aW9uPWZ1bmN0aW9uKEEseSl7cmV0dXJuIHEuY29uc3RyYWluZWRUcmFuc2xhdGlvbihBLHksdGhpcy5taW5Eb21haW5WYWx1ZShBKSx0aGlzLm1heERvbWFpblZhbHVlKEEpKX07eC5wcm90b3R5cGUuX3NldHVwRHJhZ0ludGVyYWN0aW9uPWZ1bmN0aW9uKCl7dmFyIEE9dGhpczt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uY29uc3RyYWluZWRUb0NvbXBvbmVudCgpO3ZhciB5O3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdTdGFydChmdW5jdGlvbigpe3JldHVybiB5PW51bGx9KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnKGZ1bmN0aW9uKHcsQyl7Mjw9QS5fdG91Y2hJZHMuc2l6ZSgpfHwKKEEucGFuKHt4OihudWxsPT15P3cueDp5LngpLUMueCx5OihudWxsPT15P3cueTp5LnkpLUMueX0pLHk9Qyl9KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKGZ1bmN0aW9uKCl7cmV0dXJuIEEuX3BhbkVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9KX07eC5wcm90b3R5cGUuX25vbkxpbmVhclNjYWxlV2l0aEV4dGVudHM9ZnVuY3Rpb24oQSl7cmV0dXJuIG51bGwhPXRoaXMubWluRG9tYWluRXh0ZW50KEEpJiZudWxsIT10aGlzLm1heERvbWFpbkV4dGVudChBKSYmIShBIGluc3RhbmNlb2YgcC5MaW5lYXIpJiYhKEEgaW5zdGFuY2VvZiBwLlRpbWUpfTt4LnByb3RvdHlwZS54U2NhbGVzPWZ1bmN0aW9uKCl7dmFyIEE9W107dGhpcy5feFNjYWxlcy5mb3JFYWNoKGZ1bmN0aW9uKHkpe0EucHVzaCh5KX0pO3JldHVybiBBfTt4LnByb3RvdHlwZS55U2NhbGVzPWZ1bmN0aW9uKCl7dmFyIEE9W107dGhpcy5feVNjYWxlcy5mb3JFYWNoKGZ1bmN0aW9uKHkpe0EucHVzaCh5KX0pOwpyZXR1cm4gQX07eC5wcm90b3R5cGUuYWRkWFNjYWxlPWZ1bmN0aW9uKEEpe3RoaXMuX3hTY2FsZXMuYWRkKEEpfTt4LnByb3RvdHlwZS5yZW1vdmVYU2NhbGU9ZnVuY3Rpb24oQSl7dGhpcy5feFNjYWxlcy5kZWxldGUoQSk7dGhpcy5fbWluRG9tYWluRXh0ZW50cy5kZWxldGUoQSk7dGhpcy5fbWF4RG9tYWluRXh0ZW50cy5kZWxldGUoQSk7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZShBKTt0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKEEpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5hZGRZU2NhbGU9ZnVuY3Rpb24oQSl7dGhpcy5feVNjYWxlcy5hZGQoQSl9O3gucHJvdG90eXBlLnJlbW92ZVlTY2FsZT1mdW5jdGlvbihBKXt0aGlzLl95U2NhbGVzLmRlbGV0ZShBKTt0aGlzLl9taW5Eb21haW5FeHRlbnRzLmRlbGV0ZShBKTt0aGlzLl9tYXhEb21haW5FeHRlbnRzLmRlbGV0ZShBKTt0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKEEpO3RoaXMuX21heERvbWFpblZhbHVlcy5kZWxldGUoQSk7CnJldHVybiB0aGlzfTt4LnByb3RvdHlwZS5taW5Eb21haW5FeHRlbnQ9ZnVuY3Rpb24oQSl7cmV0dXJuIHRoaXMuX21pbkRvbWFpbkV4dGVudHMuZ2V0KEEpfTt4LnByb3RvdHlwZS5tYXhEb21haW5FeHRlbnQ9ZnVuY3Rpb24oQSl7cmV0dXJuIHRoaXMuX21heERvbWFpbkV4dGVudHMuZ2V0KEEpfTt4LnByb3RvdHlwZS5taW5Eb21haW5WYWx1ZT1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX21pbkRvbWFpblZhbHVlcy5nZXQoQSk7dGhpcy5fbWluRG9tYWluVmFsdWVzLnNldChBLHkpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5tYXhEb21haW5WYWx1ZT1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpcmV0dXJuIHRoaXMuX21heERvbWFpblZhbHVlcy5nZXQoQSk7dGhpcy5fbWF4RG9tYWluVmFsdWVzLnNldChBLHkpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5zZXRNaW5NYXhEb21haW5WYWx1ZXNUbz1mdW5jdGlvbihBKXt0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKEEpOwp0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKEEpO3ZhciB5PUEuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKSx3PXlbMV07dGhpcy5taW5Eb21haW5WYWx1ZShBLHlbMF0pO3RoaXMubWF4RG9tYWluVmFsdWUoQSx3KTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUub25QYW5FbmQ9ZnVuY3Rpb24oQSl7dGhpcy5fcGFuRW5kQ2FsbGJhY2tzLmFkZChBKX07eC5wcm90b3R5cGUub2ZmUGFuRW5kPWZ1bmN0aW9uKEEpe3RoaXMuX3BhbkVuZENhbGxiYWNrcy5kZWxldGUoQSk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLm9uWm9vbUVuZD1mdW5jdGlvbihBKXt0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmFkZChBKX07eC5wcm90b3R5cGUub2ZmWm9vbUVuZD1mdW5jdGlvbihBKXt0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmRlbGV0ZShBKTtyZXR1cm4gdGhpc307eC5wcm90b3R5cGUub25QYW5ab29tVXBkYXRlPWZ1bmN0aW9uKEEpe3RoaXMuX3Bhblpvb21VcGRhdGVDYWxsYmFja3MuYWRkKEEpOwpyZXR1cm4gdGhpc307eC5wcm90b3R5cGUub2ZmUGFuWm9vbVVwZGF0ZT1mdW5jdGlvbihBKXt0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmRlbGV0ZShBKTtyZXR1cm4gdGhpc307cmV0dXJuIHh9KGQuSW50ZXJhY3Rpb24pO2guX1BJWEVMU19QRVJfTElORT0xMjA7Zi5QYW5ab29tPWh9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj1wfWZvcih2YXIgcSBpbiBtKW0uaGFzT3duUHJvcGVydHkocSkmJihwW3FdPW1bcV0pO3AucHJvdG90eXBlPW51bGw9PT1tP09iamVjdC5jcmVhdGUobSk6KG4ucHJvdG90eXBlPW0ucHJvdG90eXBlLG5ldyBuKX0sdD1oKDEzKSxsPWgoMCk7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49bnVsbCE9PXAmJnAuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO24uX292ZXJDb21wb25lbnQ9ITE7bi5fcG9pbnRlckVudGVyQ2FsbGJhY2tzPQpuZXcgbC5DYWxsYmFja1NldDtuLl9wb2ludGVyTW92ZUNhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9wb2ludGVyRXhpdENhbGxiYWNrcz1uZXcgbC5DYWxsYmFja1NldDtuLl9tb3VzZU1vdmVDYWxsYmFjaz1mdW5jdGlvbihxLHUpe3JldHVybiBuLl9oYW5kbGVNb3VzZUV2ZW50KHEsdSl9O24uX3RvdWNoU3RhcnRDYWxsYmFjaz1mdW5jdGlvbihxLHUseCl7cmV0dXJuIG4uX2hhbmRsZVRvdWNoRXZlbnQodVtxWzBdXSx4KX07cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24obil7cC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsbik7dGhpcy5fbW91c2VEaXNwYXRjaGVyPXQuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTt0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spO3RoaXMuX3RvdWNoRGlzcGF0Y2hlcj10LlRvdWNoLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7CnRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKX07bS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7dGhpcy5fbW91c2VEaXNwYXRjaGVyPW51bGw7dGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bnVsbH07bS5wcm90b3R5cGUuX2hhbmRsZU1vdXNlRXZlbnQ9ZnVuY3Rpb24obixxKXtxPXRoaXMuX21vdXNlRGlzcGF0Y2hlci5ldmVudEluc2lkZSh0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLHEpO3RoaXMuX2hhbmRsZVBvaW50ZXJFdmVudChuLHEpfTttLnByb3RvdHlwZS5faGFuZGxlVG91Y2hFdmVudD1mdW5jdGlvbihuLHEpe3E9dGhpcy5fdG91Y2hEaXNwYXRjaGVyLmV2ZW50SW5zaWRlKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8sCnEpO3RoaXMuX2hhbmRsZVBvaW50ZXJFdmVudChuLHEpfTttLnByb3RvdHlwZS5faGFuZGxlUG9pbnRlckV2ZW50PWZ1bmN0aW9uKG4scSl7bj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG4pO3ZhciB1PXRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KG4pO3UmJnE/KHRoaXMuX292ZXJDb21wb25lbnR8fHRoaXMuX3BvaW50ZXJFbnRlckNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKG4pLHRoaXMuX3BvaW50ZXJNb3ZlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MobikpOnRoaXMuX292ZXJDb21wb25lbnQmJnRoaXMuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3Mobik7dGhpcy5fb3ZlckNvbXBvbmVudD11JiZxfTttLnByb3RvdHlwZS5vblBvaW50ZXJFbnRlcj1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyRW50ZXJDYWxsYmFja3MuYWRkKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5vZmZQb2ludGVyRW50ZXI9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlckVudGVyQ2FsbGJhY2tzLmRlbGV0ZShuKTsKcmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uUG9pbnRlck1vdmU9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlck1vdmVDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZQb2ludGVyTW92ZT1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyTW92ZUNhbGxiYWNrcy5kZWxldGUobik7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLm9uUG9pbnRlckV4aXQ9ZnVuY3Rpb24obil7dGhpcy5fcG9pbnRlckV4aXRDYWxsYmFja3MuYWRkKG4pfTttLnByb3RvdHlwZS5vZmZQb2ludGVyRXhpdD1mdW5jdGlvbihuKXt0aGlzLl9wb2ludGVyRXhpdENhbGxiYWNrcy5kZWxldGUobik7cmV0dXJuIHRoaXN9O3JldHVybiBtfShoKDE1KS5JbnRlcmFjdGlvbik7Zi5Qb2ludGVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDIwKTtmLm1lbVRodW5rPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PVtdLGw9MDtsPGFyZ3VtZW50cy5sZW5ndGg7bCsrKXRbbF09YXJndW1lbnRzW2xdO3ZhciBwPXQuc2xpY2UoMCwKLTEpLG09ay5tZW1vaXplKHRbdC5sZW5ndGgtMV0pO3JldHVybiBmdW5jdGlvbigpe3ZhciBuPXRoaXMscT1wLm1hcChmdW5jdGlvbih1KXtyZXR1cm4gdS5hcHBseShuKX0pO3JldHVybiBtLmFwcGx5KHZvaWQgMCxxKX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCg0OSk7Zi5tZW1vaXplPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGwoKXtmb3IodmFyIHU9W10seD0wO3g8YXJndW1lbnRzLmxlbmd0aDt4KyspdVt4XT1hcmd1bWVudHNbeF07aWYobilyZXR1cm4gbTt4PWsuc2lnbkFycmF5KHUpO3ZvaWQgMD09PXB8fHAuaXNEaWZmZXJlbnQoeCk/KHEmJmNvbnNvbGUubG9nKCJjYWNoZSBtaXNzISBjb21wdXRpbmciKSxwPXgsbT10LmFwcGx5KHRoaXMsdSkpOnEmJmNvbnNvbGUubG9nKCJjYWNoZSBoaXQhIik7cmV0dXJuIG19dmFyIHA9dm9pZCAwLG0sbj0hMSxxPSExO2wuZG9Mb2NrZWQ9ZnVuY3Rpb24odSl7aWYobil0aHJvdyBFcnJvcigiTG9ja2luZyBhbiBhbHJlYWR5IGxvY2tlZCBtZW1vaXplIGZ1bmN0aW9uISIpOwpuPSEwO3U9dS5hcHBseSh0aGlzKTtuPSExO3JldHVybiB1fTtsLmxvZ1BlcmZvcm1hbmNlPWZ1bmN0aW9uKHUpe3ZvaWQgMD09PXUmJih1PSEwKTtxPXU7cmV0dXJuIHRoaXN9O3JldHVybiBsfX0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihuLHEpe2Z1bmN0aW9uIHUoKXt0aGlzLmNvbnN0cnVjdG9yPW59Zm9yKHZhciB4IGluIHEpcS5oYXNPd25Qcm9wZXJ0eSh4KSYmKG5beF09cVt4XSk7bi5wcm90b3R5cGU9bnVsbD09PXE/T2JqZWN0LmNyZWF0ZShxKToodS5wcm90b3R5cGU9cS5wcm90b3R5cGUsbmV3IHUpfSx0PWgoMyksbD1oKDApLHA9aCgyNyksbT1oKDIpO2Q9ZnVuY3Rpb24obil7ZnVuY3Rpb24gcSh1KXt2b2lkIDA9PT11JiYodT0idmVydGljYWwiKTt1PW4uY2FsbCh0aGlzLHUpfHx0aGlzO3UuX2NsdXN0ZXJPZmZzZXRzPW5ldyBsLk1hcDtyZXR1cm4gdX1rKHEsbik7cS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPQpmdW5jdGlvbigpe2Z1bmN0aW9uIHUoKXtyZXR1cm4geS5yYW5nZUJhbmQoKX12YXIgeD10aGlzLEE9bi5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcykseT10aGlzLl9tYWtlSW5uZXJTY2FsZSgpO0Eud2lkdGg9dGhpcy5faXNWZXJ0aWNhbD91OkEud2lkdGg7QS5oZWlnaHQ9dGhpcy5faXNWZXJ0aWNhbD9BLmhlaWdodDp1O3ZhciB3PUEueCxDPUEueTtBLng9dGhpcy5faXNWZXJ0aWNhbD9mdW5jdGlvbihHLEQsQil7cmV0dXJuIHcoRyxELEIpK3guX2NsdXN0ZXJPZmZzZXRzLmdldChCKX06ZnVuY3Rpb24oRyxELEIpe3JldHVybiB3KEcsRCxCKX07QS55PXRoaXMuX2lzVmVydGljYWw/ZnVuY3Rpb24oRyxELEIpe3JldHVybiBDKEcsRCxCKX06ZnVuY3Rpb24oRyxELEIpe3JldHVybiBDKEcsRCxCKSt4Ll9jbHVzdGVyT2Zmc2V0cy5nZXQoQil9O3JldHVybiBBfTtxLnByb3RvdHlwZS5fdXBkYXRlQ2x1c3RlclBvc2l0aW9uPWZ1bmN0aW9uKCl7dmFyIHU9CnRoaXMseD10aGlzLl9tYWtlSW5uZXJTY2FsZSgpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEEseSl7cmV0dXJuIHUuX2NsdXN0ZXJPZmZzZXRzLnNldChBLHguc2NhbGUoU3RyaW5nKHkpKS14LnJhbmdlQmFuZCgpLzIpfSl9O3EucHJvdG90eXBlLl9tYWtlSW5uZXJTY2FsZT1mdW5jdGlvbigpe3ZhciB1PW5ldyB0LkNhdGVnb3J5O3UuZG9tYWluKHRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24oQSx5KXtyZXR1cm4gU3RyaW5nKHkpfSkpO3ZhciB4PW0uUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5hdHRyKHAuQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpO3UucmFuZ2UoWzAseChudWxsLDAsbnVsbCldKTtyZXR1cm4gdX07cS5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVDbHVzdGVyUG9zaXRpb24oKTtyZXR1cm4gbi5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKX07cmV0dXJuIHF9KHAuQmFyKTtmLkNsdXN0ZXJlZEJhcj0KZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihDLEcpe2Z1bmN0aW9uIEQoKXt0aGlzLmNvbnN0cnVjdG9yPUN9Zm9yKHZhciBCIGluIEcpRy5oYXNPd25Qcm9wZXJ0eShCKSYmKENbQl09R1tCXSk7Qy5wcm90b3R5cGU9bnVsbD09PUc/T2JqZWN0LmNyZWF0ZShHKTooRC5wcm90b3R5cGU9Ry5wcm90b3R5cGUsbmV3IEQpfSx0PWgoMSksbD1oKDUpLHA9aCg3KSxtPWgoOCksbj1oKDMpLHE9aCgwKSx1PWgoNDQpLHg9aCg0NSksQT1oKDYpLHk9aCgzNSksdz1oKDIpO2Q9ZnVuY3Rpb24oQyl7ZnVuY3Rpb24gRygpe3ZhciBEPUMuY2FsbCh0aGlzKXx8dGhpcztELl9zdGFydEFuZ2xlPTA7RC5fZW5kQW5nbGU9MipNYXRoLlBJO0QuX2xhYmVsRm9ybWF0dGVyPW0uaWRlbnRpdHkoKTtELl9sYWJlbHNFbmFibGVkPSExO0QuaW5uZXJSYWRpdXMoMCk7RC5vdXRlclJhZGl1cyhmdW5jdGlvbigpe3ZhciBCPUQuX3BpZUNlbnRlcigpO3JldHVybiBNYXRoLm1pbihNYXRoLm1heChELndpZHRoKCktCkIueCxCLngpLE1hdGgubWF4KEQuaGVpZ2h0KCktQi55LEIueSkpfSk7RC5hZGRDbGFzcygicGllLXBsb3QiKTtELmF0dHIoImZpbGwiLGZ1bmN0aW9uKEIsSSl7cmV0dXJuIFN0cmluZyhJKX0sbmV3IG4uQ29sb3IpO0QuX3N0cm9rZURyYXdlcnM9bmV3IHEuTWFwO3JldHVybiBEfWsoRyxDKTtHLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt2YXIgRD10aGlzO0MucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3RoaXMuX3N0cm9rZURyYXdlcnMuZm9yRWFjaChmdW5jdGlvbihCKXtyZXR1cm4gQi5hdHRhY2hUbyhELl9yZW5kZXJBcmVhKX0pfTtHLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKEQsQixJKXtDLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxELEIsSSk7RD10aGlzLl9waWVDZW50ZXIoKTt0aGlzLl9yZW5kZXJBcmVhLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0QueCsiLCIrRC55KyIpIik7RD1NYXRoLm1pbihNYXRoLm1heCh0aGlzLndpZHRoKCktCkQueCxELngpLE1hdGgubWF4KHRoaXMuaGVpZ2h0KCktRC55LEQueSkpO251bGwhPXRoaXMuaW5uZXJSYWRpdXMoKS5zY2FsZSYmdGhpcy5pbm5lclJhZGl1cygpLnNjYWxlLnJhbmdlKFswLERdKTtudWxsIT10aGlzLm91dGVyUmFkaXVzKCkuc2NhbGUmJnRoaXMub3V0ZXJSYWRpdXMoKS5zY2FsZS5yYW5nZShbMCxEXSk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmFkZERhdGFzZXQ9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsRCl9O0cucHJvdG90eXBlLl9hZGREYXRhc2V0PWZ1bmN0aW9uKEQpe2lmKDE9PT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXJldHVybiBxLldpbmRvdy53YXJuKCJPbmx5IG9uZSBkYXRhc2V0IGlzIHN1cHBvcnRlZCBpbiBQaWUgcGxvdHMiKSx0aGlzO3RoaXMuX3VwZGF0ZVBpZUFuZ2xlcygpO3ZhciBCPW5ldyB4LkFyY091dGxpbmVTVkdEcmF3ZXI7dGhpcy5faXNTZXR1cCYmQi5hdHRhY2hUbyh0aGlzLl9yZW5kZXJBcmVhKTsKdGhpcy5fc3Ryb2tlRHJhd2Vycy5zZXQoRCxCKTtDLnByb3RvdHlwZS5fYWRkRGF0YXNldC5jYWxsKHRoaXMsRCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnJlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUucmVtb3ZlRGF0YXNldC5jYWxsKHRoaXMsRCl9O0cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oRCl7Qy5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsRCk7dGhpcy5fc3Ryb2tlRHJhd2Vycy5nZXQoRCkucmVtb3ZlKCl9O0cucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKEQpe0MucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxEKTt0aGlzLl9zdGFydEFuZ2xlcz1bXTt0aGlzLl9lbmRBbmdsZXM9W107cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpczt2b2lkIDA9PT1EJiYoRD10aGlzLmRhdGFzZXRzKCkpO3ZhciBJPUMucHJvdG90eXBlLnNlbGVjdGlvbnMuY2FsbCh0aGlzLApEKS5ub2RlcygpO0QuZm9yRWFjaChmdW5jdGlvbihOKXtOPUIuX3N0cm9rZURyYXdlcnMuZ2V0KE4pO251bGwhPU4mJkkucHVzaC5hcHBseShJLE4uZ2V0VmlzdWFsUHJpbWl0aXZlcygpKX0pO3JldHVybiB0LnNlbGVjdEFsbChJKX07Ry5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe0MucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt0aGlzLnJlbmRlcigpfTtHLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB1LkFyY1NWR0RyYXdlcn0sZnVuY3Rpb24oKXt5Lndhcm4oImNhbnZhcyByZW5kZXJlciBpcyBub3Qgc3VwcG9ydGVkIG9uIFBpZSBQbG90ISIpO3JldHVybiBudWxsfSl9O0cucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKEQpe3ZhciBCPXRoaXM7dm9pZCAwPT09RCYmKEQ9dGhpcy5kYXRhc2V0cygpKTsKcmV0dXJuIEMucHJvdG90eXBlLmVudGl0aWVzLmNhbGwodGhpcyxEKS5tYXAoZnVuY3Rpb24oSSl7SS5wb3NpdGlvbi54Kz1CLndpZHRoKCkvMjtJLnBvc2l0aW9uLnkrPUIuaGVpZ2h0KCkvMjt2YXIgTj10LnNlbGVjdChCLl9zdHJva2VEcmF3ZXJzLmdldChJLmRhdGFzZXQpLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXgoSS5pbmRleCkpO0kuc3Ryb2tlU2VsZWN0aW9uPU47cmV0dXJuIEl9KX07Ry5wcm90b3R5cGUuc2VjdG9yVmFsdWU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoRy5fU0VDVE9SX1ZBTFVFX0tFWSl9O0cucHJvdG90eXBlLmlubmVyUmFkaXVzPWZ1bmN0aW9uKEQsQil7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoRy5fSU5ORVJfUkFESVVTX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KEcuX0lOTkVSX1JBRElVU19LRVksRCxCKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5vdXRlclJhZGl1cz0KZnVuY3Rpb24oRCxCKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChHLl9PVVRFUl9SQURJVVNfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkoRy5fT1VURVJfUkFESVVTX0tFWSxELEIpO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLnN0YXJ0QW5nbGU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fc3RhcnRBbmdsZTt0aGlzLl9zdGFydEFuZ2xlPUQ7dGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307Ry5wcm90b3R5cGUuZW5kQW5nbGU9ZnVuY3Rpb24oRCl7aWYobnVsbD09RClyZXR1cm4gdGhpcy5fZW5kQW5nbGU7dGhpcy5fZW5kQW5nbGU9RDt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5sYWJlbHNFbmFibGVkPWZ1bmN0aW9uKEQpe2lmKG51bGw9PUQpcmV0dXJuIHRoaXMuX2xhYmVsc0VuYWJsZWQ7CnRoaXMuX2xhYmVsc0VuYWJsZWQ9RDt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTtHLnByb3RvdHlwZS5sYWJlbEZvcm1hdHRlcj1mdW5jdGlvbihEKXtpZihudWxsPT1EKXJldHVybiB0aGlzLl9sYWJlbEZvcm1hdHRlcjt0aGlzLl9sYWJlbEZvcm1hdHRlcj1EO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O0cucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oRCl7dmFyIEI9dGhpcy53aWR0aCgpLzIsST10aGlzLmhlaWdodCgpLzI7RD10aGlzLl9zbGljZUluZGV4Rm9yUG9pbnQoe3g6RC54LUIseTpELnktSX0pO3JldHVybiBudWxsPT1EP1tdOlt0aGlzLmVudGl0aWVzKClbRF1dfTtHLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIEQ9dGhpcyxCPUMucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKSxJPXcuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5pbm5lclJhZGl1cygpKSxOPXcuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5vdXRlclJhZGl1cygpKTsKQi5kPWZ1bmN0aW9uKE8sSCxLKXtyZXR1cm4gdC5hcmMoKS5pbm5lclJhZGl1cyhJKE8sSCxLKSkub3V0ZXJSYWRpdXMoTihPLEgsSykpLnN0YXJ0QW5nbGUoRC5fc3RhcnRBbmdsZXNbSF0pLmVuZEFuZ2xlKEQuX2VuZEFuZ2xlc1tIXSkoTyxIKX07cmV0dXJuIEJ9O0cucHJvdG90eXBlLl91cGRhdGVQaWVBbmdsZXM9ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLnNlY3RvclZhbHVlKCkmJjAhPT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXt2YXIgRD13LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSksQj10aGlzLmRhdGFzZXRzKClbMF0sST10aGlzLl9nZXREYXRhVG9EcmF3KCkuZ2V0KEIpO0k9dC5waWUoKS5zb3J0KG51bGwpLnN0YXJ0QW5nbGUodGhpcy5fc3RhcnRBbmdsZSkuZW5kQW5nbGUodGhpcy5fZW5kQW5nbGUpLnZhbHVlKGZ1bmN0aW9uKE4sTyl7cmV0dXJuIEQoTixPLEIpfSkoSSk7dGhpcy5fc3RhcnRBbmdsZXM9SS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIE4uc3RhcnRBbmdsZX0pOwp0aGlzLl9lbmRBbmdsZXM9SS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuIE4uZW5kQW5nbGV9KX19O0cucHJvdG90eXBlLl9waWVDZW50ZXI9ZnVuY3Rpb24oKXt2YXIgRD10aGlzLl9zdGFydEFuZ2xlPHRoaXMuX2VuZEFuZ2xlP3RoaXMuX3N0YXJ0QW5nbGU6dGhpcy5fZW5kQW5nbGUsQj10aGlzLl9zdGFydEFuZ2xlPHRoaXMuX2VuZEFuZ2xlP3RoaXMuX2VuZEFuZ2xlOnRoaXMuX3N0YXJ0QW5nbGUsST1NYXRoLnNpbihEKTtEPU1hdGguY29zKEQpO3ZhciBOPU1hdGguc2luKEIpO0I9TWF0aC5jb3MoQik7dmFyIE87aWYoMDw9SSYmMDw9TilpZigwPD1EJiYwPD1CKXt2YXIgSD1EO3ZhciBLPU89MDt2YXIgTT1OfWVsc2UgMD5EJiYwPkI/KEg9MCxPPS1CLEs9MCxNPUkpOjA8PUQmJjA+Qj8oSD1ELE89LUIsSz0wLE09SSk6MD5EJiYwPD1CJiYoSz1PPUg9MSxNPU1hdGgubWF4KEksTikpO2Vsc2UgMDw9SSYmMD5OPzA8PUQmJjA8PUI/KEg9TWF0aC5tYXgoRCxCKSxNPUs9Tz0xKTowPkQmJgowPkI/KEg9MCxPPTEsSz0tTixNPUkpOjA8PUQmJjA+Qj8oSD1ELE89MSxLPS1OLE09MSk6MD5EJiYwPD1CJiYoSD1CLEs9Tz0xLE09SSk6MD5JJiYwPD1OPzA8PUQmJjA8PUI/KEg9MSxPPTAsSz0tSSxNPU4pOjA+RCYmMD5CPyhIPTEsTz1NYXRoLm1heCgtRCwtQiksTT1LPTEpOjA8PUQmJjA+Qj8oSD0xLE89LUIsSz0tSSxNPTEpOjA+RCYmMDw9QiYmKEg9MSxPPS1ELEs9MSxNPU4pOjA+SSYmMD5OJiYoMDw9RCYmMDw9Qj8oSD1CLE89MCxLPS1JLE09MCk6MD5EJiYwPkI/KEg9MCxPPS1ELEs9LU4sTT0wKTowPD1EJiYwPkI/KE89SD0xLEs9TWF0aC5tYXgoRCwtQiksTT0xKTowPkQmJjA8PUImJihIPUIsTz0tRCxLPTEsTT0wKSk7cmV0dXJue3g6MD09SytNPzA6Sy8oSytNKSp0aGlzLndpZHRoKCkseTowPT1IK08/MDpILyhIK08pKnRoaXMuaGVpZ2h0KCl9fTtHLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciBEPUMucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyk7CmlmKDA9PT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXJldHVybiBEO3ZhciBCPXcuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zZWN0b3JWYWx1ZSgpKSxJPXRoaXMuZGF0YXNldHMoKVswXSxOPUQuZ2V0KEkpLmZpbHRlcihmdW5jdGlvbihPLEgpe3JldHVybiBHLl9pc1ZhbGlkRGF0YShCKE8sSCxJKSl9KTtELnNldChJLE4pO3JldHVybiBEfTtHLl9pc1ZhbGlkRGF0YT1mdW5jdGlvbihEKXtyZXR1cm4gcS5NYXRoLmlzVmFsaWROdW1iZXIoRCkmJjA8PUR9O0cucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKEQsQixJKXt2YXIgTj13LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSk7aWYoIUcuX2lzVmFsaWREYXRhKE4oRCxCLEkpKSlyZXR1cm57eDpOYU4seTpOYU59O3ZhciBPPXcuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5pbm5lclJhZGl1cygpKShELEIsSSk7RD13LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMub3V0ZXJSYWRpdXMoKSkoRCwKQixJKTtPPShPK0QpLzI7RD10LnBpZSgpLnNvcnQobnVsbCkudmFsdWUoZnVuY3Rpb24oSCxLKXtIPU4oSCxLLEkpO3JldHVybiBHLl9pc1ZhbGlkRGF0YShIKT9IOjB9KS5zdGFydEFuZ2xlKHRoaXMuX3N0YXJ0QW5nbGUpLmVuZEFuZ2xlKHRoaXMuX2VuZEFuZ2xlKShJLmRhdGEoKSk7Qj0oRFtCXS5zdGFydEFuZ2xlK0RbQl0uZW5kQW5nbGUpLzI7cmV0dXJue3g6TypNYXRoLnNpbihCKSx5Oi1PKk1hdGguY29zKEIpfX07Ry5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbihEKXt2YXIgQj10aGlzO3RoaXMuX3JlbmRlckFyZWEuc2VsZWN0KCIubGFiZWwtYXJlYSIpLnJlbW92ZSgpO3RoaXMuX2xhYmVsc0VuYWJsZWQmJnEuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gQi5fZHJhd0xhYmVscygpfSxEKTt2YXIgST10aGlzLl9nZW5lcmF0ZVN0cm9rZURyYXdTdGVwcygpLE49dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKE8pe3ZhciBIPQp3LlBsb3QuYXBwbHlEcmF3U3RlcHMoSSxPKTtCLl9zdHJva2VEcmF3ZXJzLmdldChPKS5kcmF3KE4uZ2V0KE8pLEgpfSl9O0cucHJvdG90eXBlLl9nZW5lcmF0ZVN0cm9rZURyYXdTdGVwcz1mdW5jdGlvbigpe3JldHVyblt7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOm5ldyBwLk51bGx9XX07Ry5wcm90b3R5cGUuX3NsaWNlSW5kZXhGb3JQb2ludD1mdW5jdGlvbihEKXt2YXIgQj1NYXRoLnNxcnQoTWF0aC5wb3coRC54LDIpK01hdGgucG93KEQueSwyKSksST1NYXRoLmFjb3MoLUQueS9CKTswPkQueCYmKEk9MipNYXRoLlBJLUkpO2ZvcihEPTA7RDx0aGlzLl9zdGFydEFuZ2xlcy5sZW5ndGg7RCsrKWlmKHRoaXMuX3N0YXJ0QW5nbGVzW0RdPEkmJnRoaXMuX2VuZEFuZ2xlc1tEXT5JKXt2YXIgTj1EO2JyZWFrfWlmKHZvaWQgMCE9PU4pe0Q9dGhpcy5kYXRhc2V0cygpWzBdO3ZhciBPPUQuZGF0YSgpW05dO0k9dGhpcy5pbm5lclJhZGl1cygpLmFjY2Vzc29yKE8sCk4sRCk7RD10aGlzLm91dGVyUmFkaXVzKCkuYWNjZXNzb3IoTyxOLEQpO2lmKEI+SSYmQjxEKXJldHVybiBOfXJldHVybiBudWxsfTtHLnByb3RvdHlwZS5fZHJhd0xhYmVscz1mdW5jdGlvbigpe3ZhciBEPXRoaXMsQj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxJPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLE49bmV3IGwuU3ZnQ29udGV4dChJLm5vZGUoKSksTz1uZXcgbC5DYWNoZU1lYXN1cmVyKE4pLEg9bmV3IGwuV3JpdGVyKE8sTiksSz10aGlzLmRhdGFzZXRzKClbMF07dGhpcy5fZ2V0RGF0YVRvRHJhdygpLmdldChLKS5mb3JFYWNoKGZ1bmN0aW9uKE0sTCl7dmFyIFE9RC5zZWN0b3JWYWx1ZSgpLmFjY2Vzc29yKE0sTCxLKTtpZihxLk1hdGguaXNWYWxpZE51bWJlcihRKSl7UT1ELl9sYWJlbEZvcm1hdHRlcihRLE0sTCxLKTt2YXIgVD1PLm1lYXN1cmUoUSksWD0oRC5fZW5kQW5nbGVzW0xdK0QuX3N0YXJ0QW5nbGVzW0xdKS8KMixhYT1ELm91dGVyUmFkaXVzKCkuYWNjZXNzb3IoTSxMLEspO0Qub3V0ZXJSYWRpdXMoKS5zY2FsZSYmKGFhPUQub3V0ZXJSYWRpdXMoKS5zY2FsZS5zY2FsZShhYSkpO3ZhciBsYT1ELmlubmVyUmFkaXVzKCkuYWNjZXNzb3IoTSxMLEspO0QuaW5uZXJSYWRpdXMoKS5zY2FsZSYmKGxhPUQuaW5uZXJSYWRpdXMoKS5zY2FsZS5zY2FsZShsYSkpO2xhPShhYStsYSkvMjthYT1NYXRoLnNpbihYKSpsYS1ULndpZHRoLzI7bGE9LU1hdGguY29zKFgpKmxhLVQuaGVpZ2h0LzI7dmFyIFo9W3t4OmFhLHk6bGF9LHt4OmFhLHk6bGErVC5oZWlnaHR9LHt4OmFhK1Qud2lkdGgseTpsYX0se3g6YWErVC53aWR0aCx5OmxhK1QuaGVpZ2h0fV07KFg9Wi5ldmVyeShmdW5jdGlvbihiYSl7cmV0dXJuIE1hdGguYWJzKGJhLngpPD1ELndpZHRoKCkvMiYmTWF0aC5hYnMoYmEueSk8PUQuaGVpZ2h0KCkvMn0pKSYmKFg9Wi5tYXAoZnVuY3Rpb24oYmEpe3JldHVybiBELl9zbGljZUluZGV4Rm9yUG9pbnQoYmEpfSkuZXZlcnkoZnVuY3Rpb24oYmEpe3JldHVybiBiYT09PQpMfSkpO009Qi5maWxsKE0sTCxLKTtNPTEuNipxLkNvbG9yLmNvbnRyYXN0KCJ3aGl0ZSIsTSk8cS5Db2xvci5jb250cmFzdCgiYmxhY2siLE0pO2FhPUkuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrYWErIiwiK2xhKyIpIik7YWEuY2xhc3NlZChNPyJkYXJrLWxhYmVsIjoibGlnaHQtbGFiZWwiLCEwKTthYS5zdHlsZSgidmlzaWJpbGl0eSIsWD8iaW5oZXJpdCI6ImhpZGRlbiIpO0gud3JpdGUoUSxULndpZHRoLFQuaGVpZ2h0LHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxhYS5ub2RlKCkpfX0pfTtyZXR1cm4gR30ody5QbG90KTtkLl9JTk5FUl9SQURJVVNfS0VZPSJpbm5lci1yYWRpdXMiO2QuX09VVEVSX1JBRElVU19LRVk9Im91dGVyLXJhZGl1cyI7ZC5fU0VDVE9SX1ZBTFVFX0tFWT0ic2VjdG9yLXZhbHVlIjtmLlBpZT1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHksdyl7ZnVuY3Rpb24gQygpe3RoaXMuY29uc3RydWN0b3I9Cnl9Zm9yKHZhciBHIGluIHcpdy5oYXNPd25Qcm9wZXJ0eShHKSYmKHlbR109d1tHXSk7eS5wcm90b3R5cGU9bnVsbD09PXc/T2JqZWN0LmNyZWF0ZSh3KTooQy5wcm90b3R5cGU9dy5wcm90b3R5cGUsbmV3IEMpfSx0PWgoMSksbD1oKDUpLHA9aCg3KSxtPWgoMTQpLG49aCg2KSxxPWgoMzQpLHU9aCgzKSx4PWgoMCksQT1oKDIpO2Q9ZnVuY3Rpb24oeSl7ZnVuY3Rpb24gdygpe3ZhciBDPXkuY2FsbCh0aGlzKXx8dGhpcztDLl9sYWJlbHNFbmFibGVkPSExO0MuX2xhYmVsPW51bGw7Qy5hbmltYXRvcigicmVjdGFuZ2xlcyIsbmV3IHAuTnVsbCk7Qy5hZGRDbGFzcygicmVjdGFuZ2xlLXBsb3QiKTtDLmF0dHIoImZpbGwiLChuZXcgdS5Db2xvcikucmFuZ2UoKVswXSk7cmV0dXJuIEN9ayh3LHkpO3cucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IG4uUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHEuUmVjdGFuZ2xlU1ZHRHJhd2VyfSxmdW5jdGlvbihDKXtyZXR1cm4gbmV3IG0uUmVjdGFuZ2xlQ2FudmFzRHJhd2VyKEMpfSl9Owp3LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLEc9eS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksRD1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxCPUdbdy5fWDJfS0VZXSxJPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLE49R1t3Ll9ZMl9LRVldLE89dGhpcy54KCkuc2NhbGUsSD10aGlzLnkoKS5zY2FsZTtudWxsIT1CPyhHLndpZHRoPWZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gTWF0aC5hYnMoQihLLE0sTCktRChLLE0sTCkpfSxHLng9ZnVuY3Rpb24oSyxNLEwpe3JldHVybiBNYXRoLm1pbihCKEssTSxMKSxEKEssTSxMKSl9KTooRy53aWR0aD1mdW5jdGlvbigpe3JldHVybiBDLl9yZWN0YW5nbGVXaWR0aChPKX0sRy54PWZ1bmN0aW9uKEssTSxMKXtyZXR1cm4gRChLLE0sTCktLjUqRy53aWR0aChLLE0sTCl9KTtudWxsIT1OPyhHLmhlaWdodD1mdW5jdGlvbihLLApNLEwpe3JldHVybiBNYXRoLmFicyhOKEssTSxMKS1JKEssTSxMKSl9LEcueT1mdW5jdGlvbihLLE0sTCl7cmV0dXJuIE1hdGgubWF4KE4oSyxNLEwpLEkoSyxNLEwpKS1HLmhlaWdodChLLE0sTCl9KTooRy5oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gQy5fcmVjdGFuZ2xlV2lkdGgoSCl9LEcueT1mdW5jdGlvbihLLE0sTCl7cmV0dXJuIEkoSyxNLEwpLS41KkcuaGVpZ2h0KEssTSxMKX0pO2RlbGV0ZSBHW3cuX1gyX0tFWV07ZGVsZXRlIEdbdy5fWTJfS0VZXTtyZXR1cm4gR307dy5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoInJlY3RhbmdsZXMiKX1dfTt3LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHk9ZnVuY3Rpb24oQyl7cmV0dXJuIngyIj09PUM/eS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywKIngiKToieTIiPT09Qz95LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLCJ5Iik6eS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcyxDKX07dy5wcm90b3R5cGUueD1mdW5jdGlvbihDLEcsRCl7aWYobnVsbD09QylyZXR1cm4geS5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PUc/eS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQyk6eS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQyxHLEQpO251bGwhPUcmJihEPShDPXRoaXMueDIoKSkmJkMuYWNjZXNzb3IsbnVsbCE9RCYmdGhpcy5fYmluZFByb3BlcnR5KHcuX1gyX0tFWSxELEcsQy5wb3N0U2NhbGUpKTtHIGluc3RhbmNlb2YgdS5DYXRlZ29yeSYmRy5pbm5lclBhZGRpbmcoMCkub3V0ZXJQYWRkaW5nKDApO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS54Mj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh3Ll9YMl9LRVkpfTt3LnByb3RvdHlwZS55PWZ1bmN0aW9uKEMsCkcsRCl7aWYobnVsbD09QylyZXR1cm4geS5wcm90b3R5cGUueS5jYWxsKHRoaXMpO251bGw9PUc/eS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQyk6eS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQyxHLEQpO251bGwhPUcmJihEPShDPXRoaXMueTIoKSkmJkMuYWNjZXNzb3IsbnVsbCE9RCYmdGhpcy5fYmluZFByb3BlcnR5KHcuX1kyX0tFWSxELEcsQy5wb3N0U2NhbGUpKTtHIGluc3RhbmNlb2YgdS5DYXRlZ29yeSYmRy5pbm5lclBhZGRpbmcoMCkub3V0ZXJQYWRkaW5nKDApO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS55Mj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh3Ll9ZMl9LRVkpfTt3LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEMpe3ZhciBHPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpO3JldHVybiB0aGlzLmVudGl0aWVzKCkuZmlsdGVyKGZ1bmN0aW9uKEQpe3ZhciBCPUQuZGF0dW0sST1ELmluZGV4LE49RC5kYXRhc2V0O0Q9Ry54KEIsCkksTik7dmFyIE89Ry55KEIsSSxOKSxIPUcud2lkdGgoQixJLE4pO0I9Ry5oZWlnaHQoQixJLE4pO3JldHVybiBEPD1DLngmJkMueDw9RCtIJiZPPD1DLnkmJkMueTw9TytCfSl9O3cucHJvdG90eXBlLl9lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oQyl7cmV0dXJuIHRoaXMuX2VudGl0eUJCb3goQy5kYXR1bSxDLmluZGV4LEMuZGF0YXNldCx0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSl9O3cucHJvdG90eXBlLl9lbnRpdHlCQm94PWZ1bmN0aW9uKEMsRyxELEIpe3JldHVybnt4OkIueChDLEcsRCkseTpCLnkoQyxHLEQpLHdpZHRoOkIud2lkdGgoQyxHLEQpLGhlaWdodDpCLmhlaWdodChDLEcsRCl9fTt3LnByb3RvdHlwZS5sYWJlbD1mdW5jdGlvbihDKXtpZihudWxsPT1DKXJldHVybiB0aGlzLl9sYWJlbDt0aGlzLl9sYWJlbD1DO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3cucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQ9ZnVuY3Rpb24oQyl7aWYobnVsbD09QylyZXR1cm4gdGhpcy5fbGFiZWxzRW5hYmxlZDsKdGhpcy5fbGFiZWxzRW5hYmxlZD1DO3RoaXMucmVuZGVyKCk7cmV0dXJuIHRoaXN9O3cucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz15LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7bnVsbCE9dGhpcy54MigpJiYoQy54Mj1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSkpO251bGwhPXRoaXMueTIoKSYmKEMueTI9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkyKCkpKTtyZXR1cm4gQ307dy5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oQyxHLEQpe3ZhciBCPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLEk9Qi54KEMsRyxEKSxOPUIueShDLEcsRCksTz1CLndpZHRoKEMsRyxEKTtDPUIuaGVpZ2h0KEMsRyxEKTtyZXR1cm57eDpJK08vMix5Ok4rQy8yfX07dy5wcm90b3R5cGUuX3JlY3RhbmdsZVdpZHRoPWZ1bmN0aW9uKEMpe2lmKEMgaW5zdGFuY2VvZiB1LkNhdGVnb3J5KXJldHVybiBDLnJhbmdlQmFuZCgpOwp2YXIgRz1DPT09dGhpcy54KCkuc2NhbGU/dGhpcy54KCkuYWNjZXNzb3I6dGhpcy55KCkuYWNjZXNzb3IsRD10LnNldCh4LkFycmF5LmZsYXR0ZW4odGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbihOKXtyZXR1cm4gTi5kYXRhKCkubWFwKGZ1bmN0aW9uKE8sSCl7cmV0dXJuIEcoTyxILE4pLnZhbHVlT2YoKX0pfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24oTil7cmV0dXJuK059KSxCPXguTWF0aC5taW4oRCwwKTtEPXguTWF0aC5tYXgoRCwwKTt2YXIgST1DLnNjYWxlKEIpO3JldHVybihDLnNjYWxlKEQpLUkpL01hdGguYWJzKEQtQil9O3cucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIEM9bmV3IHguTWFwLEc9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24oRCl7dmFyIEI9RC5kYXRhKCkubWFwKGZ1bmN0aW9uKEksTil7cmV0dXJuIHguTWF0aC5pc1ZhbGlkTnVtYmVyKEcueChJLE4sRCkpJiYKeC5NYXRoLmlzVmFsaWROdW1iZXIoRy55KEksTixEKSkmJnguTWF0aC5pc1ZhbGlkTnVtYmVyKEcud2lkdGgoSSxOLEQpKSYmeC5NYXRoLmlzVmFsaWROdW1iZXIoRy5oZWlnaHQoSSxOLEQpKT9JOm51bGx9KTtDLnNldChELEIpfSk7cmV0dXJuIEN9O3cucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oQyl7dmFyIEc9dGhpczt0aGlzLl9yZW5kZXJBcmVhLnNlbGVjdEFsbCgiLmxhYmVsLWFyZWEiKS5yZW1vdmUoKTt0aGlzLl9sYWJlbHNFbmFibGVkJiZudWxsIT10aGlzLmxhYmVsKCkmJnguV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gRy5fZHJhd0xhYmVscygpfSxDKX07dy5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgQz10aGlzLEc9dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uKEQsQil7cmV0dXJuIEMuX2RyYXdMYWJlbChHLEQsQil9KX07dy5wcm90b3R5cGUuX2RyYXdMYWJlbD0KZnVuY3Rpb24oQyxHLEQpe3ZhciBCPXRoaXMsST10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxOPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLE89bmV3IGwuU3ZnQ29udGV4dChOLm5vZGUoKSksSD1uZXcgbC5DYWNoZU1lYXN1cmVyKE8pLEs9bmV3IGwuV3JpdGVyKEgsTyk7Tz10aGlzLngoKS5zY2FsZS5yYW5nZSgpO3ZhciBNPXRoaXMueSgpLnNjYWxlLnJhbmdlKCksTD1NYXRoLm1pbi5hcHBseShudWxsLE8pLFE9TWF0aC5tYXguYXBwbHkobnVsbCxPKSxUPU1hdGgubWluLmFwcGx5KG51bGwsTSksWD1NYXRoLm1heC5hcHBseShudWxsLE0pO0MuZ2V0KEcpLmZvckVhY2goZnVuY3Rpb24oYWEsbGEpe2lmKG51bGwhPWFhKXt2YXIgWj0iIitCLmxhYmVsKCkoYWEsbGEsRyksYmE9SC5tZWFzdXJlKFopLGVhPUkueChhYSxsYSxHKSxjYT1JLnkoYWEsbGEsRyksa2E9SS53aWR0aChhYSxsYSxHKSxZPUkuaGVpZ2h0KGFhLGxhLEcpOwpiYS5oZWlnaHQ8PVkmJmJhLndpZHRoPD1rYSYmKFk9KFktYmEuaGVpZ2h0KS8yLGVhKz0oa2EtYmEud2lkdGgpLzIsY2ErPVksa2E9e21pbjplYSxtYXg6ZWErYmEud2lkdGh9LFk9e21pbjpjYSxtYXg6Y2ErYmEuaGVpZ2h0fSxrYS5taW48THx8a2EubWF4PlF8fFkubWluPFR8fFkubWF4Plh8fEIuX292ZXJsYXlMYWJlbChrYSxZLGxhLEQsQyl8fChhYT1JLmZpbGwoYWEsbGEsRyksYWE9MS42KnguQ29sb3IuY29udHJhc3QoIndoaXRlIixhYSk8eC5Db2xvci5jb250cmFzdCgiYmxhY2siLGFhKSxlYT1OLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2VhKyIsIitjYSsiKSIpLGVhLmNsYXNzZWQoYWE/ImRhcmstbGFiZWwiOiJsaWdodC1sYWJlbCIsITApLEsud3JpdGUoWixiYS53aWR0aCxiYS5oZWlnaHQse3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciJ9LGVhLm5vZGUoKSkpKX19KX07dy5wcm90b3R5cGUuX292ZXJsYXlMYWJlbD1mdW5jdGlvbihDLApHLEQsQixJKXtmb3IodmFyIE49dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksTz10aGlzLmRhdGFzZXRzKCksSD1CO0g8Ty5sZW5ndGg7SCsrKWZvcih2YXIgSz1PW0hdLE09SS5nZXQoSyksTD1IPT09Qj9EKzE6MDtMPE0ubGVuZ3RoO0wrKylpZih4LkRPTS5pbnRlcnNlY3RzQkJveChDLEcsdGhpcy5fZW50aXR5QkJveChNW0xdLEwsSyxOKSkpcmV0dXJuITA7cmV0dXJuITF9O3JldHVybiB3fShoKDE2KS5YWVBsb3QpO2QuX1gyX0tFWT0ieDIiO2QuX1kyX0tFWT0ieTIiO2YuUmVjdGFuZ2xlPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oeSx3KXtmdW5jdGlvbiBDKCl7dGhpcy5jb25zdHJ1Y3Rvcj15fWZvcih2YXIgRyBpbiB3KXcuaGFzT3duUHJvcGVydHkoRykmJih5W0ddPXdbR10pO3kucHJvdG90eXBlPW51bGw9PT13P09iamVjdC5jcmVhdGUodyk6KEMucHJvdG90eXBlPXcucHJvdG90eXBlLG5ldyBDKX0sdD1oKDMxKSwKbD1oKDYpLHA9aCg0OCksbT1oKDcpLG49aCgxNCkscT1oKDMpLHU9aCgwKSx4PWgoMTkpLEE9aCgyKTtkPWZ1bmN0aW9uKHkpe2Z1bmN0aW9uIHcoKXt2YXIgQz15LmNhbGwodGhpcyl8fHRoaXM7Qy5hZGRDbGFzcygic2NhdHRlci1wbG90Iik7dmFyIEc9bmV3IG0uRWFzaW5nO0cuc3RhcnREZWxheSg1KTtHLnN0ZXBEdXJhdGlvbigyNTApO0cubWF4VG90YWxEdXJhdGlvbihBLlBsb3QuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO0MuYW5pbWF0b3IoeC5BbmltYXRvci5NQUlOLEcpO0MuYXR0cigib3BhY2l0eSIsLjYpO0MuYXR0cigiZmlsbCIsKG5ldyBxLkNvbG9yKS5yYW5nZSgpWzBdKTtDLnNpemUoNik7dmFyIEQ9dC5jaXJjbGUoKTtDLnN5bWJvbChmdW5jdGlvbigpe3JldHVybiBEfSk7cmV0dXJuIEN9ayh3LHkpO3cucHJvdG90eXBlLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzPWZ1bmN0aW9uKEMpe3ZhciBHPXRoaXM7cmV0dXJuIHkucHJvdG90eXBlLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzLmNhbGwodGhpcywKQykubWFwKGZ1bmN0aW9uKEQpe3ZhciBCPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IoRy5zaXplKCkpKEQuZGF0dW0sRC5pbmRleCxELmRhdGFzZXQpO0QuZGlhbWV0ZXI9QjtyZXR1cm4gRH0pfTt3LnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKEMpe3ZhciBHPXRoaXM7cmV0dXJuIG5ldyBsLlByb3h5RHJhd2VyKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBwLlN5bWJvbFNWR0RyYXdlcn0sZnVuY3Rpb24oRCl7cmV0dXJuIG5ldyBuLkNhbnZhc0RyYXdlcihELHAubWFrZVN5bWJvbENhbnZhc0RyYXdTdGVwKEMsZnVuY3Rpb24oKXtyZXR1cm4gQS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLnN5bWJvbCgpKX0sZnVuY3Rpb24oKXtyZXR1cm4gQS5QbG90Ll9zY2FsZWRBY2Nlc3NvcihHLnNpemUoKSl9KSl9KX07dy5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbihDLEcpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHcuX1NJWkVfS0VZKTt0aGlzLl9iaW5kUHJvcGVydHkody5fU0laRV9LRVksCkMsRyk7dGhpcy5yZW5kZXIoKTtyZXR1cm4gdGhpc307dy5wcm90b3R5cGUuc3ltYm9sPWZ1bmN0aW9uKEMpe2lmKG51bGw9PUMpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHcuX1NZTUJPTF9LRVkpO3RoaXMuX3Byb3BlcnR5QmluZGluZ3Muc2V0KHcuX1NZTUJPTF9LRVkse2FjY2Vzc29yOkN9KTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt3LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXt2YXIgQz1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBHPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLEQ9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnN5bWJvbCgpKTtHLmQ9ZnVuY3Rpb24oQixJLE4pe3JldHVybiBEKEIsSSxOKSgwKShudWxsKX07Qy5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6RyxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih4LkFuaW1hdG9yLlJFU0VUKX0pfUMucHVzaCh7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLAphbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcih4LkFuaW1hdG9yLk1BSU4pfSk7cmV0dXJuIEN9O3cucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQz15LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyksRz1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxEPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpO0MueD1HO0MueT1EO0MudHJhbnNmb3JtPWZ1bmN0aW9uKEIsSSxOKXtyZXR1cm4idHJhbnNsYXRlKCIrRyhCLEksTikrIiwiK0QoQixJLE4pKyIpIn07Qy5kPXRoaXMuX2NvbnN0cnVjdFN5bWJvbEdlbmVyYXRvcigpO3JldHVybiBDfTt3LnByb3RvdHlwZS5fY29uc3RydWN0U3ltYm9sR2VuZXJhdG9yPWZ1bmN0aW9uKCl7dmFyIEM9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnN5bWJvbCgpKSxHPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpO3JldHVybiBmdW5jdGlvbihELEIsCkkpe3JldHVybiBDKEQsQixJKShHKEQsQixJKSkobnVsbCl9fTt3LnByb3RvdHlwZS5fZW50aXR5Qm91bmRzPWZ1bmN0aW9uKEMpe3JldHVybnt4OkMucG9zaXRpb24ueC1DLmRpYW1ldGVyLzIseTpDLnBvc2l0aW9uLnktQy5kaWFtZXRlci8yLHdpZHRoOkMuZGlhbWV0ZXIsaGVpZ2h0OkMuZGlhbWV0ZXJ9fTt3LnByb3RvdHlwZS5fZW50aXR5VmlzaWJsZU9uUGxvdD1mdW5jdGlvbihDLEcpe3ZhciBEPXttaW46Ry50b3BMZWZ0LngsbWF4OkcuYm90dG9tUmlnaHQueH07Rz17bWluOkcudG9wTGVmdC55LG1heDpHLmJvdHRvbVJpZ2h0Lnl9O0M9dGhpcy5fZW50aXR5Qm91bmRzKEMpO3JldHVybiB1LkRPTS5pbnRlcnNlY3RzQkJveChELEcsQyl9O3cucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24oQyl7dmFyIEc9QS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksRD1BLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxCPUEuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpOwpyZXR1cm4gdGhpcy5lbnRpdGllcygpLmZpbHRlcihmdW5jdGlvbihJKXt2YXIgTj1JLmRhdHVtLE89SS5pbmRleCxIPUkuZGF0YXNldDtJPUcoTixPLEgpO3ZhciBLPUQoTixPLEgpO049QihOLE8sSCk7cmV0dXJuIEktTi8yPD1DLngmJkMueDw9SStOLzImJkstTi8yPD1DLnkmJkMueTw9SytOLzJ9KX07cmV0dXJuIHd9KGgoMTYpLlhZUGxvdCk7ZC5fU0laRV9LRVk9InNpemUiO2QuX1NZTUJPTF9LRVk9InN5bWJvbCI7Zi5TY2F0dGVyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odSx4KXtmdW5jdGlvbiBBKCl7dGhpcy5jb25zdHJ1Y3Rvcj11fWZvcih2YXIgeSBpbiB4KXguaGFzT3duUHJvcGVydHkoeSkmJih1W3ldPXhbeV0pO3UucHJvdG90eXBlPW51bGw9PT14P09iamVjdC5jcmVhdGUoeCk6KEEucHJvdG90eXBlPXgucHJvdG90eXBlLG5ldyBBKX0sdD1oKDcpLGw9aCg2KSxwPWgoNDcpLG09aCgzKSxuPWgoMzUpLHE9aCgyKTsKZD1mdW5jdGlvbih1KXtmdW5jdGlvbiB4KCl7dmFyIEE9dS5jYWxsKHRoaXMpfHx0aGlzO0EuYWRkQ2xhc3MoInNlZ21lbnQtcGxvdCIpO0EuYXR0cigic3Ryb2tlIiwobmV3IG0uQ29sb3IpLnJhbmdlKClbMF0pO0EuYXR0cigic3Ryb2tlLXdpZHRoIiwiMnB4Iik7cmV0dXJuIEF9ayh4LHUpO3gucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGwuUHJveHlEcmF3ZXIoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHAuU2VnbWVudFNWR0RyYXdlcn0sZnVuY3Rpb24oKXtuLndhcm4oImNhbnZhcyByZW5kZXJlciBpcyBub3Qgc3VwcG9ydGVkIG9uIFNlZ21lbnQgUGxvdCEiKTtyZXR1cm4gbnVsbH0pfTt4LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjpuZXcgdC5OdWxsfV19O3gucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eT0KZnVuY3Rpb24oQSl7cmV0dXJuIngyIj09PUE/dS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywieCIpOiJ5MiI9PT1BP3UucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsInkiKTp1LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLEEpfTt4LnByb3RvdHlwZS54PWZ1bmN0aW9uKEEseSl7aWYobnVsbD09QSlyZXR1cm4gdS5wcm90b3R5cGUueC5jYWxsKHRoaXMpO251bGw9PXk/dS5wcm90b3R5cGUueC5jYWxsKHRoaXMsQSk6KHUucHJvdG90eXBlLnguY2FsbCh0aGlzLEEseSksQT0oQT10aGlzLngyKCkpJiZBLmFjY2Vzc29yLG51bGwhPUEmJnRoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9YMl9LRVksQSx5KSk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLngyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHguX1gyX0tFWSl9O3gucHJvdG90eXBlLnk9ZnVuY3Rpb24oQSx5KXtpZihudWxsPT0KQSlyZXR1cm4gdS5wcm90b3R5cGUueS5jYWxsKHRoaXMpO251bGw9PXk/dS5wcm90b3R5cGUueS5jYWxsKHRoaXMsQSk6KHUucHJvdG90eXBlLnkuY2FsbCh0aGlzLEEseSksQT0oQT10aGlzLnkyKCkpJiZBLmFjY2Vzc29yLG51bGwhPUEmJnRoaXMuX2JpbmRQcm9wZXJ0eSh4Ll9ZMl9LRVksQSx5KSk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLnkyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHguX1kyX0tFWSl9O3gucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgQT11LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyk7QS54MT1xLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTtBLngyPW51bGw9PXRoaXMueDIoKT9xLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTpxLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueDIoKSk7QS55MT1xLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTsKQS55Mj1udWxsPT10aGlzLnkyKCk/cS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk6cS5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkyKCkpO3JldHVybiBBfTt4LnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKEEpe0E9dGhpcy5lbnRpdHlOZWFyZXN0KEEpO3JldHVybiBudWxsIT1BP1tBXTpbXX07eC5wcm90b3R5cGUuZW50aXRpZXNJbj1mdW5jdGlvbihBLHkpe2lmKG51bGw9PXkpe3ZhciB3PXttaW46QS50b3BMZWZ0LngsbWF4OkEuYm90dG9tUmlnaHQueH07QT17bWluOkEudG9wTGVmdC55LG1heDpBLmJvdHRvbVJpZ2h0Lnl9fWVsc2Ugdz1BLEE9eTtyZXR1cm4gdGhpcy5fZW50aXRpZXNJbnRlcnNlY3RpbmcodyxBKX07eC5wcm90b3R5cGUuX2VudGl0aWVzSW50ZXJzZWN0aW5nPWZ1bmN0aW9uKEEseSl7dmFyIHc9dGhpcyxDPVtdLEc9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7dGhpcy5lbnRpdGllcygpLmZvckVhY2goZnVuY3Rpb24oRCl7dy5fbGluZUludGVyc2VjdHNCb3goRCwKQSx5LEcpJiZDLnB1c2goRCl9KTtyZXR1cm4gQ307eC5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzQm94PWZ1bmN0aW9uKEEseSx3LEMpe3ZhciBHPXRoaXMsRD1DLngxKEEuZGF0dW0sQS5pbmRleCxBLmRhdGFzZXQpLEI9Qy54MihBLmRhdHVtLEEuaW5kZXgsQS5kYXRhc2V0KSxJPUMueTEoQS5kYXR1bSxBLmluZGV4LEEuZGF0YXNldCk7QT1DLnkyKEEuZGF0dW0sQS5pbmRleCxBLmRhdGFzZXQpO2lmKHkubWluPD1EJiZEPD15Lm1heCYmdy5taW48PUkmJkk8PXcubWF4fHx5Lm1pbjw9QiYmQjw9eS5tYXgmJncubWluPD1BJiZBPD13Lm1heClyZXR1cm4hMDt2YXIgTj17eDpELHk6SX0sTz17eDpCLHk6QX0sSD1be3g6eS5taW4seTp3Lm1pbn0se3g6eS5taW4seTp3Lm1heH0se3g6eS5tYXgseTp3Lm1heH0se3g6eS5tYXgseTp3Lm1pbn1dO3JldHVybiAwPEguZmlsdGVyKGZ1bmN0aW9uKEssTSl7cmV0dXJuIDAhPT1NP0cuX2xpbmVJbnRlcnNlY3RzU2VnbWVudChOLE8sSyxIW00tCjFdKSYmRy5fbGluZUludGVyc2VjdHNTZWdtZW50KEssSFtNLTFdLE4sTyk6ITF9KS5sZW5ndGh9O3gucHJvdG90eXBlLl9saW5lSW50ZXJzZWN0c1NlZ21lbnQ9ZnVuY3Rpb24oQSx5LHcsQyl7ZnVuY3Rpb24gRyhELEIsSSl7cmV0dXJuKEIueC1ELngpKihJLnktQi55KS0oQi55LUQueSkqKEkueC1CLngpfXJldHVybiAwPkcoQSx5LHcpKkcoQSx5LEMpfTtyZXR1cm4geH0oaCgxNikuWFlQbG90KTtkLl9YMl9LRVk9IngyIjtkLl9ZMl9LRVk9InkyIjtmLlNlZ21lbnQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihxLHUpe2Z1bmN0aW9uIHgoKXt0aGlzLmNvbnN0cnVjdG9yPXF9Zm9yKHZhciBBIGluIHUpdS5oYXNPd25Qcm9wZXJ0eShBKSYmKHFbQV09dVtBXSk7cS5wcm90b3R5cGU9bnVsbD09PXU/T2JqZWN0LmNyZWF0ZSh1KTooeC5wcm90b3R5cGU9dS5wcm90b3R5cGUsbmV3IHgpfSx0PWgoMSksbD1oKDcpLHA9aCgyMCksbT0KaCgwKTtkPWgoNTApO3ZhciBuPWgoMik7aD1mdW5jdGlvbihxKXtmdW5jdGlvbiB1KCl7dmFyIHg9cS5jYWxsKHRoaXMpfHx0aGlzO3guX3N0YWNraW5nUmVzdWx0PXAubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4geC5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiB4LngoKS5hY2Nlc3Nvcn0sZnVuY3Rpb24oKXtyZXR1cm4geC55KCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHguX3N0YWNraW5nT3JkZXJ9LGZ1bmN0aW9uKEEseSx3LEMpe3JldHVybiBtLlN0YWNraW5nLnN0YWNrKEEseSx3LEMpfSk7eC5fc3RhY2tlZEV4dGVudD1wLm1lbVRodW5rKHguX3N0YWNraW5nUmVzdWx0LGZ1bmN0aW9uKCl7cmV0dXJuIHgueCgpLmFjY2Vzc29yfSxmdW5jdGlvbigpe3JldHVybiB4Ll9maWx0ZXJGb3JQcm9wZXJ0eSgieSIpfSxmdW5jdGlvbihBLHksdyl7cmV0dXJuIG0uU3RhY2tpbmcuc3RhY2tlZEV4dGVudChBLHksdyl9KTt4Ll9iYXNlbGluZVZhbHVlPTA7eC5fc3RhY2tpbmdPcmRlcj0KImJvdHRvbXVwIjt4LmFkZENsYXNzKCJzdGFja2VkLWFyZWEtcGxvdCIpO3guYXR0cigiZmlsbC1vcGFjaXR5IiwxKTt4Ll9iYXNlbGluZVZhbHVlUHJvdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm5beC5fYmFzZWxpbmVWYWx1ZV19O3guY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQoITEpO3JldHVybiB4fWsodSxxKTt1LnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1mdW5jdGlvbih4KXtyZXR1cm4gbnVsbD09eD9xLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZC5jYWxsKHRoaXMpOng/KG0uV2luZG93Lndhcm4oIldhcm5pbmc6IFN0YWNrZWQgQXJlYSBQbG90IGRvZXMgbm90IHN1cHBvcnQgY3JvcHBlZCByZW5kZXJpbmcuIiksdGhpcyk6cS5wcm90b3R5cGUuY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQuY2FsbCh0aGlzLHgpfTt1LnByb3RvdHlwZS5fZ2V0QW5pbWF0b3I9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGwuTnVsbH07dS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cS5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CnRoaXMuX2Jhc2VsaW5lPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiYmFzZWxpbmUiLCEwKX07dS5wcm90b3R5cGUueD1mdW5jdGlvbih4LEEpe2lmKG51bGw9PXgpcmV0dXJuIHEucHJvdG90eXBlLnguY2FsbCh0aGlzKTtudWxsPT1BP3EucHJvdG90eXBlLnguY2FsbCh0aGlzLHgpOnEucHJvdG90eXBlLnguY2FsbCh0aGlzLHgsQSk7dGhpcy5fY2hlY2tTYW1lRG9tYWluKCk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLnk9ZnVuY3Rpb24oeCxBKXtpZihudWxsPT14KXJldHVybiBxLnByb3RvdHlwZS55LmNhbGwodGhpcyk7bnVsbD09QT9xLnByb3RvdHlwZS55LmNhbGwodGhpcyx4KTpxLnByb3RvdHlwZS55LmNhbGwodGhpcyx4LEEpO3RoaXMuX2NoZWNrU2FtZURvbWFpbigpO3JldHVybiB0aGlzfTt1LnByb3RvdHlwZS5zdGFja2luZ09yZGVyPWZ1bmN0aW9uKHgpe2lmKG51bGw9PXgpcmV0dXJuIHRoaXMuX3N0YWNraW5nT3JkZXI7dGhpcy5fc3RhY2tpbmdPcmRlcj0KeDt0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTtyZXR1cm4gdGhpc307dS5wcm90b3R5cGUuZG93bnNhbXBsaW5nRW5hYmxlZD1mdW5jdGlvbigpe3JldHVybiBxLnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkLmNhbGwodGhpcyl9O3UucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLnkoKS5zY2FsZS5zY2FsZSh0aGlzLl9iYXNlbGluZVZhbHVlKTt4PXt4MTowLHkxOngseDI6dGhpcy53aWR0aCgpLHkyOnh9O3RoaXMuX2dldEFuaW1hdG9yKCJiYXNlbGluZSIpLmFuaW1hdGUodGhpcy5fYmFzZWxpbmUseCl9O3UucHJvdG90eXBlLl91cGRhdGVZU2NhbGU9ZnVuY3Rpb24oKXt2YXIgeD10aGlzLnkoKTt4PXgmJnguc2NhbGU7bnVsbCE9eCYmKHguYWRkUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpLHguYWRkSW5jbHVkZWRWYWx1ZXNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpKX07CnUucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl9jaGVja1NhbWVEb21haW4oKTtxLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlLmNhbGwodGhpcyk7cmV0dXJuIHRoaXN9O3UucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbih4KXtyZXR1cm4ieSI9PT14P1t0aGlzLl9zdGFja2VkRXh0ZW50KCldOnEucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMseCl9O3UucHJvdG90eXBlLl9jaGVja1NhbWVEb21haW49ZnVuY3Rpb24oKXtpZih0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSl7dmFyIHg9dGhpcy5kYXRhc2V0cygpLEE9dGhpcy54KCkuYWNjZXNzb3IseT14Lm1hcChmdW5jdGlvbihDKXtyZXR1cm4gdC5zZXQoQy5kYXRhKCkubWFwKGZ1bmN0aW9uKEcsRCl7cmV0dXJuIEEoRyxELEMpLnRvU3RyaW5nKCl9KSkudmFsdWVzKCl9KSx3PXUuX2RvbWFpbktleXMoeCxBKTt5LnNvbWUoZnVuY3Rpb24oQyl7cmV0dXJuIEMubGVuZ3RoIT09CncubGVuZ3RofSkmJm0uV2luZG93Lndhcm4oInRoZSBkb21haW5zIGFjcm9zcyB0aGUgZGF0YXNldHMgYXJlIG5vdCB0aGUgc2FtZS4gUGxvdCBtYXkgcHJvZHVjZSB1bmludGVuZGVkIGJlaGF2aW9yLiIpfX07dS5fZG9tYWluS2V5cz1mdW5jdGlvbih4LEEpe3ZhciB5PXQuc2V0KCk7eC5mb3JFYWNoKGZ1bmN0aW9uKHcpe3cuZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oQyxHKXt5LmFkZChBKEMsRyx3KSl9KX0pO3JldHVybiB5LnZhbHVlcygpfTt1LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24geChELEIsSSl7cmV0dXJuIG0uU3RhY2tpbmcubm9ybWFsaXplS2V5KEMoRCxCLEkpKX12YXIgQT10aGlzLHk9cS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpLHc9dGhpcy55KCkuYWNjZXNzb3IsQz10aGlzLngoKS5hY2Nlc3NvcixHPXRoaXMuX3N0YWNraW5nUmVzdWx0KCk7eS5kPXRoaXMuX2NvbnN0cnVjdEFyZWFQcm9qZWN0b3Iobi5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksCmZ1bmN0aW9uKEQsQixJKXtyZXR1cm4gQS55KCkuc2NhbGUuc2NhbGUoK3coRCxCLEkpK0cuZ2V0KEkpLmdldCh4KEQsQixJKSkub2Zmc2V0KX0sZnVuY3Rpb24oRCxCLEkpe3JldHVybiBBLnkoKS5zY2FsZS5zY2FsZShHLmdldChJKS5nZXQoeChELEIsSSkpLm9mZnNldCl9KTtyZXR1cm4geX07dS5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24oeCxBLHkpe3ZhciB3PXEucHJvdG90eXBlLl9waXhlbFBvaW50LmNhbGwodGhpcyx4LEEseSksQz10aGlzLngoKS5hY2Nlc3Nvcih4LEEseSk7eD10aGlzLnkoKS5hY2Nlc3Nvcih4LEEseSk7eT10aGlzLnkoKS5zY2FsZS5zY2FsZSgreCt0aGlzLl9zdGFja2luZ1Jlc3VsdCgpLmdldCh5KS5nZXQobS5TdGFja2luZy5ub3JtYWxpemVLZXkoQykpLm9mZnNldCk7cmV0dXJue3g6dy54LHl9fTtyZXR1cm4gdX0oZC5BcmVhKTtmLlN0YWNrZWRBcmVhPWh9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24odSwKeCl7ZnVuY3Rpb24gQSgpe3RoaXMuY29uc3RydWN0b3I9dX1mb3IodmFyIHkgaW4geCl4Lmhhc093blByb3BlcnR5KHkpJiYodVt5XT14W3ldKTt1LnByb3RvdHlwZT1udWxsPT09eD9PYmplY3QuY3JlYXRlKHgpOihBLnByb3RvdHlwZT14LnByb3RvdHlwZSxuZXcgQSl9LHQ9aCg1KSxsPWgoOCkscD1oKDIwKSxtPWgoMCksbj1oKDI3KSxxPWgoMik7ZD1mdW5jdGlvbih1KXtmdW5jdGlvbiB4KEEpe3ZvaWQgMD09PUEmJihBPSJ2ZXJ0aWNhbCIpO3ZhciB5PXUuY2FsbCh0aGlzLEEpfHx0aGlzO3kuX2V4dHJlbWFGb3JtYXR0ZXI9bC5pZGVudGl0eSgpO3kuX3N0YWNraW5nUmVzdWx0PXAubWVtVGh1bmsoZnVuY3Rpb24oKXtyZXR1cm4geS5kYXRhc2V0cygpfSxmdW5jdGlvbigpe3JldHVybiB5LnBvc2l0aW9uKCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHkubGVuZ3RoKCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHkuX3N0YWNraW5nT3JkZXJ9LGZ1bmN0aW9uKHcsCkMsRyxEKXtyZXR1cm4gbS5TdGFja2luZy5zdGFjayh3LEMsRyxEKX0pO3kuX3N0YWNrZWRFeHRlbnQ9cC5tZW1UaHVuayh5Ll9zdGFja2luZ1Jlc3VsdCxmdW5jdGlvbigpe3JldHVybiB5LnBvc2l0aW9uKCkuYWNjZXNzb3J9LGZ1bmN0aW9uKCl7cmV0dXJuIHkuX2ZpbHRlckZvclByb3BlcnR5KHkuX2lzVmVydGljYWw/InkiOiJ4Iil9LGZ1bmN0aW9uKHcsQyxHKXtyZXR1cm4gbS5TdGFja2luZy5zdGFja2VkRXh0ZW50KHcsQyxHKX0pO3kuYWRkQ2xhc3MoInN0YWNrZWQtYmFyLXBsb3QiKTt5Ll9zdGFja2luZ09yZGVyPSJib3R0b211cCI7cmV0dXJuIHl9ayh4LHUpO3gucHJvdG90eXBlLnN0YWNraW5nT3JkZXI9ZnVuY3Rpb24oQSl7aWYobnVsbD09QSlyZXR1cm4gdGhpcy5fc3RhY2tpbmdPcmRlcjt0aGlzLl9zdGFja2luZ09yZGVyPUE7dGhpcy5fb25EYXRhc2V0VXBkYXRlKCk7cmV0dXJuIHRoaXN9O3gucHJvdG90eXBlLmV4dHJlbWFGb3JtYXR0ZXI9ZnVuY3Rpb24oQSl7aWYoMD09PQphcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLl9leHRyZW1hRm9ybWF0dGVyO3RoaXMuX2V4dHJlbWFGb3JtYXR0ZXI9QTt0aGlzLnJlbmRlcigpO3JldHVybiB0aGlzfTt4LnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt1LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt0aGlzLl9sYWJlbEFyZWE9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKG4uQmFyLl9MQUJFTF9BUkVBX0NMQVNTLCEwKTt2YXIgQT1uZXcgdC5TdmdDb250ZXh0KHRoaXMuX2xhYmVsQXJlYS5ub2RlKCkpO3RoaXMuX21lYXN1cmVyPW5ldyB0LkNhY2hlTWVhc3VyZXIoQSk7dGhpcy5fd3JpdGVyPW5ldyB0LldyaXRlcih0aGlzLl9tZWFzdXJlcixBKX07eC5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXtmdW5jdGlvbiBBKE8sSCl7dmFyIEs9dy5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IoKSxNPXcud2lkdGgoKSxMPXcuaGVpZ2h0KCk7Ty5mb3JFYWNoKGZ1bmN0aW9uKFEpe2lmKFEuZXh0ZW50IT09CkMpe3ZhciBUPXcuZXh0cmVtYUZvcm1hdHRlcigpKFEuZXh0ZW50KSxYPXcuX21lYXN1cmVyLm1lYXN1cmUoVCksYWE9US5zdGFja2VkRGF0dW0sbGE9YWEub3JpZ2luYWxEYXR1bSxaPWFhLm9yaWdpbmFsSW5kZXg7YWE9YWEub3JpZ2luYWxEYXRhc2V0O3cuX2lzRGF0dW1PblNjcmVlbihLLE0sTCxsYSxaLGFhKSYmKGxhPXEuUGxvdC5fc2NhbGVkQWNjZXNzb3Iody5hdHRyKG4uQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpKGxhLFosYWEpLFo9RC5zY2FsZShRLmV4dGVudCksUT13Ll9nZXRQb3NpdGlvbkF0dHIoRy5zY2FsZShRLmF4aXNWYWx1ZSksbGEpK2xhLzIsUT1IKHcuX2lzVmVydGljYWw/e3g6USx5Olp9Ont4OloseTpRfSxYLGxhKSxUPXkoVCx7dG9wTGVmdDpRLGJvdHRvbVJpZ2h0Ont4OlEueCtYLndpZHRoLHk6US55K1guaGVpZ2h0fX0sbGEpLE4ucHVzaChUKSl9fSl9ZnVuY3Rpb24geShPLEgsSyl7dmFyIE09SC50b3BMZWZ0LEw9TS54LFE9TS55O009SC5ib3R0b21SaWdodC54LQpILnRvcExlZnQueDtIPUguYm90dG9tUmlnaHQueS1ILnRvcExlZnQueTtLPXcuX2lzVmVydGljYWw/TT5LOkg+SztLfHwoTD13Ll9sYWJlbEFyZWEuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTCsiLCAiK1ErIikiKSxMLmNsYXNzZWQoInN0YWNrZWQtYmFyLWxhYmVsIiwhMCksdy5fd3JpdGVyLndyaXRlKE8sTSxILHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSxMLm5vZGUoKSkpO3JldHVybiBLfXZhciB3PXRoaXM7dS5wcm90b3R5cGUuX2RyYXdMYWJlbHMuY2FsbCh0aGlzKTt0aGlzLl9sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dmFyIEM9K3RoaXMuYmFzZWxpbmVWYWx1ZSgpLEc9dGhpcy5wb3NpdGlvbigpLnNjYWxlLEQ9dGhpcy5sZW5ndGgoKS5zY2FsZSxCPW0uU3RhY2tpbmcuc3RhY2tlZEV4dGVudHModGhpcy5fc3RhY2tpbmdSZXN1bHQoKSksST1CLm1pbmltdW1FeHRlbnRzLE49W107QShCLm1heGltdW1FeHRlbnRzLApmdW5jdGlvbihPLEgpe3ZhciBLPXcuX2lzVmVydGljYWw/SC53aWR0aDpILmhlaWdodDtIPXcuX2lzVmVydGljYWw/SC5oZWlnaHQ6SC53aWR0aDtyZXR1cm57eDp3Ll9pc1ZlcnRpY2FsP08ueC1LLzI6Ty54K3guX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSLHk6dy5faXNWZXJ0aWNhbD9PLnktSDpPLnktSy8yfX0pO0EoSSxmdW5jdGlvbihPLEgpe3ZhciBLPXcuX2lzVmVydGljYWw/SC53aWR0aDpILmhlaWdodDtIPXcuX2lzVmVydGljYWw/SC5oZWlnaHQ6SC53aWR0aDtyZXR1cm57eDp3Ll9pc1ZlcnRpY2FsP08ueC1LLzI6Ty54LUgseTp3Ll9pc1ZlcnRpY2FsP08ueSt4Ll9FWFRSRU1BX0xBQkVMX01BUkdJTl9GUk9NX0JBUjpPLnktSy8yfX0pO04uc29tZShmdW5jdGlvbihPKXtyZXR1cm4gT30pJiZ0aGlzLl9sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCl9O3gucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe2Z1bmN0aW9uIEEoTSwKTCxRKXtyZXR1cm4gMD4rTyhNLEwsUSk/QyhNLEwsUSk6dyhNLEwsUSl9ZnVuY3Rpb24geShNLEwsUSl7cmV0dXJuIE1hdGguYWJzKHcoTSxMLFEpLUMoTSxMLFEpKX1mdW5jdGlvbiB3KE0sTCxRKXtyZXR1cm4gTi5zY2FsZSgrTyhNLEwsUSkrSy5nZXQoUSkuZ2V0KEcoTSxMLFEpKS5vZmZzZXQpfWZ1bmN0aW9uIEMoTSxMLFEpe3JldHVybiBOLnNjYWxlKEsuZ2V0KFEpLmdldChHKE0sTCxRKSkub2Zmc2V0KX1mdW5jdGlvbiBHKE0sTCxRKXtyZXR1cm4gbS5TdGFja2luZy5ub3JtYWxpemVLZXkoSChNLEwsUSkpfXZhciBEPXRoaXMsQj11LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKSxJPXRoaXMuX2lzVmVydGljYWw/InkiOiJ4IixOPXRoaXMubGVuZ3RoKCkuc2NhbGUsTz10aGlzLmxlbmd0aCgpLmFjY2Vzc29yLEg9dGhpcy5wb3NpdGlvbigpLmFjY2Vzc29yLEs9dGhpcy5fc3RhY2tpbmdSZXN1bHQoKTtCW3RoaXMuX2lzVmVydGljYWw/ImhlaWdodCI6CiJ3aWR0aCJdPXk7QltJXT1mdW5jdGlvbihNLEwsUSl7cmV0dXJuIEQuX2lzVmVydGljYWw/QShNLEwsUSk6QShNLEwsUSkteShNLEwsUSl9O3JldHVybiBCfTt4LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oQSl7cmV0dXJuIEE9PT0odGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiKT9bdGhpcy5fc3RhY2tlZEV4dGVudCgpXTp1LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLEEpfTt4LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt1LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTt0aGlzLl9tZWFzdXJlci5yZXNldCgpfTtyZXR1cm4geH0obi5CYXIpO2QuX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSPTU7Zi5TdGFja2VkQmFyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24ocCxtKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj0KcH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTtwLnByb3RvdHlwZT1udWxsPT09bT9PYmplY3QuY3JlYXRlKG0pOihuLnByb3RvdHlwZT1tLnByb3RvdHlwZSxuZXcgbil9LHQ9aCgwKTtkPWgoMjcpO3ZhciBsPWgoMik7aD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKCl7dmFyIG49cC5jYWxsKHRoaXMpfHx0aGlzO24uX2Nvbm5lY3RvcnNFbmFibGVkPSExO24uYWRkQ2xhc3MoIndhdGVyZmFsbC1wbG90Iik7cmV0dXJuIG59ayhtLHApO20ucHJvdG90eXBlLmNvbm5lY3RvcnNFbmFibGVkPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2Nvbm5lY3RvcnNFbmFibGVkO3RoaXMuX2Nvbm5lY3RvcnNFbmFibGVkPW47cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLnRvdGFsPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KG0uX1RPVEFMX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KG0uX1RPVEFMX0tFWSwKbixudWxsKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbihuKXt2YXIgcT10aGlzO3RoaXMuX2Nvbm5lY3RvckFyZWEuc2VsZWN0QWxsKCJsaW5lIikucmVtb3ZlKCk7dGhpcy5fY29ubmVjdG9yc0VuYWJsZWQmJnQuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyZXR1cm4gcS5fZHJhd0Nvbm5lY3RvcnMoKX0sbil9O20ucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24obil7bj1wLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0LmNhbGwodGhpcyxuKTt0aGlzLl9jb25uZWN0b3JBcmVhPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZChtLl9DT05ORUNUT1JfQVJFQV9DTEFTUywhMCk7cmV0dXJuIG59O20ucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihuKXtyZXR1cm4ieSI9PT1uP1t0aGlzLl9leHRlbnRdOnAucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsCm4pfTttLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLHE9cC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksdT10aGlzLnkoKS5zY2FsZSx4PWwuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy50b3RhbCgpKTtudWxsPT10aGlzLmF0dHIoInkiKSYmKHEueT1mdW5jdGlvbihBLHksdyl7dmFyIEM9bi55KCkuYWNjZXNzb3IoQSx5LHcpO2lmKHgoQSx5LHcpKXJldHVybiBNYXRoLm1pbih1LnNjYWxlKEMpLHUuc2NhbGUoMCkpO0E9bi5fc3VidG90YWxzW3ldO2lmKDA9PT15KXJldHVybiAwPkM/dS5zY2FsZShBLUMpOnUuc2NhbGUoQSk7eT1uLl9zdWJ0b3RhbHNbeS0xXTtyZXR1cm4gQT55P3Uuc2NhbGUoQSk6dS5zY2FsZSh5KX0pO251bGw9PXRoaXMuYXR0cigiaGVpZ2h0IikmJihxLmhlaWdodD1mdW5jdGlvbihBLHksdyl7dmFyIEM9eChBLHksdyk7QT1uLnkoKS5hY2Nlc3NvcihBLHksdyk7aWYoQylyZXR1cm4gTWF0aC5hYnModS5zY2FsZShBKS0KdS5zY2FsZSgwKSk7Qz1uLl9zdWJ0b3RhbHNbeV07aWYoMD09PXkpcmV0dXJuIE1hdGguYWJzKHUuc2NhbGUoQyktdS5zY2FsZShDLUEpKTt5PW4uX3N1YnRvdGFsc1t5LTFdO3JldHVybiBNYXRoLmFicyh1LnNjYWxlKEMpLXUuc2NhbGUoeSkpfSk7cVsiY2xhc3MiXT1mdW5jdGlvbihBLHksdyl7dmFyIEM9IiI7bnVsbCE9bi5hdHRyKCJjbGFzcyIpJiYoQz1uLmF0dHIoImNsYXNzIikuYWNjZXNzb3IoQSx5LHcpKyIgIik7aWYoeChBLHksdykpcmV0dXJuIEMrbS5fQkFSX1RPVEFMX0NMQVNTO0E9bi55KCkuYWNjZXNzb3IoQSx5LHcpO3JldHVybiBDKygwPEE/bS5fQkFSX0dST1dUSF9DTEFTUzptLl9CQVJfREVDTElORV9DTEFTUyl9O3JldHVybiBxfTttLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlU3VidG90YWxzKCk7cC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZS5jYWxsKHRoaXMpO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5fY2FsY3VsYXRlU3VidG90YWxzQW5kRXh0ZW50PQpmdW5jdGlvbihuKXt2YXIgcT10aGlzLHU9TnVtYmVyLk1BWF9WQUxVRSx4PU51bWJlci5NSU5fVkFMVUUsQT0wLHk9ITE7bi5kYXRhKCkuZm9yRWFjaChmdW5jdGlvbih3LEMpe3ZhciBHPXEueSgpLmFjY2Vzc29yKHcsQyxuKTsodz1xLnRvdGFsKCkuYWNjZXNzb3IodyxDLG4pKSYmMCE9PUN8fChBKz1HKTtxLl9zdWJ0b3RhbHMucHVzaChBKTtBPHUmJih1PUEpO0E+eCYmKHg9QSk7dyYmKEc8dSYmKHU9RyksRz54JiYoeD1HKSk7aWYoIXkmJncpe0M9Ry1BO2ZvcihHPTA7RzxxLl9zdWJ0b3RhbHMubGVuZ3RoO0crKylxLl9zdWJ0b3RhbHNbR10rPUM7eT0hMDtBKz1DO3UrPUM7eCs9Q319KTt0aGlzLl9leHRlbnQ9W3UseF19O20ucHJvdG90eXBlLl9kcmF3Q29ubmVjdG9ycz1mdW5jdGlvbigpe2Zvcih2YXIgbj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxxPXRoaXMuZGF0YXNldHMoKVswXSx1PTE7dTxxLmRhdGEoKS5sZW5ndGg7dSsrKXt2YXIgeD11LTEsQT1xLmRhdGEoKVt1XSwKeT1xLmRhdGEoKVt4XTt5PW4ueCh5LHgscSk7dmFyIHc9bi54KEEsdSxxKStuLndpZHRoKEEsdSxxKSxDPW4ueShBLHUscSk7aWYoMDx0aGlzLl9zdWJ0b3RhbHNbdV0mJnRoaXMuX3N1YnRvdGFsc1t1XT50aGlzLl9zdWJ0b3RhbHNbeF18fDA+dGhpcy5fc3VidG90YWxzW3VdJiZ0aGlzLl9zdWJ0b3RhbHNbdV0+PXRoaXMuX3N1YnRvdGFsc1t4XSlDPW4ueShBLHUscSkrbi5oZWlnaHQoQSx1LHEpO3RoaXMuX2Nvbm5lY3RvckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChtLl9DT05ORUNUT1JfQ0xBU1MsITApLmF0dHIoIngxIix5KS5hdHRyKCJ4MiIsdykuYXR0cigieTEiLEMpLmF0dHIoInkyIixDKX19O20ucHJvdG90eXBlLl91cGRhdGVTdWJ0b3RhbHM9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLmRhdGFzZXRzKCk7MDxuLmxlbmd0aCYmKG49bltuLmxlbmd0aC0xXSx0aGlzLl9zdWJ0b3RhbHM9W10sdGhpcy5fY2FsY3VsYXRlU3VidG90YWxzQW5kRXh0ZW50KG4pKX07cmV0dXJuIG19KGQuQmFyKTsKaC5fQkFSX0RFQ0xJTkVfQ0xBU1M9IndhdGVyZmFsbC1kZWNsaW5lIjtoLl9CQVJfR1JPV1RIX0NMQVNTPSJ3YXRlcmZhbGwtZ3Jvd3RoIjtoLl9CQVJfVE9UQUxfQ0xBU1M9IndhdGVyZmFsbC10b3RhbCI7aC5fQ09OTkVDVE9SX0NMQVNTPSJjb25uZWN0b3IiO2guX0NPTk5FQ1RPUl9BUkVBX0NMQVNTPSJjb25uZWN0b3ItYXJlYSI7aC5fVE9UQUxfS0VZPSJ0b3RhbCI7Zi5XYXRlcmZhbGw9aH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMSksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXt2YXIgcT1wLmNhbGwodGhpcyl8fHRoaXM7CnN3aXRjaChuKXtjYXNlIG51bGw6Y2FzZSB2b2lkIDA6bnVsbD09bS5fcGxvdHRhYmxlQ29sb3JDYWNoZSYmKG0uX3Bsb3R0YWJsZUNvbG9yQ2FjaGU9bS5fZ2V0UGxvdHRhYmxlQ29sb3JzKCkpO249dC5zY2FsZU9yZGluYWwoKS5yYW5nZShtLl9wbG90dGFibGVDb2xvckNhY2hlKTticmVhaztjYXNlICJDYXRlZ29yeTEwIjpjYXNlICJjYXRlZ29yeTEwIjpjYXNlICIxMCI6bj10LnNjYWxlT3JkaW5hbCh0LnNjaGVtZUNhdGVnb3J5MTApO2JyZWFrO2Nhc2UgIkNhdGVnb3J5MjAiOmNhc2UgImNhdGVnb3J5MjAiOmNhc2UgIjIwIjpuPXQuc2NhbGVPcmRpbmFsKHQuc2NoZW1lQ2F0ZWdvcnkyMCk7YnJlYWs7Y2FzZSAiQ2F0ZWdvcnkyMGIiOmNhc2UgImNhdGVnb3J5MjBiIjpjYXNlICIyMGIiOm49dC5zY2FsZU9yZGluYWwodC5zY2hlbWVDYXRlZ29yeTIwYik7YnJlYWs7Y2FzZSAiQ2F0ZWdvcnkyMGMiOmNhc2UgImNhdGVnb3J5MjBjIjpjYXNlICIyMGMiOm49dC5zY2FsZU9yZGluYWwodC5zY2hlbWVDYXRlZ29yeTIwYyk7CmJyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVuc3VwcG9ydGVkIENvbG9yU2NhbGUgdHlwZSIpO31xLl9kM1NjYWxlPW47cmV0dXJuIHF9ayhtLHApO20ucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKG4pe3JldHVybiBsLkFycmF5LnVuaXEobil9O20ucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gbC5BcnJheS51bmlxKHRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkpfTttLmludmFsaWRhdGVDb2xvckNhY2hlPWZ1bmN0aW9uKCl7bS5fcGxvdHRhYmxlQ29sb3JDYWNoZT1udWxsfTttLl9nZXRQbG90dGFibGVDb2xvcnM9ZnVuY3Rpb24oKXtmb3IodmFyIG49W10scT10LnNlbGVjdCgiYm9keSIpLmFwcGVuZCgicGxvdHRhYmxlLWNvbG9yLXRlc3RlciIpLHU9bC5Db2xvci5jb2xvclRlc3QocSwiIikseD0wLEE9bC5Db2xvci5jb2xvclRlc3QocSwicGxvdHRhYmxlLWNvbG9ycy0wIik7bnVsbCE9QSYmeDx0aGlzLl9NQVhJTVVNX0NPTE9SU19GUk9NX0NTUyYmCihBIT09dXx8QSE9PW5bbi5sZW5ndGgtMV0pOyluLnB1c2goQSkseCsrLEE9bC5Db2xvci5jb2xvclRlc3QocSwicGxvdHRhYmxlLWNvbG9ycy0iK3gpO3EucmVtb3ZlKCk7cmV0dXJuIG59O20ucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKG4pe3ZhciBxPXRoaXMuX2QzU2NhbGUobik7bj10aGlzLmRvbWFpbigpLmluZGV4T2Yobik7bj1NYXRoLmZsb29yKG4vdGhpcy5yYW5nZSgpLmxlbmd0aCk7cmV0dXJuIGwuQ29sb3IubGlnaHRlbkNvbG9yKHEsTWF0aC5sb2cobiptLl9MT09QX0xJR0hURU5fRkFDVE9SKzEpKX07bS5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07bS5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihuKXtpZihudWxsPT1uKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKG4pO3JldHVybiB0aGlzfTttLnByb3RvdHlwZS5fZ2V0UmFuZ2U9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKX07bS5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKG4pe3RoaXMuX2QzU2NhbGUucmFuZ2Uobil9O3JldHVybiBtfShoKDE3KS5TY2FsZSk7ZC5fTE9PUF9MSUdIVEVOX0ZBQ1RPUj0xLjY7ZC5fTUFYSU1VTV9DT0xPUlNfRlJPTV9DU1M9MjU2O2YuQ29sb3I9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMSksbD1oKDApO2Q9ZnVuY3Rpb24ocCl7ZnVuY3Rpb24gbShuKXt2b2lkIDA9PT1uJiYobj0ibGluZWFyIik7dmFyIHE9cC5jYWxsKHRoaXMpfHx0aGlzO3N3aXRjaChuKXtjYXNlICJsaW5lYXIiOnEuX2NvbG9yU2NhbGU9CnQuc2NhbGVMaW5lYXIoKTticmVhaztjYXNlICJsb2ciOnEuX2NvbG9yU2NhbGU9dC5zY2FsZUxvZygpO2JyZWFrO2Nhc2UgInNxcnQiOnEuX2NvbG9yU2NhbGU9dC5zY2FsZVNxcnQoKTticmVhaztjYXNlICJwb3ciOnEuX2NvbG9yU2NhbGU9dC5zY2FsZVBvdygpfWlmKG51bGw9PXEuX2NvbG9yU2NhbGUpdGhyb3cgRXJyb3IoInVua25vd24gUXVhbnRpdGF0aXZlU2NhbGUgc2NhbGUgdHlwZSAiK24pO3EucmFuZ2UobS5SRURTKTtyZXR1cm4gcX1rKG0scCk7bS5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24obil7bj10LmV4dGVudChuKTtyZXR1cm4gbnVsbD09blswXXx8bnVsbD09blsxXT9bXTpufTttLnByb3RvdHlwZS5fZDNJbnRlcnBvbGF0ZWRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlLnJhbmdlKFswLDFdKS5pbnRlcnBvbGF0ZSh0aGlzLl9pbnRlcnBvbGF0ZUNvbG9ycygpKX07bS5wcm90b3R5cGUuX2ludGVycG9sYXRlQ29sb3JzPQpmdW5jdGlvbigpe3ZhciBuPXRoaXMuX2NvbG9yUmFuZ2U7aWYoMj5uLmxlbmd0aCl0aHJvdyBFcnJvcigiQ29sb3Igc2NhbGUgYXJyYXlzIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuIik7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHEpe3E9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHEpKTtxKj1uLmxlbmd0aC0xO3ZhciB1PU1hdGguZmxvb3IocSkseD1xLXU7cmV0dXJuIHQuaW50ZXJwb2xhdGVMYWIoblt1XSxuW01hdGguY2VpbChxKV0pKHgpfX19O20ucHJvdG90eXBlLl9yZXNldFNjYWxlPWZ1bmN0aW9uKCl7dGhpcy5fZDNTY2FsZT10aGlzLl9kM0ludGVycG9sYXRlZFNjYWxlKCk7dGhpcy5fYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpO3RoaXMuX2Rpc3BhdGNoVXBkYXRlKCl9O20ucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXt2YXIgbj10aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcygpOzA8bi5sZW5ndGgmJnRoaXMuX3NldERvbWFpbihbbC5NYXRoLm1pbihuLAowKSxsLk1hdGgubWF4KG4sMCldKX07bS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUobil9O20ucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9O20ucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24obil7aWYobnVsbD09bilyZXR1cm4gdGhpcy5fZDNTY2FsZS5kb21haW4oKTt0aGlzLl9kM1NjYWxlLmRvbWFpbihuKTtyZXR1cm4gdGhpc307bS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbG9yUmFuZ2V9O20ucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbihuKXt0aGlzLl9jb2xvclJhbmdlPW47dGhpcy5fcmVzZXRTY2FsZSgpfTtyZXR1cm4gbX0oaCgxNykuU2NhbGUpO2QuUkVEUz0iI0ZGRkZGRiAjRkZGNkUxICNGRUY0QzAgI0ZFRDk3NiAjRkVCMjRDICNGRDhEM0MgI0ZDNEUyQSAjRTMxQTFDICNCMTAwMjYiLnNwbGl0KCIgIik7CmQuQkxVRVM9IiNGRkZGRkYgI0NDRkZGRiAjQTVGRkZEICM4NUY3RkIgIzZFRDNFRiAjNTVBN0UwICM0MTdGRDAgIzI1NDVEMyAjMEIwMkUxIi5zcGxpdCgiICIpO2QuUE9TTkVHPSIjMEIwMkUxICMyNTQ1RDMgIzQxN0ZEMCAjNTVBN0UwICM2RUQzRUYgIzg1RjdGQiAjQTVGRkZEICNDQ0ZGRkYgI0ZGRkZGRiAjRkZGNkUxICNGRUY0QzAgI0ZFRDk3NiAjRkVCMjRDICNGRDhEM0MgI0ZDNEUyQSAjRTMxQTFDICNCMTAwMjYiLnNwbGl0KCIgIik7Zi5JbnRlcnBvbGF0ZWRDb2xvcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKGwscCl7ZnVuY3Rpb24gbSgpe3RoaXMuY29uc3RydWN0b3I9bH1mb3IodmFyIG4gaW4gcClwLmhhc093blByb3BlcnR5KG4pJiYobFtuXT1wW25dKTtsLnByb3RvdHlwZT1udWxsPT09cD9PYmplY3QuY3JlYXRlKHApOihtLnByb3RvdHlwZT1wLnByb3RvdHlwZSxuZXcgbSl9LHQ9aCgxKTtkPWZ1bmN0aW9uKGwpe2Z1bmN0aW9uIHAoKXt2YXIgbT0KbC5jYWxsKHRoaXMpfHx0aGlzO20uX2QzU2NhbGU9dC5zY2FsZUxpbmVhcigpO3JldHVybiBtfWsocCxsKTtwLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVyblswLDFdfTtwLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24obSl7cmV0dXJuIG1bMF09PT1tWzFdP1ttWzBdLTEsbVsxXSsxXTptfTtwLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5fZDNTY2FsZShtKX07cC5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5zY2FsZShtKX07cC5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbihtKXtyZXR1cm4gdGhpcy5pbnZlcnQobSl9O3AucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9O3AucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRvbWFpbigpfTtwLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbihtKXt0aGlzLmRvbWFpbihtKX07cC5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX07cC5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbihtKXtpZihudWxsPT1tKXJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpO3RoaXMuX2QzU2NhbGUuZG9tYWluKG0pO3JldHVybiB0aGlzfTtwLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfTtwLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24obSl7dGhpcy5fZDNTY2FsZS5yYW5nZShtKX07cC5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKG0pe3JldHVybiB0aGlzLl9kM1NjYWxlLmludmVydChtKX07cC5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07CnAucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKG0sbil7cmV0dXJuIHRoaXMuX2QzU2NhbGUuY29weSgpLmRvbWFpbihtKS5uaWNlKG4pLmRvbWFpbigpfTtyZXR1cm4gcH0oaCgxMSkuUXVhbnRpdGF0aXZlU2NhbGUpO2YuTGluZWFyPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24obSxuKXtmdW5jdGlvbiBxKCl7dGhpcy5jb25zdHJ1Y3Rvcj1tfWZvcih2YXIgdSBpbiBuKW4uaGFzT3duUHJvcGVydHkodSkmJihtW3VdPW5bdV0pO20ucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KHEucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBxKX0sdD1oKDEpLGw9aCgwKSxwPWgoMyk7ZD1mdW5jdGlvbihtKXtmdW5jdGlvbiBuKHEpe3ZvaWQgMD09PXEmJihxPTEwKTt2YXIgdT1tLmNhbGwodGhpcyl8fHRoaXM7dS5fZDNTY2FsZT10LnNjYWxlTGluZWFyKCk7dS5fYmFzZT1xO3UuX3Bpdm90PXUuX2Jhc2U7dS5fc2V0RG9tYWluKHUuX2RlZmF1bHRFeHRlbnQoKSk7CmlmKDE+PXEpdGhyb3cgRXJyb3IoIk1vZGlmaWVkTG9nU2NhbGU6IFRoZSBiYXNlIG11c3QgYmUgXHgzZSAxIik7cmV0dXJuIHV9ayhuLG0pO24ucHJvdG90eXBlLl9hZGp1c3RlZExvZz1mdW5jdGlvbihxKXt2YXIgdT0wPnE/LTE6MTtxKj11O3E8dGhpcy5fcGl2b3QmJihxKz0odGhpcy5fcGl2b3QtcSkvdGhpcy5fcGl2b3QpO3E9TWF0aC5sb2cocSkvTWF0aC5sb2codGhpcy5fYmFzZSk7cmV0dXJuIHEqdX07bi5wcm90b3R5cGUuX2ludmVydGVkQWRqdXN0ZWRMb2c9ZnVuY3Rpb24ocSl7dmFyIHU9MD5xPy0xOjE7cT1NYXRoLnBvdyh0aGlzLl9iYXNlLHEqdSk7cTx0aGlzLl9waXZvdCYmKHE9dGhpcy5fcGl2b3QqKHEtMSkvKHRoaXMuX3Bpdm90LTEpKTtyZXR1cm4gcSp1fTtuLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5fZDNTY2FsZSh0aGlzLl9hZGp1c3RlZExvZyhxKSl9O24ucHJvdG90eXBlLmludmVydD1mdW5jdGlvbihxKXtyZXR1cm4gdGhpcy5faW52ZXJ0ZWRBZGp1c3RlZExvZyh0aGlzLl9kM1NjYWxlLmludmVydChxKSl9OwpuLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLnNjYWxlKHEpfTtuLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHEpe3JldHVybiB0aGlzLmludmVydChxKX07bi5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0VW5ib3VuZGVkRXh0ZW50KCEwKX07bi5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX07bi5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24ocSl7dGhpcy5kb21haW4ocSl9O24ucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbn07bi5wcm90b3R5cGUuX3NldERvbWFpbj1mdW5jdGlvbihxKXt0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluPXE7bS5wcm90b3R5cGUuX3NldERvbWFpbi5jYWxsKHRoaXMsClt0aGlzLl9hZGp1c3RlZExvZyhxWzBdKSx0aGlzLl9hZGp1c3RlZExvZyhxWzFdKV0pfTtuLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHEpe2lmKG51bGw9PXEpcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4ocSk7cmV0dXJuIHRoaXN9O24ucHJvdG90eXBlLnRpY2tzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gcShHLEQsQil7cmV0dXJuW0csRCxCXS5zb3J0KGZ1bmN0aW9uKEksTil7cmV0dXJuIEktTn0pWzFdfXZhciB1PWwuTWF0aC5taW4odGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSx4PWwuTWF0aC5tYXgodGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSxBPXEodSx4LC10aGlzLl9waXZvdCkseT1xKHUseCx0aGlzLl9waXZvdCk7QT10aGlzLl9sb2dUaWNrcygtQSwtdSkubWFwKGZ1bmN0aW9uKEcpe3JldHVybi1HfSkucmV2ZXJzZSgpO3k9dGhpcy5fbG9nVGlja3MoeSx4KTt2YXIgdz1NYXRoLm1heCh1LAotdGhpcy5fcGl2b3QpLEM9TWF0aC5taW4oeCx0aGlzLl9waXZvdCk7dz10LnNjYWxlTGluZWFyKCkuZG9tYWluKFt3LENdKS50aWNrcyh0aGlzLl9ob3dNYW55VGlja3ModyxDKSk7QT1BLmNvbmNhdCh3KS5jb25jYXQoeSk7MT49QS5sZW5ndGgmJihBPXQuc2NhbGVMaW5lYXIoKS5kb21haW4oW3UseF0pLnRpY2tzKCkpO3JldHVybiBBfTtuLnByb3RvdHlwZS5fbG9nVGlja3M9ZnVuY3Rpb24ocSx1KXt2YXIgeD10aGlzLEE9dGhpcy5faG93TWFueVRpY2tzKHEsdSk7aWYoMD09PUEpcmV0dXJuW107dmFyIHk9TWF0aC5mbG9vcihNYXRoLmxvZyhxKS9NYXRoLmxvZyh0aGlzLl9iYXNlKSksdz1NYXRoLmNlaWwoTWF0aC5sb2codSkvTWF0aC5sb2codGhpcy5fYmFzZSkpO0E9dC5yYW5nZSh3LHksLU1hdGguY2VpbCgody15KS9BKSk7eT10LnJhbmdlKHRoaXMuX2Jhc2UsMSwtKHRoaXMuX2Jhc2UtMSkpLm1hcChNYXRoLmZsb29yKTt2YXIgQz1sLkFycmF5LnVuaXEoeSk7QT1BLm1hcChmdW5jdGlvbihHKXtyZXR1cm4gQy5tYXAoZnVuY3Rpb24oRCl7cmV0dXJuIE1hdGgucG93KHguX2Jhc2UsCkctMSkqRH0pfSk7cmV0dXJuIGwuQXJyYXkuZmxhdHRlbihBKS5maWx0ZXIoZnVuY3Rpb24oRyl7cmV0dXJuIHE8PUcmJkc8PXV9KS5zb3J0KGZ1bmN0aW9uKEcsRCl7cmV0dXJuIEctRH0pfTtuLnByb3RvdHlwZS5faG93TWFueVRpY2tzPWZ1bmN0aW9uKHEsdSl7dmFyIHg9dGhpcy5fYWRqdXN0ZWRMb2cobC5NYXRoLm1pbih0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluLDApKSxBPXRoaXMuX2FkanVzdGVkTG9nKGwuTWF0aC5tYXgodGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSk7cmV0dXJuIE1hdGguY2VpbCgodGhpcy5fYWRqdXN0ZWRMb2codSktdGhpcy5fYWRqdXN0ZWRMb2cocSkpLyhBLXgpKnAuTW9kaWZpZWRMb2cuX0RFRkFVTFRfTlVNX1RJQ0tTKX07bi5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24ocSl7cmV0dXJuIHF9O24ucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuWzAsdGhpcy5fYmFzZV19O24ucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj0KZnVuY3Rpb24ocSl7cmV0dXJuIHFbMF09PT1xWzFdPyhxPXFbMF0sMDxxP1txL3RoaXMuX2Jhc2UscSp0aGlzLl9iYXNlXTowPT09cT9bLXRoaXMuX2Jhc2UsdGhpcy5fYmFzZV06W3EqdGhpcy5fYmFzZSxxL3RoaXMuX2Jhc2VdKTpxfTtuLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfTtuLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24ocSl7dGhpcy5fZDNTY2FsZS5yYW5nZShxKX07bi5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07cmV0dXJuIG59KGgoMTEpLlF1YW50aXRhdGl2ZVNjYWxlKTtmLk1vZGlmaWVkTG9nPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDApO2YuaW50ZXJ2YWxUaWNrR2VuZXJhdG9yPWZ1bmN0aW9uKHQpe2lmKDA+PXQpdGhyb3cgRXJyb3IoImludGVydmFsIG11c3QgYmUgcG9zaXRpdmUgbnVtYmVyIik7cmV0dXJuIGZ1bmN0aW9uKGwpe2w9CmwuZG9tYWluKCk7dmFyIHA9TWF0aC5taW4obFswXSxsWzFdKTtsPU1hdGgubWF4KGxbMF0sbFsxXSk7dmFyIG09TWF0aC5jZWlsKHAvdCkqdDtwPTA9PT1wJXQ/W106W3BdO3ZhciBuPWsuTWF0aC5yYW5nZSgwLE1hdGguZmxvb3IoKGwtbSkvdCkrMSkubWFwKGZ1bmN0aW9uKHEpe3JldHVybiBtK3EqdH0pO3JldHVybiBwLmNvbmNhdChuKS5jb25jYXQoMD09PWwldD9bXTpbbF0pfX07Zi5pbnRlZ2VyVGlja0dlbmVyYXRvcj1mdW5jdGlvbigpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbD10LmRlZmF1bHRUaWNrcygpO3JldHVybiBsLmZpbHRlcihmdW5jdGlvbihwLG0pe3JldHVybiAwPT09cCUxfHwwPT09bXx8bT09PWwubGVuZ3RoLTF9KX19fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHAsbSl7ZnVuY3Rpb24gbigpe3RoaXMuY29uc3RydWN0b3I9cH1mb3IodmFyIHEgaW4gbSltLmhhc093blByb3BlcnR5KHEpJiYocFtxXT1tW3FdKTsKcC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMSksbD1oKDI4KTtkPWZ1bmN0aW9uKHApe2Z1bmN0aW9uIG0oKXt2YXIgbj1wLmNhbGwodGhpcyl8fHRoaXM7bi5fZDNTY2FsZT10LnNjYWxlVGltZSgpO24uYXV0b0RvbWFpbigpO3JldHVybiBufWsobSxwKTttLnByb3RvdHlwZS50aWNrSW50ZXJ2YWw9ZnVuY3Rpb24obixxKXt2b2lkIDA9PT1xJiYocT0xKTt2YXIgdT10LnNjYWxlVGltZSgpO20udGltZUludGVydmFsVG9EM1RpbWUobikuZXZlcnkocSk7dS5kb21haW4odGhpcy5kb21haW4oKSk7dS5yYW5nZSh0aGlzLnJhbmdlKCkpO3JldHVybiB1LnRpY2tzKCl9O20ucHJvdG90eXBlLl9zZXREb21haW49ZnVuY3Rpb24obil7aWYoblsxXTxuWzBdKXRocm93IEVycm9yKCJTY2FsZS5UaW1lIGRvbWFpbiB2YWx1ZXMgbXVzdCBiZSBpbiBjaHJvbm9sb2dpY2FsIG9yZGVyIik7cmV0dXJuIHAucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLApuKX07bS5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm5bbmV3IERhdGUoIjE5NzAtMDEtMDEiKSxuZXcgRGF0ZSgiMTk3MC0wMS0wMiIpXX07bS5wcm90b3R5cGUuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluPWZ1bmN0aW9uKG4pe3ZhciBxPW5bMF0uZ2V0VGltZSgpLHU9blsxXS5nZXRUaW1lKCk7cmV0dXJuIHE9PT11PyhuPW5ldyBEYXRlKHEpLG4uc2V0RGF0ZShuLmdldERhdGUoKS0xKSx1PW5ldyBEYXRlKHUpLHUuc2V0RGF0ZSh1LmdldERhdGUoKSsxKSxbbix1XSk6bn07bS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUobil9O20ucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuc2NhbGUobmV3IERhdGUobikpfTttLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLmludmVydChuKS5nZXRUaW1lKCl9O20ucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PQpmdW5jdGlvbigpe3ZhciBuPXRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCk7cmV0dXJuW25bMF0udmFsdWVPZigpLG5bMV0udmFsdWVPZigpXX07bS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXt2YXIgbj10aGlzLmRvbWFpbigpO3JldHVybltuWzBdLnZhbHVlT2YoKSxuWzFdLnZhbHVlT2YoKV19O20ucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKG4pe3RoaXMuZG9tYWluKFtuZXcgRGF0ZShuWzBdKSxuZXcgRGF0ZShuWzFdKV0pfTttLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfTttLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKG4pe2lmKG51bGw9PW4pcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNTY2FsZS5kb21haW4obik7cmV0dXJuIHRoaXN9O20ucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnJhbmdlKCl9OwptLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24obil7dGhpcy5fZDNTY2FsZS5yYW5nZShuKX07bS5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKG4pe3JldHVybiB0aGlzLl9kM1NjYWxlLmludmVydChuKX07bS5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoKX07bS5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24obil7cmV0dXJuIHRoaXMuX2QzU2NhbGUuY29weSgpLmRvbWFpbihuKS5uaWNlKCkuZG9tYWluKCl9O20udGltZUludGVydmFsVG9EM1RpbWU9ZnVuY3Rpb24obil7c3dpdGNoKG4pe2Nhc2UgbC5UaW1lSW50ZXJ2YWwuc2Vjb25kOnJldHVybiB0LnRpbWVTZWNvbmQ7Y2FzZSBsLlRpbWVJbnRlcnZhbC5taW51dGU6cmV0dXJuIHQudGltZU1pbnV0ZTtjYXNlIGwuVGltZUludGVydmFsLmhvdXI6cmV0dXJuIHQudGltZUhvdXI7Y2FzZSBsLlRpbWVJbnRlcnZhbC5kYXk6cmV0dXJuIHQudGltZURheTsKY2FzZSBsLlRpbWVJbnRlcnZhbC53ZWVrOnJldHVybiB0LnRpbWVXZWVrO2Nhc2UgbC5UaW1lSW50ZXJ2YWwubW9udGg6cmV0dXJuIHQudGltZU1vbnRoO2Nhc2UgbC5UaW1lSW50ZXJ2YWwueWVhcjpyZXR1cm4gdC50aW1lWWVhcjtkZWZhdWx0OnRocm93IEVycm9yKCJUaW1lSW50ZXJ2YWwgc3BlY2lmaWVkIGRvZXMgbm90IGV4aXN0OiAiK24pO319O3JldHVybiBtfShoKDExKS5RdWFudGl0YXRpdmVTY2FsZSk7Zi5UaW1lPWR9LGZ1bmN0aW9uKGQsZixoKXt2YXIgaz1oKDEpLHQ9QXJyYXk7Zi5hZGQ9ZnVuY3Rpb24obCxwKXtpZihsLmxlbmd0aCE9PXAubGVuZ3RoKXRocm93IEVycm9yKCJhdHRlbXB0ZWQgdG8gYWRkIGFycmF5cyBvZiB1bmVxdWFsIGxlbmd0aCIpO3JldHVybiBsLm1hcChmdW5jdGlvbihtLG4pe3JldHVybiBsW25dK3Bbbl19KX07Zi51bmlxPWZ1bmN0aW9uKGwpe3ZhciBwPWsuc2V0KCksbT1bXTtsLmZvckVhY2goZnVuY3Rpb24obil7cC5oYXMoU3RyaW5nKG4pKXx8CihwLmFkZChTdHJpbmcobikpLG0ucHVzaChuKSl9KTtyZXR1cm4gbX07Zi5mbGF0dGVuPWZ1bmN0aW9uKGwpe3JldHVybiB0LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sbCl9O2YuY3JlYXRlRmlsbGVkQXJyYXk9ZnVuY3Rpb24obCxwKXtmb3IodmFyIG09W10sbj0wO248cDtuKyspbVtuXT0iZnVuY3Rpb24iPT09dHlwZW9mIGw/bChuKTpsO3JldHVybiBtfX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHQsbCl7dGhpcy5tYXhJbmRleD10aGlzLm1pbkluZGV4PXRoaXMuZXhpdEluZGV4PXRoaXMuZW50cnlJbmRleD1rO3RoaXMuYnVja2V0VmFsdWU9dDt0aGlzLm1heFZhbHVlPXRoaXMubWluVmFsdWU9bH1oLnByb3RvdHlwZS5pc0luQnVja2V0PWZ1bmN0aW9uKGspe3JldHVybiBrPT10aGlzLmJ1Y2tldFZhbHVlfTtoLnByb3RvdHlwZS5hZGRUb0J1Y2tldD1mdW5jdGlvbihrLHQpe2s8dGhpcy5taW5WYWx1ZSYmKHRoaXMubWluVmFsdWU9ayx0aGlzLm1pbkluZGV4PQp0KTtrPnRoaXMubWF4VmFsdWUmJih0aGlzLm1heFZhbHVlPWssdGhpcy5tYXhJbmRleD10KTt0aGlzLmV4aXRJbmRleD10fTtoLnByb3RvdHlwZS5nZXRVbmlxdWVJbmRpY2VzPWZ1bmN0aW9uKCl7dmFyIGs9W3RoaXMuZW50cnlJbmRleCx0aGlzLm1heEluZGV4LHRoaXMubWluSW5kZXgsdGhpcy5leGl0SW5kZXhdO3JldHVybiBrLmZpbHRlcihmdW5jdGlvbih0LGwpe3JldHVybiAwPT1sfHx0IT1rW2wtMV19KX07cmV0dXJuIGh9KCk7Zi5CdWNrZXQ9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPXRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbih0LGwpe2Z1bmN0aW9uIHAoKXt0aGlzLmNvbnN0cnVjdG9yPXR9Zm9yKHZhciBtIGluIGwpbC5oYXNPd25Qcm9wZXJ0eShtKSYmKHRbbV09bFttXSk7dC5wcm90b3R5cGU9bnVsbD09PWw/T2JqZWN0LmNyZWF0ZShsKToocC5wcm90b3R5cGU9bC5wcm90b3R5cGUsbmV3IHApfTtkPWZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGwoKXtyZXR1cm4gbnVsbCE9PQp0JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31rKGwsdCk7bC5wcm90b3R5cGUuY2FsbENhbGxiYWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgcD10aGlzLG09W10sbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspbVtuXT1hcmd1bWVudHNbbl07dGhpcy5mb3JFYWNoKGZ1bmN0aW9uKHEpe3EuYXBwbHkocCxtKX0pO3JldHVybiB0aGlzfTtyZXR1cm4gbH0oaCg1OCkuU2V0KTtmLkNhbGxiYWNrU2V0PWR9LGZ1bmN0aW9uKGQsZixoKXtmdW5jdGlvbiBrKHApe2Z1bmN0aW9uIG0odSl7dS89MjU1O3JldHVybi4wMzkyOD49dT91LzEyLjkyOmwucG93KCh1Ky4wNTUpLzEuMDU1LDIuNCl9dmFyIG49dC5yZ2IocCk7cD1tKG4ucik7dmFyIHE9bShuLmcpO249bShuLmIpO3JldHVybi4yMTI2KnArLjcxNTIqcSsuMDcyMipufXZhciB0PWgoMSksbD1NYXRoO2YuY29udHJhc3Q9ZnVuY3Rpb24ocCxtKXtwPWsocCkrLjA1O209ayhtKSsuMDU7cmV0dXJuIHA+bT9wL206bS9wfTtmLmxpZ2h0ZW5Db2xvcj0KZnVuY3Rpb24ocCxtKXtyZXR1cm4gdC5jb2xvcihwKS5icmlnaHRlcihtKS5yZ2IoKS50b1N0cmluZygpfTtmLmNvbG9yVGVzdD1mdW5jdGlvbihwLG0pe3AuY2xhc3NlZChtLCEwKTt2YXIgbj1wLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIik7aWYoInRyYW5zcGFyZW50Ij09PW4pcmV0dXJuIG51bGw7bj0vXCgoLispXCkvLmV4ZWMobik7aWYoIW4pcmV0dXJuIG51bGw7bj1uWzFdLnNwbGl0KCIsIikubWFwKGZ1bmN0aW9uKHEpe3E9K3E7dmFyIHU9cS50b1N0cmluZygxNik7cmV0dXJuIDE2PnE/IjAiK3U6dX0pO2lmKDQ9PT1uLmxlbmd0aCYmIjAwIj09PW5bM10pcmV0dXJuIG51bGw7bj0iIyIrbi5qb2luKCIiKTtwLmNsYXNzZWQobSwhMSk7cmV0dXJuIG59fSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgxKSx0PWgoNTcpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKCl7dGhpcy5fZW50aXRpZXM9W107dGhpcy5fcnRyZWU9bmV3IHQuUlRyZWU7dGhpcy5fdHJlZT1rLnF1YWR0cmVlKCkueChmdW5jdGlvbihwKXtyZXR1cm4gTWF0aC5mbG9vcihwLnBvc2l0aW9uLngpfSkueShmdW5jdGlvbihwKXtyZXR1cm4gTWF0aC5mbG9vcihwLnBvc2l0aW9uLnkpfSl9CmwucHJvdG90eXBlLmFkZEFsbD1mdW5jdGlvbihwLG0sbil7KHg9dGhpcy5fZW50aXRpZXMpLnB1c2guYXBwbHkoeCxwKTtpZih2b2lkIDAhPT1uKWZvcihuPXQuUlRyZWVCb3VuZHMuYm91bmRzKG4pLHg9MDt4PHAubGVuZ3RoO3grKyl7dmFyIHE9cFt4XSx1PXQuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKG0ocSkpO3QuUlRyZWVCb3VuZHMuaXNCb3VuZHNPdmVybGFwQm91bmRzKG4sdSkmJih0aGlzLl90cmVlLmFkZChxKSx0aGlzLl9ydHJlZS5pbnNlcnQodSxxKSl9ZWxzZSBmb3IodGhpcy5fdHJlZS5hZGRBbGwocCkseD0wO3g8cC5sZW5ndGg7eCsrKXE9cFt4XSx1PXQuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKG0ocSkpLHRoaXMuX3J0cmVlLmluc2VydCh1LHEpO3ZhciB4fTtsLnByb3RvdHlwZS5lbnRpdHlOZWFyZXN0PWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLl90cmVlLmZpbmQocC54LHAueSl9O2wucHJvdG90eXBlLmVudGl0aWVzSW5Cb3VuZHM9ZnVuY3Rpb24ocCl7cmV0dXJuIHRoaXMuX3J0cmVlLmludGVyc2VjdCh0LlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKSl9OwpsLnByb3RvdHlwZS5lbnRpdGllc0luWEJvdW5kcz1mdW5jdGlvbihwKXtyZXR1cm4gdGhpcy5fcnRyZWUuaW50ZXJzZWN0WCh0LlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhwKSl9O2wucHJvdG90eXBlLmVudGl0aWVzSW5ZQm91bmRzPWZ1bmN0aW9uKHApe3JldHVybiB0aGlzLl9ydHJlZS5pbnRlcnNlY3RZKHQuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKHApKX07bC5wcm90b3R5cGUuZW50aXRpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW50aXRpZXN9O3JldHVybiBsfSgpO2YuRW50aXR5U3RvcmU9ZH0sZnVuY3Rpb24oZCxmLGgpe3ZhciBrPWgoNTYpO2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7ImZ1bmN0aW9uIj09PXR5cGVvZiB3aW5kb3cuTWFwP3RoaXMuX2VzNk1hcD1uZXcgd2luZG93Lk1hcDp0aGlzLl9rZXlWYWx1ZVBhaXJzPVtdfXQucHJvdG90eXBlLnNldD1mdW5jdGlvbihsLHApe2lmKGsuaXNOYU4obCkpdGhyb3cgRXJyb3IoIk5hTiBtYXkgbm90IGJlIHVzZWQgYXMgYSBrZXkgdG8gdGhlIE1hcCIpOwppZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5zZXQobCxwKSx0aGlzO2Zvcih2YXIgbT0wO208dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7bSsrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbbV0ua2V5PT09bClyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlyc1ttXS52YWx1ZT1wLHRoaXM7dGhpcy5fa2V5VmFsdWVQYWlycy5wdXNoKHtrZXk6bCx2YWx1ZTpwfSk7cmV0dXJuIHRoaXN9O3QucHJvdG90eXBlLmdldD1mdW5jdGlvbihsKXtpZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5nZXQobCk7Zm9yKHZhciBwPTA7cDx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtwKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1twXS5rZXk9PT1sKXJldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzW3BdLnZhbHVlfTt0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24obCl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuaGFzKGwpOwpmb3IodmFyIHA9MDtwPHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoO3ArKylpZih0aGlzLl9rZXlWYWx1ZVBhaXJzW3BdLmtleT09PWwpcmV0dXJuITA7cmV0dXJuITF9O3QucHJvdG90eXBlLmZvckVhY2g9ZnVuY3Rpb24obCxwKXt2YXIgbT10aGlzO251bGwhPXRoaXMuX2VzNk1hcD90aGlzLl9lczZNYXAuZm9yRWFjaChmdW5jdGlvbihuLHEpe3JldHVybiBsLmNhbGwocCxuLHEsbSl9LHApOnRoaXMuX2tleVZhbHVlUGFpcnMuZm9yRWFjaChmdW5jdGlvbihuKXtsLmNhbGwocCxuLnZhbHVlLG4ua2V5LG0pfSl9O3QucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbihsKXtpZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5kZWxldGUobCk7Zm9yKHZhciBwPTA7cDx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtwKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1twXS5rZXk9PT1sKXJldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzLnNwbGljZShwLDEpLCEwO3JldHVybiExfTsKcmV0dXJuIHR9KCk7Zi5NYXA9ZH0sZnVuY3Rpb24oZCxmKXtmLmFzc2lnbj1mdW5jdGlvbigpe2Zvcih2YXIgaD1bXSxrPTA7azxhcmd1bWVudHMubGVuZ3RoO2srKyloW2tdPWFyZ3VtZW50c1trXTtrPXt9O2Zvcih2YXIgdD0wO3Q8aC5sZW5ndGg7dCsrKWZvcih2YXIgbD1oW3RdLHA9MCxtPU9iamVjdC5rZXlzKGwpO3A8bS5sZW5ndGg7cCsrKXt2YXIgbj1tW3BdO2tbbl09bFtuXX1yZXR1cm4ga319LGZ1bmN0aW9uKGQsZil7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoKXt9aC5wcm90b3R5cGUuc3BsaXQ9ZnVuY3Rpb24oayx0KXtmb3IodmFyIGw9TWF0aC5jZWlsKGsubGVuZ3RoLzIpLHA9MDtwPGw7cCsrKXRbMF0uaW5zZXJ0KGtbcF0pO2ZvcihwPWw7cDxrLmxlbmd0aDtwKyspdFsxXS5pbnNlcnQoa1twXSl9O3JldHVybiBofSgpO2YuU3BsaXRTdHJhdGVneVRyaXZpYWw9ZDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe31oLnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbihrLHQpe2s9Cmsuc2xpY2UoKTtmb3IodGhpcy5jaG9vc2VGaXJzdFNwbGl0KGssdCk7MDxrLmxlbmd0aDspdGhpcy5hZGROZXh0KGssdCl9O2gucHJvdG90eXBlLmNob29zZUZpcnN0U3BsaXQ9ZnVuY3Rpb24oayx0KXtmb3IodmFyIGw9MCxwPTAsbT1rLmxlbmd0aC0xLG49ay5sZW5ndGgtMSxxPTE7cTxrLmxlbmd0aC0xO3ErKyl7dmFyIHU9a1txXTt1LmJvdW5kcy54bD5rW21dLmJvdW5kcy54bD9tPXE6dS5ib3VuZHMueGg8a1tsXS5ib3VuZHMueGgmJihsPXEpO3UuYm91bmRzLnlsPmtbbl0uYm91bmRzLnlsP249cTp1LmJvdW5kcy55aDxrW3BdLmJvdW5kcy55aCYmKHA9cSl9cD1NYXRoLmFicyhrW2xdLmJvdW5kcy54aC1rW21dLmJvdW5kcy54bCk+TWF0aC5hYnMoa1twXS5ib3VuZHMueWgta1tuXS5ib3VuZHMueWwpP1tsLG1dOltwLG5dO2w9cFswXTtwPXBbMV07bD09PXAmJihsPTAscD1rLmxlbmd0aC0xKTt0WzBdLmluc2VydChrLnNwbGljZShNYXRoLm1heChsLHApLDEpWzBdKTt0WzFdLmluc2VydChrLnNwbGljZShNYXRoLm1pbihsLApwKSwxKVswXSl9O2gucHJvdG90eXBlLmFkZE5leHQ9ZnVuY3Rpb24oayx0KXtmb3IodmFyIGw9bnVsbCxwPW51bGwsbT1udWxsLG49MDtuPGsubGVuZ3RoO24rKyl7dmFyIHE9a1tuXSx1PXRbMF0udW5pb25BcmVhRGlmZmVyZW5jZShxLmJvdW5kcyk7cT10WzFdLnVuaW9uQXJlYURpZmZlcmVuY2UocS5ib3VuZHMpO2lmKHU8cHx8bnVsbD09bClsPW4scD11LG09dFswXTtxPHAmJihsPW4scD1xLG09dFsxXSl9bS5pbnNlcnQoay5zcGxpY2UobCwxKVswXSl9O3JldHVybiBofSgpO2YuU3BsaXRTdHJhdGVneUxpbmVhcj1kfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhtKXtyZXR1cm4gU3RyaW5nKG0pfXZhciB0PWgoMSksbD1oKDApO2Q9aCgxMCk7Zi5JU3RhY2tpbmdPcmRlcj1kLm1ha2VFbnVtKFsidG9wZG93biIsImJvdHRvbXVwIl0pO3ZhciBwPU1hdGg7Zi5zdGFjaz1mdW5jdGlvbihtLG4scSx1KXt2b2lkIDA9PT11JiYodT0iYm90dG9tdXAiKTt2YXIgeD10Lm1hcCgpLEE9CnQubWFwKCkseT1uZXcgbC5NYXA7InRvcGRvd24iPT09dSYmKG09bS5zbGljZSgpLG0ucmV2ZXJzZSgpKTttLmZvckVhY2goZnVuY3Rpb24odyl7dmFyIEM9bmV3IGwuTWFwO3cuZGF0YSgpLmZvckVhY2goZnVuY3Rpb24oRyxEKXt2YXIgQj1rKG4oRyxELHcpKSxJPStxKEcsRCx3KSxOPTA8PUk/eDpBO2lmKE4uaGFzKEIpKXt2YXIgTz1OLmdldChCKTtOLnNldChCLE8rSSl9ZWxzZSBPPTAsTi5zZXQoQixJKTtDLnNldChCLHtvZmZzZXQ6Tyx2YWx1ZTpJLGF4aXNWYWx1ZTpuKEcsRCx3KSxvcmlnaW5hbERhdHVtOkcsb3JpZ2luYWxEYXRhc2V0Oncsb3JpZ2luYWxJbmRleDpEfSl9KTt5LnNldCh3LEMpfSk7cmV0dXJuIHl9O2Yuc3RhY2tlZEV4dGVudHM9ZnVuY3Rpb24obSl7dmFyIG49bmV3IGwuTWFwLHE9bmV3IGwuTWFwO20uZm9yRWFjaChmdW5jdGlvbih1KXt1LmZvckVhY2goZnVuY3Rpb24oeCxBKXt2YXIgeT1sLk1hdGgubWF4KFt4Lm9mZnNldCt4LnZhbHVlLHgub2Zmc2V0XSwKeC5vZmZzZXQpLHc9bC5NYXRoLm1pbihbeC5vZmZzZXQreC52YWx1ZSx4Lm9mZnNldF0seC5vZmZzZXQpLEM9eC5heGlzVmFsdWU7bi5oYXMoQSk/bi5nZXQoQSkuZXh0ZW50PHkmJm4uc2V0KEEse2V4dGVudDp5LGF4aXNWYWx1ZTpDLHN0YWNrZWREYXR1bTp4fSk6bi5zZXQoQSx7ZXh0ZW50OnksYXhpc1ZhbHVlOkMsc3RhY2tlZERhdHVtOnh9KTtxLmhhcyhBKT9xLmdldChBKS5leHRlbnQ+dyYmcS5zZXQoQSx7ZXh0ZW50OncsYXhpc1ZhbHVlOkMsc3RhY2tlZERhdHVtOnh9KTpxLnNldChBLHtleHRlbnQ6dyxheGlzVmFsdWU6QyxzdGFja2VkRGF0dW06eH0pfSl9KTtyZXR1cm57bWF4aW11bUV4dGVudHM6bixtaW5pbXVtRXh0ZW50czpxfX07Zi5zdGFja2VkRXh0ZW50PWZ1bmN0aW9uKG0sbixxKXt2YXIgdT1bXTttLmZvckVhY2goZnVuY3Rpb24oQSx5KXt5LmRhdGEoKS5mb3JFYWNoKGZ1bmN0aW9uKHcsQyl7aWYobnVsbD09cXx8cSh3LEMseSkpdz1BLmdldChrKG4odyxDLHkpKSksCnUucHVzaCh3LnZhbHVlK3cub2Zmc2V0KX0pfSk7bT1sLk1hdGgubWF4KHUsMCk7dmFyIHg9bC5NYXRoLm1pbih1LDApO3JldHVybltwLm1pbih4LDApLHAubWF4KDAsbSldfTtmLm5vcm1hbGl6ZUtleT1rfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgwKTtmLmdldFRyYW5zbGF0b3I9ZnVuY3Rpb24obCl7bD1sLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKTt2YXIgcD1sLl9fUGxvdHRhYmxlX0NsaWVudFRyYW5zbGF0b3I7bnVsbD09cCYmKHA9bmV3IHQobCksbC5fX1Bsb3R0YWJsZV9DbGllbnRUcmFuc2xhdG9yPXApO3JldHVybiBwfTt2YXIgdD1mdW5jdGlvbigpe2Z1bmN0aW9uIGwocCl7dGhpcy5fcm9vdEVsZW1lbnQ9cH1sLnByb3RvdHlwZS5jb21wdXRlUG9zaXRpb249ZnVuY3Rpb24ocCxtKXtwPXt4OnAseTptfTttPWsuTWF0aC5nZXRDdW11bGF0aXZlVHJhbnNmb3JtKHRoaXMuX3Jvb3RFbGVtZW50KTtyZXR1cm4gbnVsbD09bT9wOmsuTWF0aC5hcHBseVRyYW5zZm9ybShtLApwKX07bC5pc0V2ZW50SW5zaWRlPWZ1bmN0aW9uKHAsbSl7cmV0dXJuIGsuRE9NLmNvbnRhaW5zKHAucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpLG0udGFyZ2V0KX07cmV0dXJuIGx9KCk7Zi5UcmFuc2xhdG9yPXR9LGZ1bmN0aW9uKGQsZixoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZiwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGs9aCgxMjQpO2guZChmLCJlYXNlTGluZWFyIixmdW5jdGlvbigpe3JldHVybiBrLmF9KTt2YXIgdD1oKDEyNik7aC5kKGYsImVhc2VRdWFkIixmdW5jdGlvbigpe3JldHVybiB0LmF9KTtoLmQoZiwiZWFzZVF1YWRJbiIsZnVuY3Rpb24oKXtyZXR1cm4gdC5ifSk7aC5kKGYsImVhc2VRdWFkT3V0IixmdW5jdGlvbigpe3JldHVybiB0LmN9KTtoLmQoZiwiZWFzZVF1YWRJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gdC5hfSk7dmFyIGw9aCgxMjEpO2guZChmLCJlYXNlQ3ViaWMiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuYX0pO2guZChmLCJlYXNlQ3ViaWNJbiIsCmZ1bmN0aW9uKCl7cmV0dXJuIGwuYn0pO2guZChmLCJlYXNlQ3ViaWNPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIGwuY30pO2guZChmLCJlYXNlQ3ViaWNJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gbC5hfSk7dmFyIHA9aCgxMjUpO2guZChmLCJlYXNlUG9seSIsZnVuY3Rpb24oKXtyZXR1cm4gcC5hfSk7aC5kKGYsImVhc2VQb2x5SW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYn0pO2guZChmLCJlYXNlUG9seU91dCIsZnVuY3Rpb24oKXtyZXR1cm4gcC5jfSk7aC5kKGYsImVhc2VQb2x5SW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHAuYX0pO3ZhciBtPWgoMTI3KTtoLmQoZiwiZWFzZVNpbiIsZnVuY3Rpb24oKXtyZXR1cm4gbS5hfSk7aC5kKGYsImVhc2VTaW5JbiIsZnVuY3Rpb24oKXtyZXR1cm4gbS5ifSk7aC5kKGYsImVhc2VTaW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG0uY30pO2guZChmLCJlYXNlU2luSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIG0uYX0pO3ZhciBuPWgoMTIzKTtoLmQoZiwKImVhc2VFeHAiLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYX0pO2guZChmLCJlYXNlRXhwSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIG4uYn0pO2guZChmLCJlYXNlRXhwT3V0IixmdW5jdGlvbigpe3JldHVybiBuLmN9KTtoLmQoZiwiZWFzZUV4cEluT3V0IixmdW5jdGlvbigpe3JldHVybiBuLmF9KTt2YXIgcT1oKDEyMCk7aC5kKGYsImVhc2VDaXJjbGUiLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYX0pO2guZChmLCJlYXNlQ2lyY2xlSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHEuYn0pO2guZChmLCJlYXNlQ2lyY2xlT3V0IixmdW5jdGlvbigpe3JldHVybiBxLmN9KTtoLmQoZiwiZWFzZUNpcmNsZUluT3V0IixmdW5jdGlvbigpe3JldHVybiBxLmF9KTt2YXIgdT1oKDExOSk7aC5kKGYsImVhc2VCb3VuY2UiLGZ1bmN0aW9uKCl7cmV0dXJuIHUuYX0pO2guZChmLCJlYXNlQm91bmNlSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHUuYn0pO2guZChmLCJlYXNlQm91bmNlT3V0IixmdW5jdGlvbigpe3JldHVybiB1LmF9KTsKaC5kKGYsImVhc2VCb3VuY2VJbk91dCIsZnVuY3Rpb24oKXtyZXR1cm4gdS5jfSk7dmFyIHg9aCgxMTgpO2guZChmLCJlYXNlQmFjayIsZnVuY3Rpb24oKXtyZXR1cm4geC5hfSk7aC5kKGYsImVhc2VCYWNrSW4iLGZ1bmN0aW9uKCl7cmV0dXJuIHguYn0pO2guZChmLCJlYXNlQmFja091dCIsZnVuY3Rpb24oKXtyZXR1cm4geC5jfSk7aC5kKGYsImVhc2VCYWNrSW5PdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIHguYX0pO3ZhciBBPWgoMTIyKTtoLmQoZiwiZWFzZUVsYXN0aWMiLGZ1bmN0aW9uKCl7cmV0dXJuIEEuYX0pO2guZChmLCJlYXNlRWxhc3RpY0luIixmdW5jdGlvbigpe3JldHVybiBBLmJ9KTtoLmQoZiwiZWFzZUVsYXN0aWNPdXQiLGZ1bmN0aW9uKCl7cmV0dXJuIEEuYX0pO2guZChmLCJlYXNlRWxhc3RpY0luT3V0IixmdW5jdGlvbigpe3JldHVybiBBLmN9KX0sZnVuY3Rpb24oZCxmLGgpe2guZChmLCJiIixmdW5jdGlvbigpe3JldHVybiBrfSk7aC5kKGYsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHR9KTsKaC5kKGYsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTt2YXIgaz1mdW5jdGlvbiBuKG0pe2Z1bmN0aW9uIHEodSl7cmV0dXJuIHUqdSooKG0rMSkqdS1tKX1tPSttO3Eub3ZlcnNob290PW47cmV0dXJuIHF9KDEuNzAxNTgpLHQ9ZnVuY3Rpb24gcShuKXtmdW5jdGlvbiB1KHgpe3JldHVybi0teCp4KigobisxKSp4K24pKzF9bj0rbjt1Lm92ZXJzaG9vdD1xO3JldHVybiB1fSgxLjcwMTU4KSxsPWZ1bmN0aW9uIHUocSl7ZnVuY3Rpb24geChBKXtyZXR1cm4oMT4oQSo9Mik/QSpBKigocSsxKSpBLXEpOihBLT0yKSpBKigocSsxKSpBK3EpKzIpLzJ9cT0rcTt4Lm92ZXJzaG9vdD11O3JldHVybiB4fSgxLjcwMTU4KX0sZnVuY3Rpb24oZCxmKXtmdW5jdGlvbiBoKHkpe3JldHVybih5PSt5KTxrP0EqeSp5Onk8bD9BKih5LT10KSp5K3A6eTxuP0EqKHktPW0pKnkrcTpBKih5LT11KSp5K3h9Zi5iPWZ1bmN0aW9uKHkpe3JldHVybiAxLWgoMS15KX07Zi5hPWg7Zi5jPWZ1bmN0aW9uKHkpe3JldHVybigxPj0KKHkqPTIpPzEtaCgxLXkpOmgoeS0xKSsxKS8yfTt2YXIgaz00LzExLHQ9Ni8xMSxsPTgvMTEscD0uNzUsbT05LzExLG49MTAvMTEscT0uOTM3NSx1PTIxLzIyLHg9Ljk4NDM3NSxBPTEvay9rfSxmdW5jdGlvbihkLGYpe2YuYj1mdW5jdGlvbihoKXtyZXR1cm4gMS1NYXRoLnNxcnQoMS1oKmgpfTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIE1hdGguc3FydCgxLSAtLWgqaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpPzEtTWF0aC5zcXJ0KDEtaCpoKTpNYXRoLnNxcnQoMS0oaC09MikqaCkrMSkvMn19LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKGgpe3JldHVybiBoKmgqaH07Zi5jPWZ1bmN0aW9uKGgpe3JldHVybi0taCpoKmgrMX07Zi5hPWZ1bmN0aW9uKGgpe3JldHVybigxPj0oaCo9Mik/aCpoKmg6KGgtPTIpKmgqaCsyKS8yfX0sZnVuY3Rpb24oZCxmLGgpe2guZChmLCJiIixmdW5jdGlvbigpe3JldHVybiB0fSk7aC5kKGYsImEiLGZ1bmN0aW9uKCl7cmV0dXJuIGx9KTsKaC5kKGYsImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHB9KTt2YXIgaz0yKk1hdGguUEksdD1mdW5jdGlvbiB1KG4scSl7ZnVuY3Rpb24geCh5KXtyZXR1cm4gbipNYXRoLnBvdygyLDEwKi0teSkqTWF0aC5zaW4oKEEteSkvcSl9dmFyIEE9TWF0aC5hc2luKDEvKG49TWF0aC5tYXgoMSxuKSkpKihxLz1rKTt4LmFtcGxpdHVkZT1mdW5jdGlvbih5KXtyZXR1cm4gdSh5LHEqayl9O3gucGVyaW9kPWZ1bmN0aW9uKHkpe3JldHVybiB1KG4seSl9O3JldHVybiB4fSgxLC4zKSxsPWZ1bmN0aW9uIHgocSx1KXtmdW5jdGlvbiBBKHcpe3JldHVybiAxLXEqTWF0aC5wb3coMiwtMTAqKHc9K3cpKSpNYXRoLnNpbigodyt5KS91KX12YXIgeT1NYXRoLmFzaW4oMS8ocT1NYXRoLm1heCgxLHEpKSkqKHUvPWspO0EuYW1wbGl0dWRlPWZ1bmN0aW9uKHcpe3JldHVybiB4KHcsdSprKX07QS5wZXJpb2Q9ZnVuY3Rpb24odyl7cmV0dXJuIHgocSx3KX07cmV0dXJuIEF9KDEsLjMpLHA9ZnVuY3Rpb24gQSh1LHgpe2Z1bmN0aW9uIHkoQyl7cmV0dXJuKDA+CihDPTIqQy0xKT91Kk1hdGgucG93KDIsMTAqQykqTWF0aC5zaW4oKHctQykveCk6Mi11Kk1hdGgucG93KDIsLTEwKkMpKk1hdGguc2luKCh3K0MpL3gpKS8yfXZhciB3PU1hdGguYXNpbigxLyh1PU1hdGgubWF4KDEsdSkpKSooeC89ayk7eS5hbXBsaXR1ZGU9ZnVuY3Rpb24oQyl7cmV0dXJuIEEoQyx4KmspfTt5LnBlcmlvZD1mdW5jdGlvbihDKXtyZXR1cm4gQSh1LEMpfTtyZXR1cm4geX0oMSwuMyl9LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKGgpe3JldHVybiBNYXRoLnBvdygyLDEwKmgtMTApfTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIDEtTWF0aC5wb3coMiwtMTAqaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpP01hdGgucG93KDIsMTAqaC0xMCk6Mi1NYXRoLnBvdygyLDEwLTEwKmgpKS8yfX0sZnVuY3Rpb24oZCxmKXtmLmE9ZnVuY3Rpb24oaCl7cmV0dXJuK2h9fSxmdW5jdGlvbihkLGYsaCl7aC5kKGYsImIiLGZ1bmN0aW9uKCl7cmV0dXJuIGt9KTtoLmQoZiwKImMiLGZ1bmN0aW9uKCl7cmV0dXJuIHR9KTtoLmQoZiwiYSIsZnVuY3Rpb24oKXtyZXR1cm4gbH0pO3ZhciBrPWZ1bmN0aW9uIG4obSl7ZnVuY3Rpb24gcSh1KXtyZXR1cm4gTWF0aC5wb3codSxtKX1tPSttO3EuZXhwb25lbnQ9bjtyZXR1cm4gcX0oMyksdD1mdW5jdGlvbiBxKG4pe2Z1bmN0aW9uIHUoeCl7cmV0dXJuIDEtTWF0aC5wb3coMS14LG4pfW49K247dS5leHBvbmVudD1xO3JldHVybiB1fSgzKSxsPWZ1bmN0aW9uIHUocSl7ZnVuY3Rpb24geChBKXtyZXR1cm4oMT49KEEqPTIpP01hdGgucG93KEEscSk6Mi1NYXRoLnBvdygyLUEscSkpLzJ9cT0rcTt4LmV4cG9uZW50PXU7cmV0dXJuIHh9KDMpfSxmdW5jdGlvbihkLGYpe2YuYj1mdW5jdGlvbihoKXtyZXR1cm4gaCpofTtmLmM9ZnVuY3Rpb24oaCl7cmV0dXJuIGgqKDItaCl9O2YuYT1mdW5jdGlvbihoKXtyZXR1cm4oMT49KGgqPTIpP2gqaDotLWgqKDItaCkrMSkvMn19LGZ1bmN0aW9uKGQsZil7Zi5iPWZ1bmN0aW9uKHQpe3JldHVybiAxLQpNYXRoLmNvcyh0KmspfTtmLmM9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguc2luKHQqayl9O2YuYT1mdW5jdGlvbih0KXtyZXR1cm4oMS1NYXRoLmNvcyhoKnQpKS8yfTt2YXIgaD1NYXRoLlBJLGs9aC8yfSxmdW5jdGlvbihkLGYsaCl7ZnVuY3Rpb24gayhsKXtyZXR1cm4hMD09PXQobCkmJiJbb2JqZWN0IE9iamVjdF0iPT09T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGwpfXZhciB0PWgoMTI5KTtkLmV4cG9ydHM9ZnVuY3Rpb24obCl7aWYoITE9PT1rKGwpKXJldHVybiExO2w9bC5jb25zdHJ1Y3RvcjtpZigiZnVuY3Rpb24iIT09dHlwZW9mIGwpcmV0dXJuITE7bD1sLnByb3RvdHlwZTtyZXR1cm4hMT09PWsobCl8fCExPT09bC5oYXNPd25Qcm9wZXJ0eSgiaXNQcm90b3R5cGVPZiIpPyExOiEwfX0sZnVuY3Rpb24oZCl7ZC5leHBvcnRzPWZ1bmN0aW9uKGYpe3JldHVybiBudWxsIT1mJiYib2JqZWN0Ij09PXR5cGVvZiBmJiYhMT09PUFycmF5LmlzQXJyYXkoZil9fSxmdW5jdGlvbihkLApmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaChrLHQsbCl7dm9pZCAwPT09dCYmKHQ9MTApO3ZvaWQgMD09PWwmJihsPXt9KTt2YXIgcD10aGlzO3RoaXMuY3R4PWs7dGhpcy5saW5lSGVpZ2h0PXQ7dGhpcy5zdHlsZT1sO3RoaXMuY3JlYXRlUnVsZXI9ZnVuY3Rpb24oKXtyZXR1cm4gZnVuY3Rpb24obSl7cC5jdHguZm9udD1wLnN0eWxlLmZvbnQ7cmV0dXJue3dpZHRoOnAuY3R4Lm1lYXN1cmVUZXh0KG0pLndpZHRoLGhlaWdodDpwLmxpbmVIZWlnaHR9fX07dGhpcy5jcmVhdGVQZW49ZnVuY3Rpb24obSxuLHEpe251bGw9PXEmJihxPXAuY3R4KTtxLnNhdmUoKTtxLnRyYW5zbGF0ZShuLnRyYW5zbGF0ZVswXSxuLnRyYW5zbGF0ZVsxXSk7cS5yb3RhdGUobi5yb3RhdGUqTWF0aC5QSS8xODApO3JldHVybiBwLmNyZWF0ZUNhbnZhc1BlbihxKX07dm9pZCAwPT09dGhpcy5zdHlsZS5maWxsJiYodGhpcy5zdHlsZS5maWxsPSIjNDQ0Iil9aC5wcm90b3R5cGUuY3JlYXRlQ2FudmFzUGVuPWZ1bmN0aW9uKGspe3ZhciB0PQp0aGlzO3JldHVybntkZXN0cm95OmZ1bmN0aW9uKCl7ay5yZXN0b3JlKCl9LHdyaXRlOmZ1bmN0aW9uKGwscCxtLG4pe2sudGV4dEFsaWduPXA7bnVsbCE9dC5zdHlsZS5mb250JiYoay5mb250PXQuc3R5bGUuZm9udCk7bnVsbCE9dC5zdHlsZS5maWxsJiYoay5maWxsU3R5bGU9dC5zdHlsZS5maWxsLGsuZmlsbFRleHQobCxtLG4pKTtudWxsIT10LnN0eWxlLnN0cm9rZSYmKGsuc3Ryb2tlU3R5bGU9dC5zdHlsZS5maWxsLGsuc3Ryb2tlVGV4dChsLG0sbikpfX19O3JldHVybiBofSgpO2YuQ2FudmFzQ29udGV4dD1kfSxmdW5jdGlvbihkLGYpe3ZhciBoPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaygpe31rLmFwcGVuZD1mdW5jdGlvbih0LGwpe2Zvcih2YXIgcD1bXSxtPTI7bTxhcmd1bWVudHMubGVuZ3RoO20rKylwW20tMl09YXJndW1lbnRzW21dO3A9ay5jcmVhdGUuYXBwbHkoayxbbF0uY29uY2F0KHApKTt0LmFwcGVuZENoaWxkKHApO3JldHVybiBwfTtrLmNyZWF0ZT1mdW5jdGlvbih0KXtmb3IodmFyIGw9CltdLHA9MTtwPGFyZ3VtZW50cy5sZW5ndGg7cCsrKWxbcC0xXT1hcmd1bWVudHNbcF07cD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoay5TVkdfTlMsdCk7ay5hZGRDbGFzc2VzLmFwcGx5KGssW3BdLmNvbmNhdChsKSk7cmV0dXJuIHB9O2suYWRkQ2xhc3Nlcz1mdW5jdGlvbih0KXtmb3IodmFyIGw9W10scD0xO3A8YXJndW1lbnRzLmxlbmd0aDtwKyspbFtwLTFdPWFyZ3VtZW50c1twXTtsPWwuZmlsdGVyKGZ1bmN0aW9uKG0pe3JldHVybiBudWxsIT1tfSk7bnVsbCE9dC5jbGFzc0xpc3Q/bC5mb3JFYWNoKGZ1bmN0aW9uKG0pe3QuY2xhc3NMaXN0LmFkZChtKX0pOnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsbC5qb2luKCIgIikpfTtrLmdldERpbWVuc2lvbnM9ZnVuY3Rpb24odCl7aWYodC5nZXRCQm94KXRyeXt2YXIgbD10LmdldEJCb3goKTtyZXR1cm57d2lkdGg6bC53aWR0aCxoZWlnaHQ6bC5oZWlnaHR9fWNhdGNoKHApe31yZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19O3JldHVybiBrfSgpOwpoLlNWR19OUz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciO2YuU3ZnVXRpbHM9aDtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gayh0LGwscCl7dm9pZCAwPT09cCYmKHA9ITEpO3ZhciBtPXRoaXM7dGhpcy5lbGVtZW50PXQ7dGhpcy5jbGFzc05hbWU9bDt0aGlzLmFkZFRpdGxlRWxlbWVudD1wO3RoaXMuY3JlYXRlUnVsZXI9ZnVuY3Rpb24oKXt2YXIgbj1tLmdldFRleHRFbGVtZW50cyhtLmVsZW1lbnQpLHE9bi5wYXJlbnRFbGVtZW50LHU9bi5jb250YWluZXJFbGVtZW50LHg9bi50ZXh0RWxlbWVudDtyZXR1cm4gZnVuY3Rpb24oQSl7cS5hcHBlbmRDaGlsZCh1KTt4LnRleHRDb250ZW50PUE7QT1oLmdldERpbWVuc2lvbnMoeCk7cS5yZW1vdmVDaGlsZCh1KTtyZXR1cm4gQX19O3RoaXMuY3JlYXRlUGVuPWZ1bmN0aW9uKG4scSx1KXtudWxsPT11JiYodT1tLmVsZW1lbnQpO3U9aC5hcHBlbmQodSwiZyIsInRleHQtY29udGFpbmVyIixtLmNsYXNzTmFtZSk7bS5hZGRUaXRsZUVsZW1lbnQmJgooaC5hcHBlbmQodSwidGl0bGUiKS50ZXh0Q29udGVudD1uLHUuc2V0QXR0cmlidXRlKCJ0aXRsZSIsbikpO249aC5hcHBlbmQodSwiZyIsInRleHQtYXJlYSIpO24uc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitxLnRyYW5zbGF0ZVswXSsiLCIrcS50cmFuc2xhdGVbMV0rIilyb3RhdGUoIisocS5yb3RhdGUrIikiKSk7cmV0dXJuIG0uY3JlYXRlU3ZnTGluZVBlbihuKX19ay5wcm90b3R5cGUuc2V0QWRkVGl0bGVFbGVtZW50PWZ1bmN0aW9uKHQpe3RoaXMuYWRkVGl0bGVFbGVtZW50PXR9O2sucHJvdG90eXBlLmNyZWF0ZVN2Z0xpbmVQZW49ZnVuY3Rpb24odCl7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKGwscCxtLG4pe3ZhciBxPWguYXBwZW5kKHQsInRleHQiLCJ0ZXh0LWxpbmUiKTtxLnRleHRDb250ZW50PWw7cS5zZXRBdHRyaWJ1dGUoInRleHQtYW5jaG9yIixwKTtxLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrbSsiLCIrbisiKSIpO3Euc2V0QXR0cmlidXRlKCJ5IiwKIi0wLjI1ZW0iKX19fTtrLnByb3RvdHlwZS5nZXRUZXh0RWxlbWVudHM9ZnVuY3Rpb24odCl7aWYoInRleHQiPT09dC50YWdOYW1lKXt2YXIgbD10LnBhcmVudEVsZW1lbnQ7bnVsbD09bCYmKGw9dC5wYXJlbnROb2RlKTtsLnJlbW92ZUNoaWxkKHQpO3JldHVybntjb250YWluZXJFbGVtZW50OnQscGFyZW50RWxlbWVudDpsLHRleHRFbGVtZW50OnR9fXZhciBwPXQucXVlcnlTZWxlY3RvcigidGV4dCIpO2lmKG51bGwhPXApcmV0dXJuIGw9dC5wYXJlbnRFbGVtZW50LG51bGw9PWwmJihsPXQucGFyZW50Tm9kZSksbC5yZW1vdmVDaGlsZCh0KSx7Y29udGFpbmVyRWxlbWVudDp0LHBhcmVudEVsZW1lbnQ6bCx0ZXh0RWxlbWVudDpwfTtsPWguY3JlYXRlKCJ0ZXh0Iix0aGlzLmNsYXNzTmFtZSk7cmV0dXJue2NvbnRhaW5lckVsZW1lbnQ6bCxwYXJlbnRFbGVtZW50OnQsdGV4dEVsZW1lbnQ6bH19O3JldHVybiBrfSgpO2YuU3ZnQ29udGV4dD1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9CnRoaXMmJnRoaXMuX19leHRlbmRzfHxmdW5jdGlvbihwLG0pe2Z1bmN0aW9uIG4oKXt0aGlzLmNvbnN0cnVjdG9yPXB9Zm9yKHZhciBxIGluIG0pbS5oYXNPd25Qcm9wZXJ0eShxKSYmKHBbcV09bVtxXSk7cC5wcm90b3R5cGU9bnVsbD09PW0/T2JqZWN0LmNyZWF0ZShtKToobi5wcm90b3R5cGU9bS5wcm90b3R5cGUsbmV3IG4pfSx0PWgoMjEpLGw9aCgzNik7ZD1mdW5jdGlvbihwKXtmdW5jdGlvbiBtKG4pe3ZhciBxPXAuY2FsbCh0aGlzLG4pfHx0aGlzO3EuZGltQ2FjaGU9bmV3IHQuQ2FjaGUoZnVuY3Rpb24odSl7cmV0dXJuIHEuX21lYXN1cmVOb3RGcm9tQ2FjaGUodSl9KTtyZXR1cm4gcX1rKG0scCk7bS5wcm90b3R5cGUuX21lYXN1cmVOb3RGcm9tQ2FjaGU9ZnVuY3Rpb24obil7cmV0dXJuIHAucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLG4pfTttLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKG4pe3ZvaWQgMD09PW4mJihuPWwuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCk7CnJldHVybiB0aGlzLmRpbUNhY2hlLmdldChuKX07bS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmRpbUNhY2hlLmNsZWFyKCk7cC5wcm90b3R5cGUucmVzZXQuY2FsbCh0aGlzKX07cmV0dXJuIG19KGgoNjApLkNhY2hlQ2hhcmFjdGVyTWVhc3VyZXIpO2YuQ2FjaGVNZWFzdXJlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCg1OSksdD1oKDYyKSxsPWgoNjQpLHA9aCg2Nik7ZD1mdW5jdGlvbigpe2Z1bmN0aW9uIG0obil7dGhpcy5jb250ZXh0PW47dGhpcy5tZWFzdXJlcj1uZXcgdC5DYWNoZU1lYXN1cmVyKHRoaXMuY29udGV4dCk7dGhpcy53cmFwcGVyPW5ldyBsLldyYXBwZXI7dGhpcy53cml0ZXI9bmV3IHAuV3JpdGVyKHRoaXMubWVhc3VyZXIsdGhpcy5jb250ZXh0LHRoaXMud3JhcHBlcil9bS5zdmc9ZnVuY3Rpb24obixxLHUpe3JldHVybiBuZXcgbShuZXcgay5TdmdDb250ZXh0KG4scSx1KSl9O20uY2FudmFzPWZ1bmN0aW9uKG4scSx1KXtyZXR1cm4gbmV3IG0obmV3IGsuQ2FudmFzQ29udGV4dChuLApxLHUpKX07bS5wcm90b3R5cGUud3JpdGU9ZnVuY3Rpb24obixxLHUseCxBKXt0aGlzLndyaXRlci53cml0ZShuLHEsdSx4LEEpfTttLnByb3RvdHlwZS5jbGVhck1lYXN1cmVyQ2FjaGU9ZnVuY3Rpb24oKXt0aGlzLm1lYXN1cmVyLnJlc2V0KCl9O3JldHVybiBtfSgpO2YuVHlwZXNldHRlcj1kfSxmdW5jdGlvbihkLGYpe2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBoKGspe3RoaXMuY2FjaGU9e307dGhpcy5jb21wdXRlPWt9aC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKGspe3RoaXMuY2FjaGUuaGFzT3duUHJvcGVydHkoayl8fCh0aGlzLmNhY2hlW2tdPXRoaXMuY29tcHV0ZShrKSk7cmV0dXJuIHRoaXMuY2FjaGVba119O2gucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5jYWNoZT17fTtyZXR1cm4gdGhpc307cmV0dXJuIGh9KCk7Zi5DYWNoZT1kfSxmdW5jdGlvbihkLGYpe2YuTWV0aG9kcz1mdW5jdGlvbigpe2Z1bmN0aW9uIGgoKXt9aC5hcnJheUVxPWZ1bmN0aW9uKGssdCl7aWYobnVsbD09Cmt8fG51bGw9PXQpcmV0dXJuIGs9PT10O2lmKGsubGVuZ3RoIT09dC5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBsPTA7bDxrLmxlbmd0aDtsKyspaWYoa1tsXSE9PXRbbF0pcmV0dXJuITE7cmV0dXJuITB9O2gub2JqRXE9ZnVuY3Rpb24oayx0KXtpZihudWxsPT1rfHxudWxsPT10KXJldHVybiBrPT09dDt2YXIgbD1PYmplY3Qua2V5cyhrKS5zb3J0KCkscD1PYmplY3Qua2V5cyh0KS5zb3J0KCksbT1sLm1hcChmdW5jdGlvbihxKXtyZXR1cm4ga1txXX0pLG49cC5tYXAoZnVuY3Rpb24ocSl7cmV0dXJuIHRbcV19KTtyZXR1cm4gaC5hcnJheUVxKGwscCkmJmguYXJyYXlFcShtLG4pfTtoLnN0cmljdEVxPWZ1bmN0aW9uKGssdCl7cmV0dXJuIGs9PT10fTtoLmRlZmF1bHRzPWZ1bmN0aW9uKGspe2Zvcih2YXIgdD1bXSxsPTE7bDxhcmd1bWVudHMubGVuZ3RoO2wrKyl0W2wtMV09YXJndW1lbnRzW2xdO2lmKG51bGw9PWspdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7CnZhciBwPU9iamVjdChrKTt0LmZvckVhY2goZnVuY3Rpb24obSl7aWYobnVsbCE9bSlmb3IodmFyIG4gaW4gbSlPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobSxuKSYmKHBbbl09bVtuXSl9KTtyZXR1cm4gcH07cmV0dXJuIGh9KCl9LGZ1bmN0aW9uKGQsZil7Zi5TdHJpbmdNZXRob2RzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe31oLmNvbWJpbmVXaGl0ZXNwYWNlPWZ1bmN0aW9uKGspe3JldHVybiBrLnJlcGxhY2UoL1sgXHRdKy9nLCIgIil9O2guaXNOb3RFbXB0eVN0cmluZz1mdW5jdGlvbihrKXtyZXR1cm4gayYmIiIhPT1rLnRyaW0oKX07aC50cmltU3RhcnQ9ZnVuY3Rpb24oayx0KXtpZighaylyZXR1cm4gaztrPWsuc3BsaXQoIiIpO3ZhciBsPXQ/ZnVuY3Rpb24ocCl7cmV0dXJuIHAuc3BsaXQodCkuc29tZShoLmlzTm90RW1wdHlTdHJpbmcpfTpoLmlzTm90RW1wdHlTdHJpbmc7cmV0dXJuIGsucmVkdWNlKGZ1bmN0aW9uKHAsbSl7cmV0dXJuIGwocCttKT8KcCttOnB9LCIiKX07aC50cmltRW5kPWZ1bmN0aW9uKGssdCl7aWYoIWspcmV0dXJuIGs7az1rLnNwbGl0KCIiKTtrLnJldmVyc2UoKTtrPWgudHJpbVN0YXJ0KGsuam9pbigiIiksdCkuc3BsaXQoIiIpO2sucmV2ZXJzZSgpO3JldHVybiBrLmpvaW4oIiIpfTtyZXR1cm4gaH0oKX0sZnVuY3Rpb24oZCxmKXtkPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gaCgpe3RoaXMuV29yZERpdmlkZXJSZWdFeHA9L1xXLzt0aGlzLldoaXRlc3BhY2VSZWdFeHA9L1xzL31oLnByb3RvdHlwZS50b2tlbml6ZT1mdW5jdGlvbihrKXt2YXIgdD10aGlzO3JldHVybiBrLnNwbGl0KCIiKS5yZWR1Y2UoZnVuY3Rpb24obCxwKXtyZXR1cm4gbC5zbGljZSgwLC0xKS5jb25jYXQodC5zaG91bGRDcmVhdGVOZXdUb2tlbihsW2wubGVuZ3RoLTFdLHApKX0sWyIiXSl9O2gucHJvdG90eXBlLnNob3VsZENyZWF0ZU5ld1Rva2VuPWZ1bmN0aW9uKGssdCl7aWYoIWspcmV0dXJuW3RdO3ZhciBsPWtbay5sZW5ndGgtMV07cmV0dXJuIHRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KGwpJiYKdGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3QodCk/W2srdF06dGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3QobCl8fHRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KHQpP1trLHRdOnRoaXMuV29yZERpdmlkZXJSZWdFeHAudGVzdChsKXx8dGhpcy5Xb3JkRGl2aWRlclJlZ0V4cC50ZXN0KHQpP2w9PT10P1trK3RdOltrLHRdOltrK3RdfTtyZXR1cm4gaH0oKTtmLlRva2VuaXplcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9dGhpcyYmdGhpcy5fX2V4dGVuZHN8fGZ1bmN0aW9uKHQsbCl7ZnVuY3Rpb24gcCgpe3RoaXMuY29uc3RydWN0b3I9dH1mb3IodmFyIG0gaW4gbClsLmhhc093blByb3BlcnR5KG0pJiYodFttXT1sW21dKTt0LnByb3RvdHlwZT1udWxsPT09bD9PYmplY3QuY3JlYXRlKGwpOihwLnByb3RvdHlwZT1sLnByb3RvdHlwZSxuZXcgcCl9O2Q9ZnVuY3Rpb24odCl7ZnVuY3Rpb24gbCgpe3JldHVybiB0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpc31rKGwsdCk7bC5wcm90b3R5cGUud3JhcD0KZnVuY3Rpb24ocCxtLG4scSl7ZnVuY3Rpb24gdShEKXtyZXR1cm4gdC5wcm90b3R5cGUud3JhcC5jYWxsKHgscCxtLEQscSl9dmFyIHg9dGhpczt2b2lkIDA9PT1xJiYocT1JbmZpbml0eSk7aWYoMTxwLnNwbGl0KCJcbiIpLmxlbmd0aCl0aHJvdyBFcnJvcigiU2luZ2xlTGluZVdyYXBwZXIgaXMgZGVzaWduZWQgdG8gd29yayBvbmx5IG9uIHNpbmdsZSBsaW5lIik7dmFyIEE9dShuKTtpZigyPkEubm9MaW5lcylyZXR1cm4gQTtmb3IodmFyIHk9MCx3PTA7dzxsLk5PX1dSQVBfSVRFUkFUSU9OUyYmbj55Oysrdyl7dmFyIEM9KG4reSkvMixHPXUoQyk7dGhpcy5hcmVTYW1lUmVzdWx0cyhBLEcpPyhuPUMsQT1HKTp5PUN9cmV0dXJuIEF9O2wucHJvdG90eXBlLmFyZVNhbWVSZXN1bHRzPWZ1bmN0aW9uKHAsbSl7cmV0dXJuIHAubm9MaW5lcz09PW0ubm9MaW5lcyYmcC50cnVuY2F0ZWRUZXh0PT09bS50cnVuY2F0ZWRUZXh0fTtyZXR1cm4gbH0oaCg2NSkuV3JhcHBlcik7ZC5OT19XUkFQX0lURVJBVElPTlM9CjU7Zi5TaW5nbGVMaW5lV3JhcHBlcj1kfSxmdW5jdGlvbihkLGYsaCl7dmFyIGs9aCgyMSksdD17dGV4dFJvdGF0aW9uOjAsdGV4dFNoZWFyOjAseEFsaWduOiJsZWZ0Iix5QWxpZ246InRvcCJ9O2Q9ZnVuY3Rpb24oKXtmdW5jdGlvbiBsKHAsbSxuKXt0aGlzLl9tZWFzdXJlcj1wO3RoaXMuX3BlbkZhY3Rvcnk9bTt0aGlzLl93cmFwcGVyPW59bC5wcm90b3R5cGUubWVhc3VyZXI9ZnVuY3Rpb24ocCl7dGhpcy5fbWVhc3VyZXI9cDtyZXR1cm4gdGhpc307bC5wcm90b3R5cGUud3JhcHBlcj1mdW5jdGlvbihwKXt0aGlzLl93cmFwcGVyPXA7cmV0dXJuIHRoaXN9O2wucHJvdG90eXBlLnBlbkZhY3Rvcnk9ZnVuY3Rpb24ocCl7dGhpcy5fcGVuRmFjdG9yeT1wO3JldHVybiB0aGlzfTtsLnByb3RvdHlwZS53cml0ZT1mdW5jdGlvbihwLG0sbixxLHUpe3ZvaWQgMD09PXEmJihxPXt9KTtxPWsuTWV0aG9kcy5kZWZhdWx0cyh7fSx0LHEpO2lmKC0xPT09bC5TdXBwb3J0ZWRSb3RhdGlvbi5pbmRleE9mKHEudGV4dFJvdGF0aW9uKSl0aHJvdyBFcnJvcigidW5zdXBwb3J0ZWQgcm90YXRpb24gLSAiKwpxLnRleHRSb3RhdGlvbisiLiBTdXBwb3J0ZWQgcm90YXRpb25zIGFyZSAiK2wuU3VwcG9ydGVkUm90YXRpb24uam9pbigiLCAiKSk7aWYobnVsbCE9cS50ZXh0U2hlYXImJi04MD5xLnRleHRTaGVhcnx8ODA8cS50ZXh0U2hlYXIpdGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHNoZWFyIGFuZ2xlIC0gIitxLnRleHRTaGVhcisiLiBNdXN0IGJlIGJldHdlZW4gLTgwIGFuZCA4MCIpO3ZhciB4PTQ1PE1hdGguYWJzKE1hdGguYWJzKHEudGV4dFJvdGF0aW9uKS05MCksQT14P206bix5PXg/bjptLHc9cS50ZXh0U2hlYXIsQz13Kk1hdGguUEkvMTgwO3g9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDt2YXIgRz14Kk1hdGgudGFuKEMpO0E9QS9NYXRoLmNvcyhDKS1NYXRoLmFicyhHKTt2YXIgRD15Kk1hdGguY29zKEMpO3k9ay5TdHJpbmdNZXRob2RzLmNvbWJpbmVXaGl0ZXNwYWNlKHApO3k9KHRoaXMuX3dyYXBwZXI/dGhpcy5fd3JhcHBlci53cmFwKHksdGhpcy5fbWVhc3VyZXIsCkEsRCkud3JhcHBlZFRleHQ6eSkuc3BsaXQoIlxuIik7Qz1sLlhPZmZzZXRGYWN0b3JbcS54QWxpZ25dKkEqTWF0aC5zaW4oQyktbC5ZT2Zmc2V0RmFjdG9yW3EueUFsaWduXSooRC15Lmxlbmd0aCp4KTt3PXEudGV4dFJvdGF0aW9uK3c7c3dpdGNoKHEudGV4dFJvdGF0aW9uKXtjYXNlIDkwOm09W20rQywwXTticmVhaztjYXNlIC05MDptPVstQyxuXTticmVhaztjYXNlIDE4MDptPVttLG4rQ107YnJlYWs7ZGVmYXVsdDptPVswLC1DXX1wPXRoaXMuX3BlbkZhY3RvcnkuY3JlYXRlUGVuKHAse3RyYW5zbGF0ZTptLHJvdGF0ZTp3fSx1KTt0aGlzLndyaXRlTGluZXMoeSxwLEEseCxHLHEueEFsaWduKTtudWxsIT1wLmRlc3Ryb3kmJnAuZGVzdHJveSgpfTtsLnByb3RvdHlwZS53cml0ZUxpbmVzPWZ1bmN0aW9uKHAsbSxuLHEsdSx4KXtwLmZvckVhY2goZnVuY3Rpb24oQSx5KXttLndyaXRlKEEsbC5BbmNob3JDb252ZXJ0ZXJbeF0sKDA8dT8oeSsxKSp1OnkqdSkrbipsLlhPZmZzZXRGYWN0b3JbeF0sCih5KzEpKnEpfSl9O3JldHVybiBsfSgpO2QuU3VwcG9ydGVkUm90YXRpb249Wy05MCwwLDE4MCw5MF07ZC5BbmNob3JDb252ZXJ0ZXI9e2NlbnRlcjoibWlkZGxlIixsZWZ0OiJzdGFydCIscmlnaHQ6ImVuZCJ9O2QuWE9mZnNldEZhY3Rvcj17Y2VudGVyOi41LGxlZnQ6MCxyaWdodDoxfTtkLllPZmZzZXRGYWN0b3I9e2JvdHRvbToxLGNlbnRlcjouNSx0b3A6MH07Zi5Xcml0ZXI9ZH0sZnVuY3Rpb24oZCxmLGgpe2Z1bmN0aW9uIGsodCl7Zm9yKHZhciBsIGluIHQpZi5oYXNPd25Qcm9wZXJ0eShsKXx8KGZbbF09dFtsXSl9aCg2OSk7ZD1oKDcpO2YuQW5pbWF0b3JzPWQ7ZD1oKDY3KTtmLkF4ZXM9ZDtkPWgoMzcpO2YuQ29tcG9uZW50cz1kO2Q9aCgyMyk7Zi5Db25maWdzPWQ7ZD1oKDgpO2YuRm9ybWF0dGVycz1kO2Q9aCgzMCk7Zi5SZW5kZXJDb250cm9sbGVyPWQ7ZD1oKDM5KTtmLlJlbmRlclBvbGljaWVzPWQ7ZD1oKDMxKTtmLlN5bWJvbEZhY3Rvcmllcz1kO2Q9aCgxMyk7Zi5EaXNwYXRjaGVycz0KZDtkPWgoMTQpO2YuRHJhd2Vycz1kO2Q9aCgyNSk7Zi5JbnRlcmFjdGlvbnM9ZDtkPWgoMTkpO2YuUGxvdHM9ZDtkPWgoMyk7Zi5TY2FsZXM9ZDtkPWgoMCk7Zi5VdGlscz1kO2soaCgyMikpO2Q9aCgyOCk7Zi5UaW1lSW50ZXJ2YWw9ZC5UaW1lSW50ZXJ2YWw7ayhoKDQpKTtrKGgoMjkpKTtrKGgoMzgpKTtkPWgoNjgpO2YudmVyc2lvbj1kLnZlcnNpb247ayhoKDI0KSk7ayhoKDYpKTtrKGgoMTUpKTtrKGgoNDApKTtrKGgoMTYpKTtrKGgoMikpO2soaCgxMSkpO2soaCgxNykpfV0pfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotY2hhcnQtaGVscGVycy9wbG90dGFibGUtaW50ZXJhY3Rpb25zLmpzCnZhciByZzsKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQobSl7Y29uc3Qgbj1bXTtmb3IoO20mJm0gaW5zdGFuY2VvZiBIVE1MRWxlbWVudDspaWYobi5wdXNoKG0pLG0uYXNzaWduZWRTbG90KW09bS5hc3NpZ25lZFNsb3Q7ZWxzZSBpZihtLnBhcmVudEVsZW1lbnQpbT1tLnBhcmVudEVsZW1lbnQ7ZWxzZXtjb25zdCBxPW0ucGFyZW50Tm9kZTttPXEgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P3EuaG9zdDpxIT09bT9xOm51bGx9cmV0dXJuIG59ZnVuY3Rpb24gZihtKXt2YXIgbj1kKG0pO209aDtsZXQgcT1udWxsO2Zvcihjb25zdCB4IG9mIG4pe249UGxvdHRhYmxlLlV0aWxzLkRPTS5nZXRFbGVtZW50VHJhbnNmb3JtKHgpO2lmKG51bGwhPW4pe3ZhciB1PXguY2xpZW50V2lkdGgvMjtjb25zdCBBPXguY2xpZW50SGVpZ2h0LzI7bT1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShtLFt1LEFdKTttPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5TWF0cml4KG0sUGxvdHRhYmxlLlV0aWxzLk1hdGguaW52ZXJ0TWF0cml4KG4pKTsKbT1QbG90dGFibGUuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShtLFstdSwtQV0pfW49eC5zY3JvbGxMZWZ0O3U9eC5zY3JvbGxUb3A7aWYobnVsbD09PXF8fHg9PT1xKW4tPXgub2Zmc2V0TGVmdCt4LmNsaWVudExlZnQsdS09eC5vZmZzZXRUb3AreC5jbGllbnRUb3AscT14Lm9mZnNldFBhcmVudDttPVBsb3R0YWJsZS5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKG0sW24sdV0pfXJldHVybiBtfWNvbnN0IGg9WzEsMCwwLDEsMCwwXTtjbGFzcyBrIGV4dGVuZHMgUGxvdHRhYmxlLlV0aWxzLlRyYW5zbGF0b3J7Y29tcHV0ZVBvc2l0aW9uKG0sbil7bT17eDptLHk6bn07bj1mKHRoaXMuX3Jvb3RFbGVtZW50KTtyZXR1cm4gbnVsbD09bj9tOlBsb3R0YWJsZS5VdGlscy5NYXRoLmFwcGx5VHJhbnNmb3JtKG4sbSl9fWNsYXNzIHQgZXh0ZW5kcyBQbG90dGFibGUuRGlzcGF0Y2hlcnMuTW91c2V7Y29uc3RydWN0b3IobSl7c3VwZXIobSk7dGhpcy5fZXZlbnRUYXJnZXQ9bS5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCk7CnRoaXMuX3RyYW5zbGF0b3I9bmV3IGsobS5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCkpfXN0YXRpYyBnZXREaXNwYXRjaGVyKG0pe2NvbnN0IG49bS5yb290KCkucm9vdEVsZW1lbnQoKTtsZXQgcT1uW3QuX0RJU1BBVENIRVJfS0VZXTtxfHwocT1uZXcgdChtKSxuW3QuX0RJU1BBVENIRVJfS0VZXT1xKTtyZXR1cm4gcX19Y2xhc3MgbCBleHRlbmRzIFBsb3R0YWJsZS5EaXNwYXRjaGVycy5Ub3VjaHtjb25zdHJ1Y3RvcihtKXtzdXBlcihtKTt0aGlzLl9ldmVudFRhcmdldD1tLnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKTt0aGlzLl90cmFuc2xhdG9yPW5ldyBrKG0ucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpKX1zdGF0aWMgZ2V0RGlzcGF0Y2hlcihtKXtjb25zdCBuPW0ucm9vdCgpLnJvb3RFbGVtZW50KCk7bGV0IHE9bltsLl9ESVNQQVRDSEVSX0tFWV07cXx8KHE9bmV3IGwobSksbltsLl9ESVNQQVRDSEVSX0tFWV09cSk7cmV0dXJuIHF9fVBsb3R0YWJsZS5JbnRlcmFjdGlvbi5wcm90b3R5cGUuX2lzSW5zaWRlQ29tcG9uZW50PQpmdW5jdGlvbihtKXtyZXR1cm4gMDw9bS54JiYwPD1tLnkmJm0ueDx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkmJm0ueTx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpfTtjbGFzcyBwIGV4dGVuZHMgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5Qb2ludGVye19hbmNob3IoKXt0aGlzLl9pc0FuY2hvcmVkPSEwO3RoaXMuX21vdXNlRGlzcGF0Y2hlcj10LmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7dGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTt0aGlzLl90b3VjaERpc3BhdGNoZXI9bC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pO3RoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKX19Yi5Qb2ludGVySW50ZXJhY3Rpb249cH0pKHJnfHwocmc9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1jaGFydC1oZWxwZXJzL3Z6LWNoYXJ0LWhlbHBlcnMuanMKKGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoKXtsZXQgdD1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7dC50aWNrR2VuZXJhdG9yKCk7bGV0IGw9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWModCwiYm90dG9tIik7bC5mb3JtYXR0ZXIoYi5zdGVwRm9ybWF0dGVyKTtyZXR1cm57c2NhbGU6dCxheGlzOmwsYWNjZXNzb3I6cD0+cC5zdGVwfX1mdW5jdGlvbiBmKCl7bGV0IHQ9bmV3IFBsb3R0YWJsZS5TY2FsZXMuVGltZTtyZXR1cm57c2NhbGU6dCxheGlzOm5ldyBQbG90dGFibGUuQXhlcy5UaW1lKHQsImJvdHRvbSIpLGFjY2Vzc29yOmw9Pmwud2FsbF90aW1lfX1mdW5jdGlvbiBoKCl7bGV0IHQ9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3JldHVybntzY2FsZTp0LGF4aXM6bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWModCwiYm90dG9tIiksYWNjZXNzb3I6Yi5yZWxhdGl2ZUFjY2Vzc29yfX1iLlNZTUJPTFNfTElTVD1be2NoYXJhY3RlcjoiXHUyNWZjIixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5zcXVhcmV9LAp7Y2hhcmFjdGVyOiJcdTI1YzYiLG1ldGhvZDpQbG90dGFibGUuU3ltYm9sRmFjdG9yaWVzLmRpYW1vbmR9LHtjaGFyYWN0ZXI6Ilx1MjViMiIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMudHJpYW5nbGV9LHtjaGFyYWN0ZXI6Ilx1MjYwNSIsbWV0aG9kOlBsb3R0YWJsZS5TeW1ib2xGYWN0b3JpZXMuc3Rhcn0se2NoYXJhY3RlcjoiXHUyNzFhIixtZXRob2Q6UGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy5jcm9zc31dO2xldCBrOyhmdW5jdGlvbih0KXt0LlNURVA9InN0ZXAiO3QuUkVMQVRJVkU9InJlbGF0aXZlIjt0LldBTExfVElNRT0id2FsbF90aW1lIn0pKGs9Yi5YVHlwZXx8KGIuWFR5cGU9e30pKTtiLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OPTQ7Yi5TVEVQX0ZPUk1BVFRFUl9QUkVDSVNJT049NDtiLllfQVhJU19GT1JNQVRURVJfUFJFQ0lTSU9OPTM7Yi5UT09MVElQX1lfUElYRUxfT0ZGU0VUPTIwO2IuVE9PTFRJUF9DSVJDTEVfU0laRT00O2IuTkFOX1NZTUJPTF9TSVpFPQo2O2IubXVsdGlzY2FsZUZvcm1hdHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbD0+e2xldCBwPU1hdGguYWJzKGwpOzFFLTE1PnAmJihwPTApO3JldHVybigxRTQ8PXA/ZDMuZm9ybWF0KCIuIit0KyJ+ZSIpOjA8cCYmLjAxPnA/ZDMuZm9ybWF0KCIuIit0KyJ+ZSIpOmQzLmZvcm1hdCgiLiIrdCsifmciKSkobCl9fTtiLmNvbXB1dGVEb21haW49ZnVuY3Rpb24odCxsKXt0PXQuZmlsdGVyKG49PmlzRmluaXRlKG4pKTtpZigwPT09dC5sZW5ndGgpcmV0dXJuWy0uMSwxLjFdO2w/KHQ9Xy5zb3J0QnkodCksbD1kMy5xdWFudGlsZSh0LC4wNSksdD1kMy5xdWFudGlsZSh0LC45NSkpOihsPWQzLm1pbih0KSx0PWQzLm1heCh0KSk7bGV0IHAsbT10LWw7cD0wPT09bT8xLjEqTWF0aC5hYnMobCkrMS4xOi4yKm07bD1bMDw9bCYmbDxtPy0uMSp0OmwtcCx0K3BdO3JldHVybiBsPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGwpLm5pY2UoKS5kb21haW4oKX07Yi5hY2Nlc3Nvcml6ZT1mdW5jdGlvbih0KXtyZXR1cm4gbD0+CmxbdF19O2Iuc3RlcEZvcm1hdHRlcj1kMy5mb3JtYXQoYC4ke2IuU1RFUF9GT1JNQVRURVJfUFJFQ0lTSU9OfX5zYCk7Yi5zdGVwWD1kO2IudGltZUZvcm1hdHRlcj1QbG90dGFibGUuRm9ybWF0dGVycy50aW1lKCIlYSAlYiAlZSwgJUg6JU06JVMiKTtiLndhbGxYPWY7Yi5yZWxhdGl2ZUFjY2Vzc29yPSh0LGwscCk9PntpZihudWxsIT10LnJlbGF0aXZlKXJldHVybiB0LnJlbGF0aXZlO2w9cC5kYXRhKCk7cmV0dXJuKCt0LndhbGxfdGltZS0oMDxsLmxlbmd0aD8rbFswXS53YWxsX3RpbWU6MCkpLzM2RTV9O2IucmVsYXRpdmVGb3JtYXR0ZXI9dD0+e2xldCBsPSIiLHA9TWF0aC5mbG9vcih0LzI0KTt0LT0yNCpwO3AmJihsKz1wKyJkICIpO2xldCBtPU1hdGguZmxvb3IodCk7dD02MCoodC1tKTtpZihtfHxwKWwrPW0rImggIjtsZXQgbj1NYXRoLmZsb29yKHQpO3Q9NjAqKHQtbik7aWYobnx8bXx8cClsKz1uKyJtICI7cmV0dXJuIGwrTWF0aC5mbG9vcih0KSsicyJ9O2IucmVsYXRpdmVYPQpoO2IuZ2V0WENvbXBvbmVudHM9ZnVuY3Rpb24odCl7c3dpdGNoKHQpe2Nhc2Ugay5TVEVQOnJldHVybiBkKCk7Y2FzZSBrLldBTExfVElNRTpyZXR1cm4gZigpO2Nhc2Ugay5SRUxBVElWRTpyZXR1cm4gaCgpO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImludmFsaWQgeFR5cGU6ICIrdCk7fX19KShyZ3x8KHJnPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotY2hhcnQtaGVscGVycy92ei1jaGFydC10b29sdGlwLmpzCnZhciBFaDsKKGZ1bmN0aW9uKGIpe2xldCBkOyhmdW5jdGlvbihoKXtoLkFVVE89ImF1dG8iO2guQk9UVE9NPSJib3R0b20iO2guUklHSFQ9InJpZ2h0In0pKGQ9Yi5Ub29sdGlwUG9zaXRpb258fChiLlRvb2x0aXBQb3NpdGlvbj17fSkpO2NvbnN0IGY9e2JveFNoYWRvdzoiMCAxcHggNHB4IHJnYmEoMCwgMCwgMCwgLjMpIixvcGFjaXR5OjAscG9zaXRpb246ImZpeGVkIix3aWxsQ2hhbmdlOiJ0cmFuc2Zvcm0iLHpJbmRleDo1fTtQb2x5bWVyKHtpczoidnotY2hhcnQtdG9vbHRpcCIsX3RlbXBsYXRlOm51bGwscHJvcGVydGllczp7Y29udGVudENvbXBvbmVudE5hbWU6U3RyaW5nLHBvc2l0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZTpkLkFVVE99LG1pbkRpc3RGcm9tRWRnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MTV9fSxyZWFkeSgpe3RoaXMuX3R1bm5lbD10aGlzLl9yYWY9dGhpcy5fc3R5bGVDYWNoZT1udWxsfSxhdHRhY2hlZCgpe3RoaXMuX3R1bm5lbD10aGlzLl9jcmVhdGVUdW5uZWwoKTt0aGlzLl9oaWRlT25CbHVyPQooKT0+e2RvY3VtZW50LmhpZGRlbiYmdGhpcy5oaWRlKCl9O3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9oaWRlT25CbHVyKX0sZGV0YWNoZWQoKXt0aGlzLmhpZGUoKTt0aGlzLl9yZW1vdmVUdW5uZWwodGhpcy5fdHVubmVsKTt0aGlzLl90dW5uZWw9bnVsbDt3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidmlzaWJpbGl0eWNoYW5nZSIsdGhpcy5faGlkZU9uQmx1cil9LGNvbnRlbnQoKXtyZXR1cm4gdGhpcy5fdHVubmVsLnNoYWRvd1Jvb3R9LGhpZGUoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmFmKTt0aGlzLl9zdHlsZUNhY2hlPW51bGw7dGhpcy5fdHVubmVsLnN0eWxlLm9wYWNpdHk9MH0sdXBkYXRlQW5kUG9zaXRpb24oaCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JhZik7dGhpcy5fcmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX3JlcG9zaXRpb25JbXBsKGgpfSl9LApfcmVwb3NpdGlvbkltcGwoaCl7Y29uc3Qgaz10aGlzLl90dW5uZWw7aD1oLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2NvbnN0IHQ9ay5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxsPXdpbmRvdy5pbm5lckhlaWdodCxwPWRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsbT1oLnRvcCxuPW0raC5oZWlnaHQscT10LmhlaWdodCtyZy5UT09MVElQX1lfUElYRUxfT0ZGU0VUO2xldCB1PW51bGwseD1NYXRoLm1heCh0aGlzLm1pbkRpc3RGcm9tRWRnZSxoLmxlZnQpLEE9bnVsbCx5PW07dGhpcy5wb3NpdGlvbj09ZC5SSUdIVD94PWgucmlnaHQ6KHk9bityZy5UT09MVElQX1lfUElYRUxfT0ZGU0VULHA8eCt0LndpZHRoK3RoaXMubWluRGlzdEZyb21FZGdlJiYoeD1udWxsLEE9dGhpcy5taW5EaXN0RnJvbUVkZ2UpKTt0aGlzLnBvc2l0aW9uPT1kLkFVVE8mJjA8aC50b3AtcSYmbDxoLnRvcCtoLmhlaWdodCtxJiYoeT1udWxsLHU9bC1tK3JnLlRPT0xUSVBfWV9QSVhFTF9PRkZTRVQpO2g9e29wYWNpdHk6MSwKbGVmdDp4P2Ake3h9cHhgOm51bGwscmlnaHQ6QT9gJHtBfXB4YDpudWxsLHRvcDp5P2Ake3l9cHhgOm51bGwsYm90dG9tOnU/YCR7dX1weGA6bnVsbH07Xy5pc0VxdWFsKHRoaXMuX3N0eWxlQ2FjaGUsaCl8fChPYmplY3QuYXNzaWduKGsuc3R5bGUsaCksdGhpcy5fc3R5bGVDYWNoZT1oKX0sX2NyZWF0ZVR1bm5lbCgpe2lmKCF0aGlzLmNvbnRlbnRDb21wb25lbnROYW1lKXRocm93IG5ldyBSYW5nZUVycm9yKCJSZXF1aXJlIGBjb250ZW50Q29tcG9uZW50TmFtZWAgdG8gYmUgYSBuYW1lIG9mIGEgUG9seW1lciBjb21wb25lbnQiKTtjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5jb250ZW50Q29tcG9uZW50TmFtZSk7T2JqZWN0LmFzc2lnbihoLnN0eWxlLGYpO2RvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoaCk7cmV0dXJuIGh9LF9yZW1vdmVUdW5uZWwoaCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChoKX19KX0pKEVofHwoRWg9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92ei1saW5lLWNoYXJ0L2RyYWdab29tSW50ZXJhY3Rpb24uanMKdmFyIEZoOwooZnVuY3Rpb24oYil7Y2xhc3MgZCBleHRlbmRzIFBsb3R0YWJsZS5Db21wb25lbnRzLlNlbGVjdGlvbkJveExheWVye2NvbnN0cnVjdG9yKGYsaCxrKXtzdXBlcigpO3RoaXMuZWFzZUZuPWQzLmVhc2VDdWJpY0luT3V0O3RoaXMuX2FuaW1hdGlvblRpbWU9NzUwO3RoaXMueFNjYWxlKGYpO3RoaXMueVNjYWxlKGgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbj1uZXcgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5EcmFnO3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb249bmV3IFBsb3R0YWJsZS5JbnRlcmFjdGlvbnMuQ2xpY2s7dGhpcy5zZXR1cENhbGxiYWNrcygpO3RoaXMudW56b29tTWV0aG9kPWs7dGhpcy5vbkRldGFjaCgoKT0+e3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSgpO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2hGcm9tKCl9KTt0aGlzLm9uQW5jaG9yKCgpPT57dGhpcy5fZG91YmxlQ2xpY2tJbnRlcmFjdGlvbi5hdHRhY2hUbyh0aGlzKTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uYXR0YWNoVG8odGhpcyl9KX1pbnRlcmFjdGlvblN0YXJ0KGYpe3RoaXMub25TdGFydD0KZn1pbnRlcmFjdGlvbkVuZChmKXt0aGlzLm9uRW5kPWZ9ZHJhZ0ludGVyYWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdJbnRlcmFjdGlvbn1zZXR1cENhbGxiYWNrcygpe2xldCBmPSExO3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdTdGFydChoPT57dGhpcy5ib3VuZHMoe3RvcExlZnQ6aCxib3R0b21SaWdodDpofSk7dGhpcy5vblN0YXJ0KCl9KTt0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnKChoLGspPT57dGhpcy5ib3VuZHMoe3RvcExlZnQ6aCxib3R0b21SaWdodDprfSk7dGhpcy5ib3hWaXNpYmxlKCEwKTtmPSEwfSk7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZCgoaCxrKT0+e3RoaXMuYm94VmlzaWJsZSghMSk7dGhpcy5ib3VuZHMoe3RvcExlZnQ6aCxib3R0b21SaWdodDprfSk7aWYoZil0aGlzLnpvb20oKTtlbHNlIHRoaXMub25FbmQoKTtmPSExfSk7dGhpcy5fZG91YmxlQ2xpY2tJbnRlcmFjdGlvbi5vbkRvdWJsZUNsaWNrKHRoaXMudW56b29tLmJpbmQodGhpcykpfWFuaW1hdGlvblRpbWUoZil7aWYobnVsbD09CmYpcmV0dXJuIHRoaXMuX2FuaW1hdGlvblRpbWU7aWYoMD5mKXRocm93IEVycm9yKCJhbmltYXRpb25UaW1lIGNhbm5vdCBiZSBuZWdhdGl2ZSIpO3RoaXMuX2FuaW1hdGlvblRpbWU9ZjtyZXR1cm4gdGhpc31lYXNlKGYpe2lmKCJmdW5jdGlvbiIhPT10eXBlb2YgZil0aHJvdyBFcnJvcigiZWFzZSBmdW5jdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24iKTswPT09ZigwKSYmMT09PWYoMSl8fFBsb3R0YWJsZS5VdGlscy5XaW5kb3cud2FybigiRWFzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IG1haW50YWluIGludmFyaWFudCBmKDApXHgzZFx4M2QwIFx4MjZceDI2IGYoMSlceDNkXHgzZDEuIEJhZCBiZWhhdmlvciBtYXkgcmVzdWx0LiIpO3RoaXMuZWFzZUZuPWY7cmV0dXJuIHRoaXN9em9vbSgpe2xldCBmPXRoaXMueEV4dGVudCgpWzBdLnZhbHVlT2YoKSxoPXRoaXMueEV4dGVudCgpWzFdLnZhbHVlT2YoKSxrPXRoaXMueUV4dGVudCgpWzFdLnZhbHVlT2YoKSx0PXRoaXMueUV4dGVudCgpWzBdLnZhbHVlT2YoKTsKZiE9PWgmJmshPT10JiZ0aGlzLmludGVycG9sYXRlWm9vbShmLGgsayx0KX11bnpvb20oKXt2YXIgZj10aGlzLnhTY2FsZSgpO2YuX2RvbWFpbk1pbj1udWxsO2YuX2RvbWFpbk1heD1udWxsO2Y9Zi5fZ2V0RXh0ZW50KCk7dGhpcy54U2NhbGUoKS5kb21haW4oZik7dGhpcy51bnpvb21NZXRob2QoKX1pc1pvb21pbmcoZil7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQoIWYpO3RoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uZW5hYmxlZCghZil9aW50ZXJwb2xhdGVab29tKGYsaCxrLHQpe2xldCBsPXRoaXMueFNjYWxlKCkuZG9tYWluKClbMF0udmFsdWVPZigpLHA9dGhpcy54U2NhbGUoKS5kb21haW4oKVsxXS52YWx1ZU9mKCksbT10aGlzLnlTY2FsZSgpLmRvbWFpbigpWzBdLnZhbHVlT2YoKSxuPXRoaXMueVNjYWxlKCkuZG9tYWluKClbMV0udmFsdWVPZigpLHE9dGhpcy5lYXNlRm4sdT0oeSx3LEMpPT5kMy5pbnRlcnBvbGF0ZU51bWJlcih5LHcpKHEoQykpO3RoaXMuaXNab29taW5nKCEwKTsKbGV0IHg9RGF0ZS5ub3coKSxBPSgpPT57dmFyIHk9RGF0ZS5ub3coKS14O3k9MD09PXRoaXMuX2FuaW1hdGlvblRpbWU/MTpNYXRoLm1pbigxLHkvdGhpcy5fYW5pbWF0aW9uVGltZSk7bGV0IHc9dShsLGYseSksQz11KHAsaCx5KSxHPXUobSxrLHkpLEQ9dShuLHQseSk7dGhpcy54U2NhbGUoKS5kb21haW4oW3csQ10pO3RoaXMueVNjYWxlKCkuZG9tYWluKFtHLERdKTsxPnk/UGxvdHRhYmxlLlV0aWxzLkRPTS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbChBKToodGhpcy5vbkVuZCgpLHRoaXMuaXNab29taW5nKCExKSl9O0EoKX19Yi5EcmFnWm9vbUxheWVyPWR9KShGaHx8KEZoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvcGFuWm9vbURyYWdMYXllci5qcwp2YXIgR2g7CihmdW5jdGlvbihiKXtsZXQgZDsoZnVuY3Rpb24oaCl7aFtoLk5PTkU9MF09Ik5PTkUiO2hbaC5EUkFHX1pPT01JTkc9MV09IkRSQUdfWk9PTUlORyI7aFtoLlBBTk5JTkc9Ml09IlBBTk5JTkcifSkoZHx8KGQ9e30pKTtjbGFzcyBmIGV4dGVuZHMgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXB7Y29uc3RydWN0b3IoaCxrLHQpe3N1cGVyKCk7dGhpcy5zdGF0ZT1kLk5PTkU7dGhpcy5wYW5TdGFydENhbGxiYWNrPW5ldyBQbG90dGFibGUuVXRpbHMuQ2FsbGJhY2tTZXQ7dGhpcy5wYW5FbmRDYWxsYmFjaz1uZXcgUGxvdHRhYmxlLlV0aWxzLkNhbGxiYWNrU2V0O3RoaXMucGFuWm9vbT1uZXcgUGxvdHRhYmxlLkludGVyYWN0aW9ucy5QYW5ab29tKGgsayk7dGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm1vdXNlRmlsdGVyKHA9PmYuaXNQYW5LZXkocCkmJjA9PT1wLmJ1dHRvbik7dGhpcy5wYW5ab29tLndoZWVsRmlsdGVyKHRoaXMuY2FuU2Nyb2xsWm9vbSk7dGhpcy5kcmFnWm9vbUxheWVyPW5ldyBGaC5EcmFnWm9vbUxheWVyKGgsCmssdCk7dGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm1vdXNlRmlsdGVyKHA9PiFmLmlzUGFuS2V5KHApJiYwPT09cC5idXR0b24pO3RoaXMuYXBwZW5kKHRoaXMuZHJhZ1pvb21MYXllcik7Y29uc3QgbD10aGlzLm9uV2hlZWwuYmluZCh0aGlzKTt0aGlzLm9uQW5jaG9yKCgpPT57dGhpcy5fbW91c2VEaXNwYXRjaGVyPVBsb3R0YWJsZS5EaXNwYXRjaGVycy5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMpO3RoaXMuX21vdXNlRGlzcGF0Y2hlci5vbldoZWVsKGwpO3RoaXMucGFuWm9vbS5hdHRhY2hUbyh0aGlzKX0pO3RoaXMub25EZXRhY2goKCk9Pnt0aGlzLnBhblpvb20uZGV0YWNoRnJvbSgpO3RoaXMuX21vdXNlRGlzcGF0Y2hlciYmKHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZXaGVlbChsKSx0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbCl9KTt0aGlzLnBhblpvb20uZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnU3RhcnQoKCk9Pnt0aGlzLnN0YXRlPT1kLk5PTkUmJgp0aGlzLnNldFN0YXRlKGQuUEFOTklORyl9KTt0aGlzLnBhblpvb20uZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnRW5kKCgpPT57dGhpcy5zdGF0ZT09ZC5QQU5OSU5HJiZ0aGlzLnNldFN0YXRlKGQuTk9ORSl9KTt0aGlzLmRyYWdab29tTGF5ZXIuZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnU3RhcnQoKCk9Pnt0aGlzLnN0YXRlPT1kLk5PTkUmJnRoaXMuc2V0U3RhdGUoZC5EUkFHX1pPT01JTkcpfSk7dGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ0VuZCgoKT0+e3RoaXMuc3RhdGU9PWQuRFJBR19aT09NSU5HJiZ0aGlzLnNldFN0YXRlKGQuTk9ORSl9KX1vbldoZWVsKGgsayl7aWYoIXRoaXMuY2FuU2Nyb2xsWm9vbShrKSYmKGg9dGhpcy5lbGVtZW50KCksaC5zZWxlY3QoIi5oZWxwIikuZW1wdHkoKSkpe3ZhciB0PWguYXBwZW5kKCJkaXYiKS5jbGFzc2VkKCJoZWxwIiwhMCk7dC5hcHBlbmQoInNwYW4iKS50ZXh0KCJBbHQgKyBTY3JvbGwgdG8gWm9vbSIpOwp0Lm9uKCJhbmltYXRpb25lbmQiLCgpPT52b2lkIHQucmVtb3ZlKCkpfX1zdGF0aWMgaXNQYW5LZXkoaCl7cmV0dXJuISFoLmFsdEtleXx8ISFoLnNoaWZ0S2V5fWNhblNjcm9sbFpvb20oaCl7cmV0dXJuIGguYWx0S2V5fXNldFN0YXRlKGgpe2lmKHRoaXMuc3RhdGUhPWgpe3ZhciBrPXRoaXMuc3RhdGU7dGhpcy5zdGF0ZT1oO3RoaXMucm9vdCgpLnJlbW92ZUNsYXNzKHRoaXMuc3RhdGVDbGFzc05hbWUoaykpO3RoaXMucm9vdCgpLmFkZENsYXNzKHRoaXMuc3RhdGVDbGFzc05hbWUoaCkpO2s9PWQuUEFOTklORyYmdGhpcy5wYW5FbmRDYWxsYmFjay5jYWxsQ2FsbGJhY2tzKCk7aD09ZC5QQU5OSU5HJiZ0aGlzLnBhblN0YXJ0Q2FsbGJhY2suY2FsbENhbGxiYWNrcygpfX1zdGF0ZUNsYXNzTmFtZShoKXtzd2l0Y2goaCl7Y2FzZSBkLlBBTk5JTkc6cmV0dXJuInBhbm5pbmciO2Nhc2UgZC5EUkFHX1pPT01JTkc6cmV0dXJuImRyYWctem9vbWluZyI7ZGVmYXVsdDpyZXR1cm4iIn19b25QYW5TdGFydChoKXt0aGlzLnBhblN0YXJ0Q2FsbGJhY2suYWRkKGgpfW9uUGFuRW5kKGgpe3RoaXMucGFuRW5kQ2FsbGJhY2suYWRkKGgpfW9uU2Nyb2xsWm9vbShoKXt0aGlzLnBhblpvb20ub25ab29tRW5kKGgpfW9uRHJhZ1pvb21TdGFydChoKXt0aGlzLmRyYWdab29tTGF5ZXIuaW50ZXJhY3Rpb25TdGFydChoKX1vbkRyYWdab29tRW5kKGgpe3RoaXMuZHJhZ1pvb21MYXllci5pbnRlcmFjdGlvbkVuZChoKX19CmIuUGFuWm9vbURyYWdMYXllcj1mfSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3RmLXNjYWxlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgUGxvdHRhYmxlLlF1YW50aXRhdGl2ZVNjYWxle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKTt0aGlzLl9pZ25vcmVPdXRsaWVyPSExfXNldFZhbHVlUHJvdmlkZXJGb3JEb21haW4oZil7dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj1mfWlnbm9yZU91dGxpZXIoZil7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZj8odGhpcy5faWdub3JlT3V0bGllcj1mLHRoaXMpOnRoaXMuX2lnbm9yZU91dGxpZXJ9X2dldEFsbEluY2x1ZGVkVmFsdWVzKCl7Y29uc3QgZj10aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluP3RoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4oKTpbXTtyZXR1cm4gdGhpcy5leHRlbnRPZlZhbHVlcyhmKX19Yi5UZlNjYWxlPWR9KShHaHx8KEdoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvbGluZWFyLXNjYWxlLmpzCihmdW5jdGlvbihiKXtjbGFzcyBkIGV4dGVuZHMgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXJ7Y29uc3RydWN0b3IoKXtzdXBlcigpO3RoaXMuX2lnbm9yZU91dGxpZXI9ITE7dGhpcy5wYWRQcm9wb3J0aW9uKC4yKX1zZXRWYWx1ZVByb3ZpZGVyRm9yRG9tYWluKGYpe3RoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW49Zn1fbmljZURvbWFpbihmLGgpe2NvbnN0IFtrLHRdPWYsbD10LWs7Zj0wPT09bD8xLjEqTWF0aC5hYnMoaykrMS4xOmwqdGhpcy5wYWRQcm9wb3J0aW9uKCk7cmV0dXJuIHN1cGVyLl9uaWNlRG9tYWluKFswPD1rJiZrPGw/LS4xKnQ6ay1mLHQrZl0saCl9X2dldFVuYm91bmRlZEV4dGVudChmKXtmPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKGYpO2xldCBoPXRoaXMuX2RlZmF1bHRFeHRlbnQoKTswIT09Zi5sZW5ndGgmJihmPVtQbG90dGFibGUuVXRpbHMuTWF0aC5taW4oZixoWzBdKSxQbG90dGFibGUuVXRpbHMuTWF0aC5tYXgoZixoWzFdKV0saD10aGlzLl9uaWNlRG9tYWluKGYpKTsKcmV0dXJuIGh9X2dldEFsbEluY2x1ZGVkVmFsdWVzKCl7Y29uc3QgZj10aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluP3RoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4oKTpbXTtyZXR1cm4gdGhpcy5leHRlbnRPZlZhbHVlcyhmKX1leHRlbnRPZlZhbHVlcyhmKXt2YXIgaD1mPWYuZmlsdGVyKGs9PlBsb3R0YWJsZS5VdGlscy5NYXRoLmlzVmFsaWROdW1iZXIoaykpO2lmKHRoaXMuaWdub3JlT3V0bGllcigpKXtoPWYuc29ydCgobCxwKT0+bC1wKTtjb25zdCBrPWQzLnF1YW50aWxlKGgsLjA1KSx0PWQzLnF1YW50aWxlKGgsLjk1KTtoPWYuZmlsdGVyKGw9Pmw+PWsmJmw8PXQpfWY9ZDMuZXh0ZW50KGgpO3JldHVybiBudWxsPT1mWzBdfHxudWxsPT1mWzFdP1tdOmZ9aWdub3JlT3V0bGllcihmKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBmPyh0aGlzLl9pZ25vcmVPdXRsaWVyPWYsdGhpcyk6dGhpcy5faWdub3JlT3V0bGllcn19Yi5MaW5lYXJTY2FsZT1kfSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL2xvZy1zY2FsZS5qcwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChrKXtyZXR1cm4gTWF0aC5sb2cxMChrKX1mdW5jdGlvbiBmKGspe3JldHVybiBNYXRoLnBvdygxMCxrKX1iLk1JTl9QT1NJVElWRV9WQUxVRT1NYXRoLnBvdygyLC0xMDc0KTtjbGFzcyBoIGV4dGVuZHMgYi5UZlNjYWxle2NvbnN0cnVjdG9yKCl7c3VwZXIoKTt0aGlzLl9kM0xvZ1NjYWxlPWQzLnNjYWxlTG9nKCk7dGhpcy5wYWRQcm9wb3J0aW9uKC4yKX1zY2FsZShrKXtyZXR1cm4gMD49az9OYU46dGhpcy5fZDNMb2dTY2FsZShrKX1pbnZlcnQoayl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUuaW52ZXJ0KGspfXNjYWxlVHJhbnNmb3JtYXRpb24oayl7cmV0dXJuIHRoaXMuc2NhbGUoayl9aW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbihrKXtyZXR1cm4gdGhpcy5pbnZlcnQoayl9Z2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKXtyZXR1cm4gdGhpcy5kb21haW4oKX1fZ2V0RG9tYWluKCl7cmV0dXJuIHRoaXMuX3VudHJhbnNmb3JtZWREb21haW59X3NldERvbWFpbihrKXt0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluPQprO2NvbnN0IFt0LGxdPWs7c3VwZXIuX3NldERvbWFpbihbTWF0aC5tYXgoYi5NSU5fUE9TSVRJVkVfVkFMVUUsdCksbF0pfV9uaWNlRG9tYWluKGspe2NvbnN0IFt0LGxdPWs7az1NYXRoLm1heChkKGIuTUlOX1BPU0lUSVZFX1ZBTFVFKSxkKHQpKTtjb25zdCBwPWQobCk7dmFyIG09cC1rO209bT9tKnRoaXMucGFkUHJvcG9ydGlvbigpOjE7cmV0dXJuW2YoTWF0aC5tYXgoZChiLk1JTl9QT1NJVElWRV9WQUxVRSksay1tKSksZihwK20pXX1fZ2V0VW5ib3VuZGVkRXh0ZW50KGspe2s9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoayk7bGV0IHQ9dGhpcy5fZGVmYXVsdEV4dGVudCgpOzAhPT1rLmxlbmd0aCYmKGs9W1Bsb3R0YWJsZS5VdGlscy5NYXRoLm1pbihrLHRbMF0pLFBsb3R0YWJsZS5VdGlscy5NYXRoLm1heChrLHRbMV0pXSx0PXRoaXMuX25pY2VEb21haW4oaykpO3JldHVybiB0fV9nZXRBbGxJbmNsdWRlZFZhbHVlcygpe3JldHVybiBzdXBlci5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKS5tYXAoaz0+CjA8az9rOmIuTUlOX1BPU0lUSVZFX1ZBTFVFKX1fZGVmYXVsdEV4dGVudCgpe3JldHVyblsxLDEwXX1fYmFja2luZ1NjYWxlRG9tYWluKGspe2lmKG51bGw9PWspcmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUuZG9tYWluKCk7dGhpcy5fZDNMb2dTY2FsZS5kb21haW4oayk7cmV0dXJuIHRoaXN9X2dldFJhbmdlKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUucmFuZ2UoKX1fc2V0UmFuZ2Uoayl7dGhpcy5fZDNMb2dTY2FsZS5yYW5nZShrKX1kZWZhdWx0VGlja3MoKXtyZXR1cm4gdGhpcy5fZDNMb2dTY2FsZS50aWNrcygpfXRpY2tzKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUudGlja3MoKX1leHRlbnRPZlZhbHVlcyhrKXtsZXQgdD1rPWsuZmlsdGVyKGw9PlBsb3R0YWJsZS5VdGlscy5NYXRoLmlzVmFsaWROdW1iZXIobCkmJjA8bCk7aWYodGhpcy5pZ25vcmVPdXRsaWVyKCkpe2s9ay5tYXAoZCkuc29ydCgobSxuKT0+bS1uKTtjb25zdCBsPWQzLnF1YW50aWxlKGssLjA1KSxwPWQzLnF1YW50aWxlKGssCi45NSk7dD1rLmZpbHRlcihtPT5tPj1sJiZtPD1wKS5tYXAoZil9az1kMy5leHRlbnQodCk7cmV0dXJuIG51bGw9PWtbMF18fG51bGw9PWtbMV0/W106a319Yi5Mb2dTY2FsZT1ofSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL2xpbmUtY2hhcnQuanMKKGZ1bmN0aW9uKGIpe2xldCBkOyhmdW5jdGlvbihrKXtrW2suVEVYVD0wXT0iVEVYVCI7a1trLkRPTT0xXT0iRE9NIn0pKGR8fChkPXt9KSk7bGV0IGY7KGZ1bmN0aW9uKGspe2suTE9HPSJsb2ciO2suTElORUFSPSJsaW5lYXIifSkoZnx8KGY9e30pKTtjbGFzcyBoe2NvbnN0cnVjdG9yKGssdCxsLHAsbSxuLHEsdSx4LEEseSl7dGhpcy5zZXJpZXNOYW1lcz1bXTt0aGlzLm5hbWUyZGF0YXNldHM9e307dGhpcy5jb2xvclNjYWxlPXA7dGhpcy50b29sdGlwPW07dGhpcy5kYXRhc2V0cz1bXTt0aGlzLl9pZ25vcmVZT3V0bGllcnM9ITE7dGhpcy5sYXN0UG9pbnRzRGF0YXNldD1uZXcgUGxvdHRhYmxlLkRhdGFzZXQ7dGhpcy5uYW5EYXRhc2V0PW5ldyBQbG90dGFibGUuRGF0YXNldDt0aGlzLnlWYWx1ZUFjY2Vzc29yPXQ7dGhpcy5zeW1ib2xGdW5jdGlvbj1BO3RoaXMub25EYXRhc2V0Q2hhbmdlZD10aGlzLl9vbkRhdGFzZXRDaGFuZ2VkLmJpbmQodGhpcyk7dGhpcy5fZGVmYXVsdFhSYW5nZT0KdTt0aGlzLl9kZWZhdWx0WVJhbmdlPXg7dGhpcy50b29sdGlwQ29sdW1ucz1uO3RoaXMuYnVpbGRDaGFydChrLGwscSx5KX1idWlsZENoYXJ0KGssdCxsLHApe3RoaXMuZGVzdHJveSgpO2s9aygpO3RoaXMueEFjY2Vzc29yPWsuYWNjZXNzb3I7dGhpcy54U2NhbGU9ay5zY2FsZTt0aGlzLnhBeGlzPWsuYXhpczt0aGlzLnhBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDMpO3AmJnRoaXMueEF4aXMuZm9ybWF0dGVyKHApO3RoaXMueVNjYWxlPWguZ2V0WVNjYWxlRnJvbVR5cGUodCk7dGhpcy55U2NhbGUuc2V0VmFsdWVQcm92aWRlckZvckRvbWFpbigoKT0+dGhpcy5nZXRWYWx1ZXNGb3JZQXhpc0RvbWFpbkNvbXB1dGUoKSk7dGhpcy55QXhpcz1uZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyh0aGlzLnlTY2FsZSwibGVmdCIpO3A9cmcubXVsdGlzY2FsZUZvcm1hdHRlcihyZy5ZX0FYSVNfRk9STUFUVEVSX1BSRUNJU0lPTik7dGhpcy55QXhpcy5tYXJnaW4oMCkudGlja0xhYmVsUGFkZGluZyg1KS5mb3JtYXR0ZXIocCk7CnRoaXMueUF4aXMudXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24oKTt0aGlzLmZpbGxBcmVhPWw7cD1uZXcgYi5QYW5ab29tRHJhZ0xheWVyKHRoaXMueFNjYWxlLHRoaXMueVNjYWxlLCgpPT50aGlzLnJlc2V0RG9tYWluKCkpO3RoaXMudG9vbHRpcEludGVyYWN0aW9uPXRoaXMuY3JlYXRlVG9vbHRpcEludGVyYWN0aW9uKHApO3RoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudD1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudDtsPXRoaXMuYnVpbGRQbG90KHRoaXMueFNjYWxlLHRoaXMueVNjYWxlLGwpO3RoaXMuZ3JpZGxpbmVzPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5HcmlkbGluZXModGhpcy54U2NhbGUsdGhpcy55U2NhbGUpO2s9bnVsbDt0IT09Zi5MT0cmJihrPW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5HdWlkZUxpbmVMYXllcigiaG9yaXpvbnRhbCIpLGsuc2NhbGUodGhpcy55U2NhbGUpLnZhbHVlKDApKTt0PW5ldyBQbG90dGFibGUuQ29tcG9uZW50cy5HdWlkZUxpbmVMYXllcigidmVydGljYWwiKTsKdC5zY2FsZSh0aGlzLnhTY2FsZSkudmFsdWUoMCk7dGhpcy5jZW50ZXI9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKFt0aGlzLmdyaWRsaW5lcyxrLHQsbCx0aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQscF0pO3RoaXMuY2VudGVyLmFkZENsYXNzKCJtYWluIik7dGhpcy5vdXRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoW1t0aGlzLnlBeGlzLHRoaXMuY2VudGVyXSxbbnVsbCx0aGlzLnhBeGlzXV0pfWJ1aWxkUGxvdChrLHQsbCl7bCYmKHRoaXMubWFyZ2luQXJlYVBsb3Q9bmV3IFBsb3R0YWJsZS5QbG90cy5BcmVhLHRoaXMubWFyZ2luQXJlYVBsb3QueCh0aGlzLnhBY2Nlc3NvcixrKSx0aGlzLm1hcmdpbkFyZWFQbG90LnkobC5oaWdoZXJBY2Nlc3Nvcix0KSx0aGlzLm1hcmdpbkFyZWFQbG90LnkwKGwubG93ZXJBY2Nlc3NvciksdGhpcy5tYXJnaW5BcmVhUGxvdC5hdHRyKCJmaWxsIiwocSx1LHgpPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUoeC5tZXRhZGF0YSgpLm5hbWUpKSwKdGhpcy5tYXJnaW5BcmVhUGxvdC5hdHRyKCJmaWxsLW9wYWNpdHkiLC4zKSx0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoInN0cm9rZS13aWR0aCIsMCkpO3RoaXMuc21vb3RoZWRBY2Nlc3Nvcj1xPT5xLnNtb290aGVkO2w9bmV3IFBsb3R0YWJsZS5QbG90cy5MaW5lO2wueCh0aGlzLnhBY2Nlc3NvcixrKTtsLnkodGhpcy55VmFsdWVBY2Nlc3Nvcix0KTtsLmF0dHIoInN0cm9rZSIsKHEsdSx4KT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHgubWV0YWRhdGEoKS5uYW1lKSk7dGhpcy5saW5lUGxvdD1sO3RoaXMuc2V0dXBUb29sdGlwcyhsKTtsZXQgcD1uZXcgUGxvdHRhYmxlLlBsb3RzLkxpbmU7cC54KHRoaXMueEFjY2Vzc29yLGspO3AueSh0aGlzLnNtb290aGVkQWNjZXNzb3IsdCk7cC5hdHRyKCJzdHJva2UiLChxLHUseCk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh4Lm1ldGFkYXRhKCkubmFtZSkpO3RoaXMuc21vb3RoTGluZVBsb3Q9cDtpZih0aGlzLnN5bWJvbEZ1bmN0aW9uKXt2YXIgbT0KbmV3IFBsb3R0YWJsZS5QbG90cy5TY2F0dGVyO20ueCh0aGlzLnhBY2Nlc3NvcixrKTttLnkodGhpcy55VmFsdWVBY2Nlc3Nvcix0KTttLmF0dHIoImZpbGwiLChxLHUseCk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh4Lm1ldGFkYXRhKCkubmFtZSkpO20uYXR0cigib3BhY2l0eSIsMSk7bS5zaXplKDIqcmcuVE9PTFRJUF9DSVJDTEVfU0laRSk7bS5zeW1ib2woKHEsdSx4KT0+dGhpcy5zeW1ib2xGdW5jdGlvbih4Lm1ldGFkYXRhKCkubmFtZSkpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90PW19bT1uZXcgUGxvdHRhYmxlLlBsb3RzLlNjYXR0ZXI7bS54KHRoaXMueEFjY2Vzc29yLGspO20ueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHQpO20uYXR0cigiZmlsbCIscT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHEubmFtZSkpO20uYXR0cigib3BhY2l0eSIsMSk7bS5zaXplKDIqcmcuVE9PTFRJUF9DSVJDTEVfU0laRSk7bS5kYXRhc2V0cyhbdGhpcy5sYXN0UG9pbnRzRGF0YXNldF0pO3RoaXMuc2NhdHRlclBsb3Q9Cm07bGV0IG49bmV3IFBsb3R0YWJsZS5QbG90cy5TY2F0dGVyO24ueCh0aGlzLnhBY2Nlc3NvcixrKTtuLnkocT0+cS5kaXNwbGF5WSx0KTtuLmF0dHIoImZpbGwiLHE9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShxLm5hbWUpKTtuLmF0dHIoIm9wYWNpdHkiLDEpO24uc2l6ZSgyKnJnLk5BTl9TWU1CT0xfU0laRSk7bi5kYXRhc2V0cyhbdGhpcy5uYW5EYXRhc2V0XSk7bi5zeW1ib2woUGxvdHRhYmxlLlN5bWJvbEZhY3Rvcmllcy50cmlhbmdsZSk7dGhpcy5uYW5EaXNwbGF5PW47az1bbixtLHAsbF07dGhpcy5tYXJnaW5BcmVhUGxvdCYmay5wdXNoKHRoaXMubWFyZ2luQXJlYVBsb3QpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZrLnB1c2godGhpcy5tYXJrZXJzU2NhdHRlclBsb3QpO3JldHVybiBuZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuR3JvdXAoayl9X29uRGF0YXNldENoYW5nZWQoayl7dGhpcy5zbW9vdGhpbmdFbmFibGVkJiZ0aGlzLnJlc21vb3RoRGF0YXNldChrKTt0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpfWlnbm9yZVlPdXRsaWVycyhrKXtrIT09CnRoaXMuX2lnbm9yZVlPdXRsaWVycyYmKHRoaXMuX2lnbm9yZVlPdXRsaWVycz1rLHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCksdGhpcy55U2NhbGUuaWdub3JlT3V0bGllcihrKSx0aGlzLnJlc2V0WURvbWFpbigpKX1nZXRWYWx1ZXNGb3JZQXhpc0RvbWFpbkNvbXB1dGUoKXtjb25zdCBrPXRoaXMuZ2V0QWNjZXNzb3JzRm9yQ29tcHV0aW5nWVJhbmdlKCk7cmV0dXJuIF8uZmxhdHRlbkRlZXAodGhpcy5kYXRhc2V0cy5tYXAodD0+ay5tYXAobD0+dC5kYXRhKCkubWFwKHA9PmwocCwtMSx0KSkpKSkuZmlsdGVyKGlzRmluaXRlKX11cGRhdGVTcGVjaWFsRGF0YXNldHMoKXtjb25zdCBrPXRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpO3ZhciB0PXRoaXMuZGF0YXNldHMubWFwKGw9PntsZXQgcD1udWxsLG09bC5kYXRhKCkuZmlsdGVyKG49PiFpc05hTihrKG4sLTEsbCkpKTswPG0ubGVuZ3RoJiYocD1tW20ubGVuZ3RoLTFdLHAubmFtZT1sLm1ldGFkYXRhKCkubmFtZSxwLnJlbGF0aXZlPQpyZy5yZWxhdGl2ZUFjY2Vzc29yKHAsLTEsbCkpO3JldHVybiBwfSkuZmlsdGVyKGw9Pm51bGwhPWwpO3RoaXMubGFzdFBvaW50c0RhdGFzZXQuZGF0YSh0KTt0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCYmdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cy5tYXAodGhpcy5jcmVhdGVTYW1wbGVkRGF0YXNldEZvck1hcmtlcnMpKTt0PV8uZmxhdHRlbih0aGlzLmRhdGFzZXRzLm1hcChsPT57bGV0IHA9bnVsbCxtPWwuZGF0YSgpLG49MDtmb3IoO248bS5sZW5ndGgmJm51bGw9PXA7KWlzTmFOKGsobVtuXSwtMSxsKSl8fChwPWsobVtuXSwtMSxsKSksbisrO251bGw9PXAmJihwPTApO2xldCBxPVtdO2ZvcihuPTA7bjxtLmxlbmd0aDtuKyspaXNOYU4oayhtW25dLC0xLGwpKT8obVtuXS5uYW1lPWwubWV0YWRhdGEoKS5uYW1lLG1bbl0uZGlzcGxheVk9cCxtW25dLnJlbGF0aXZlPXJnLnJlbGF0aXZlQWNjZXNzb3IobVtuXSwtMSxsKSxxLnB1c2gobVtuXSkpOgpwPWsobVtuXSwtMSxsKTtyZXR1cm4gcX0pKTt0aGlzLm5hbkRhdGFzZXQuZGF0YSh0KX1yZXNldERvbWFpbigpe3RoaXMucmVzZXRYRG9tYWluKCk7dGhpcy5yZXNldFlEb21haW4oKX1yZXNldFhEb21haW4oKXtpZihudWxsIT10aGlzLl9kZWZhdWx0WFJhbmdlKXZhciBrPXRoaXMuX2RlZmF1bHRYUmFuZ2U7ZWxzZSBrPXRoaXMueFNjYWxlLGsuX2RvbWFpbk1pbj1udWxsLGsuX2RvbWFpbk1heD1udWxsLGs9ay5fZ2V0RXh0ZW50KCk7dGhpcy54U2NhbGUuZG9tYWluKGspfXJlc2V0WURvbWFpbigpe251bGwhPXRoaXMuX2RlZmF1bHRZUmFuZ2U/dGhpcy55U2NhbGUuZG9tYWluKHRoaXMuX2RlZmF1bHRZUmFuZ2UpOih0aGlzLnlTY2FsZS5hdXRvRG9tYWluKCksdGhpcy55U2NhbGUuZG9tYWluKHRoaXMueVNjYWxlLmRvbWFpbigpKSl9Z2V0QWNjZXNzb3JzRm9yQ29tcHV0aW5nWVJhbmdlKCl7Y29uc3Qgaz1bdGhpcy5nZXRZQXhpc0FjY2Vzc29yKCldO3RoaXMuZmlsbEFyZWEmJmsucHVzaCh0aGlzLmZpbGxBcmVhLmxvd2VyQWNjZXNzb3IsCnRoaXMuZmlsbEFyZWEuaGlnaGVyQWNjZXNzb3IpO3JldHVybiBrfWdldFlBeGlzQWNjZXNzb3IoKXtyZXR1cm4gdGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3Nvcjp0aGlzLnlWYWx1ZUFjY2Vzc29yfWNyZWF0ZVRvb2x0aXBJbnRlcmFjdGlvbihrKXtjb25zdCB0PW5ldyByZy5Qb2ludGVySW50ZXJhY3Rpb24sbD0oKT0+e3QuZW5hYmxlZCghMSk7dGhpcy5oaWRlVG9vbHRpcHMoKX0scD0oKT0+dC5lbmFibGVkKCEwKTtrLm9uUGFuU3RhcnQobCk7ay5vbkRyYWdab29tU3RhcnQobCk7ay5vblBhbkVuZChwKTtrLm9uRHJhZ1pvb21FbmQocCk7ay5vblNjcm9sbFpvb20oKCk9PnRoaXMudXBkYXRlVG9vbHRpcENvbnRlbnQodGhpcy5fbGFzdE1vdXNlUG9zaXRpb24pKTt0Lm9uUG9pbnRlck1vdmUobT0+e3RoaXMuX2xhc3RNb3VzZVBvc2l0aW9uPW07dGhpcy51cGRhdGVUb29sdGlwQ29udGVudChtKX0pO3Qub25Qb2ludGVyRXhpdCgoKT0+dGhpcy5oaWRlVG9vbHRpcHMoKSk7CnJldHVybiB0fXVwZGF0ZVRvb2x0aXBDb250ZW50KGspe3RoaXMubGluZVBsb3QmJih3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lKSx0aGlzLl90b29sdGlwVXBkYXRlQW5pbWF0aW9uRnJhbWU9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e2xldCB0PXt4OmsueCx5OmsueSxkYXR1bTpudWxsLGRhdGFzZXQ6bnVsbH0sbD10aGlzLmdyaWRsaW5lcy5jb250ZW50KCkubm9kZSgpLmdldEJCb3goKTt2YXIgcD10aGlzLmxpbmVQbG90LmRhdGFzZXRzKCkubWFwKHU9PnRoaXMuZmluZENsb3Nlc3RQb2ludCh0LHUpKS5maWx0ZXIoQm9vbGVhbik7bGV0IG09UGxvdHRhYmxlLlV0aWxzLkRPTS5pbnRlcnNlY3RzQkJveCxuPXAuZmlsdGVyKHU9Pm0odS54LHUueSxsKXx8aXNOYU4odGhpcy55VmFsdWVBY2Nlc3Nvcih1LmRhdHVtLDAsdS5kYXRhc2V0KSkpLHE9bi5maWx0ZXIodT0+IWlzTmFOKHRoaXMueVZhbHVlQWNjZXNzb3IodS5kYXR1bSwKMCx1LmRhdGFzZXQpKSk7MCE9PXAubGVuZ3RoPyh0aGlzLnNjYXR0ZXJQbG90LmF0dHIoImRpc3BsYXkiLCJub25lIikscD10aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQuY29udGVudCgpLnNlbGVjdEFsbCgiLnBvaW50IikuZGF0YShxLHU9PnUuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpLHAuZW50ZXIoKS5hcHBlbmQoImNpcmNsZSIpLmNsYXNzZWQoInBvaW50IiwhMCkscC5hdHRyKCJyIixyZy5UT09MVElQX0NJUkNMRV9TSVpFKS5hdHRyKCJjeCIsdT0+dS54KS5hdHRyKCJjeSIsdT0+dS55KS5zdHlsZSgic3Ryb2tlIiwibm9uZSIpLmF0dHIoImZpbGwiLHU9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh1LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSkscC5leGl0KCkucmVtb3ZlKCksdGhpcy5kcmF3VG9vbHRpcHMobix0LHRoaXMudG9vbHRpcENvbHVtbnMpKTp0aGlzLmhpZGVUb29sdGlwcygpfSkpfWhpZGVUb29sdGlwcygpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl90b29sdGlwVXBkYXRlQW5pbWF0aW9uRnJhbWUpOwp0aGlzLnRvb2x0aXAuaGlkZSgpO3RoaXMuc2NhdHRlclBsb3QuYXR0cigiZGlzcGxheSIsImJsb2NrIik7dGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50LmNvbnRlbnQoKS5zZWxlY3RBbGwoIi5wb2ludCIpLnJlbW92ZSgpfXNldHVwVG9vbHRpcHMoayl7ay5vbkRldGFjaCgoKT0+e3RoaXMudG9vbHRpcEludGVyYWN0aW9uLmRldGFjaEZyb20oKTt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5lbmFibGVkKCExKX0pO2sub25BbmNob3IoKCk9Pnt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5hdHRhY2hUbyhrKTt0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5lbmFibGVkKCEwKX0pfWRyYXdUb29sdGlwcyhrLHQsbCl7aWYoay5sZW5ndGgpe3ZhciBwPXRoaXMuY29sb3JTY2FsZTtsPVt7dGl0bGU6IiIsc3RhdGljOiExLGV2YWxUeXBlOmQuRE9NLGV2YWx1YXRlKHkpe2QzLnNlbGVjdCh0aGlzKS5zZWxlY3QoInNwYW4iKS5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIsKCk9PnAuc2NhbGUoeS5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpOwpyZXR1cm4iIn0sZW50ZXIoeSl7ZDMuc2VsZWN0KHRoaXMpLmFwcGVuZCgic3BhbiIpLmNsYXNzZWQoInN3YXRjaCIsITApLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIiwoKT0+cC5zY2FsZSh5LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSl9fSwuLi5sXTt2YXIgbT15PT5NYXRoLnBvdyh5LngtdC54LDIpK01hdGgucG93KHkueS10LnksMiksbj1fLm1pbihrLm1hcChtKSkscT10aGlzLnNtb290aGluZ0VuYWJsZWQ/dGhpcy5zbW9vdGhlZEFjY2Vzc29yOnRoaXMueVZhbHVlQWNjZXNzb3I7az0iYXNjZW5kaW5nIj09PXRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q/Xy5zb3J0Qnkoayx5PT5xKHkuZGF0dW0sLTEseS5kYXRhc2V0KSk6ImRlc2NlbmRpbmciPT09dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD9fLnNvcnRCeShrLHk9PnEoeS5kYXR1bSwtMSx5LmRhdGFzZXQpKS5yZXZlcnNlKCk6Im5lYXJlc3QiPT09dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD9fLnNvcnRCeShrLG0pOmsuc2xpY2UoMCkucmV2ZXJzZSgpOwp2YXIgdT10aGlzLHg9ZDMuc2VsZWN0KHRoaXMudG9vbHRpcC5jb250ZW50KCkpLnNlbGVjdCgidGFibGUiKSxBPXguc2VsZWN0KCJ0aGVhZCIpLnNlbGVjdEFsbCgidGgiKS5kYXRhKGwseT0+eS50aXRsZSk7QS5lbnRlcigpLmFwcGVuZCgidGgiKS50ZXh0KHk9PnkudGl0bGUpLm5vZGVzKCk7QS5leGl0KCkucmVtb3ZlKCk7az14LnNlbGVjdCgidGJvZHkiKS5zZWxlY3RBbGwoInRyIikuZGF0YShrLHk9PnkuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpO2suY2xhc3NlZCgiZGlzdGFudCIseT0+e3ZhciB3PXkuZGF0YXNldC5kYXRhKClbMF0sQz1fLmxhc3QoeS5kYXRhc2V0LmRhdGEoKSk7dz10aGlzLnhTY2FsZS5zY2FsZSh0aGlzLnhBY2Nlc3Nvcih3LDAseS5kYXRhc2V0KSk7Qz10aGlzLnhTY2FsZS5zY2FsZSh0aGlzLnhBY2Nlc3NvcihDLDAseS5kYXRhc2V0KSk7eT10aGlzLnNtb290aGluZ0VuYWJsZWQ/eS5kYXR1bS5zbW9vdGhlZDp0aGlzLnlWYWx1ZUFjY2Vzc29yKHkuZGF0dW0sCjAseS5kYXRhc2V0KTtyZXR1cm4gdC54PHd8fHQueD5DfHxpc05hTih5KX0pLmNsYXNzZWQoImNsb3Nlc3QiLHk9Pm0oeSk9PT1uKS5lYWNoKGZ1bmN0aW9uKHkpe3UuZHJhd1Rvb2x0aXBSb3codGhpcyxsLHkpfSkub3JkZXIoKTtrLmV4aXQoKS5yZW1vdmUoKTtrLmVudGVyKCkuYXBwZW5kKCJ0ciIpLmVhY2goZnVuY3Rpb24oeSl7dS5kcmF3VG9vbHRpcFJvdyh0aGlzLGwseSl9KS5ub2RlcygpO3RoaXMudG9vbHRpcC51cGRhdGVBbmRQb3NpdGlvbih0aGlzLnRhcmdldFNWRy5ub2RlKCkpfWVsc2UgdGhpcy50b29sdGlwLmhpZGUoKX1kcmF3VG9vbHRpcFJvdyhrLHQsbCl7Y29uc3QgcD10aGlzO2s9ZDMuc2VsZWN0KGspLnNlbGVjdEFsbCgidGQiKS5kYXRhKHQpO2suZWFjaChmdW5jdGlvbihtKXttLnN0YXRpY3x8cC5kcmF3VG9vbHRpcENvbHVtbi5jYWxsKHAsdGhpcyxtLGwpfSk7ay5lbnRlcigpLmFwcGVuZCgidGQiKS5lYWNoKGZ1bmN0aW9uKG0pe20uZW50ZXImJm0uZW50ZXIuY2FsbCh0aGlzLApsKTtwLmRyYXdUb29sdGlwQ29sdW1uLmNhbGwocCx0aGlzLG0sbCl9KX1kcmF3VG9vbHRpcENvbHVtbihrLHQsbCl7Y29uc3QgcD10aGlzLnNtb290aGluZ0VuYWJsZWQ7dC5ldmFsVHlwZT09ZC5ET00/dC5ldmFsdWF0ZS5jYWxsKGssbCx7c21vb3RoaW5nRW5hYmxlZDpwfSk6ZDMuc2VsZWN0KGspLnRleHQodC5ldmFsdWF0ZS5jYWxsKGssbCx7c21vb3RoaW5nRW5hYmxlZDpwfSkpfWZpbmRDbG9zZXN0UG9pbnQoayx0KXtjb25zdCBsPXQuZGF0YSgpLm1hcCgobixxKT0+dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IobixxLHQpKSk7bGV0IHA9Xy5zb3J0ZWRJbmRleChsLGsueCk7aWYoMD09bC5sZW5ndGgpcmV0dXJuIG51bGw7cD09PWwubGVuZ3RoPy0tcDowIT09cCYmKHA9TWF0aC5hYnMobFtwLTFdLWsueCk8TWF0aC5hYnMobFtwXS1rLngpP3AtMTpwKTtrPXQuZGF0YSgpW3BdO2NvbnN0IG09dGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3NvcihrLApwLHQpOnRoaXMueVZhbHVlQWNjZXNzb3IoayxwLHQpO3JldHVybnt4OmxbcF0seTp0aGlzLnlTY2FsZS5zY2FsZShtKSxkYXR1bTprLGRhdGFzZXQ6dH19cmVzbW9vdGhEYXRhc2V0KGspe2xldCB0PWsuZGF0YSgpO2NvbnN0IGw9dGhpcy5zbW9vdGhpbmdXZWlnaHQ7bGV0IHA9MDx0Lmxlbmd0aD8wOk5hTixtPTA7Y29uc3Qgbj10Lm1hcCgodSx4KT0+dGhpcy55VmFsdWVBY2Nlc3Nvcih1LHgsaykpLHE9bi5ldmVyeSh1PT51PT1uWzBdKTt0LmZvckVhY2goKHUseCk9Pnt4PW5beF07cXx8IU51bWJlci5pc0Zpbml0ZSh4KT91LnNtb290aGVkPXg6KHA9cCpsKygxLWwpKngsbSsrLHg9MSwxIT09bCYmKHg9MS1NYXRoLnBvdyhsLG0pKSx1LnNtb290aGVkPXAveCl9KX1nZXREYXRhc2V0KGspe3ZvaWQgMD09PXRoaXMubmFtZTJkYXRhc2V0c1trXSYmKHRoaXMubmFtZTJkYXRhc2V0c1trXT1uZXcgUGxvdHRhYmxlLkRhdGFzZXQoW10se25hbWU6ayxtZXRhOm51bGx9KSk7cmV0dXJuIHRoaXMubmFtZTJkYXRhc2V0c1trXX1zdGF0aWMgZ2V0WVNjYWxlRnJvbVR5cGUoayl7aWYoaz09PQpmLkxPRylyZXR1cm4gbmV3IGIuTG9nU2NhbGU7aWYoaz09PWYuTElORUFSKXJldHVybiBuZXcgYi5MaW5lYXJTY2FsZTt0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIHlTY2FsZSB0eXBlICIrayk7fXNldFZpc2libGVTZXJpZXMoayl7dGhpcy5zZXJpZXNOYW1lcz1rPWsuc29ydCgpO2sucmV2ZXJzZSgpO3RoaXMuZGF0YXNldHMuZm9yRWFjaCh0PT50Lm9mZlVwZGF0ZSh0aGlzLm9uRGF0YXNldENoYW5nZWQpKTt0aGlzLmRhdGFzZXRzPWsubWFwKHQ9PnRoaXMuZ2V0RGF0YXNldCh0KSk7dGhpcy5kYXRhc2V0cy5mb3JFYWNoKHQ9PnQub25VcGRhdGUodGhpcy5vbkRhdGFzZXRDaGFuZ2VkKSk7dGhpcy5saW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTt0aGlzLnNtb290aGluZ0VuYWJsZWQmJnRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cyk7dGhpcy5tYXJnaW5BcmVhUGxvdCYmdGhpcy5tYXJnaW5BcmVhUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTsKdGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKX1jcmVhdGVTYW1wbGVkRGF0YXNldEZvck1hcmtlcnMoayl7Y29uc3QgdD1rLmRhdGEoKTtpZigyMD49dC5sZW5ndGgpcmV0dXJuIGs7Y29uc3QgbD1NYXRoLmNlaWwodC5sZW5ndGgvMjApLHA9QXJyYXkoTWF0aC5mbG9vcih0Lmxlbmd0aC9sKSk7Zm9yKGxldCBtPTAsbj0wO208cC5sZW5ndGg7bSsrLG4rPWwpcFttXT10W25dO3JldHVybiBuZXcgUGxvdHRhYmxlLkRhdGFzZXQocCxrLm1ldGFkYXRhKCkpfXNldFNlcmllc0RhdGEoayx0KXt0aGlzLmdldERhdGFzZXQoaykuZGF0YSh0KTt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKX1zZXRTZXJpZXNNZXRhZGF0YShrLHQpe3Q9T2JqZWN0LmFzc2lnbih7fSx0aGlzLmdldERhdGFzZXQoaykubWV0YWRhdGEoKSx7bWV0YTp0fSk7dGhpcy5nZXREYXRhc2V0KGspLm1ldGFkYXRhKHQpfXNtb290aGluZ1VwZGF0ZShrKXt0aGlzLnNtb290aGluZ1dlaWdodD0Kazt0aGlzLmRhdGFzZXRzLmZvckVhY2godD0+dGhpcy5yZXNtb290aERhdGFzZXQodCkpO3RoaXMuc21vb3RoaW5nRW5hYmxlZHx8KHRoaXMubGluZVBsb3QuYWRkQ2xhc3MoImdob3N0IiksdGhpcy5zY2F0dGVyUGxvdC55KHRoaXMuc21vb3RoZWRBY2Nlc3Nvcix0aGlzLnlTY2FsZSksdGhpcy5zbW9vdGhpbmdFbmFibGVkPSEwLHRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cykpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZ0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC55KHRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpLHRoaXMueVNjYWxlKTt0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpfXNtb290aGluZ0Rpc2FibGUoKXt0aGlzLnNtb290aGluZ0VuYWJsZWQmJih0aGlzLmxpbmVQbG90LnJlbW92ZUNsYXNzKCJnaG9zdCIpLHRoaXMuc2NhdHRlclBsb3QueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHRoaXMueVNjYWxlKSx0aGlzLnNtb290aExpbmVQbG90LmRhdGFzZXRzKFtdKSwKdGhpcy5zbW9vdGhpbmdFbmFibGVkPSExLHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCkpO3RoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZ0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC55KHRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpLHRoaXMueVNjYWxlKX1zZXRUb29sdGlwU29ydGluZ01ldGhvZChrKXt0aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kPWt9cmVuZGVyVG8oayl7dGhpcy50YXJnZXRTVkc9azt0aGlzLm91dGVyLnJlbmRlclRvKGspO251bGwhPXRoaXMuX2RlZmF1bHRYUmFuZ2UmJnRoaXMucmVzZXRYRG9tYWluKCk7bnVsbCE9dGhpcy5fZGVmYXVsdFlSYW5nZSYmdGhpcy5yZXNldFlEb21haW4oKTt0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKX1yZWRyYXcoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKTt0aGlzLl9yZWRyYXdSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMubWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKTsKdGhpcy5vdXRlci5yZWRyYXcoKX0pfW1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5faW52YWxpZGF0ZUxheW91dFJhZik7dGhpcy5faW52YWxpZGF0ZUxheW91dFJhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57dGhpcy5tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dCgpfSl9bWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKXtpZih0aGlzLl9sYXN0RHJhd0JCb3gpe2NvbnN0IGs9dGhpcy5fbGFzdERyYXdCQm94LndpZHRoLHt3aWR0aDp0fT10aGlzLnRhcmdldFNWRy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7MD09ayYmazx0JiZ0aGlzLm91dGVyLmludmFsaWRhdGVDYWNoZSgpfXRoaXMuX2xhc3REcmF3QkJveD10aGlzLnRhcmdldFNWRy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9ZGVzdHJveSgpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpOwp3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5faW52YWxpZGF0ZUxheW91dFJhZik7dGhpcy5vdXRlciYmdGhpcy5vdXRlci5kZXN0cm95KCl9b25BbmNob3Ioayl7aWYodGhpcy5vdXRlcil0aGlzLm91dGVyLm9uQW5jaG9yKGspfX1iLkxpbmVDaGFydD1ofSkoR2h8fChHaD17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL3Z6LWxpbmUtY2hhcnQyLmpzCihmdW5jdGlvbihiKXtjb25zdCBkPXJnLm11bHRpc2NhbGVGb3JtYXR0ZXIocmcuWV9UT09MVElQX0ZPUk1BVFRFUl9QUkVDSVNJT04pLGY9aD0+aXNOYU4oaCk/Ik5hTiI6ZChoKTtiLkRFRkFVTFRfVE9PTFRJUF9DT0xVTU5TPVt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmg9PmguZGF0YXNldC5tZXRhZGF0YSgpLm5hbWV9LHt0aXRsZToiU21vb3RoZWQiLGV2YWx1YXRlKGgsayl7cmV0dXJuIGYoay5zbW9vdGhpbmdFbmFibGVkP2guZGF0dW0uc21vb3RoZWQ6aC5kYXR1bS5zY2FsYXIpfX0se3RpdGxlOiJWYWx1ZSIsZXZhbHVhdGU6aD0+ZihoLmRhdHVtLnNjYWxhcil9LHt0aXRsZToiU3RlcCIsZXZhbHVhdGU6aD0+cmcuc3RlcEZvcm1hdHRlcihoLmRhdHVtLnN0ZXApfSx7dGl0bGU6IlRpbWUiLGV2YWx1YXRlOmg9PnJnLnRpbWVGb3JtYXR0ZXIoaC5kYXR1bS53YWxsX3RpbWUpfSx7dGl0bGU6IlJlbGF0aXZlIixldmFsdWF0ZTpoPT5yZy5yZWxhdGl2ZUZvcm1hdHRlcihyZy5yZWxhdGl2ZUFjY2Vzc29yKGguZGF0dW0sCi0xLGguZGF0YXNldCkpfV07UG9seW1lcih7aXM6InZ6LWxpbmUtY2hhcnQyIixwcm9wZXJ0aWVzOntjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybihuZXcgUGxvdHRhYmxlLlNjYWxlcy5Db2xvcikucmFuZ2UoZDMuc2NoZW1lQ2F0ZWdvcnkxMCl9fSxzeW1ib2xGdW5jdGlvbjpPYmplY3Qsc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sc21vb3RoaW5nV2VpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTouNn0seFR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSx4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0seEF4aXNGb3JtYXR0ZXI6T2JqZWN0LHlWYWx1ZUFjY2Vzc29yOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+aD0+aC5zY2FsYXJ9LHRvb2x0aXBDb2x1bW5zOnt0eXBlOkFycmF5LHZhbHVlOigpPT5iLkRFRkFVTFRfVE9PTFRJUF9DT0xVTU5TfSxmaWxsQXJlYTpPYmplY3QsCmRlZmF1bHRYUmFuZ2U6QXJyYXksZGVmYXVsdFlSYW5nZTpBcnJheSx5U2NhbGVUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZToibGluZWFyIn0saWdub3JlWU91dGxpZXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHRvb2x0aXBTb3J0aW5nTWV0aG9kOnt0eXBlOlN0cmluZyx2YWx1ZToiZGVmYXVsdCJ9LHRvb2x0aXBQb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6RWguVG9vbHRpcFBvc2l0aW9uLkJPVFRPTX0sX2NoYXJ0Ok9iamVjdCxfdmlzaWJsZVNlcmllc0NhY2hlOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3Nlcmllc0RhdGFDYWNoZTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9zZXJpZXNNZXRhZGF0YUNhY2hlOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZDp7dHlwZTpOdW1iZXIsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9tYWtlQ2hhcnQoeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZCwgeFR5cGUsIHlWYWx1ZUFjY2Vzc29yLCB5U2NhbGVUeXBlLCB0b29sdGlwQ29sdW1ucywgY29sb3JTY2FsZSwgaXNBdHRhY2hlZCkiLAoiX3JlbG9hZEZyb21DYWNoZShfY2hhcnQsIF92aXNpYmxlU2VyaWVzQ2FjaGUpIiwiX3Ntb290aGluZ0NoYW5nZWQoc21vb3RoaW5nRW5hYmxlZCwgc21vb3RoaW5nV2VpZ2h0LCBfY2hhcnQpIiwiX3Rvb2x0aXBTb3J0aW5nTWV0aG9kQ2hhbmdlZCh0b29sdGlwU29ydGluZ01ldGhvZCwgX2NoYXJ0KSIsIl9vdXRsaWVyc0NoYW5nZWQoaWdub3JlWU91dGxpZXJzLCBfY2hhcnQpIl0scmVhZHkoKXt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuY2hhcnRkaXYsITApfSxhdHRhY2hlZCgpe2NvbnN0IGg9e2NhcHR1cmU6ITAscGFzc2l2ZTohMH07dGhpcy5fbGlzdGVuKHRoaXMsIm1vdXNlZG93biIsdGhpcy5fb25Nb3VzZURvd24uYmluZCh0aGlzKSxoKTt0aGlzLl9saXN0ZW4odGhpcywibW91c2V1cCIsdGhpcy5fb25Nb3VzZVVwLmJpbmQodGhpcyksaCk7dGhpcy5fbGlzdGVuKHdpbmRvdywia2V5ZG93biIsdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyksaCk7dGhpcy5fbGlzdGVuKHdpbmRvdywKImtleXVwIix0aGlzLl9vbktleVVwLmJpbmQodGhpcyksaCl9LGRldGFjaGVkKCl7dGhpcy5jYW5jZWxBc3luYyh0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQpO3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5kZXN0cm95KCk7dGhpcy5fbGlzdGVuZXJzJiYodGhpcy5fbGlzdGVuZXJzLmZvckVhY2goKHtub2RlOmgsZXZlbnROYW1lOmssZnVuYzp0LG9wdGlvbjpsfSk9PntoLnJlbW92ZUV2ZW50TGlzdGVuZXIoayx0LGwpfSksdGhpcy5fbGlzdGVuZXJzLmNsZWFyKCkpfSxfbGlzdGVuKGgsayx0LGw9e30pe3RoaXMuX2xpc3RlbmVyc3x8KHRoaXMuX2xpc3RlbmVycz1uZXcgU2V0KTt0aGlzLl9saXN0ZW5lcnMuYWRkKHtub2RlOmgsZXZlbnROYW1lOmssZnVuYzp0LG9wdGlvbjpsfSk7aC5hZGRFdmVudExpc3RlbmVyKGssdCxsKX0sX29uS2V5RG93bihoKXt0aGlzLnRvZ2dsZUNsYXNzKCJwYW5rZXkiLGIuUGFuWm9vbURyYWdMYXllci5pc1BhbktleShoKSl9LF9vbktleVVwKGgpe3RoaXMudG9nZ2xlQ2xhc3MoInBhbmtleSIsCmIuUGFuWm9vbURyYWdMYXllci5pc1BhbktleShoKSl9LF9vbk1vdXNlRG93bigpe3RoaXMudG9nZ2xlQ2xhc3MoIm1vdXNlZG93biIsITApfSxfb25Nb3VzZVVwKCl7dGhpcy50b2dnbGVDbGFzcygibW91c2Vkb3duIiwhMSl9LHNldFZpc2libGVTZXJpZXM6ZnVuY3Rpb24oaCl7Xy5pc0VxdWFsKHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZSxoKXx8KHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZT1oKX0sc2V0U2VyaWVzRGF0YTpmdW5jdGlvbihoLGspe3RoaXMuX3Nlcmllc0RhdGFDYWNoZVtoXT1rO3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRTZXJpZXNEYXRhKGgsayl9LHNldFNlcmllc01ldGFkYXRhKGgsayl7dGhpcy5fc2VyaWVzTWV0YWRhdGFDYWNoZVtoXT1rO3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRTZXJpZXNNZXRhZGF0YShoLGspfSxyZXNldERvbWFpbjpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5yZXNldERvbWFpbigpfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmCnRoaXMuX2NoYXJ0LnJlZHJhdygpfSxfbWFrZUNoYXJ0OmZ1bmN0aW9uKGgsayx0LGwscCxtKXtrfHxoP2smJihoPSgpPT5yZy5nZXRYQ29tcG9uZW50cyhrKSk6aD1yZy5zdGVwWDtudWxsIT09dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQpLHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD1udWxsKTt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD1udWxsO2lmKGgmJnRoaXMueVZhbHVlQWNjZXNzb3ImJnRoaXMudG9vbHRpcENvbHVtbnMpe3ZhciBuPW5ldyBiLkxpbmVDaGFydChoLHRoaXMueVZhbHVlQWNjZXNzb3IsbCxtLHRoaXMuJC50b29sdGlwLHRoaXMudG9vbHRpcENvbHVtbnMsdGhpcy5maWxsQXJlYSx0aGlzLmRlZmF1bHRYUmFuZ2UsdGhpcy5kZWZhdWx0WVJhbmdlLAp0aGlzLnN5bWJvbEZ1bmN0aW9uLHRoaXMueEF4aXNGb3JtYXR0ZXIpLHE9ZDMuc2VsZWN0KHRoaXMuJC5jaGFydGRpdik7bi5yZW5kZXJUbyhxKTt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpO3RoaXMuX2NoYXJ0PW47dGhpcy5fY2hhcnQub25BbmNob3IoKCk9PnRoaXMuZmlyZSgiY2hhcnQtYXR0YWNoZWQiKSl9fSwzNTApfSxfcmVsb2FkRnJvbUNhY2hlOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJih0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUuZm9yRWFjaChoPT57dGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShoLHRoaXMuX3Nlcmllc0RhdGFDYWNoZVtoXXx8W10pfSksdGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLmZpbHRlcihoPT50aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW2hdKS5mb3JFYWNoKGg9Pnt0aGlzLl9jaGFydC5zZXRTZXJpZXNNZXRhZGF0YShoLHRoaXMuX3Nlcmllc01ldGFkYXRhQ2FjaGVbaF0pfSksdGhpcy5fY2hhcnQuc2V0VmlzaWJsZVNlcmllcyh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUpKX0sCl9zbW9vdGhpbmdDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJih0aGlzLnNtb290aGluZ0VuYWJsZWQ/dGhpcy5fY2hhcnQuc21vb3RoaW5nVXBkYXRlKHRoaXMuc21vb3RoaW5nV2VpZ2h0KTp0aGlzLl9jaGFydC5zbW9vdGhpbmdEaXNhYmxlKCkpfSxfb3V0bGllcnNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0Lmlnbm9yZVlPdXRsaWVycyh0aGlzLmlnbm9yZVlPdXRsaWVycyl9LF90b29sdGlwU29ydGluZ01ldGhvZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0VG9vbHRpcFNvcnRpbmdNZXRob2QodGhpcy50b29sdGlwU29ydGluZ01ldGhvZCl9LGdldEV4cG9ydGVyKCl7cmV0dXJuIG5ldyBiLkxpbmVDaGFydEV4cG9ydGVyKHRoaXMuJC5jaGFydGRpdil9fSl9KShHaHx8KEdoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotbGluZS1jaGFydDIvdnotbGluZS1jaGFydDIuaHRtbC5qcwpQb2x5bWVyKHtpczoidnotbGluZS1jaGFydC10b29sdGlwIn0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWxpbmUtY2hhcnQyL2xpbmUtY2hhcnQtZXhwb3J0ZXIuanMKKGZ1bmN0aW9uKGIpe2xldCBkOyhmdW5jdGlvbihrKXtrLkdST1VQPSJHIjtrLkRJVj0iRElWIjtrLlNWRz0iU1ZHIjtrLlRFWFQ9IlRFWFQifSkoZHx8KGQ9e30pKTtjbGFzcyBme2NvbnN0cnVjdG9yKGspe3RoaXMudW5pcXVlSWQ9MDt0aGlzLnJvb3Q9a31leHBvcnRBc1N0cmluZygpe2NvbnN0IGs9dGhpcy5jb252ZXJ0KHRoaXMucm9vdCk7aWYoIWspcmV0dXJuIiI7Y29uc3QgdD10aGlzLmNyZWF0ZVJvb3RTdmcoKTt0LmFwcGVuZENoaWxkKGspO3JldHVybiB0Lm91dGVySFRNTH1jcmVhdGVVbmlxdWVJZCgpe3JldHVybmAkeyJjbGlwIn1fJHt0aGlzLnVuaXF1ZUlkKyt9YH1nZXRTaXplKCl7cmV0dXJuIHRoaXMucm9vdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1jcmVhdGVSb290U3ZnKCl7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdmciKSx0PXRoaXMuZ2V0U2l6ZSgpO2suc2V0QXR0cmlidXRlTlMoInN2ZyIsInZpZXdCb3giLGAwIDAgJHt0LndpZHRofSAke3QuaGVpZ2h0fWApOwprLnNldEF0dHJpYnV0ZSgieG1sbnMiLCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIpO3JldHVybiBrfWNvbnZlcnQoayl7bGV0IHQ9bnVsbDt2YXIgbD1rLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7aWYoay5ub2RlVHlwZSE9Tm9kZS5FTEVNRU5UX05PREV8fGwhPWQuRElWJiZsIT1kLlNWRyl0PWsuY2xvbmVOb2RlKCk7ZWxzZXt0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZC5HUk9VUCk7dmFyIHA9d2luZG93LmdldENvbXB1dGVkU3R5bGUoayksbT1wYXJzZUludChwLmxlZnQsMTApLG49cGFyc2VJbnQocC50b3AsMTApO2lmKG18fG4pbD10aGlzLmNyZWF0ZVVuaXF1ZUlkKCksdC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsYHRyYW5zbGF0ZSgke219LCAke259KWApLHQuc2V0QXR0cmlidXRlKCJjbGlwLXBhdGgiLGB1cmwoIyR7bH0pYCksbj1wYXJzZUludChwLmhlaWdodCwxMCksbT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJyZWN0IiksbS5zZXRBdHRyaWJ1dGUoIndpZHRoIiwKU3RyaW5nKHBhcnNlSW50KHAud2lkdGgsMTApKSksbS5zZXRBdHRyaWJ1dGUoImhlaWdodCIsU3RyaW5nKG4pKSxwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygic3ZnIiwiY2xpcFBhdGgiKSxwLmlkPWwscC5hcHBlbmRDaGlsZChtKSx0LmFwcGVuZENoaWxkKHApfUFycmF5LmZyb20oay5jaGlsZE5vZGVzKS5tYXAocT0+dGhpcy5jb252ZXJ0KHEpKS5maWx0ZXIoQm9vbGVhbikuZm9yRWFjaChxPT50LmFwcGVuZENoaWxkKHEpKTtyZXR1cm4gdC5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPT1kLkdST1VQJiYhdC5oYXNDaGlsZE5vZGVzKCl8fHRoaXMuc2hvdWxkT21pdE5vZGUoayk/bnVsbDp0aGlzLnN0cmlwQ2xhc3ModGhpcy50cmFuc2ZlclN0eWxlKGssdCkpfXN0cmlwQ2xhc3Moayl7ay5ub2RlVHlwZT09Tm9kZS5FTEVNRU5UX05PREUmJmsucmVtb3ZlQXR0cmlidXRlKCJjbGFzcyIpO3JldHVybiBrfXRyYW5zZmVyU3R5bGUoayx0KXtpZih0Lm5vZGVUeXBlIT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gdDsKY29uc3QgbD10Lm5vZGVOYW1lLnRvVXBwZXJDYXNlKCk7az13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShrKTtsPT1kLlRFWFQmJk9iamVjdC5hc3NpZ24odC5zdHlsZSx7Zm9udEZhbWlseTprLmZvbnRGYW1pbHksZm9udFNpemU6ay5mb250U2l6ZSxmb250V2VpZ2h0OmsuZm9udFdlaWdodH0pO2whPWQuR1JPVVAmJih0LnNldEF0dHJpYnV0ZSgiZmlsbCIsay5maWxsKSx0LnNldEF0dHJpYnV0ZSgic3Ryb2tlIixrLnN0cm9rZSksdC5zZXRBdHRyaWJ1dGUoInN0cm9rZS13aWR0aCIsay5zdHJva2VXaWR0aCkpOyIxIiE9ay5vcGFjaXR5JiZ0LnNldEF0dHJpYnV0ZSgib3BhY2l0eSIsay5vcGFjaXR5KTtyZXR1cm4gdH1zaG91bGRPbWl0Tm9kZSgpe3JldHVybiExfX1iLlBsb3R0YWJsZUV4cG9ydGVyPWY7Y2xhc3MgaCBleHRlbmRzIGZ7c2hvdWxkT21pdE5vZGUoayl7cmV0dXJuIGsubm9kZVR5cGU9PU5vZGUuRUxFTUVOVF9OT0RFP2suY2xhc3NMaXN0LmNvbnRhaW5zKCJzY2F0dGVyLXBsb3QiKToKITF9fWIuTGluZUNoYXJ0RXhwb3J0ZXI9aH0pKEdofHwoR2g9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyL3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIuaHRtbC5qcwooZnVuY3Rpb24oKXtjb25zdCBiPVtdLGQ9ZnVuY3Rpb24oKXtyZXR1cm4gXy50aHJvdHRsZShmdW5jdGlvbiBoKCl7aWYoMCE9Yi5sZW5ndGgpe3ZhciBrPWIuc2hpZnQoKTtrLmFjdGl2ZSYmKGsucmVkcmF3KCksay5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGU9ITEpO3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSgwKTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGgpfX0sMTAwKX0oKTtQb2x5bWVyKHtpczoidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIscHJvcGVydGllczp7YWN0aXZlOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9maXhCYWRTdGF0ZVdoZW5BY3RpdmUifSxkYXRhU2VyaWVzOkFycmF5LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxsb2dTY2FsZUFjdGl2ZTp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfbG9nU2NhbGVDaGFuZ2VkIn0seENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDpPYmplY3QseFR5cGU6U3RyaW5nLHlWYWx1ZUFjY2Vzc29yOk9iamVjdCxmaWxsQXJlYTpPYmplY3QsCnNtb290aGluZ0VuYWJsZWQ6Qm9vbGVhbixzbW9vdGhpbmdXZWlnaHQ6TnVtYmVyLHRvb2x0aXBDb2x1bW5zOkFycmF5LHRvb2x0aXBTb3J0aW5nTWV0aG9kOlN0cmluZyx0b29sdGlwUG9zaXRpb246U3RyaW5nLGlnbm9yZVlPdXRsaWVyczpCb29sZWFuLGRlZmF1bHRYUmFuZ2U6QXJyYXksZGVmYXVsdFlSYW5nZTpBcnJheSxzeW1ib2xGdW5jdGlvbjpPYmplY3QsY29sb3JTY2FsZTp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7c2NhbGU6cGYucnVuc0NvbG9yU2NhbGV9KX0sX3Jlc2V0RG9tYWluT25OZXh0TG9hZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfbWF5YmVSZW5kZXJlZEluQmFkU3RhdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxiZWhhdmlvcnM6W3FkLkRhdGFMb2FkZXJCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX2RhdGFTZXJpZXNDaGFuZ2VkKGRhdGFTZXJpZXMuKikiLCJfbG9hZEtleUNoYW5nZWQobG9hZEtleSkiXSxvbkxvYWRGaW5pc2goKXswPAp0aGlzLmRhdGFUb0xvYWQubGVuZ3RoJiZ0aGlzLl9yZXNldERvbWFpbk9uTmV4dExvYWQmJih0aGlzLl9yZXNldERvbWFpbk9uTmV4dExvYWQ9ITEsdGhpcy4kLmNoYXJ0LnJlc2V0RG9tYWluKCkpO3RoaXMucmVkcmF3KCl9LGRldGFjaGVkKCl7Y2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKX0sZXhwb3J0QXNTdmdTdHJpbmcoKXtyZXR1cm4gdGhpcy4kLmNoYXJ0LmdldEV4cG9ydGVyKCkuZXhwb3J0QXNTdHJpbmcoKX0scmVzZXREb21haW4oKXt0aGlzLiQuY2hhcnQucmVzZXREb21haW4oKX0sc2V0U2VyaWVzRGF0YShmLGgpe3RoaXMuJC5jaGFydC5zZXRTZXJpZXNEYXRhKGYsaCl9LHNldFNlcmllc01ldGFkYXRhKGYsaCl7dGhpcy4kLmNoYXJ0LnNldFNlcmllc01ldGFkYXRhKGYsaCl9LHJlZHJhdygpe2NhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JlZHJhd1JhZik7dGhpcy5fcmVkcmF3UmFmPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCk9Pnt0aGlzLmFjdGl2ZT8KdGhpcy4kLmNoYXJ0LnJlZHJhdygpOnRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSEwfSl9LF9sb2FkS2V5Q2hhbmdlZCgpe3RoaXMucmVzZXQoKTt0aGlzLl9yZXNldERvbWFpbk9uTmV4dExvYWQ9ITB9LF9kYXRhU2VyaWVzQ2hhbmdlZCgpe3RoaXMuJC5jaGFydC5zZXRWaXNpYmxlU2VyaWVzKHRoaXMuZGF0YVNlcmllcyl9LF9sb2dTY2FsZUNoYW5nZWQoZil7dGhpcy4kLmNoYXJ0LnlTY2FsZVR5cGU9Zj8ibG9nIjoibGluZWFyIjt0aGlzLnJlZHJhdygpfSxfZml4QmFkU3RhdGVXaGVuQWN0aXZlKCl7dGhpcy5hY3RpdmUmJnRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlJiYoYi5wdXNoKHRoaXMpLGQoKSl9LF9vbkNoYXJ0QXR0YWNoZWQoKXt0aGlzLmFjdGl2ZXx8KHRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSEwKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItZGlhbG9nLXNjcm9sbGFibGUvcGFwZXItZGlhbG9nLXNjcm9sbGFibGUuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItZGlhbG9nLXNjcm9sbGFibGUiLHByb3BlcnRpZXM6e2RpYWxvZ0VsZW1lbnQ6e3R5cGU6T2JqZWN0fX0sZ2V0IHNjcm9sbFRhcmdldCgpe3JldHVybiB0aGlzLiQuc2Nyb2xsYWJsZX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9lbnN1cmVUYXJnZXQoKTt0aGlzLmNsYXNzTGlzdC5hZGQoIm5vLXBhZGRpbmciKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9lbnN1cmVUYXJnZXQoKTtyZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy51cGRhdGVTY3JvbGxTdGF0ZS5iaW5kKHRoaXMpKX0sdXBkYXRlU2Nyb2xsU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLnRvZ2dsZUNsYXNzKCJpcy1zY3JvbGxlZCIsMDx0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3ApO3RoaXMudG9nZ2xlQ2xhc3MoImNhbi1zY3JvbGwiLHRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodDx0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxIZWlnaHQpO3RoaXMudG9nZ2xlQ2xhc3MoInNjcm9sbGVkLXRvLWJvdHRvbSIsCnRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcCt0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRIZWlnaHQ+PXRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbEhlaWdodCl9LF9lbnN1cmVUYXJnZXQ6ZnVuY3Rpb24oKXsodGhpcy5kaWFsb2dFbGVtZW50PXRoaXMuZGlhbG9nRWxlbWVudHx8dGhpcy5wYXJlbnRFbGVtZW50KSYmdGhpcy5kaWFsb2dFbGVtZW50LmJlaGF2aW9ycyYmMDw9dGhpcy5kaWFsb2dFbGVtZW50LmJlaGF2aW9ycy5pbmRleE9mKFBvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvckltcGwpPyh0aGlzLmRpYWxvZ0VsZW1lbnQuc2l6aW5nVGFyZ2V0PXRoaXMuc2Nyb2xsVGFyZ2V0LHRoaXMuc2Nyb2xsVGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoImZpdCIpKTp0aGlzLmRpYWxvZ0VsZW1lbnQmJnRoaXMuc2Nyb2xsVGFyZ2V0LmNsYXNzTGlzdC5hZGQoImZpdCIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLW1hcmtkb3duLXZpZXcvdGYtbWFya2Rvd24tdmlldy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1tYXJrZG93bi12aWV3Iixwcm9wZXJ0aWVzOntodG1sOnt0eXBlOlN0cmluZyx2YWx1ZToiIn19LGF0dGFjaGVkKCl7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+e3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5tYXJrZG93biwhMCl9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1jYXJkLWhlYWRpbmcvdXRpbC5qcwp2YXIgSGg7KGZ1bmN0aW9uKGIpe2Z1bmN0aW9uIGQoZil7aWYoIWYpcmV0dXJuIG51bGw7bGV0IGg9Zi5tYXRjaCgvXiMoWzAtOWEtZl17MSwyfSkoWzAtOWEtZl17MSwyfSkoWzAtOWEtZl17MSwyfSkkLyk7aWYoIWgpcmV0dXJuIG51bGw7aWYoND09Zi5sZW5ndGgpZm9yKGY9MTszPj1mO2YrKyloW2ZdKz1oW2ZdO3JldHVybltwYXJzZUludChoWzFdLDE2KSxwYXJzZUludChoWzJdLDE2KSxwYXJzZUludChoWzNdLDE2KV19Yi5mb3JtYXREYXRlPWZ1bmN0aW9uKGYpe3JldHVybiBmP2YudG9TdHJpbmcoKS5yZXBsYWNlKC9HTVQtXGQrIFwoKFteKV0rKVwpLywiJDEiKToiIn07Yi5waWNrVGV4dENvbG9yPWZ1bmN0aW9uKGYpe3JldHVybihmPWQoZikpPzEyNTxNYXRoLnJvdW5kKCgyOTkqZlswXSs1ODcqZlsxXSsxMTQqZlsyXSkvMUUzKT8iaW5oZXJpdCI6IiNlZWUiOiJpbmhlcml0In19KShIaHx8KEhoPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY2FyZC1oZWFkaW5nL3RmLWNhcmQtaGVhZGluZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1jYXJkLWhlYWRpbmciLHByb3BlcnRpZXM6e2Rpc3BsYXlOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx0YWc6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHJ1bjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZGVzY3JpcHRpb246e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGNvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfcnVuQmFja2dyb3VuZDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUnVuQmFja2dyb3VuZChjb2xvcikiLHJlYWRPbmx5OiEwLG9ic2VydmVyOiJfdXBkYXRlSGVhZGluZ1N0eWxlIn0sX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihjb2xvcikiLHJlYWRPbmx5OiEwLG9ic2VydmVyOiJfdXBkYXRlSGVhZGluZ1N0eWxlIn0sX25hbWVMYWJlbDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlTmFtZUxhYmVsKGRpc3BsYXlOYW1lLCB0YWcpIn0sX3RhZ0xhYmVsOnt0eXBlOlN0cmluZywKY29tcHV0ZWQ6Il9jb21wdXRlVGFnTGFiZWwoZGlzcGxheU5hbWUsIHRhZykifX0sX3VwZGF0ZUhlYWRpbmdTdHlsZSgpe3RoaXMudXBkYXRlU3R5bGVzKHsiLS10Zi1jYXJkLWhlYWRpbmctYmFja2dyb3VuZC1jb2xvciI6dGhpcy5fcnVuQmFja2dyb3VuZCwiLS10Zi1jYXJkLWhlYWRpbmctY29sb3IiOnRoaXMuX3J1bkNvbG9yfSl9LF9jb21wdXRlUnVuQmFja2dyb3VuZChiKXtyZXR1cm4gYnx8Im5vbmUifSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiBIaC5waWNrVGV4dENvbG9yKGIpfSxfY29tcHV0ZU5hbWVMYWJlbChiLGQpe3JldHVybiBifHxkfHwiIn0sX2NvbXB1dGVUYWdMYWJlbChiLGQpe3JldHVybiBkJiZkIT09Yj9kOiIifSxfdG9nZ2xlRGVzY3JpcHRpb25EaWFsb2coYil7dGhpcy4kLmRlc2NyaXB0aW9uRGlhbG9nLnBvc2l0aW9uVGFyZ2V0PWIudGFyZ2V0O3RoaXMuJC5kZXNjcmlwdGlvbkRpYWxvZy50b2dnbGUoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kYXNoYm9hcmQtY29tbW9uL3RmLWRvd25sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZG93bmxvYWRlciIscHJvcGVydGllczp7X3J1bjp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LHJ1bnM6QXJyYXksdGFnOlN0cmluZyx1cmxGbjpGdW5jdGlvbn0sX2NzdlVybChiLGQsZil7cmV0dXJuIGQ/dmMuYWRkUGFyYW1zKGYoYixkKSx7Zm9ybWF0OiJjc3YifSk6IiJ9LF9qc29uVXJsKGIsZCxmKXtyZXR1cm4gZD9mKGIsZCk6IiJ9LF9jc3ZOYW1lKGIsZCl7cmV0dXJuIGQ/YHJ1bi0ke2R9LXRhZy0ke2J9LmNzdmA6IiJ9LF9qc29uTmFtZShiLGQpe3JldHVybiBkP2BydW4tJHtkfS10YWctJHtifS5qc29uYDoiIn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zY2FsYXItZGFzaGJvYXJkL3RmLXNjYWxhci1jYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNjYWxhci1jYXJkIixwcm9wZXJ0aWVzOnt0YWc6U3RyaW5nLGRhdGFUb0xvYWQ6QXJyYXkseFR5cGU6U3RyaW5nLGFjdGl2ZTpCb29sZWFuLGlnbm9yZVlPdXRsaWVyczpCb29sZWFuLHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxzaG93RG93bkxpbmtzOkJvb2xlYW4sc21vb3RoaW5nRW5hYmxlZDpCb29sZWFuLHNtb290aGluZ1dlaWdodDpOdW1iZXIsdGFnTWV0YWRhdGE6T2JqZWN0LGNvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHRvb2x0aXBTb3J0aW5nTWV0aG9kOlN0cmluZyxfbG9hZERhdGFDYWxsYmFjazp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oYixkLGYpPT57Zj1mLm1hcChrPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqa1swXSksc3RlcDprWzFdLHNjYWxhcjprWzJdfSkpO2NvbnN0IGg9dGhpcy5fZ2V0U2VyaWVzTmFtZUZyb21EYXR1bShkKTtiLnNldFNlcmllc01ldGFkYXRhKGgsZCk7Yi5zZXRTZXJpZXNEYXRhKGgsCmYpfX0scmVhZE9ubHk6ITB9LGdldERhdGFMb2FkVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKHt0YWc6YixydW46ZH0pPT52Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgic2NhbGFycyIsIi9zY2FsYXJzIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6YixydW46ZH0pKX19LF9kb3dubG9hZFVybEZuOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKGIsZCk9PnRoaXMuZ2V0RGF0YUxvYWRVcmwoe3RhZzpiLHJ1bjpkfSl9fSxyZXF1ZXN0RGF0YTpGdW5jdGlvbixfZ2V0RGF0YUxvYWROYW1lOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIGI9PnRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oYil9fSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9sb2dTY2FsZUFjdGl2ZTpCb29sZWFuLF90b29sdGlwQ29sdW1uczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe2NvbnN0IGI9CkdoLkRFRkFVTFRfVE9PTFRJUF9DT0xVTU5TLnNsaWNlKCksZD1iLmZpbmRJbmRleChmPT4iTmFtZSI9PWYudGl0bGUpO2Iuc3BsaWNlKGQsMSx7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmY9PntmPWYuZGF0YXNldC5tZXRhZGF0YSgpLm1ldGE7cmV0dXJuIHRoaXMuX2dldFNlcmllc0Rpc3BsYXlOYW1lRnJvbURhdHVtKGYpfX0pO3JldHVybiBifX19LHJlbG9hZCgpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZWxvYWQoKX0scmVkcmF3KCl7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9LF90b2dnbGVMb2dTY2FsZSgpe3RoaXMuc2V0KCJfbG9nU2NhbGVBY3RpdmUiLCF0aGlzLl9sb2dTY2FsZUFjdGl2ZSl9LF9yZXNldERvbWFpbigpe2NvbnN0IGI9dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpOwpiJiZiLnJlc2V0RG9tYWluKCl9LF91cGRhdGVEb3dubG9hZExpbmsoKXtjb25zdCBiPXRoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5leHBvcnRBc1N2Z1N0cmluZygpO3RoaXMuJCQoIiNzdmdMaW5rIikuaHJlZj1gZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwke2J0b2EoYil9YH0sX3J1bnNGcm9tRGF0YShiKXtyZXR1cm4gYi5tYXAoZD0+ZC5ydW4pfSxfZ2V0RGF0YVNlcmllcygpe3JldHVybiB0aGlzLmRhdGFUb0xvYWQubWFwKGI9PnRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oYikpfSxfZ2V0U2VyaWVzTmFtZUZyb21EYXR1bSh7cnVuOmIsZXhwZXJpbWVudDpkPXtuYW1lOiJfZGVmYXVsdCJ9fSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KFtkLm5hbWUsYl0pfSxfZ2V0U2VyaWVzRGlzcGxheU5hbWVGcm9tRGF0dW0oYil7cmV0dXJuIGIucnVufSxfZ2V0Q29sb3JTY2FsZSgpe3JldHVybiBudWxsIT09dGhpcy5jb2xvclNjYWxlP3RoaXMuY29sb3JTY2FsZToKe3NjYWxlOmI9PntbLGJdPUpTT04ucGFyc2UoYik7cmV0dXJuIHBmLnJ1bnNDb2xvclNjYWxlKGIpfX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1yYW5nZS1iZWhhdmlvci9pcm9uLXJhbmdlLWJlaGF2aW9yLmh0bWwuanMKUG9seW1lci5Jcm9uUmFuZ2VCZWhhdmlvcj17cHJvcGVydGllczp7dmFsdWU6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sbWluOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sbWF4Ont0eXBlOk51bWJlcix2YWx1ZToxMDAsbm90aWZ5OiEwfSxzdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxLG5vdGlmeTohMH0scmF0aW86e3R5cGU6TnVtYmVyLHZhbHVlOjAscmVhZE9ubHk6ITAsbm90aWZ5OiEwfX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZSh2YWx1ZSwgbWluLCBtYXgsIHN0ZXApIl0sX2NhbGNSYXRpbzpmdW5jdGlvbihiKXtyZXR1cm4odGhpcy5fY2xhbXBWYWx1ZShiKS10aGlzLm1pbikvKHRoaXMubWF4LXRoaXMubWluKX0sX2NsYW1wVmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuIE1hdGgubWluKHRoaXMubWF4LE1hdGgubWF4KHRoaXMubWluLHRoaXMuX2NhbGNTdGVwKGIpKSl9LF9jYWxjU3RlcDpmdW5jdGlvbihiKXtiPXBhcnNlRmxvYXQoYik7CmlmKCF0aGlzLnN0ZXApcmV0dXJuIGI7Yj1NYXRoLnJvdW5kKChiLXRoaXMubWluKS90aGlzLnN0ZXApO3JldHVybiAxPnRoaXMuc3RlcD9iLygxL3RoaXMuc3RlcCkrdGhpcy5taW46Yip0aGlzLnN0ZXArdGhpcy5taW59LF92YWxpZGF0ZVZhbHVlOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlKTt0aGlzLnZhbHVlPXRoaXMub2xkVmFsdWU9aXNOYU4oYik/dGhpcy5vbGRWYWx1ZTpiO3JldHVybiB0aGlzLnZhbHVlIT09Yn0sX3VwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX3ZhbGlkYXRlVmFsdWUoKTt0aGlzLl9zZXRSYXRpbygxMDAqdGhpcy5fY2FsY1JhdGlvKHRoaXMudmFsdWUpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXByb2dyZXNzL3BhcGVyLXByb2dyZXNzLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXByb2dyZXNzIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJhbmdlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NlY29uZGFyeVByb2dyZXNzOnt0eXBlOk51bWJlcix2YWx1ZTowfSxzZWNvbmRhcnlSYXRpbzp7dHlwZTpOdW1iZXIsdmFsdWU6MCxyZWFkT25seTohMH0saW5kZXRlcm1pbmF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfdG9nZ2xlSW5kZXRlcm1pbmF0ZSJ9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfZGlzYWJsZWRDaGFuZ2VkIn19LG9ic2VydmVyczpbIl9wcm9ncmVzc0NoYW5nZWQoc2Vjb25kYXJ5UHJvZ3Jlc3MsIHZhbHVlLCBtaW4sIG1heCwgaW5kZXRlcm1pbmF0ZSkiXSxob3N0QXR0cmlidXRlczp7cm9sZToicHJvZ3Jlc3NiYXIifSxfdG9nZ2xlSW5kZXRlcm1pbmF0ZTpmdW5jdGlvbihiKXt0aGlzLnRvZ2dsZUNsYXNzKCJpbmRldGVybWluYXRlIiwKYix0aGlzLiQucHJpbWFyeVByb2dyZXNzKX0sX3RyYW5zZm9ybVByb2dyZXNzOmZ1bmN0aW9uKGIsZCl7Yi5zdHlsZS50cmFuc2Zvcm09Yi5zdHlsZS53ZWJraXRUcmFuc2Zvcm09InNjYWxlWCgiK2QvMTAwKyIpIn0sX21haW5SYXRpb0NoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fdHJhbnNmb3JtUHJvZ3Jlc3ModGhpcy4kLnByaW1hcnlQcm9ncmVzcyxiKX0sX3Byb2dyZXNzQ2hhbmdlZDpmdW5jdGlvbihiLGQsZixoLGspe2I9dGhpcy5fY2xhbXBWYWx1ZShiKTtkPXRoaXMuX2NsYW1wVmFsdWUoZCk7dmFyIHQ9MTAwKnRoaXMuX2NhbGNSYXRpbyhiKSxsPTEwMCp0aGlzLl9jYWxjUmF0aW8oZCk7dGhpcy5fc2V0U2Vjb25kYXJ5UmF0aW8odCk7dGhpcy5fdHJhbnNmb3JtUHJvZ3Jlc3ModGhpcy4kLnNlY29uZGFyeVByb2dyZXNzLHQpO3RoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5wcmltYXJ5UHJvZ3Jlc3MsbCk7dGhpcy5zZWNvbmRhcnlQcm9ncmVzcz1iO2s/dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciKToKdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciLGQpO3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWluIixmKTt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1heCIsaCl9LF9kaXNhYmxlZENoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLGI/InRydWUiOiJmYWxzZSIpfSxfaGlkZVNlY29uZGFyeVByb2dyZXNzOmZ1bmN0aW9uKGIpe3JldHVybiAwPT09Yn19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci1zbGlkZXIvcGFwZXItc2xpZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXNsaWRlciIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25BMTF5S2V5c0JlaGF2aW9yLFBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3IsUG9seW1lci5QYXBlcklua3lGb2N1c0JlaGF2aW9yLFBvbHltZXIuSXJvblJhbmdlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3NuYXBzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxwaW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LHNlY29uZGFyeVByb2dyZXNzOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMCxvYnNlcnZlcjoiX3NlY29uZGFyeVByb2dyZXNzQ2hhbmdlZCJ9LGVkaXRhYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGltbWVkaWF0ZVZhbHVlOnt0eXBlOk51bWJlcix2YWx1ZTowLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sbWF4TWFya2Vyczp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LGV4cGFuZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlYWRPbmx5OiEwfSwKaWdub3JlQmFyVG91Y2g6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZHJhZ2dpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMCxub3RpZnk6ITB9LHRyYW5zaXRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH0sbWFya2Vyczp7dHlwZTpBcnJheSxyZWFkT25seTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LG9ic2VydmVyczpbIl91cGRhdGVLbm9iKHZhbHVlLCBtaW4sIG1heCwgc25hcHMsIHN0ZXApIiwiX3ZhbHVlQ2hhbmdlZCh2YWx1ZSkiLCJfaW1tZWRpYXRlVmFsdWVDaGFuZ2VkKGltbWVkaWF0ZVZhbHVlKSIsIl91cGRhdGVNYXJrZXJzKG1heE1hcmtlcnMsIG1pbiwgbWF4LCBzbmFwcykiXSxob3N0QXR0cmlidXRlczp7cm9sZToic2xpZGVyIix0YWJpbmRleDowfSxrZXlCaW5kaW5nczp7bGVmdDoiX2xlZnRLZXkiLHJpZ2h0OiJfcmlnaHRLZXkiLCJkb3duIHBhZ2Vkb3duIGhvbWUiOiJfZGVjcmVtZW50S2V5IiwidXAgcGFnZXVwIGVuZCI6Il9pbmNyZW1lbnRLZXkifSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmlnbm9yZUJhclRvdWNoJiZQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKHRoaXMuJC5zbGlkZXJCYXIsImF1dG8iKX0saW5jcmVtZW50OmZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUrdGhpcy5zdGVwKX0sZGVjcmVtZW50OmZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUtdGhpcy5zdGVwKX0sX3VwZGF0ZUtub2I6ZnVuY3Rpb24oYixkLGYpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWluIixkKTt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1heCIsZik7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciLGIpO3RoaXMuX3Bvc2l0aW9uS25vYigxMDAqdGhpcy5fY2FsY1JhdGlvKGIpKX0sX3ZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgidmFsdWUtY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2ltbWVkaWF0ZVZhbHVlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZHJhZ2dpbmc/CnRoaXMuZmlyZSgiaW1tZWRpYXRlLXZhbHVlLWNoYW5nZSIse2NvbXBvc2VkOiEwfSk6dGhpcy52YWx1ZT10aGlzLmltbWVkaWF0ZVZhbHVlfSxfc2Vjb25kYXJ5UHJvZ3Jlc3NDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5zZWNvbmRhcnlQcm9ncmVzcz10aGlzLl9jbGFtcFZhbHVlKHRoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3MpfSxfZXhwYW5kS25vYjpmdW5jdGlvbigpe3RoaXMuX3NldEV4cGFuZCghMCl9LF9yZXNldEtub2I6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbERlYm91bmNlcigiZXhwYW5kS25vYiIpO3RoaXMuX3NldEV4cGFuZCghMSl9LF9wb3NpdGlvbktub2I6ZnVuY3Rpb24oYil7dGhpcy5fc2V0SW1tZWRpYXRlVmFsdWUodGhpcy5fY2FsY1N0ZXAodGhpcy5fY2FsY0tub2JQb3NpdGlvbihiKSkpO3RoaXMuX3NldFJhdGlvKDEwMCp0aGlzLl9jYWxjUmF0aW8odGhpcy5pbW1lZGlhdGVWYWx1ZSkpO3RoaXMuJC5zbGlkZXJLbm9iLnN0eWxlLmxlZnQ9dGhpcy5yYXRpbysiJSI7dGhpcy5kcmFnZ2luZyYmCih0aGlzLl9rbm9ic3RhcnR4PXRoaXMucmF0aW8qdGhpcy5fdy8xMDAsdGhpcy50cmFuc2xhdGUzZCgwLDAsMCx0aGlzLiQuc2xpZGVyS25vYikpfSxfY2FsY0tub2JQb3NpdGlvbjpmdW5jdGlvbihiKXtyZXR1cm4odGhpcy5tYXgtdGhpcy5taW4pKmIvMTAwK3RoaXMubWlufSxfb25UcmFjazpmdW5jdGlvbihiKXtiLnN0b3BQcm9wYWdhdGlvbigpO3N3aXRjaChiLmRldGFpbC5zdGF0ZSl7Y2FzZSAic3RhcnQiOnRoaXMuX3RyYWNrU3RhcnQoYik7YnJlYWs7Y2FzZSAidHJhY2siOnRoaXMuX3RyYWNrWChiKTticmVhaztjYXNlICJlbmQiOnRoaXMuX3RyYWNrRW5kKCl9fSxfdHJhY2tTdGFydDpmdW5jdGlvbigpe3RoaXMuX3NldFRyYW5zaXRpbmcoITEpO3RoaXMuX3c9dGhpcy4kLnNsaWRlckJhci5vZmZzZXRXaWR0aDt0aGlzLl9rbm9ic3RhcnR4PXRoaXMuX3N0YXJ0eD10aGlzLl94PXRoaXMucmF0aW8qdGhpcy5fdy8xMDA7dGhpcy5fbWlueD0tdGhpcy5fc3RhcnR4O3RoaXMuX21heHg9CnRoaXMuX3ctdGhpcy5fc3RhcnR4O3RoaXMuJC5zbGlkZXJLbm9iLmNsYXNzTGlzdC5hZGQoImRyYWdnaW5nIik7dGhpcy5fc2V0RHJhZ2dpbmcoITApfSxfdHJhY2tYOmZ1bmN0aW9uKGIpe3RoaXMuZHJhZ2dpbmd8fHRoaXMuX3RyYWNrU3RhcnQoYik7dGhpcy5feD10aGlzLl9zdGFydHgrTWF0aC5taW4odGhpcy5fbWF4eCxNYXRoLm1heCh0aGlzLl9taW54LGIuZGV0YWlsLmR4Kih0aGlzLl9pc1JUTD8tMToxKSkpO3RoaXMuX3NldEltbWVkaWF0ZVZhbHVlKHRoaXMuX2NhbGNTdGVwKHRoaXMuX2NhbGNLbm9iUG9zaXRpb24odGhpcy5feC90aGlzLl93KjEwMCkpKTt0aGlzLnRyYW5zbGF0ZTNkKHRoaXMuX2NhbGNSYXRpbyh0aGlzLmltbWVkaWF0ZVZhbHVlKSp0aGlzLl93LXRoaXMuX2tub2JzdGFydHgrInB4IiwwLDAsdGhpcy4kLnNsaWRlcktub2IpfSxfdHJhY2tFbmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuc2xpZGVyS25vYi5zdHlsZTt0aGlzLiQuc2xpZGVyS25vYi5jbGFzc0xpc3QucmVtb3ZlKCJkcmFnZ2luZyIpOwp0aGlzLl9zZXREcmFnZ2luZyghMSk7dGhpcy5fcmVzZXRLbm9iKCk7dGhpcy52YWx1ZT10aGlzLmltbWVkaWF0ZVZhbHVlO2IudHJhbnNmb3JtPWIud2Via2l0VHJhbnNmb3JtPSIiO3RoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0sX2tub2Jkb3duOmZ1bmN0aW9uKGIpe3RoaXMuX2V4cGFuZEtub2IoKTtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5mb2N1cygpfSxfYmFydHJhY2s6ZnVuY3Rpb24oYil7dGhpcy5fYWxsb3dCYXJFdmVudChiKSYmdGhpcy5fb25UcmFjayhiKX0sX2JhcmNsaWNrOmZ1bmN0aW9uKGIpe3RoaXMuX3c9dGhpcy4kLnNsaWRlckJhci5vZmZzZXRXaWR0aDt2YXIgZD10aGlzLiQuc2xpZGVyQmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Q9KGIuZGV0YWlsLngtZC5sZWZ0KS90aGlzLl93KjEwMDt0aGlzLl9pc1JUTCYmKGQ9MTAwLWQpO3ZhciBmPXRoaXMucmF0aW87dGhpcy5fc2V0VHJhbnNpdGluZyghMCk7dGhpcy5fcG9zaXRpb25Lbm9iKGQpOwpmPT09dGhpcy5yYXRpbyYmdGhpcy5fc2V0VHJhbnNpdGluZyghMSk7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuZmlyZSgiY2hhbmdlIix7Y29tcG9zZWQ6ITB9KX0pO2IucHJldmVudERlZmF1bHQoKTt0aGlzLmZvY3VzKCl9LF9iYXJkb3duOmZ1bmN0aW9uKGIpe3RoaXMuX2FsbG93QmFyRXZlbnQoYikmJih0aGlzLmRlYm91bmNlKCJleHBhbmRLbm9iIix0aGlzLl9leHBhbmRLbm9iLDYwKSx0aGlzLl9iYXJjbGljayhiKSl9LF9rbm9iVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihiKXtiLnRhcmdldD09PXRoaXMuJC5zbGlkZXJLbm9iJiZ0aGlzLl9zZXRUcmFuc2l0aW5nKCExKX0sX3VwZGF0ZU1hcmtlcnM6ZnVuY3Rpb24oYixkLGYsaCl7aHx8dGhpcy5fc2V0TWFya2VycyhbXSk7ZD1NYXRoLnJvdW5kKChmLWQpL3RoaXMuc3RlcCk7ZD5iJiYoZD1iKTtpZigwPmR8fCFpc0Zpbml0ZShkKSlkPTA7dGhpcy5fc2V0TWFya2VycyhBcnJheShkKSl9LF9tZXJnZUNsYXNzZXM6ZnVuY3Rpb24oYil7cmV0dXJuIE9iamVjdC5rZXlzKGIpLmZpbHRlcihmdW5jdGlvbihkKXtyZXR1cm4gYltkXX0pLmpvaW4oIiAiKX0sCl9nZXRDbGFzc05hbWVzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21lcmdlQ2xhc3Nlcyh7ZGlzYWJsZWQ6dGhpcy5kaXNhYmxlZCxwaW46dGhpcy5waW4sc25hcHM6dGhpcy5zbmFwcyxyaW5nOnRoaXMuaW1tZWRpYXRlVmFsdWU8PXRoaXMubWluLGV4cGFuZDp0aGlzLmV4cGFuZCxkcmFnZ2luZzp0aGlzLmRyYWdnaW5nLHRyYW5zaXRpbmc6dGhpcy50cmFuc2l0aW5nLGVkaXRhYmxlOnRoaXMuZWRpdGFibGV9KX0sX2FsbG93QmFyRXZlbnQ6ZnVuY3Rpb24oYil7cmV0dXJuIXRoaXMuaWdub3JlQmFyVG91Y2h8fGIuZGV0YWlsLnNvdXJjZUV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudH0sZ2V0IF9pc1JUTCgpe3ZvaWQgMD09PXRoaXMuX19pc1JUTCYmKHRoaXMuX19pc1JUTD0icnRsIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpcmVjdGlvbik7cmV0dXJuIHRoaXMuX19pc1JUTH0sX2xlZnRLZXk6ZnVuY3Rpb24oYil7dGhpcy5faXNSVEw/dGhpcy5faW5jcmVtZW50S2V5KGIpOgp0aGlzLl9kZWNyZW1lbnRLZXkoYil9LF9yaWdodEtleTpmdW5jdGlvbihiKXt0aGlzLl9pc1JUTD90aGlzLl9kZWNyZW1lbnRLZXkoYik6dGhpcy5faW5jcmVtZW50S2V5KGIpfSxfaW5jcmVtZW50S2V5OmZ1bmN0aW9uKGIpe3RoaXMuZGlzYWJsZWR8fCgiZW5kIj09PWIuZGV0YWlsLmtleT90aGlzLnZhbHVlPXRoaXMubWF4OnRoaXMuaW5jcmVtZW50KCksdGhpcy5maXJlKCJjaGFuZ2UiKSxiLnByZXZlbnREZWZhdWx0KCkpfSxfZGVjcmVtZW50S2V5OmZ1bmN0aW9uKGIpe3RoaXMuZGlzYWJsZWR8fCgiaG9tZSI9PT1iLmRldGFpbC5rZXk/dGhpcy52YWx1ZT10aGlzLm1pbjp0aGlzLmRlY3JlbWVudCgpLHRoaXMuZmlyZSgiY2hhbmdlIiksYi5wcmV2ZW50RGVmYXVsdCgpKX0sX2NoYW5nZVZhbHVlOmZ1bmN0aW9uKGIpe3RoaXMudmFsdWU9Yi50YXJnZXQudmFsdWU7dGhpcy5maXJlKCJjaGFuZ2UiLHtjb21wb3NlZDohMH0pfSxfaW5wdXRLZXlEb3duOmZ1bmN0aW9uKGIpe2Iuc3RvcFByb3BhZ2F0aW9uKCl9LApfY3JlYXRlUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5zbGlkZXJLbm9iO3JldHVybiBQb2x5bWVyLlBhcGVySW5reUZvY3VzQmVoYXZpb3JJbXBsLl9jcmVhdGVSaXBwbGUuY2FsbCh0aGlzKX0sX2ZvY3VzZWRDaGFuZ2VkOmZ1bmN0aW9uKGIpe2ImJnRoaXMuZW5zdXJlUmlwcGxlKCk7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuX3JpcHBsZS5zdHlsZS5kaXNwbGF5PWI/IiI6Im5vbmUiLHRoaXMuX3JpcHBsZS5ob2xkRG93bj1iKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zY2FsYXItZGFzaGJvYXJkL3RmLXNtb290aGluZy1pbnB1dC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1zbW9vdGhpbmctaW5wdXQiLHByb3BlcnRpZXM6e3N0ZXA6TnVtYmVyLG1heDpOdW1iZXIsbWluOk51bWJlcix3ZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOi42LG5vdGlmeTohMH0sX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyOnt0eXBlOk51bWJlcixub3RpZnk6ITAsb2JzZXJ2ZXI6Il9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlckNoYW5nZWQifSxfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Ont0eXBlOlN0cmluZyxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXRDaGFuZ2VkIn19LF91cGRhdGVXZWlnaHQ6Xy5kZWJvdW5jZShmdW5jdGlvbihiKXt0aGlzLndlaWdodD1ifSwyNTApLF9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlckNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ9dGhpcy5faW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXIudG9TdHJpbmcoKTsKdGhpcy5fdXBkYXRlV2VpZ2h0LmNhbGwodGhpcyx0aGlzLl9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcil9LF9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXRDaGFuZ2VkOmZ1bmN0aW9uKCl7MD4rdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0P3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dD0iMCI6MTwrdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0JiYodGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0PSIxIik7dmFyIGI9K3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dDtpc05hTihiKXx8dGhpcy5fdXBkYXRlV2VpZ2h0LmNhbGwodGhpcyxiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1zY2FsYXItZGFzaGJvYXJkL3RmLXNjYWxhci1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtc2NhbGFyLWRhc2hib2FyZCIscHJvcGVydGllczp7X3Nob3dEb3dubG9hZExpbmtzOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOnBkLmdldEJvb2xlYW5Jbml0aWFsaXplcigiX3Nob3dEb3dubG9hZExpbmtzIix7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLG9ic2VydmVyOiJfc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlciJ9LF9zbW9vdGhpbmdXZWlnaHQ6e3R5cGU6TnVtYmVyLG5vdGlmeTohMCx2YWx1ZTpwZC5nZXROdW1iZXJJbml0aWFsaXplcigiX3Ntb290aGluZ1dlaWdodCIse2RlZmF1bHRWYWx1ZTouNn0pLG9ic2VydmVyOiJfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXIifSxfc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZVNtb290aGluZ0VuYWJsZWQoX3Ntb290aGluZ1dlaWdodCkifSxfaWdub3JlWU91dGxpZXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6cGQuZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCJfaWdub3JlWU91dGxpZXJzIiwKe2RlZmF1bHRWYWx1ZTohMCx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxvYnNlcnZlcjoiX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyIn0sX3hUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpyZy5YVHlwZS5TVEVQfSxfc2VsZWN0ZWRSdW5zOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3J1blRvVGFnSW5mbzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY2F0ZWdvcmllc0RvbVJlYWR5OkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdfSxfZ2V0Q2F0ZWdvcnlJdGVtS2V5Ont0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT5iPT5iLnRhZ30sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyKDUwKX19LGJlaGF2aW9yczpbcWQuQXJyYXlVcGRhdGVIZWxwZXJdLG9ic2VydmVyczpbIl91cGRhdGVDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIl0sCl9zaG93RG93bmxvYWRMaW5rc09ic2VydmVyOnBkLmdldEJvb2xlYW5PYnNlcnZlcigiX3Nob3dEb3dubG9hZExpbmtzIix7ZGVmYXVsdFZhbHVlOiExLHVzZUxvY2FsU3RvcmFnZTohMH0pLF9zbW9vdGhpbmdXZWlnaHRPYnNlcnZlcjpwZC5nZXROdW1iZXJPYnNlcnZlcigiX3Ntb290aGluZ1dlaWdodCIse2RlZmF1bHRWYWx1ZTouNn0pLF9pZ25vcmVZT3V0bGllcnNPYnNlcnZlcjpwZC5nZXRCb29sZWFuT2JzZXJ2ZXIoIl9pZ25vcmVZT3V0bGllcnMiLHtkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSksX2NvbXB1dGVTbW9vdGhpbmdFbmFibGVkKGIpe3JldHVybiAwPGJ9LF9nZXRDYXRlZ29yeUtleShiKXtyZXR1cm4gYi5tZXRhZGF0YS50eXBlPT0kYy5DYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFM/IiI6Yi5uYW1lfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT4Ke3RoaXMuX3JlbG9hZENoYXJ0cygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJzY2FsYXJzIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxoPT5PYmplY3Qua2V5cyhoKSk7Zj12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfcmVsb2FkQ2hhcnRzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLXNjYWxhci1jYXJkIikuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfdXBkYXRlQ2F0ZWdvcmllcyhiLGQsZil7Yj1fLm1hcFZhbHVlcyhiLGg9Pk9iamVjdC5rZXlzKGgpKTsKZD0kYy5jYXRlZ29yaXplVGFncyhiLGQsZik7ZC5mb3JFYWNoKGg9PntoLml0ZW1zPWguaXRlbXMubWFwKGs9Pih7dGFnOmsudGFnLHNlcmllczprLnJ1bnMubWFwKHQ9Pih7cnVuOnQsdGFnOmsudGFnfSkpfSkpfSk7dGhpcy51cGRhdGVBcnJheVByb3AoIl9jYXRlZ29yaWVzIixkLHRoaXMuX2dldENhdGVnb3J5S2V5KX0sX3RhZ01ldGFkYXRhKGIsZCxmKXtjb25zdCBoPWYudGFnLGs9e307Zi5zZXJpZXMuZm9yRWFjaCgoe3J1bjpwfSk9PntrW3BdPWRbcF1baF19KTtmPWgucmVwbGFjZSgvXC9zY2FsYXJfc3VtbWFyeSQvLCIiKTtsZXQge2Rlc2NyaXB0aW9uOnQsZGlzcGxheU5hbWU6bH09cmYuYWdncmVnYXRlVGFnSW5mbyhrLGYpO2IubWV0YWRhdGEudHlwZT09JGMuQ2F0ZWdvcnlUeXBlLlBSRUZJWF9HUk9VUCYmbC5zdGFydHNXaXRoKGIubmFtZSsiLyIpJiYobD1sLnNsaWNlKGIubmFtZS5sZW5ndGgrMSkpO3JldHVybntkZXNjcmlwdGlvbjp0LGRpc3BsYXlOYW1lOmx9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItaGVscGVycy5qcwp2YXIgVGk7CihmdW5jdGlvbihiKXtjbGFzcyBke2NvbnN0cnVjdG9yKGgsayx0LGwscCl7dGhpcy5ydW49aDt0aGlzLnRhZz1rO3RoaXMubmFtZT10O3RoaXMuc2NhbGFyRGF0YT1sO3RoaXMuc3ltYm9sPXB9Z2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9c2V0RGF0YShoKXt0aGlzLnNjYWxhckRhdGE9aH1nZXREYXRhKCl7cmV0dXJuIHRoaXMuc2NhbGFyRGF0YX1nZXRSdW4oKXtyZXR1cm4gdGhpcy5ydW59Z2V0VGFnKCl7cmV0dXJuIHRoaXMudGFnfWdldFN5bWJvbCgpe3JldHVybiB0aGlzLnN5bWJvbH19Yi5EYXRhU2VyaWVzPWQ7Yi5nZW5lcmF0ZURhdGFTZXJpZXNOYW1lPWZ1bmN0aW9uKGgsayl7cmV0dXJuYCR7a30gKCR7aH0pYH07Y2xhc3MgZntjb25zdHJ1Y3RvcihoKXt0aGlzLnJ1bkJhc2VkQ29sb3JTY2FsZT1ofXNjYWxlKGgpe3JldHVybiB0aGlzLnJ1bkJhc2VkQ29sb3JTY2FsZS5zY2FsZSh0aGlzLnBhcnNlUnVuTmFtZShoKSl9cGFyc2VSdW5OYW1lKGgpe3JldHVybihoPWgubWF0Y2goL1woKC4qKVwpJC8pKT8KaFsxXToiIn19Yi5EYXRhU2VyaWVzQ29sb3JTY2FsZT1mfSkoVGl8fChUaT17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWN1c3RvbS1zY2FsYXItZGFzaGJvYXJkL3RmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZCIscHJvcGVydGllczp7cnVuczpBcnJheSx4VHlwZTpTdHJpbmcsYWN0aXZlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVhZE9ubHk6ITB9LHRpdGxlOlN0cmluZyxtYXJnaW5DaGFydFNlcmllczpBcnJheSxpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixyZXF1ZXN0TWFuYWdlcjpPYmplY3Qsc2hvd0Rvd25sb2FkTGlua3M6Qm9vbGVhbix0YWdNZXRhZGF0YTpPYmplY3QsdG9vbHRpcFNvcnRpbmdNZXRob2Q6U3RyaW5nLF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpuZXcgVGkuRGF0YVNlcmllc0NvbG9yU2NhbGUoe3NjYWxlOnBmLnJ1bnNDb2xvclNjYWxlfSkscmVhZE9ubHk6ITB9LF90YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVRhZ0ZpbHRlcihtYXJnaW5DaGFydFNlcmllcykifSxfdGFnRmlsdGVySW52YWxpZDpCb29sZWFuLF9uYW1lVG9EYXRhU2VyaWVzOnt0eXBlOk9iamVjdCwKdmFsdWU6KCk9Pih7fSl9LF9zZXJpZXNOYW1lczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlU2VyaWVzTmFtZXMoX25hbWVUb0RhdGFTZXJpZXMsIHJ1bnMpIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfbG9nU2NhbGVBY3RpdmU6Qm9vbGVhbixfZGF0YVVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBiPT57Y29uc3QgZD10aGlzLl90YWdGaWx0ZXI7cmV0dXJuIHZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvc2NhbGFycyIpLHt0YWc6ZCxydW46Yn0pfX19LF9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9tYXRjaGVzTGlzdE9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfdGl0bGVEaXNwbGF5U3RyaW5nOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUaXRsZURpc3BsYXlTdHJpbmcodGl0bGUpIn0sCl9maWxsQXJlYTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6e2xvd2VyQWNjZXNzb3I6Yj0+Yi5sb3dlcixoaWdoZXJBY2Nlc3NvcjpiPT5iLnVwcGVyfX0sX3Rvb2x0aXBDb2x1bW5zOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7Y29uc3QgYj1yZy5tdWx0aXNjYWxlRm9ybWF0dGVyKHJnLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OKSxkPWY9PmlzTmFOKGYpPyJOYU4iOmIoZik7cmV0dXJuW3t0aXRsZToiTmFtZSIsZXZhbHVhdGU6Zj0+Zi5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZX0se3RpdGxlOiJWYWx1ZSIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLnNjYWxhcil9LHt0aXRsZToiTG93ZXIgTWFyZ2luIixldmFsdWF0ZTpmPT5kKGYuZGF0dW0ubG93ZXIpfSx7dGl0bGU6IlVwcGVyIE1hcmdpbiIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLnVwcGVyKX0se3RpdGxlOiJTdGVwIixldmFsdWF0ZTpmPT5yZy5zdGVwRm9ybWF0dGVyKGYuZGF0dW0uc3RlcCl9LHt0aXRsZToiVGltZSIsCmV2YWx1YXRlOmY9PnJnLnRpbWVGb3JtYXR0ZXIoZi5kYXR1bS53YWxsX3RpbWUpfSx7dGl0bGU6IlJlbGF0aXZlIixldmFsdWF0ZTpmPT5yZy5yZWxhdGl2ZUZvcm1hdHRlcihyZy5yZWxhdGl2ZUFjY2Vzc29yKGYuZGF0dW0sLTEsZi5kYXRhc2V0KSl9XX19LF9taXNzaW5nVGFnczp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3N0ZXBzTWlzbWF0Y2g6T2JqZWN0fSxvYnNlcnZlcnM6WyJfdXBkYXRlQ2hhcnQoX25hbWVUb0RhdGFTZXJpZXMpIiwiX3JlZnJlc2hEYXRhU2VyaWVzKF90YWdGaWx0ZXIpIl0scmVsb2FkKCl7dGhpcy4kLmxvYWRlci5yZWxvYWQoKX0scmVkcmF3KCl7dGhpcy4kLmxvYWRlci5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfSxfdG9nZ2xlTG9nU2NhbGUoKXt0aGlzLnNldCgiX2xvZ1NjYWxlQWN0aXZlIiwKIXRoaXMuX2xvZ1NjYWxlQWN0aXZlKX0sX3Jlc2V0RG9tYWluKCl7Y29uc3QgYj10aGlzLiQubG9hZGVyO2ImJmIucmVzZXREb21haW4oKX0sX2NzdlVybChiLGQpe2lmKCFkKXJldHVybiIiO2I9dGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCk7cmV0dXJuIHZjLmFkZFBhcmFtcyhiLHtmb3JtYXQ6ImNzdiJ9KX0sX2pzb25VcmwoYixkKXtpZighZClyZXR1cm4iIjtiPXRoaXMuX2Rvd25sb2FkRGF0YVVybChiLGQpO3JldHVybiB2Yy5hZGRQYXJhbXMoYix7Zm9ybWF0OiJqc29uIn0pfSxfZG93bmxvYWREYXRhVXJsKGIsZCl7Yj1iW2RdO2I9e3RhZzpiLmdldFRhZygpLHJ1bjpiLmdldFJ1bigpfTtyZXR1cm4gdmMuYWRkUGFyYW1zKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9kb3dubG9hZF9kYXRhIiksYil9LF9jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKGIpe3JldHVybihkLGYsaCk9PntpZihoLnJlZ2V4X3ZhbGlkKXt2YXIgaz1fLmNsb25lKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLAp0PVtdO18uZm9yRWFjaChiLGw9Pnt2YXIgcD0hMSxtPWgudGFnX3RvX2V2ZW50c1tsLnZhbHVlXTtjb25zdCBuPWgudGFnX3RvX2V2ZW50c1tsLmxvd2VyXSxxPWgudGFnX3RvX2V2ZW50c1tsLnVwcGVyXTtfLmlzVW5kZWZpbmVkKG0pJiYodC5wdXNoKGwudmFsdWUpLHA9ITApO18uaXNVbmRlZmluZWQobikmJih0LnB1c2gobC5sb3dlcikscD0hMCk7Xy5pc1VuZGVmaW5lZChxKSYmKHQucHVzaChsLnVwcGVyKSxwPSEwKTtpZighcCl7dmFyIHU9eT0+eVsxXTtpZihwPXRoaXMuX2ZpbmRTdGVwTWlzbWF0Y2gobCxtLm1hcCh1KSxuLm1hcCh1KSxxLm1hcCh1KSkpdGhpcy5zZXQoIl9zdGVwc01pc21hdGNoIixwKTtlbHNle3ZhciB4PXk9PnlbMl07cD1tLm1hcCgoeSx3KT0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKnlbMF0pLHN0ZXA6dSh5KSxzY2FsYXI6eCh5KSxsb3dlcjp4KG5bd10pLHVwcGVyOngocVt3XSl9KSk7bT1UaS5nZW5lcmF0ZURhdGFTZXJpZXNOYW1lKGYsbC52YWx1ZSk7CnZhciBBPWtbbV07QT9BLnNldERhdGEocCk6KGw9dGhpcy5fY3JlYXRlTmV3RGF0YVNlcmllcyhmLGwudmFsdWUsbSxwKSxrW21dPWwpfX19KTt0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLGspO2Q9Xy5maW5kSW5kZXgodGhpcy5fbWlzc2luZ1RhZ3MsbD0+bC5ydW49PT1mKTtpZih0Lmxlbmd0aCYmMyE9dC5sZW5ndGgpe2NvbnN0IGw9e3J1bjpmLHRhZ3M6dH07MDw9ZD90aGlzLnNwbGljZSgiX21pc3NpbmdUYWdzIixkLDEsbCk6dGhpcy5wdXNoKCJfbWlzc2luZ1RhZ3MiLGwpfWVsc2UgMDw9ZCYmdGhpcy5zcGxpY2UoIl9taXNzaW5nVGFncyIsZCwxKX1lbHNlIHRoaXMuc2V0KCJfdGFnRmlsdGVySW52YWxpZCIsITApfX0sX2ZpbmRTdGVwTWlzbWF0Y2goYixkLGYsaCl7cmV0dXJuIF8uaXNFcXVhbChmLGQpJiZfLmlzRXF1YWwoaCxkKT9udWxsOntzZXJpZXNPYmplY3Q6Yix2YWx1ZVN0ZXBzOmQsbG93ZXJTdGVwczpmLHVwcGVyU3RlcHM6aH19LF9jcmVhdGVOZXdEYXRhU2VyaWVzKGIsCmQsZixoKXt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtiXXw9MDtkPW5ldyBUaS5EYXRhU2VyaWVzKGIsZCxmLGgscmcuU1lNQk9MU19MSVNUW3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2JdXSk7dGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbYl09KHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2JdKzEpJXJnLlNZTUJPTFNfTElTVC5sZW5ndGg7cmV0dXJuIGR9LF91cGRhdGVDaGFydChiKXtfLmZvck93bihiLGQ9Pnt0aGlzLiQubG9hZGVyLnNldFNlcmllc0RhdGEoZC5nZXROYW1lKCksZC5nZXREYXRhKCkpfSl9LF9jb21wdXRlU2VyaWVzTmFtZXMoKXtjb25zdCBiPW5ldyBTZXQodGhpcy5ydW5zKTtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5fbmFtZVRvRGF0YVNlcmllcykuZmlsdGVyKChbLGRdKT0+Yi5oYXMoZC5ydW4pKS5tYXAoKFtkXSk9PmQpfSxfZGV0ZXJtaW5lQ29sb3IoYixkKXtyZXR1cm4gYi5zY2FsZShkKX0sCl9yZWZyZXNoRGF0YVNlcmllcygpe3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIse30pfSxfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKXtyZXR1cm4gYj0+dGhpcy5fbmFtZVRvRGF0YVNlcmllc1tiXS5nZXRTeW1ib2woKS5tZXRob2QoKX0sX2RldGVybWluZVN5bWJvbChiLGQpe3JldHVybiBiW2RdLmdldFN5bWJvbCgpLmNoYXJhY3Rlcn0sX2NvbXB1dGVUYWdGaWx0ZXIoYil7cmV0dXJuIF8uZmxhdHRlbihiLm1hcChkPT5bZC52YWx1ZSxkLmxvd2VyLGQudXBwZXJdKSkubWFwKGQ9PiIoIit0aGlzLl9lc2NhcGVSZWdleENoYXJhY3RlcnMoZCkrIikiKS5qb2luKCJ8Iil9LF9lc2NhcGVSZWdleENoYXJhY3RlcnMoYil7cmV0dXJuIGIucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csIlxcJFx4MjYiKX0sX2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbihiKXtyZXR1cm4gYj8iZXhwYW5kLWxlc3MiOiJleHBhbmQtbW9yZSJ9LF90b2dnbGVNYXRjaGVzT3Blbigpe3RoaXMuc2V0KCJfbWF0Y2hlc0xpc3RPcGVuZWQiLAohdGhpcy5fbWF0Y2hlc0xpc3RPcGVuZWQpfSxfY29tcHV0ZVRpdGxlRGlzcGxheVN0cmluZyhiKXtyZXR1cm4gYnx8InVudGl0bGVkIn0sX3NlcGFyYXRlV2l0aENvbW1hcyhiKXtyZXR1cm4gYi5qb2luKCIsICIpfSxfdG9nZ2xlTWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW4oKXt0aGlzLnNldCgiX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQiLCF0aGlzLl9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkKX0sX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkKCl7Y29uc3QgYj10aGlzLiQkKCIjbWF0Y2gtbGlzdC1yZXBlYXQiKTtiJiZ0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLm1hdGNoLWxpc3QtZW50cnkiKS5mb3JFYWNoKGQ9Pntjb25zdCBmPWIuaXRlbUZvckVsZW1lbnQoZCk7ZC5zdHlsZS5jb2xvcj10aGlzLl9kZXRlcm1pbmVDb2xvcih0aGlzLl9jb2xvclNjYWxlLGYpfSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQvdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiLHByb3BlcnRpZXM6e3J1bnM6QXJyYXkseFR5cGU6U3RyaW5nLGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfSx0aXRsZTpTdHJpbmcsdGFnUmVnZXhlczpBcnJheSxpZ25vcmVZT3V0bGllcnM6Qm9vbGVhbixyZXF1ZXN0TWFuYWdlcjpPYmplY3Qsc2hvd0Rvd25sb2FkTGlua3M6Qm9vbGVhbixzbW9vdGhpbmdFbmFibGVkOkJvb2xlYW4sc21vb3RoaW5nV2VpZ2h0Ok51bWJlcix0YWdNZXRhZGF0YTpPYmplY3QsdG9vbHRpcFNvcnRpbmdNZXRob2Q6U3RyaW5nLF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpuZXcgVGkuRGF0YVNlcmllc0NvbG9yU2NhbGUoe3NjYWxlOnBmLnJ1bnNDb2xvclNjYWxlfSkscmVhZE9ubHk6ITB9LF90YWdGaWx0ZXI6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVRhZ0ZpbHRlcih0YWdSZWdleGVzKSJ9LF9uYW1lVG9EYXRhU2VyaWVzOnt0eXBlOk9iamVjdCwKdmFsdWU6KCk9Pih7fSl9LF9zZXJpZXNOYW1lczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlU2VyaWVzTmFtZXMoX25hbWVUb0RhdGFTZXJpZXMsIHJ1bnMpIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfbG9nU2NhbGVBY3RpdmU6Qm9vbGVhbixfZGF0YVVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBiPT57Y29uc3QgZD10aGlzLl90YWdGaWx0ZXI7cmV0dXJuIHZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvc2NhbGFycyIpLHt0YWc6ZCxydW46Yn0pfX19LF9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9tYXRjaGVzTGlzdE9wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfdGl0bGVEaXNwbGF5U3RyaW5nOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVUaXRsZURpc3BsYXlTdHJpbmcodGl0bGUpIn19LApvYnNlcnZlcnM6WyJfdXBkYXRlQ2hhcnQoX25hbWVUb0RhdGFTZXJpZXMpIiwiX3JlZnJlc2hEYXRhU2VyaWVzKF90YWdGaWx0ZXIpIl0scmVsb2FkKCl7dGhpcy4kLmxvYWRlci5yZWxvYWQoKX0scmVkcmF3KCl7dGhpcy4kLmxvYWRlci5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfSxfdG9nZ2xlTG9nU2NhbGUoKXt0aGlzLnNldCgiX2xvZ1NjYWxlQWN0aXZlIiwhdGhpcy5fbG9nU2NhbGVBY3RpdmUpfSxfcmVzZXREb21haW4oKXtjb25zdCBiPXRoaXMuJC5sb2FkZXI7YiYmYi5yZXNldERvbWFpbigpfSxfY3N2VXJsKGIsZCl7aWYoIWQpcmV0dXJuIiI7Yj10aGlzLl9kb3dubG9hZERhdGFVcmwoYixkKTtyZXR1cm4gdmMuYWRkUGFyYW1zKGIse2Zvcm1hdDoiY3N2In0pfSxfanNvblVybChiLGQpe2lmKCFkKXJldHVybiIiO2I9dGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCk7cmV0dXJuIHZjLmFkZFBhcmFtcyhiLAp7Zm9ybWF0OiJqc29uIn0pfSxfZG93bmxvYWREYXRhVXJsKGIsZCl7Yj1iW2RdO2I9e3RhZzpiLmdldFRhZygpLHJ1bjpiLmdldFJ1bigpfTtyZXR1cm4gdmMuYWRkUGFyYW1zKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9kb3dubG9hZF9kYXRhIiksYil9LF9jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCl7cmV0dXJuKGIsZCxmKT0+e2lmKGYucmVnZXhfdmFsaWQpe2NvbnN0IGg9Xy5jbG9uZSh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKTtfLmZvck93bihmLnRhZ190b19ldmVudHMsKGssdCk9Pntjb25zdCBsPWsubWFwKG09Pih7d2FsbF90aW1lOm5ldyBEYXRlKDFFMyptWzBdKSxzdGVwOm1bMV0sc2NhbGFyOm1bMl19KSk7az1UaS5nZW5lcmF0ZURhdGFTZXJpZXNOYW1lKGQsdCk7Y29uc3QgcD1oW2tdO3A/cC5zZXREYXRhKGwpOihfLmlzVW5kZWZpbmVkKHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdKSYmKHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdPQowKSx0PW5ldyBUaS5EYXRhU2VyaWVzKGQsdCxrLGwscmcuU1lNQk9MU19MSVNUW3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdXSksaFtrXT10LHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2RdPSh0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtkXSsxKSVyZy5TWU1CT0xTX0xJU1QubGVuZ3RoKX0pO3RoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIsaCl9fX0sX3VwZGF0ZUNoYXJ0KGIpe09iamVjdC5lbnRyaWVzKGIpLmZvckVhY2goKFtkLGZdKT0+e3RoaXMuJC5sb2FkZXIuc2V0U2VyaWVzRGF0YShkLGYuZ2V0RGF0YSgpKX0pfSxfY29tcHV0ZVNlbGVjdGVkUnVuc1NldChiKXtjb25zdCBkPXt9O18uZm9yRWFjaChiLGY9PntkW2ZdPTF9KTtyZXR1cm4gZH0sX2NvbXB1dGVTZXJpZXNOYW1lcygpe2NvbnN0IGI9bmV3IFNldCh0aGlzLnJ1bnMpO3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKS5maWx0ZXIoKFssCmRdKT0+Yi5oYXMoZC5ydW4pKS5tYXAoKFtkXSk9PmQpfSxfZGV0ZXJtaW5lQ29sb3IoYixkKXtyZXR1cm4gYi5zY2FsZShkKX0sX3JlZnJlc2hEYXRhU2VyaWVzKCl7dGhpcy5zZXQoIl9uYW1lVG9EYXRhU2VyaWVzIix7fSl9LF9jcmVhdGVTeW1ib2xGdW5jdGlvbigpe3JldHVybiBiPT50aGlzLl9uYW1lVG9EYXRhU2VyaWVzW2JdLmdldFN5bWJvbCgpLm1ldGhvZCgpfSxfZGV0ZXJtaW5lU3ltYm9sKGIsZCl7cmV0dXJuIGJbZF0uZ2V0U3ltYm9sKCkuY2hhcmFjdGVyfSxfY29tcHV0ZVRhZ0ZpbHRlcihiKXtyZXR1cm4gMT09PWIubGVuZ3RoP2JbMF06Yi5tYXAoZD0+IigiK2QrIikiKS5qb2luKCJ8Iil9LF9nZXRUb2dnbGVNYXRjaGVzSWNvbihiKXtyZXR1cm4gYj8iZXhwYW5kLWxlc3MiOiJleHBhbmQtbW9yZSJ9LF90b2dnbGVNYXRjaGVzT3Blbigpe3RoaXMuc2V0KCJfbWF0Y2hlc0xpc3RPcGVuZWQiLCF0aGlzLl9tYXRjaGVzTGlzdE9wZW5lZCl9LF9jb21wdXRlVGl0bGVEaXNwbGF5U3RyaW5nKGIpe3JldHVybiBifHwKInVudGl0bGVkIn0sX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkKCl7Y29uc3QgYj10aGlzLiQkKCIjbWF0Y2gtbGlzdC1yZXBlYXQiKTtiJiZ0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLm1hdGNoLWxpc3QtZW50cnkiKS5mb3JFYWNoKGQ9Pntjb25zdCBmPWIuaXRlbUZvckVsZW1lbnQoZCk7ZC5zdHlsZS5jb2xvcj10aGlzLl9kZXRlcm1pbmVDb2xvcih0aGlzLl9jb2xvclNjYWxlLGYpfSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQvdGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcig1MCl9LF9jYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuQ2FuY2VsbGVyfSxfc2VsZWN0ZWRSdW5zOkFycmF5LF9zaG93RG93bmxvYWRMaW5rczp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTpwZC5nZXRCb29sZWFuSW5pdGlhbGl6ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxvYnNlcnZlcjoiX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXIifSxfc21vb3RoaW5nRW5hYmxlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZVNtb290aGluZ0VuYWJsZWQoX3Ntb290aGluZ1dlaWdodCkifSxfc21vb3RoaW5nV2VpZ2h0Ont0eXBlOk51bWJlcixub3RpZnk6ITAsdmFsdWU6cGQuZ2V0TnVtYmVySW5pdGlhbGl6ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLAp7ZGVmYXVsdFZhbHVlOi42fSksb2JzZXJ2ZXI6Il9zbW9vdGhpbmdXZWlnaHRPYnNlcnZlciJ9LF9pZ25vcmVZT3V0bGllcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTpwZC5nZXRCb29sZWFuSW5pdGlhbGl6ZXIoIl9pZ25vcmVZT3V0bGllcnMiLHtkZWZhdWx0VmFsdWU6ITAsdXNlTG9jYWxTdG9yYWdlOiEwfSksb2JzZXJ2ZXI6Il9pZ25vcmVZT3V0bGllcnNPYnNlcnZlciJ9LF94VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0ZXAifSxfbGF5b3V0Ok9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfbGF5b3V0KSJ9LF9vcGVuZWRDYXRlZ29yaWVzOnt0eXBlOk9iamVjdH0sX2FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCksZD10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+CntmLmNhbmNlbGxlZHx8KHRoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwhZi52YWx1ZS5jdXN0b21fc2NhbGFycyksdGhpcy5fZGF0YU5vdEZvdW5kfHx0aGlzLl9yZXRyaWV2ZUxheW91dEFuZERhdGEoKSl9KTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZCl9LF9yZWxvYWRDaGFydHMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZCwgdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiKS5mb3JFYWNoKGI9PntiLnJlbG9hZCgpfSl9LF9yZXRyaWV2ZUxheW91dEFuZERhdGEoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9sYXlvdXQiKSxkPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShmPT57Zi5jYW5jZWxsZWR8fCh0aGlzLnNldCgiX2xheW91dCIsZi52YWx1ZSksdGhpcy5fZGF0YU5vdEZvdW5kfHx0aGlzLl9yZWxvYWRDaGFydHMoKSl9KTsKdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfSxfc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlcjpwZC5nZXRCb29sZWFuT2JzZXJ2ZXIoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSxfc21vb3RoaW5nV2VpZ2h0T2JzZXJ2ZXI6cGQuZ2V0TnVtYmVyT2JzZXJ2ZXIoIl9zbW9vdGhpbmdXZWlnaHQiLHtkZWZhdWx0VmFsdWU6LjZ9KSxfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXI6cGQuZ2V0Qm9vbGVhbk9ic2VydmVyKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pLF9jb21wdXRlU21vb3RoaW5nRW5hYmxlZChiKXtyZXR1cm4gMDxifSxfbWFrZUNhdGVnb3JpZXMoYil7aWYoIWIuY2F0ZWdvcnkpcmV0dXJuW107bGV0IGQ9ITE7dGhpcy5fb3BlbmVkQ2F0ZWdvcmllc3x8KGQ9ITAsdGhpcy5fb3BlbmVkQ2F0ZWdvcmllcz17fSk7cmV0dXJuIGIuY2F0ZWdvcnkubWFwKGY9Pgp7ZCYmIWYuY2xvc2VkJiYodGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tmLnRpdGxlXT0hMCk7cmV0dXJue25hbWU6Zi50aXRsZSxpdGVtczpmLmNoYXJ0LG1ldGFkYXRhOntvcGVuZWQ6ISF0aGlzLl9vcGVuZWRDYXRlZ29yaWVzW2YudGl0bGVdfX19KX0sX2NhdGVnb3J5T3BlbmVkVG9nZ2xlZChiKXtiPWIudGFyZ2V0O2Iub3BlbmVkP3RoaXMuX29wZW5lZENhdGVnb3JpZXNbYi5jYXRlZ29yeS5uYW1lXT0hMDpkZWxldGUgdGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tiLmNhdGVnb3J5Lm5hbWVdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWltYWdlLWRhc2hib2FyZC90Zi1pbWFnZS1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaW1hZ2UtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsc2FtcGxlOk51bWJlcixvZlNhbXBsZXM6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxhY3R1YWxTaXplOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxicmlnaHRuZXNzQWRqdXN0bWVudDp7dHlwZTpOdW1iZXIsdmFsdWU6LjV9LGNvbnRyYXN0UGVyY2VudGFnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MH0scmVxdWVzdE1hbmFnZXI6T2JqZWN0LF9tZXRhZGF0YUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9LF9pbWFnZUNhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9LF9zdGVwczp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LF9zdGVwSW5kZXg6e3R5cGU6TnVtYmVyLApub3RpZnk6ITB9LF9jdXJyZW50U3RlcDp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFN0ZXAoX3N0ZXBzLCBfc3RlcEluZGV4KSJ9LF9oYXNBdExlYXN0T25lU3RlcDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc0F0TGVhc3RPbmVTdGVwKF9zdGVwcykifSxfaGFzTXVsdGlwbGVTdGVwczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU3RlcHMoX3N0ZXBzKSJ9LF9zdGVwVmFsdWU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZVN0ZXBWYWx1ZShfY3VycmVudFN0ZXApIn0sX2N1cnJlbnRXYWxsVGltZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFdhbGxUaW1lKF9jdXJyZW50U3RlcCkifSxfbWF4U3RlcEluZGV4Ont0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVNYXhTdGVwSW5kZXgoX3N0ZXBzKSJ9LF9zYW1wbGVUZXh0Ont0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVTYW1wbGVUZXh0KHNhbXBsZSkifSwKX2hhc011bHRpcGxlU2FtcGxlczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU2FtcGxlcyhvZlNhbXBsZXMpIn0sX2lzSW1hZ2VMb2FkaW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJyZWxvYWQocnVuLCB0YWcpIiwiX3VwZGF0ZUltYWdlVXJsKF9jdXJyZW50U3RlcCwgYnJpZ2h0bmVzc0FkanVzdG1lbnQsIGNvbnRyYXN0UGVyY2VudGFnZSkiXSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiBwZi5ydW5zQ29sb3JTY2FsZShiKX0sX2NvbXB1dGVIYXNBdExlYXN0T25lU3RlcChiKXtyZXR1cm4hIWImJjA8Yi5sZW5ndGh9LF9jb21wdXRlSGFzTXVsdGlwbGVTdGVwcyhiKXtyZXR1cm4hIWImJjE8Yi5sZW5ndGh9LF9jb21wdXRlQ3VycmVudFN0ZXAoYixkKXtyZXR1cm4gYltkXXx8bnVsbH0sX2NvbXB1dGVTdGVwVmFsdWUoYil7cmV0dXJuIGI/Yi5zdGVwOjB9LF9jb21wdXRlQ3VycmVudFdhbGxUaW1lKGIpe3JldHVybiBiPwpIaC5mb3JtYXREYXRlKGIud2FsbF90aW1lKToiIn0sX2NvbXB1dGVNYXhTdGVwSW5kZXgoYil7cmV0dXJuIGIubGVuZ3RoLTF9LF9jb21wdXRlU2FtcGxlVGV4dChiKXtyZXR1cm5gJHtiKzF9YH0sX2NvbXB1dGVIYXNNdWx0aXBsZVNhbXBsZXMoYil7cmV0dXJuIDE8Yn0sX2dldEFyaWFFeHBhbmRlZCgpe3JldHVybiB0aGlzLmFjdHVhbFNpemU/InRydWUiOiJmYWxzZSJ9LGF0dGFjaGVkKCl7dGhpcy5fYXR0YWNoZWQ9ITA7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7aWYodGhpcy5fYXR0YWNoZWQpe3RoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbEFsbCgpO3ZhciBiPXZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaW1hZ2VzIiwiL2ltYWdlcyIpLHt0YWc6dGhpcy50YWcscnVuOnRoaXMucnVuLHNhbXBsZTp0aGlzLnNhbXBsZX0pLGQ9dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+e2YuY2FuY2VsbGVkfHwoZj1mLnZhbHVlLm1hcCh0aGlzLl9jcmVhdGVTdGVwRGF0dW0uYmluZCh0aGlzKSksCnRoaXMuc2V0KCJfc3RlcHMiLGYpLHRoaXMuc2V0KCJfc3RlcEluZGV4IixmLmxlbmd0aC0xKSl9KTt0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkKX19LF9jcmVhdGVTdGVwRGF0dW0oYil7bGV0IGQ9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImltYWdlcyIsIi9pbmRpdmlkdWFsSW1hZ2UiKTtkPXZjLmFkZFBhcmFtcyhkLHt0czpiLndhbGxfdGltZX0pO2QrPSJceDI2IitiLnF1ZXJ5O3JldHVybnt3YWxsX3RpbWU6bmV3IERhdGUoMUUzKmIud2FsbF90aW1lKSxzdGVwOmIuc3RlcCx1cmw6ZH19LF91cGRhdGVJbWFnZVVybChiLGQsZil7aWYoYil7dmFyIGg9bmV3IEltYWdlO3RoaXMuX2ltYWdlQ2FuY2VsbGVyLmNhbmNlbEFsbCgpO2gub25sb2FkPWgub25lcnJvcj10aGlzLl9pbWFnZUNhbmNlbGxlci5jYW5jZWxsYWJsZShrPT57ay5jYW5jZWxsZWR8fChrPXRoaXMuJCQoIiNtYWluLWltYWdlLWNvbnRhaW5lciIpLGsuaW5uZXJIVE1MPSIiLFBvbHltZXIuZG9tKGspLmFwcGVuZENoaWxkKGgpLAp0aGlzLnNldCgiX2lzSW1hZ2VMb2FkaW5nIiwhMSkpfSkuYmluZCh0aGlzKTtoLnN0eWxlLmZpbHRlcj1gY29udHJhc3QoJHtmfSUpIGA7aC5zdHlsZS5maWx0ZXIrPWBicmlnaHRuZXNzKCR7ZH0pYDt0aGlzLnNldCgiX2lzSW1hZ2VMb2FkaW5nIiwhMCk7aC5zcmM9Yi51cmx9fSxfaGFuZGxlVGFwKCl7dGhpcy5zZXQoImFjdHVhbFNpemUiLCF0aGlzLmFjdHVhbFNpemUpfSxfdG9Mb2NhbGVTdHJpbmcoYil7cmV0dXJuIGIudG9Mb2NhbGVTdHJpbmcoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1pbWFnZS1kYXNoYm9hcmQvdGYtaW1hZ2UtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWltYWdlLWRhc2hib2FyZCIscHJvcGVydGllczp7X3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWdJbmZvOk9iamVjdCxfZGF0YU5vdEZvdW5kOkJvb2xlYW4sX2FjdHVhbFNpemU6Qm9vbGVhbixfZGVmYXVsdEJyaWdodG5lc3NBZGp1c3RtZW50Ont0eXBlOk51bWJlcix2YWx1ZToxLHJlYWRPbmx5OiEwfSxfZGVmYXVsdENvbnRyYXN0UGVyY2VudGFnZTp7dHlwZTpOdW1iZXIsdmFsdWU6MTAwLHJlYWRPbmx5OiEwfSxfYnJpZ2h0bmVzc0FkanVzdG1lbnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LF9jb250cmFzdFBlcmNlbnRhZ2U6e3R5cGU6TnVtYmVyLHZhbHVlOjEwMH0sX3RhZ0ZpbHRlcjpTdHJpbmcsX2JyaWdodG5lc3NJc0RlZmF1bHQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVCcmlnaHRuZXNzSXNEZWZhdWx0KF9icmlnaHRuZXNzQWRqdXN0bWVudCkifSxfY29udHJhc3RJc0RlZmF1bHQ6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVDb250cmFzdElzRGVmYXVsdChfY29udHJhc3RQZXJjZW50YWdlKSJ9LApfY2F0ZWdvcmllc0RvbVJlYWR5OkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWdJbmZvLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyLCBfY2F0ZWdvcmllc0RvbVJlYWR5KSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+e3RoaXMuX3JlbG9hZEltYWdlcygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJpbWFnZXMiLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+e2lmKCFfLmlzRXF1YWwoZCx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZj1fLm1hcFZhbHVlcyhkLGg9Pk9iamVjdC5rZXlzKGgpKTtmPXZjLmdldFRhZ3MoZik7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLAowPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfcmVsb2FkSW1hZ2VzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWltYWdlLWxvYWRlciIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX3Nob3VsZE9wZW4oYil7cmV0dXJuIDI+PWJ9LF9yZXNldEJyaWdodG5lc3MoKXt0aGlzLl9icmlnaHRuZXNzQWRqdXN0bWVudD10aGlzLl9kZWZhdWx0QnJpZ2h0bmVzc0FkanVzdG1lbnR9LF9yZXNldENvbnRyYXN0KCl7dGhpcy5fY29udHJhc3RQZXJjZW50YWdlPXRoaXMuX2RlZmF1bHRDb250cmFzdFBlcmNlbnRhZ2V9LF9jb21wdXRlQnJpZ2h0bmVzc0lzRGVmYXVsdChiKXtyZXR1cm4gYj09PXRoaXMuX2RlZmF1bHRCcmlnaHRuZXNzQWRqdXN0bWVudH0sX2NvbXB1dGVDb250cmFzdElzRGVmYXVsdChiKXtyZXR1cm4gYj09PXRoaXMuX2RlZmF1bHRDb250cmFzdFBlcmNlbnRhZ2V9LApfbWFrZUNhdGVnb3JpZXMoYixkLGYpe2Z1bmN0aW9uIGgodCl7Y29uc3QgbD1iW3QucnVuXVt0LnRhZ10uc2FtcGxlcztyZXR1cm4gXy5yYW5nZShsKS5tYXAocD0+T2JqZWN0LmFzc2lnbih7fSx0LHtzYW1wbGU6cCxvZlNhbXBsZXM6bH0pKX1jb25zdCBrPV8ubWFwVmFsdWVzKGIsdD0+T2JqZWN0LmtleXModCkpO3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGssZCxmKS5tYXAodD0+T2JqZWN0LmFzc2lnbih7fSx0LHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sdC5pdGVtcy5tYXAoaCkpfSkpfSxfdGFnTWV0YWRhdGEoYixkLGYpe3JldHVybiBiW2RdW2ZdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWF1ZGlvLWRhc2hib2FyZC90Zi1hdWRpby1sb2FkZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtYXVkaW8tbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsc2FtcGxlOk51bWJlcix0b3RhbFNhbXBsZXM6TnVtYmVyLHRhZ01ldGFkYXRhOk9iamVjdCxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX21ldGFkYXRhQ2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX3N0ZXBzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3N0ZXBJbmRleDpOdW1iZXIsX2hhc0F0TGVhc3RPbmVTdGVwOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzQXRMZWFzdE9uZVN0ZXAoX3N0ZXBzKSJ9LF9oYXNNdWx0aXBsZVN0ZXBzOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzTXVsdGlwbGVTdGVwcyhfc3RlcHMpIn0sX2N1cnJlbnREYXR1bTp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudERhdHVtKF9zdGVwcywgX3N0ZXBJbmRleCkifSwKX21heFN0ZXBJbmRleDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4U3RlcEluZGV4KF9zdGVwcykifSxfc2FtcGxlVGV4dDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlU2FtcGxlVGV4dChzYW1wbGUpIn0sX2hhc011bHRpcGxlU2FtcGxlczp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhhc011bHRpcGxlU2FtcGxlcyh0b3RhbFNhbXBsZXMpIn19LG9ic2VydmVyczpbInJlbG9hZChydW4sIHRhZykiXSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiBwZi5ydW5zQ29sb3JTY2FsZShiKX0sX2NvbXB1dGVIYXNBdExlYXN0T25lU3RlcChiKXtyZXR1cm4hIWImJjA8Yi5sZW5ndGh9LF9jb21wdXRlSGFzTXVsdGlwbGVTdGVwcyhiKXtyZXR1cm4hIWImJjE8Yi5sZW5ndGh9LF9jb21wdXRlTWF4U3RlcEluZGV4KGIpe3JldHVybiBiLmxlbmd0aC0xfSxfY29tcHV0ZUN1cnJlbnREYXR1bShiLGQpe3JldHVybiBiW2RdfSxfY29tcHV0ZVNhbXBsZVRleHQoYil7cmV0dXJuYCR7YisKMX1gfSxfY29tcHV0ZUhhc011bHRpcGxlU2FtcGxlcyhiKXtyZXR1cm4gMTxifSxhdHRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSEwO3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe2lmKHRoaXMuX2F0dGFjaGVkKXt0aGlzLl9tZXRhZGF0YUNhbmNlbGxlci5jYW5jZWxBbGwoKTt2YXIgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYXVkaW8iLCIvYXVkaW8iLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3RhZzp0aGlzLnRhZyxydW46dGhpcy5ydW4sc2FtcGxlOnRoaXMuc2FtcGxlfSkpLGQ9dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsbGFibGUoZj0+e2YuY2FuY2VsbGVkfHwoZj1mLnZhbHVlLm1hcCh0aGlzLl9jcmVhdGVTdGVwRGF0dW0uYmluZCh0aGlzKSksdGhpcy5zZXQoIl9zdGVwcyIsZiksdGhpcy5zZXQoIl9zdGVwSW5kZXgiLGYubGVuZ3RoLTEpKX0pO3RoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfX0sX2NyZWF0ZVN0ZXBEYXR1bShiKXt2YXIgZD0KbmV3IFVSTFNlYXJjaFBhcmFtcyhiLnF1ZXJ5KTtkLmFwcGVuZCgidHMiLGIud2FsbF90aW1lKTtkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJhdWRpbyIsIi9pbmRpdmlkdWFsQXVkaW8iLGQpO3JldHVybnt3YWxsX3RpbWU6SGguZm9ybWF0RGF0ZShuZXcgRGF0ZSgxRTMqYi53YWxsX3RpbWUpKSxzdGVwOmIuc3RlcCxsYWJlbDpiLmxhYmVsLGNvbnRlbnRUeXBlOmIuY29udGVudFR5cGUsdXJsOmR9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWF1ZGlvLWRhc2hib2FyZC90Zi1hdWRpby1kYXNoYm9hcmQuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtYXVkaW8tZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWdJbmZvLCBfc2VsZWN0ZWRSdW5zLCBfdGFnRmlsdGVyKSJ9LF9yZXF1ZXN0TWFuYWdlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcn19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKT0+e3RoaXMuX3JlbG9hZEF1ZGlvKCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsCnRoaXMuX3J1blRvVGFnSW5mbykpe3ZhciBmPV8ubWFwVmFsdWVzKGQsaD0+T2JqZWN0LmtleXMoaCkpO2Y9dmMuZ2V0VGFncyhmKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWYubGVuZ3RoKTt0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsZCl9fSl9LF9yZWxvYWRBdWRpbygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1hdWRpby1sb2FkZXIiKS5mb3JFYWNoKGI9PntiLnJlbG9hZCgpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfbWFrZUNhdGVnb3JpZXMoYixkLGYpe2Z1bmN0aW9uIGgodCl7Y29uc3QgbD1iW3QucnVuXVt0LnRhZ10uc2FtcGxlcztyZXR1cm4gXy5yYW5nZShsKS5tYXAocD0+T2JqZWN0LmFzc2lnbih7fSx0LHtzYW1wbGU6cCx0b3RhbFNhbXBsZXM6bH0pKX1jb25zdCBrPV8ubWFwVmFsdWVzKGIsdD0+T2JqZWN0LmtleXModCkpO3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGssZCxmKS5tYXAodD0+T2JqZWN0LmFzc2lnbih7fSwKdCx7aXRlbXM6W10uY29uY2F0LmFwcGx5KFtdLHQuaXRlbXMubWFwKGgpKX0pKX0sX3RhZ01ldGFkYXRhKGIsZCxmKXtyZXR1cm4gYltkXVtmXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9pcm9uLWF1dG9ncm93LXRleHRhcmVhL2lyb24tYXV0b2dyb3ctdGV4dGFyZWEuaHRtbC5qcwpQb2x5bWVyKHtpczoiaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvbkNvbnRyb2xTdGF0ZV0scHJvcGVydGllczp7dmFsdWU6e29ic2VydmVyOiJfdmFsdWVDaGFuZ2VkIix0eXBlOlN0cmluZyxub3RpZnk6ITB9LGJpbmRWYWx1ZTp7b2JzZXJ2ZXI6Il9iaW5kVmFsdWVDaGFuZ2VkIix0eXBlOlN0cmluZyxub3RpZnk6ITB9LHJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjEsb2JzZXJ2ZXI6Il91cGRhdGVDYWNoZWQifSxtYXhSb3dzOnt0eXBlOk51bWJlcix2YWx1ZTowLG9ic2VydmVyOiJfdXBkYXRlQ2FjaGVkIn0sYXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyx2YWx1ZToib2ZmIn0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGlucHV0bW9kZTp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZ30scmVhZG9ubHk6e3R5cGU6U3RyaW5nfSxyZXF1aXJlZDp7dHlwZTpCb29sZWFufSwKbWlubGVuZ3RoOnt0eXBlOk51bWJlcn0sbWF4bGVuZ3RoOnt0eXBlOk51bWJlcn0sbGFiZWw6e3R5cGU6U3RyaW5nfX0sbGlzdGVuZXJzOntpbnB1dDoiX29uSW5wdXQifSxnZXQgdGV4dGFyZWEoKXtyZXR1cm4gdGhpcy4kLnRleHRhcmVhfSxnZXQgc2VsZWN0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0fSxnZXQgc2VsZWN0aW9uRW5kKCl7cmV0dXJuIHRoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25FbmR9LHNldCBzZWxlY3Rpb25TdGFydChiKXt0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uU3RhcnQ9Yn0sc2V0IHNlbGVjdGlvbkVuZChiKXt0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uRW5kPWJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpbb2FdZHxob25lKS8pJiYodGhpcy4kLnRleHRhcmVhLnN0eWxlLm1hcmdpbkxlZnQ9Ii0zcHgiKX0sdmFsaWRhdGU6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQudGV4dGFyZWEudmFsaWRpdHkudmFsaWQ7CmImJih0aGlzLnJlcXVpcmVkJiYiIj09PXRoaXMudmFsdWU/Yj0hMTp0aGlzLmhhc1ZhbGlkYXRvcigpJiYoYj1Qb2x5bWVyLklyb25WYWxpZGF0YWJsZUJlaGF2aW9yLnZhbGlkYXRlLmNhbGwodGhpcyx0aGlzLnZhbHVlKSkpO3RoaXMuaW52YWxpZD0hYjt0aGlzLmZpcmUoImlyb24taW5wdXQtdmFsaWRhdGUiKTtyZXR1cm4gYn0sX2JpbmRWYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy52YWx1ZT1ifSxfdmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKGIpe3ZhciBkPXRoaXMudGV4dGFyZWE7ZCYmKGQudmFsdWUhPT1iJiYoZC52YWx1ZT1ifHwwPT09Yj9iOiIiKSx0aGlzLmJpbmRWYWx1ZT1iLHRoaXMuJC5taXJyb3IuaW5uZXJIVE1MPXRoaXMuX3ZhbHVlRm9yTWlycm9yKCksdGhpcy5maXJlKCJiaW5kLXZhbHVlLWNoYW5nZWQiLHt2YWx1ZTp0aGlzLmJpbmRWYWx1ZX0pKX0sX29uSW5wdXQ6ZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20oYikucGF0aDt0aGlzLnZhbHVlPWQ/ZFswXS52YWx1ZToKYi50YXJnZXQudmFsdWV9LF9jb25zdHJhaW46ZnVuY3Rpb24oYil7Yj1ifHxbIiJdO2ZvcihiPTA8dGhpcy5tYXhSb3dzJiZiLmxlbmd0aD50aGlzLm1heFJvd3M/Yi5zbGljZSgwLHRoaXMubWF4Um93cyk6Yi5zbGljZSgwKTswPHRoaXMucm93cyYmYi5sZW5ndGg8dGhpcy5yb3dzOyliLnB1c2goIiIpO3JldHVybiBiLmpvaW4oIlx4M2Nici9ceDNlIikrIlx4MjYjMTYwOyJ9LF92YWx1ZUZvck1pcnJvcjpmdW5jdGlvbigpe3ZhciBiPXRoaXMudGV4dGFyZWE7aWYoYilyZXR1cm4gdGhpcy50b2tlbnM9YiYmYi52YWx1ZT9iLnZhbHVlLnJlcGxhY2UoLyYvZ20sIlx4MjZhbXA7IikucmVwbGFjZSgvIi9nbSwiXHgyNnF1b3Q7IikucmVwbGFjZSgvJy9nbSwiXHgyNiMzOTsiKS5yZXBsYWNlKC88L2dtLCJceDI2bHQ7IikucmVwbGFjZSgvPi9nbSwiXHgyNmd0OyIpLnNwbGl0KCJcbiIpOlsiIl0sdGhpcy5fY29uc3RyYWluKHRoaXMudG9rZW5zKX0sX3VwZGF0ZUNhY2hlZDpmdW5jdGlvbigpe3RoaXMuJC5taXJyb3IuaW5uZXJIVE1MPQp0aGlzLl9jb25zdHJhaW4odGhpcy50b2tlbnMpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLWlucHV0L3BhcGVyLXRleHRhcmVhLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXRleHRhcmVhIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9yLFBvbHltZXIuSXJvbkZvcm1FbGVtZW50QmVoYXZpb3JdLHByb3BlcnRpZXM6e19hcmlhTGFiZWxsZWRCeTp7b2JzZXJ2ZXI6Il9hcmlhTGFiZWxsZWRCeUNoYW5nZWQiLHR5cGU6U3RyaW5nfSxfYXJpYURlc2NyaWJlZEJ5OntvYnNlcnZlcjoiX2FyaWFEZXNjcmliZWRCeUNoYW5nZWQiLHR5cGU6U3RyaW5nfSx2YWx1ZTp7dHlwZTpTdHJpbmd9LHJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LG1heFJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fSxnZXQgc2VsZWN0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0fSxzZXQgc2VsZWN0aW9uU3RhcnQoYil7dGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0PWJ9LGdldCBzZWxlY3Rpb25FbmQoKXtyZXR1cm4gdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvbkVuZH0sCnNldCBzZWxlY3Rpb25FbmQoYil7dGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvbkVuZD1ifSxfYXJpYUxhYmVsbGVkQnlDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX2ZvY3VzYWJsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLGIpfSxfYXJpYURlc2NyaWJlZEJ5Q2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c2FibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXJpYS1kZXNjcmliZWRieSIsYil9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudC50ZXh0YXJlYX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10b2FzdC9wYXBlci10b2FzdC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPW51bGw7UG9seW1lcih7aXM6InBhcGVyLXRvYXN0IixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvcl0scHJvcGVydGllczp7Zml0SW50bzp7dHlwZTpPYmplY3QsdmFsdWU6d2luZG93LG9ic2VydmVyOiJfb25GaXRJbnRvQ2hhbmdlZCJ9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImxlZnQifSx2ZXJ0aWNhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToiYm90dG9tIn0sZHVyYXRpb246e3R5cGU6TnVtYmVyLHZhbHVlOjNFM30sdGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LG5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sbm9BdXRvRm9jdXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LGxpc3RlbmVyczp7dHJhbnNpdGlvbmVuZDoiX19vblRyYW5zaXRpb25FbmQifSxnZXQgdmlzaWJsZSgpe1BvbHltZXIuQmFzZS5fd2FybigiYHZpc2libGVgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgb3BlbmVkYCBpbnN0ZWFkIik7CnJldHVybiB0aGlzLm9wZW5lZH0sZ2V0IF9jYW5BdXRvQ2xvc2UoKXtyZXR1cm4gMDx0aGlzLmR1cmF0aW9uJiZJbmZpbml0eSE9PXRoaXMuZHVyYXRpb259LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9hdXRvQ2xvc2U9bnVsbDtQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHkoKX0sc2hvdzpmdW5jdGlvbihkKXsic3RyaW5nIj09dHlwZW9mIGQmJihkPXt0ZXh0OmR9KTtmb3IodmFyIGYgaW4gZCkwPT09Zi5pbmRleE9mKCJfIik/UG9seW1lci5CYXNlLl93YXJuKCdUaGUgcHJvcGVydHkgIicrZisnIiBpcyBwcml2YXRlIGFuZCB3YXMgbm90IHNldC4nKTpmIGluIHRoaXM/dGhpc1tmXT1kW2ZdOlBvbHltZXIuQmFzZS5fd2FybignVGhlIHByb3BlcnR5ICInK2YrJyIgaXMgbm90IHZhbGlkLicpO3RoaXMub3BlbigpfSxoaWRlOmZ1bmN0aW9uKCl7dGhpcy5jbG9zZSgpfSxfX29uVHJhbnNpdGlvbkVuZDpmdW5jdGlvbihkKXtkJiZkLnRhcmdldD09PQp0aGlzJiYib3BhY2l0eSI9PT1kLnByb3BlcnR5TmFtZSYmKHRoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOnRoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5fYXV0b0Nsb3NlJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9hdXRvQ2xvc2UpLHRoaXMuX2F1dG9DbG9zZT1udWxsKTt0aGlzLm9wZW5lZD8oYiYmYiE9PXRoaXMmJmIuY2xvc2UoKSxiPXRoaXMsdGhpcy5maXJlKCJpcm9uLWFubm91bmNlIix7dGV4dDp0aGlzLnRleHR9KSx0aGlzLl9jYW5BdXRvQ2xvc2UmJih0aGlzLl9hdXRvQ2xvc2U9dGhpcy5hc3luYyh0aGlzLmNsb3NlLHRoaXMuZHVyYXRpb24pKSk6Yj09PXRoaXMmJihiPW51bGwpO1BvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX29wZW5lZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfcmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QuYWRkKCJwYXBlci10b2FzdC1vcGVuIil9LApfcmVuZGVyQ2xvc2VkOmZ1bmN0aW9uKCl7dGhpcy5jbGFzc0xpc3QucmVtb3ZlKCJwYXBlci10b2FzdC1vcGVuIil9LF9vbkZpdEludG9DaGFuZ2VkOmZ1bmN0aW9uKGQpe3RoaXMucG9zaXRpb25UYXJnZXQ9ZH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItdG9nZ2xlLWJ1dHRvbi9wYXBlci10b2dnbGUtYnV0dG9uLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXRvZ2dsZS1idXR0b24iLGJlaGF2aW9yczpbUG9seW1lci5QYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3JdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJidXR0b24iLCJhcmlhLXByZXNzZWQiOiJmYWxzZSIsdGFiaW5kZXg6MH0scHJvcGVydGllczp7fSxsaXN0ZW5lcnM6e3RyYWNrOiJfb250cmFjayJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5SZW5kZXJTdGF0dXMuYWZ0ZXJOZXh0UmVuZGVyKHRoaXMsZnVuY3Rpb24oKXtQb2x5bWVyLkdlc3R1cmVzLnNldFRvdWNoQWN0aW9uKHRoaXMsInBhbi15Iil9KX0sX29udHJhY2s6ZnVuY3Rpb24oYil7Yj1iLmRldGFpbDsic3RhcnQiPT09Yi5zdGF0ZT90aGlzLl90cmFja1N0YXJ0KGIpOiJ0cmFjayI9PT1iLnN0YXRlP3RoaXMuX3RyYWNrTW92ZShiKToiZW5kIj09PWIuc3RhdGUmJnRoaXMuX3RyYWNrRW5kKGIpfSxfdHJhY2tTdGFydDpmdW5jdGlvbigpe3RoaXMuX3dpZHRoPXRoaXMuJC50b2dnbGVCYXIub2Zmc2V0V2lkdGgvCjI7dGhpcy5fdHJhY2tDaGVja2VkPXRoaXMuY2hlY2tlZDt0aGlzLiQudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5hZGQoImRyYWdnaW5nIil9LF90cmFja01vdmU6ZnVuY3Rpb24oYil7Yj1iLmR4O3RoaXMuX3g9TWF0aC5taW4odGhpcy5fd2lkdGgsTWF0aC5tYXgoMCx0aGlzLl90cmFja0NoZWNrZWQ/dGhpcy5fd2lkdGgrYjpiKSk7dGhpcy50cmFuc2xhdGUzZCh0aGlzLl94KyJweCIsMCwwLHRoaXMuJC50b2dnbGVCdXR0b24pO3RoaXMuX3VzZXJBY3RpdmF0ZSh0aGlzLl94PnRoaXMuX3dpZHRoLzIpfSxfdHJhY2tFbmQ6ZnVuY3Rpb24oKXt0aGlzLiQudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5yZW1vdmUoImRyYWdnaW5nIik7dGhpcy50cmFuc2Zvcm0oIiIsdGhpcy4kLnRvZ2dsZUJ1dHRvbil9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLnRvZ2dsZUJ1dHRvbjt2YXIgYj1Qb2x5bWVyLlBhcGVyUmlwcGxlQmVoYXZpb3IuX2NyZWF0ZVJpcHBsZSgpOwpiLmlkPSJpbmsiO2Iuc2V0QXR0cmlidXRlKCJyZWNlbnRlcnMiLCIiKTtiLmNsYXNzTGlzdC5hZGQoImNpcmNsZSIsInRvZ2dsZS1pbmsiKTtyZXR1cm4gYn19KTsKCihmdW5jdGlvbihmKXtpZih0eXBlb2YgZXhwb3J0cz09PSJvYmplY3QiJiZ0eXBlb2YgbW9kdWxlIT09InVuZGVmaW5lZCIpbW9kdWxlLmV4cG9ydHM9ZigpO2Vsc2UgaWYodHlwZW9mIGRlZmluZT09PSJmdW5jdGlvbiImJmRlZmluZS5hbWQpZGVmaW5lKFtdLGYpO2Vsc2V7dmFyIGc7aWYodHlwZW9mIHdpbmRvdyE9PSJ1bmRlZmluZWQiKWc9d2luZG93O2Vsc2UgaWYodHlwZW9mIGdsb2JhbCE9PSJ1bmRlZmluZWQiKWc9Z2xvYmFsO2Vsc2UgaWYodHlwZW9mIHNlbGYhPT0idW5kZWZpbmVkIilnPXNlbGY7ZWxzZSBnPXRoaXM7Zy5ncmFwaGxpYj1mKCl9fSkoZnVuY3Rpb24oKXt2YXIgZGVmaW5lLG1vZHVsZSxleHBvcnRzO3JldHVybiBmdW5jdGlvbiBlKHQsbixyKXtmdW5jdGlvbiBzKG8sdSl7aWYoIW5bb10pe2lmKCF0W29dKXt2YXIgYT10eXBlb2YgcmVxdWlyZT09ImZ1bmN0aW9uIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApOwp2YXIgZj1uZXcgRXJyb3IoIkNhbm5vdCBmaW5kIG1vZHVsZSAnIitvKyInIik7dGhyb3cgZi5jb2RlPSJNT0RVTEVfTk9UX0ZPVU5EIixmO312YXIgbD1uW29dPXtleHBvcnRzOnt9fTt0W29dWzBdLmNhbGwobC5leHBvcnRzLGZ1bmN0aW9uKGUpe3ZhciBuPXRbb11bMV1bZV07cmV0dXJuIHMobj9uOmUpfSxsLGwuZXhwb3J0cyxlLHQsbixyKX1yZXR1cm4gbltvXS5leHBvcnRzfXZhciBpPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KHsxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgbGliPXJlcXVpcmUoIi4vbGliIik7bW9kdWxlLmV4cG9ydHM9e0dyYXBoOmxpYi5HcmFwaCxqc29uOnJlcXVpcmUoIi4vbGliL2pzb24iKSxhbGc6cmVxdWlyZSgiLi9saWIvYWxnIiksdmVyc2lvbjpsaWIudmVyc2lvbn19LHsiLi9saWIiOjE3LCIuL2xpYi9hbGciOjgsIi4vbGliL2pzb24iOjE4fV0sCjI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWNvbXBvbmVudHM7ZnVuY3Rpb24gY29tcG9uZW50cyhnKXt2YXIgdmlzaXRlZD17fSxjbXB0cz1bXSxjbXB0O2Z1bmN0aW9uIGRmcyh2KXtpZihfLmhhcyh2aXNpdGVkLHYpKXJldHVybjt2aXNpdGVkW3ZdPXRydWU7Y21wdC5wdXNoKHYpO18uZWFjaChnLnN1Y2Nlc3NvcnModiksZGZzKTtfLmVhY2goZy5wcmVkZWNlc3NvcnModiksZGZzKX1fLmVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2NtcHQ9W107ZGZzKHYpO2lmKGNtcHQubGVuZ3RoKWNtcHRzLnB1c2goY21wdCl9KTtyZXR1cm4gY21wdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1kZnM7ZnVuY3Rpb24gZGZzKGcsdnMsb3JkZXIpe2lmKCFfLmlzQXJyYXkodnMpKXZzPQpbdnNdO3ZhciBuYXZpZ2F0aW9uPShnLmlzRGlyZWN0ZWQoKT9nLnN1Y2Nlc3NvcnM6Zy5uZWlnaGJvcnMpLmJpbmQoZyk7dmFyIGFjYz1bXSx2aXNpdGVkPXt9O18uZWFjaCh2cyxmdW5jdGlvbih2KXtpZighZy5oYXNOb2RlKHYpKXRocm93IG5ldyBFcnJvcigiR3JhcGggZG9lcyBub3QgaGF2ZSBub2RlOiAiK3YpO2RvRGZzKGcsdixvcmRlcj09PSJwb3N0Iix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKX0pO3JldHVybiBhY2N9ZnVuY3Rpb24gZG9EZnMoZyx2LHBvc3RvcmRlcix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKXtpZighXy5oYXModmlzaXRlZCx2KSl7dmlzaXRlZFt2XT10cnVlO2lmKCFwb3N0b3JkZXIpYWNjLnB1c2godik7Xy5lYWNoKG5hdmlnYXRpb24odiksZnVuY3Rpb24odyl7ZG9EZnMoZyx3LHBvc3RvcmRlcix2aXNpdGVkLG5hdmlnYXRpb24sYWNjKX0pO2lmKHBvc3RvcmRlcilhY2MucHVzaCh2KX19fSx7Ii4uL2xvZGFzaCI6MTl9XSw0OltmdW5jdGlvbihyZXF1aXJlLAptb2R1bGUsZXhwb3J0cyl7dmFyIGRpamtzdHJhPXJlcXVpcmUoIi4vZGlqa3N0cmEiKSxfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPWRpamtzdHJhQWxsO2Z1bmN0aW9uIGRpamtzdHJhQWxsKGcsd2VpZ2h0RnVuYyxlZGdlRnVuYyl7cmV0dXJuIF8udHJhbnNmb3JtKGcubm9kZXMoKSxmdW5jdGlvbihhY2Msdil7YWNjW3ZdPWRpamtzdHJhKGcsdix3ZWlnaHRGdW5jLGVkZ2VGdW5jKX0se30pfX0seyIuLi9sb2Rhc2giOjE5LCIuL2RpamtzdHJhIjo1fV0sNTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksUHJpb3JpdHlRdWV1ZT1yZXF1aXJlKCIuLi9kYXRhL3ByaW9yaXR5LXF1ZXVlIik7bW9kdWxlLmV4cG9ydHM9ZGlqa3N0cmE7dmFyIERFRkFVTFRfV0VJR0hUX0ZVTkM9Xy5jb25zdGFudCgxKTtmdW5jdGlvbiBkaWprc3RyYShnLHNvdXJjZSx3ZWlnaHRGbixlZGdlRm4pe3JldHVybiBydW5EaWprc3RyYShnLApTdHJpbmcoc291cmNlKSx3ZWlnaHRGbnx8REVGQVVMVF9XRUlHSFRfRlVOQyxlZGdlRm58fGZ1bmN0aW9uKHYpe3JldHVybiBnLm91dEVkZ2VzKHYpfSl9ZnVuY3Rpb24gcnVuRGlqa3N0cmEoZyxzb3VyY2Usd2VpZ2h0Rm4sZWRnZUZuKXt2YXIgcmVzdWx0cz17fSxwcT1uZXcgUHJpb3JpdHlRdWV1ZSx2LHZFbnRyeTt2YXIgdXBkYXRlTmVpZ2hib3JzPWZ1bmN0aW9uKGVkZ2Upe3ZhciB3PWVkZ2UudiE9PXY/ZWRnZS52OmVkZ2Uudyx3RW50cnk9cmVzdWx0c1t3XSx3ZWlnaHQ9d2VpZ2h0Rm4oZWRnZSksZGlzdGFuY2U9dkVudHJ5LmRpc3RhbmNlK3dlaWdodDtpZih3ZWlnaHQ8MCl0aHJvdyBuZXcgRXJyb3IoImRpamtzdHJhIGRvZXMgbm90IGFsbG93IG5lZ2F0aXZlIGVkZ2Ugd2VpZ2h0cy4gIisiQmFkIGVkZ2U6ICIrZWRnZSsiIFdlaWdodDogIit3ZWlnaHQpO2lmKGRpc3RhbmNlPHdFbnRyeS5kaXN0YW5jZSl7d0VudHJ5LmRpc3RhbmNlPWRpc3RhbmNlO3dFbnRyeS5wcmVkZWNlc3Nvcj0KdjtwcS5kZWNyZWFzZSh3LGRpc3RhbmNlKX19O2cubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpe3ZhciBkaXN0YW5jZT12PT09c291cmNlPzA6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO3Jlc3VsdHNbdl09e2Rpc3RhbmNlOmRpc3RhbmNlfTtwcS5hZGQodixkaXN0YW5jZSl9KTt3aGlsZShwcS5zaXplKCk+MCl7dj1wcS5yZW1vdmVNaW4oKTt2RW50cnk9cmVzdWx0c1t2XTtpZih2RW50cnkuZGlzdGFuY2U9PT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpYnJlYWs7ZWRnZUZuKHYpLmZvckVhY2godXBkYXRlTmVpZ2hib3JzKX1yZXR1cm4gcmVzdWx0c319LHsiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSI6MTUsIi4uL2xvZGFzaCI6MTl9XSw2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSx0YXJqYW49cmVxdWlyZSgiLi90YXJqYW4iKTttb2R1bGUuZXhwb3J0cz1maW5kQ3ljbGVzO2Z1bmN0aW9uIGZpbmRDeWNsZXMoZyl7cmV0dXJuIF8uZmlsdGVyKHRhcmphbihnKSwKZnVuY3Rpb24oY21wdCl7cmV0dXJuIGNtcHQubGVuZ3RoPjF8fGNtcHQubGVuZ3RoPT09MSYmZy5oYXNFZGdlKGNtcHRbMF0sY21wdFswXSl9KX19LHsiLi4vbG9kYXNoIjoxOSwiLi90YXJqYW4iOjEzfV0sNzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9ZmxveWRXYXJzaGFsbDt2YXIgREVGQVVMVF9XRUlHSFRfRlVOQz1fLmNvbnN0YW50KDEpO2Z1bmN0aW9uIGZsb3lkV2Fyc2hhbGwoZyx3ZWlnaHRGbixlZGdlRm4pe3JldHVybiBydW5GbG95ZFdhcnNoYWxsKGcsd2VpZ2h0Rm58fERFRkFVTFRfV0VJR0hUX0ZVTkMsZWRnZUZufHxmdW5jdGlvbih2KXtyZXR1cm4gZy5vdXRFZGdlcyh2KX0pfWZ1bmN0aW9uIHJ1bkZsb3lkV2Fyc2hhbGwoZyx3ZWlnaHRGbixlZGdlRm4pe3ZhciByZXN1bHRzPXt9LG5vZGVzPWcubm9kZXMoKTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHYpe3Jlc3VsdHNbdl09Cnt9O3Jlc3VsdHNbdl1bdl09e2Rpc3RhbmNlOjB9O25vZGVzLmZvckVhY2goZnVuY3Rpb24odyl7aWYodiE9PXcpcmVzdWx0c1t2XVt3XT17ZGlzdGFuY2U6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfX0pO2VkZ2VGbih2KS5mb3JFYWNoKGZ1bmN0aW9uKGVkZ2Upe3ZhciB3PWVkZ2Uudj09PXY/ZWRnZS53OmVkZ2UudixkPXdlaWdodEZuKGVkZ2UpO3Jlc3VsdHNbdl1bd109e2Rpc3RhbmNlOmQscHJlZGVjZXNzb3I6dn19KX0pO25vZGVzLmZvckVhY2goZnVuY3Rpb24oayl7dmFyIHJvd0s9cmVzdWx0c1trXTtub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGkpe3ZhciByb3dJPXJlc3VsdHNbaV07bm9kZXMuZm9yRWFjaChmdW5jdGlvbihqKXt2YXIgaWs9cm93SVtrXTt2YXIga2o9cm93S1tqXTt2YXIgaWo9cm93SVtqXTt2YXIgYWx0RGlzdGFuY2U9aWsuZGlzdGFuY2Ura2ouZGlzdGFuY2U7aWYoYWx0RGlzdGFuY2U8aWouZGlzdGFuY2Upe2lqLmRpc3RhbmNlPWFsdERpc3RhbmNlO2lqLnByZWRlY2Vzc29yPQprai5wcmVkZWNlc3Nvcn19KX0pfSk7cmV0dXJuIHJlc3VsdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17Y29tcG9uZW50czpyZXF1aXJlKCIuL2NvbXBvbmVudHMiKSxkaWprc3RyYTpyZXF1aXJlKCIuL2RpamtzdHJhIiksZGlqa3N0cmFBbGw6cmVxdWlyZSgiLi9kaWprc3RyYS1hbGwiKSxmaW5kQ3ljbGVzOnJlcXVpcmUoIi4vZmluZC1jeWNsZXMiKSxmbG95ZFdhcnNoYWxsOnJlcXVpcmUoIi4vZmxveWQtd2Fyc2hhbGwiKSxpc0FjeWNsaWM6cmVxdWlyZSgiLi9pcy1hY3ljbGljIikscG9zdG9yZGVyOnJlcXVpcmUoIi4vcG9zdG9yZGVyIikscHJlb3JkZXI6cmVxdWlyZSgiLi9wcmVvcmRlciIpLHByaW06cmVxdWlyZSgiLi9wcmltIiksdGFyamFuOnJlcXVpcmUoIi4vdGFyamFuIiksdG9wc29ydDpyZXF1aXJlKCIuL3RvcHNvcnQiKX19LHsiLi9jb21wb25lbnRzIjoyLCIuL2RpamtzdHJhIjo1LAoiLi9kaWprc3RyYS1hbGwiOjQsIi4vZmluZC1jeWNsZXMiOjYsIi4vZmxveWQtd2Fyc2hhbGwiOjcsIi4vaXMtYWN5Y2xpYyI6OSwiLi9wb3N0b3JkZXIiOjEwLCIuL3ByZW9yZGVyIjoxMSwiLi9wcmltIjoxMiwiLi90YXJqYW4iOjEzLCIuL3RvcHNvcnQiOjE0fV0sOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIHRvcHNvcnQ9cmVxdWlyZSgiLi90b3Bzb3J0Iik7bW9kdWxlLmV4cG9ydHM9aXNBY3ljbGljO2Z1bmN0aW9uIGlzQWN5Y2xpYyhnKXt0cnl7dG9wc29ydChnKX1jYXRjaChlKXtpZihlIGluc3RhbmNlb2YgdG9wc29ydC5DeWNsZUV4Y2VwdGlvbilyZXR1cm4gZmFsc2U7dGhyb3cgZTt9cmV0dXJuIHRydWV9fSx7Ii4vdG9wc29ydCI6MTR9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGRmcz1yZXF1aXJlKCIuL2RmcyIpO21vZHVsZS5leHBvcnRzPXBvc3RvcmRlcjtmdW5jdGlvbiBwb3N0b3JkZXIoZyx2cyl7cmV0dXJuIGRmcyhnLAp2cywicG9zdCIpfX0seyIuL2RmcyI6M31dLDExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgZGZzPXJlcXVpcmUoIi4vZGZzIik7bW9kdWxlLmV4cG9ydHM9cHJlb3JkZXI7ZnVuY3Rpb24gcHJlb3JkZXIoZyx2cyl7cmV0dXJuIGRmcyhnLHZzLCJwcmUiKX19LHsiLi9kZnMiOjN9XSwxMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGgiKSxQcmlvcml0eVF1ZXVlPXJlcXVpcmUoIi4uL2RhdGEvcHJpb3JpdHktcXVldWUiKTttb2R1bGUuZXhwb3J0cz1wcmltO2Z1bmN0aW9uIHByaW0oZyx3ZWlnaHRGdW5jKXt2YXIgcmVzdWx0PW5ldyBHcmFwaCxwYXJlbnRzPXt9LHBxPW5ldyBQcmlvcml0eVF1ZXVlLHY7ZnVuY3Rpb24gdXBkYXRlTmVpZ2hib3JzKGVkZ2Upe3ZhciB3PWVkZ2Uudj09PXY/ZWRnZS53OmVkZ2Uudixwcmk9cHEucHJpb3JpdHkodyk7aWYocHJpIT09CnVuZGVmaW5lZCl7dmFyIGVkZ2VXZWlnaHQ9d2VpZ2h0RnVuYyhlZGdlKTtpZihlZGdlV2VpZ2h0PHByaSl7cGFyZW50c1t3XT12O3BxLmRlY3JlYXNlKHcsZWRnZVdlaWdodCl9fX1pZihnLm5vZGVDb3VudCgpPT09MClyZXR1cm4gcmVzdWx0O18uZWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7cHEuYWRkKHYsTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTtyZXN1bHQuc2V0Tm9kZSh2KX0pO3BxLmRlY3JlYXNlKGcubm9kZXMoKVswXSwwKTt2YXIgaW5pdD1mYWxzZTt3aGlsZShwcS5zaXplKCk+MCl7dj1wcS5yZW1vdmVNaW4oKTtpZihfLmhhcyhwYXJlbnRzLHYpKXJlc3VsdC5zZXRFZGdlKHYscGFyZW50c1t2XSk7ZWxzZSBpZihpbml0KXRocm93IG5ldyBFcnJvcigiSW5wdXQgZ3JhcGggaXMgbm90IGNvbm5lY3RlZDogIitnKTtlbHNlIGluaXQ9dHJ1ZTtnLm5vZGVFZGdlcyh2KS5mb3JFYWNoKHVwZGF0ZU5laWdoYm9ycyl9cmV0dXJuIHJlc3VsdH19LHsiLi4vZGF0YS9wcmlvcml0eS1xdWV1ZSI6MTUsCiIuLi9ncmFwaCI6MTYsIi4uL2xvZGFzaCI6MTl9XSwxMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9dGFyamFuO2Z1bmN0aW9uIHRhcmphbihnKXt2YXIgaW5kZXg9MCxzdGFjaz1bXSx2aXNpdGVkPXt9LHJlc3VsdHM9W107ZnVuY3Rpb24gZGZzKHYpe3ZhciBlbnRyeT12aXNpdGVkW3ZdPXtvblN0YWNrOnRydWUsbG93bGluazppbmRleCxpbmRleDppbmRleCsrfTtzdGFjay5wdXNoKHYpO2cuc3VjY2Vzc29ycyh2KS5mb3JFYWNoKGZ1bmN0aW9uKHcpe2lmKCFfLmhhcyh2aXNpdGVkLHcpKXtkZnModyk7ZW50cnkubG93bGluaz1NYXRoLm1pbihlbnRyeS5sb3dsaW5rLHZpc2l0ZWRbd10ubG93bGluayl9ZWxzZSBpZih2aXNpdGVkW3ddLm9uU3RhY2spZW50cnkubG93bGluaz1NYXRoLm1pbihlbnRyeS5sb3dsaW5rLHZpc2l0ZWRbd10uaW5kZXgpfSk7aWYoZW50cnkubG93bGluaz09PWVudHJ5LmluZGV4KXt2YXIgY21wdD0KW10sdztkb3t3PXN0YWNrLnBvcCgpO3Zpc2l0ZWRbd10ub25TdGFjaz1mYWxzZTtjbXB0LnB1c2godyl9d2hpbGUodiE9PXcpO3Jlc3VsdHMucHVzaChjbXB0KX19Zy5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24odil7aWYoIV8uaGFzKHZpc2l0ZWQsdikpZGZzKHYpfSk7cmV0dXJuIHJlc3VsdHN9fSx7Ii4uL2xvZGFzaCI6MTl9XSwxNDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9dG9wc29ydDt0b3Bzb3J0LkN5Y2xlRXhjZXB0aW9uPUN5Y2xlRXhjZXB0aW9uO2Z1bmN0aW9uIHRvcHNvcnQoZyl7dmFyIHZpc2l0ZWQ9e30sc3RhY2s9e30scmVzdWx0cz1bXTtmdW5jdGlvbiB2aXNpdChub2RlKXtpZihfLmhhcyhzdGFjayxub2RlKSl0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb247aWYoIV8uaGFzKHZpc2l0ZWQsbm9kZSkpe3N0YWNrW25vZGVdPXRydWU7dmlzaXRlZFtub2RlXT10cnVlO18uZWFjaChnLnByZWRlY2Vzc29ycyhub2RlKSwKdmlzaXQpO2RlbGV0ZSBzdGFja1tub2RlXTtyZXN1bHRzLnB1c2gobm9kZSl9fV8uZWFjaChnLnNpbmtzKCksdmlzaXQpO2lmKF8uc2l6ZSh2aXNpdGVkKSE9PWcubm9kZUNvdW50KCkpdGhyb3cgbmV3IEN5Y2xlRXhjZXB0aW9uO3JldHVybiByZXN1bHRzfWZ1bmN0aW9uIEN5Y2xlRXhjZXB0aW9uKCl7fX0seyIuLi9sb2Rhc2giOjE5fV0sMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPVByaW9yaXR5UXVldWU7ZnVuY3Rpb24gUHJpb3JpdHlRdWV1ZSgpe3RoaXMuX2Fycj1bXTt0aGlzLl9rZXlJbmRpY2VzPXt9fVByaW9yaXR5UXVldWUucHJvdG90eXBlLnNpemU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXJyLmxlbmd0aH07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUua2V5cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcnIubWFwKGZ1bmN0aW9uKHgpe3JldHVybiB4LmtleX0pfTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5oYXM9CmZ1bmN0aW9uKGtleSl7cmV0dXJuIF8uaGFzKHRoaXMuX2tleUluZGljZXMsa2V5KX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucHJpb3JpdHk9ZnVuY3Rpb24oa2V5KXt2YXIgaW5kZXg9dGhpcy5fa2V5SW5kaWNlc1trZXldO2lmKGluZGV4IT09dW5kZWZpbmVkKXJldHVybiB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5fTtQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5taW49ZnVuY3Rpb24oKXtpZih0aGlzLnNpemUoKT09PTApdGhyb3cgbmV3IEVycm9yKCJRdWV1ZSB1bmRlcmZsb3ciKTtyZXR1cm4gdGhpcy5fYXJyWzBdLmtleX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGtleSxwcmlvcml0eSl7dmFyIGtleUluZGljZXM9dGhpcy5fa2V5SW5kaWNlcztrZXk9U3RyaW5nKGtleSk7aWYoIV8uaGFzKGtleUluZGljZXMsa2V5KSl7dmFyIGFycj10aGlzLl9hcnI7dmFyIGluZGV4PWFyci5sZW5ndGg7a2V5SW5kaWNlc1trZXldPWluZGV4O2Fyci5wdXNoKHtrZXk6a2V5LApwcmlvcml0eTpwcmlvcml0eX0pO3RoaXMuX2RlY3JlYXNlKGluZGV4KTtyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2V9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLnJlbW92ZU1pbj1mdW5jdGlvbigpe3RoaXMuX3N3YXAoMCx0aGlzLl9hcnIubGVuZ3RoLTEpO3ZhciBtaW49dGhpcy5fYXJyLnBvcCgpO2RlbGV0ZSB0aGlzLl9rZXlJbmRpY2VzW21pbi5rZXldO3RoaXMuX2hlYXBpZnkoMCk7cmV0dXJuIG1pbi5rZXl9O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLmRlY3JlYXNlPWZ1bmN0aW9uKGtleSxwcmlvcml0eSl7dmFyIGluZGV4PXRoaXMuX2tleUluZGljZXNba2V5XTtpZihwcmlvcml0eT50aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5KXRocm93IG5ldyBFcnJvcigiTmV3IHByaW9yaXR5IGlzIGdyZWF0ZXIgdGhhbiBjdXJyZW50IHByaW9yaXR5LiAiKyJLZXk6ICIra2V5KyIgT2xkOiAiK3RoaXMuX2FycltpbmRleF0ucHJpb3JpdHkrIiBOZXc6ICIrcHJpb3JpdHkpO3RoaXMuX2FycltpbmRleF0ucHJpb3JpdHk9CnByaW9yaXR5O3RoaXMuX2RlY3JlYXNlKGluZGV4KX07UHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX2hlYXBpZnk9ZnVuY3Rpb24oaSl7dmFyIGFycj10aGlzLl9hcnI7dmFyIGw9MippLHI9bCsxLGxhcmdlc3Q9aTtpZihsPGFyci5sZW5ndGgpe2xhcmdlc3Q9YXJyW2xdLnByaW9yaXR5PGFycltsYXJnZXN0XS5wcmlvcml0eT9sOmxhcmdlc3Q7aWYocjxhcnIubGVuZ3RoKWxhcmdlc3Q9YXJyW3JdLnByaW9yaXR5PGFycltsYXJnZXN0XS5wcmlvcml0eT9yOmxhcmdlc3Q7aWYobGFyZ2VzdCE9PWkpe3RoaXMuX3N3YXAoaSxsYXJnZXN0KTt0aGlzLl9oZWFwaWZ5KGxhcmdlc3QpfX19O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLl9kZWNyZWFzZT1mdW5jdGlvbihpbmRleCl7dmFyIGFycj10aGlzLl9hcnI7dmFyIHByaW9yaXR5PWFycltpbmRleF0ucHJpb3JpdHk7dmFyIHBhcmVudDt3aGlsZShpbmRleCE9PTApe3BhcmVudD1pbmRleD4+MTtpZihhcnJbcGFyZW50XS5wcmlvcml0eTxwcmlvcml0eSlicmVhazsKdGhpcy5fc3dhcChpbmRleCxwYXJlbnQpO2luZGV4PXBhcmVudH19O1ByaW9yaXR5UXVldWUucHJvdG90eXBlLl9zd2FwPWZ1bmN0aW9uKGksail7dmFyIGFycj10aGlzLl9hcnI7dmFyIGtleUluZGljZXM9dGhpcy5fa2V5SW5kaWNlczt2YXIgb3JpZ0Fyckk9YXJyW2ldO3ZhciBvcmlnQXJySj1hcnJbal07YXJyW2ldPW9yaWdBcnJKO2FycltqXT1vcmlnQXJySTtrZXlJbmRpY2VzW29yaWdBcnJKLmtleV09aTtrZXlJbmRpY2VzW29yaWdBcnJJLmtleV09an19LHsiLi4vbG9kYXNoIjoxOX1dLDE2OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPUdyYXBoO3ZhciBERUZBVUxUX0VER0VfTkFNRT0iXHgwMCIsR1JBUEhfTk9ERT0iXHgwMCIsRURHRV9LRVlfREVMSU09Ilx1MDAwMSI7ZnVuY3Rpb24gR3JhcGgob3B0cyl7dGhpcy5faXNEaXJlY3RlZD1fLmhhcyhvcHRzLCJkaXJlY3RlZCIpP29wdHMuZGlyZWN0ZWQ6CnRydWU7dGhpcy5faXNNdWx0aWdyYXBoPV8uaGFzKG9wdHMsIm11bHRpZ3JhcGgiKT9vcHRzLm11bHRpZ3JhcGg6ZmFsc2U7dGhpcy5faXNDb21wb3VuZD1fLmhhcyhvcHRzLCJjb21wb3VuZCIpP29wdHMuY29tcG91bmQ6ZmFsc2U7dGhpcy5fbGFiZWw9dW5kZWZpbmVkO3RoaXMuX2RlZmF1bHROb2RlTGFiZWxGbj1fLmNvbnN0YW50KHVuZGVmaW5lZCk7dGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuPV8uY29uc3RhbnQodW5kZWZpbmVkKTt0aGlzLl9ub2Rlcz17fTtpZih0aGlzLl9pc0NvbXBvdW5kKXt0aGlzLl9wYXJlbnQ9e307dGhpcy5fY2hpbGRyZW49e307dGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV09e319dGhpcy5faW49e307dGhpcy5fcHJlZHM9e307dGhpcy5fb3V0PXt9O3RoaXMuX3N1Y3M9e307dGhpcy5fZWRnZU9ianM9e307dGhpcy5fZWRnZUxhYmVscz17fX1HcmFwaC5wcm90b3R5cGUuX25vZGVDb3VudD0wO0dyYXBoLnByb3RvdHlwZS5fZWRnZUNvdW50PTA7R3JhcGgucHJvdG90eXBlLmlzRGlyZWN0ZWQ9CmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzRGlyZWN0ZWR9O0dyYXBoLnByb3RvdHlwZS5pc011bHRpZ3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNNdWx0aWdyYXBofTtHcmFwaC5wcm90b3R5cGUuaXNDb21wb3VuZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0NvbXBvdW5kfTtHcmFwaC5wcm90b3R5cGUuc2V0R3JhcGg9ZnVuY3Rpb24obGFiZWwpe3RoaXMuX2xhYmVsPWxhYmVsO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuZ3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFiZWx9O0dyYXBoLnByb3RvdHlwZS5zZXREZWZhdWx0Tm9kZUxhYmVsPWZ1bmN0aW9uKG5ld0RlZmF1bHQpe2lmKCFfLmlzRnVuY3Rpb24obmV3RGVmYXVsdCkpbmV3RGVmYXVsdD1fLmNvbnN0YW50KG5ld0RlZmF1bHQpO3RoaXMuX2RlZmF1bHROb2RlTGFiZWxGbj1uZXdEZWZhdWx0O3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUubm9kZUNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVDb3VudH07CkdyYXBoLnByb3RvdHlwZS5ub2Rlcz1mdW5jdGlvbigpe3JldHVybiBfLmtleXModGhpcy5fbm9kZXMpfTtHcmFwaC5wcm90b3R5cGUuc291cmNlcz1mdW5jdGlvbigpe3ZhciBzZWxmPXRoaXM7cmV0dXJuIF8uZmlsdGVyKHRoaXMubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4gXy5pc0VtcHR5KHNlbGYuX2luW3ZdKX0pfTtHcmFwaC5wcm90b3R5cGUuc2lua3M9ZnVuY3Rpb24oKXt2YXIgc2VsZj10aGlzO3JldHVybiBfLmZpbHRlcih0aGlzLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIF8uaXNFbXB0eShzZWxmLl9vdXRbdl0pfSl9O0dyYXBoLnByb3RvdHlwZS5zZXROb2Rlcz1mdW5jdGlvbih2cyx2YWx1ZSl7dmFyIGFyZ3M9YXJndW1lbnRzO3ZhciBzZWxmPXRoaXM7Xy5lYWNoKHZzLGZ1bmN0aW9uKHYpe2lmKGFyZ3MubGVuZ3RoPjEpc2VsZi5zZXROb2RlKHYsdmFsdWUpO2Vsc2Ugc2VsZi5zZXROb2RlKHYpfSk7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5zZXROb2RlPQpmdW5jdGlvbih2LHZhbHVlKXtpZihfLmhhcyh0aGlzLl9ub2Rlcyx2KSl7aWYoYXJndW1lbnRzLmxlbmd0aD4xKXRoaXMuX25vZGVzW3ZdPXZhbHVlO3JldHVybiB0aGlzfXRoaXMuX25vZGVzW3ZdPWFyZ3VtZW50cy5sZW5ndGg+MT92YWx1ZTp0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4odik7aWYodGhpcy5faXNDb21wb3VuZCl7dGhpcy5fcGFyZW50W3ZdPUdSQVBIX05PREU7dGhpcy5fY2hpbGRyZW5bdl09e307dGhpcy5fY2hpbGRyZW5bR1JBUEhfTk9ERV1bdl09dHJ1ZX10aGlzLl9pblt2XT17fTt0aGlzLl9wcmVkc1t2XT17fTt0aGlzLl9vdXRbdl09e307dGhpcy5fc3Vjc1t2XT17fTsrK3RoaXMuX25vZGVDb3VudDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLm5vZGU9ZnVuY3Rpb24odil7cmV0dXJuIHRoaXMuX25vZGVzW3ZdfTtHcmFwaC5wcm90b3R5cGUuaGFzTm9kZT1mdW5jdGlvbih2KXtyZXR1cm4gXy5oYXModGhpcy5fbm9kZXMsdil9O0dyYXBoLnByb3RvdHlwZS5yZW1vdmVOb2RlPQpmdW5jdGlvbih2KXt2YXIgc2VsZj10aGlzO2lmKF8uaGFzKHRoaXMuX25vZGVzLHYpKXt2YXIgcmVtb3ZlRWRnZT1mdW5jdGlvbihlKXtzZWxmLnJlbW92ZUVkZ2Uoc2VsZi5fZWRnZU9ianNbZV0pfTtkZWxldGUgdGhpcy5fbm9kZXNbdl07aWYodGhpcy5faXNDb21wb3VuZCl7dGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7ZGVsZXRlIHRoaXMuX3BhcmVudFt2XTtfLmVhY2godGhpcy5jaGlsZHJlbih2KSxmdW5jdGlvbihjaGlsZCl7c2VsZi5zZXRQYXJlbnQoY2hpbGQpfSk7ZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3ZdfV8uZWFjaChfLmtleXModGhpcy5faW5bdl0pLHJlbW92ZUVkZ2UpO2RlbGV0ZSB0aGlzLl9pblt2XTtkZWxldGUgdGhpcy5fcHJlZHNbdl07Xy5lYWNoKF8ua2V5cyh0aGlzLl9vdXRbdl0pLHJlbW92ZUVkZ2UpO2RlbGV0ZSB0aGlzLl9vdXRbdl07ZGVsZXRlIHRoaXMuX3N1Y3Nbdl07LS10aGlzLl9ub2RlQ291bnR9cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5zZXRQYXJlbnQ9CmZ1bmN0aW9uKHYscGFyZW50KXtpZighdGhpcy5faXNDb21wb3VuZCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzZXQgcGFyZW50IGluIGEgbm9uLWNvbXBvdW5kIGdyYXBoIik7aWYoXy5pc1VuZGVmaW5lZChwYXJlbnQpKXBhcmVudD1HUkFQSF9OT0RFO2Vsc2V7cGFyZW50Kz0iIjtmb3IodmFyIGFuY2VzdG9yPXBhcmVudDshXy5pc1VuZGVmaW5lZChhbmNlc3Rvcik7YW5jZXN0b3I9dGhpcy5wYXJlbnQoYW5jZXN0b3IpKWlmKGFuY2VzdG9yPT09dil0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgIitwYXJlbnQrIiBhcyBwYXJlbnQgb2YgIit2KyIgd291bGQgY3JlYXRlIGEgY3ljbGUiKTt0aGlzLnNldE5vZGUocGFyZW50KX10aGlzLnNldE5vZGUodik7dGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Qodik7dGhpcy5fcGFyZW50W3ZdPXBhcmVudDt0aGlzLl9jaGlsZHJlbltwYXJlbnRdW3ZdPXRydWU7cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Q9CmZ1bmN0aW9uKHYpe2RlbGV0ZSB0aGlzLl9jaGlsZHJlblt0aGlzLl9wYXJlbnRbdl1dW3ZdfTtHcmFwaC5wcm90b3R5cGUucGFyZW50PWZ1bmN0aW9uKHYpe2lmKHRoaXMuX2lzQ29tcG91bmQpe3ZhciBwYXJlbnQ9dGhpcy5fcGFyZW50W3ZdO2lmKHBhcmVudCE9PUdSQVBIX05PREUpcmV0dXJuIHBhcmVudH19O0dyYXBoLnByb3RvdHlwZS5jaGlsZHJlbj1mdW5jdGlvbih2KXtpZihfLmlzVW5kZWZpbmVkKHYpKXY9R1JBUEhfTk9ERTtpZih0aGlzLl9pc0NvbXBvdW5kKXt2YXIgY2hpbGRyZW49dGhpcy5fY2hpbGRyZW5bdl07aWYoY2hpbGRyZW4pcmV0dXJuIF8ua2V5cyhjaGlsZHJlbil9ZWxzZSBpZih2PT09R1JBUEhfTk9ERSlyZXR1cm4gdGhpcy5ub2RlcygpO2Vsc2UgaWYodGhpcy5oYXNOb2RlKHYpKXJldHVybltdfTtHcmFwaC5wcm90b3R5cGUucHJlZGVjZXNzb3JzPWZ1bmN0aW9uKHYpe3ZhciBwcmVkc1Y9dGhpcy5fcHJlZHNbdl07aWYocHJlZHNWKXJldHVybiBfLmtleXMocHJlZHNWKX07CkdyYXBoLnByb3RvdHlwZS5zdWNjZXNzb3JzPWZ1bmN0aW9uKHYpe3ZhciBzdWNzVj10aGlzLl9zdWNzW3ZdO2lmKHN1Y3NWKXJldHVybiBfLmtleXMoc3Vjc1YpfTtHcmFwaC5wcm90b3R5cGUubmVpZ2hib3JzPWZ1bmN0aW9uKHYpe3ZhciBwcmVkcz10aGlzLnByZWRlY2Vzc29ycyh2KTtpZihwcmVkcylyZXR1cm4gXy51bmlvbihwcmVkcyx0aGlzLnN1Y2Nlc3NvcnModikpfTtHcmFwaC5wcm90b3R5cGUuaXNMZWFmPWZ1bmN0aW9uKHYpe3ZhciBuZWlnaGJvcnM7aWYodGhpcy5pc0RpcmVjdGVkKCkpbmVpZ2hib3JzPXRoaXMuc3VjY2Vzc29ycyh2KTtlbHNlIG5laWdoYm9ycz10aGlzLm5laWdoYm9ycyh2KTtyZXR1cm4gbmVpZ2hib3JzLmxlbmd0aD09PTB9O0dyYXBoLnByb3RvdHlwZS5maWx0ZXJOb2Rlcz1mdW5jdGlvbihmaWx0ZXIpe3ZhciBjb3B5PW5ldyB0aGlzLmNvbnN0cnVjdG9yKHtkaXJlY3RlZDp0aGlzLl9pc0RpcmVjdGVkLG11bHRpZ3JhcGg6dGhpcy5faXNNdWx0aWdyYXBoLApjb21wb3VuZDp0aGlzLl9pc0NvbXBvdW5kfSk7Y29weS5zZXRHcmFwaCh0aGlzLmdyYXBoKCkpO3ZhciBzZWxmPXRoaXM7Xy5lYWNoKHRoaXMuX25vZGVzLGZ1bmN0aW9uKHZhbHVlLHYpe2lmKGZpbHRlcih2KSljb3B5LnNldE5vZGUodix2YWx1ZSl9KTtfLmVhY2godGhpcy5fZWRnZU9ianMsZnVuY3Rpb24oZSl7aWYoY29weS5oYXNOb2RlKGUudikmJmNvcHkuaGFzTm9kZShlLncpKWNvcHkuc2V0RWRnZShlLHNlbGYuZWRnZShlKSl9KTt2YXIgcGFyZW50cz17fTtmdW5jdGlvbiBmaW5kUGFyZW50KHYpe3ZhciBwYXJlbnQ9c2VsZi5wYXJlbnQodik7aWYocGFyZW50PT09dW5kZWZpbmVkfHxjb3B5Lmhhc05vZGUocGFyZW50KSl7cGFyZW50c1t2XT1wYXJlbnQ7cmV0dXJuIHBhcmVudH1lbHNlIGlmKHBhcmVudCBpbiBwYXJlbnRzKXJldHVybiBwYXJlbnRzW3BhcmVudF07ZWxzZSByZXR1cm4gZmluZFBhcmVudChwYXJlbnQpfWlmKHRoaXMuX2lzQ29tcG91bmQpXy5lYWNoKGNvcHkubm9kZXMoKSwKZnVuY3Rpb24odil7Y29weS5zZXRQYXJlbnQodixmaW5kUGFyZW50KHYpKX0pO3JldHVybiBjb3B5fTtHcmFwaC5wcm90b3R5cGUuc2V0RGVmYXVsdEVkZ2VMYWJlbD1mdW5jdGlvbihuZXdEZWZhdWx0KXtpZighXy5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKW5ld0RlZmF1bHQ9Xy5jb25zdGFudChuZXdEZWZhdWx0KTt0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm49bmV3RGVmYXVsdDtyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmVkZ2VDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlQ291bnR9O0dyYXBoLnByb3RvdHlwZS5lZGdlcz1mdW5jdGlvbigpe3JldHVybiBfLnZhbHVlcyh0aGlzLl9lZGdlT2Jqcyl9O0dyYXBoLnByb3RvdHlwZS5zZXRQYXRoPWZ1bmN0aW9uKHZzLHZhbHVlKXt2YXIgc2VsZj10aGlzLGFyZ3M9YXJndW1lbnRzO18ucmVkdWNlKHZzLGZ1bmN0aW9uKHYsdyl7aWYoYXJncy5sZW5ndGg+MSlzZWxmLnNldEVkZ2Uodix3LHZhbHVlKTtlbHNlIHNlbGYuc2V0RWRnZSh2LAp3KTtyZXR1cm4gd30pO3JldHVybiB0aGlzfTtHcmFwaC5wcm90b3R5cGUuc2V0RWRnZT1mdW5jdGlvbigpe3ZhciB2LHcsbmFtZSx2YWx1ZSx2YWx1ZVNwZWNpZmllZD1mYWxzZSxhcmcwPWFyZ3VtZW50c1swXTtpZih0eXBlb2YgYXJnMD09PSJvYmplY3QiJiZhcmcwIT09bnVsbCYmInYiaW4gYXJnMCl7dj1hcmcwLnY7dz1hcmcwLnc7bmFtZT1hcmcwLm5hbWU7aWYoYXJndW1lbnRzLmxlbmd0aD09PTIpe3ZhbHVlPWFyZ3VtZW50c1sxXTt2YWx1ZVNwZWNpZmllZD10cnVlfX1lbHNle3Y9YXJnMDt3PWFyZ3VtZW50c1sxXTtuYW1lPWFyZ3VtZW50c1szXTtpZihhcmd1bWVudHMubGVuZ3RoPjIpe3ZhbHVlPWFyZ3VtZW50c1syXTt2YWx1ZVNwZWNpZmllZD10cnVlfX12PSIiK3Y7dz0iIit3O2lmKCFfLmlzVW5kZWZpbmVkKG5hbWUpKW5hbWU9IiIrbmFtZTt2YXIgZT1lZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7aWYoXy5oYXModGhpcy5fZWRnZUxhYmVscywKZSkpe2lmKHZhbHVlU3BlY2lmaWVkKXRoaXMuX2VkZ2VMYWJlbHNbZV09dmFsdWU7cmV0dXJuIHRoaXN9aWYoIV8uaXNVbmRlZmluZWQobmFtZSkmJiF0aGlzLl9pc011bHRpZ3JhcGgpdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc2V0IGEgbmFtZWQgZWRnZSB3aGVuIGlzTXVsdGlncmFwaCBceDNkIGZhbHNlIik7dGhpcy5zZXROb2RlKHYpO3RoaXMuc2V0Tm9kZSh3KTt0aGlzLl9lZGdlTGFiZWxzW2VdPXZhbHVlU3BlY2lmaWVkP3ZhbHVlOnRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbih2LHcsbmFtZSk7dmFyIGVkZ2VPYmo9ZWRnZUFyZ3NUb09iaih0aGlzLl9pc0RpcmVjdGVkLHYsdyxuYW1lKTt2PWVkZ2VPYmoudjt3PWVkZ2VPYmoudztPYmplY3QuZnJlZXplKGVkZ2VPYmopO3RoaXMuX2VkZ2VPYmpzW2VdPWVkZ2VPYmo7aW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fcHJlZHNbd10sdik7aW5jcmVtZW50T3JJbml0RW50cnkodGhpcy5fc3Vjc1t2XSx3KTt0aGlzLl9pblt3XVtlXT0KZWRnZU9iajt0aGlzLl9vdXRbdl1bZV09ZWRnZU9iajt0aGlzLl9lZGdlQ291bnQrKztyZXR1cm4gdGhpc307R3JhcGgucHJvdG90eXBlLmVkZ2U9ZnVuY3Rpb24odix3LG5hbWUpe3ZhciBlPWFyZ3VtZW50cy5sZW5ndGg9PT0xP2VkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsYXJndW1lbnRzWzBdKTplZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSk7cmV0dXJuIHRoaXMuX2VkZ2VMYWJlbHNbZV19O0dyYXBoLnByb3RvdHlwZS5oYXNFZGdlPWZ1bmN0aW9uKHYsdyxuYW1lKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoPT09MT9lZGdlT2JqVG9JZCh0aGlzLl9pc0RpcmVjdGVkLGFyZ3VtZW50c1swXSk6ZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsdix3LG5hbWUpO3JldHVybiBfLmhhcyh0aGlzLl9lZGdlTGFiZWxzLGUpfTtHcmFwaC5wcm90b3R5cGUucmVtb3ZlRWRnZT1mdW5jdGlvbih2LHcsbmFtZSl7dmFyIGU9YXJndW1lbnRzLmxlbmd0aD09PTE/CmVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsYXJndW1lbnRzWzBdKTplZGdlQXJnc1RvSWQodGhpcy5faXNEaXJlY3RlZCx2LHcsbmFtZSksZWRnZT10aGlzLl9lZGdlT2Jqc1tlXTtpZihlZGdlKXt2PWVkZ2Uudjt3PWVkZ2UudztkZWxldGUgdGhpcy5fZWRnZUxhYmVsc1tlXTtkZWxldGUgdGhpcy5fZWRnZU9ianNbZV07ZGVjcmVtZW50T3JSZW1vdmVFbnRyeSh0aGlzLl9wcmVkc1t3XSx2KTtkZWNyZW1lbnRPclJlbW92ZUVudHJ5KHRoaXMuX3N1Y3Nbdl0sdyk7ZGVsZXRlIHRoaXMuX2luW3ddW2VdO2RlbGV0ZSB0aGlzLl9vdXRbdl1bZV07dGhpcy5fZWRnZUNvdW50LS19cmV0dXJuIHRoaXN9O0dyYXBoLnByb3RvdHlwZS5pbkVkZ2VzPWZ1bmN0aW9uKHYsdSl7dmFyIGluVj10aGlzLl9pblt2XTtpZihpblYpe3ZhciBlZGdlcz1fLnZhbHVlcyhpblYpO2lmKCF1KXJldHVybiBlZGdlcztyZXR1cm4gXy5maWx0ZXIoZWRnZXMsZnVuY3Rpb24oZWRnZSl7cmV0dXJuIGVkZ2Uudj09PQp1fSl9fTtHcmFwaC5wcm90b3R5cGUub3V0RWRnZXM9ZnVuY3Rpb24odix3KXt2YXIgb3V0Vj10aGlzLl9vdXRbdl07aWYob3V0Vil7dmFyIGVkZ2VzPV8udmFsdWVzKG91dFYpO2lmKCF3KXJldHVybiBlZGdlcztyZXR1cm4gXy5maWx0ZXIoZWRnZXMsZnVuY3Rpb24oZWRnZSl7cmV0dXJuIGVkZ2Uudz09PXd9KX19O0dyYXBoLnByb3RvdHlwZS5ub2RlRWRnZXM9ZnVuY3Rpb24odix3KXt2YXIgaW5FZGdlcz10aGlzLmluRWRnZXModix3KTtpZihpbkVkZ2VzKXJldHVybiBpbkVkZ2VzLmNvbmNhdCh0aGlzLm91dEVkZ2VzKHYsdykpfTtmdW5jdGlvbiBpbmNyZW1lbnRPckluaXRFbnRyeShtYXAsayl7aWYobWFwW2tdKW1hcFtrXSsrO2Vsc2UgbWFwW2tdPTF9ZnVuY3Rpb24gZGVjcmVtZW50T3JSZW1vdmVFbnRyeShtYXAsayl7aWYoIS0tbWFwW2tdKWRlbGV0ZSBtYXBba119ZnVuY3Rpb24gZWRnZUFyZ3NUb0lkKGlzRGlyZWN0ZWQsdl8sd18sbmFtZSl7dmFyIHY9IiIrdl87dmFyIHc9CiIiK3dfO2lmKCFpc0RpcmVjdGVkJiZ2Pncpe3ZhciB0bXA9djt2PXc7dz10bXB9cmV0dXJuIHYrRURHRV9LRVlfREVMSU0rdytFREdFX0tFWV9ERUxJTSsoXy5pc1VuZGVmaW5lZChuYW1lKT9ERUZBVUxUX0VER0VfTkFNRTpuYW1lKX1mdW5jdGlvbiBlZGdlQXJnc1RvT2JqKGlzRGlyZWN0ZWQsdl8sd18sbmFtZSl7dmFyIHY9IiIrdl87dmFyIHc9IiIrd187aWYoIWlzRGlyZWN0ZWQmJnY+dyl7dmFyIHRtcD12O3Y9dzt3PXRtcH12YXIgZWRnZU9iaj17djp2LHc6d307aWYobmFtZSllZGdlT2JqLm5hbWU9bmFtZTtyZXR1cm4gZWRnZU9ian1mdW5jdGlvbiBlZGdlT2JqVG9JZChpc0RpcmVjdGVkLGVkZ2VPYmope3JldHVybiBlZGdlQXJnc1RvSWQoaXNEaXJlY3RlZCxlZGdlT2JqLnYsZWRnZU9iai53LGVkZ2VPYmoubmFtZSl9fSx7Ii4vbG9kYXNoIjoxOX1dLDE3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz17R3JhcGg6cmVxdWlyZSgiLi9ncmFwaCIpLAp2ZXJzaW9uOnJlcXVpcmUoIi4vdmVyc2lvbiIpfX0seyIuL2dyYXBoIjoxNiwiLi92ZXJzaW9uIjoyMH1dLDE4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGgiKTttb2R1bGUuZXhwb3J0cz17d3JpdGU6d3JpdGUscmVhZDpyZWFkfTtmdW5jdGlvbiB3cml0ZShnKXt2YXIganNvbj17b3B0aW9uczp7ZGlyZWN0ZWQ6Zy5pc0RpcmVjdGVkKCksbXVsdGlncmFwaDpnLmlzTXVsdGlncmFwaCgpLGNvbXBvdW5kOmcuaXNDb21wb3VuZCgpfSxub2Rlczp3cml0ZU5vZGVzKGcpLGVkZ2VzOndyaXRlRWRnZXMoZyl9O2lmKCFfLmlzVW5kZWZpbmVkKGcuZ3JhcGgoKSkpanNvbi52YWx1ZT1fLmNsb25lKGcuZ3JhcGgoKSk7cmV0dXJuIGpzb259ZnVuY3Rpb24gd3JpdGVOb2RlcyhnKXtyZXR1cm4gXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlVmFsdWU9Zy5ub2RlKHYpLHBhcmVudD0KZy5wYXJlbnQodiksbm9kZT17djp2fTtpZighXy5pc1VuZGVmaW5lZChub2RlVmFsdWUpKW5vZGUudmFsdWU9bm9kZVZhbHVlO2lmKCFfLmlzVW5kZWZpbmVkKHBhcmVudCkpbm9kZS5wYXJlbnQ9cGFyZW50O3JldHVybiBub2RlfSl9ZnVuY3Rpb24gd3JpdGVFZGdlcyhnKXtyZXR1cm4gXy5tYXAoZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlVmFsdWU9Zy5lZGdlKGUpLGVkZ2U9e3Y6ZS52LHc6ZS53fTtpZighXy5pc1VuZGVmaW5lZChlLm5hbWUpKWVkZ2UubmFtZT1lLm5hbWU7aWYoIV8uaXNVbmRlZmluZWQoZWRnZVZhbHVlKSllZGdlLnZhbHVlPWVkZ2VWYWx1ZTtyZXR1cm4gZWRnZX0pfWZ1bmN0aW9uIHJlYWQoanNvbil7dmFyIGc9KG5ldyBHcmFwaChqc29uLm9wdGlvbnMpKS5zZXRHcmFwaChqc29uLnZhbHVlKTtfLmVhY2goanNvbi5ub2RlcyxmdW5jdGlvbihlbnRyeSl7Zy5zZXROb2RlKGVudHJ5LnYsZW50cnkudmFsdWUpO2lmKGVudHJ5LnBhcmVudClnLnNldFBhcmVudChlbnRyeS52LAplbnRyeS5wYXJlbnQpfSk7Xy5lYWNoKGpzb24uZWRnZXMsZnVuY3Rpb24oZW50cnkpe2cuc2V0RWRnZSh7djplbnRyeS52LHc6ZW50cnkudyxuYW1lOmVudHJ5Lm5hbWV9LGVudHJ5LnZhbHVlKX0pO3JldHVybiBnfX0seyIuL2dyYXBoIjoxNiwiLi9sb2Rhc2giOjE5fV0sMTk6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBsb2Rhc2g7aWYodHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iKXRyeXtsb2Rhc2g9cmVxdWlyZSgibG9kYXNoIil9Y2F0Y2goZSl7fWlmKCFsb2Rhc2gpbG9kYXNoPXdpbmRvdy5fO21vZHVsZS5leHBvcnRzPWxvZGFzaH0seyJsb2Rhc2giOnVuZGVmaW5lZH1dLDIwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz0iMi4xLjUifSx7fV19LHt9LFsxXSkoMSl9KTsKKGZ1bmN0aW9uKGYpe2lmKHR5cGVvZiBleHBvcnRzPT09Im9iamVjdCImJnR5cGVvZiBtb2R1bGUhPT0idW5kZWZpbmVkIiltb2R1bGUuZXhwb3J0cz1mKCk7ZWxzZSBpZih0eXBlb2YgZGVmaW5lPT09ImZ1bmN0aW9uIiYmZGVmaW5lLmFtZClkZWZpbmUoW10sZik7ZWxzZXt2YXIgZztpZih0eXBlb2Ygd2luZG93IT09InVuZGVmaW5lZCIpZz13aW5kb3c7ZWxzZSBpZih0eXBlb2YgZ2xvYmFsIT09InVuZGVmaW5lZCIpZz1nbG9iYWw7ZWxzZSBpZih0eXBlb2Ygc2VsZiE9PSJ1bmRlZmluZWQiKWc9c2VsZjtlbHNlIGc9dGhpcztnLmRhZ3JlPWYoKX19KShmdW5jdGlvbigpe3ZhciBkZWZpbmUsbW9kdWxlLGV4cG9ydHM7cmV0dXJuIGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT0iZnVuY3Rpb24iJiZyZXF1aXJlO2lmKCF1JiZhKXJldHVybiBhKG8sITApO2lmKGkpcmV0dXJuIGkobywhMCk7dmFyIGY9Cm5ldyBFcnJvcigiQ2Fubm90IGZpbmQgbW9kdWxlICciK28rIiciKTt0aHJvdyBmLmNvZGU9Ik1PRFVMRV9OT1RfRk9VTkQiLGY7fXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PSJmdW5jdGlvbiImJnJlcXVpcmU7Zm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspcyhyW29dKTtyZXR1cm4gc30oezE6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe21vZHVsZS5leHBvcnRzPXtncmFwaGxpYjpyZXF1aXJlKCIuL2xpYi9ncmFwaGxpYiIpLGxheW91dDpyZXF1aXJlKCIuL2xpYi9sYXlvdXQiKSxkZWJ1ZzpyZXF1aXJlKCIuL2xpYi9kZWJ1ZyIpLHV0aWw6e3RpbWU6cmVxdWlyZSgiLi9saWIvdXRpbCIpLnRpbWUsbm90aW1lOnJlcXVpcmUoIi4vbGliL3V0aWwiKS5ub3RpbWV9LAp2ZXJzaW9uOnJlcXVpcmUoIi4vbGliL3ZlcnNpb24iKX19LHsiLi9saWIvZGVidWciOjYsIi4vbGliL2dyYXBobGliIjo3LCIuL2xpYi9sYXlvdXQiOjksIi4vbGliL3V0aWwiOjI5LCIuL2xpYi92ZXJzaW9uIjozMH1dLDI6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksZ3JlZWR5RkFTPXJlcXVpcmUoIi4vZ3JlZWR5LWZhcyIpO21vZHVsZS5leHBvcnRzPXtydW46cnVuLHVuZG86dW5kb307ZnVuY3Rpb24gcnVuKGcpe3ZhciBmYXM9Zy5ncmFwaCgpLmFjeWNsaWNlcj09PSJncmVlZHkiP2dyZWVkeUZBUyhnLHdlaWdodEZuKGcpKTpkZnNGQVMoZyk7Xy5mb3JFYWNoKGZhcyxmdW5jdGlvbihlKXt2YXIgbGFiZWw9Zy5lZGdlKGUpO2cucmVtb3ZlRWRnZShlKTtsYWJlbC5mb3J3YXJkTmFtZT1lLm5hbWU7bGFiZWwucmV2ZXJzZWQ9dHJ1ZTtnLnNldEVkZ2UoZS53LGUudixsYWJlbCxfLnVuaXF1ZUlkKCJyZXYiKSl9KTtmdW5jdGlvbiB3ZWlnaHRGbihnKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGcuZWRnZShlKS53ZWlnaHR9fQp9ZnVuY3Rpb24gZGZzRkFTKGcpe3ZhciBmYXM9W10sc3RhY2s9e30sdmlzaXRlZD17fTtmdW5jdGlvbiBkZnModil7aWYoXy5oYXModmlzaXRlZCx2KSlyZXR1cm47dmlzaXRlZFt2XT10cnVlO3N0YWNrW3ZdPXRydWU7Xy5mb3JFYWNoKGcub3V0RWRnZXModiksZnVuY3Rpb24oZSl7aWYoXy5oYXMoc3RhY2ssZS53KSlmYXMucHVzaChlKTtlbHNlIGRmcyhlLncpfSk7ZGVsZXRlIHN0YWNrW3ZdfV8uZm9yRWFjaChnLm5vZGVzKCksZGZzKTtyZXR1cm4gZmFzfWZ1bmN0aW9uIHVuZG8oZyl7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgbGFiZWw9Zy5lZGdlKGUpO2lmKGxhYmVsLnJldmVyc2VkKXtnLnJlbW92ZUVkZ2UoZSk7dmFyIGZvcndhcmROYW1lPWxhYmVsLmZvcndhcmROYW1lO2RlbGV0ZSBsYWJlbC5yZXZlcnNlZDtkZWxldGUgbGFiZWwuZm9yd2FyZE5hbWU7Zy5zZXRFZGdlKGUudyxlLnYsbGFiZWwsZm9yd2FyZE5hbWUpfX0pfX0seyIuL2dyZWVkeS1mYXMiOjgsCiIuL2xvZGFzaCI6MTB9XSwzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9YWRkQm9yZGVyU2VnbWVudHM7ZnVuY3Rpb24gYWRkQm9yZGVyU2VnbWVudHMoZyl7ZnVuY3Rpb24gZGZzKHYpe3ZhciBjaGlsZHJlbj1nLmNoaWxkcmVuKHYpLG5vZGU9Zy5ub2RlKHYpO2lmKGNoaWxkcmVuLmxlbmd0aClfLmZvckVhY2goY2hpbGRyZW4sZGZzKTtpZihfLmhhcyhub2RlLCJtaW5SYW5rIikpe25vZGUuYm9yZGVyTGVmdD1bXTtub2RlLmJvcmRlclJpZ2h0PVtdO2Zvcih2YXIgcmFuaz1ub2RlLm1pblJhbmssbWF4UmFuaz1ub2RlLm1heFJhbmsrMTtyYW5rPG1heFJhbms7KytyYW5rKXthZGRCb3JkZXJOb2RlKGcsImJvcmRlckxlZnQiLCJfYmwiLHYsbm9kZSxyYW5rKTthZGRCb3JkZXJOb2RlKGcsImJvcmRlclJpZ2h0IiwiX2JyIix2LG5vZGUscmFuayl9fX1fLmZvckVhY2goZy5jaGlsZHJlbigpLApkZnMpfWZ1bmN0aW9uIGFkZEJvcmRlck5vZGUoZyxwcm9wLHByZWZpeCxzZyxzZ05vZGUscmFuayl7dmFyIGxhYmVsPXt3aWR0aDowLGhlaWdodDowLHJhbms6cmFuayxib3JkZXJUeXBlOnByb3B9LHByZXY9c2dOb2RlW3Byb3BdW3JhbmstMV0sY3Vycj11dGlsLmFkZER1bW15Tm9kZShnLCJib3JkZXIiLGxhYmVsLHByZWZpeCk7c2dOb2RlW3Byb3BdW3JhbmtdPWN1cnI7Zy5zZXRQYXJlbnQoY3VycixzZyk7aWYocHJldilnLnNldEVkZ2UocHJldixjdXJyLHt3ZWlnaHQ6MX0pfX0seyIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSw0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpO21vZHVsZS5leHBvcnRzPXthZGp1c3Q6YWRqdXN0LHVuZG86dW5kb307ZnVuY3Rpb24gYWRqdXN0KGcpe3ZhciByYW5rRGlyPWcuZ3JhcGgoKS5yYW5rZGlyLnRvTG93ZXJDYXNlKCk7aWYocmFua0Rpcj09PSJsciJ8fHJhbmtEaXI9PT0icmwiKXN3YXBXaWR0aEhlaWdodChnKX0KZnVuY3Rpb24gdW5kbyhnKXt2YXIgcmFua0Rpcj1nLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpO2lmKHJhbmtEaXI9PT0iYnQifHxyYW5rRGlyPT09InJsIilyZXZlcnNlWShnKTtpZihyYW5rRGlyPT09ImxyInx8cmFua0Rpcj09PSJybCIpe3N3YXBYWShnKTtzd2FwV2lkdGhIZWlnaHQoZyl9fWZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodChnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3N3YXBXaWR0aEhlaWdodE9uZShnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXtzd2FwV2lkdGhIZWlnaHRPbmUoZy5lZGdlKGUpKX0pfWZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodE9uZShhdHRycyl7dmFyIHc9YXR0cnMud2lkdGg7YXR0cnMud2lkdGg9YXR0cnMuaGVpZ2h0O2F0dHJzLmhlaWdodD13fWZ1bmN0aW9uIHJldmVyc2VZKGcpe18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7cmV2ZXJzZVlPbmUoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksCmZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtfLmZvckVhY2goZWRnZS5wb2ludHMscmV2ZXJzZVlPbmUpO2lmKF8uaGFzKGVkZ2UsInkiKSlyZXZlcnNlWU9uZShlZGdlKX0pfWZ1bmN0aW9uIHJldmVyc2VZT25lKGF0dHJzKXthdHRycy55PS1hdHRycy55fWZ1bmN0aW9uIHN3YXBYWShnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3N3YXBYWU9uZShnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7Xy5mb3JFYWNoKGVkZ2UucG9pbnRzLHN3YXBYWU9uZSk7aWYoXy5oYXMoZWRnZSwieCIpKXN3YXBYWU9uZShlZGdlKX0pfWZ1bmN0aW9uIHN3YXBYWU9uZShhdHRycyl7dmFyIHg9YXR0cnMueDthdHRycy54PWF0dHJzLnk7YXR0cnMueT14fX0seyIuL2xvZGFzaCI6MTB9XSw1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz1MaXN0O2Z1bmN0aW9uIExpc3QoKXt2YXIgc2VudGluZWw9Cnt9O3NlbnRpbmVsLl9uZXh0PXNlbnRpbmVsLl9wcmV2PXNlbnRpbmVsO3RoaXMuX3NlbnRpbmVsPXNlbnRpbmVsfUxpc3QucHJvdG90eXBlLmRlcXVldWU9ZnVuY3Rpb24oKXt2YXIgc2VudGluZWw9dGhpcy5fc2VudGluZWwsZW50cnk9c2VudGluZWwuX3ByZXY7aWYoZW50cnkhPT1zZW50aW5lbCl7dW5saW5rKGVudHJ5KTtyZXR1cm4gZW50cnl9fTtMaXN0LnByb3RvdHlwZS5lbnF1ZXVlPWZ1bmN0aW9uKGVudHJ5KXt2YXIgc2VudGluZWw9dGhpcy5fc2VudGluZWw7aWYoZW50cnkuX3ByZXYmJmVudHJ5Ll9uZXh0KXVubGluayhlbnRyeSk7ZW50cnkuX25leHQ9c2VudGluZWwuX25leHQ7c2VudGluZWwuX25leHQuX3ByZXY9ZW50cnk7c2VudGluZWwuX25leHQ9ZW50cnk7ZW50cnkuX3ByZXY9c2VudGluZWx9O0xpc3QucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7dmFyIHN0cnM9W10sc2VudGluZWw9dGhpcy5fc2VudGluZWwsY3Vycj1zZW50aW5lbC5fcHJldjt3aGlsZShjdXJyIT09CnNlbnRpbmVsKXtzdHJzLnB1c2goSlNPTi5zdHJpbmdpZnkoY3VycixmaWx0ZXJPdXRMaW5rcykpO2N1cnI9Y3Vyci5fcHJldn1yZXR1cm4iWyIrc3Rycy5qb2luKCIsICIpKyJdIn07ZnVuY3Rpb24gdW5saW5rKGVudHJ5KXtlbnRyeS5fcHJldi5fbmV4dD1lbnRyeS5fbmV4dDtlbnRyeS5fbmV4dC5fcHJldj1lbnRyeS5fcHJldjtkZWxldGUgZW50cnkuX25leHQ7ZGVsZXRlIGVudHJ5Ll9wcmV2fWZ1bmN0aW9uIGZpbHRlck91dExpbmtzKGssdil7aWYoayE9PSJfbmV4dCImJmshPT0iX3ByZXYiKXJldHVybiB2fX0se31dLDY6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksdXRpbD1yZXF1aXJlKCIuL3V0aWwiKSxHcmFwaD1yZXF1aXJlKCIuL2dyYXBobGliIikuR3JhcGg7bW9kdWxlLmV4cG9ydHM9e2RlYnVnT3JkZXJpbmc6ZGVidWdPcmRlcmluZ307ZnVuY3Rpb24gZGVidWdPcmRlcmluZyhnKXt2YXIgbGF5ZXJNYXRyaXg9CnV0aWwuYnVpbGRMYXllck1hdHJpeChnKTt2YXIgaD0obmV3IEdyYXBoKHtjb21wb3VuZDp0cnVlLG11bHRpZ3JhcGg6dHJ1ZX0pKS5zZXRHcmFwaCh7fSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXtoLnNldE5vZGUodix7bGFiZWw6dn0pO2guc2V0UGFyZW50KHYsImxheWVyIitnLm5vZGUodikucmFuayl9KTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe2guc2V0RWRnZShlLnYsZS53LHt9LGUubmFtZSl9KTtfLmZvckVhY2gobGF5ZXJNYXRyaXgsZnVuY3Rpb24obGF5ZXIsaSl7dmFyIGxheWVyVj0ibGF5ZXIiK2k7aC5zZXROb2RlKGxheWVyVix7cmFuazoic2FtZSJ9KTtfLnJlZHVjZShsYXllcixmdW5jdGlvbih1LHYpe2guc2V0RWRnZSh1LHYse3N0eWxlOiJpbnZpcyJ9KTtyZXR1cm4gdn0pfSk7cmV0dXJuIGh9fSx7Ii4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMCwiLi91dGlsIjoyOX1dLDc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBncmFwaGxpYjsKaWYodHlwZW9mIHJlcXVpcmU9PT0iZnVuY3Rpb24iKXRyeXtncmFwaGxpYj1yZXF1aXJlKCJncmFwaGxpYiIpfWNhdGNoKGUpe31pZighZ3JhcGhsaWIpZ3JhcGhsaWI9d2luZG93LmdyYXBobGliO21vZHVsZS5leHBvcnRzPWdyYXBobGlifSx7ImdyYXBobGliIjp1bmRlZmluZWR9XSw4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGhsaWIiKS5HcmFwaCxMaXN0PXJlcXVpcmUoIi4vZGF0YS9saXN0Iik7bW9kdWxlLmV4cG9ydHM9Z3JlZWR5RkFTO3ZhciBERUZBVUxUX1dFSUdIVF9GTj1fLmNvbnN0YW50KDEpO2Z1bmN0aW9uIGdyZWVkeUZBUyhnLHdlaWdodEZuKXtpZihnLm5vZGVDb3VudCgpPD0xKXJldHVybltdO3ZhciBzdGF0ZT1idWlsZFN0YXRlKGcsd2VpZ2h0Rm58fERFRkFVTFRfV0VJR0hUX0ZOKTt2YXIgcmVzdWx0cz1kb0dyZWVkeUZBUyhzdGF0ZS5ncmFwaCxzdGF0ZS5idWNrZXRzLApzdGF0ZS56ZXJvSWR4KTtyZXR1cm4gXy5mbGF0dGVuKF8ubWFwKHJlc3VsdHMsZnVuY3Rpb24oZSl7cmV0dXJuIGcub3V0RWRnZXMoZS52LGUudyl9KSx0cnVlKX1mdW5jdGlvbiBkb0dyZWVkeUZBUyhnLGJ1Y2tldHMsemVyb0lkeCl7dmFyIHJlc3VsdHM9W10sc291cmNlcz1idWNrZXRzW2J1Y2tldHMubGVuZ3RoLTFdLHNpbmtzPWJ1Y2tldHNbMF07dmFyIGVudHJ5O3doaWxlKGcubm9kZUNvdW50KCkpe3doaWxlKGVudHJ5PXNpbmtzLmRlcXVldWUoKSlyZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LGVudHJ5KTt3aGlsZShlbnRyeT1zb3VyY2VzLmRlcXVldWUoKSlyZW1vdmVOb2RlKGcsYnVja2V0cyx6ZXJvSWR4LGVudHJ5KTtpZihnLm5vZGVDb3VudCgpKWZvcih2YXIgaT1idWNrZXRzLmxlbmd0aC0yO2k+MDstLWkpe2VudHJ5PWJ1Y2tldHNbaV0uZGVxdWV1ZSgpO2lmKGVudHJ5KXtyZXN1bHRzPXJlc3VsdHMuY29uY2F0KHJlbW92ZU5vZGUoZyxidWNrZXRzLHplcm9JZHgsCmVudHJ5LHRydWUpKTticmVha319fXJldHVybiByZXN1bHRzfWZ1bmN0aW9uIHJlbW92ZU5vZGUoZyxidWNrZXRzLHplcm9JZHgsZW50cnksY29sbGVjdFByZWRlY2Vzc29ycyl7dmFyIHJlc3VsdHM9Y29sbGVjdFByZWRlY2Vzc29ycz9bXTp1bmRlZmluZWQ7Xy5mb3JFYWNoKGcuaW5FZGdlcyhlbnRyeS52KSxmdW5jdGlvbihlZGdlKXt2YXIgd2VpZ2h0PWcuZWRnZShlZGdlKSx1RW50cnk9Zy5ub2RlKGVkZ2Uudik7aWYoY29sbGVjdFByZWRlY2Vzc29ycylyZXN1bHRzLnB1c2goe3Y6ZWRnZS52LHc6ZWRnZS53fSk7dUVudHJ5Lm91dC09d2VpZ2h0O2Fzc2lnbkJ1Y2tldChidWNrZXRzLHplcm9JZHgsdUVudHJ5KX0pO18uZm9yRWFjaChnLm91dEVkZ2VzKGVudHJ5LnYpLGZ1bmN0aW9uKGVkZ2Upe3ZhciB3ZWlnaHQ9Zy5lZGdlKGVkZ2UpLHc9ZWRnZS53LHdFbnRyeT1nLm5vZGUodyk7d0VudHJ5WyJpbiJdLT13ZWlnaHQ7YXNzaWduQnVja2V0KGJ1Y2tldHMsemVyb0lkeCx3RW50cnkpfSk7CmcucmVtb3ZlTm9kZShlbnRyeS52KTtyZXR1cm4gcmVzdWx0c31mdW5jdGlvbiBidWlsZFN0YXRlKGcsd2VpZ2h0Rm4pe3ZhciBmYXNHcmFwaD1uZXcgR3JhcGgsbWF4SW49MCxtYXhPdXQ9MDtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2Zhc0dyYXBoLnNldE5vZGUodix7djp2LCJpbiI6MCxvdXQ6MH0pfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgcHJldldlaWdodD1mYXNHcmFwaC5lZGdlKGUudixlLncpfHwwLHdlaWdodD13ZWlnaHRGbihlKSxlZGdlV2VpZ2h0PXByZXZXZWlnaHQrd2VpZ2h0O2Zhc0dyYXBoLnNldEVkZ2UoZS52LGUudyxlZGdlV2VpZ2h0KTttYXhPdXQ9TWF0aC5tYXgobWF4T3V0LGZhc0dyYXBoLm5vZGUoZS52KS5vdXQrPXdlaWdodCk7bWF4SW49TWF0aC5tYXgobWF4SW4sZmFzR3JhcGgubm9kZShlLncpWyJpbiJdKz13ZWlnaHQpfSk7dmFyIGJ1Y2tldHM9Xy5yYW5nZShtYXhPdXQrbWF4SW4rMykubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBMaXN0fSk7CnZhciB6ZXJvSWR4PW1heEluKzE7Xy5mb3JFYWNoKGZhc0dyYXBoLm5vZGVzKCksZnVuY3Rpb24odil7YXNzaWduQnVja2V0KGJ1Y2tldHMsemVyb0lkeCxmYXNHcmFwaC5ub2RlKHYpKX0pO3JldHVybntncmFwaDpmYXNHcmFwaCxidWNrZXRzOmJ1Y2tldHMsemVyb0lkeDp6ZXJvSWR4fX1mdW5jdGlvbiBhc3NpZ25CdWNrZXQoYnVja2V0cyx6ZXJvSWR4LGVudHJ5KXtpZighZW50cnkub3V0KWJ1Y2tldHNbMF0uZW5xdWV1ZShlbnRyeSk7ZWxzZSBpZighZW50cnlbImluIl0pYnVja2V0c1tidWNrZXRzLmxlbmd0aC0xXS5lbnF1ZXVlKGVudHJ5KTtlbHNlIGJ1Y2tldHNbZW50cnkub3V0LWVudHJ5WyJpbiJdK3plcm9JZHhdLmVucXVldWUoZW50cnkpfX0seyIuL2RhdGEvbGlzdCI6NSwiLi9ncmFwaGxpYiI6NywiLi9sb2Rhc2giOjEwfV0sOTpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSxhY3ljbGljPXJlcXVpcmUoIi4vYWN5Y2xpYyIpLApub3JtYWxpemU9cmVxdWlyZSgiLi9ub3JtYWxpemUiKSxyYW5rPXJlcXVpcmUoIi4vcmFuayIpLG5vcm1hbGl6ZVJhbmtzPXJlcXVpcmUoIi4vdXRpbCIpLm5vcm1hbGl6ZVJhbmtzLHBhcmVudER1bW15Q2hhaW5zPXJlcXVpcmUoIi4vcGFyZW50LWR1bW15LWNoYWlucyIpLHJlbW92ZUVtcHR5UmFua3M9cmVxdWlyZSgiLi91dGlsIikucmVtb3ZlRW1wdHlSYW5rcyxuZXN0aW5nR3JhcGg9cmVxdWlyZSgiLi9uZXN0aW5nLWdyYXBoIiksYWRkQm9yZGVyU2VnbWVudHM9cmVxdWlyZSgiLi9hZGQtYm9yZGVyLXNlZ21lbnRzIiksY29vcmRpbmF0ZVN5c3RlbT1yZXF1aXJlKCIuL2Nvb3JkaW5hdGUtc3lzdGVtIiksb3JkZXI9cmVxdWlyZSgiLi9vcmRlciIpLHBvc2l0aW9uPXJlcXVpcmUoIi4vcG9zaXRpb24iKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpLEdyYXBoPXJlcXVpcmUoIi4vZ3JhcGhsaWIiKS5HcmFwaDttb2R1bGUuZXhwb3J0cz1sYXlvdXQ7ZnVuY3Rpb24gbGF5b3V0KGcsb3B0cyl7dmFyIHRpbWU9Cm9wdHMmJm9wdHMuZGVidWdUaW1pbmc/dXRpbC50aW1lOnV0aWwubm90aW1lO3RpbWUoImxheW91dCIsZnVuY3Rpb24oKXt2YXIgbGF5b3V0R3JhcGg9dGltZSgiICBidWlsZExheW91dEdyYXBoIixmdW5jdGlvbigpe3JldHVybiBidWlsZExheW91dEdyYXBoKGcpfSk7dGltZSgiICBydW5MYXlvdXQiLGZ1bmN0aW9uKCl7cnVuTGF5b3V0KGxheW91dEdyYXBoLHRpbWUpfSk7dGltZSgiICB1cGRhdGVJbnB1dEdyYXBoIixmdW5jdGlvbigpe3VwZGF0ZUlucHV0R3JhcGgoZyxsYXlvdXRHcmFwaCl9KX0pfWZ1bmN0aW9uIHJ1bkxheW91dChnLHRpbWUpe3RpbWUoIiAgICBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzIixmdW5jdGlvbigpe21ha2VTcGFjZUZvckVkZ2VMYWJlbHMoZyl9KTt0aW1lKCIgICAgcmVtb3ZlU2VsZkVkZ2VzIixmdW5jdGlvbigpe3JlbW92ZVNlbGZFZGdlcyhnKX0pO3RpbWUoIiAgICBhY3ljbGljIixmdW5jdGlvbigpe2FjeWNsaWMucnVuKGcpfSk7dGltZSgiICAgIG5lc3RpbmdHcmFwaC5ydW4iLApmdW5jdGlvbigpe25lc3RpbmdHcmFwaC5ydW4oZyl9KTt0aW1lKCIgICAgcmFuayIsZnVuY3Rpb24oKXtyYW5rKHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpKX0pO3RpbWUoIiAgICBpbmplY3RFZGdlTGFiZWxQcm94aWVzIixmdW5jdGlvbigpe2luamVjdEVkZ2VMYWJlbFByb3hpZXMoZyl9KTt0aW1lKCIgICAgcmVtb3ZlRW1wdHlSYW5rcyIsZnVuY3Rpb24oKXtyZW1vdmVFbXB0eVJhbmtzKGcpfSk7dGltZSgiICAgIG5lc3RpbmdHcmFwaC5jbGVhbnVwIixmdW5jdGlvbigpe25lc3RpbmdHcmFwaC5jbGVhbnVwKGcpfSk7dGltZSgiICAgIG5vcm1hbGl6ZVJhbmtzIixmdW5jdGlvbigpe25vcm1hbGl6ZVJhbmtzKGcpfSk7dGltZSgiICAgIGFzc2lnblJhbmtNaW5NYXgiLGZ1bmN0aW9uKCl7YXNzaWduUmFua01pbk1heChnKX0pO3RpbWUoIiAgICByZW1vdmVFZGdlTGFiZWxQcm94aWVzIixmdW5jdGlvbigpe3JlbW92ZUVkZ2VMYWJlbFByb3hpZXMoZyl9KTt0aW1lKCIgICAgbm9ybWFsaXplLnJ1biIsCmZ1bmN0aW9uKCl7bm9ybWFsaXplLnJ1bihnKX0pO3RpbWUoIiAgICBwYXJlbnREdW1teUNoYWlucyIsZnVuY3Rpb24oKXtwYXJlbnREdW1teUNoYWlucyhnKX0pO3RpbWUoIiAgICBhZGRCb3JkZXJTZWdtZW50cyIsZnVuY3Rpb24oKXthZGRCb3JkZXJTZWdtZW50cyhnKX0pO3RpbWUoIiAgICBvcmRlciIsZnVuY3Rpb24oKXtvcmRlcihnKX0pO3RpbWUoIiAgICBpbnNlcnRTZWxmRWRnZXMiLGZ1bmN0aW9uKCl7aW5zZXJ0U2VsZkVkZ2VzKGcpfSk7dGltZSgiICAgIGFkanVzdENvb3JkaW5hdGVTeXN0ZW0iLGZ1bmN0aW9uKCl7Y29vcmRpbmF0ZVN5c3RlbS5hZGp1c3QoZyl9KTt0aW1lKCIgICAgcG9zaXRpb24iLGZ1bmN0aW9uKCl7cG9zaXRpb24oZyl9KTt0aW1lKCIgICAgcG9zaXRpb25TZWxmRWRnZXMiLGZ1bmN0aW9uKCl7cG9zaXRpb25TZWxmRWRnZXMoZyl9KTt0aW1lKCIgICAgcmVtb3ZlQm9yZGVyTm9kZXMiLGZ1bmN0aW9uKCl7cmVtb3ZlQm9yZGVyTm9kZXMoZyl9KTt0aW1lKCIgICAgbm9ybWFsaXplLnVuZG8iLApmdW5jdGlvbigpe25vcm1hbGl6ZS51bmRvKGcpfSk7dGltZSgiICAgIGZpeHVwRWRnZUxhYmVsQ29vcmRzIixmdW5jdGlvbigpe2ZpeHVwRWRnZUxhYmVsQ29vcmRzKGcpfSk7dGltZSgiICAgIHVuZG9Db29yZGluYXRlU3lzdGVtIixmdW5jdGlvbigpe2Nvb3JkaW5hdGVTeXN0ZW0udW5kbyhnKX0pO3RpbWUoIiAgICB0cmFuc2xhdGVHcmFwaCIsZnVuY3Rpb24oKXt0cmFuc2xhdGVHcmFwaChnKX0pO3RpbWUoIiAgICBhc3NpZ25Ob2RlSW50ZXJzZWN0cyIsZnVuY3Rpb24oKXthc3NpZ25Ob2RlSW50ZXJzZWN0cyhnKX0pO3RpbWUoIiAgICByZXZlcnNlUG9pbnRzIixmdW5jdGlvbigpe3JldmVyc2VQb2ludHNGb3JSZXZlcnNlZEVkZ2VzKGcpfSk7dGltZSgiICAgIGFjeWNsaWMudW5kbyIsZnVuY3Rpb24oKXthY3ljbGljLnVuZG8oZyl9KX1mdW5jdGlvbiB1cGRhdGVJbnB1dEdyYXBoKGlucHV0R3JhcGgsbGF5b3V0R3JhcGgpe18uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIGlucHV0TGFiZWw9CmlucHV0R3JhcGgubm9kZSh2KSxsYXlvdXRMYWJlbD1sYXlvdXRHcmFwaC5ub2RlKHYpO2lmKGlucHV0TGFiZWwpe2lucHV0TGFiZWwueD1sYXlvdXRMYWJlbC54O2lucHV0TGFiZWwueT1sYXlvdXRMYWJlbC55O2lmKGxheW91dEdyYXBoLmNoaWxkcmVuKHYpLmxlbmd0aCl7aW5wdXRMYWJlbC53aWR0aD1sYXlvdXRMYWJlbC53aWR0aDtpbnB1dExhYmVsLmhlaWdodD1sYXlvdXRMYWJlbC5oZWlnaHR9fX0pO18uZm9yRWFjaChpbnB1dEdyYXBoLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGlucHV0TGFiZWw9aW5wdXRHcmFwaC5lZGdlKGUpLGxheW91dExhYmVsPWxheW91dEdyYXBoLmVkZ2UoZSk7aW5wdXRMYWJlbC5wb2ludHM9bGF5b3V0TGFiZWwucG9pbnRzO2lmKF8uaGFzKGxheW91dExhYmVsLCJ4Iikpe2lucHV0TGFiZWwueD1sYXlvdXRMYWJlbC54O2lucHV0TGFiZWwueT1sYXlvdXRMYWJlbC55fX0pO2lucHV0R3JhcGguZ3JhcGgoKS53aWR0aD1sYXlvdXRHcmFwaC5ncmFwaCgpLndpZHRoOwppbnB1dEdyYXBoLmdyYXBoKCkuaGVpZ2h0PWxheW91dEdyYXBoLmdyYXBoKCkuaGVpZ2h0fXZhciBncmFwaE51bUF0dHJzPVsibm9kZXNlcCIsImVkZ2VzZXAiLCJyYW5rc2VwIiwibWFyZ2lueCIsIm1hcmdpbnkiXSxncmFwaERlZmF1bHRzPXtyYW5rc2VwOjUwLGVkZ2VzZXA6MjAsbm9kZXNlcDo1MCxyYW5rZGlyOiJ0YiJ9LGdyYXBoQXR0cnM9WyJhY3ljbGljZXIiLCJyYW5rZXIiLCJyYW5rZGlyIiwiYWxpZ24iXSxub2RlTnVtQXR0cnM9WyJ3aWR0aCIsImhlaWdodCJdLG5vZGVEZWZhdWx0cz17d2lkdGg6MCxoZWlnaHQ6MH0sZWRnZU51bUF0dHJzPVsibWlubGVuIiwid2VpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJsYWJlbG9mZnNldCJdLGVkZ2VEZWZhdWx0cz17bWlubGVuOjEsd2VpZ2h0OjEsd2lkdGg6MCxoZWlnaHQ6MCxsYWJlbG9mZnNldDoxMCxsYWJlbHBvczoiciJ9LGVkZ2VBdHRycz1bImxhYmVscG9zIl07ZnVuY3Rpb24gYnVpbGRMYXlvdXRHcmFwaChpbnB1dEdyYXBoKXt2YXIgZz0KbmV3IEdyYXBoKHttdWx0aWdyYXBoOnRydWUsY29tcG91bmQ6dHJ1ZX0pLGdyYXBoPWNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLmdyYXBoKCkpO2cuc2V0R3JhcGgoXy5tZXJnZSh7fSxncmFwaERlZmF1bHRzLHNlbGVjdE51bWJlckF0dHJzKGdyYXBoLGdyYXBoTnVtQXR0cnMpLF8ucGljayhncmFwaCxncmFwaEF0dHJzKSkpO18uZm9yRWFjaChpbnB1dEdyYXBoLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Y2Fub25pY2FsaXplKGlucHV0R3JhcGgubm9kZSh2KSk7Zy5zZXROb2RlKHYsXy5kZWZhdWx0cyhzZWxlY3ROdW1iZXJBdHRycyhub2RlLG5vZGVOdW1BdHRycyksbm9kZURlZmF1bHRzKSk7Zy5zZXRQYXJlbnQodixpbnB1dEdyYXBoLnBhcmVudCh2KSl9KTtfLmZvckVhY2goaW5wdXRHcmFwaC5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWNhbm9uaWNhbGl6ZShpbnB1dEdyYXBoLmVkZ2UoZSkpO2cuc2V0RWRnZShlLF8ubWVyZ2Uoe30sZWRnZURlZmF1bHRzLHNlbGVjdE51bWJlckF0dHJzKGVkZ2UsCmVkZ2VOdW1BdHRycyksXy5waWNrKGVkZ2UsZWRnZUF0dHJzKSkpfSk7cmV0dXJuIGd9ZnVuY3Rpb24gbWFrZVNwYWNlRm9yRWRnZUxhYmVscyhnKXt2YXIgZ3JhcGg9Zy5ncmFwaCgpO2dyYXBoLnJhbmtzZXAvPTI7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7ZWRnZS5taW5sZW4qPTI7aWYoZWRnZS5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpIT09ImMiKWlmKGdyYXBoLnJhbmtkaXI9PT0iVEIifHxncmFwaC5yYW5rZGlyPT09IkJUIillZGdlLndpZHRoKz1lZGdlLmxhYmVsb2Zmc2V0O2Vsc2UgZWRnZS5oZWlnaHQrPWVkZ2UubGFiZWxvZmZzZXR9KX1mdW5jdGlvbiBpbmplY3RFZGdlTGFiZWxQcm94aWVzKGcpe18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKGVkZ2Uud2lkdGgmJmVkZ2UuaGVpZ2h0KXt2YXIgdj1nLm5vZGUoZS52KSx3PWcubm9kZShlLncpLGxhYmVsPXtyYW5rOih3LnJhbmstCnYucmFuaykvMit2LnJhbmssZTplfTt1dGlsLmFkZER1bW15Tm9kZShnLCJlZGdlLXByb3h5IixsYWJlbCwiX2VwIil9fSl9ZnVuY3Rpb24gYXNzaWduUmFua01pbk1heChnKXt2YXIgbWF4UmFuaz0wO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO2lmKG5vZGUuYm9yZGVyVG9wKXtub2RlLm1pblJhbms9Zy5ub2RlKG5vZGUuYm9yZGVyVG9wKS5yYW5rO25vZGUubWF4UmFuaz1nLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pLnJhbms7bWF4UmFuaz1fLm1heChtYXhSYW5rLG5vZGUubWF4UmFuayl9fSk7Zy5ncmFwaCgpLm1heFJhbms9bWF4UmFua31mdW5jdGlvbiByZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpe18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpO2lmKG5vZGUuZHVtbXk9PT0iZWRnZS1wcm94eSIpe2cuZWRnZShub2RlLmUpLmxhYmVsUmFuaz1ub2RlLnJhbms7Zy5yZW1vdmVOb2RlKHYpfX0pfQpmdW5jdGlvbiB0cmFuc2xhdGVHcmFwaChnKXt2YXIgbWluWD1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksbWF4WD0wLG1pblk9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLG1heFk9MCxncmFwaExhYmVsPWcuZ3JhcGgoKSxtYXJnaW5YPWdyYXBoTGFiZWwubWFyZ2lueHx8MCxtYXJnaW5ZPWdyYXBoTGFiZWwubWFyZ2lueXx8MDtmdW5jdGlvbiBnZXRFeHRyZW1lcyhhdHRycyl7dmFyIHg9YXR0cnMueCx5PWF0dHJzLnksdz1hdHRycy53aWR0aCxoPWF0dHJzLmhlaWdodDttaW5YPU1hdGgubWluKG1pblgseC13LzIpO21heFg9TWF0aC5tYXgobWF4WCx4K3cvMik7bWluWT1NYXRoLm1pbihtaW5ZLHktaC8yKTttYXhZPU1hdGgubWF4KG1heFkseStoLzIpfV8uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7Z2V0RXh0cmVtZXMoZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKF8uaGFzKGVkZ2UsIngiKSlnZXRFeHRyZW1lcyhlZGdlKX0pOwptaW5YLT1tYXJnaW5YO21pblktPW1hcmdpblk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodik7bm9kZS54LT1taW5YO25vZGUueS09bWluWX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO18uZm9yRWFjaChlZGdlLnBvaW50cyxmdW5jdGlvbihwKXtwLngtPW1pblg7cC55LT1taW5ZfSk7aWYoXy5oYXMoZWRnZSwieCIpKWVkZ2UueC09bWluWDtpZihfLmhhcyhlZGdlLCJ5IikpZWRnZS55LT1taW5ZfSk7Z3JhcGhMYWJlbC53aWR0aD1tYXhYLW1pblgrbWFyZ2luWDtncmFwaExhYmVsLmhlaWdodD1tYXhZLW1pblkrbWFyZ2luWX1mdW5jdGlvbiBhc3NpZ25Ob2RlSW50ZXJzZWN0cyhnKXtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKSxub2RlVj1nLm5vZGUoZS52KSxub2RlVz1nLm5vZGUoZS53KSxwMSxwMjtpZighZWRnZS5wb2ludHMpe2VkZ2UucG9pbnRzPQpbXTtwMT1ub2RlVztwMj1ub2RlVn1lbHNle3AxPWVkZ2UucG9pbnRzWzBdO3AyPWVkZ2UucG9pbnRzW2VkZ2UucG9pbnRzLmxlbmd0aC0xXX1lZGdlLnBvaW50cy51bnNoaWZ0KHV0aWwuaW50ZXJzZWN0UmVjdChub2RlVixwMSkpO2VkZ2UucG9pbnRzLnB1c2godXRpbC5pbnRlcnNlY3RSZWN0KG5vZGVXLHAyKSl9KX1mdW5jdGlvbiBmaXh1cEVkZ2VMYWJlbENvb3JkcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlZGdlPWcuZWRnZShlKTtpZihfLmhhcyhlZGdlLCJ4Iikpe2lmKGVkZ2UubGFiZWxwb3M9PT0ibCJ8fGVkZ2UubGFiZWxwb3M9PT0iciIpZWRnZS53aWR0aC09ZWRnZS5sYWJlbG9mZnNldDtzd2l0Y2goZWRnZS5sYWJlbHBvcyl7Y2FzZSAibCI6ZWRnZS54LT1lZGdlLndpZHRoLzIrZWRnZS5sYWJlbG9mZnNldDticmVhaztjYXNlICJyIjplZGdlLngrPWVkZ2Uud2lkdGgvMitlZGdlLmxhYmVsb2Zmc2V0O2JyZWFrfX19KX1mdW5jdGlvbiByZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLApmdW5jdGlvbihlKXt2YXIgZWRnZT1nLmVkZ2UoZSk7aWYoZWRnZS5yZXZlcnNlZCllZGdlLnBvaW50cy5yZXZlcnNlKCl9KX1mdW5jdGlvbiByZW1vdmVCb3JkZXJOb2RlcyhnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2lmKGcuY2hpbGRyZW4odikubGVuZ3RoKXt2YXIgbm9kZT1nLm5vZGUodiksdD1nLm5vZGUobm9kZS5ib3JkZXJUb3ApLGI9Zy5ub2RlKG5vZGUuYm9yZGVyQm90dG9tKSxsPWcubm9kZShfLmxhc3Qobm9kZS5ib3JkZXJMZWZ0KSkscj1nLm5vZGUoXy5sYXN0KG5vZGUuYm9yZGVyUmlnaHQpKTtub2RlLndpZHRoPU1hdGguYWJzKHIueC1sLngpO25vZGUuaGVpZ2h0PU1hdGguYWJzKGIueS10LnkpO25vZGUueD1sLngrbm9kZS53aWR0aC8yO25vZGUueT10Lnkrbm9kZS5oZWlnaHQvMn19KTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2lmKGcubm9kZSh2KS5kdW1teT09PSJib3JkZXIiKWcucmVtb3ZlTm9kZSh2KX0pfWZ1bmN0aW9uIHJlbW92ZVNlbGZFZGdlcyhnKXtfLmZvckVhY2goZy5lZGdlcygpLApmdW5jdGlvbihlKXtpZihlLnY9PT1lLncpe3ZhciBub2RlPWcubm9kZShlLnYpO2lmKCFub2RlLnNlbGZFZGdlcylub2RlLnNlbGZFZGdlcz1bXTtub2RlLnNlbGZFZGdlcy5wdXNoKHtlOmUsbGFiZWw6Zy5lZGdlKGUpfSk7Zy5yZW1vdmVFZGdlKGUpfX0pfWZ1bmN0aW9uIGluc2VydFNlbGZFZGdlcyhnKXt2YXIgbGF5ZXJzPXV0aWwuYnVpbGRMYXllck1hdHJpeChnKTtfLmZvckVhY2gobGF5ZXJzLGZ1bmN0aW9uKGxheWVyKXt2YXIgb3JkZXJTaGlmdD0wO18uZm9yRWFjaChsYXllcixmdW5jdGlvbih2LGkpe3ZhciBub2RlPWcubm9kZSh2KTtub2RlLm9yZGVyPWkrb3JkZXJTaGlmdDtfLmZvckVhY2gobm9kZS5zZWxmRWRnZXMsZnVuY3Rpb24oc2VsZkVkZ2Upe3V0aWwuYWRkRHVtbXlOb2RlKGcsInNlbGZlZGdlIix7d2lkdGg6c2VsZkVkZ2UubGFiZWwud2lkdGgsaGVpZ2h0OnNlbGZFZGdlLmxhYmVsLmhlaWdodCxyYW5rOm5vZGUucmFuayxvcmRlcjppKyArK29yZGVyU2hpZnQsCmU6c2VsZkVkZ2UuZSxsYWJlbDpzZWxmRWRnZS5sYWJlbH0sIl9zZSIpfSk7ZGVsZXRlIG5vZGUuc2VsZkVkZ2VzfSl9KX1mdW5jdGlvbiBwb3NpdGlvblNlbGZFZGdlcyhnKXtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihub2RlLmR1bW15PT09InNlbGZlZGdlIil7dmFyIHNlbGZOb2RlPWcubm9kZShub2RlLmUudikseD1zZWxmTm9kZS54K3NlbGZOb2RlLndpZHRoLzIseT1zZWxmTm9kZS55LGR4PW5vZGUueC14LGR5PXNlbGZOb2RlLmhlaWdodC8yO2cuc2V0RWRnZShub2RlLmUsbm9kZS5sYWJlbCk7Zy5yZW1vdmVOb2RlKHYpO25vZGUubGFiZWwucG9pbnRzPVt7eDp4KzIqZHgvMyx5OnktZHl9LHt4OngrNSpkeC82LHk6eS1keX0se3g6eCtkeCx5Onl9LHt4OngrNSpkeC82LHk6eStkeX0se3g6eCsyKmR4LzMseTp5K2R5fV07bm9kZS5sYWJlbC54PW5vZGUueDtub2RlLmxhYmVsLnk9bm9kZS55fX0pfWZ1bmN0aW9uIHNlbGVjdE51bWJlckF0dHJzKG9iaiwKYXR0cnMpe3JldHVybiBfLm1hcFZhbHVlcyhfLnBpY2sob2JqLGF0dHJzKSxOdW1iZXIpfWZ1bmN0aW9uIGNhbm9uaWNhbGl6ZShhdHRycyl7dmFyIG5ld0F0dHJzPXt9O18uZm9yRWFjaChhdHRycyxmdW5jdGlvbih2LGspe25ld0F0dHJzW2sudG9Mb3dlckNhc2UoKV09dn0pO3JldHVybiBuZXdBdHRyc319LHsiLi9hY3ljbGljIjoyLCIuL2FkZC1ib3JkZXItc2VnbWVudHMiOjMsIi4vY29vcmRpbmF0ZS1zeXN0ZW0iOjQsIi4vZ3JhcGhsaWIiOjcsIi4vbG9kYXNoIjoxMCwiLi9uZXN0aW5nLWdyYXBoIjoxMSwiLi9ub3JtYWxpemUiOjEyLCIuL29yZGVyIjoxNywiLi9wYXJlbnQtZHVtbXktY2hhaW5zIjoyMiwiLi9wb3NpdGlvbiI6MjQsIi4vcmFuayI6MjYsIi4vdXRpbCI6Mjl9XSwxMDpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIGxvZGFzaDtpZih0eXBlb2YgcmVxdWlyZT09PSJmdW5jdGlvbiIpdHJ5e2xvZGFzaD1yZXF1aXJlKCJsb2Rhc2giKX1jYXRjaChlKXt9aWYoIWxvZGFzaClsb2Rhc2g9CndpbmRvdy5fO21vZHVsZS5leHBvcnRzPWxvZGFzaH0seyJsb2Rhc2giOnVuZGVmaW5lZH1dLDExOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi91dGlsIik7bW9kdWxlLmV4cG9ydHM9e3J1bjpydW4sY2xlYW51cDpjbGVhbnVwfTtmdW5jdGlvbiBydW4oZyl7dmFyIHJvb3Q9dXRpbC5hZGREdW1teU5vZGUoZywicm9vdCIse30sIl9yb290Iik7dmFyIGRlcHRocz10cmVlRGVwdGhzKGcpO3ZhciBoZWlnaHQ9Xy5tYXgoXy52YWx1ZXMoZGVwdGhzKSktMTt2YXIgbm9kZVNlcD0yKmhlaWdodCsxO2cuZ3JhcGgoKS5uZXN0aW5nUm9vdD1yb290O18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7Zy5lZGdlKGUpLm1pbmxlbio9bm9kZVNlcH0pO3ZhciB3ZWlnaHQ9c3VtV2VpZ2h0cyhnKSsxO18uZm9yRWFjaChnLmNoaWxkcmVuKCksZnVuY3Rpb24oY2hpbGQpe2RmcyhnLHJvb3Qsbm9kZVNlcCwKd2VpZ2h0LGhlaWdodCxkZXB0aHMsY2hpbGQpfSk7Zy5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yPW5vZGVTZXB9ZnVuY3Rpb24gZGZzKGcscm9vdCxub2RlU2VwLHdlaWdodCxoZWlnaHQsZGVwdGhzLHYpe3ZhciBjaGlsZHJlbj1nLmNoaWxkcmVuKHYpO2lmKCFjaGlsZHJlbi5sZW5ndGgpe2lmKHYhPT1yb290KWcuc2V0RWRnZShyb290LHYse3dlaWdodDowLG1pbmxlbjpub2RlU2VwfSk7cmV0dXJufXZhciB0b3A9dXRpbC5hZGRCb3JkZXJOb2RlKGcsIl9idCIpLGJvdHRvbT11dGlsLmFkZEJvcmRlck5vZGUoZywiX2JiIiksbGFiZWw9Zy5ub2RlKHYpO2cuc2V0UGFyZW50KHRvcCx2KTtsYWJlbC5ib3JkZXJUb3A9dG9wO2cuc2V0UGFyZW50KGJvdHRvbSx2KTtsYWJlbC5ib3JkZXJCb3R0b209Ym90dG9tO18uZm9yRWFjaChjaGlsZHJlbixmdW5jdGlvbihjaGlsZCl7ZGZzKGcscm9vdCxub2RlU2VwLHdlaWdodCxoZWlnaHQsZGVwdGhzLGNoaWxkKTt2YXIgY2hpbGROb2RlPWcubm9kZShjaGlsZCksCmNoaWxkVG9wPWNoaWxkTm9kZS5ib3JkZXJUb3A/Y2hpbGROb2RlLmJvcmRlclRvcDpjaGlsZCxjaGlsZEJvdHRvbT1jaGlsZE5vZGUuYm9yZGVyQm90dG9tP2NoaWxkTm9kZS5ib3JkZXJCb3R0b206Y2hpbGQsdGhpc1dlaWdodD1jaGlsZE5vZGUuYm9yZGVyVG9wP3dlaWdodDoyKndlaWdodCxtaW5sZW49Y2hpbGRUb3AhPT1jaGlsZEJvdHRvbT8xOmhlaWdodC1kZXB0aHNbdl0rMTtnLnNldEVkZ2UodG9wLGNoaWxkVG9wLHt3ZWlnaHQ6dGhpc1dlaWdodCxtaW5sZW46bWlubGVuLG5lc3RpbmdFZGdlOnRydWV9KTtnLnNldEVkZ2UoY2hpbGRCb3R0b20sYm90dG9tLHt3ZWlnaHQ6dGhpc1dlaWdodCxtaW5sZW46bWlubGVuLG5lc3RpbmdFZGdlOnRydWV9KX0pO2lmKCFnLnBhcmVudCh2KSlnLnNldEVkZ2Uocm9vdCx0b3Ase3dlaWdodDowLG1pbmxlbjpoZWlnaHQrZGVwdGhzW3ZdfSl9ZnVuY3Rpb24gdHJlZURlcHRocyhnKXt2YXIgZGVwdGhzPXt9O2Z1bmN0aW9uIGRmcyh2LGRlcHRoKXt2YXIgY2hpbGRyZW49CmcuY2hpbGRyZW4odik7aWYoY2hpbGRyZW4mJmNoaWxkcmVuLmxlbmd0aClfLmZvckVhY2goY2hpbGRyZW4sZnVuY3Rpb24oY2hpbGQpe2RmcyhjaGlsZCxkZXB0aCsxKX0pO2RlcHRoc1t2XT1kZXB0aH1fLmZvckVhY2goZy5jaGlsZHJlbigpLGZ1bmN0aW9uKHYpe2Rmcyh2LDEpfSk7cmV0dXJuIGRlcHRoc31mdW5jdGlvbiBzdW1XZWlnaHRzKGcpe3JldHVybiBfLnJlZHVjZShnLmVkZ2VzKCksZnVuY3Rpb24oYWNjLGUpe3JldHVybiBhY2MrZy5lZGdlKGUpLndlaWdodH0sMCl9ZnVuY3Rpb24gY2xlYW51cChnKXt2YXIgZ3JhcGhMYWJlbD1nLmdyYXBoKCk7Zy5yZW1vdmVOb2RlKGdyYXBoTGFiZWwubmVzdGluZ1Jvb3QpO2RlbGV0ZSBncmFwaExhYmVsLm5lc3RpbmdSb290O18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIGVkZ2U9Zy5lZGdlKGUpO2lmKGVkZ2UubmVzdGluZ0VkZ2UpZy5yZW1vdmVFZGdlKGUpfSl9fSx7Ii4vbG9kYXNoIjoxMCwiLi91dGlsIjoyOX1dLAoxMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4vdXRpbCIpO21vZHVsZS5leHBvcnRzPXtydW46cnVuLHVuZG86dW5kb307ZnVuY3Rpb24gcnVuKGcpe2cuZ3JhcGgoKS5kdW1teUNoYWlucz1bXTtfLmZvckVhY2goZy5lZGdlcygpLGZ1bmN0aW9uKGVkZ2Upe25vcm1hbGl6ZUVkZ2UoZyxlZGdlKX0pfWZ1bmN0aW9uIG5vcm1hbGl6ZUVkZ2UoZyxlKXt2YXIgdj1lLnYsdlJhbms9Zy5ub2RlKHYpLnJhbmssdz1lLncsd1Jhbms9Zy5ub2RlKHcpLnJhbmssbmFtZT1lLm5hbWUsZWRnZUxhYmVsPWcuZWRnZShlKSxsYWJlbFJhbms9ZWRnZUxhYmVsLmxhYmVsUmFuaztpZih3UmFuaz09PXZSYW5rKzEpcmV0dXJuO2cucmVtb3ZlRWRnZShlKTt2YXIgZHVtbXksYXR0cnMsaTtmb3IoaT0wLCsrdlJhbms7dlJhbms8d1Jhbms7KytpLCsrdlJhbmspe2VkZ2VMYWJlbC5wb2ludHM9W107YXR0cnM9e3dpZHRoOjAsCmhlaWdodDowLGVkZ2VMYWJlbDplZGdlTGFiZWwsZWRnZU9iajplLHJhbms6dlJhbmt9O2R1bW15PXV0aWwuYWRkRHVtbXlOb2RlKGcsImVkZ2UiLGF0dHJzLCJfZCIpO2lmKHZSYW5rPT09bGFiZWxSYW5rKXthdHRycy53aWR0aD1lZGdlTGFiZWwud2lkdGg7YXR0cnMuaGVpZ2h0PWVkZ2VMYWJlbC5oZWlnaHQ7YXR0cnMuZHVtbXk9ImVkZ2UtbGFiZWwiO2F0dHJzLmxhYmVscG9zPWVkZ2VMYWJlbC5sYWJlbHBvc31nLnNldEVkZ2UodixkdW1teSx7d2VpZ2h0OmVkZ2VMYWJlbC53ZWlnaHR9LG5hbWUpO2lmKGk9PT0wKWcuZ3JhcGgoKS5kdW1teUNoYWlucy5wdXNoKGR1bW15KTt2PWR1bW15fWcuc2V0RWRnZSh2LHcse3dlaWdodDplZGdlTGFiZWwud2VpZ2h0fSxuYW1lKX1mdW5jdGlvbiB1bmRvKGcpe18uZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLG9yaWdMYWJlbD1ub2RlLmVkZ2VMYWJlbCx3O2cuc2V0RWRnZShub2RlLmVkZ2VPYmosCm9yaWdMYWJlbCk7d2hpbGUobm9kZS5kdW1teSl7dz1nLnN1Y2Nlc3NvcnModilbMF07Zy5yZW1vdmVOb2RlKHYpO29yaWdMYWJlbC5wb2ludHMucHVzaCh7eDpub2RlLngseTpub2RlLnl9KTtpZihub2RlLmR1bW15PT09ImVkZ2UtbGFiZWwiKXtvcmlnTGFiZWwueD1ub2RlLng7b3JpZ0xhYmVsLnk9bm9kZS55O29yaWdMYWJlbC53aWR0aD1ub2RlLndpZHRoO29yaWdMYWJlbC5oZWlnaHQ9bm9kZS5oZWlnaHR9dj13O25vZGU9Zy5ub2RlKHYpfX0pfX0seyIuL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjl9XSwxMzpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9YWRkU3ViZ3JhcGhDb25zdHJhaW50cztmdW5jdGlvbiBhZGRTdWJncmFwaENvbnN0cmFpbnRzKGcsY2csdnMpe3ZhciBwcmV2PXt9LHJvb3RQcmV2O18uZm9yRWFjaCh2cyxmdW5jdGlvbih2KXt2YXIgY2hpbGQ9Zy5wYXJlbnQodikscGFyZW50LApwcmV2Q2hpbGQ7d2hpbGUoY2hpbGQpe3BhcmVudD1nLnBhcmVudChjaGlsZCk7aWYocGFyZW50KXtwcmV2Q2hpbGQ9cHJldltwYXJlbnRdO3ByZXZbcGFyZW50XT1jaGlsZH1lbHNle3ByZXZDaGlsZD1yb290UHJldjtyb290UHJldj1jaGlsZH1pZihwcmV2Q2hpbGQmJnByZXZDaGlsZCE9PWNoaWxkKXtjZy5zZXRFZGdlKHByZXZDaGlsZCxjaGlsZCk7cmV0dXJufWNoaWxkPXBhcmVudH19KX19LHsiLi4vbG9kYXNoIjoxMH1dLDE0OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1iYXJ5Y2VudGVyO2Z1bmN0aW9uIGJhcnljZW50ZXIoZyxtb3ZhYmxlKXtyZXR1cm4gXy5tYXAobW92YWJsZSxmdW5jdGlvbih2KXt2YXIgaW5WPWcuaW5FZGdlcyh2KTtpZighaW5WLmxlbmd0aClyZXR1cm57djp2fTtlbHNle3ZhciByZXN1bHQ9Xy5yZWR1Y2UoaW5WLGZ1bmN0aW9uKGFjYyxlKXt2YXIgZWRnZT1nLmVkZ2UoZSksCm5vZGVVPWcubm9kZShlLnYpO3JldHVybntzdW06YWNjLnN1bStlZGdlLndlaWdodCpub2RlVS5vcmRlcix3ZWlnaHQ6YWNjLndlaWdodCtlZGdlLndlaWdodH19LHtzdW06MCx3ZWlnaHQ6MH0pO3JldHVybnt2OnYsYmFyeWNlbnRlcjpyZXN1bHQuc3VtL3Jlc3VsdC53ZWlnaHQsd2VpZ2h0OnJlc3VsdC53ZWlnaHR9fX0pfX0seyIuLi9sb2Rhc2giOjEwfV0sMTU6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLEdyYXBoPXJlcXVpcmUoIi4uL2dyYXBobGliIikuR3JhcGg7bW9kdWxlLmV4cG9ydHM9YnVpbGRMYXllckdyYXBoO2Z1bmN0aW9uIGJ1aWxkTGF5ZXJHcmFwaChnLHJhbmsscmVsYXRpb25zaGlwKXt2YXIgcm9vdD1jcmVhdGVSb290Tm9kZShnKSxyZXN1bHQ9KG5ldyBHcmFwaCh7Y29tcG91bmQ6dHJ1ZX0pKS5zZXRHcmFwaCh7cm9vdDpyb290fSkuc2V0RGVmYXVsdE5vZGVMYWJlbChmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpfSk7Cl8uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIG5vZGU9Zy5ub2RlKHYpLHBhcmVudD1nLnBhcmVudCh2KTtpZihub2RlLnJhbms9PT1yYW5rfHxub2RlLm1pblJhbms8PXJhbmsmJnJhbms8PW5vZGUubWF4UmFuayl7cmVzdWx0LnNldE5vZGUodik7cmVzdWx0LnNldFBhcmVudCh2LHBhcmVudHx8cm9vdCk7Xy5mb3JFYWNoKGdbcmVsYXRpb25zaGlwXSh2KSxmdW5jdGlvbihlKXt2YXIgdT1lLnY9PT12P2UudzplLnYsZWRnZT1yZXN1bHQuZWRnZSh1LHYpLHdlaWdodD0hXy5pc1VuZGVmaW5lZChlZGdlKT9lZGdlLndlaWdodDowO3Jlc3VsdC5zZXRFZGdlKHUsdix7d2VpZ2h0OmcuZWRnZShlKS53ZWlnaHQrd2VpZ2h0fSl9KTtpZihfLmhhcyhub2RlLCJtaW5SYW5rIikpcmVzdWx0LnNldE5vZGUodix7Ym9yZGVyTGVmdDpub2RlLmJvcmRlckxlZnRbcmFua10sYm9yZGVyUmlnaHQ6bm9kZS5ib3JkZXJSaWdodFtyYW5rXX0pfX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gY3JlYXRlUm9vdE5vZGUoZyl7dmFyIHY7CndoaWxlKGcuaGFzTm9kZSh2PV8udW5pcXVlSWQoIl9yb290IikpKTtyZXR1cm4gdn19LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTB9XSwxNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi4vbG9kYXNoIik7bW9kdWxlLmV4cG9ydHM9Y3Jvc3NDb3VudDtmdW5jdGlvbiBjcm9zc0NvdW50KGcsbGF5ZXJpbmcpe3ZhciBjYz0wO2Zvcih2YXIgaT0xO2k8bGF5ZXJpbmcubGVuZ3RoOysraSljYys9dHdvTGF5ZXJDcm9zc0NvdW50KGcsbGF5ZXJpbmdbaS0xXSxsYXllcmluZ1tpXSk7cmV0dXJuIGNjfWZ1bmN0aW9uIHR3b0xheWVyQ3Jvc3NDb3VudChnLG5vcnRoTGF5ZXIsc291dGhMYXllcil7dmFyIHNvdXRoUG9zPV8uemlwT2JqZWN0KHNvdXRoTGF5ZXIsXy5tYXAoc291dGhMYXllcixmdW5jdGlvbih2LGkpe3JldHVybiBpfSkpO3ZhciBzb3V0aEVudHJpZXM9Xy5mbGF0dGVuKF8ubWFwKG5vcnRoTGF5ZXIsZnVuY3Rpb24odil7cmV0dXJuIF8uY2hhaW4oZy5vdXRFZGdlcyh2KSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybntwb3M6c291dGhQb3NbZS53XSwKd2VpZ2h0OmcuZWRnZShlKS53ZWlnaHR9fSkuc29ydEJ5KCJwb3MiKS52YWx1ZSgpfSksdHJ1ZSk7dmFyIGZpcnN0SW5kZXg9MTt3aGlsZShmaXJzdEluZGV4PHNvdXRoTGF5ZXIubGVuZ3RoKWZpcnN0SW5kZXg8PD0xO3ZhciB0cmVlU2l6ZT0yKmZpcnN0SW5kZXgtMTtmaXJzdEluZGV4LT0xO3ZhciB0cmVlPV8ubWFwKG5ldyBBcnJheSh0cmVlU2l6ZSksZnVuY3Rpb24oKXtyZXR1cm4gMH0pO3ZhciBjYz0wO18uZm9yRWFjaChzb3V0aEVudHJpZXMuZm9yRWFjaChmdW5jdGlvbihlbnRyeSl7dmFyIGluZGV4PWVudHJ5LnBvcytmaXJzdEluZGV4O3RyZWVbaW5kZXhdKz1lbnRyeS53ZWlnaHQ7dmFyIHdlaWdodFN1bT0wO3doaWxlKGluZGV4PjApe2lmKGluZGV4JTIpd2VpZ2h0U3VtKz10cmVlW2luZGV4KzFdO2luZGV4PWluZGV4LTE+PjE7dHJlZVtpbmRleF0rPWVudHJ5LndlaWdodH1jYys9ZW50cnkud2VpZ2h0KndlaWdodFN1bX0pKTtyZXR1cm4gY2N9fSx7Ii4uL2xvZGFzaCI6MTB9XSwKMTc6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLGluaXRPcmRlcj1yZXF1aXJlKCIuL2luaXQtb3JkZXIiKSxjcm9zc0NvdW50PXJlcXVpcmUoIi4vY3Jvc3MtY291bnQiKSxzb3J0U3ViZ3JhcGg9cmVxdWlyZSgiLi9zb3J0LXN1YmdyYXBoIiksYnVpbGRMYXllckdyYXBoPXJlcXVpcmUoIi4vYnVpbGQtbGF5ZXItZ3JhcGgiKSxhZGRTdWJncmFwaENvbnN0cmFpbnRzPXJlcXVpcmUoIi4vYWRkLXN1YmdyYXBoLWNvbnN0cmFpbnRzIiksR3JhcGg9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5HcmFwaCx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKTttb2R1bGUuZXhwb3J0cz1vcmRlcjtmdW5jdGlvbiBvcmRlcihnKXt2YXIgbWF4UmFuaz11dGlsLm1heFJhbmsoZyksZG93bkxheWVyR3JhcGhzPWJ1aWxkTGF5ZXJHcmFwaHMoZyxfLnJhbmdlKDEsbWF4UmFuaysxKSwiaW5FZGdlcyIpLHVwTGF5ZXJHcmFwaHM9YnVpbGRMYXllckdyYXBocyhnLApfLnJhbmdlKG1heFJhbmstMSwtMSwtMSksIm91dEVkZ2VzIik7dmFyIGxheWVyaW5nPWluaXRPcmRlcihnKTthc3NpZ25PcmRlcihnLGxheWVyaW5nKTt2YXIgYmVzdENDPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxiZXN0O2Zvcih2YXIgaT0wLGxhc3RCZXN0PTA7bGFzdEJlc3Q8NDsrK2ksKytsYXN0QmVzdCl7c3dlZXBMYXllckdyYXBocyhpJTI/ZG93bkxheWVyR3JhcGhzOnVwTGF5ZXJHcmFwaHMsaSU0Pj0yKTtsYXllcmluZz11dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7dmFyIGNjPWNyb3NzQ291bnQoZyxsYXllcmluZyk7aWYoY2M8YmVzdENDKXtsYXN0QmVzdD0wO2Jlc3Q9Xy5jbG9uZURlZXAobGF5ZXJpbmcpO2Jlc3RDQz1jY319YXNzaWduT3JkZXIoZyxiZXN0KX1mdW5jdGlvbiBidWlsZExheWVyR3JhcGhzKGcscmFua3MscmVsYXRpb25zaGlwKXtyZXR1cm4gXy5tYXAocmFua3MsZnVuY3Rpb24ocmFuayl7cmV0dXJuIGJ1aWxkTGF5ZXJHcmFwaChnLHJhbmsscmVsYXRpb25zaGlwKX0pfQpmdW5jdGlvbiBzd2VlcExheWVyR3JhcGhzKGxheWVyR3JhcGhzLGJpYXNSaWdodCl7dmFyIGNnPW5ldyBHcmFwaDtfLmZvckVhY2gobGF5ZXJHcmFwaHMsZnVuY3Rpb24obGcpe3ZhciByb290PWxnLmdyYXBoKCkucm9vdDt2YXIgc29ydGVkPXNvcnRTdWJncmFwaChsZyxyb290LGNnLGJpYXNSaWdodCk7Xy5mb3JFYWNoKHNvcnRlZC52cyxmdW5jdGlvbih2LGkpe2xnLm5vZGUodikub3JkZXI9aX0pO2FkZFN1YmdyYXBoQ29uc3RyYWludHMobGcsY2csc29ydGVkLnZzKX0pfWZ1bmN0aW9uIGFzc2lnbk9yZGVyKGcsbGF5ZXJpbmcpe18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYsaSl7Zy5ub2RlKHYpLm9yZGVyPWl9KX0pfX0seyIuLi9ncmFwaGxpYiI6NywiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6MjksIi4vYWRkLXN1YmdyYXBoLWNvbnN0cmFpbnRzIjoxMywiLi9idWlsZC1sYXllci1ncmFwaCI6MTUsIi4vY3Jvc3MtY291bnQiOjE2LAoiLi9pbml0LW9yZGVyIjoxOCwiLi9zb3J0LXN1YmdyYXBoIjoyMH1dLDE4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1pbml0T3JkZXI7ZnVuY3Rpb24gaW5pdE9yZGVyKGcpe3ZhciB2aXNpdGVkPXt9LHNpbXBsZU5vZGVzPV8uZmlsdGVyKGcubm9kZXMoKSxmdW5jdGlvbih2KXtyZXR1cm4hZy5jaGlsZHJlbih2KS5sZW5ndGh9KSxtYXhSYW5rPV8ubWF4KF8ubWFwKHNpbXBsZU5vZGVzLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikucmFua30pKSxsYXllcnM9Xy5tYXAoXy5yYW5nZShtYXhSYW5rKzEpLGZ1bmN0aW9uKCl7cmV0dXJuW119KTtmdW5jdGlvbiBkZnModil7aWYoXy5oYXModmlzaXRlZCx2KSlyZXR1cm47dmlzaXRlZFt2XT10cnVlO3ZhciBub2RlPWcubm9kZSh2KTtsYXllcnNbbm9kZS5yYW5rXS5wdXNoKHYpO18uZm9yRWFjaChnLnN1Y2Nlc3NvcnModiksZGZzKX12YXIgb3JkZXJlZFZzPQpfLnNvcnRCeShzaW1wbGVOb2RlcyxmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLnJhbmt9KTtfLmZvckVhY2gob3JkZXJlZFZzLGRmcyk7cmV0dXJuIGxheWVyc319LHsiLi4vbG9kYXNoIjoxMH1dLDE5OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1yZXNvbHZlQ29uZmxpY3RzO2Z1bmN0aW9uIHJlc29sdmVDb25mbGljdHMoZW50cmllcyxjZyl7dmFyIG1hcHBlZEVudHJpZXM9e307Xy5mb3JFYWNoKGVudHJpZXMsZnVuY3Rpb24oZW50cnksaSl7dmFyIHRtcD1tYXBwZWRFbnRyaWVzW2VudHJ5LnZdPXtpbmRlZ3JlZTowLCJpbiI6W10sb3V0OltdLHZzOltlbnRyeS52XSxpOml9O2lmKCFfLmlzVW5kZWZpbmVkKGVudHJ5LmJhcnljZW50ZXIpKXt0bXAuYmFyeWNlbnRlcj1lbnRyeS5iYXJ5Y2VudGVyO3RtcC53ZWlnaHQ9ZW50cnkud2VpZ2h0fX0pO18uZm9yRWFjaChjZy5lZGdlcygpLGZ1bmN0aW9uKGUpe3ZhciBlbnRyeVY9Cm1hcHBlZEVudHJpZXNbZS52XSxlbnRyeVc9bWFwcGVkRW50cmllc1tlLnddO2lmKCFfLmlzVW5kZWZpbmVkKGVudHJ5VikmJiFfLmlzVW5kZWZpbmVkKGVudHJ5Vykpe2VudHJ5Vy5pbmRlZ3JlZSsrO2VudHJ5Vi5vdXQucHVzaChtYXBwZWRFbnRyaWVzW2Uud10pfX0pO3ZhciBzb3VyY2VTZXQ9Xy5maWx0ZXIobWFwcGVkRW50cmllcyxmdW5jdGlvbihlbnRyeSl7cmV0dXJuIWVudHJ5LmluZGVncmVlfSk7cmV0dXJuIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpfWZ1bmN0aW9uIGRvUmVzb2x2ZUNvbmZsaWN0cyhzb3VyY2VTZXQpe3ZhciBlbnRyaWVzPVtdO2Z1bmN0aW9uIGhhbmRsZUluKHZFbnRyeSl7cmV0dXJuIGZ1bmN0aW9uKHVFbnRyeSl7aWYodUVudHJ5Lm1lcmdlZClyZXR1cm47aWYoXy5pc1VuZGVmaW5lZCh1RW50cnkuYmFyeWNlbnRlcil8fF8uaXNVbmRlZmluZWQodkVudHJ5LmJhcnljZW50ZXIpfHx1RW50cnkuYmFyeWNlbnRlcj49dkVudHJ5LmJhcnljZW50ZXIpbWVyZ2VFbnRyaWVzKHZFbnRyeSwKdUVudHJ5KX19ZnVuY3Rpb24gaGFuZGxlT3V0KHZFbnRyeSl7cmV0dXJuIGZ1bmN0aW9uKHdFbnRyeSl7d0VudHJ5WyJpbiJdLnB1c2godkVudHJ5KTtpZigtLXdFbnRyeS5pbmRlZ3JlZT09PTApc291cmNlU2V0LnB1c2god0VudHJ5KX19d2hpbGUoc291cmNlU2V0Lmxlbmd0aCl7dmFyIGVudHJ5PXNvdXJjZVNldC5wb3AoKTtlbnRyaWVzLnB1c2goZW50cnkpO18uZm9yRWFjaChlbnRyeVsiaW4iXS5yZXZlcnNlKCksaGFuZGxlSW4oZW50cnkpKTtfLmZvckVhY2goZW50cnkub3V0LGhhbmRsZU91dChlbnRyeSkpfXJldHVybiBfLmNoYWluKGVudHJpZXMpLmZpbHRlcihmdW5jdGlvbihlbnRyeSl7cmV0dXJuIWVudHJ5Lm1lcmdlZH0pLm1hcChmdW5jdGlvbihlbnRyeSl7cmV0dXJuIF8ucGljayhlbnRyeSxbInZzIiwiaSIsImJhcnljZW50ZXIiLCJ3ZWlnaHQiXSl9KS52YWx1ZSgpfWZ1bmN0aW9uIG1lcmdlRW50cmllcyh0YXJnZXQsc291cmNlKXt2YXIgc3VtPTAsd2VpZ2h0PTA7CmlmKHRhcmdldC53ZWlnaHQpe3N1bSs9dGFyZ2V0LmJhcnljZW50ZXIqdGFyZ2V0LndlaWdodDt3ZWlnaHQrPXRhcmdldC53ZWlnaHR9aWYoc291cmNlLndlaWdodCl7c3VtKz1zb3VyY2UuYmFyeWNlbnRlcipzb3VyY2Uud2VpZ2h0O3dlaWdodCs9c291cmNlLndlaWdodH10YXJnZXQudnM9c291cmNlLnZzLmNvbmNhdCh0YXJnZXQudnMpO3RhcmdldC5iYXJ5Y2VudGVyPXN1bS93ZWlnaHQ7dGFyZ2V0LndlaWdodD13ZWlnaHQ7dGFyZ2V0Lmk9TWF0aC5taW4oc291cmNlLmksdGFyZ2V0LmkpO3NvdXJjZS5tZXJnZWQ9dHJ1ZX19LHsiLi4vbG9kYXNoIjoxMH1dLDIwOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxiYXJ5Y2VudGVyPXJlcXVpcmUoIi4vYmFyeWNlbnRlciIpLHJlc29sdmVDb25mbGljdHM9cmVxdWlyZSgiLi9yZXNvbHZlLWNvbmZsaWN0cyIpLHNvcnQ9cmVxdWlyZSgiLi9zb3J0Iik7bW9kdWxlLmV4cG9ydHM9CnNvcnRTdWJncmFwaDtmdW5jdGlvbiBzb3J0U3ViZ3JhcGgoZyx2LGNnLGJpYXNSaWdodCl7dmFyIG1vdmFibGU9Zy5jaGlsZHJlbih2KSxub2RlPWcubm9kZSh2KSxibD1ub2RlP25vZGUuYm9yZGVyTGVmdDp1bmRlZmluZWQsYnI9bm9kZT9ub2RlLmJvcmRlclJpZ2h0OnVuZGVmaW5lZCxzdWJncmFwaHM9e307aWYoYmwpbW92YWJsZT1fLmZpbHRlcihtb3ZhYmxlLGZ1bmN0aW9uKHcpe3JldHVybiB3IT09YmwmJnchPT1icn0pO3ZhciBiYXJ5Y2VudGVycz1iYXJ5Y2VudGVyKGcsbW92YWJsZSk7Xy5mb3JFYWNoKGJhcnljZW50ZXJzLGZ1bmN0aW9uKGVudHJ5KXtpZihnLmNoaWxkcmVuKGVudHJ5LnYpLmxlbmd0aCl7dmFyIHN1YmdyYXBoUmVzdWx0PXNvcnRTdWJncmFwaChnLGVudHJ5LnYsY2csYmlhc1JpZ2h0KTtzdWJncmFwaHNbZW50cnkudl09c3ViZ3JhcGhSZXN1bHQ7aWYoXy5oYXMoc3ViZ3JhcGhSZXN1bHQsImJhcnljZW50ZXIiKSltZXJnZUJhcnljZW50ZXJzKGVudHJ5LApzdWJncmFwaFJlc3VsdCl9fSk7dmFyIGVudHJpZXM9cmVzb2x2ZUNvbmZsaWN0cyhiYXJ5Y2VudGVycyxjZyk7ZXhwYW5kU3ViZ3JhcGhzKGVudHJpZXMsc3ViZ3JhcGhzKTt2YXIgcmVzdWx0PXNvcnQoZW50cmllcyxiaWFzUmlnaHQpO2lmKGJsKXtyZXN1bHQudnM9Xy5mbGF0dGVuKFtibCxyZXN1bHQudnMsYnJdLHRydWUpO2lmKGcucHJlZGVjZXNzb3JzKGJsKS5sZW5ndGgpe3ZhciBibFByZWQ9Zy5ub2RlKGcucHJlZGVjZXNzb3JzKGJsKVswXSksYnJQcmVkPWcubm9kZShnLnByZWRlY2Vzc29ycyhicilbMF0pO2lmKCFfLmhhcyhyZXN1bHQsImJhcnljZW50ZXIiKSl7cmVzdWx0LmJhcnljZW50ZXI9MDtyZXN1bHQud2VpZ2h0PTB9cmVzdWx0LmJhcnljZW50ZXI9KHJlc3VsdC5iYXJ5Y2VudGVyKnJlc3VsdC53ZWlnaHQrYmxQcmVkLm9yZGVyK2JyUHJlZC5vcmRlcikvKHJlc3VsdC53ZWlnaHQrMik7cmVzdWx0LndlaWdodCs9Mn19cmV0dXJuIHJlc3VsdH1mdW5jdGlvbiBleHBhbmRTdWJncmFwaHMoZW50cmllcywKc3ViZ3JhcGhzKXtfLmZvckVhY2goZW50cmllcyxmdW5jdGlvbihlbnRyeSl7ZW50cnkudnM9Xy5mbGF0dGVuKGVudHJ5LnZzLm1hcChmdW5jdGlvbih2KXtpZihzdWJncmFwaHNbdl0pcmV0dXJuIHN1YmdyYXBoc1t2XS52cztyZXR1cm4gdn0pLHRydWUpfSl9ZnVuY3Rpb24gbWVyZ2VCYXJ5Y2VudGVycyh0YXJnZXQsb3RoZXIpe2lmKCFfLmlzVW5kZWZpbmVkKHRhcmdldC5iYXJ5Y2VudGVyKSl7dGFyZ2V0LmJhcnljZW50ZXI9KHRhcmdldC5iYXJ5Y2VudGVyKnRhcmdldC53ZWlnaHQrb3RoZXIuYmFyeWNlbnRlcipvdGhlci53ZWlnaHQpLyh0YXJnZXQud2VpZ2h0K290aGVyLndlaWdodCk7dGFyZ2V0LndlaWdodCs9b3RoZXIud2VpZ2h0fWVsc2V7dGFyZ2V0LmJhcnljZW50ZXI9b3RoZXIuYmFyeWNlbnRlcjt0YXJnZXQud2VpZ2h0PW90aGVyLndlaWdodH19fSx7Ii4uL2xvZGFzaCI6MTAsIi4vYmFyeWNlbnRlciI6MTQsIi4vcmVzb2x2ZS1jb25mbGljdHMiOjE5LCIuL3NvcnQiOjIxfV0sCjIxOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKTttb2R1bGUuZXhwb3J0cz1zb3J0O2Z1bmN0aW9uIHNvcnQoZW50cmllcyxiaWFzUmlnaHQpe3ZhciBwYXJ0cz11dGlsLnBhcnRpdGlvbihlbnRyaWVzLGZ1bmN0aW9uKGVudHJ5KXtyZXR1cm4gXy5oYXMoZW50cnksImJhcnljZW50ZXIiKX0pO3ZhciBzb3J0YWJsZT1wYXJ0cy5saHMsdW5zb3J0YWJsZT1fLnNvcnRCeShwYXJ0cy5yaHMsZnVuY3Rpb24oZW50cnkpe3JldHVybi1lbnRyeS5pfSksdnM9W10sc3VtPTAsd2VpZ2h0PTAsdnNJbmRleD0wO3NvcnRhYmxlLnNvcnQoY29tcGFyZVdpdGhCaWFzKCEhYmlhc1JpZ2h0KSk7dnNJbmRleD1jb25zdW1lVW5zb3J0YWJsZSh2cyx1bnNvcnRhYmxlLHZzSW5kZXgpO18uZm9yRWFjaChzb3J0YWJsZSxmdW5jdGlvbihlbnRyeSl7dnNJbmRleCs9ZW50cnkudnMubGVuZ3RoO3ZzLnB1c2goZW50cnkudnMpOwpzdW0rPWVudHJ5LmJhcnljZW50ZXIqZW50cnkud2VpZ2h0O3dlaWdodCs9ZW50cnkud2VpZ2h0O3ZzSW5kZXg9Y29uc3VtZVVuc29ydGFibGUodnMsdW5zb3J0YWJsZSx2c0luZGV4KX0pO3ZhciByZXN1bHQ9e3ZzOl8uZmxhdHRlbih2cyx0cnVlKX07aWYod2VpZ2h0KXtyZXN1bHQuYmFyeWNlbnRlcj1zdW0vd2VpZ2h0O3Jlc3VsdC53ZWlnaHQ9d2VpZ2h0fXJldHVybiByZXN1bHR9ZnVuY3Rpb24gY29uc3VtZVVuc29ydGFibGUodnMsdW5zb3J0YWJsZSxpbmRleCl7dmFyIGxhc3Q7d2hpbGUodW5zb3J0YWJsZS5sZW5ndGgmJihsYXN0PV8ubGFzdCh1bnNvcnRhYmxlKSkuaTw9aW5kZXgpe3Vuc29ydGFibGUucG9wKCk7dnMucHVzaChsYXN0LnZzKTtpbmRleCsrfXJldHVybiBpbmRleH1mdW5jdGlvbiBjb21wYXJlV2l0aEJpYXMoYmlhcyl7cmV0dXJuIGZ1bmN0aW9uKGVudHJ5VixlbnRyeVcpe2lmKGVudHJ5Vi5iYXJ5Y2VudGVyPGVudHJ5Vy5iYXJ5Y2VudGVyKXJldHVybi0xO2Vsc2UgaWYoZW50cnlWLmJhcnljZW50ZXI+CmVudHJ5Vy5iYXJ5Y2VudGVyKXJldHVybiAxO3JldHVybiFiaWFzP2VudHJ5Vi5pLWVudHJ5Vy5pOmVudHJ5Vy5pLWVudHJ5Vi5pfX19LHsiLi4vbG9kYXNoIjoxMCwiLi4vdXRpbCI6Mjl9XSwyMjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIF89cmVxdWlyZSgiLi9sb2Rhc2giKTttb2R1bGUuZXhwb3J0cz1wYXJlbnREdW1teUNoYWlucztmdW5jdGlvbiBwYXJlbnREdW1teUNoYWlucyhnKXt2YXIgcG9zdG9yZGVyTnVtcz1wb3N0b3JkZXIoZyk7Xy5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucyxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodiksZWRnZU9iaj1ub2RlLmVkZ2VPYmoscGF0aERhdGE9ZmluZFBhdGgoZyxwb3N0b3JkZXJOdW1zLGVkZ2VPYmoudixlZGdlT2JqLncpLHBhdGg9cGF0aERhdGEucGF0aCxsY2E9cGF0aERhdGEubGNhLHBhdGhJZHg9MCxwYXRoVj1wYXRoW3BhdGhJZHhdLGFzY2VuZGluZz10cnVlO3doaWxlKHYhPT1lZGdlT2JqLncpe25vZGU9Cmcubm9kZSh2KTtpZihhc2NlbmRpbmcpe3doaWxlKChwYXRoVj1wYXRoW3BhdGhJZHhdKSE9PWxjYSYmZy5ub2RlKHBhdGhWKS5tYXhSYW5rPG5vZGUucmFuaylwYXRoSWR4Kys7aWYocGF0aFY9PT1sY2EpYXNjZW5kaW5nPWZhbHNlfWlmKCFhc2NlbmRpbmcpe3doaWxlKHBhdGhJZHg8cGF0aC5sZW5ndGgtMSYmZy5ub2RlKHBhdGhWPXBhdGhbcGF0aElkeCsxXSkubWluUmFuazw9bm9kZS5yYW5rKXBhdGhJZHgrKztwYXRoVj1wYXRoW3BhdGhJZHhdfWcuc2V0UGFyZW50KHYscGF0aFYpO3Y9Zy5zdWNjZXNzb3JzKHYpWzBdfX0pfWZ1bmN0aW9uIGZpbmRQYXRoKGcscG9zdG9yZGVyTnVtcyx2LHcpe3ZhciB2UGF0aD1bXSx3UGF0aD1bXSxsb3c9TWF0aC5taW4ocG9zdG9yZGVyTnVtc1t2XS5sb3cscG9zdG9yZGVyTnVtc1t3XS5sb3cpLGxpbT1NYXRoLm1heChwb3N0b3JkZXJOdW1zW3ZdLmxpbSxwb3N0b3JkZXJOdW1zW3ddLmxpbSkscGFyZW50LGxjYTtwYXJlbnQ9djtkb3twYXJlbnQ9CmcucGFyZW50KHBhcmVudCk7dlBhdGgucHVzaChwYXJlbnQpfXdoaWxlKHBhcmVudCYmKHBvc3RvcmRlck51bXNbcGFyZW50XS5sb3c+bG93fHxsaW0+cG9zdG9yZGVyTnVtc1twYXJlbnRdLmxpbSkpO2xjYT1wYXJlbnQ7cGFyZW50PXc7d2hpbGUoKHBhcmVudD1nLnBhcmVudChwYXJlbnQpKSE9PWxjYSl3UGF0aC5wdXNoKHBhcmVudCk7cmV0dXJue3BhdGg6dlBhdGguY29uY2F0KHdQYXRoLnJldmVyc2UoKSksbGNhOmxjYX19ZnVuY3Rpb24gcG9zdG9yZGVyKGcpe3ZhciByZXN1bHQ9e30sbGltPTA7ZnVuY3Rpb24gZGZzKHYpe3ZhciBsb3c9bGltO18uZm9yRWFjaChnLmNoaWxkcmVuKHYpLGRmcyk7cmVzdWx0W3ZdPXtsb3c6bG93LGxpbTpsaW0rK319Xy5mb3JFYWNoKGcuY2hpbGRyZW4oKSxkZnMpO3JldHVybiByZXN1bHR9fSx7Ii4vbG9kYXNoIjoxMH1dLDIzOltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxHcmFwaD0KcmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5HcmFwaCx1dGlsPXJlcXVpcmUoIi4uL3V0aWwiKTttb2R1bGUuZXhwb3J0cz17cG9zaXRpb25YOnBvc2l0aW9uWCxmaW5kVHlwZTFDb25mbGljdHM6ZmluZFR5cGUxQ29uZmxpY3RzLGZpbmRUeXBlMkNvbmZsaWN0czpmaW5kVHlwZTJDb25mbGljdHMsYWRkQ29uZmxpY3Q6YWRkQ29uZmxpY3QsaGFzQ29uZmxpY3Q6aGFzQ29uZmxpY3QsdmVydGljYWxBbGlnbm1lbnQ6dmVydGljYWxBbGlnbm1lbnQsaG9yaXpvbnRhbENvbXBhY3Rpb246aG9yaXpvbnRhbENvbXBhY3Rpb24sYWxpZ25Db29yZGluYXRlczphbGlnbkNvb3JkaW5hdGVzLGZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50OmZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50LGJhbGFuY2U6YmFsYW5jZX07ZnVuY3Rpb24gZmluZFR5cGUxQ29uZmxpY3RzKGcsbGF5ZXJpbmcpe3ZhciBjb25mbGljdHM9e307ZnVuY3Rpb24gdmlzaXRMYXllcihwcmV2TGF5ZXIsbGF5ZXIpe3ZhciBrMD0wLHNjYW5Qb3M9CjAscHJldkxheWVyTGVuZ3RoPXByZXZMYXllci5sZW5ndGgsbGFzdE5vZGU9Xy5sYXN0KGxheWVyKTtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odixpKXt2YXIgdz1maW5kT3RoZXJJbm5lclNlZ21lbnROb2RlKGcsdiksazE9dz9nLm5vZGUodykub3JkZXI6cHJldkxheWVyTGVuZ3RoO2lmKHd8fHY9PT1sYXN0Tm9kZSl7Xy5mb3JFYWNoKGxheWVyLnNsaWNlKHNjYW5Qb3MsaSsxKSxmdW5jdGlvbihzY2FuTm9kZSl7Xy5mb3JFYWNoKGcucHJlZGVjZXNzb3JzKHNjYW5Ob2RlKSxmdW5jdGlvbih1KXt2YXIgdUxhYmVsPWcubm9kZSh1KSx1UG9zPXVMYWJlbC5vcmRlcjtpZigodVBvczxrMHx8azE8dVBvcykmJiEodUxhYmVsLmR1bW15JiZnLm5vZGUoc2Nhbk5vZGUpLmR1bW15KSlhZGRDb25mbGljdChjb25mbGljdHMsdSxzY2FuTm9kZSl9KX0pO3NjYW5Qb3M9aSsxO2swPWsxfX0pO3JldHVybiBsYXllcn1fLnJlZHVjZShsYXllcmluZyx2aXNpdExheWVyKTtyZXR1cm4gY29uZmxpY3RzfQpmdW5jdGlvbiBmaW5kVHlwZTJDb25mbGljdHMoZyxsYXllcmluZyl7dmFyIGNvbmZsaWN0cz17fTtmdW5jdGlvbiBzY2FuKHNvdXRoLHNvdXRoUG9zLHNvdXRoRW5kLHByZXZOb3J0aEJvcmRlcixuZXh0Tm9ydGhCb3JkZXIpe3ZhciB2O18uZm9yRWFjaChfLnJhbmdlKHNvdXRoUG9zLHNvdXRoRW5kKSxmdW5jdGlvbihpKXt2PXNvdXRoW2ldO2lmKGcubm9kZSh2KS5kdW1teSlfLmZvckVhY2goZy5wcmVkZWNlc3NvcnModiksZnVuY3Rpb24odSl7dmFyIHVOb2RlPWcubm9kZSh1KTtpZih1Tm9kZS5kdW1teSYmKHVOb2RlLm9yZGVyPHByZXZOb3J0aEJvcmRlcnx8dU5vZGUub3JkZXI+bmV4dE5vcnRoQm9yZGVyKSlhZGRDb25mbGljdChjb25mbGljdHMsdSx2KX0pfSl9ZnVuY3Rpb24gdmlzaXRMYXllcihub3J0aCxzb3V0aCl7dmFyIHByZXZOb3J0aFBvcz0tMSxuZXh0Tm9ydGhQb3Msc291dGhQb3M9MDtfLmZvckVhY2goc291dGgsZnVuY3Rpb24odixzb3V0aExvb2thaGVhZCl7aWYoZy5ub2RlKHYpLmR1bW15PT09CiJib3JkZXIiKXt2YXIgcHJlZGVjZXNzb3JzPWcucHJlZGVjZXNzb3JzKHYpO2lmKHByZWRlY2Vzc29ycy5sZW5ndGgpe25leHROb3J0aFBvcz1nLm5vZGUocHJlZGVjZXNzb3JzWzBdKS5vcmRlcjtzY2FuKHNvdXRoLHNvdXRoUG9zLHNvdXRoTG9va2FoZWFkLHByZXZOb3J0aFBvcyxuZXh0Tm9ydGhQb3MpO3NvdXRoUG9zPXNvdXRoTG9va2FoZWFkO3ByZXZOb3J0aFBvcz1uZXh0Tm9ydGhQb3N9fXNjYW4oc291dGgsc291dGhQb3Msc291dGgubGVuZ3RoLG5leHROb3J0aFBvcyxub3J0aC5sZW5ndGgpfSk7cmV0dXJuIHNvdXRofV8ucmVkdWNlKGxheWVyaW5nLHZpc2l0TGF5ZXIpO3JldHVybiBjb25mbGljdHN9ZnVuY3Rpb24gZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLHYpe2lmKGcubm9kZSh2KS5kdW1teSlyZXR1cm4gXy5maW5kKGcucHJlZGVjZXNzb3JzKHYpLGZ1bmN0aW9uKHUpe3JldHVybiBnLm5vZGUodSkuZHVtbXl9KX1mdW5jdGlvbiBhZGRDb25mbGljdChjb25mbGljdHMsCnYsdyl7aWYodj53KXt2YXIgdG1wPXY7dj13O3c9dG1wfXZhciBjb25mbGljdHNWPWNvbmZsaWN0c1t2XTtpZighY29uZmxpY3RzViljb25mbGljdHNbdl09Y29uZmxpY3RzVj17fTtjb25mbGljdHNWW3ddPXRydWV9ZnVuY3Rpb24gaGFzQ29uZmxpY3QoY29uZmxpY3RzLHYsdyl7aWYodj53KXt2YXIgdG1wPXY7dj13O3c9dG1wfXJldHVybiBfLmhhcyhjb25mbGljdHNbdl0sdyl9ZnVuY3Rpb24gdmVydGljYWxBbGlnbm1lbnQoZyxsYXllcmluZyxjb25mbGljdHMsbmVpZ2hib3JGbil7dmFyIHJvb3Q9e30sYWxpZ249e30scG9zPXt9O18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7Xy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYsb3JkZXIpe3Jvb3Rbdl09djthbGlnblt2XT12O3Bvc1t2XT1vcmRlcn0pfSk7Xy5mb3JFYWNoKGxheWVyaW5nLGZ1bmN0aW9uKGxheWVyKXt2YXIgcHJldklkeD0tMTtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odil7dmFyIHdzPW5laWdoYm9yRm4odik7CmlmKHdzLmxlbmd0aCl7d3M9Xy5zb3J0Qnkod3MsZnVuY3Rpb24odyl7cmV0dXJuIHBvc1t3XX0pO3ZhciBtcD0od3MubGVuZ3RoLTEpLzI7Zm9yKHZhciBpPU1hdGguZmxvb3IobXApLGlsPU1hdGguY2VpbChtcCk7aTw9aWw7KytpKXt2YXIgdz13c1tpXTtpZihhbGlnblt2XT09PXYmJnByZXZJZHg8cG9zW3ddJiYhaGFzQ29uZmxpY3QoY29uZmxpY3RzLHYsdykpe2FsaWduW3ddPXY7YWxpZ25bdl09cm9vdFt2XT1yb290W3ddO3ByZXZJZHg9cG9zW3ddfX19fSl9KTtyZXR1cm57cm9vdDpyb290LGFsaWduOmFsaWdufX1mdW5jdGlvbiBob3Jpem9udGFsQ29tcGFjdGlvbihnLGxheWVyaW5nLHJvb3QsYWxpZ24scmV2ZXJzZVNlcCl7dmFyIHhzPXt9LGJsb2NrRz1idWlsZEJsb2NrR3JhcGgoZyxsYXllcmluZyxyb290LHJldmVyc2VTZXApLGJvcmRlclR5cGU9cmV2ZXJzZVNlcD8iYm9yZGVyTGVmdCI6ImJvcmRlclJpZ2h0IjtmdW5jdGlvbiBpdGVyYXRlKHNldFhzRnVuYyxuZXh0Tm9kZXNGdW5jKXt2YXIgc3RhY2s9CmJsb2NrRy5ub2RlcygpO3ZhciBlbGVtPXN0YWNrLnBvcCgpO3ZhciB2aXNpdGVkPXt9O3doaWxlKGVsZW0pe2lmKHZpc2l0ZWRbZWxlbV0pc2V0WHNGdW5jKGVsZW0pO2Vsc2V7dmlzaXRlZFtlbGVtXT10cnVlO3N0YWNrLnB1c2goZWxlbSk7c3RhY2s9c3RhY2suY29uY2F0KG5leHROb2Rlc0Z1bmMoZWxlbSkpfWVsZW09c3RhY2sucG9wKCl9fWZ1bmN0aW9uIHBhc3MxKGVsZW0pe3hzW2VsZW1dPWJsb2NrRy5pbkVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsZSl7cmV0dXJuIE1hdGgubWF4KGFjYyx4c1tlLnZdK2Jsb2NrRy5lZGdlKGUpKX0sMCl9ZnVuY3Rpb24gcGFzczIoZWxlbSl7dmFyIG1pbj1ibG9ja0cub3V0RWRnZXMoZWxlbSkucmVkdWNlKGZ1bmN0aW9uKGFjYyxlKXtyZXR1cm4gTWF0aC5taW4oYWNjLHhzW2Uud10tYmxvY2tHLmVkZ2UoZSkpfSxOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO3ZhciBub2RlPWcubm9kZShlbGVtKTtpZihtaW4hPT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkmJgpub2RlLmJvcmRlclR5cGUhPT1ib3JkZXJUeXBlKXhzW2VsZW1dPU1hdGgubWF4KHhzW2VsZW1dLG1pbil9aXRlcmF0ZShwYXNzMSxfLmJpbmQoYmxvY2tHLnByZWRlY2Vzc29ycyxibG9ja0cpKTtpdGVyYXRlKHBhc3MyLF8uYmluZChibG9ja0cuc3VjY2Vzc29ycyxibG9ja0cpKTtfLmZvckVhY2goYWxpZ24sZnVuY3Rpb24odil7eHNbdl09eHNbcm9vdFt2XV19KTtyZXR1cm4geHN9ZnVuY3Rpb24gYnVpbGRCbG9ja0dyYXBoKGcsbGF5ZXJpbmcscm9vdCxyZXZlcnNlU2VwKXt2YXIgYmxvY2tHcmFwaD1uZXcgR3JhcGgsZ3JhcGhMYWJlbD1nLmdyYXBoKCksc2VwRm49c2VwKGdyYXBoTGFiZWwubm9kZXNlcCxncmFwaExhYmVsLmVkZ2VzZXAscmV2ZXJzZVNlcCk7Xy5mb3JFYWNoKGxheWVyaW5nLGZ1bmN0aW9uKGxheWVyKXt2YXIgdTtfLmZvckVhY2gobGF5ZXIsZnVuY3Rpb24odil7dmFyIHZSb290PXJvb3Rbdl07YmxvY2tHcmFwaC5zZXROb2RlKHZSb290KTtpZih1KXt2YXIgdVJvb3Q9CnJvb3RbdV0scHJldk1heD1ibG9ja0dyYXBoLmVkZ2UodVJvb3QsdlJvb3QpO2Jsb2NrR3JhcGguc2V0RWRnZSh1Um9vdCx2Um9vdCxNYXRoLm1heChzZXBGbihnLHYsdSkscHJldk1heHx8MCkpfXU9dn0pfSk7cmV0dXJuIGJsb2NrR3JhcGh9ZnVuY3Rpb24gZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQoZyx4c3Mpe3JldHVybiBfLm1pbkJ5KF8udmFsdWVzKHhzcyksZnVuY3Rpb24oeHMpe3ZhciBtYXg9TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO3ZhciBtaW49TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO18uZm9ySW4oeHMsZnVuY3Rpb24oeCx2KXt2YXIgaGFsZldpZHRoPXdpZHRoKGcsdikvMjttYXg9TWF0aC5tYXgoeCtoYWxmV2lkdGgsbWF4KTttaW49TWF0aC5taW4oeC1oYWxmV2lkdGgsbWluKX0pO3JldHVybiBtYXgtbWlufSl9ZnVuY3Rpb24gYWxpZ25Db29yZGluYXRlcyh4c3MsYWxpZ25Ubyl7dmFyIGFsaWduVG9WYWxzPV8udmFsdWVzKGFsaWduVG8pLGFsaWduVG9NaW49Cl8ubWluKGFsaWduVG9WYWxzKSxhbGlnblRvTWF4PV8ubWF4KGFsaWduVG9WYWxzKTtfLmZvckVhY2goWyJ1IiwiZCJdLGZ1bmN0aW9uKHZlcnQpe18uZm9yRWFjaChbImwiLCJyIl0sZnVuY3Rpb24oaG9yaXope3ZhciBhbGlnbm1lbnQ9dmVydCtob3Jpeix4cz14c3NbYWxpZ25tZW50XSxkZWx0YTtpZih4cz09PWFsaWduVG8pcmV0dXJuO3ZhciB4c1ZhbHM9Xy52YWx1ZXMoeHMpO2RlbHRhPWhvcml6PT09ImwiP2FsaWduVG9NaW4tXy5taW4oeHNWYWxzKTphbGlnblRvTWF4LV8ubWF4KHhzVmFscyk7aWYoZGVsdGEpeHNzW2FsaWdubWVudF09Xy5tYXBWYWx1ZXMoeHMsZnVuY3Rpb24oeCl7cmV0dXJuIHgrZGVsdGF9KX0pfSl9ZnVuY3Rpb24gYmFsYW5jZSh4c3MsYWxpZ24pe3JldHVybiBfLm1hcFZhbHVlcyh4c3MudWwsZnVuY3Rpb24oaWdub3JlLHYpe2lmKGFsaWduKXJldHVybiB4c3NbYWxpZ24udG9Mb3dlckNhc2UoKV1bdl07ZWxzZXt2YXIgeHM9Xy5zb3J0QnkoXy5tYXAoeHNzLAp2KSk7cmV0dXJuKHhzWzFdK3hzWzJdKS8yfX0pfWZ1bmN0aW9uIHBvc2l0aW9uWChnKXt2YXIgbGF5ZXJpbmc9dXRpbC5idWlsZExheWVyTWF0cml4KGcpLGNvbmZsaWN0cz1fLm1lcmdlKGZpbmRUeXBlMUNvbmZsaWN0cyhnLGxheWVyaW5nKSxmaW5kVHlwZTJDb25mbGljdHMoZyxsYXllcmluZykpO3ZhciB4c3M9e30sYWRqdXN0ZWRMYXllcmluZztfLmZvckVhY2goWyJ1IiwiZCJdLGZ1bmN0aW9uKHZlcnQpe2FkanVzdGVkTGF5ZXJpbmc9dmVydD09PSJ1Ij9sYXllcmluZzpfLnZhbHVlcyhsYXllcmluZykucmV2ZXJzZSgpO18uZm9yRWFjaChbImwiLCJyIl0sZnVuY3Rpb24oaG9yaXope2lmKGhvcml6PT09InIiKWFkanVzdGVkTGF5ZXJpbmc9Xy5tYXAoYWRqdXN0ZWRMYXllcmluZyxmdW5jdGlvbihpbm5lcil7cmV0dXJuIF8udmFsdWVzKGlubmVyKS5yZXZlcnNlKCl9KTt2YXIgbmVpZ2hib3JGbj1fLmJpbmQodmVydD09PSJ1Ij9nLnByZWRlY2Vzc29yczpnLnN1Y2Nlc3NvcnMsCmcpO3ZhciBhbGlnbj12ZXJ0aWNhbEFsaWdubWVudChnLGFkanVzdGVkTGF5ZXJpbmcsY29uZmxpY3RzLG5laWdoYm9yRm4pO3ZhciB4cz1ob3Jpem9udGFsQ29tcGFjdGlvbihnLGFkanVzdGVkTGF5ZXJpbmcsYWxpZ24ucm9vdCxhbGlnbi5hbGlnbixob3Jpej09PSJyIik7aWYoaG9yaXo9PT0iciIpeHM9Xy5tYXBWYWx1ZXMoeHMsZnVuY3Rpb24oeCl7cmV0dXJuLXh9KTt4c3NbdmVydCtob3Jpel09eHN9KX0pO3ZhciBzbWFsbGVzdFdpZHRoPWZpbmRTbWFsbGVzdFdpZHRoQWxpZ25tZW50KGcseHNzKTthbGlnbkNvb3JkaW5hdGVzKHhzcyxzbWFsbGVzdFdpZHRoKTtyZXR1cm4gYmFsYW5jZSh4c3MsZy5ncmFwaCgpLmFsaWduKX1mdW5jdGlvbiBzZXAobm9kZVNlcCxlZGdlU2VwLHJldmVyc2VTZXApe3JldHVybiBmdW5jdGlvbihnLHYsdyl7dmFyIHZMYWJlbD1nLm5vZGUodiksd0xhYmVsPWcubm9kZSh3KSxzdW09MCxkZWx0YTtzdW0rPXZMYWJlbC53aWR0aC8yO2lmKF8uaGFzKHZMYWJlbCwKImxhYmVscG9zIikpc3dpdGNoKHZMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKXtjYXNlICJsIjpkZWx0YT0tdkxhYmVsLndpZHRoLzI7YnJlYWs7Y2FzZSAiciI6ZGVsdGE9dkxhYmVsLndpZHRoLzI7YnJlYWt9aWYoZGVsdGEpc3VtKz1yZXZlcnNlU2VwP2RlbHRhOi1kZWx0YTtkZWx0YT0wO3N1bSs9KHZMYWJlbC5kdW1teT9lZGdlU2VwOm5vZGVTZXApLzI7c3VtKz0od0xhYmVsLmR1bW15P2VkZ2VTZXA6bm9kZVNlcCkvMjtzdW0rPXdMYWJlbC53aWR0aC8yO2lmKF8uaGFzKHdMYWJlbCwibGFiZWxwb3MiKSlzd2l0Y2god0xhYmVsLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkpe2Nhc2UgImwiOmRlbHRhPXdMYWJlbC53aWR0aC8yO2JyZWFrO2Nhc2UgInIiOmRlbHRhPS13TGFiZWwud2lkdGgvMjticmVha31pZihkZWx0YSlzdW0rPXJldmVyc2VTZXA/ZGVsdGE6LWRlbHRhO2RlbHRhPTA7cmV0dXJuIHN1bX19ZnVuY3Rpb24gd2lkdGgoZyx2KXtyZXR1cm4gZy5ub2RlKHYpLndpZHRofQp9LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5fV0sMjQ6W2Z1bmN0aW9uKHJlcXVpcmUsbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4uL2xvZGFzaCIpLHV0aWw9cmVxdWlyZSgiLi4vdXRpbCIpLHBvc2l0aW9uWD1yZXF1aXJlKCIuL2JrIikucG9zaXRpb25YO21vZHVsZS5leHBvcnRzPXBvc2l0aW9uO2Z1bmN0aW9uIHBvc2l0aW9uKGcpe2c9dXRpbC5hc05vbkNvbXBvdW5kR3JhcGgoZyk7cG9zaXRpb25ZKGcpO18uZm9yRWFjaChwb3NpdGlvblgoZyksZnVuY3Rpb24oeCx2KXtnLm5vZGUodikueD14fSl9ZnVuY3Rpb24gcG9zaXRpb25ZKGcpe3ZhciBsYXllcmluZz11dGlsLmJ1aWxkTGF5ZXJNYXRyaXgoZykscmFua1NlcD1nLmdyYXBoKCkucmFua3NlcCxwcmV2WT0wO18uZm9yRWFjaChsYXllcmluZyxmdW5jdGlvbihsYXllcil7dmFyIG1heEhlaWdodD1fLm1heChfLm1hcChsYXllcixmdW5jdGlvbih2KXtyZXR1cm4gZy5ub2RlKHYpLmhlaWdodH0pKTsKXy5mb3JFYWNoKGxheWVyLGZ1bmN0aW9uKHYpe2cubm9kZSh2KS55PXByZXZZK21heEhlaWdodC8yfSk7cHJldlkrPW1heEhlaWdodCtyYW5rU2VwfSl9fSx7Ii4uL2xvZGFzaCI6MTAsIi4uL3V0aWwiOjI5LCIuL2JrIjoyM31dLDI1OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxHcmFwaD1yZXF1aXJlKCIuLi9ncmFwaGxpYiIpLkdyYXBoLHNsYWNrPXJlcXVpcmUoIi4vdXRpbCIpLnNsYWNrO21vZHVsZS5leHBvcnRzPWZlYXNpYmxlVHJlZTtmdW5jdGlvbiBmZWFzaWJsZVRyZWUoZyl7dmFyIHQ9bmV3IEdyYXBoKHtkaXJlY3RlZDpmYWxzZX0pO3ZhciBzdGFydD1nLm5vZGVzKClbMF0sc2l6ZT1nLm5vZGVDb3VudCgpO3Quc2V0Tm9kZShzdGFydCx7fSk7dmFyIGVkZ2UsZGVsdGE7d2hpbGUodGlnaHRUcmVlKHQsZyk8c2l6ZSl7ZWRnZT1maW5kTWluU2xhY2tFZGdlKHQsZyk7ZGVsdGE9dC5oYXNOb2RlKGVkZ2Uudik/CnNsYWNrKGcsZWRnZSk6LXNsYWNrKGcsZWRnZSk7c2hpZnRSYW5rcyh0LGcsZGVsdGEpfXJldHVybiB0fWZ1bmN0aW9uIHRpZ2h0VHJlZSh0LGcpe2Z1bmN0aW9uIGRmcyh2KXtfLmZvckVhY2goZy5ub2RlRWRnZXModiksZnVuY3Rpb24oZSl7dmFyIGVkZ2VWPWUudix3PXY9PT1lZGdlVj9lLnc6ZWRnZVY7aWYoIXQuaGFzTm9kZSh3KSYmIXNsYWNrKGcsZSkpe3Quc2V0Tm9kZSh3LHt9KTt0LnNldEVkZ2Uodix3LHt9KTtkZnModyl9fSl9Xy5mb3JFYWNoKHQubm9kZXMoKSxkZnMpO3JldHVybiB0Lm5vZGVDb3VudCgpfWZ1bmN0aW9uIGZpbmRNaW5TbGFja0VkZ2UodCxnKXtyZXR1cm4gXy5taW5CeShnLmVkZ2VzKCksZnVuY3Rpb24oZSl7aWYodC5oYXNOb2RlKGUudikhPT10Lmhhc05vZGUoZS53KSlyZXR1cm4gc2xhY2soZyxlKX0pfWZ1bmN0aW9uIHNoaWZ0UmFua3ModCxnLGRlbHRhKXtfLmZvckVhY2godC5ub2RlcygpLGZ1bmN0aW9uKHYpe2cubm9kZSh2KS5yYW5rKz1kZWx0YX0pfQp9LHsiLi4vZ3JhcGhsaWIiOjcsIi4uL2xvZGFzaCI6MTAsIi4vdXRpbCI6Mjh9XSwyNjpbZnVuY3Rpb24ocmVxdWlyZSxtb2R1bGUsZXhwb3J0cyl7dmFyIHJhbmtVdGlsPXJlcXVpcmUoIi4vdXRpbCIpLGxvbmdlc3RQYXRoPXJhbmtVdGlsLmxvbmdlc3RQYXRoLGZlYXNpYmxlVHJlZT1yZXF1aXJlKCIuL2ZlYXNpYmxlLXRyZWUiKSxuZXR3b3JrU2ltcGxleD1yZXF1aXJlKCIuL25ldHdvcmstc2ltcGxleCIpO21vZHVsZS5leHBvcnRzPXJhbms7ZnVuY3Rpb24gcmFuayhnKXtzd2l0Y2goZy5ncmFwaCgpLnJhbmtlcil7Y2FzZSAibmV0d29yay1zaW1wbGV4IjpuZXR3b3JrU2ltcGxleFJhbmtlcihnKTticmVhaztjYXNlICJ0aWdodC10cmVlIjp0aWdodFRyZWVSYW5rZXIoZyk7YnJlYWs7Y2FzZSAibG9uZ2VzdC1wYXRoIjpsb25nZXN0UGF0aFJhbmtlcihnKTticmVhaztkZWZhdWx0Om5ldHdvcmtTaW1wbGV4UmFua2VyKGcpfX12YXIgbG9uZ2VzdFBhdGhSYW5rZXI9bG9uZ2VzdFBhdGg7CmZ1bmN0aW9uIHRpZ2h0VHJlZVJhbmtlcihnKXtsb25nZXN0UGF0aChnKTtmZWFzaWJsZVRyZWUoZyl9ZnVuY3Rpb24gbmV0d29ya1NpbXBsZXhSYW5rZXIoZyl7bmV0d29ya1NpbXBsZXgoZyl9fSx7Ii4vZmVhc2libGUtdHJlZSI6MjUsIi4vbmV0d29yay1zaW1wbGV4IjoyNywiLi91dGlsIjoyOH1dLDI3OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKSxmZWFzaWJsZVRyZWU9cmVxdWlyZSgiLi9mZWFzaWJsZS10cmVlIiksc2xhY2s9cmVxdWlyZSgiLi91dGlsIikuc2xhY2ssaW5pdFJhbms9cmVxdWlyZSgiLi91dGlsIikubG9uZ2VzdFBhdGgscHJlb3JkZXI9cmVxdWlyZSgiLi4vZ3JhcGhsaWIiKS5hbGcucHJlb3JkZXIscG9zdG9yZGVyPXJlcXVpcmUoIi4uL2dyYXBobGliIikuYWxnLnBvc3RvcmRlcixzaW1wbGlmeT1yZXF1aXJlKCIuLi91dGlsIikuc2ltcGxpZnk7bW9kdWxlLmV4cG9ydHM9bmV0d29ya1NpbXBsZXg7Cm5ldHdvcmtTaW1wbGV4LmluaXRMb3dMaW1WYWx1ZXM9aW5pdExvd0xpbVZhbHVlcztuZXR3b3JrU2ltcGxleC5pbml0Q3V0VmFsdWVzPWluaXRDdXRWYWx1ZXM7bmV0d29ya1NpbXBsZXguY2FsY0N1dFZhbHVlPWNhbGNDdXRWYWx1ZTtuZXR3b3JrU2ltcGxleC5sZWF2ZUVkZ2U9bGVhdmVFZGdlO25ldHdvcmtTaW1wbGV4LmVudGVyRWRnZT1lbnRlckVkZ2U7bmV0d29ya1NpbXBsZXguZXhjaGFuZ2VFZGdlcz1leGNoYW5nZUVkZ2VzO2Z1bmN0aW9uIG5ldHdvcmtTaW1wbGV4KGcpe2c9c2ltcGxpZnkoZyk7aW5pdFJhbmsoZyk7dmFyIHQ9ZmVhc2libGVUcmVlKGcpO2luaXRMb3dMaW1WYWx1ZXModCk7aW5pdEN1dFZhbHVlcyh0LGcpO3ZhciBlLGY7d2hpbGUoZT1sZWF2ZUVkZ2UodCkpe2Y9ZW50ZXJFZGdlKHQsZyxlKTtleGNoYW5nZUVkZ2VzKHQsZyxlLGYpfX1mdW5jdGlvbiBpbml0Q3V0VmFsdWVzKHQsZyl7dmFyIHZzPXBvc3RvcmRlcih0LHQubm9kZXMoKSk7dnM9dnMuc2xpY2UoMCwKdnMubGVuZ3RoLTEpO18uZm9yRWFjaCh2cyxmdW5jdGlvbih2KXthc3NpZ25DdXRWYWx1ZSh0LGcsdil9KX1mdW5jdGlvbiBhc3NpZ25DdXRWYWx1ZSh0LGcsY2hpbGQpe3ZhciBjaGlsZExhYj10Lm5vZGUoY2hpbGQpLHBhcmVudD1jaGlsZExhYi5wYXJlbnQ7dC5lZGdlKGNoaWxkLHBhcmVudCkuY3V0dmFsdWU9Y2FsY0N1dFZhbHVlKHQsZyxjaGlsZCl9ZnVuY3Rpb24gY2FsY0N1dFZhbHVlKHQsZyxjaGlsZCl7dmFyIGNoaWxkTGFiPXQubm9kZShjaGlsZCkscGFyZW50PWNoaWxkTGFiLnBhcmVudCxjaGlsZElzVGFpbD10cnVlLGdyYXBoRWRnZT1nLmVkZ2UoY2hpbGQscGFyZW50KSxjdXRWYWx1ZT0wO2lmKCFncmFwaEVkZ2Upe2NoaWxkSXNUYWlsPWZhbHNlO2dyYXBoRWRnZT1nLmVkZ2UocGFyZW50LGNoaWxkKX1jdXRWYWx1ZT1ncmFwaEVkZ2Uud2VpZ2h0O18uZm9yRWFjaChnLm5vZGVFZGdlcyhjaGlsZCksZnVuY3Rpb24oZSl7dmFyIGlzT3V0RWRnZT1lLnY9PT1jaGlsZCxvdGhlcj0KaXNPdXRFZGdlP2UudzplLnY7aWYob3RoZXIhPT1wYXJlbnQpe3ZhciBwb2ludHNUb0hlYWQ9aXNPdXRFZGdlPT09Y2hpbGRJc1RhaWwsb3RoZXJXZWlnaHQ9Zy5lZGdlKGUpLndlaWdodDtjdXRWYWx1ZSs9cG9pbnRzVG9IZWFkP290aGVyV2VpZ2h0Oi1vdGhlcldlaWdodDtpZihpc1RyZWVFZGdlKHQsY2hpbGQsb3RoZXIpKXt2YXIgb3RoZXJDdXRWYWx1ZT10LmVkZ2UoY2hpbGQsb3RoZXIpLmN1dHZhbHVlO2N1dFZhbHVlKz1wb2ludHNUb0hlYWQ/LW90aGVyQ3V0VmFsdWU6b3RoZXJDdXRWYWx1ZX19fSk7cmV0dXJuIGN1dFZhbHVlfWZ1bmN0aW9uIGluaXRMb3dMaW1WYWx1ZXModHJlZSxyb290KXtpZihhcmd1bWVudHMubGVuZ3RoPDIpcm9vdD10cmVlLm5vZGVzKClbMF07ZGZzQXNzaWduTG93TGltKHRyZWUse30sMSxyb290KX1mdW5jdGlvbiBkZnNBc3NpZ25Mb3dMaW0odHJlZSx2aXNpdGVkLG5leHRMaW0sdixwYXJlbnQpe3ZhciBsb3c9bmV4dExpbSxsYWJlbD10cmVlLm5vZGUodik7CnZpc2l0ZWRbdl09dHJ1ZTtfLmZvckVhY2godHJlZS5uZWlnaGJvcnModiksZnVuY3Rpb24odyl7aWYoIV8uaGFzKHZpc2l0ZWQsdykpbmV4dExpbT1kZnNBc3NpZ25Mb3dMaW0odHJlZSx2aXNpdGVkLG5leHRMaW0sdyx2KX0pO2xhYmVsLmxvdz1sb3c7bGFiZWwubGltPW5leHRMaW0rKztpZihwYXJlbnQpbGFiZWwucGFyZW50PXBhcmVudDtlbHNlIGRlbGV0ZSBsYWJlbC5wYXJlbnQ7cmV0dXJuIG5leHRMaW19ZnVuY3Rpb24gbGVhdmVFZGdlKHRyZWUpe3JldHVybiBfLmZpbmQodHJlZS5lZGdlcygpLGZ1bmN0aW9uKGUpe3JldHVybiB0cmVlLmVkZ2UoZSkuY3V0dmFsdWU8MH0pfWZ1bmN0aW9uIGVudGVyRWRnZSh0LGcsZWRnZSl7dmFyIHY9ZWRnZS52LHc9ZWRnZS53O2lmKCFnLmhhc0VkZ2Uodix3KSl7dj1lZGdlLnc7dz1lZGdlLnZ9dmFyIHZMYWJlbD10Lm5vZGUodiksd0xhYmVsPXQubm9kZSh3KSx0YWlsTGFiZWw9dkxhYmVsLGZsaXA9ZmFsc2U7aWYodkxhYmVsLmxpbT53TGFiZWwubGltKXt0YWlsTGFiZWw9CndMYWJlbDtmbGlwPXRydWV9dmFyIGNhbmRpZGF0ZXM9Xy5maWx0ZXIoZy5lZGdlcygpLGZ1bmN0aW9uKGVkZ2Upe3JldHVybiBmbGlwPT09aXNEZXNjZW5kYW50KHQsdC5ub2RlKGVkZ2UudiksdGFpbExhYmVsKSYmZmxpcCE9PWlzRGVzY2VuZGFudCh0LHQubm9kZShlZGdlLncpLHRhaWxMYWJlbCl9KTtyZXR1cm4gXy5taW5CeShjYW5kaWRhdGVzLGZ1bmN0aW9uKGVkZ2Upe3JldHVybiBzbGFjayhnLGVkZ2UpfSl9ZnVuY3Rpb24gZXhjaGFuZ2VFZGdlcyh0LGcsZSxmKXt2YXIgdj1lLnYsdz1lLnc7dC5yZW1vdmVFZGdlKHYsdyk7dC5zZXRFZGdlKGYudixmLncse30pO2luaXRMb3dMaW1WYWx1ZXModCk7aW5pdEN1dFZhbHVlcyh0LGcpO3VwZGF0ZVJhbmtzKHQsZyl9ZnVuY3Rpb24gdXBkYXRlUmFua3ModCxnKXt2YXIgcm9vdD1fLmZpbmQodC5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiFnLm5vZGUodikucGFyZW50fSksdnM9cHJlb3JkZXIodCxyb290KTt2cz12cy5zbGljZSgxKTsKXy5mb3JFYWNoKHZzLGZ1bmN0aW9uKHYpe3ZhciBwYXJlbnQ9dC5ub2RlKHYpLnBhcmVudCxlZGdlPWcuZWRnZSh2LHBhcmVudCksZmxpcHBlZD1mYWxzZTtpZighZWRnZSl7ZWRnZT1nLmVkZ2UocGFyZW50LHYpO2ZsaXBwZWQ9dHJ1ZX1nLm5vZGUodikucmFuaz1nLm5vZGUocGFyZW50KS5yYW5rKyhmbGlwcGVkP2VkZ2UubWlubGVuOi1lZGdlLm1pbmxlbil9KX1mdW5jdGlvbiBpc1RyZWVFZGdlKHRyZWUsdSx2KXtyZXR1cm4gdHJlZS5oYXNFZGdlKHUsdil9ZnVuY3Rpb24gaXNEZXNjZW5kYW50KHRyZWUsdkxhYmVsLHJvb3RMYWJlbCl7cmV0dXJuIHJvb3RMYWJlbC5sb3c8PXZMYWJlbC5saW0mJnZMYWJlbC5saW08PXJvb3RMYWJlbC5saW19fSx7Ii4uL2dyYXBobGliIjo3LCIuLi9sb2Rhc2giOjEwLCIuLi91dGlsIjoyOSwiLi9mZWFzaWJsZS10cmVlIjoyNSwiLi91dGlsIjoyOH1dLDI4OltmdW5jdGlvbihyZXF1aXJlLG1vZHVsZSxleHBvcnRzKXt2YXIgXz1yZXF1aXJlKCIuLi9sb2Rhc2giKTsKbW9kdWxlLmV4cG9ydHM9e2xvbmdlc3RQYXRoOmxvbmdlc3RQYXRoLHNsYWNrOnNsYWNrfTtmdW5jdGlvbiBsb25nZXN0UGF0aChnKXt2YXIgdmlzaXRlZD17fTtmdW5jdGlvbiBkZnModil7dmFyIGxhYmVsPWcubm9kZSh2KTtpZihfLmhhcyh2aXNpdGVkLHYpKXJldHVybiBsYWJlbC5yYW5rO3Zpc2l0ZWRbdl09dHJ1ZTt2YXIgcmFuaz1fLm1pbkJ5KF8ubWFwKGcub3V0RWRnZXModiksZnVuY3Rpb24oZSl7cmV0dXJuIGRmcyhlLncpLWcuZWRnZShlKS5taW5sZW59KSk7aWYocmFuaz09PU51bWJlci5QT1NJVElWRV9JTkZJTklUWXx8cmFuaz09PXVuZGVmaW5lZHx8cmFuaz09PW51bGwpcmFuaz0wO3JldHVybiBsYWJlbC5yYW5rPXJhbmt9Xy5mb3JFYWNoKGcuc291cmNlcygpLGRmcyl9ZnVuY3Rpb24gc2xhY2soZyxlKXtyZXR1cm4gZy5ub2RlKGUudykucmFuay1nLm5vZGUoZS52KS5yYW5rLWcuZWRnZShlKS5taW5sZW59fSx7Ii4uL2xvZGFzaCI6MTB9XSwyOTpbZnVuY3Rpb24ocmVxdWlyZSwKbW9kdWxlLGV4cG9ydHMpe3ZhciBfPXJlcXVpcmUoIi4vbG9kYXNoIiksR3JhcGg9cmVxdWlyZSgiLi9ncmFwaGxpYiIpLkdyYXBoO21vZHVsZS5leHBvcnRzPXthZGREdW1teU5vZGU6YWRkRHVtbXlOb2RlLHNpbXBsaWZ5OnNpbXBsaWZ5LGFzTm9uQ29tcG91bmRHcmFwaDphc05vbkNvbXBvdW5kR3JhcGgsc3VjY2Vzc29yV2VpZ2h0czpzdWNjZXNzb3JXZWlnaHRzLHByZWRlY2Vzc29yV2VpZ2h0czpwcmVkZWNlc3NvcldlaWdodHMsaW50ZXJzZWN0UmVjdDppbnRlcnNlY3RSZWN0LGJ1aWxkTGF5ZXJNYXRyaXg6YnVpbGRMYXllck1hdHJpeCxub3JtYWxpemVSYW5rczpub3JtYWxpemVSYW5rcyxyZW1vdmVFbXB0eVJhbmtzOnJlbW92ZUVtcHR5UmFua3MsYWRkQm9yZGVyTm9kZTphZGRCb3JkZXJOb2RlLG1heFJhbms6bWF4UmFuayxwYXJ0aXRpb246cGFydGl0aW9uLHRpbWU6dGltZSxub3RpbWU6bm90aW1lfTtmdW5jdGlvbiBhZGREdW1teU5vZGUoZyx0eXBlLGF0dHJzLG5hbWUpe3ZhciB2OwpkbyB2PV8udW5pcXVlSWQobmFtZSk7d2hpbGUoZy5oYXNOb2RlKHYpKTthdHRycy5kdW1teT10eXBlO2cuc2V0Tm9kZSh2LGF0dHJzKTtyZXR1cm4gdn1mdW5jdGlvbiBzaW1wbGlmeShnKXt2YXIgc2ltcGxpZmllZD0obmV3IEdyYXBoKS5zZXRHcmFwaChnLmdyYXBoKCkpO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7c2ltcGxpZmllZC5zZXROb2RlKHYsZy5ub2RlKHYpKX0pO18uZm9yRWFjaChnLmVkZ2VzKCksZnVuY3Rpb24oZSl7dmFyIHNpbXBsZUxhYmVsPXNpbXBsaWZpZWQuZWRnZShlLnYsZS53KXx8e3dlaWdodDowLG1pbmxlbjoxfSxsYWJlbD1nLmVkZ2UoZSk7c2ltcGxpZmllZC5zZXRFZGdlKGUudixlLncse3dlaWdodDpzaW1wbGVMYWJlbC53ZWlnaHQrbGFiZWwud2VpZ2h0LG1pbmxlbjpNYXRoLm1heChzaW1wbGVMYWJlbC5taW5sZW4sbGFiZWwubWlubGVuKX0pfSk7cmV0dXJuIHNpbXBsaWZpZWR9ZnVuY3Rpb24gYXNOb25Db21wb3VuZEdyYXBoKGcpe3ZhciBzaW1wbGlmaWVkPQoobmV3IEdyYXBoKHttdWx0aWdyYXBoOmcuaXNNdWx0aWdyYXBoKCl9KSkuc2V0R3JhcGgoZy5ncmFwaCgpKTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe2lmKCFnLmNoaWxkcmVuKHYpLmxlbmd0aClzaW1wbGlmaWVkLnNldE5vZGUodixnLm5vZGUodikpfSk7Xy5mb3JFYWNoKGcuZWRnZXMoKSxmdW5jdGlvbihlKXtzaW1wbGlmaWVkLnNldEVkZ2UoZSxnLmVkZ2UoZSkpfSk7cmV0dXJuIHNpbXBsaWZpZWR9ZnVuY3Rpb24gc3VjY2Vzc29yV2VpZ2h0cyhnKXt2YXIgd2VpZ2h0TWFwPV8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgc3Vjcz17fTtfLmZvckVhY2goZy5vdXRFZGdlcyh2KSxmdW5jdGlvbihlKXtzdWNzW2Uud109KHN1Y3NbZS53XXx8MCkrZy5lZGdlKGUpLndlaWdodH0pO3JldHVybiBzdWNzfSk7cmV0dXJuIF8uemlwT2JqZWN0KGcubm9kZXMoKSx3ZWlnaHRNYXApfWZ1bmN0aW9uIHByZWRlY2Vzc29yV2VpZ2h0cyhnKXt2YXIgd2VpZ2h0TWFwPV8ubWFwKGcubm9kZXMoKSwKZnVuY3Rpb24odil7dmFyIHByZWRzPXt9O18uZm9yRWFjaChnLmluRWRnZXModiksZnVuY3Rpb24oZSl7cHJlZHNbZS52XT0ocHJlZHNbZS52XXx8MCkrZy5lZGdlKGUpLndlaWdodH0pO3JldHVybiBwcmVkc30pO3JldHVybiBfLnppcE9iamVjdChnLm5vZGVzKCksd2VpZ2h0TWFwKX1mdW5jdGlvbiBpbnRlcnNlY3RSZWN0KHJlY3QscG9pbnQpe3ZhciB4PXJlY3QueDt2YXIgeT1yZWN0Lnk7dmFyIGR4PXBvaW50LngteDt2YXIgZHk9cG9pbnQueS15O3ZhciB3PXJlY3Qud2lkdGgvMjt2YXIgaD1yZWN0LmhlaWdodC8yO2lmKCFkeCYmIWR5KXRocm93IG5ldyBFcnJvcigiTm90IHBvc3NpYmxlIHRvIGZpbmQgaW50ZXJzZWN0aW9uIGluc2lkZSBvZiB0aGUgcmVjdGFuZ2xlIik7dmFyIHN4LHN5O2lmKE1hdGguYWJzKGR5KSp3Pk1hdGguYWJzKGR4KSpoKXtpZihkeTwwKWg9LWg7c3g9aCpkeC9keTtzeT1ofWVsc2V7aWYoZHg8MCl3PS13O3N4PXc7c3k9dypkeS9keH1yZXR1cm57eDp4KwpzeCx5Onkrc3l9fWZ1bmN0aW9uIGJ1aWxkTGF5ZXJNYXRyaXgoZyl7dmFyIGxheWVyaW5nPV8ubWFwKF8ucmFuZ2UobWF4UmFuayhnKSsxKSxmdW5jdGlvbigpe3JldHVybltdfSk7Xy5mb3JFYWNoKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgbm9kZT1nLm5vZGUodikscmFuaz1ub2RlLnJhbms7aWYoIV8uaXNVbmRlZmluZWQocmFuaykpbGF5ZXJpbmdbcmFua11bbm9kZS5vcmRlcl09dn0pO3JldHVybiBsYXllcmluZ31mdW5jdGlvbiBub3JtYWxpemVSYW5rcyhnKXt2YXIgbWluPV8ubWluQnkoXy5tYXAoZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3JldHVybiBnLm5vZGUodikucmFua30pKTtfLmZvckVhY2goZy5ub2RlcygpLGZ1bmN0aW9uKHYpe3ZhciBub2RlPWcubm9kZSh2KTtpZihfLmhhcyhub2RlLCJyYW5rIikpbm9kZS5yYW5rLT1taW59KX1mdW5jdGlvbiByZW1vdmVFbXB0eVJhbmtzKGcpe3ZhciBvZmZzZXQ9Xy5taW5CeShfLm1hcChnLm5vZGVzKCksZnVuY3Rpb24odil7cmV0dXJuIGcubm9kZSh2KS5yYW5rfSkpOwp2YXIgbGF5ZXJzPVtdO18uZm9yRWFjaChnLm5vZGVzKCksZnVuY3Rpb24odil7dmFyIHJhbms9Zy5ub2RlKHYpLnJhbmstb2Zmc2V0O2lmKCFsYXllcnNbcmFua10pbGF5ZXJzW3JhbmtdPVtdO2xheWVyc1tyYW5rXS5wdXNoKHYpfSk7dmFyIGRlbHRhPTAsbm9kZVJhbmtGYWN0b3I9Zy5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yO18uZm9yRWFjaChsYXllcnMsZnVuY3Rpb24odnMsaSl7aWYoXy5pc1VuZGVmaW5lZCh2cykmJmklbm9kZVJhbmtGYWN0b3IhPT0wKS0tZGVsdGE7ZWxzZSBpZihkZWx0YSlfLmZvckVhY2godnMsZnVuY3Rpb24odil7Zy5ub2RlKHYpLnJhbmsrPWRlbHRhfSl9KX1mdW5jdGlvbiBhZGRCb3JkZXJOb2RlKGcscHJlZml4LHJhbmssb3JkZXIpe3ZhciBub2RlPXt3aWR0aDowLGhlaWdodDowfTtpZihhcmd1bWVudHMubGVuZ3RoPj00KXtub2RlLnJhbms9cmFuaztub2RlLm9yZGVyPW9yZGVyfXJldHVybiBhZGREdW1teU5vZGUoZywiYm9yZGVyIixub2RlLHByZWZpeCl9CmZ1bmN0aW9uIG1heFJhbmsoZyl7cmV0dXJuIF8ubWF4KF8ubWFwKGcubm9kZXMoKSxmdW5jdGlvbih2KXt2YXIgcmFuaz1nLm5vZGUodikucmFuaztpZighXy5pc1VuZGVmaW5lZChyYW5rKSlyZXR1cm4gcmFua30pKX1mdW5jdGlvbiBwYXJ0aXRpb24oY29sbGVjdGlvbixmbil7dmFyIHJlc3VsdD17bGhzOltdLHJoczpbXX07Xy5mb3JFYWNoKGNvbGxlY3Rpb24sZnVuY3Rpb24odmFsdWUpe2lmKGZuKHZhbHVlKSlyZXN1bHQubGhzLnB1c2godmFsdWUpO2Vsc2UgcmVzdWx0LnJocy5wdXNoKHZhbHVlKX0pO3JldHVybiByZXN1bHR9ZnVuY3Rpb24gdGltZShuYW1lLGZuKXt2YXIgc3RhcnQ9Xy5ub3coKTt0cnl7cmV0dXJuIGZuKCl9ZmluYWxseXtjb25zb2xlLmxvZyhuYW1lKyIgdGltZTogIisoXy5ub3coKS1zdGFydCkrIm1zIil9fWZ1bmN0aW9uIG5vdGltZShuYW1lLGZuKXtyZXR1cm4gZm4oKX19LHsiLi9ncmFwaGxpYiI6NywiLi9sb2Rhc2giOjEwfV0sMzA6W2Z1bmN0aW9uKHJlcXVpcmUsCm1vZHVsZSxleHBvcnRzKXttb2R1bGUuZXhwb3J0cz0iMC44LjIifSx7fV19LHt9LFsxXSkoMSl9KTsKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9hbm5vdGF0aW9uLmpzCnZhciB0ZjsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7KGZ1bmN0aW9uKGgpe2Z1bmN0aW9uIGsocSl7cmV0dXJuKGQucmVuZGVyLkFubm90YXRpb25UeXBlW3FdfHwiIikudG9Mb3dlckNhc2UoKXx8bnVsbH1mdW5jdGlvbiB0KHEsdSl7dS5hbm5vdGF0aW9uVHlwZT09PWQucmVuZGVyLkFubm90YXRpb25UeXBlLlNVTU1BUlk/Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKHEsInVzZSIpLmF0dHIoImNsYXNzIiwic3VtbWFyeSIpLmF0dHIoInhsaW5rOmhyZWYiLCIjc3VtbWFyeS1pY29uIikuYXR0cigiY3Vyc29yIiwicG9pbnRlciIpOihxPWYubm9kZS5idWlsZFNoYXBlKHEsdSxmLkNsYXNzLkFubm90YXRpb24uTk9ERSksZi5zZWxlY3RPckNyZWF0ZUNoaWxkKHEsInRpdGxlIikudGV4dCh1Lm5vZGUubmFtZSkpfWZ1bmN0aW9uIGwocSx1KXtsZXQgeD11Lm5vZGUubmFtZS5zcGxpdCgiLyIpO3JldHVybiBwKHEseFt4Lmxlbmd0aC0xXSx1LG51bGwpfWZ1bmN0aW9uIHAocSx1LAp4LEEpe2xldCB5PWYuQ2xhc3MuQW5ub3RhdGlvbi5MQUJFTDtBJiYoeSs9IiAiK0EpO3E9cS5hcHBlbmQoInRleHQiKS5hdHRyKCJjbGFzcyIseSkuYXR0cigiZHkiLCIuMzVlbSIpLmF0dHIoInRleHQtYW5jaG9yIix4LmlzSW4/ImVuZCI6InN0YXJ0IikudGV4dCh1KTtyZXR1cm4gYi5ncmFwaC5zY2VuZS5ub2RlLmVuZm9yY2VMYWJlbFdpZHRoKHEsLTEpfWZ1bmN0aW9uIG0ocSx1LHgsQSl7cS5vbigibW91c2VvdmVyIix5PT57QS5maXJlKCJhbm5vdGF0aW9uLWhpZ2hsaWdodCIse25hbWU6eS5ub2RlLm5hbWUsaG9zdE5hbWU6dS5ub2RlLm5hbWV9KX0pLm9uKCJtb3VzZW91dCIseT0+e0EuZmlyZSgiYW5ub3RhdGlvbi11bmhpZ2hsaWdodCIse25hbWU6eS5ub2RlLm5hbWUsaG9zdE5hbWU6dS5ub2RlLm5hbWV9KX0pLm9uKCJjbGljayIseT0+e2QzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO0EuZmlyZSgiYW5ub3RhdGlvbi1zZWxlY3QiLHtuYW1lOnkubm9kZS5uYW1lLGhvc3ROYW1lOnUubm9kZS5uYW1lfSl9KTsKaWYoeC5hbm5vdGF0aW9uVHlwZSE9PWQucmVuZGVyLkFubm90YXRpb25UeXBlLlNVTU1BUlkmJnguYW5ub3RhdGlvblR5cGUhPT1kLnJlbmRlci5Bbm5vdGF0aW9uVHlwZS5DT05TVEFOVClxLm9uKCJjb250ZXh0bWVudSIsZi5jb250ZXh0bWVudS5nZXRNZW51KEEsZi5ub2RlLmdldENvbnRleHRNZW51KHgubm9kZSxBKSkpfWZ1bmN0aW9uIG4ocSx1LHgsQSl7bGV0IHk9ZC5sYXlvdXQuY29tcHV0ZUNYUG9zaXRpb25PZk5vZGVTaGFwZSh1KTt4LnJlbmRlck5vZGVJbmZvJiZ4LmFubm90YXRpb25UeXBlIT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuRUxMSVBTSVMmJmYubm9kZS5zdHlsaXplKHEseC5yZW5kZXJOb2RlSW5mbyxBLGYuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKTt4LmFubm90YXRpb25UeXBlPT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU1VNTUFSWSYmKHgud2lkdGgrPTEwKTtxLnNlbGVjdCgidGV4dC4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5MQUJFTCkudHJhbnNpdGlvbigpLmF0dHIoIngiLAp5K3guZHgrKHguaXNJbj8tMToxKSooeC53aWR0aC8yK3gubGFiZWxPZmZzZXQpKS5hdHRyKCJ5Iix1LnkreC5keSk7cS5zZWxlY3QoInVzZS5zdW1tYXJ5IikudHJhbnNpdGlvbigpLmF0dHIoIngiLHkreC5keC0zKS5hdHRyKCJ5Iix1LnkreC5keS02KTtmLnBvc2l0aW9uRWxsaXBzZShxLnNlbGVjdCgiLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLk5PREUrIiBlbGxpcHNlIikseSt4LmR4LHUueSt4LmR5LHgud2lkdGgseC5oZWlnaHQpO2YucG9zaXRpb25SZWN0KHEuc2VsZWN0KCIuIitmLkNsYXNzLkFubm90YXRpb24uTk9ERSsiIHJlY3QiKSx5K3guZHgsdS55K3guZHkseC53aWR0aCx4LmhlaWdodCk7Zi5wb3NpdGlvblJlY3QocS5zZWxlY3QoIi4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5OT0RFKyIgdXNlIikseSt4LmR4LHUueSt4LmR5LHgud2lkdGgseC5oZWlnaHQpO3Euc2VsZWN0KCJwYXRoLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLkVER0UpLnRyYW5zaXRpb24oKS5hdHRyKCJkIix3PT4Ke3c9dy5wb2ludHMubWFwKEM9Pih7eDpDLmR4K3kseTpDLmR5K3UueX0pKTtyZXR1cm4gZi5lZGdlLmludGVycG9sYXRlKHcpfSl9aC5idWlsZEdyb3VwPWZ1bmN0aW9uKHEsdSx4LEEpe3E9cS5zZWxlY3RBbGwoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jaGlsZE5vZGVzfSkuZGF0YSh1Lmxpc3QseT0+eS5ub2RlLm5hbWUpO3EuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJkYXRhLW5hbWUiLHk9Pnkubm9kZS5uYW1lKS5lYWNoKGZ1bmN0aW9uKHkpe2xldCB3PWQzLnNlbGVjdCh0aGlzKTtBLmFkZEFubm90YXRpb25Hcm91cCh5LHgsdyk7bGV0IEM9Zi5DbGFzcy5Bbm5vdGF0aW9uLkVER0UsRz15LnJlbmRlck1ldGFlZGdlSW5mbyYmeS5yZW5kZXJNZXRhZWRnZUluZm8ubWV0YWVkZ2U7RyYmIUcubnVtUmVndWxhckVkZ2VzJiYoQys9IiAiK2YuQ2xhc3MuQW5ub3RhdGlvbi5DT05UUk9MX0VER0UpO0cmJkcubnVtUmVmRWRnZXMmJihDKz0iICIrZi5DbGFzcy5FZGdlLlJFRl9MSU5FKTsKZi5lZGdlLmFwcGVuZEVkZ2Uodyx5LEEsQyk7eS5hbm5vdGF0aW9uVHlwZSE9PWQucmVuZGVyLkFubm90YXRpb25UeXBlLkVMTElQU0lTPyhsKHcseSksdCh3LHkpKTpwKHcseS5ub2RlLm5hbWUseSxmLkNsYXNzLkFubm90YXRpb24uRUxMSVBTSVMpfSkubWVyZ2UocSkuYXR0cigiY2xhc3MiLHk9PmYuQ2xhc3MuQW5ub3RhdGlvbi5HUk9VUCsiICIrayh5LmFubm90YXRpb25UeXBlKSsiICIrZi5ub2RlLm5vZGVDbGFzcyh5KSkuZWFjaChmdW5jdGlvbih5KXtsZXQgdz1kMy5zZWxlY3QodGhpcyk7bih3LHgseSxBKTt5LmFubm90YXRpb25UeXBlIT09ZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuRUxMSVBTSVMmJm0odyx4LHksQSl9KTtxLmV4aXQoKS5lYWNoKGZ1bmN0aW9uKHkpe2xldCB3PWQzLnNlbGVjdCh0aGlzKTtBLnJlbW92ZUFubm90YXRpb25Hcm91cCh5LHgsdyl9KS5yZW1vdmUoKTtyZXR1cm4gcX19KShmLmFubm90YXRpb258fChmLmFubm90YXRpb249e30pKX0pKGQuc2NlbmV8fAooZC5zY2VuZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vY29sb3JzLmpzCihmdW5jdGlvbihiKXtiLkNPTE9SUz1be25hbWU6Ikdvb2dsZSBCbHVlIixjb2xvcjoiIzQxODRmMyIsYWN0aXZlOiIjM2E1M2M1IixkaXNhYmxlZDoiI2NhZDhmYyJ9LHtuYW1lOiJHb29nbGUgUmVkIixjb2xvcjoiI2RiNDQzNyIsYWN0aXZlOiIjOGYyYTBjIixkaXNhYmxlZDoiI2U4YzZjMSJ9LHtuYW1lOiJHb29nbGUgWWVsbG93Iixjb2xvcjoiI2Y0YjQwMCIsYWN0aXZlOiIjZGI5MjAwIixkaXNhYmxlZDoiI2Y3ZThiMCJ9LHtuYW1lOiJHb29nbGUgR3JlZW4iLGNvbG9yOiIjMGY5ZDU4IixhY3RpdmU6IiM0ODgwNDYiLGRpc2FibGVkOiIjYzJlMWNjIn0se25hbWU6IlB1cnBsZSIsY29sb3I6IiNhYTQ2YmIiLGFjdGl2ZToiIzVjMTM5OCIsZGlzYWJsZWQ6IiNkN2JjZTYifSx7bmFtZToiVGVhbCIsY29sb3I6IiMwMGFiYzAiLGFjdGl2ZToiIzQ3ODI4ZSIsZGlzYWJsZWQ6IiNjMmVhZjIifSx7bmFtZToiRGVlcCBPcmFuZ2UiLGNvbG9yOiIjZmY2ZjQyIixhY3RpdmU6IiNjYTRhMDYiLApkaXNhYmxlZDoiI2YyY2JiYSJ9LHtuYW1lOiJMaW1lIixjb2xvcjoiIzlkOWMyMyIsYWN0aXZlOiIjN2Y3NzFkIixkaXNhYmxlZDoiI2YxZjRjMiJ9LHtuYW1lOiJJbmRpZ28iLGNvbG9yOiIjNWI2YWJmIixhY3RpdmU6IiMzZTQ3YTkiLGRpc2FibGVkOiIjYzVjOGU4In0se25hbWU6IlBpbmsiLGNvbG9yOiIjZWY2MTkxIixhY3RpdmU6IiNjYTFjNjAiLGRpc2FibGVkOiIjZTliOWNlIn0se25hbWU6IkRlZXAgVGVhbCIsY29sb3I6IiMwMDc4NmEiLGFjdGl2ZToiIzJiNGY0MyIsZGlzYWJsZWQ6IiNiZWRlZGEifSx7bmFtZToiRGVlcCBQaW5rIixjb2xvcjoiI2MxMTc1YSIsYWN0aXZlOiIjNzUwODRmIixkaXNhYmxlZDoiI2RlOGNhZSJ9LHtuYW1lOiJHcmF5Iixjb2xvcjoiIzlFOUU5RSIsYWN0aXZlOiIjNDI0MjQyIixkaXNhYmxlZDoiRjVGNUY1In1dLnJlZHVjZSgoZCxmKT0+e2RbZi5uYW1lXT1mO3JldHVybiBkfSx7fSk7Yi5PUF9HUk9VUF9DT0xPUlM9W3tjb2xvcjoiR29vZ2xlIFJlZCIsCmdyb3VwczoiZ2VuX2xlZ2FjeV9vcHMgbGVnYWN5X29wcyBsZWdhY3lfZmxvZ3NfaW5wdXQgbGVnYWN5X2ltYWdlX2lucHV0IGxlZ2FjeV9pbnB1dF9leGFtcGxlX2lucHV0IGxlZ2FjeV9zZXF1ZW5jZV9pbnB1dCBsZWdhY3lfc2V0aV9pbnB1dF9pbnB1dCIuc3BsaXQoIiAiKX0se2NvbG9yOiJEZWVwIE9yYW5nZSIsZ3JvdXBzOlsiY29uc3RhbnRfb3BzIl19LHtjb2xvcjoiSW5kaWdvIixncm91cHM6WyJzdGF0ZV9vcHMiXX0se2NvbG9yOiJQdXJwbGUiLGdyb3VwczpbIm5uX29wcyIsIm5uIl19LHtjb2xvcjoiR29vZ2xlIEdyZWVuIixncm91cHM6WyJtYXRoX29wcyJdfSx7Y29sb3I6IkxpbWUiLGdyb3VwczpbImFycmF5X29wcyJdfSx7Y29sb3I6IlRlYWwiLGdyb3VwczpbImNvbnRyb2xfZmxvd19vcHMiLCJkYXRhX2Zsb3dfb3BzIl19LHtjb2xvcjoiUGluayIsZ3JvdXBzOlsic3VtbWFyeV9vcHMiXX0se2NvbG9yOiJEZWVwIFBpbmsiLGdyb3VwczpbImlvX29wcyJdfV0ucmVkdWNlKChkLApmKT0+e2YuZ3JvdXBzLmZvckVhY2goZnVuY3Rpb24oaCl7ZFtoXT1mLmNvbG9yfSk7cmV0dXJuIGR9LHt9KX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vY29tbW9uLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2YuT1BfR1JBUEg9Im9wX2dyYXBoIjtmLkNPTkNFUFRVQUxfR1JBUEg9ImNvbmNlcHR1YWxfZ3JhcGgiO2YuUFJPRklMRT0icHJvZmlsZSJ9KShkLlNlbGVjdGlvblR5cGV8fChkLlNlbGVjdGlvblR5cGU9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2NvbnRleHRtZW51LmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpeyhmdW5jdGlvbihoKXtmdW5jdGlvbiBrKHQpe2xldCBsPTAscD0wO2Zvcig7dCYmMDw9dC5vZmZzZXRMZWZ0JiYwPD10Lm9mZnNldFRvcDspbCs9dC5vZmZzZXRMZWZ0LXQuc2Nyb2xsTGVmdCxwKz10Lm9mZnNldFRvcC10LnNjcm9sbFRvcCx0PXQub2Zmc2V0UGFyZW50O3JldHVybntsZWZ0OmwsdG9wOnB9fWguZ2V0TWVudT1mdW5jdGlvbih0LGwpe2NvbnN0IHA9dC5nZXRDb250ZXh0TWVudSgpLG09ZDMuc2VsZWN0KHQuZ2V0Q29udGV4dE1lbnUoKSk7cmV0dXJuIGZ1bmN0aW9uKG4scSl7ZnVuY3Rpb24gdSh5KXt5JiZ5LmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKHApfHwobS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKSxkb2N1bWVudC5ib2R5LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsdSx7Y2FwdHVyZTohMH0pKX1sZXQgeD1kMy5ldmVudDtjb25zdCBBPWsodCk7bS5zdHlsZSgiZGlzcGxheSIsImJsb2NrIikuc3R5bGUoImxlZnQiLAp4LmNsaWVudFgtQS5sZWZ0KzErInB4Iikuc3R5bGUoInRvcCIseC5jbGllbnRZLUEudG9wKzErInB4Iik7eC5wcmV2ZW50RGVmYXVsdCgpO3guc3RvcFByb3BhZ2F0aW9uKCk7ZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLHUse2NhcHR1cmU6ITB9KTttLmh0bWwoIiIpO20uYXBwZW5kKCJ1bCIpLnNlbGVjdEFsbCgibGkiKS5kYXRhKGwpLmVudGVyKCkuYXBwZW5kKCJsaSIpLm9uKCJjbGljayIseT0+e3kuYWN0aW9uKHRoaXMsbixxKTt1KCl9KS5odG1sKGZ1bmN0aW9uKHkpe3JldHVybiB5LnRpdGxlKG4pfSl9fX0pKGYuY29udGV4dG1lbnV8fChmLmNvbnRleHRtZW51PXt9KSl9KShkLnNjZW5lfHwoZC5zY2VuZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vZWRnZS5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXsoZnVuY3Rpb24oaCl7ZnVuY3Rpb24gayh5KXtyZXR1cm4geS52K2QuRURHRV9LRVlfREVMSU0reS53fWZ1bmN0aW9uIHQoeSx3KXt3PXcuZ2V0Tm9kZUJ5TmFtZSh5LnYpO2lmKG51bGw9PXcub3V0cHV0U2hhcGVzfHxfLmlzRW1wdHkody5vdXRwdXRTaGFwZXMpKXJldHVybiBudWxsO3k9dy5vdXRwdXRTaGFwZXNbeS5vdXRwdXRUZW5zb3JLZXldO3JldHVybiBudWxsPT15P251bGw6MD09PXkubGVuZ3RoPyJzY2FsYXIiOnkubWFwKEM9Pi0xPT09Qz8iPyI6Qykuam9pbigiXHUwMGQ3Iil9ZnVuY3Rpb24gbCh5LHcpe3JldHVybiB3LmVkZ2VMYWJlbEZ1bmN0aW9uP3cuZWRnZUxhYmVsRnVuY3Rpb24oeSx3KToxPHkuYmFzZUVkZ2VMaXN0Lmxlbmd0aD95LmJhc2VFZGdlTGlzdC5sZW5ndGgrIiB0ZW5zb3JzIjp0KHkuYmFzZUVkZ2VMaXN0WzBdLHcpfWZ1bmN0aW9uIHAoeSx3LEMpe2NvbnN0IEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGIuZ3JhcGguc2NlbmUuU1ZHX05BTUVTUEFDRSwKInBhdGgiKTtmb3IobGV0IEQ9MTtEPHkubGVuZ3RoO0QrKylpZihHLnNldEF0dHJpYnV0ZSgiZCIsQyh5LnNsaWNlKDAsRCkpKSxHLmdldFRvdGFsTGVuZ3RoKCk+dylyZXR1cm4gRC0xO3JldHVybiB5Lmxlbmd0aC0xfWZ1bmN0aW9uIG0oeSx3LEMpe3ZhciBHPWQzLmxpbmUoKS54KE49Pk4ueCkueShOPT5OLnkpLEQ9ZDMuc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJwYXRoIikpLmF0dHIoImQiLEcoeSkpLEI9K3cuYXR0cigibWFya2VyV2lkdGgiKSxJPXcuYXR0cigidmlld0JveCIpLnNwbGl0KCIgIikubWFwKE51bWJlcik7ST1JWzJdLUlbMF07dz0rdy5hdHRyKCJyZWZYIik7RD1ELm5vZGUoKTtpZihDKXJldHVybiBCKj0xLXcvSSxDPUQuZ2V0UG9pbnRBdExlbmd0aChCKSxHPXAoeSxCLEcpLHlbRy0xXT17eDpDLngseTpDLnl9LHkuc2xpY2UoRy0xKTtDPTEtdy9JO0I9RC5nZXRUb3RhbExlbmd0aCgpLUIqQztDPQpELmdldFBvaW50QXRMZW5ndGgoQik7Rz1wKHksQixHKTt5W0ddPXt4OkMueCx5OkMueX07cmV0dXJuIHkuc2xpY2UoMCxHKzEpfWZ1bmN0aW9uIG4oeSx3LEMsRyl7Rz1HfHxmLkNsYXNzLkVkZ2UuTElORTt3LmxhYmVsJiZ3LmxhYmVsLnN0cnVjdHVyYWwmJihHKz0iICIrZi5DbGFzcy5FZGdlLlNUUlVDVFVSQUwpO3cubGFiZWwmJncubGFiZWwubWV0YWVkZ2UmJncubGFiZWwubWV0YWVkZ2UubnVtUmVmRWRnZXMmJihHKz0iICIrZi5DbGFzcy5FZGdlLlJFRkVSRU5DRV9FREdFKTtDLmhhbmRsZUVkZ2VTZWxlY3RlZCYmKEcrPSIgIitmLkNsYXNzLkVkZ2UuU0VMRUNUQUJMRSk7bGV0IEQ9InBhdGhfIitrKHcpO2lmKEMucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aEZ1bmN0aW9uKXZhciBCPUMucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aEZ1bmN0aW9uKHcsRyk7ZWxzZSBCPTEsbnVsbCE9dy5sYWJlbCYmbnVsbCE9dy5sYWJlbC5tZXRhZWRnZSYmKEI9dy5sYWJlbC5tZXRhZWRnZS50b3RhbFNpemUpLApCPUMucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aFNpemVkQmFzZWRTY2FsZShCKTtHPXkuYXBwZW5kKCJwYXRoIikuYXR0cigiaWQiLEQpLmF0dHIoImNsYXNzIixHKS5zdHlsZSgic3Ryb2tlLXdpZHRoIixCKyJweCIpO3cubGFiZWwmJncubGFiZWwubWV0YWVkZ2UmJih3LmxhYmVsLm1ldGFlZGdlLm51bVJlZkVkZ2VzPyhCPWByZWZlcmVuY2UtYXJyb3doZWFkLSR7QShCKX1gLEcuc3R5bGUoIm1hcmtlci1zdGFydCIsYHVybCgjJHtCfSlgKSx3LmxhYmVsLnN0YXJ0TWFya2VySWQ9Qik6KEI9YGRhdGFmbG93LWFycm93aGVhZC0ke0EoQil9YCxHLnN0eWxlKCJtYXJrZXItZW5kIixgdXJsKCMke0J9KWApLHcubGFiZWwuZW5kTWFya2VySWQ9QikpO251bGwhPXcubGFiZWwmJm51bGwhPXcubGFiZWwubWV0YWVkZ2UmJih3PWwody5sYWJlbC5tZXRhZWRnZSxDLnJlbmRlckhpZXJhcmNoeSksbnVsbCE9dyYmeS5hcHBlbmQoInRleHQiKS5hcHBlbmQoInRleHRQYXRoIikuYXR0cigieGxpbms6aHJlZiIsCiIjIitEKS5hdHRyKCJzdGFydE9mZnNldCIsIjUwJSIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigiZG9taW5hbnQtYmFzZWxpbmUiLCJjZW50cmFsIikudGV4dCh3KSl9ZnVuY3Rpb24gcSh5LHcsQyxHLEQpe0c9Qy5sYWJlbDtsZXQgQj1HLmFkam9pbmluZ01ldGFlZGdlLEk9Ry5wb2ludHM7eT15LnNoYWRvd1Jvb3Q7Qy5sYWJlbC5zdGFydE1hcmtlcklkJiYoST1tKEksZDMuc2VsZWN0KHkucXVlcnlTZWxlY3RvcigiIyIrQy5sYWJlbC5zdGFydE1hcmtlcklkKSksITApKTtDLmxhYmVsLmVuZE1hcmtlcklkJiYoST1tKEksZDMuc2VsZWN0KHkucXVlcnlTZWxlY3RvcigiIyIrQy5sYWJlbC5lbmRNYXJrZXJJZCkpLCExKSk7aWYoIUIpcmV0dXJuIGQzLmludGVycG9sYXRlKEQsaC5pbnRlcnBvbGF0ZShJKSk7bGV0IE49Qi5lZGdlR3JvdXAubm9kZSgpLmZpcnN0Q2hpbGQsTz1HLm1ldGFlZGdlLmluYm91bmQ7cmV0dXJuIGZ1bmN0aW9uKCl7bGV0IEg9Ti5nZXRQb2ludEF0TGVuZ3RoKE8/Ck4uZ2V0VG90YWxMZW5ndGgoKTowKS5tYXRyaXhUcmFuc2Zvcm0oTi5nZXRDVE0oKSkubWF0cml4VHJhbnNmb3JtKHcuZ2V0Q1RNKCkuaW52ZXJzZSgpKSxLPU8/MDpJLmxlbmd0aC0xO0lbS10ueD1ILng7SVtLXS55PUgueTtyZXR1cm4gaC5pbnRlcnBvbGF0ZShJKX19ZnVuY3Rpb24gdSh5LHcpe2QzLnNlbGVjdCh3KS5zZWxlY3QoInBhdGguIitmLkNsYXNzLkVkZ2UuTElORSkudHJhbnNpdGlvbigpLmF0dHJUd2VlbigiZCIsZnVuY3Rpb24oQyxHLEQpe3JldHVybiBxKHksdGhpcyxDLEcsRCl9KX1mdW5jdGlvbiB4KHksdyl7eS5jbGFzc2VkKCJmYWRlZCIsdy5sYWJlbC5pc0ZhZGVkT3V0KTt3PXcubGFiZWwubWV0YWVkZ2U7eS5zZWxlY3QoInBhdGguIitmLkNsYXNzLkVkZ2UuTElORSkuY2xhc3NlZCgiY29udHJvbC1kZXAiLHcmJiF3Lm51bVJlZ3VsYXJFZGdlcyl9aC5NSU5fRURHRV9XSURUSD0uNzU7aC5NQVhfRURHRV9XSURUSD0xMjtoLkVER0VfV0lEVEhfU0laRV9CQVNFRF9TQ0FMRT0KZDMuc2NhbGVQb3coKS5leHBvbmVudCguMykuZG9tYWluKFsxLDVFNl0pLnJhbmdlKFtoLk1JTl9FREdFX1dJRFRILGguTUFYX0VER0VfV0lEVEhdKS5jbGFtcCghMCk7bGV0IEE9ZDMuc2NhbGVRdWFudGl6ZSgpLmRvbWFpbihbaC5NSU5fRURHRV9XSURUSCxoLk1BWF9FREdFX1dJRFRIXSkucmFuZ2UoWyJzbWFsbCIsIm1lZGl1bSIsImxhcmdlIiwieGxhcmdlIl0pO2guZ2V0RWRnZUtleT1rO2guYnVpbGRHcm91cD1mdW5jdGlvbih5LHcsQyl7bGV0IEc9W107Rz1fLnJlZHVjZSh3LmVkZ2VzKCksKEQsQik9PntsZXQgST13LmVkZ2UoQik7RC5wdXNoKHt2OkIudix3OkIudyxsYWJlbDpJfSk7cmV0dXJuIER9LEcpO3k9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKHksImciLGYuQ2xhc3MuRWRnZS5DT05UQUlORVIpLnNlbGVjdEFsbChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9KS5kYXRhKEcsayk7eS5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIixmLkNsYXNzLkVkZ2UuR1JPVVApLmF0dHIoImRhdGEtZWRnZSIsCmspLmVhY2goZnVuY3Rpb24oRCl7bGV0IEI9ZDMuc2VsZWN0KHRoaXMpO0QubGFiZWwuZWRnZUdyb3VwPUI7Qy5fZWRnZUdyb3VwSW5kZXhbayhEKV09QjtpZihDLmhhbmRsZUVkZ2VTZWxlY3RlZClCLm9uKCJjbGljayIsST0+e2QzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO0MuZmlyZSgiZWRnZS1zZWxlY3QiLHtlZGdlRGF0YTpJLGVkZ2VHcm91cDpCfSl9KTtuKEIsRCxDKX0pLm1lcmdlKHkpLmVhY2goZnVuY3Rpb24oKXt1KEMsdGhpcyl9KS5lYWNoKGZ1bmN0aW9uKEQpe3goZDMuc2VsZWN0KHRoaXMpLEQsQyl9KTt5LmV4aXQoKS5lYWNoKEQ9PntkZWxldGUgQy5fZWRnZUdyb3VwSW5kZXhbayhEKV19KS5yZW1vdmUoKTtyZXR1cm4geX07aC5nZXRMYWJlbEZvckJhc2VFZGdlPXQ7aC5nZXRMYWJlbEZvckVkZ2U9bDtoLmFwcGVuZEVkZ2U9bjtoLmludGVycG9sYXRlPWQzLmxpbmUoKS5jdXJ2ZShkMy5jdXJ2ZUJhc2lzKS54KHk9PnkueCkueSh5PT55LnkpfSkoZi5lZGdlfHwoZi5lZGdlPQp7fSkpfSkoZC5zY2VuZXx8KGQuc2NlbmU9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL2V4dGVybnMuanMKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vZ3JhcGguanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXtmdW5jdGlvbiBmKEgsSyxNLEwsUSl7cmV0dXJuKE0/TSsiLyI6IiIpKyhIKygidW5kZWZpbmVkIiE9PXR5cGVvZiBMJiYidW5kZWZpbmVkIiE9PXR5cGVvZiBRPyJbIitMKyItIitRKyJdIjoiIyIpK0spfWZ1bmN0aW9uIGgoSCl7aWYoIUgpcmV0dXJuIG51bGw7Zm9yKGxldCBLPTA7SzxILmxlbmd0aDtLKyspe2xldCB7a2V5Ok0sdmFsdWU6TH09SFtLXTtpZigiX291dHB1dF9zaGFwZXMiPT09TSl7aWYoIUwubGlzdC5zaGFwZSlicmVhaztsZXQgUT1MLmxpc3Quc2hhcGUubWFwKFQ9PlQudW5rbm93bl9yYW5rP251bGw6bnVsbD09VC5kaW18fDE9PT1ULmRpbS5sZW5ndGgmJm51bGw9PVQuZGltWzBdLnNpemU/W106VC5kaW0ubWFwKFg9Plguc2l6ZSkpO0guc3BsaWNlKEssMSk7cmV0dXJuIFF9fXJldHVybiBudWxsfWZ1bmN0aW9uIGsoSCl7aWYoIUgpcmV0dXJuIG51bGw7Zm9yKGxldCBLPTA7SzxILmxlbmd0aDtLKyspaWYoIl9YbGFDbHVzdGVyIj09PQpIW0tdLmtleSlyZXR1cm4gSFtLXS52YWx1ZS5zfHxudWxsO3JldHVybiBudWxsfWZ1bmN0aW9uIHQoSCl7bGV0IEs9W107Xy5lYWNoKEgsTT0+e2xldCBMPSJeIj09PU1bMF07TCYmKE09TS5zdWJzdHJpbmcoMSkpO2xldCBRPU0sVD0iMCIsWD1NLm1hdGNoKC8oLiopOihcdys6XGQrKSQvKTtpZihYKVE9WFsxXSxUPVhbMl07ZWxzZSBpZihYPU0ubWF0Y2goLyguKik6KFxkKykkLykpUT1YWzFdLFQ9WFsyXTswIT09Sy5sZW5ndGgmJlE9PT1LW0subGVuZ3RoLTFdLm5hbWV8fEsucHVzaCh7bmFtZTpRLG91dHB1dFRlbnNvcktleTpULGlzQ29udHJvbERlcGVuZGVuY3k6TH0pfSk7cmV0dXJuIEt9ZnVuY3Rpb24gbChILEssTSxMLFEsVCl7SyE9PU0ubmFtZSYmSC5lZGdlcy5wdXNoKHt2OkssdzpNLm5hbWUsb3V0cHV0VGVuc29yS2V5Okwub3V0cHV0VGVuc29yS2V5LGlzQ29udHJvbERlcGVuZGVuY3k6TC5pc0NvbnRyb2xEZXBlbmRlbmN5LGlzUmVmZXJlbmNlRWRnZTohMD09PVEucmVmRWRnZXNbTS5vcCsKIiAiK1RdfSl9ZnVuY3Rpb24gcChILEssTSl7TT1NfHx7fTtsZXQgTD1uZXcgZ3JhcGhsaWIuR3JhcGgoTSk7TC5zZXRHcmFwaCh7bmFtZTpILHJhbmtkaXI6TS5yYW5rZGlyfHwiQlQiLHR5cGU6S30pO3JldHVybiBMfWZ1bmN0aW9uIG0oSCl7cmV0dXJuIGZ1bmN0aW9uKEspe2ZvcihsZXQgTT0wO008SC5sZW5ndGg7TSsrKXtsZXQgTD1uZXcgUmVnRXhwKEhbTV0pO2lmKCJzdHJpbmciPT09dHlwZW9mIEsub3AmJksub3AubWF0Y2goTCkpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIG4oSCl7bGV0IEs9SC5zcGxpdChkLk5BTUVTUEFDRV9ERUxJTSk7cmV0dXJuIEgrZC5OQU1FU1BBQ0VfREVMSU0rIigiK0tbSy5sZW5ndGgtMV0rIikifWZ1bmN0aW9uIHEoSCxLKXtsZXQgTT17fSxMPXt9O0guc29ydCgpO2ZvcihsZXQgUT0wO1E8SC5sZW5ndGgtMTsrK1Epe2xldCBUPUhbUV07Xy5lYWNoKHgoVCkuc2xpY2UoMCwtMSksWD0+e0xbWF09ITB9KTtmb3IobGV0IFg9USsxO1g8SC5sZW5ndGg7KytYKXtsZXQgYWE9CkhbWF07aWYoXy5zdGFydHNXaXRoKGFhLFQpKXtpZihhYS5sZW5ndGg+VC5sZW5ndGgmJmFhLmNoYXJBdChULmxlbmd0aCk9PT1kLk5BTUVTUEFDRV9ERUxJTSl7TVtUXT1uKFQpO2JyZWFrfX1lbHNlIGJyZWFrfX1fLmVhY2goSyxRPT57USBpbiBMJiYoTVtRXT1uKFEpKX0pO3JldHVybiBNfWZ1bmN0aW9uIHUoSCl7bGV0IEs9SC5ub2RlcygpLm1hcChmdW5jdGlvbihNKXtyZXR1cm4gSC5uZWlnaGJvcnMoTSkubGVuZ3RofSk7Sy5zb3J0KCk7cmV0dXJuIEt9ZnVuY3Rpb24geChILEspe2xldCBNPVtdLEw9SC5pbmRleE9mKGQuTkFNRVNQQUNFX0RFTElNKTtmb3IoOzA8PUw7KU0ucHVzaChILnN1YnN0cmluZygwLEwpKSxMPUguaW5kZXhPZihkLk5BTUVTUEFDRV9ERUxJTSxMKzEpO0smJihLPUtbSF0pJiZNLnB1c2goSyk7TS5wdXNoKEgpO3JldHVybiBNfWQuTkFNRVNQQUNFX0RFTElNPSIvIjtkLlJPT1RfTkFNRT0iX19yb290X18iO2QuRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWD0KIl9fZnVuY3Rpb25fbGlicmFyeV9fIjtkLkxBUkdFX0FUVFJTX0tFWT0iX3Rvb19sYXJnZV9hdHRycyI7ZC5MSU1JVF9BVFRSX1NJWkU9MTAyNDtkLkVER0VfS0VZX0RFTElNPSItLSI7bGV0IEE7KGZ1bmN0aW9uKEgpe0hbSC5GVUxMPTBdPSJGVUxMIjtIW0guRU1CRURERUQ9MV09IkVNQkVEREVEIjtIW0guTUVUQT0yXT0iTUVUQSI7SFtILlNFUklFUz0zXT0iU0VSSUVTIjtIW0guQ09SRT00XT0iQ09SRSI7SFtILlNIQURPVz01XT0iU0hBRE9XIjtIW0guQlJJREdFPTZdPSJCUklER0UiO0hbSC5FREdFPTddPSJFREdFIn0pKEE9ZC5HcmFwaFR5cGV8fChkLkdyYXBoVHlwZT17fSkpO2xldCB5OyhmdW5jdGlvbihIKXtIW0guTUVUQT0wXT0iTUVUQSI7SFtILk9QPTFdPSJPUCI7SFtILlNFUklFUz0yXT0iU0VSSUVTIjtIW0guQlJJREdFPTNdPSJCUklER0UiO0hbSC5FTExJUFNJUz00XT0iRUxMSVBTSVMifSkoeT1kLk5vZGVUeXBlfHwoZC5Ob2RlVHlwZT17fSkpO2xldCB3OyhmdW5jdGlvbihIKXtIW0guSU5DTFVERT0KMF09IklOQ0xVREUiO0hbSC5FWENMVURFPTFdPSJFWENMVURFIjtIW0guVU5TUEVDSUZJRUQ9Ml09IlVOU1BFQ0lGSUVEIn0pKHc9ZC5JbmNsdXNpb25UeXBlfHwoZC5JbmNsdXNpb25UeXBlPXt9KSk7KGZ1bmN0aW9uKEgpe0hbSC5HUk9VUD0wXT0iR1JPVVAiO0hbSC5VTkdST1VQPTFdPSJVTkdST1VQIn0pKGQuU2VyaWVzR3JvdXBpbmdUeXBlfHwoZC5TZXJpZXNHcm91cGluZ1R5cGU9e30pKTtjbGFzcyBDe2NvbnN0cnVjdG9yKCl7dGhpcy5ub2Rlcz17fTt0aGlzLmVkZ2VzPVtdfX1kLlNsaW1HcmFwaD1DO2NsYXNzIEd7Y29uc3RydWN0b3IoSCl7dGhpcy50eXBlPXkuRUxMSVBTSVM7dGhpcy5pc0dyb3VwTm9kZT0hMTt0aGlzLmNhcmRpbmFsaXR5PTE7dGhpcy5zdGF0cz10aGlzLnBhcmVudE5vZGU9bnVsbDt0aGlzLnNldE51bU1vcmVOb2RlcyhIKTt0aGlzLmluY2x1ZGU9dy5VTlNQRUNJRklFRH1zZXROdW1Nb3JlTm9kZXMoSCl7dGhpcy5udW1Nb3JlTm9kZXM9SDt0aGlzLm5hbWU9CiIuLi4gIitIKyIgbW9yZSJ9fWQuRWxsaXBzaXNOb2RlSW1wbD1HO2NsYXNzIER7Y29uc3RydWN0b3IoSCl7dGhpcy5vcD1ILm9wO3RoaXMubmFtZT1ILm5hbWU7dGhpcy5kZXZpY2U9SC5kZXZpY2U7dGhpcy5hdHRyPUguYXR0cjt0aGlzLmlucHV0cz10KEguaW5wdXQpO3RoaXMub3V0cHV0U2hhcGVzPWgoSC5hdHRyKTt0aGlzLnhsYUNsdXN0ZXI9ayhILmF0dHIpO3RoaXMuY29tcGF0aWJsZT0hMTt0aGlzLnR5cGU9eS5PUDt0aGlzLmlzR3JvdXBOb2RlPSExO3RoaXMuY2FyZGluYWxpdHk9MTt0aGlzLmluRW1iZWRkaW5ncz1bXTt0aGlzLm91dEVtYmVkZGluZ3M9W107dGhpcy5wYXJlbnROb2RlPW51bGw7dGhpcy5pbmNsdWRlPXcuVU5TUEVDSUZJRUQ7dGhpcy5vd25pbmdTZXJpZXM9bnVsbH19ZC5PcE5vZGVJbXBsPUQ7ZC5jcmVhdGVNZXRhbm9kZT1mdW5jdGlvbihILEs9e30pe3JldHVybiBuZXcgSShILEspfTtkLmpvaW5TdGF0c0luZm9XaXRoR3JhcGg9ZnVuY3Rpb24oSCxLLApNKXtfLmVhY2goSC5ub2RlcyxMPT57TC5zdGF0cz1udWxsfSk7Xy5lYWNoKEsuZGV2X3N0YXRzLEw9PntNJiYhTVtMLmRldmljZV18fF8uZWFjaChMLm5vZGVfc3RhdHMsUT0+e2xldCBUPVEubm9kZV9uYW1lIGluIEgubm9kZXM/US5ub2RlX25hbWU6bihRLm5vZGVfbmFtZSk7aWYoVCBpbiBILm5vZGVzKXt2YXIgWD0wO1EubWVtb3J5JiZfLmVhY2goUS5tZW1vcnksbGE9PntsYS50b3RhbF9ieXRlcyYmKDA8bGEudG90YWxfYnl0ZXM/WCs9TnVtYmVyKGxhLnRvdGFsX2J5dGVzKTpjb25zb2xlLmxvZygiaWdub3JpbmcgbmVnYXRpdmUgbWVtb3J5IGFsbG9jYXRpb24gZm9yICIrVCkpfSk7dmFyIGFhPW51bGw7US5vdXRwdXQmJihhYT1fLm1hcChRLm91dHB1dCxsYT0+Xy5tYXAobGEudGVuc29yX2Rlc2NyaXB0aW9uLnNoYXBlLmRpbSxaPT5OdW1iZXIoWi5zaXplKSkpKTtILm5vZGVzW1RdLmRldmljZT1MLmRldmljZTtudWxsPT1ILm5vZGVzW1RdLnN0YXRzJiYoSC5ub2Rlc1tUXS5zdGF0cz0KbmV3IEIoYWEpKTtILm5vZGVzW1RdLnN0YXRzLmFkZEJ5dGVzQWxsb2NhdGlvbihYKTtRLmFsbF9lbmRfcmVsX21pY3JvcyYmKDA8US5hbGxfZW5kX3JlbF9taWNyb3M/SC5ub2Rlc1tUXS5zdGF0cy5hZGRFeGVjdXRpb25UaW1lKFEuYWxsX3N0YXJ0X21pY3JvcyxRLmFsbF9zdGFydF9taWNyb3MrUS5hbGxfZW5kX3JlbF9taWNyb3MpOmNvbnNvbGUubG9nKCJpZ25vcmluZyBuZWdhdGl2ZSBydW50aW1lIGZvciAiK1QpKX19KX0pfTtjbGFzcyBCe2NvbnN0cnVjdG9yKEgpe3RoaXMudG90YWxCeXRlcz0wO3RoaXMub3V0cHV0U2l6ZT1IfWFkZEV4ZWN1dGlvblRpbWUoSCxLKXt0aGlzLnN0YXJ0VGltZT1udWxsIT10aGlzLnN0YXJ0VGltZT9NYXRoLm1pbih0aGlzLnN0YXJ0VGltZSxIKTpIO3RoaXMuZW5kVGltZT1udWxsIT10aGlzLmVuZFRpbWU/TWF0aC5tYXgodGhpcy5lbmRUaW1lLEspOkt9YWRkQnl0ZXNBbGxvY2F0aW9uKEgpe3RoaXMudG90YWxCeXRlcz1udWxsIT10aGlzLnRvdGFsQnl0ZXM/Ck1hdGgubWF4KHRoaXMudG90YWxCeXRlcyxIKTpIfWNvbWJpbmUoSCl7bnVsbCE9SC50b3RhbEJ5dGVzJiYodGhpcy50b3RhbEJ5dGVzKz1ILnRvdGFsQnl0ZXMpO251bGwhPUguZ2V0VG90YWxNaWNyb3MoKSYmdGhpcy5hZGRFeGVjdXRpb25UaW1lKEguc3RhcnRUaW1lLEguZW5kVGltZSl9Z2V0VG90YWxNaWNyb3MoKXtyZXR1cm4gbnVsbD09dGhpcy5zdGFydFRpbWV8fG51bGw9PXRoaXMuZW5kVGltZT9udWxsOnRoaXMuZW5kVGltZS10aGlzLnN0YXJ0VGltZX19ZC5Ob2RlU3RhdHM9QjtjbGFzcyBJe2NvbnN0cnVjdG9yKEgsSz17fSl7dGhpcy5uYW1lPUg7dGhpcy50eXBlPXkuTUVUQTt0aGlzLmRlcHRoPTE7dGhpcy5pc0dyb3VwTm9kZT0hMDt0aGlzLmNhcmRpbmFsaXR5PTA7dGhpcy5tZXRhZ3JhcGg9cChILEEuTUVUQSxLKTt0aGlzLmJyaWRnZWdyYXBoPW51bGw7dGhpcy5vcEhpc3RvZ3JhbT17fTt0aGlzLmRldmljZUhpc3RvZ3JhbT17fTt0aGlzLnhsYUNsdXN0ZXJIaXN0b2dyYW09Cnt9O3RoaXMuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbT17Y29tcGF0aWJsZTowLGluY29tcGF0aWJsZTowfTt0aGlzLnBhcmVudE5vZGU9dGhpcy50ZW1wbGF0ZUlkPW51bGw7dGhpcy5oYXNOb25Db250cm9sRWRnZXM9ITE7dGhpcy5pbmNsdWRlPXcuVU5TUEVDSUZJRUQ7dGhpcy5hc3NvY2lhdGVkRnVuY3Rpb249IiJ9Z2V0Rmlyc3RDaGlsZCgpe3JldHVybiB0aGlzLm1ldGFncmFwaC5ub2RlKHRoaXMubWV0YWdyYXBoLm5vZGVzKClbMF0pfWdldFJvb3RPcCgpe2xldCBIPXRoaXMubmFtZS5zcGxpdCgiLyIpO3JldHVybiB0aGlzLm1ldGFncmFwaC5ub2RlKHRoaXMubmFtZSsiLygiK0hbSC5sZW5ndGgtMV0rIikiKX1sZWF2ZXMoKXtsZXQgSD1bXSxLPVt0aGlzXSxNO2Zvcig7Sy5sZW5ndGg7KXtsZXQgTD1LLnNoaWZ0KCk7TC5pc0dyb3VwTm9kZT8oTT1MLm1ldGFncmFwaCxfLmVhY2goTS5ub2RlcygpLFE9PksucHVzaChNLm5vZGUoUSkpKSk6SC5wdXNoKEwubmFtZSl9cmV0dXJuIEh9fQpkLk1ldGFub2RlSW1wbD1JO2QuY3JlYXRlTWV0YWVkZ2U9ZnVuY3Rpb24oSCxLKXtyZXR1cm4gbmV3IE4oSCxLKX07Y2xhc3MgTntjb25zdHJ1Y3RvcihILEspe3RoaXMudj1IO3RoaXMudz1LO3RoaXMuYmFzZUVkZ2VMaXN0PVtdO3RoaXMuaW5ib3VuZD1udWxsO3RoaXMudG90YWxTaXplPXRoaXMubnVtUmVmRWRnZXM9dGhpcy5udW1Db250cm9sRWRnZXM9dGhpcy5udW1SZWd1bGFyRWRnZXM9MH1hZGRCYXNlRWRnZShILEspe3RoaXMuYmFzZUVkZ2VMaXN0LnB1c2goSCk7SC5pc0NvbnRyb2xEZXBlbmRlbmN5P3RoaXMubnVtQ29udHJvbEVkZ2VzKz0xOnRoaXMubnVtUmVndWxhckVkZ2VzKz0xO0guaXNSZWZlcmVuY2VFZGdlJiYodGhpcy5udW1SZWZFZGdlcys9MSk7dGhpcy50b3RhbFNpemUrPU4uY29tcHV0ZVNpemVPZkVkZ2UoSCxLKTtLLm1heE1ldGFFZGdlU2l6ZT1NYXRoLm1heChLLm1heE1ldGFFZGdlU2l6ZSx0aGlzLnRvdGFsU2l6ZSl9c3RhdGljIGNvbXB1dGVTaXplT2ZFZGdlKEgsCkspe2xldCBNPUsubm9kZShILnYpO2lmKCFNLm91dHB1dFNoYXBlcylyZXR1cm4gMTtLLmhhc1NoYXBlSW5mbz0hMDtIPU9iamVjdC5rZXlzKE0ub3V0cHV0U2hhcGVzKS5tYXAoTD0+TS5vdXRwdXRTaGFwZXNbTF0pLm1hcChMPT5udWxsPT1MPzE6TC5yZWR1Y2UoKFEsVCk9PnstMT09PVQmJihUPTEpO3JldHVybiBRKlR9LDEpKTtyZXR1cm4gXy5zdW0oSCl9fWQuTWV0YWVkZ2VJbXBsPU47ZC5jcmVhdGVTZXJpZXNOb2RlPWZ1bmN0aW9uKEgsSyxNLEwsUSxUKXtyZXR1cm4gbmV3IE8oSCxLLE0sTCxRLFQpfTtkLmdldFNlcmllc05vZGVOYW1lPWY7Y2xhc3MgT3tjb25zdHJ1Y3RvcihILEssTSxMLFEsVCl7dGhpcy5uYW1lPVF8fGYoSCxLLE0pO3RoaXMudHlwZT15LlNFUklFUzt0aGlzLmhhc0xvb3A9ITE7dGhpcy5wcmVmaXg9SDt0aGlzLnN1ZmZpeD1LO3RoaXMuY2x1c3RlcklkPUw7dGhpcy5pZHM9W107dGhpcy5wYXJlbnQ9TTt0aGlzLmlzR3JvdXBOb2RlPSEwO3RoaXMuY2FyZGluYWxpdHk9CjA7dGhpcy5tZXRhZ3JhcGg9cChRLEEuU0VSSUVTLFQpO3RoaXMucGFyZW50Tm9kZT10aGlzLmJyaWRnZWdyYXBoPW51bGw7dGhpcy5kZXZpY2VIaXN0b2dyYW09e307dGhpcy54bGFDbHVzdGVySGlzdG9ncmFtPXt9O3RoaXMuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbT17Y29tcGF0aWJsZTowLGluY29tcGF0aWJsZTowfTt0aGlzLmhhc05vbkNvbnRyb2xFZGdlcz0hMTt0aGlzLmluY2x1ZGU9dy5VTlNQRUNJRklFRH19ZC5EZWZhdWx0QnVpbGRQYXJhbXM9e2VuYWJsZUVtYmVkZGluZzohMCxpbkVtYmVkZGluZ1R5cGVzOlsiQ29uc3QiXSxvdXRFbWJlZGRpbmdUeXBlczpbIl5bYS16QS1aXStTdW1tYXJ5JCJdLHJlZkVkZ2VzOnsiQXNzaWduIDAiOiEwLCJBc3NpZ25BZGQgMCI6ITAsIkFzc2lnblN1YiAwIjohMCwiYXNzaWduIDAiOiEwLCJhc3NpZ25fYWRkIDAiOiEwLCJhc3NpZ25fc3ViIDAiOiEwLCJjb3VudF91cF90byAwIjohMCwiU2NhdHRlckFkZCAwIjohMCwiU2NhdHRlclN1YiAwIjohMCwKIlNjYXR0ZXJVcGRhdGUgMCI6ITAsInNjYXR0ZXJfYWRkIDAiOiEwLCJzY2F0dGVyX3N1YiAwIjohMCwic2NhdHRlcl91cGRhdGUgMCI6ITB9fTtkLmJ1aWxkPWZ1bmN0aW9uKEgsSyxNKXtsZXQgTD17fSxRPXt9LFQ9e30sWD1tKEsuaW5FbWJlZGRpbmdUeXBlcyksYWE9bShLLm91dEVtYmVkZGluZ1R5cGVzKSxsYT1bXSxaPUgubm9kZSxiYT1BcnJheShaLmxlbmd0aCk7cmV0dXJuIGIuZ3JhcGgudXRpbC5ydW5Bc3luY1Rhc2soIk5vcm1hbGl6aW5nIG5hbWVzIiwzMCwoKT0+e2xldCBlYT1BcnJheShaLmxlbmd0aCksY2E9MDtjb25zdCBrYT1FYT0+e2xldCB2YT1uZXcgRChFYSk7aWYoWCh2YSkpcmV0dXJuIGxhLnB1c2godmEubmFtZSksTFt2YS5uYW1lXT12YTtpZihhYSh2YSkpcmV0dXJuIGxhLnB1c2godmEubmFtZSksUVt2YS5uYW1lXT12YSxfLmVhY2godmEuaW5wdXRzLHhhPT57eGE9eGEubmFtZTtUW3hhXT1UW3hhXXx8W107VFt4YV0ucHVzaCh2YSl9KSx2YTtlYVtjYV09CnZhO2JhW2NhXT12YS5uYW1lO2NhKys7cmV0dXJuIHZhfTtfLmVhY2goWixrYSk7Y29uc3QgWT1FYT0+e2NvbnN0IHZhPWQuRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCtFYS5zaWduYXR1cmUubmFtZTtrYSh7bmFtZTp2YSxpbnB1dDpbXSxkZXZpY2U6IiIsb3A6IiIsYXR0cjpbXX0pO2lmKEVhLnNpZ25hdHVyZS5pbnB1dF9hcmcpe2xldCB5YT0wO3ZhciB4YT1TYT0+e2thKHtuYW1lOnZhK2QuTkFNRVNQQUNFX0RFTElNK1NhLm5hbWUsaW5wdXQ6W10sZGV2aWNlOiIiLG9wOiJpbnB1dF9hcmciLGF0dHI6W3trZXk6IlQiLHZhbHVlOnt0eXBlOlNhLnR5cGV9fV19KS5mdW5jdGlvbklucHV0SW5kZXg9eWE7eWErK307RWEuc2lnbmF0dXJlLmlucHV0X2FyZy5uYW1lP3hhKEVhLnNpZ25hdHVyZS5pbnB1dF9hcmcpOl8uZWFjaChFYS5zaWduYXR1cmUuaW5wdXRfYXJnLHhhKX1sZXQgQWE9MDtjb25zdCBGYT17fTtFYS5zaWduYXR1cmUub3V0cHV0X2FyZyYmKHhhPXlhPT57RmFbdmErCmQuTkFNRVNQQUNFX0RFTElNK3lhLm5hbWVdPUFhO0FhKyt9LEVhLnNpZ25hdHVyZS5vdXRwdXRfYXJnLm5hbWU/eGEoRWEuc2lnbmF0dXJlLm91dHB1dF9hcmcpOl8uZWFjaChFYS5zaWduYXR1cmUub3V0cHV0X2FyZyx4YSkpO18uZWFjaChFYS5ub2RlX2RlZix5YT0+e3lhLm5hbWU9dmErIi8iK3lhLm5hbWU7InN0cmluZyI9PT10eXBlb2YgeWEuaW5wdXQmJih5YS5pbnB1dD1beWEuaW5wdXRdKTtjb25zdCBTYT1rYSh5YSk7Xy5pc051bWJlcihGYVt5YS5uYW1lXSkmJihTYS5mdW5jdGlvbk91dHB1dEluZGV4PUZhW3lhLm5hbWVdKTtfLmVhY2goU2EuaW5wdXRzLFhhPT57WGEubmFtZT12YStkLk5BTUVTUEFDRV9ERUxJTStYYS5uYW1lfSl9KX07SC5saWJyYXJ5JiZILmxpYnJhcnkuZnVuY3Rpb24mJl8uZWFjaChILmxpYnJhcnkuZnVuY3Rpb24sWSk7ZWEuc3BsaWNlKGNhKTtiYS5zcGxpY2UoY2EpO3JldHVybiBlYX0sTSkudGhlbihlYT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jVGFzaygiQnVpbGRpbmcgdGhlIGRhdGEgc3RydWN0dXJlIiwKNzAsKCk9PntsZXQgY2E9cShiYSxsYSksa2E9bmV3IEM7Xy5lYWNoKGVhLFk9PntsZXQgRWE9Y2FbWS5uYW1lXXx8WS5uYW1lO2thLm5vZGVzW0VhXT1ZO1kubmFtZSBpbiBUJiYoWS5vdXRFbWJlZGRpbmdzPVRbWS5uYW1lXSxfLmVhY2goWS5vdXRFbWJlZGRpbmdzLHZhPT57dmEubmFtZT1jYVt2YS5uYW1lXXx8dmEubmFtZX0pKTtZLm5hbWU9RWF9KTtfLmVhY2goZWEsWT0+e18uZWFjaChZLmlucHV0cywoRWEsdmEpPT57bGV0IHhhPUVhLm5hbWU7aWYoeGEgaW4gTCl7RWE9TFt4YV07WS5pbkVtYmVkZGluZ3MucHVzaChFYSk7Zm9yKHZhciBBYSBvZiBFYS5pbnB1dHMpbChrYSxjYVtBYS5uYW1lXXx8QWEubmFtZSxZLEFhLEssdmEpfWVsc2UgaWYoeGEgaW4gUSl7QWE9UVt4YV07Zm9yKGxldCBGYSBvZiBBYS5pbnB1dHMpbChrYSxjYVtGYS5uYW1lXXx8RmEubmFtZSxZLEVhLEssdmEpfWVsc2UgbChrYSxjYVt4YV18fHhhLFksRWEsSyx2YSl9KX0pO18uZWFjaChMLFk9PntZLm5hbWU9CmNhW1kubmFtZV18fFkubmFtZX0pO3JldHVybiBrYX0sTSkpfTtkLmNyZWF0ZUdyYXBoPXA7ZC5nZXRTdHJpY3ROYW1lPW47ZC5oYXNTaW1pbGFyRGVncmVlU2VxdWVuY2U9ZnVuY3Rpb24oSCxLKXtIPXUoSCk7Sz11KEspO2ZvcihsZXQgTT0wO008SC5sZW5ndGg7TSsrKWlmKEhbTV0hPT1LW01dKXJldHVybiExO3JldHVybiEwfTtkLmdldEhpZXJhcmNoaWNhbFBhdGg9eDtkLmdldEluY2x1ZGVOb2RlQnV0dG9uU3RyaW5nPWZ1bmN0aW9uKEgpe3JldHVybiBIPT09Yi5ncmFwaC5JbmNsdXNpb25UeXBlLkVYQ0xVREU/IkFkZCB0byBtYWluIGdyYXBoIjoiUmVtb3ZlIGZyb20gbWFpbiBncmFwaCJ9O2QuZ2V0R3JvdXBTZXJpZXNOb2RlQnV0dG9uU3RyaW5nPWZ1bmN0aW9uKEgpe3JldHVybiBIPT09Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuR1JPVVA/IlVuZ3JvdXAgdGhpcyBzZXJpZXMgb2Ygbm9kZXMiOiJHcm91cCB0aGlzIHNlcmllcyBvZiBub2RlcyJ9O2QudG9nZ2xlTm9kZVNlcmllc0dyb3VwPQpmdW5jdGlvbihILEspe0hbS109SyBpbiBIJiZIW0tdIT09Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuR1JPVVA/Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuR1JPVVA6Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUH19KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9oaWVyYXJjaHkuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaCh4LEEseSx3KXtBPXk/eC5pbkVkZ2VzKEEubmFtZSk6eC5vdXRFZGdlcyhBLm5hbWUpO18uZWFjaChBLEM9PntDPXguZWRnZShDKTsoQy5udW1SZWd1bGFyRWRnZXM/dy5yZWd1bGFyOncuY29udHJvbCkucHVzaChDKX0pfWZ1bmN0aW9uIGsoeCxBKXtjb25zdCB5PXt9O18uZWFjaChBLm5vZGVzLHc9PntsZXQgQz1kLmdldEhpZXJhcmNoaWNhbFBhdGgody5uYW1lKSxHPXgucm9vdDtHLmRlcHRoPU1hdGgubWF4KEMubGVuZ3RoLEcuZGVwdGgpO3lbdy5vcF18fCh5W3cub3BdPVtdKTt5W3cub3BdLnB1c2godyk7Zm9yKGxldCBCPTA7QjxDLmxlbmd0aDtCKyspe0cuZGVwdGg9TWF0aC5tYXgoRy5kZXB0aCxDLmxlbmd0aC1CKTtHLmNhcmRpbmFsaXR5Kz13LmNhcmRpbmFsaXR5O0cub3BIaXN0b2dyYW1bdy5vcF09KEcub3BIaXN0b2dyYW1bdy5vcF18fDApKzE7bnVsbCE9dy5kZXZpY2UmJihHLmRldmljZUhpc3RvZ3JhbVt3LmRldmljZV09CihHLmRldmljZUhpc3RvZ3JhbVt3LmRldmljZV18fDApKzEpO251bGwhPXcueGxhQ2x1c3RlciYmKEcueGxhQ2x1c3Rlckhpc3RvZ3JhbVt3LnhsYUNsdXN0ZXJdPShHLnhsYUNsdXN0ZXJIaXN0b2dyYW1bdy54bGFDbHVzdGVyXXx8MCkrMSk7dy5jb21wYXRpYmxlP0cuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxO18uZWFjaCh3LmluRW1iZWRkaW5ncyxOPT57Ti5jb21wYXRpYmxlP0cuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShHLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwKMCkrMX0pO18uZWFjaCh3Lm91dEVtYmVkZGluZ3MsTj0+e04uY29tcGF0aWJsZT9HLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oRy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6Ry5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oRy5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMX0pO2lmKEI9PT1DLmxlbmd0aC0xKWJyZWFrO3ZhciBEPUNbQl07bGV0IEk9eC5ub2RlKEQpO0l8fChJPWQuY3JlYXRlTWV0YW5vZGUoRCx4LmdyYXBoT3B0aW9ucyksSS5wYXJlbnROb2RlPUcseC5zZXROb2RlKEQsSSksRy5tZXRhZ3JhcGguc2V0Tm9kZShELEkpLDA9PT1ELmluZGV4T2YoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKSYmRy5uYW1lPT09Yi5ncmFwaC5ST09UX05BTUUmJihEPUQuc3Vic3RyaW5nKGIuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWC5sZW5ndGgpLHlbRF18fAooeVtEXT1bXSkseC5saWJyYXJ5RnVuY3Rpb25zW0RdPXtub2RlOkksdXNhZ2VzOnlbRF19LEkuYXNzb2NpYXRlZEZ1bmN0aW9uPUQpKTtHPUl9eC5zZXROb2RlKHcubmFtZSx3KTt3LnBhcmVudE5vZGU9RztHLm1ldGFncmFwaC5zZXROb2RlKHcubmFtZSx3KTtfLmVhY2gody5pbkVtYmVkZGluZ3MsZnVuY3Rpb24oQil7eC5zZXROb2RlKEIubmFtZSxCKTtCLnBhcmVudE5vZGU9d30pO18uZWFjaCh3Lm91dEVtYmVkZGluZ3MsZnVuY3Rpb24oQil7eC5zZXROb2RlKEIubmFtZSxCKTtCLnBhcmVudE5vZGU9d30pfSl9ZnVuY3Rpb24gdCh4LEEpe2xldCB5PXguZ2V0Tm9kZU1hcCgpLHc9W10sQz1bXSxHPShELEIpPT57bGV0IEk9MDtmb3IoO0Q7KUJbSSsrXT1ELm5hbWUsRD1ELnBhcmVudE5vZGU7cmV0dXJuIEktMX07Xy5lYWNoKEEuZWRnZXMsRD0+e3ZhciBCPUcoQS5ub2Rlc1tELnZdLHcpLEk9RyhBLm5vZGVzW0Qud10sQyk7aWYoLTEhPT1CJiYtMSE9PUkpe2Zvcig7d1tCXT09PUNbSV07KWlmKEItLSwKSS0tLDA+Qnx8MD5JKXRocm93IEVycm9yKCJObyBkaWZmZXJlbmNlIGZvdW5kIGJldHdlZW4gYW5jZXN0b3IgcGF0aHMuIik7dmFyIE49eVt3W0IrMV1dO0I9d1tCXTtJPUNbSV07dmFyIE89Ti5tZXRhZ3JhcGguZWRnZShCLEkpO098fChPPWQuY3JlYXRlTWV0YWVkZ2UoQixJKSxOLm1ldGFncmFwaC5zZXRFZGdlKEIsSSxPKSk7Ti5oYXNOb25Db250cm9sRWRnZXN8fEQuaXNDb250cm9sRGVwZW5kZW5jeXx8KE4uaGFzTm9uQ29udHJvbEVkZ2VzPSEwKTtPLmFkZEJhc2VFZGdlKEQseCl9fSl9ZnVuY3Rpb24gbCh4LEEseSx3LEMsRyl7bGV0IEQ9eC5tZXRhZ3JhcGg7Xy5lYWNoKEQubm9kZXMoKSxCPT57Qj1ELm5vZGUoQik7Qi50eXBlPT09Yi5ncmFwaC5Ob2RlVHlwZS5NRVRBJiZsKEIsQSx5LHcsQyxHKX0pO3g9cChEKTt4PShHP246bSkoeCxELEEuZ3JhcGhPcHRpb25zKTtfLmVhY2goeCxmdW5jdGlvbihCLEkpe2xldCBOPUIubWV0YWdyYXBoLm5vZGVzKCk7Xy5lYWNoKE4sTz0+CntPPUQubm9kZShPKTtPLm93bmluZ1Nlcmllc3x8KE8ub3duaW5nU2VyaWVzPUkpfSk7Ti5sZW5ndGg8dyYmIShCLm5hbWUgaW4gQykmJihDW0IubmFtZV09Yi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUCk7Qi5uYW1lIGluIEMmJkNbQi5uYW1lXT09PWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVB8fChBLnNldE5vZGUoSSxCKSxELnNldE5vZGUoSSxCKSxfLmVhY2goTixPPT57bGV0IEg9RC5ub2RlKE8pO0IubWV0YWdyYXBoLnNldE5vZGUoTyxIKTtCLnBhcmVudE5vZGU9SC5wYXJlbnROb2RlO0IuY2FyZGluYWxpdHkrKztudWxsIT1ILmRldmljZSYmKEIuZGV2aWNlSGlzdG9ncmFtW0guZGV2aWNlXT0oQi5kZXZpY2VIaXN0b2dyYW1bSC5kZXZpY2VdfHwwKSsxKTtudWxsIT1ILnhsYUNsdXN0ZXImJihCLnhsYUNsdXN0ZXJIaXN0b2dyYW1bSC54bGFDbHVzdGVyXT0oQi54bGFDbHVzdGVySGlzdG9ncmFtW0gueGxhQ2x1c3Rlcl18fDApKzEpO0guY29tcGF0aWJsZT8KQi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzE7Xy5lYWNoKEguaW5FbWJlZGRpbmdzLEs9PntLLmNvbXBhdGlibGU/Qi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzF9KTtfLmVhY2goSC5vdXRFbWJlZGRpbmdzLEs9PntLLmNvbXBhdGlibGU/Qi5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KEIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOkIuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9CihCLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxfSk7SC5wYXJlbnROb2RlPUI7eVtPXT1JO0QucmVtb3ZlTm9kZShPKX0pKX0pfWZ1bmN0aW9uIHAoeCl7cmV0dXJuIF8ucmVkdWNlKHgubm9kZXMoKSwoQSx5KT0+e3k9eC5ub2RlKHkpO2lmKHkudHlwZT09PWQuTm9kZVR5cGUuTUVUQSlyZXR1cm4gQTtsZXQgdz15Lm9wO3cmJihBW3ddPUFbd118fFtdLEFbd10ucHVzaCh5Lm5hbWUpKTtyZXR1cm4gQX0se30pfWZ1bmN0aW9uIG0oeCxBLHkpe2xldCB3PXt9O18uZWFjaCh4LGZ1bmN0aW9uKEMsRyl7aWYoISgxPj1DLmxlbmd0aCkpe3ZhciBEPXt9O18uZWFjaChDLGZ1bmN0aW9uKEIpe3ZhciBJPSIqIj09PUIuY2hhckF0KEIubGVuZ3RoLTEpLE49Qi5zcGxpdCgiLyIpLE89TltOLmxlbmd0aC0xXTtOPU4uc2xpY2UoMCxOLmxlbmd0aC0xKS5qb2luKCIvIik7dmFyIEg9Ty5tYXRjaCgvXihcRCopXyhcZCspJC8pO2xldCBLPSIiO0g/KE89SFsxXSxIPUhbMl0pOgooTz1JP08uc3Vic3RyKDAsTy5sZW5ndGgtMSk6TyxIPTAsSz1JPyIqIjoiIik7ST1kLmdldFNlcmllc05vZGVOYW1lKE8sSyxOKTtEW0ldPURbSV18fFtdO0I9ZC5jcmVhdGVTZXJpZXNOb2RlKE8sSyxOLCtILEIseSk7RFtJXS5wdXNoKEIpfSk7Xy5lYWNoKEQsZnVuY3Rpb24oQil7aWYoISgyPkIubGVuZ3RoKSl7Qi5zb3J0KGZ1bmN0aW9uKE4sTyl7cmV0dXJuK04uY2x1c3RlcklkLStPLmNsdXN0ZXJJZH0pO3ZhciBJPVtCWzBdXTtmb3IobGV0IE49MTtOPEIubGVuZ3RoO04rKyl7bGV0IE89QltOXTtPLmNsdXN0ZXJJZD09PUlbSS5sZW5ndGgtMV0uY2x1c3RlcklkKzE/SS5wdXNoKE8pOihxKEksdywrRyxBLHkpLEk9W09dKX1xKEksdywrRyxBLHkpfX0pfX0pO3JldHVybiB3fWZ1bmN0aW9uIG4oeCxBLHkpe2xldCB3PXt9O18uZWFjaCh4LGZ1bmN0aW9uKEMsRyl7aWYoISgxPj1DLmxlbmd0aCkpe3ZhciBEPXt9LEI9e307Xy5lYWNoKEMsZnVuY3Rpb24oTil7bGV0IE89IioiPT09Ck4uY2hhckF0KE4ubGVuZ3RoLTEpO3ZhciBIPU4uc3BsaXQoIi8iKTtsZXQgSz1IW0gubGVuZ3RoLTFdO0g9SC5zbGljZSgwLEgubGVuZ3RoLTEpLmpvaW4oIi8iKTtjb25zdCBNPS8oXGQrKS9nO3ZhciBMO2xldCBRLFQsWCxhYT0wO2Zvcig7TD1NLmV4ZWMoSyk7KSsrYWEsUT1LLnNsaWNlKDAsTC5pbmRleCksVD1MWzBdLEw9Sy5zbGljZShMLmluZGV4K0xbMF0ubGVuZ3RoKSxYPWQuZ2V0U2VyaWVzTm9kZU5hbWUoUSxMLEgpLERbWF09RFtYXSxEW1hdfHwoRFtYXT1kLmNyZWF0ZVNlcmllc05vZGUoUSxMLEgsK1QsTix5KSksRFtYXS5pZHMucHVzaChUKSxCW05dPUJbTl18fFtdLEJbTl0ucHVzaChbWCxUXSk7MT5hYSYmKFE9Tz9LLnN1YnN0cigwLEsubGVuZ3RoLTEpOkssVD0wLEw9Tz8iKiI6IiIsWD1kLmdldFNlcmllc05vZGVOYW1lKFEsTCxIKSxEW1hdPURbWF0sRFtYXXx8KERbWF09ZC5jcmVhdGVTZXJpZXNOb2RlKFEsTCxILCtULE4seSkpLERbWF0uaWRzLnB1c2goVCksQltOXT0KQltOXXx8W10sQltOXS5wdXNoKFtYLFRdKSl9KTt2YXIgST17fTtfLmVhY2goQixmdW5jdGlvbihOLE8pe04uc29ydChmdW5jdGlvbihNLEwpe3JldHVybiBEW0xbMF1dLmlkcy5sZW5ndGgtRFtNWzBdXS5pZHMubGVuZ3RofSk7dmFyIEg9TlswXVswXTtOPU5bMF1bMV07SVtIXT1JW0hdfHxbXTtjb25zdCBLPU8uc3BsaXQoIi8iKTtPPWQuY3JlYXRlU2VyaWVzTm9kZShEW0hdLnByZWZpeCxEW0hdLnN1ZmZpeCxLLnNsaWNlKDAsSy5sZW5ndGgtMSkuam9pbigiLyIpLCtOLE8seSk7SVtIXS5wdXNoKE8pfSk7Xy5lYWNoKEksZnVuY3Rpb24oTil7aWYoISgyPk4ubGVuZ3RoKSl7Ti5zb3J0KGZ1bmN0aW9uKEgsSyl7cmV0dXJuK0guY2x1c3RlcklkLStLLmNsdXN0ZXJJZH0pO3ZhciBPPVtOWzBdXTtmb3IobGV0IEg9MTtIPE4ubGVuZ3RoO0grKyl7bGV0IEs9TltIXTtLLmNsdXN0ZXJJZD09PU9bTy5sZW5ndGgtMV0uY2x1c3RlcklkKzE/Ty5wdXNoKEspOihxKE8sdywrRyxBLHkpLE89CltLXSl9cShPLHcsK0csQSx5KX19KX19KTtyZXR1cm4gd31mdW5jdGlvbiBxKHgsQSx5LHcsQyl7aWYoMTx4Lmxlbmd0aCl7bGV0IEc9ZC5nZXRTZXJpZXNOb2RlTmFtZSh4WzBdLnByZWZpeCx4WzBdLnN1ZmZpeCx4WzBdLnBhcmVudCx4WzBdLmNsdXN0ZXJJZCx4W3gubGVuZ3RoLTFdLmNsdXN0ZXJJZCksRD1kLmNyZWF0ZVNlcmllc05vZGUoeFswXS5wcmVmaXgseFswXS5zdWZmaXgseFswXS5wYXJlbnQseSxHLEMpO18uZWFjaCh4LGZ1bmN0aW9uKEIpe0QuaWRzLnB1c2goQi5jbHVzdGVySWQpO0QubWV0YWdyYXBoLnNldE5vZGUoQi5uYW1lLHcubm9kZShCLm5hbWUpKX0pO0FbR109RH19Y2xhc3MgdXtjb25zdHJ1Y3Rvcih4KXt0aGlzLmhhc1NoYXBlSW5mbz0hMTt0aGlzLm1heE1ldGFFZGdlU2l6ZT0xO3RoaXMuZ3JhcGhPcHRpb25zPXh8fHt9O3RoaXMuZ3JhcGhPcHRpb25zLmNvbXBvdW5kPSEwO3RoaXMucm9vdD1kLmNyZWF0ZU1ldGFub2RlKGQuUk9PVF9OQU1FLHRoaXMuZ3JhcGhPcHRpb25zKTsKdGhpcy5saWJyYXJ5RnVuY3Rpb25zPXt9O3RoaXMueGxhQ2x1c3RlcnM9dGhpcy5kZXZpY2VzPXRoaXMudGVtcGxhdGVzPW51bGw7dGhpcy5pbmRleD17fTt0aGlzLmluZGV4W2QuUk9PVF9OQU1FXT10aGlzLnJvb3Q7dGhpcy5vcmRlcmluZ3M9e319Z2V0Tm9kZU1hcCgpe3JldHVybiB0aGlzLmluZGV4fW5vZGUoeCl7cmV0dXJuIHRoaXMuaW5kZXhbeF19c2V0Tm9kZSh4LEEpe3RoaXMuaW5kZXhbeF09QX1nZXRCcmlkZ2VncmFwaCh4KXt2YXIgQT10aGlzLmluZGV4W3hdO2lmKCFBKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIGluIGhpZXJhcmNoeTogIit4KTtpZighKCJtZXRhZ3JhcGgiaW4gQSkpcmV0dXJuIG51bGw7aWYoQS5icmlkZ2VncmFwaClyZXR1cm4gQS5icmlkZ2VncmFwaDtsZXQgeT1BLmJyaWRnZWdyYXBoPWQuY3JlYXRlR3JhcGgoIkJSSURHRUdSQVBIIixkLkdyYXBoVHlwZS5CUklER0UsdGhpcy5ncmFwaE9wdGlvbnMpO2lmKCEoQS5wYXJlbnROb2RlJiYKIm1ldGFncmFwaCJpbiBBLnBhcmVudE5vZGUpKXJldHVybiB5O3ZhciB3PUEucGFyZW50Tm9kZTtBPXcubWV0YWdyYXBoO3c9dGhpcy5nZXRCcmlkZ2VncmFwaCh3Lm5hbWUpO18uZWFjaChbQSx3XSxDPT57Qy5lZGdlcygpLmZpbHRlcihHPT5HLnY9PT14fHxHLnc9PT14KS5mb3JFYWNoKEc9PntsZXQgRD1HLnc9PT14LEI9Qy5lZGdlKEcpO18uZWFjaChCLmJhc2VFZGdlTGlzdCxJPT57bGV0IFtOLE9dPUQ/W0kudyxHLnZdOltJLnYsRy53XTt2YXIgSD10aGlzLmdldENoaWxkTmFtZSh4LE4pO0g9e3Y6RD9POkgsdzpEP0g6T307bGV0IEs9eS5lZGdlKEgpO0t8fChLPWQuY3JlYXRlTWV0YWVkZ2UoSC52LEgudyksSy5pbmJvdW5kPUQseS5zZXRFZGdlKEgudixILncsSykpO0suYWRkQmFzZUVkZ2UoSSx0aGlzKX0pfSl9KTtyZXR1cm4geX1nZXRDaGlsZE5hbWUoeCxBKXtsZXQgeT10aGlzLmluZGV4W0FdO2Zvcig7eTspe2lmKHkucGFyZW50Tm9kZSYmeS5wYXJlbnROb2RlLm5hbWU9PT0KeClyZXR1cm4geS5uYW1lO3k9eS5wYXJlbnROb2RlfXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBpbW1lZGlhdGUgY2hpbGQgZm9yIGRlc2NlbmRhbnQ6ICIrQSk7fWdldFByZWRlY2Vzc29ycyh4KXtsZXQgQT10aGlzLmluZGV4W3hdO2lmKCFBKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIHdpdGggbmFtZTogIit4KTtsZXQgeT10aGlzLmdldE9uZVdheUVkZ2VzKEEsITApO0EuaXNHcm91cE5vZGV8fF8uZWFjaChBLmluRW1iZWRkaW5ncyx3PT57Xy5lYWNoKEEuaW5wdXRzLEM9PntpZihDLm5hbWU9PT13Lm5hbWUpe2xldCBHPW5ldyBkLk1ldGFlZGdlSW1wbCh3Lm5hbWUseCk7Ry5hZGRCYXNlRWRnZSh7aXNDb250cm9sRGVwZW5kZW5jeTpDLmlzQ29udHJvbERlcGVuZGVuY3ksb3V0cHV0VGVuc29yS2V5OkMub3V0cHV0VGVuc29yS2V5LGlzUmVmZXJlbmNlRWRnZTohMSx2OncubmFtZSx3Onh9LHRoaXMpO3kucmVndWxhci5wdXNoKEcpfX0pfSk7cmV0dXJuIHl9Z2V0U3VjY2Vzc29ycyh4KXtsZXQgQT0KdGhpcy5pbmRleFt4XTtpZighQSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIreCk7bGV0IHk9dGhpcy5nZXRPbmVXYXlFZGdlcyhBLCExKTtBLmlzR3JvdXBOb2RlfHxfLmVhY2goQS5vdXRFbWJlZGRpbmdzLHc9PntfLmVhY2gody5pbnB1dHMsQz0+e2lmKEMubmFtZT09PXgpe2xldCBHPW5ldyBkLk1ldGFlZGdlSW1wbCh4LHcubmFtZSk7Ry5hZGRCYXNlRWRnZSh7aXNDb250cm9sRGVwZW5kZW5jeTpDLmlzQ29udHJvbERlcGVuZGVuY3ksb3V0cHV0VGVuc29yS2V5OkMub3V0cHV0VGVuc29yS2V5LGlzUmVmZXJlbmNlRWRnZTohMSx2Ongsdzp3Lm5hbWV9LHRoaXMpO3kucmVndWxhci5wdXNoKEcpfX0pfSk7cmV0dXJuIHl9Z2V0T25lV2F5RWRnZXMoeCxBKXtsZXQgeT17Y29udHJvbDpbXSxyZWd1bGFyOltdfTtpZigheC5wYXJlbnROb2RlfHwheC5wYXJlbnROb2RlLmlzR3JvdXBOb2RlKXJldHVybiB5O3ZhciB3PXgucGFyZW50Tm9kZTtsZXQgQz0Kdy5tZXRhZ3JhcGg7dz10aGlzLmdldEJyaWRnZWdyYXBoKHcubmFtZSk7aChDLHgsQSx5KTtoKHcseCxBLHkpO3JldHVybiB5fWdldFRvcG9sb2dpY2FsT3JkZXJpbmcoeCl7dmFyIEE9dGhpcy5pbmRleFt4XTtpZighQSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIreCk7aWYoIUEuaXNHcm91cE5vZGUpcmV0dXJuIG51bGw7aWYoeCBpbiB0aGlzLm9yZGVyaW5ncylyZXR1cm4gdGhpcy5vcmRlcmluZ3NbeF07bGV0IHk9e30sdz17fSxDPUEubWV0YWdyYXBoO18uZWFjaChDLmVkZ2VzKCksRD0+e0MuZWRnZShEKS5udW1SZWd1bGFyRWRnZXMmJihELnYgaW4geXx8KHlbRC52XT1bXSkseVtELnZdLnB1c2goRC53KSx3W0Qud109ITApfSk7bGV0IEc9Xy5kaWZmZXJlbmNlKF8ua2V5cyh5KSxfLmtleXModykpO3g9dGhpcy5vcmRlcmluZ3NbeF09e307Zm9yKEE9MDtHLmxlbmd0aDspe2xldCBEPUcuc2hpZnQoKTt4W0RdPUErKztfLmVhY2goeVtEXSxCPT4KRy5wdXNoKEIpKTtkZWxldGUgeVtEXX1yZXR1cm4geH1nZXRUZW1wbGF0ZUluZGV4KCl7bGV0IHg9ZDMua2V5cyh0aGlzLnRlbXBsYXRlcyksQT1kMy5zY2FsZU9yZGluYWwoKS5kb21haW4oeCkucmFuZ2UoZDMucmFuZ2UoMCx4Lmxlbmd0aCkpO3JldHVybiB5PT5BKHkpfX1mLkRlZmF1bHRIaWVyYXJjaHlQYXJhbXM9e3ZlcmlmeVRlbXBsYXRlOiEwLHNlcmllc05vZGVNaW5TaXplOjUsc2VyaWVzTWFwOnt9LHJhbmtEaXJlY3Rpb246IkJUIix1c2VHZW5lcmFsaXplZFNlcmllc1BhdHRlcm5zOiExfTtmLmJ1aWxkPWZ1bmN0aW9uKHgsQSx5KXtsZXQgdz1uZXcgdSh7cmFua2RpcjpBLnJhbmtEaXJlY3Rpb259KSxDPXt9O3JldHVybiBiLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJBZGRpbmcgbm9kZXMiLDIwLCgpPT57bGV0IEc9e30sRD17fTtfLmVhY2goeC5ub2RlcyxCPT57Qi5kZXZpY2UmJihHW0IuZGV2aWNlXT0hMCk7Qi54bGFDbHVzdGVyJiYoRFtCLnhsYUNsdXN0ZXJdPSEwKX0pOwp3LmRldmljZXM9Xy5rZXlzKEcpO3cueGxhQ2x1c3RlcnM9Xy5rZXlzKEQpO2sodyx4KX0seSkudGhlbigoKT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jVGFzaygiRGV0ZWN0IHNlcmllcyIsMjAsKCk9PnswPEEuc2VyaWVzTm9kZU1pblNpemUmJmwody5yb290LHcsQyxBLnNlcmllc05vZGVNaW5TaXplLEEuc2VyaWVzTWFwLEEudXNlR2VuZXJhbGl6ZWRTZXJpZXNQYXR0ZXJucyl9LHkpKS50aGVuKCgpPT5iLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJBZGRpbmcgZWRnZXMiLDMwLCgpPT57dCh3LHgsQyl9LHkpKS50aGVuKCgpPT5iLmdyYXBoLnV0aWwucnVuQXN5bmNUYXNrKCJGaW5kaW5nIHNpbWlsYXIgc3ViZ3JhcGhzIiwzMCwoKT0+e3cudGVtcGxhdGVzPWQudGVtcGxhdGUuZGV0ZWN0KHcsQS52ZXJpZnlUZW1wbGF0ZSl9LHkpKS50aGVuKCgpPT53KX07Zi5qb2luQW5kQWdncmVnYXRlU3RhdHM9ZnVuY3Rpb24oeCl7bGV0IEE9e30seT17fTtfLmVhY2goeC5yb290LmxlYXZlcygpLAp3PT57dz14Lm5vZGUodyk7bnVsbCE9dy5kZXZpY2UmJihBW3cuZGV2aWNlXT0hMCk7bnVsbCE9dy54bGFDbHVzdGVyJiYoeVt3LnhsYUNsdXN0ZXJdPSEwKX0pO3guZGV2aWNlcz1fLmtleXMoQSk7eC54bGFDbHVzdGVycz1fLmtleXMoeSk7Xy5lYWNoKHguZ2V0Tm9kZU1hcCgpLHc9Pnt3LmlzR3JvdXBOb2RlJiYody5zdGF0cz1uZXcgZC5Ob2RlU3RhdHMobnVsbCksdy5kZXZpY2VIaXN0b2dyYW09e30pfSk7Xy5lYWNoKHgucm9vdC5sZWF2ZXMoKSx3PT57bGV0IEM9dz14Lm5vZGUodyk7Zm9yKDtudWxsIT1DLnBhcmVudE5vZGU7KXtpZihudWxsIT13LmRldmljZSl7dmFyIEc9Qy5wYXJlbnROb2RlLmRldmljZUhpc3RvZ3JhbTtHW3cuZGV2aWNlXT0oR1t3LmRldmljZV18fDApKzF9bnVsbCE9dy54bGFDbHVzdGVyJiYoRz1DLnBhcmVudE5vZGUueGxhQ2x1c3Rlckhpc3RvZ3JhbSxHW3cueGxhQ2x1c3Rlcl09KEdbdy54bGFDbHVzdGVyXXx8MCkrMSk7bnVsbCE9dy5zdGF0cyYmQy5wYXJlbnROb2RlLnN0YXRzLmNvbWJpbmUody5zdGF0cyk7CkM9Qy5wYXJlbnROb2RlfX0pfTtmLmdldEluY29tcGF0aWJsZU9wcz1mdW5jdGlvbih4LEEpe2xldCB5PVtdLHc9e307Xy5lYWNoKHgucm9vdC5sZWF2ZXMoKSxDPT57Qz14Lm5vZGUoQyk7aWYoQy50eXBlPT1kLk5vZGVUeXBlLk9QKXtpZighQy5jb21wYXRpYmxlKWlmKEMub3duaW5nU2VyaWVzKWlmKEEmJkEuc2VyaWVzTWFwW0Mub3duaW5nU2VyaWVzXT09PWIuZ3JhcGguU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVApeS5wdXNoKEMpO2Vsc2V7aWYoIXdbQy5vd25pbmdTZXJpZXNdKXtsZXQgRz14Lm5vZGUoQy5vd25pbmdTZXJpZXMpO0cmJih3W0Mub3duaW5nU2VyaWVzXT1HLHkucHVzaChHKSl9fWVsc2UgeS5wdXNoKEMpO18uZWFjaChDLmluRW1iZWRkaW5ncyxHPT57Ry5jb21wYXRpYmxlfHx5LnB1c2goRyl9KTtfLmVhY2goQy5vdXRFbWJlZGRpbmdzLEc9PntHLmNvbXBhdGlibGV8fHkucHVzaChHKX0pfX0pO3JldHVybiB5fX0pKGQuaGllcmFyY2h5fHwoZC5oaWVyYXJjaHk9Cnt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9sYXlvdXQuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaCh3KXt3Lm5vZGUuaXNHcm91cE5vZGUmJnQodyk7dy5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEE/cCh3KTp3Lm5vZGUudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTJiZtKHcpfWZ1bmN0aW9uIGsodyl7dy5pbmJveFdpZHRoPTA8dy5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoP2YuUEFSQU1TLmFubm90YXRpb25zLmluYm94V2lkdGg6MDt3Lm91dGJveFdpZHRoPTA8dy5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aD9mLlBBUkFNUy5hbm5vdGF0aW9ucy5vdXRib3hXaWR0aDowO3cuY29yZUJveC53aWR0aD13LndpZHRoO3cuY29yZUJveC5oZWlnaHQ9dy5oZWlnaHQ7dy53aWR0aD1NYXRoLm1heCh3LmNvcmVCb3gud2lkdGgrdy5pbmJveFdpZHRoK3cub3V0Ym94V2lkdGgsMyp3LmRpc3BsYXlOYW1lLmxlbmd0aCl9ZnVuY3Rpb24gdCh3KXtsZXQgQz13LmNvcmVHcmFwaC5ub2RlcygpLm1hcChHPT4Kdy5jb3JlR3JhcGgubm9kZShHKSkuY29uY2F0KHcuaXNvbGF0ZWRJbkV4dHJhY3Qsdy5pc29sYXRlZE91dEV4dHJhY3Qsdy5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCk7Xy5lYWNoKEMsRz0+e3N3aXRjaChHLm5vZGUudHlwZSl7Y2FzZSBkLk5vZGVUeXBlLk9QOl8uZXh0ZW5kKEcsZi5QQVJBTVMubm9kZVNpemUub3ApO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5CUklER0U6Xy5leHRlbmQoRyxmLlBBUkFNUy5ub2RlU2l6ZS5icmlkZ2UpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5NRVRBOkcuZXhwYW5kZWQ/aChHKTooXy5leHRlbmQoRyxmLlBBUkFNUy5ub2RlU2l6ZS5tZXRhKSxHLmhlaWdodD1mLlBBUkFNUy5ub2RlU2l6ZS5tZXRhLmhlaWdodChHLm5vZGUuY2FyZGluYWxpdHkpKTticmVhaztjYXNlIGQuTm9kZVR5cGUuU0VSSUVTOkcuZXhwYW5kZWQ/KF8uZXh0ZW5kKEcsZi5QQVJBTVMubm9kZVNpemUuc2VyaWVzLmV4cGFuZGVkKSxoKEcpKTpfLmV4dGVuZChHLEcubm9kZS5oYXNOb25Db250cm9sRWRnZXM/CmYuUEFSQU1TLm5vZGVTaXplLnNlcmllcy52ZXJ0aWNhbDpmLlBBUkFNUy5ub2RlU2l6ZS5zZXJpZXMuaG9yaXpvbnRhbCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitHLm5vZGUudHlwZSk7fUcuZXhwYW5kZWR8fGsoRyk7bihHKX0pfWZ1bmN0aW9uIGwodyxDKXtfLmV4dGVuZCh3LmdyYXBoKCkse25vZGVzZXA6Qy5ub2RlU2VwLHJhbmtzZXA6Qy5yYW5rU2VwLGVkZ2VzZXA6Qy5lZGdlU2VwfSk7bGV0IEc9W10sRD1bXTtfLmVhY2gody5ub2RlcygpLEg9Pnt3Lm5vZGUoSCkubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5CUklER0U/Ry5wdXNoKEgpOkQucHVzaChIKX0pO2lmKCFELmxlbmd0aClyZXR1cm57d2lkdGg6MCxoZWlnaHQ6MH07ZGFncmUubGF5b3V0KHcpO2xldCBCPUluZmluaXR5LEk9SW5maW5pdHksTj0tSW5maW5pdHksTz0tSW5maW5pdHk7Xy5lYWNoKEQsSD0+e0g9dy5ub2RlKEgpO3ZhciBLPS41Kkgud2lkdGgsTT1ILngtCks7Sz1ILngrSztCPU08Qj9NOkI7Tj1LPk4/SzpOO0s9LjUqSC5oZWlnaHQ7TT1ILnktSztIPUgueStLO0k9TTxJP006STtPPUg+Tz9IOk99KTtfLmVhY2gody5lZGdlcygpLEg9PntIPXcuZWRnZShIKTtpZighSC5zdHJ1Y3R1cmFsKXt2YXIgSz13Lm5vZGUoSC5tZXRhZWRnZS52KSxNPXcubm9kZShILm1ldGFlZGdlLncpO2lmKDM9PT1ILnBvaW50cy5sZW5ndGgmJkEoSC5wb2ludHMpKXtpZihudWxsIT1LKXt2YXIgTD1LLmV4cGFuZGVkP0sueDp1KEspO0gucG9pbnRzWzBdLng9TH1udWxsIT1NJiYoTD1NLmV4cGFuZGVkP00ueDp1KE0pLEgucG9pbnRzWzJdLng9TCk7SC5wb2ludHM9W0gucG9pbnRzWzBdLEgucG9pbnRzWzFdXX1MPUgucG9pbnRzW0gucG9pbnRzLmxlbmd0aC0yXTtudWxsIT1NJiYoSC5wb2ludHNbSC5wb2ludHMubGVuZ3RoLTFdPXkoTCxNKSk7TT1ILnBvaW50c1sxXTtudWxsIT1LJiYoSC5wb2ludHNbMF09eShNLEspKTtfLmVhY2goSC5wb2ludHMsUT0+e0I9US54PApCP1EueDpCO049US54Pk4/US54Ok47ST1RLnk8ST9RLnk6STtPPVEueT5PP1EueTpPfSl9fSk7Xy5lYWNoKHcubm9kZXMoKSxIPT57SD13Lm5vZGUoSCk7SC54LT1CO0gueS09SX0pO18uZWFjaCh3LmVkZ2VzKCksSD0+e18uZWFjaCh3LmVkZ2UoSCkucG9pbnRzLEs9PntLLngtPUI7Sy55LT1JfSl9KTtyZXR1cm57d2lkdGg6Ti1CLGhlaWdodDpPLUl9fWZ1bmN0aW9uIHAodyl7bGV0IEM9Zi5QQVJBTVMuc3Vic2NlbmUubWV0YTtfLmV4dGVuZCh3LEMpO18uZXh0ZW5kKHcuY29yZUJveCxsKHcuY29yZUdyYXBoLGYuUEFSQU1TLmdyYXBoLm1ldGEpKTt2YXIgRz13Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aD9fLm1heCh3Lmlzb2xhdGVkSW5FeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7dy5pbkV4dHJhY3RCb3gud2lkdGg9bnVsbCE9Rz9HOjA7dy5pbkV4dHJhY3RCb3guaGVpZ2h0PV8ucmVkdWNlKHcuaXNvbGF0ZWRJbkV4dHJhY3QsKEIsSSxOKT0+e049MDxOP0MuZXh0cmFjdFlPZmZzZXQ6CjA7SS54PTA7SS55PUIrTitJLmhlaWdodC8yO3JldHVybiBCK04rSS5oZWlnaHR9LDApO0c9dy5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoP18ubWF4KHcuaXNvbGF0ZWRPdXRFeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7dy5vdXRFeHRyYWN0Qm94LndpZHRoPW51bGwhPUc/RzowO3cub3V0RXh0cmFjdEJveC5oZWlnaHQ9Xy5yZWR1Y2Uody5pc29sYXRlZE91dEV4dHJhY3QsKEIsSSxOKT0+e049MDxOP0MuZXh0cmFjdFlPZmZzZXQ6MDtJLng9MDtJLnk9QitOK0kuaGVpZ2h0LzI7cmV0dXJuIEIrTitJLmhlaWdodH0sMCk7Rz13LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0Lmxlbmd0aD9fLm1heCh3LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LEI9PkIud2lkdGgpLndpZHRoOm51bGw7dy5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoPW51bGwhPUc/RzowO3cubGlicmFyeUZ1bmN0aW9uc0JveC5oZWlnaHQ9Xy5yZWR1Y2Uody5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCwoQixJLApOKT0+e049MDxOP0MuZXh0cmFjdFlPZmZzZXQ6MDtJLng9MDtJLnk9QitOK0kuaGVpZ2h0LzI7cmV0dXJuIEIrTitJLmhlaWdodH0sMCk7Rz0wOzA8dy5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGgmJkcrKzswPHcuaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aCYmRysrOzA8dy5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGgmJkcrKzswPHcuY29yZUdyYXBoLm5vZGVDb3VudCgpJiZHKys7bGV0IEQ9Zi5QQVJBTVMuc3Vic2NlbmUubWV0YS5leHRyYWN0WE9mZnNldDtHPTE+PUc/MDpHKkQ7dy5jb3JlQm94LndpZHRoKz1NYXRoLm1heChmLk1JTl9BVVhfV0lEVEgsdy5pbkV4dHJhY3RCb3gud2lkdGgrdy5vdXRFeHRyYWN0Qm94LndpZHRoKStHK3cubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aCtHO3cuY29yZUJveC5oZWlnaHQ9Qy5sYWJlbEhlaWdodCtNYXRoLm1heCh3LmluRXh0cmFjdEJveC5oZWlnaHQsdy5jb3JlQm94LmhlaWdodCx3LmxpYnJhcnlGdW5jdGlvbnNCb3guaGVpZ2h0LAp3Lm91dEV4dHJhY3RCb3guaGVpZ2h0KTt3LndpZHRoPXcuY29yZUJveC53aWR0aCtDLnBhZGRpbmdMZWZ0K0MucGFkZGluZ1JpZ2h0O3cuaGVpZ2h0PXcucGFkZGluZ1RvcCt3LmNvcmVCb3guaGVpZ2h0K3cucGFkZGluZ0JvdHRvbX1mdW5jdGlvbiBtKHcpe2xldCBDPXcuY29yZUdyYXBoLEc9Zi5QQVJBTVMuc3Vic2NlbmUuc2VyaWVzO18uZXh0ZW5kKHcsRyk7Xy5leHRlbmQody5jb3JlQm94LGwody5jb3JlR3JhcGgsZi5QQVJBTVMuZ3JhcGguc2VyaWVzKSk7Xy5lYWNoKEMubm9kZXMoKSxEPT57Qy5ub2RlKEQpLmV4Y2x1ZGVkPSExfSk7dy53aWR0aD13LmNvcmVCb3gud2lkdGgrRy5wYWRkaW5nTGVmdCtHLnBhZGRpbmdSaWdodDt3LmhlaWdodD13LmNvcmVCb3guaGVpZ2h0K0cucGFkZGluZ1RvcCtHLnBhZGRpbmdCb3R0b219ZnVuY3Rpb24gbih3KXtpZighdy5leHBhbmRlZCl7dmFyIEM9dy5pbkFubm90YXRpb25zLmxpc3QsRz13Lm91dEFubm90YXRpb25zLmxpc3Q7Xy5lYWNoKEMsCks9PnEoSykpO18uZWFjaChHLEs9PnEoSykpO3ZhciBEPWYuUEFSQU1TLmFubm90YXRpb25zLEI9Xy5yZWR1Y2UoQywoSyxNLEwpPT57TD0wPEw/RC55T2Zmc2V0OjA7TS5keD0tKHcuY29yZUJveC53aWR0aCtNLndpZHRoKS8yLUQueE9mZnNldDtNLmR5PUsrTCtNLmhlaWdodC8yO3JldHVybiBLK0wrTS5oZWlnaHR9LDApO18uZWFjaChDLEs9PntLLmR5LT1CLzI7Sy5sYWJlbE9mZnNldD1ELmxhYmVsT2Zmc2V0fSk7dmFyIEk9Xy5yZWR1Y2UoRywoSyxNLEwpPT57TD0wPEw/RC55T2Zmc2V0OjA7TS5keD0ody5jb3JlQm94LndpZHRoK00ud2lkdGgpLzIrRC54T2Zmc2V0O00uZHk9SytMK00uaGVpZ2h0LzI7cmV0dXJuIEsrTCtNLmhlaWdodH0sMCk7Xy5lYWNoKEcsSz0+e0suZHktPUkvMjtLLmxhYmVsT2Zmc2V0PUQubGFiZWxPZmZzZXR9KTt2YXIgTj1NYXRoLm1pbih3LmhlaWdodC8yLXcucmFkaXVzLEIvMik7Tj0wPk4/MDpOO3ZhciBPPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLApDLmxlbmd0aC0xXSkucmFuZ2UoWy1OLE5dKTtfLmVhY2goQywoSyxNKT0+e0sucG9pbnRzPVt7ZHg6Sy5keCtLLndpZHRoLzIsZHk6Sy5keX0se2R4Oi13LmNvcmVCb3gud2lkdGgvMixkeToxPEMubGVuZ3RoP08oTSk6MH1dfSk7Tj1NYXRoLm1pbih3LmhlaWdodC8yLXcucmFkaXVzLEkvMik7Tj0wPk4/MDpOO3ZhciBIPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLEcubGVuZ3RoLTFdKS5yYW5nZShbLU4sTl0pO18uZWFjaChHLChLLE0pPT57Sy5wb2ludHM9W3tkeDp3LmNvcmVCb3gud2lkdGgvMixkeToxPEcubGVuZ3RoP0goTSk6MH0se2R4OksuZHgtSy53aWR0aC8yLGR5OksuZHl9XX0pO3cuaGVpZ2h0PU1hdGgubWF4KHcuaGVpZ2h0LEIsSSl9fWZ1bmN0aW9uIHEodyl7c3dpdGNoKHcuYW5ub3RhdGlvblR5cGUpe2Nhc2UgZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuQ09OU1RBTlQ6Xy5leHRlbmQodyxmLlBBUkFNUy5jb25zdGFudC5zaXplKTticmVhaztjYXNlIGQucmVuZGVyLkFubm90YXRpb25UeXBlLlNIT1JUQ1VUOmlmKHcubm9kZS50eXBlPT09CmQuTm9kZVR5cGUuT1ApXy5leHRlbmQodyxmLlBBUkFNUy5zaG9ydGN1dFNpemUub3ApO2Vsc2UgaWYody5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEpXy5leHRlbmQodyxmLlBBUkFNUy5zaG9ydGN1dFNpemUubWV0YSk7ZWxzZSBpZih3Lm5vZGUudHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTKV8uZXh0ZW5kKHcsZi5QQVJBTVMuc2hvcnRjdXRTaXplLnNlcmllcyk7ZWxzZSB0aHJvdyBFcnJvcigiSW52YWxpZCBub2RlIHR5cGU6ICIrdy5ub2RlLnR5cGUpO2JyZWFrO2Nhc2UgZC5yZW5kZXIuQW5ub3RhdGlvblR5cGUuU1VNTUFSWTpfLmV4dGVuZCh3LGYuUEFSQU1TLmNvbnN0YW50LnNpemUpfX1mdW5jdGlvbiB1KHcpe3JldHVybiB3LmV4cGFuZGVkP3cueDp3Lngtdy53aWR0aC8yKyh3LmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg/dy5pbmJveFdpZHRoOjApK3cuY29yZUJveC53aWR0aC8yfWZ1bmN0aW9uIHgodyxDKXtyZXR1cm4gMTgwKk1hdGguYXRhbigoQy55LXcueSkvKEMueC0Kdy54KSkvTWF0aC5QSX1mdW5jdGlvbiBBKHcpe2xldCBDPXgod1swXSx3WzFdKTtmb3IobGV0IEc9MTtHPHcubGVuZ3RoLTE7RysrKXtsZXQgRD14KHdbR10sd1tHKzFdKTtpZigxPE1hdGguYWJzKEQtQykpcmV0dXJuITE7Qz1EfXJldHVybiEwfWZ1bmN0aW9uIHkodyxDKXtsZXQgRz1DLmV4cGFuZGVkP0MueDp1KEMpLEQ9Qy55O3ZhciBCPXcueC1HO3c9dy55LUQ7bGV0IEk9Qy5leHBhbmRlZD9DLndpZHRoOkMuY29yZUJveC53aWR0aCxOPUMuZXhwYW5kZWQ/Qy5oZWlnaHQ6Qy5jb3JlQm94LmhlaWdodDtNYXRoLmFicyh3KSpJLzI+TWF0aC5hYnMoQikqTi8yPygwPncmJihOPS1OKSxDPTA9PT13PzA6Ti8yKkIvdyxCPU4vMik6KDA+QiYmKEk9LUkpLEM9SS8yLEI9MD09PUI/MDpJLzIqdy9CKTtyZXR1cm57eDpHK0MseTpEK0J9fWYuUEFSQU1TPXthbmltYXRpb246e2R1cmF0aW9uOjI1MH0sZ3JhcGg6e21ldGE6e25vZGVTZXA6NSxyYW5rU2VwOjI1LGVkZ2VTZXA6NX0sc2VyaWVzOntub2RlU2VwOjUsCnJhbmtTZXA6MjUsZWRnZVNlcDo1fSxwYWRkaW5nOntwYWRkaW5nVG9wOjQwLHBhZGRpbmdMZWZ0OjIwfX0sc3Vic2NlbmU6e21ldGE6e3BhZGRpbmdUb3A6MTAscGFkZGluZ0JvdHRvbToxMCxwYWRkaW5nTGVmdDoxMCxwYWRkaW5nUmlnaHQ6MTAsbGFiZWxIZWlnaHQ6MjAsZXh0cmFjdFhPZmZzZXQ6MTUsZXh0cmFjdFlPZmZzZXQ6MjB9LHNlcmllczp7cGFkZGluZ1RvcDoxMCxwYWRkaW5nQm90dG9tOjEwLHBhZGRpbmdMZWZ0OjEwLHBhZGRpbmdSaWdodDoxMCxsYWJlbEhlaWdodDoxMH19LG5vZGVTaXplOnttZXRhOntyYWRpdXM6NSx3aWR0aDo2MCxtYXhMYWJlbFdpZHRoOjUyLGhlaWdodDpkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMSwyMDBdKS5yYW5nZShbMTUsNjBdKS5jbGFtcCghMCksZXhwYW5kQnV0dG9uUmFkaXVzOjN9LG9wOnt3aWR0aDoxNSxoZWlnaHQ6NixyYWRpdXM6MyxsYWJlbE9mZnNldDotOCxtYXhMYWJlbFdpZHRoOjMwfSxzZXJpZXM6e2V4cGFuZGVkOntyYWRpdXM6MTAsCmxhYmVsT2Zmc2V0OjB9LHZlcnRpY2FsOnt3aWR0aDoxNixoZWlnaHQ6MTMsbGFiZWxPZmZzZXQ6LTEzfSxob3Jpem9udGFsOnt3aWR0aDoyNCxoZWlnaHQ6OCxyYWRpdXM6MTAsbGFiZWxPZmZzZXQ6LTEwfX0sYnJpZGdlOnt3aWR0aDoyMCxoZWlnaHQ6MjAscmFkaXVzOjIsbGFiZWxPZmZzZXQ6MH19LHNob3J0Y3V0U2l6ZTp7b3A6e3dpZHRoOjEwLGhlaWdodDo0fSxtZXRhOnt3aWR0aDoxMixoZWlnaHQ6NCxyYWRpdXM6MX0sc2VyaWVzOnt3aWR0aDoxNCxoZWlnaHQ6NH19LGFubm90YXRpb25zOntpbmJveFdpZHRoOjUwLG91dGJveFdpZHRoOjUwLHhPZmZzZXQ6MTAseU9mZnNldDozLGxhYmVsT2Zmc2V0OjIsbWF4TGFiZWxXaWR0aDoxMjB9LGNvbnN0YW50OntzaXplOnt3aWR0aDo0LGhlaWdodDo0fX0sc2VyaWVzOnttYXhTdGFja0NvdW50OjMscGFyYWxsZWxTdGFja09mZnNldFJhdGlvOi4yLHRvd2VyU3RhY2tPZmZzZXRSYXRpbzouNX0sbWluaW1hcDp7c2l6ZToxNTB9fTtmLk1JTl9BVVhfV0lEVEg9CjE0MDtmLmxheW91dFNjZW5lPWg7Zi5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlPXV9KShkLmxheW91dHx8KGQubGF5b3V0PXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9sb2FkZXIuanMKdmFyIFVpPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbihiLGQsZixoKXtyZXR1cm4gbmV3IChmfHwoZj1Qcm9taXNlKSkoZnVuY3Rpb24oayx0KXtmdW5jdGlvbiBsKG4pe3RyeXttKGgubmV4dChuKSl9Y2F0Y2gocSl7dChxKX19ZnVuY3Rpb24gcChuKXt0cnl7bShoWyJ0aHJvdyJdKG4pKX1jYXRjaChxKXt0KHEpfX1mdW5jdGlvbiBtKG4pe24uZG9uZT9rKG4udmFsdWUpOihuZXcgZihmdW5jdGlvbihxKXtxKG4udmFsdWUpfSkpLnRoZW4obCxwKX1tKChoPWguYXBwbHkoYixkfHxbXSkpLm5leHQoKSl9KX07CihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2YuZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaD1mdW5jdGlvbihoLGssdCxsPW5ldyBkLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlcixwPWQuaGllcmFyY2h5LkRlZmF1bHRIaWVyYXJjaHlQYXJhbXMpe2NvbnN0IG09ZC51dGlsLmdldFN1YnRhc2tUcmFja2VyKGgsMjAsIkdyYXBoIiksbj1kLnV0aWwuZ2V0U3VidGFza1RyYWNrZXIoaCw1MCwiTmFtZXNwYWNlIGhpZXJhcmNoeSIpO3JldHVybiBkLnBhcnNlci5mZXRjaEFuZFBhcnNlR3JhcGhEYXRhKGssdCxkLnV0aWwuZ2V0U3VidGFza1RyYWNrZXIoaCwzMCwiRGF0YSIpKS50aGVuKGZ1bmN0aW9uKHEpe2lmKCFxLm5vZGUpdGhyb3cgRXJyb3IoIlRoZSBncmFwaCBpcyBlbXB0eS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gVGVuc29yRmxvdyBjb3VsZCBub3QgdHJhY2UgYW55IGdyYXBoLiBQbGVhc2UgcmVmZXIgdG8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzE5NjEgZm9yIG1vcmUgaW5mb3JtYXRpb24uIik7CnJldHVybiBkLmJ1aWxkKHEsZC5EZWZhdWx0QnVpbGRQYXJhbXMsbSl9LCgpPT57dGhyb3cgRXJyb3IoIk1hbGZvcm1lZCBHcmFwaERlZi4gVGhpcyBjYW4gc29tZXRpbWVzIGJlIGNhdXNlZCBieSBhIGJhZCBuZXR3b3JrIGNvbm5lY3Rpb24gb3IgZGlmZmljdWx0eSByZWNvbmNpbGluZyBtdWx0aXBsZSBHcmFwaERlZnM7IGZvciB0aGUgbGF0dGVyIGNhc2UsIHBsZWFzZSByZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvMTkyOS4iKTt9KS50aGVuKHE9PlVpKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbiooKXtkLm9wLmNoZWNrT3BzRm9yQ29tcGF0aWJpbGl0eShxLGwpO2NvbnN0IHU9eWllbGQgZC5oaWVyYXJjaHkuYnVpbGQocSxwLG4pO3JldHVybntncmFwaDpxLGdyYXBoSGllcmFyY2h5OnV9fSkpLmNhdGNoKHE9PntoLnJlcG9ydEVycm9yKGBHcmFwaCB2aXN1YWxpemF0aW9uIGZhaWxlZC5cblxuJHtxfWAscSk7dGhyb3cgcTsKfSl9fSkoZC5sb2FkZXJ8fChkLmxvYWRlcj17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vbm9kZS5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXsoZnVuY3Rpb24oaCl7ZnVuY3Rpb24gayhaLGJhLGVhKXtpZihiYS5ub2RlLmlzR3JvdXBOb2RlKXtpZihiYS5leHBhbmRlZClyZXR1cm4gZi5idWlsZEdyb3VwKFosYmEsZWEsZi5DbGFzcy5TdWJzY2VuZS5HUk9VUCk7Zi5zZWxlY3RDaGlsZChaLCJnIixmLkNsYXNzLlN1YnNjZW5lLkdST1VQKS5yZW1vdmUoKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiB0KFosYmEpe2xldCBlYT1iYS54LWJhLndpZHRoLzIrYmEucGFkZGluZ0xlZnQ7YmE9YmEueS1iYS5oZWlnaHQvMitiYS5wYWRkaW5nVG9wO1o9Zi5zZWxlY3RDaGlsZChaLCJnIixmLkNsYXNzLlN1YnNjZW5lLkdST1VQKTtmLnRyYW5zbGF0ZShaLGVhLGJhKX1mdW5jdGlvbiBsKFosYmEsZWEpe1o9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosImciLGYuQ2xhc3MuTm9kZS5CVVRUT05fQ09OVEFJTkVSKTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwiY2lyY2xlIixmLkNsYXNzLk5vZGUuQlVUVE9OX0NJUkNMRSk7CmYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLCJwYXRoIixmLkNsYXNzLk5vZGUuRVhQQU5EX0JVVFRPTikuYXR0cigiZCIsIk0wLC0yLjIgVjIuMiBNLTIuMiwwIEgyLjIiKTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwicGF0aCIsZi5DbGFzcy5Ob2RlLkNPTExBUFNFX0JVVFRPTikuYXR0cigiZCIsIk0tMi4yLDAgSDIuMiIpO1oub24oImNsaWNrIixjYT0+e2QzLmV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO2VhLmZpcmUoIm5vZGUtdG9nZ2xlLWV4cGFuZCIse25hbWU6Y2Eubm9kZS5uYW1lfSl9KTtmLnBvc2l0aW9uQnV0dG9uKFosYmEpfWZ1bmN0aW9uIHAoWixiYSxlYSxjYSl7aWYoY2EpWi5hdHRyKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKTtlbHNle3ZhciBrYT1mLmNvbnRleHRtZW51LmdldE1lbnUoZWEsbShiYS5ub2RlLGVhKSk7Wi5vbigiZGJsY2xpY2siLFk9PntlYS5maXJlKCJub2RlLXRvZ2dsZS1leHBhbmQiLHtuYW1lOlkubm9kZS5uYW1lfSl9KS5vbigibW91c2VvdmVyIiwKWT0+e2VhLmlzTm9kZUV4cGFuZGVkKFkpfHxlYS5maXJlKCJub2RlLWhpZ2hsaWdodCIse25hbWU6WS5ub2RlLm5hbWV9KX0pLm9uKCJtb3VzZW91dCIsWT0+e2VhLmlzTm9kZUV4cGFuZGVkKFkpfHxlYS5maXJlKCJub2RlLXVuaGlnaGxpZ2h0Iix7bmFtZTpZLm5vZGUubmFtZX0pfSkub24oImNsaWNrIixZPT57ZDMuZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7ZWEuZmlyZSgibm9kZS1zZWxlY3QiLHtuYW1lOlkubm9kZS5uYW1lfSl9KS5vbigiY29udGV4dG1lbnUiLChZLEVhKT0+e2VhLmZpcmUoIm5vZGUtc2VsZWN0Iix7bmFtZTpZLm5vZGUubmFtZX0pO2thLmNhbGwoWSxFYSl9KX19ZnVuY3Rpb24gbShaLGJhKXtsZXQgZWE9W3t0aXRsZTooKT0+ZC5nZXRJbmNsdWRlTm9kZUJ1dHRvblN0cmluZyhaLmluY2x1ZGUpLGFjdGlvbjooKT0+e2JhLmZpcmUoIm5vZGUtdG9nZ2xlLWV4dHJhY3QiLHtuYW1lOloubmFtZX0pfX1dO2JhLm5vZGVDb250ZXh0TWVudUl0ZW1zJiYoZWE9ZWEuY29uY2F0KGJhLm5vZGVDb250ZXh0TWVudUl0ZW1zKSk7Cm4oWikmJmVhLnB1c2goe3RpdGxlOigpPT54KFopLGFjdGlvbjooKT0+e2JhLmZpcmUoIm5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwIix7bmFtZTpxKFopfSl9fSk7cmV0dXJuIGVhfWZ1bmN0aW9uIG4oWil7cmV0dXJuIG51bGwhPT1xKFopfWZ1bmN0aW9uIHEoWil7cmV0dXJuIFo/Wi50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVM/Wi5uYW1lOloudHlwZT09PWQuTm9kZVR5cGUuT1A/Wi5vd25pbmdTZXJpZXM6bnVsbDpudWxsfWZ1bmN0aW9uIHUoWil7bGV0IGJhPW51bGw7aWYoIVopcmV0dXJuIG51bGw7Wi50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVM/YmE9WjpaLnBhcmVudE5vZGUmJloucGFyZW50Tm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMmJihiYT1aLnBhcmVudE5vZGUpO3JldHVybiBiYX1mdW5jdGlvbiB4KFope3JldHVybiBiLmdyYXBoLmdldEdyb3VwU2VyaWVzTm9kZUJ1dHRvblN0cmluZyhudWxsIT09dShaKT9iLmdyYXBoLlNlcmllc0dyb3VwaW5nVHlwZS5HUk9VUDoKYi5ncmFwaC5TZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUCl9ZnVuY3Rpb24gQShaLGJhLGVhKXt2YXIgY2E9YmEuZGlzcGxheU5hbWU7bGV0IGthPWJhLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuTUVUQSYmIWJhLmV4cGFuZGVkO1o9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosInRleHQiLGYuQ2xhc3MuTm9kZS5MQUJFTCk7bGV0IFk9Wi5ub2RlKCk7WS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKFkpO1ouYXR0cigiZHkiLCIuMzVlbSIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIik7a2EmJihjYS5sZW5ndGg+ZWEubWF4TWV0YW5vZGVMYWJlbExlbmd0aCYmKGNhPWNhLnN1YnN0cigwLGVhLm1heE1ldGFub2RlTGFiZWxMZW5ndGgtMikrIi4uLiIpLGVhPXcoZWEpLFouYXR0cigiZm9udC1zaXplIixlYShjYS5sZW5ndGgpKyJweCIpKTtjYT1aLnRleHQoY2EpO3koY2EsYmEubm9kZS50eXBlLGJhKTtyZXR1cm4gWn1mdW5jdGlvbiB5KFosYmEsZWEpe2xldCBjYT1aLm5vZGUoKTt2YXIga2E9CmNhLmdldENvbXB1dGVkVGV4dExlbmd0aCgpO2xldCBZPWNhLnRleHRDb250ZW50LEVhPW51bGw7c3dpdGNoKGJhKXtjYXNlIGQuTm9kZVR5cGUuTUVUQTplYSYmIWVhLmV4cGFuZGVkJiYoRWE9ZC5sYXlvdXQuUEFSQU1TLm5vZGVTaXplLm1ldGEubWF4TGFiZWxXaWR0aCk7YnJlYWs7Y2FzZSBkLk5vZGVUeXBlLk9QOkVhPWQubGF5b3V0LlBBUkFNUy5ub2RlU2l6ZS5vcC5tYXhMYWJlbFdpZHRoO2JyZWFrO2Nhc2UgLTE6RWE9ZC5sYXlvdXQuUEFSQU1TLmFubm90YXRpb25zLm1heExhYmVsV2lkdGh9aWYoIShudWxsPT09RWF8fGthPD1FYSkpe2ZvcihrYT0xO2NhLmdldFN1YlN0cmluZ0xlbmd0aCgwLGthKTxFYTspa2ErKztiYT1jYS50ZXh0Q29udGVudC5zdWJzdHIoMCxrYSk7ZG8gYmE9YmEuc3Vic3RyKDAsYmEubGVuZ3RoLTEpLGNhLnRleHRDb250ZW50PWJhKyIuLi4iLGthPWNhLmdldENvbXB1dGVkVGV4dExlbmd0aCgpO3doaWxlKGthPkVhJiYwPGJhLmxlbmd0aCk7cmV0dXJuIFouYXBwZW5kKCJ0aXRsZSIpLnRleHQoWSl9fQpmdW5jdGlvbiB3KFope2FhfHwoYWE9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW1oubWF4TWV0YW5vZGVMYWJlbExlbmd0aExhcmdlRm9udCxaLm1heE1ldGFub2RlTGFiZWxMZW5ndGhdKS5yYW5nZShbWi5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemUsWi5taW5NZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemVdKS5jbGFtcCghMCkpO3JldHVybiBhYX1mdW5jdGlvbiBDKFosYmEsZWEsY2Epe2Yuc2VsZWN0Q2hpbGQoWiwidGV4dCIsZi5DbGFzcy5Ob2RlLkxBQkVMKS50cmFuc2l0aW9uKCkuYXR0cigieCIsYmEpLmF0dHIoInkiLGVhK2NhKX1mdW5jdGlvbiBHKFosYmEsZWEpe1o9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosImciLGVhKTtzd2l0Y2goYmEubm9kZS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuT1A6YmE9YmEubm9kZTtpZihfLmlzTnVtYmVyKGJhLmZ1bmN0aW9uSW5wdXRJbmRleCl8fF8uaXNOdW1iZXIoYmEuZnVuY3Rpb25PdXRwdXRJbmRleCkpe2Yuc2VsZWN0T3JDcmVhdGVDaGlsZChaLAoicG9seWdvbiIsZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCk7YnJlYWt9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosImVsbGlwc2UiLGYuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5TRVJJRVM6ZWE9ImFubm90YXRpb24iO2JhLmNvcmVHcmFwaCYmKGVhPWJhLm5vZGUuaGFzTm9uQ29udHJvbEVkZ2VzPyJ2ZXJ0aWNhbCI6Imhvcml6b250YWwiKTtsZXQgY2E9W2YuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVRdO2JhLmlzRmFkZWRPdXQmJmNhLnB1c2goImZhZGVkLWVsbGlwc2UiKTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwidXNlIixjYSkuYXR0cigieGxpbms6aHJlZiIsIiNvcC1zZXJpZXMtIitlYSsiLXN0YW1wIik7Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosInJlY3QiLGYuQ2xhc3MuTm9kZS5DT0xPUl9UQVJHRVQpLmF0dHIoInJ4IixiYS5yYWRpdXMpLmF0dHIoInJ5IixiYS5yYWRpdXMpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5CUklER0U6Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKFosCiJyZWN0IixmLkNsYXNzLk5vZGUuQ09MT1JfVEFSR0VUKS5hdHRyKCJyeCIsYmEucmFkaXVzKS5hdHRyKCJyeSIsYmEucmFkaXVzKTticmVhaztjYXNlIGQuTm9kZVR5cGUuTUVUQTpmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQoWiwicmVjdCIsZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCkuYXR0cigicngiLGJhLnJhZGl1cykuYXR0cigicnkiLGJhLnJhZGl1cyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitiYS5ub2RlLnR5cGUpO31yZXR1cm4gWn1mdW5jdGlvbiBEKFope3N3aXRjaChaLm5vZGUudHlwZSl7Y2FzZSBkLk5vZGVUeXBlLk9QOnJldHVybiBmLkNsYXNzLk9QTk9ERTtjYXNlIGQuTm9kZVR5cGUuTUVUQTpyZXR1cm4gZi5DbGFzcy5NRVRBTk9ERTtjYXNlIGQuTm9kZVR5cGUuU0VSSUVTOnJldHVybiBmLkNsYXNzLlNFUklFU05PREU7Y2FzZSBkLk5vZGVUeXBlLkJSSURHRTpyZXR1cm4gZi5DbGFzcy5CUklER0VOT0RFO2Nhc2UgZC5Ob2RlVHlwZS5FTExJUFNJUzpyZXR1cm4gZi5DbGFzcy5FTExJUFNJU05PREV9dGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCBub2RlIHR5cGU6ICIrCloubm9kZS50eXBlKTt9ZnVuY3Rpb24gQihaLGJhKXt2YXIgZWE9Zi5zZWxlY3RDaGlsZChaLCJnIixmLkNsYXNzLk5vZGUuU0hBUEUpO2xldCBjYT1kLmxheW91dC5jb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlKGJhKTtzd2l0Y2goYmEubm9kZS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuT1A6e2NvbnN0IGthPWJhLm5vZGU7Xy5pc051bWJlcihrYS5mdW5jdGlvbklucHV0SW5kZXgpfHxfLmlzTnVtYmVyKGthLmZ1bmN0aW9uT3V0cHV0SW5kZXgpPyhlYT1mLnNlbGVjdENoaWxkKGVhLCJwb2x5Z29uIiksZi5wb3NpdGlvblRyaWFuZ2xlKGVhLGJhLngsYmEueSxiYS5jb3JlQm94LndpZHRoLGJhLmNvcmVCb3guaGVpZ2h0KSk6KGVhPWYuc2VsZWN0Q2hpbGQoZWEsImVsbGlwc2UiKSxmLnBvc2l0aW9uRWxsaXBzZShlYSxjYSxiYS55LGJhLmNvcmVCb3gud2lkdGgsYmEuY29yZUJveC5oZWlnaHQpKTtDKFosY2EsYmEueSxiYS5sYWJlbE9mZnNldCk7YnJlYWt9Y2FzZSBkLk5vZGVUeXBlLk1FVEE6ZWE9CmVhLnNlbGVjdEFsbCgicmVjdCIpO2JhLmV4cGFuZGVkPyhmLnBvc2l0aW9uUmVjdChlYSxiYS54LGJhLnksYmEud2lkdGgsYmEuaGVpZ2h0KSx0KFosYmEpLEMoWixjYSxiYS55LC1iYS5oZWlnaHQvMitiYS5sYWJlbEhlaWdodC8yKSk6KGYucG9zaXRpb25SZWN0KGVhLGNhLGJhLnksYmEuY29yZUJveC53aWR0aCxiYS5jb3JlQm94LmhlaWdodCksQyhaLGNhLGJhLnksMCkpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5TRVJJRVM6ZWE9Zi5zZWxlY3RDaGlsZChlYSwidXNlIik7YmEuZXhwYW5kZWQ/KGYucG9zaXRpb25SZWN0KGVhLGJhLngsYmEueSxiYS53aWR0aCxiYS5oZWlnaHQpLHQoWixiYSksQyhaLGNhLGJhLnksLWJhLmhlaWdodC8yK2JhLmxhYmVsSGVpZ2h0LzIpKTooZi5wb3NpdGlvblJlY3QoZWEsY2EsYmEueSxiYS5jb3JlQm94LndpZHRoLGJhLmNvcmVCb3guaGVpZ2h0KSxDKFosY2EsYmEueSxiYS5sYWJlbE9mZnNldCkpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5CUklER0U6Wj0KZi5zZWxlY3RDaGlsZChlYSwicmVjdCIpO2YucG9zaXRpb25SZWN0KFosYmEueCxiYS55LGJhLndpZHRoLGJhLmhlaWdodCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitiYS5ub2RlLnR5cGUpO319ZnVuY3Rpb24gSShaLGJhLGVhKXtsZXQgY2E9Yi5ncmFwaC51dGlsLmVzY2FwZVF1ZXJ5U2VsZWN0b3IoWik7aWYoIWVhKXJldHVybmB1cmwoIyR7Y2F9KWA7ZWE9ZDMuc2VsZWN0KGVhKTtsZXQga2E9ZWEuc2VsZWN0KCJkZWZzI19ncmFwaC1ncmFkaWVudHMiKTtrYS5lbXB0eSgpJiYoa2E9ZWEuYXBwZW5kKCJkZWZzIikuYXR0cigiaWQiLCJfZ3JhcGgtZ3JhZGllbnRzIikpO2xldCBZPWthLnNlbGVjdCgibGluZWFyR3JhZGllbnQjIitjYSk7aWYoWS5lbXB0eSgpKXtZPWthLmFwcGVuZCgibGluZWFyR3JhZGllbnQiKS5hdHRyKCJpZCIsWik7WS5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTtsZXQgRWE9MDtfLmVhY2goYmEsdmE9PntsZXQgeGE9CnZhLmNvbG9yO1kuYXBwZW5kKCJzdG9wIikuYXR0cigib2Zmc2V0IixFYSkuYXR0cigic3RvcC1jb2xvciIseGEpO1kuYXBwZW5kKCJzdG9wIikuYXR0cigib2Zmc2V0IixFYSt2YS5wcm9wb3J0aW9uKS5hdHRyKCJzdG9wLWNvbG9yIix4YSk7RWErPXZhLnByb3BvcnRpb259KX1yZXR1cm5gdXJsKCMke2NhfSlgfWZ1bmN0aW9uIE4oWixiYSxlYSxjYSxrYSl7bGV0IFk9ZC5yZW5kZXIuTWV0YW5vZGVDb2xvcnM7c3dpdGNoKGJhKXtjYXNlIGxhLlNUUlVDVFVSRTpyZXR1cm4gZWEubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBPyhiYT1lYS5ub2RlLnRlbXBsYXRlSWQsbnVsbD09PWJhP1kuVU5LTk9XTjpZLlNUUlVDVFVSRV9QQUxFVFRFKFooYmEpLGNhKSk6ZWEubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVM/Y2E/WS5FWFBBTkRFRF9DT0xPUjoid2hpdGUiOmVhLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuQlJJREdFP2VhLnN0cnVjdHVyYWw/IiNmMGUiOmVhLm5vZGUuaW5ib3VuZD8KIiMwZWYiOiIjZmUwIjpfLmlzTnVtYmVyKGVhLm5vZGUuZnVuY3Rpb25JbnB1dEluZGV4KT8iIzc5NTU0OCI6Xy5pc051bWJlcihlYS5ub2RlLmZ1bmN0aW9uT3V0cHV0SW5kZXgpPyIjMDA5Njg4Ijoid2hpdGUiO2Nhc2UgbGEuREVWSUNFOnJldHVybiBudWxsPT1lYS5kZXZpY2VDb2xvcnM/WS5VTktOT1dOOmNhP1kuRVhQQU5ERURfQ09MT1I6SSgiZGV2aWNlLSIrZWEubm9kZS5uYW1lLGVhLmRldmljZUNvbG9ycyxrYSk7Y2FzZSBsYS5YTEFfQ0xVU1RFUjpyZXR1cm4gbnVsbD09ZWEueGxhQ2x1c3RlckNvbG9ycz9ZLlVOS05PV046Y2E/WS5FWFBBTkRFRF9DT0xPUjpJKCJ4bGEtIitlYS5ub2RlLm5hbWUsZWEueGxhQ2x1c3RlckNvbG9ycyxrYSk7Y2FzZSBsYS5DT01QVVRFX1RJTUU6cmV0dXJuIGNhP1kuRVhQQU5ERURfQ09MT1I6ZWEuY29tcHV0ZVRpbWVDb2xvcnx8WS5VTktOT1dOO2Nhc2UgbGEuTUVNT1JZOnJldHVybiBjYT9ZLkVYUEFOREVEX0NPTE9SOmVhLm1lbW9yeUNvbG9yfHwKWS5VTktOT1dOO2Nhc2UgbGEuT1BfQ09NUEFUSUJJTElUWTpyZXR1cm4gbnVsbD09ZWEuY29tcGF0aWJpbGl0eUNvbG9ycz9ZLlVOS05PV046Y2E/WS5FWFBBTkRFRF9DT0xPUjpJKCJvcC1jb21wYXQtIitlYS5ub2RlLm5hbWUsZWEuY29tcGF0aWJpbGl0eUNvbG9ycyxrYSk7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5rbm93biBjYXNlIHRvIGNvbG9yIG5vZGVzIGJ5Iik7fX1mdW5jdGlvbiBPKFosYmEsZWEsY2Epe2NhPWNhfHxmLkNsYXNzLk5vZGUuU0hBUEU7bGV0IGthPWVhLmlzTm9kZVNlbGVjdGVkKGJhLm5vZGUubmFtZSksWT1iYS5pc0luRXh0cmFjdHx8YmEuaXNPdXRFeHRyYWN0fHxiYS5pc0xpYnJhcnlGdW5jdGlvbixFYT1iYS5leHBhbmRlZCYmY2EhPT1mLkNsYXNzLkFubm90YXRpb24uTk9ERSx2YT1iYS5pc0ZhZGVkT3V0O1ouY2xhc3NlZCgiaGlnaGxpZ2h0ZWQiLGVhLmlzTm9kZUhpZ2hsaWdodGVkKGJhLm5vZGUubmFtZSkpO1ouY2xhc3NlZCgic2VsZWN0ZWQiLGthKTsKWi5jbGFzc2VkKCJleHRyYWN0IixZKTtaLmNsYXNzZWQoImV4cGFuZGVkIixFYSk7Wi5jbGFzc2VkKCJmYWRlZCIsdmEpO1o9Wi5zZWxlY3QoIi4iK2NhKyIgLiIrZi5DbGFzcy5Ob2RlLkNPTE9SX1RBUkdFVCk7YmE9TihlYS50ZW1wbGF0ZUluZGV4LGxhW2VhLmNvbG9yQnkudG9VcHBlckNhc2UoKV0sYmEsRWEsZWEuZ2V0R3JhcGhTdmdSb290KCkpO1ouc3R5bGUoImZpbGwiLGJhKTtaLnN0eWxlKCJzdHJva2UiLGthP251bGw6SChiYSkpfWZ1bmN0aW9uIEgoWil7cmV0dXJuInVybCI9PT1aLnN1YnN0cmluZygwLDMpP2QucmVuZGVyLk1ldGFub2RlQ29sb3JzLkdSQURJRU5UX09VVExJTkU6ZDMucmdiKFopLmRhcmtlcigpLnRvU3RyaW5nKCl9ZnVuY3Rpb24gSyhaLGJhKXtsZXQgZWE9W107Wj1iYS5nZXROb2RlQnlOYW1lKFopO2lmKFogaW5zdGFuY2VvZiBiLmdyYXBoLk9wTm9kZUltcGwpcmV0dXJuW1pdLmNvbmNhdChaLmluRW1iZWRkaW5ncyk7Wj1aLm1ldGFncmFwaC5ub2RlcygpOwpfLmVhY2goWixmdW5jdGlvbihjYSl7ZWE9ZWEuY29uY2F0KEsoY2EsYmEpKX0pO3JldHVybiBlYX1mdW5jdGlvbiBNKFosYmEsZWEsY2Epe2lmKGNhW2VhLm5hbWVdKXJldHVybiBjYTtjYVtlYS5uYW1lXT0hMDt2YXIga2E9ZWEuaW5wdXRzO2xldCBZPVgoYmEsZWEpO2QzLnNlbGVjdChaKS5zZWxlY3QoYC5ub2RlW2RhdGEtbmFtZT0iJHtZLm5hbWV9Il1gKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQiLCEwKTtsZXQgRWE9e307Xy5lYWNoKGthLGZ1bmN0aW9uKEFhKXtBYT1iYS5nZXROb2RlQnlOYW1lKEFhLm5hbWUpO2lmKHZvaWQgMCE9PUFhKXtBYSBpbnN0YW5jZW9mIGQuTWV0YW5vZGVJbXBsJiYoQWE9Yi5ncmFwaC5nZXRTdHJpY3ROYW1lKEFhLm5hbWUpLEFhPWJhLmdldE5vZGVCeU5hbWUoQWEpKTt2YXIgRmE9WChiYSxBYSkseWE9RWFbRmEubmFtZV07eWE/eWEub3BOb2Rlcy5wdXNoKEFhKTpFYVtGYS5uYW1lXT17dmlzaWJsZVBhcmVudDpGYSxvcE5vZGVzOltBYV19fX0pOwpsZXQgdmE9e30seGE9W1ldO3ZhW1kubmFtZV09e3RyYWNlZDohMSxpbmRleDowLGNvbm5lY3Rpb25FbmRwb2ludHM6W119O2VhPVk7Zm9yKGthPTE7ZWEubmFtZSE9PWIuZ3JhcGguUk9PVF9OQU1FO2thKyspZWE9ZWEucGFyZW50Tm9kZSx2YVtlYS5uYW1lXT17dHJhY2VkOiExLGluZGV4OmthLGNvbm5lY3Rpb25FbmRwb2ludHM6W119LHhhW2thXT1lYTtfLmZvck93bihFYSxmdW5jdGlvbihBYSl7bGV0IEZhPUFhLnZpc2libGVQYXJlbnQ7Xy5lYWNoKEFhLm9wTm9kZXMsZnVuY3Rpb24oeWEpe2NhPU0oWixiYSx5YSxjYSl9KTtGYS5uYW1lIT09WS5uYW1lJiZMKFosRmEsdmEseGEpfSk7cmV0dXJuIGNhfWZ1bmN0aW9uIEwoWixiYSxlYSxjYSl7dmFyIGthPWJhLFk9YmE7Zm9yKGJhPVtdOyFlYVtrYS5uYW1lXTspWS5uYW1lIT09a2EubmFtZSYmYmEucHVzaChbWSxrYV0pLFk9a2Esa2E9a2EucGFyZW50Tm9kZTtlYT1lYVtrYS5uYW1lXS5pbmRleDtsZXQgRWE9Y2FbTWF0aC5tYXgoZWEtCjEsMCldLm5hbWU7WT1rYT1ZLm5hbWU7Y29uc3QgdmE9ZDMuc2VsZWN0KFopO3ZhLnNlbGVjdEFsbChgW2RhdGEtZWRnZT0iJHtZfS0tJHtFYX0iXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCk7Xy5lYWNoKGJhLGZ1bmN0aW9uKHhhKXt2YS5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7eGFbMF0ubmFtZX0tLSR7RWF9YCtgfn4ke3hhWzFdLm5hbWV9fn5PVVQiXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9KTtmb3IoWj0xO1o8ZWE7WisrKXZhLnNlbGVjdEFsbChgW2RhdGEtZWRnZT0iJHtrYX1+fiR7Y2FbWl0ubmFtZX1gK2B+fklOLS0ke2NhW1otMV0ubmFtZX0iXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9ZnVuY3Rpb24gUShaLGJhKXtsZXQgZWE9e307Xy5lYWNoKGJhLGZ1bmN0aW9uKGNhKXtjYT1aLmdldE5vZGVCeU5hbWUoY2EpO2NhPVgoWixjYSk7ZWFbY2EubmFtZV09Y2F9KTtyZXR1cm4gZWF9ZnVuY3Rpb24gVChaLApiYSl7Xy5mb3JPd24oYmEsZnVuY3Rpb24oZWEpe2Zvcig7ZWEubmFtZSE9PWIuZ3JhcGguUk9PVF9OQU1FOyl7Y29uc3QgY2E9ZDMuc2VsZWN0KFopLnNlbGVjdChgLm5vZGVbZGF0YS1uYW1lPSIke2VhLm5hbWV9Il1gKTshY2Eubm9kZXMoKS5sZW5ndGh8fGNhLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodCIpfHxjYS5jbGFzc2VkKCJzZWxlY3RlZCIpfHxjYS5jbGFzc2VkKCJvcCIpfHxjYS5jbGFzc2VkKCJpbnB1dC1wYXJlbnQiLCEwKTtlYT1lYS5wYXJlbnROb2RlfX0pfWZ1bmN0aW9uIFgoWixiYSl7bGV0IGVhPSExLGNhPWJhO2Zvcig7IWVhOylpZihiYT1jYSxjYT1iYS5wYXJlbnROb2RlLHZvaWQgMD09PWNhKWVhPSEwO2Vsc2V7bGV0IGthPVouZ2V0UmVuZGVyTm9kZUJ5TmFtZShjYS5uYW1lKTtrYSYmKGthLmV4cGFuZGVkfHxjYSBpbnN0YW5jZW9mIGQuT3BOb2RlSW1wbCkmJihlYT0hMCl9cmV0dXJuIGJhfWguYnVpbGRHcm91cD1mdW5jdGlvbihaLGJhLGVhKXtaPWYuc2VsZWN0T3JDcmVhdGVDaGlsZChaLAoiZyIsZi5DbGFzcy5Ob2RlLkNPTlRBSU5FUikuc2VsZWN0QWxsKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc30pLmRhdGEoYmEsY2E9PmNhLm5vZGUubmFtZSsiOiIrY2Eubm9kZS50eXBlKTtaLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiZGF0YS1uYW1lIixjYT0+Y2Eubm9kZS5uYW1lKS5lYWNoKGZ1bmN0aW9uKGNhKXtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpO2VhLmFkZE5vZGVHcm91cChjYS5ub2RlLm5hbWUsa2EpfSkubWVyZ2UoWikuYXR0cigiY2xhc3MiLGNhPT5mLkNsYXNzLk5vZGUuR1JPVVArIiAiK0QoY2EpKS5lYWNoKGZ1bmN0aW9uKGNhKXtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpO3ZhciBZPWYuc2VsZWN0T3JDcmVhdGVDaGlsZChrYSwiZyIsZi5DbGFzcy5Bbm5vdGF0aW9uLklOQk9YKTtmLmFubm90YXRpb24uYnVpbGRHcm91cChZLGNhLmluQW5ub3RhdGlvbnMsY2EsZWEpO1k9Zi5zZWxlY3RPckNyZWF0ZUNoaWxkKGthLCJnIixmLkNsYXNzLkFubm90YXRpb24uT1VUQk9YKTsKZi5hbm5vdGF0aW9uLmJ1aWxkR3JvdXAoWSxjYS5vdXRBbm5vdGF0aW9ucyxjYSxlYSk7WT1HKGthLGNhLGYuQ2xhc3MuTm9kZS5TSEFQRSk7Y2Eubm9kZS5pc0dyb3VwTm9kZSYmbChZLGNhLGVhKTtwKFksY2EsZWEpO2soa2EsY2EsZWEpO1k9QShrYSxjYSxlYSk7cChZLGNhLGVhLGNhLm5vZGUudHlwZT09PWQuTm9kZVR5cGUuTUVUQSk7TyhrYSxjYSxlYSk7QihrYSxjYSl9KTtaLmV4aXQoKS5lYWNoKGZ1bmN0aW9uKGNhKXtlYS5yZW1vdmVOb2RlR3JvdXAoY2Eubm9kZS5uYW1lKTtsZXQga2E9ZDMuc2VsZWN0KHRoaXMpOzA8Y2EuaW5Bbm5vdGF0aW9ucy5saXN0Lmxlbmd0aCYma2Euc2VsZWN0KCIuIitmLkNsYXNzLkFubm90YXRpb24uSU5CT1gpLnNlbGVjdEFsbCgiLiIrZi5DbGFzcy5Bbm5vdGF0aW9uLkdST1VQKS5lYWNoKFk9PntlYS5yZW1vdmVBbm5vdGF0aW9uR3JvdXAoWSxjYSl9KTswPGNhLm91dEFubm90YXRpb25zLmxpc3QubGVuZ3RoJiZrYS5zZWxlY3QoIi4iK2YuQ2xhc3MuQW5ub3RhdGlvbi5PVVRCT1gpLnNlbGVjdEFsbCgiLiIrCmYuQ2xhc3MuQW5ub3RhdGlvbi5HUk9VUCkuZWFjaChZPT57ZWEucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKFksY2EpfSl9KS5yZW1vdmUoKTtyZXR1cm4gWn07aC5nZXRDb250ZXh0TWVudT1tO2guY2FuQmVJblNlcmllcz1uO2guZ2V0U2VyaWVzTmFtZT1xO2guZ2V0R3JvdXBTZXR0aW5nTGFiZWw9eDtoLmVuZm9yY2VMYWJlbFdpZHRoPXk7bGV0IGFhPW51bGw7aC5idWlsZFNoYXBlPUc7aC5ub2RlQ2xhc3M9RDtsZXQgbGE7KGZ1bmN0aW9uKFope1pbWi5TVFJVQ1RVUkU9MF09IlNUUlVDVFVSRSI7WltaLkRFVklDRT0xXT0iREVWSUNFIjtaW1ouWExBX0NMVVNURVI9Ml09IlhMQV9DTFVTVEVSIjtaW1ouQ09NUFVURV9USU1FPTNdPSJDT01QVVRFX1RJTUUiO1pbWi5NRU1PUlk9NF09Ik1FTU9SWSI7WltaLk9QX0NPTVBBVElCSUxJVFk9NV09Ik9QX0NPTVBBVElCSUxJVFkifSkobGE9aC5Db2xvckJ5fHwoaC5Db2xvckJ5PXt9KSk7aC5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zPWZ1bmN0aW9uKFope2QzLnNlbGVjdChaKS5zZWxlY3QoImRlZnMjX2dyYXBoLWdyYWRpZW50cyIpLnJlbW92ZSgpfTsKaC5nZXRGaWxsRm9yTm9kZT1OO2guc3R5bGl6ZT1PO2guZ2V0U3Ryb2tlRm9yRmlsbD1IO2gudXBkYXRlSW5wdXRUcmFjZT1mdW5jdGlvbihaLGJhLGVhLGNhKXtjb25zdCBrYT1kMy5zZWxlY3QoWik7a2Euc2VsZWN0QWxsKCIuaW5wdXQtaGlnaGxpZ2h0IikuY2xhc3NlZCgiaW5wdXQtaGlnaGxpZ2h0IiwhMSk7a2Euc2VsZWN0QWxsKCIubm9uLWlucHV0IikuY2xhc3NlZCgibm9uLWlucHV0IiwhMSk7a2Euc2VsZWN0QWxsKCIuaW5wdXQtcGFyZW50IikuY2xhc3NlZCgiaW5wdXQtcGFyZW50IiwhMSk7a2Euc2VsZWN0QWxsKCIuaW5wdXQtY2hpbGQiKS5jbGFzc2VkKCJpbnB1dC1jaGlsZCIsITEpO2thLnNlbGVjdEFsbCgiLmlucHV0LWVkZ2UtaGlnaGxpZ2h0IikuY2xhc3NlZCgiaW5wdXQtZWRnZS1oaWdobGlnaHQiLCExKTtrYS5zZWxlY3RBbGwoIi5ub24taW5wdXQtZWRnZS1oaWdobGlnaHQiKS5jbGFzc2VkKCJub24taW5wdXQtZWRnZS1oaWdobGlnaHQiLCExKTtrYS5zZWxlY3RBbGwoIi5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQiKS5jbGFzc2VkKCJpbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQiLAohMSk7aWYoYmEmJmNhJiZlYSl7ZWE9SyhlYSxiYSk7dmFyIFk9e307Xy5lYWNoKGVhLGZ1bmN0aW9uKEVhKXtZPU0oWixiYSxFYSxZKX0pO2VhPU9iamVjdC5rZXlzKFkpO2VhPVEoYmEsZWEpO1QoWixlYSk7a2Euc2VsZWN0QWxsKCJnLm5vZGU6bm90KC5zZWxlY3RlZCk6bm90KC5pbnB1dC1oaWdobGlnaHQpOm5vdCguaW5wdXQtcGFyZW50KTpub3QoLmlucHV0LWNoaWxkcmVuKSIpLmNsYXNzZWQoIm5vbi1pbnB1dCIsITApLmVhY2goZnVuY3Rpb24oRWEpe2thLnNlbGVjdEFsbChgW2RhdGEtbmFtZT0iJHtFYS5ub2RlLm5hbWV9Il1gKS5jbGFzc2VkKCJub24taW5wdXQiLCEwKX0pO2thLnNlbGVjdEFsbCgiZy5lZGdlOm5vdCguaW5wdXQtZWRnZS1oaWdobGlnaHQpIikuY2xhc3NlZCgibm9uLWlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9fTtoLmdldFZpc2libGVQYXJlbnQ9WH0pKGYubm9kZXx8KGYubm9kZT17fSkpfSkoZC5zY2VuZXx8KGQuc2NlbmU9e30pKX0pKGIuZ3JhcGh8fAooYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9vcC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtjbGFzcyBoe2lzTm90VHB1T3Aoayl7cmV0dXJuLTEhPWsudG9Mb3dlckNhc2UoKS5zZWFyY2goImNwdToiKXx8LTEhPWsudG9Mb3dlckNhc2UoKS5zZWFyY2goImdwdToiKT8hMDotMT09ay50b0xvd2VyQ2FzZSgpLnNlYXJjaCgidHB1Iil9b3BWYWxpZChrKXtyZXR1cm4gMD09ay5uYW1lLnNlYXJjaChkLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpfHwhay5vcHx8ay5kZXZpY2UmJnRoaXMuaXNOb3RUcHVPcChrLmRldmljZSl8fGsuZGV2aWNlJiYtMSE9ay5kZXZpY2Uuc2VhcmNoKCJUUFVfU1lTVEVNIik/ITA6Xy5pbmNsdWRlcyhoLldISVRFTElTVCxrLm9wKX19aC5XSElURUxJU1Q9IkFicyBBY29zIEFjb3NoIEFkZCBBZGROIEFkanVzdENvbnRyYXN0djIgQWRqdXN0SHVlIEFkanVzdFNhdHVyYXRpb24gQWxsIEFuZ2xlIEFueSBBcHByb3hpbWF0ZUVxdWFsIEFyZ01heCBBcmdNaW4gQXNpbiBBc2luaCBBc3NlcnQgQXNzaWduQWRkVmFyaWFibGVPcCBBc3NpZ25TdWJWYXJpYWJsZU9wIEFzc2lnblZhcmlhYmxlT3AgQXRhbiBBdGFuMiBBdGFuaCBBdmdQb29sIEF2Z1Bvb2wzRCBBdmdQb29sM0RHcmFkIEF2Z1Bvb2xHcmFkIEJhdGNoTWF0TXVsIEJhdGNoVG9TcGFjZSBCYXRjaFRvU3BhY2VORCBCaWFzQWRkIEJpYXNBZGRHcmFkIEJpYXNBZGRWMSBCaXRjYXN0IEJpdHdpc2VBbmQgQml0d2lzZU9yIEJpdHdpc2VYb3IgQnJvYWRjYXN0QXJncyBCcm9hZGNhc3RHcmFkaWVudEFyZ3MgQnVja2V0aXplIENhc3QgQ2VpbCBDaGVja051bWVyaWNzIENob2xlc2t5IENsaXBCeVZhbHVlIENvbXBsZXggQ29tcGxleEFicyBDb25jYXQgQ29uY2F0T2Zmc2V0IENvbmNhdFYyIENvbmogQ29uanVnYXRlVHJhbnNwb3NlIENvbnN0IENvbnRyb2xUcmlnZ2VyIENvbnYyRCBDb252MkRCYWNrcHJvcEZpbHRlciBDb252MkRCYWNrcHJvcElucHV0IENvbnYzRCBDb252M0RCYWNrcHJvcEZpbHRlclYyIENvbnYzREJhY2twcm9wSW5wdXRWMiBDb3MgQ29zaCBDcm9zcyBDcm9zc1JlcGxpY2FTdW0gQ3VtcHJvZCBDdW1zdW0gRGVwdGhUb1NwYWNlIERlcHRod2lzZUNvbnYyZE5hdGl2ZSBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0IERpYWcgRGlhZ1BhcnQgRGlnYW1tYSBEaXYgRHluYW1pY1N0aXRjaCBFbHUgRWx1R3JhZCBFbXB0eSBFcXVhbCBFcmYgRXJmYyBFeHAgRXhwYW5kRGltcyBFeHBtMSBFeHRyYWN0SW1hZ2VQYXRjaGVzIEZGVCBGRlQyRCBGRlQzRCBGYWtlUXVhbnRXaXRoTWluTWF4QXJncyBGYWtlUXVhbnRXaXRoTWluTWF4QXJnc0dyYWRpZW50IEZha2VRdWFudFdpdGhNaW5NYXhWYXJzIEZha2VRdWFudFdpdGhNaW5NYXhWYXJzR3JhZGllbnQgRmlsbCBGbG9vciBGbG9vckRpdiBGbG9vck1vZCBGdXNlZEJhdGNoTm9ybSBGdXNlZEJhdGNoTm9ybUdyYWQgRnVzZWRCYXRjaE5vcm1HcmFkVjIgRnVzZWRCYXRjaE5vcm1WMiBHYXRoZXIgR2F0aGVyTmQgR2F0aGVyVjIgR2V0SXRlbSBHcmVhdGVyIEdyZWF0ZXJFcXVhbCBIU1ZUb1JHQiBJRkZUIElGRlQyRCBJRkZUM0QgSVJGRlQgSVJGRlQyRCBJUkZGVDNEIElkZW50aXR5IElkZW50aXR5TiBJZiBJbWFnIEluZmVlZERlcXVldWUgSW5mZWVkRGVxdWV1ZVR1cGxlIElucGxhY2VBZGQgSW5wbGFjZVVwZGF0ZSBJbnYgSW52ZXJ0IEludmVydFBlcm11dGF0aW9uIElzRmluaXRlIElzSW5mIElzTmFuIEwyTG9zcyBMUk4gTFJOR3JhZCBMZWZ0U2hpZnQgTGVzcyBMZXNzRXF1YWwgTGdhbW1hIExpblNwYWNlIExpc3REaWZmIExvZyBMb2cxcCBMb2dTb2Z0bWF4IExvZ2ljYWxBbmQgTG9naWNhbE5vdCBMb2dpY2FsT3IgTWF0TXVsIE1hdHJpeEJhbmRQYXJ0IE1hdHJpeERpYWcgTWF0cml4RGlhZ1BhcnQgTWF0cml4U2V0RGlhZyBNYXRyaXhUcmlhbmd1bGFyU29sdmUgTWF4IE1heFBvb2wgTWF4UG9vbDNEIE1heFBvb2wzREdyYWQgTWF4UG9vbDNER3JhZEdyYWQgTWF4UG9vbEdyYWQgTWF4UG9vbEdyYWRHcmFkIE1heFBvb2xHcmFkR3JhZFYyIE1heFBvb2xHcmFkVjIgTWF4UG9vbFYyIE1heGltdW0gTWVhbiBNaW4gTWluaW11bSBNaXJyb3JQYWQgTW9kIE11bCBNdWx0aW5vbWlhbCBOZWcgTm9PcCBOb25NYXhTdXBwcmVzc2lvblY0IE5vdEVxdWFsIE9uZUhvdCBPbmVzTGlrZSBPdXRmZWVkRW5xdWV1ZSBPdXRmZWVkRW5xdWV1ZVR1cGxlIFBhY2sgUGFkIFBhZFYyIFBhcmFsbGVsRHluYW1pY1N0aXRjaCBQbGFjZWhvbGRlcldpdGhEZWZhdWx0IFBvdyBQcmV2ZW50R3JhZGllbnQgUHJvZCBRciBRdWFudGl6ZUFuZERlcXVhbnRpemVWMiBRdWFudGl6ZUFuZERlcXVhbnRpemVWMyBSRkZUIFJGRlQyRCBSRkZUM0QgUkdCVG9IU1YgUmFuZG9tU2h1ZmZsZSBSYW5kb21TdGFuZGFyZE5vcm1hbCBSYW5kb21Vbmlmb3JtIFJhbmRvbVVuaWZvcm1JbnQgUmFuZ2UgUmFuayBSZWFkVmFyaWFibGVPcCBSZWFsIFJlYWxEaXYgUmVjaXByb2NhbCBSZWNpcHJvY2FsR3JhZCBSZWN2VFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMgUmVsdSBSZWx1NiBSZWx1NkdyYWQgUmVsdUdyYWQgUmVzaGFwZSBSZXNpemVCaWxpbmVhciBSZXNpemVCaWxpbmVhckdyYWQgUmVzb3VyY2VBcHBseUFkYU1heCBSZXNvdXJjZUFwcGx5QWRhZGVsdGEgUmVzb3VyY2VBcHBseUFkYWdyYWQgUmVzb3VyY2VBcHBseUFkYWdyYWREQSBSZXNvdXJjZUFwcGx5QWRhbSBSZXNvdXJjZUFwcGx5QWRkU2lnbiBSZXNvdXJjZUFwcGx5Q2VudGVyZWRSTVNQcm9wIFJlc291cmNlQXBwbHlGdHJsIFJlc291cmNlQXBwbHlGdHJsVjIgUmVzb3VyY2VBcHBseUdyYWRpZW50RGVzY2VudCBSZXNvdXJjZUFwcGx5TW9tZW50dW0gUmVzb3VyY2VBcHBseVBvd2VyU2lnbiBSZXNvdXJjZUFwcGx5UHJveGltYWxBZGFncmFkIFJlc291cmNlQXBwbHlQcm94aW1hbEdyYWRpZW50RGVzY2VudCBSZXNvdXJjZUFwcGx5Uk1TUHJvcCBSZXNvdXJjZUdhdGhlciBSZXNvdXJjZVNjYXR0ZXJBZGQgUmVzb3VyY2VTY2F0dGVyRGl2IFJlc291cmNlU2NhdHRlck1heCBSZXNvdXJjZVNjYXR0ZXJNaW4gUmVzb3VyY2VTY2F0dGVyTXVsIFJlc291cmNlU2NhdHRlck5kQWRkIFJlc291cmNlU2NhdHRlck5kVXBkYXRlIFJlc291cmNlU2NhdHRlclN1YiBSZXNvdXJjZVNjYXR0ZXJVcGRhdGUgUmVzb3VyY2VTdHJpZGVkU2xpY2VBc3NpZ24gUmV2ZXJzZSBSZXZlcnNlU2VxdWVuY2UgUmV2ZXJzZVYyIFJpZ2h0U2hpZnQgUmludCBSb3VuZCBSc3FydCBSc3FydEdyYWQgU2NhdHRlck5kIFNlbGVjdCBTZWx1IFNlbHVHcmFkIFNlbmRUUFVFbWJlZGRpbmdHcmFkaWVudHMgU2hhcGUgU2hhcGVOIFNpZ21vaWQgU2lnbW9pZEdyYWQgU2lnbiBTaW4gU2luaCBTaXplIFNsaWNlIFNuYXBzaG90IFNvZnRtYXggU29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHMgU29mdHBsdXMgU29mdHBsdXNHcmFkIFNvZnRzaWduIFNvZnRzaWduR3JhZCBTcGFjZVRvQmF0Y2ggU3BhY2VUb0JhdGNoTkQgU3BhY2VUb0RlcHRoIFNwYXJzZU1hdE11bCBTcGFyc2VTb2Z0bWF4Q3Jvc3NFbnRyb3B5V2l0aExvZ2l0cyBTcGFyc2VUb0RlbnNlIFNwbGl0IFNwbGl0ViBTcXJ0IFNxcnRHcmFkIFNxdWFyZSBTcXVhcmVkRGlmZmVyZW5jZSBTcXVlZXplIFN0YWNrQ2xvc2VWMiBTdGFja1BvcFYyIFN0YWNrUHVzaFYyIFN0YWNrVjIgU3RhdGVsZXNzSWYgU3RhdGVsZXNzUmFuZG9tTm9ybWFsIFN0YXRlbGVzc1JhbmRvbVVuaWZvcm0gU3RhdGVsZXNzVHJ1bmNhdGVkTm9ybWFsIFN0YXRlbGVzc1doaWxlIFN0b3BHcmFkaWVudCBTdHJpZGVkU2xpY2UgU3RyaWRlZFNsaWNlR3JhZCBTdWIgU3VtIFN5bWJvbGljR3JhZGllbnQgVFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMgVGFuIFRhbmggVGFuaEdyYWQgVGVuc29yQXJyYXlDbG9zZVYzIFRlbnNvckFycmF5Q29uY2F0VjMgVGVuc29yQXJyYXlHYXRoZXJWMyBUZW5zb3JBcnJheUdyYWRWMyBUZW5zb3JBcnJheVJlYWRWMyBUZW5zb3JBcnJheVNjYXR0ZXJWMyBUZW5zb3JBcnJheVNpemVWMyBUZW5zb3JBcnJheVNwbGl0VjMgVGVuc29yQXJyYXlWMyBUZW5zb3JBcnJheVdyaXRlVjMgVGlsZSBUb3BLVjIgVHJhbnNwb3NlIFRydW5jYXRlRGl2IFRydW5jYXRlTW9kIFRydW5jYXRlZE5vcm1hbCBVbnBhY2sgVW5zb3J0ZWRTZWdtZW50TWF4IFVuc29ydGVkU2VnbWVudE1pbiBVbnNvcnRlZFNlZ21lbnRQcm9kIFVuc29ydGVkU2VnbWVudFN1bSBWYXJJc0luaXRpYWxpemVkT3AgVmFyaWFibGVTaGFwZSBXaGlsZSBYbGFEeW5hbWljVXBkYXRlU2xpY2UgWGxhSG9zdENvbXB1dGUgWGxhSWYgWGxhUmVjdiBYbGFSZWR1Y2VXaW5kb3cgWGxhU2VuZCBYbGFTb3J0IFhsYVdoaWxlIFplcm9zTGlrZSBFbnRlciBFeGl0IExvb3BDb25kIE1lcmdlIE5leHRJdGVyYXRpb24gU3dpdGNoIF9BcmcgX1BhcmFsbGVsQ29uY2F0VXBkYXRlIF9SZXR2YWwgX1RQVUNvbXBpbGUgX1RQVUV4ZWN1dGUgVFBVQ29tcGlsYXRpb25SZXN1bHQgVFBVUmVwbGljYXRlZElucHV0IFRQVVJlcGxpY2F0ZWRPdXRwdXQgVFBVUmVwbGljYXRlTWV0YWRhdGEgTWVyZ2VWMkNoZWNrcG9pbnRzIFJlc3RvcmVWMiBTYXZlVjIgQWJvcnQgQXNzZXJ0IEFzc2lnbiBQbGFjZWhvbGRlciBQbGFjZWhvbGRlclYyIFNoYXJkZWRGaWxlbmFtZSBTdHJpbmdKb2luIFZhcmlhYmxlIFZhcmlhYmxlVjIgVmFySGFuZGxlT3AgQXVkaW9TdW1tYXJ5IEF1ZGlvU3VtbWFyeVYyIERlYnVnTnVtZXJpY1N1bW1hcnkgSGlzdG9ncmFtU3VtbWFyeSBJbWFnZVN1bW1hcnkgTWVyZ2VTdW1tYXJ5IFNjYWxhclN1bW1hcnkgU3RhdHNBZ2dyZWdhdG9yU3VtbWFyeSIuc3BsaXQoIiAiKTsKZi5UcHVDb21wYXRpYmlsaXR5UHJvdmlkZXI9aDtmLmNoZWNrT3BzRm9yQ29tcGF0aWJpbGl0eT1mdW5jdGlvbihrLHQpe2lmKG51bGw9PT10KXRocm93IEVycm9yKCJDb21wYXRpYmlsaXR5IHByb3ZpZGVyIHJlcXVpcmVkLCBidXQgZ290OiAiK3QpO18uZWFjaChrLm5vZGVzLGw9PntsLmNvbXBhdGlibGU9dC5vcFZhbGlkKGwpO18uZWFjaChsLmluRW1iZWRkaW5ncyxwPT57cC5jb21wYXRpYmxlPXQub3BWYWxpZChwKX0pO18uZWFjaChsLm91dEVtYmVkZGluZ3MscD0+e3AuY29tcGF0aWJsZT10Lm9wVmFsaWQocCl9KX0pfX0pKGQub3B8fChkLm9wPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9wYXJzZXIuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaCh1KXtpZigidHJ1ZSI9PT11KXJldHVybiEwO2lmKCJmYWxzZSI9PT11KXJldHVybiExO2lmKCciJz09PXVbMF0pcmV0dXJuIHUuc3Vic3RyaW5nKDEsdS5sZW5ndGgtMSk7bGV0IHg9cGFyc2VGbG9hdCh1KTtyZXR1cm4gaXNOYU4oeCk/dTp4fWZ1bmN0aW9uIGsodSl7cmV0dXJuIG5ldyBQcm9taXNlKCh4LEEpPT57ZmV0Y2godSkudGhlbih5PT57eS5vaz95LmFycmF5QnVmZmVyKCkudGhlbih4LEEpOnkudGV4dCgpLnRoZW4oQSxBKX0pfSl9ZnVuY3Rpb24gdCh1LHgsQT0xRTYseT0iXG4iKXtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24odyxDKXtmdW5jdGlvbiBHKEQsQixJKXt2YXIgTj1JPj11LmJ5dGVMZW5ndGg7Qj1CLnNwbGl0KHkpO0JbMF09RCtCWzBdO2NvbnN0IE89Tj8iIjpCLnBvcCgpO2ZvcihsZXQgSCBvZiBCKXRyeXt4KEgpfWNhdGNoKEspe0MoSyk7cmV0dXJufU4/dyghMCk6CihEPW5ldyBCbG9iKFt1LnNsaWNlKEksSStBKV0pLE49bmV3IEZpbGVSZWFkZXIsTi5vbmxvYWQ9ZnVuY3Rpb24oSCl7RyhPLEgudGFyZ2V0LnJlc3VsdCxJK0EpfSxOLnJlYWRBc1RleHQoRCkpfUcoIiIsIiIsMCl9KX1mdW5jdGlvbiBsKHUpe3JldHVybiBtKHUsbil9ZnVuY3Rpb24gcCh1KXtyZXR1cm4gbSh1LHEpLnRoZW4oeD0+eC5zdGVwX3N0YXRzKX1mdW5jdGlvbiBtKHUseCl7ZnVuY3Rpb24gQShCKXtsZXQgST1CLmluZGV4T2YoIjoiKSxOPUIuc3Vic3RyaW5nKDAsSSkudHJpbSgpO0I9aChCLnN1YnN0cmluZyhJKzIpLnRyaW0oKSk7cmV0dXJue25hbWU6Tix2YWx1ZTpCfX1mdW5jdGlvbiB5KEIsSSxOLE8pe2xldCBIPUJbSV07bnVsbD09SD9CW0ldPU8uam9pbigiLiIpaW4geD9bTl06TjpBcnJheS5pc0FycmF5KEgpP0gucHVzaChOKTpCW0ldPVtILE5dfWxldCB3PXt9LEM9W10sRz1bXSxEPXc7cmV0dXJuIHQodSxmdW5jdGlvbihCKXtpZihCKXN3aXRjaChCPUIudHJpbSgpLApCW0IubGVuZ3RoLTFdKXtjYXNlICJ7IjpCPUIuc3Vic3RyaW5nKDAsQi5sZW5ndGgtMikudHJpbSgpO2xldCBJPXt9O0MucHVzaChEKTtHLnB1c2goQik7eShELEIsSSxHKTtEPUk7YnJlYWs7Y2FzZSAifSI6RD1DLnBvcCgpO0cucG9wKCk7YnJlYWs7ZGVmYXVsdDpCPUEoQikseShELEIubmFtZSxCLnZhbHVlLEcuY29uY2F0KEIubmFtZSkpfX0pLnRoZW4oZnVuY3Rpb24oKXtyZXR1cm4gd30pfWYuZmV0Y2hQYlR4dD1rO2YuZmV0Y2hBbmRQYXJzZU1ldGFkYXRhPWZ1bmN0aW9uKHUseCl7cmV0dXJuIGIuZ3JhcGgudXRpbC5ydW5UYXNrKCgpPT5udWxsPT11P1Byb21pc2UucmVzb2x2ZShudWxsKTprKHUpLHgpLnRoZW4oQT0+Yi5ncmFwaC51dGlsLnJ1bkFzeW5jUHJvbWlzZVRhc2soIlBhcnNpbmcgbWV0YWRhdGEucGJ0eHQiLDYwLCgpPT5udWxsIT1BP3AoQSk6UHJvbWlzZS5yZXNvbHZlKG51bGwpLHgpKX07Zi5mZXRjaEFuZFBhcnNlR3JhcGhEYXRhPWZ1bmN0aW9uKHUseCxBKXtyZXR1cm4gYi5ncmFwaC51dGlsLnJ1bkFzeW5jUHJvbWlzZVRhc2soIlJlYWRpbmcgZ3JhcGggcGJ0eHQiLAo0MCwoKT0+eD9uZXcgUHJvbWlzZShmdW5jdGlvbih5LHcpe2xldCBDPW5ldyBGaWxlUmVhZGVyO0Mub25sb2FkPSgpPT55KEMucmVzdWx0KTtDLm9uZXJyb3I9KCk9PncoQy5lcnJvcik7Qy5yZWFkQXNBcnJheUJ1ZmZlcih4KX0pOmsodSksQSkudGhlbih5PT5iLmdyYXBoLnV0aWwucnVuQXN5bmNQcm9taXNlVGFzaygiUGFyc2luZyBncmFwaC5wYnR4dCIsNjAsKCk9PmwoeSksQSkpfTtmLnN0cmVhbVBhcnNlPXQ7Y29uc3Qgbj17ImxpYnJhcnkuZnVuY3Rpb24iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5pbnB1dCI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ciI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LmIiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5mIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuZnVuYyI6ITAsCiJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5pIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QucyI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnNoYXBlIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3Quc2hhcGUuZGltIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QudGVuc29yIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QudHlwZSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5zaGFwZS5kaW0iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUudGVuc29yLnN0cmluZ192YWwiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUudGVuc29yLnRlbnNvcl9zaGFwZS5kaW0iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLnNpZ25hdHVyZS5pbnB1dF9hcmciOiEwLAoibGlicmFyeS5mdW5jdGlvbi5zaWduYXR1cmUub3V0cHV0X2FyZyI6ITAsImxpYnJhcnkudmVyc2lvbnMiOiEwLG5vZGU6ITAsIm5vZGUuaW5wdXQiOiEwLCJub2RlLmF0dHIiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5iIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuZiI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LmZ1bmMiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5pIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QucyI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LnNoYXBlIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3Quc2hhcGUuZGltIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QudGVuc29yIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QudHlwZSI6ITAsIm5vZGUuYXR0ci52YWx1ZS5zaGFwZS5kaW0iOiEwLCJub2RlLmF0dHIudmFsdWUudGVuc29yLnN0cmluZ192YWwiOiEwLCJub2RlLmF0dHIudmFsdWUudGVuc29yLnRlbnNvcl9zaGFwZS5kaW0iOiEwfSxxPXsic3RlcF9zdGF0cy5kZXZfc3RhdHMiOiEwLAoic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cyI6ITAsInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMub3V0cHV0IjohMCwic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cy5tZW1vcnkiOiEwLCJzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzLm91dHB1dC50ZW5zb3JfZGVzY3JpcHRpb24uc2hhcGUuZGltIjohMH07Zi5wYXJzZUdyYXBoUGJUeHQ9bDtmLnBhcnNlU3RhdHNQYlR4dD1wfSkoZC5wYXJzZXJ8fChkLnBhcnNlcj17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vcHJvdG8uanMKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vcmVuZGVyLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2Z1bmN0aW9uIGgoTCxRLFQsWCxhYSl7UT1uZXcgSShRLFQsWCxhYSwhMCk7TC5pbkFubm90YXRpb25zLnB1c2goUSl9ZnVuY3Rpb24gayhMLFEsVCxYLGFhKXtRPW5ldyBJKFEsVCxYLGFhLCExKTtMLm91dEFubm90YXRpb25zLnB1c2goUSl9ZnVuY3Rpb24gdChMLFEpe18uZWFjaChMLm5vZGVzKCksVD0+e1Q9TC5ub2RlKFQpO1QuZXhwYW5kZWQ9MTxRO2lmKDA8USlzd2l0Y2goVC5ub2RlLnR5cGUpe2Nhc2UgZC5Ob2RlVHlwZS5NRVRBOmNhc2UgZC5Ob2RlVHlwZS5TRVJJRVM6bChULFEtMSl9fSl9ZnVuY3Rpb24gbChMLFEpe0wuY29yZUdyYXBoJiZ0KEwuY29yZUdyYXBoLFEpfWZ1bmN0aW9uIHAoTCxRLFQpe2xldCBYPUwubm9kZShRKSxhYT1MLm5vZGUoVCksbGE9TC5lZGdlKFEsVCk7aWYoWC5ub2RlLmluY2x1ZGUhPT1kLkluY2x1c2lvblR5cGUuSU5DTFVERSYmYWEubm9kZS5pbmNsdWRlIT09ZC5JbmNsdXNpb25UeXBlLklOQ0xVREV8fApYLm5vZGUuaW5jbHVkZT09PWQuSW5jbHVzaW9uVHlwZS5FWENMVURFfHxhYS5ub2RlLmluY2x1ZGU9PT1kLkluY2x1c2lvblR5cGUuRVhDTFVERSlrKFgsYWEubm9kZSxhYSxsYSxOLlNIT1JUQ1VUKSxoKGFhLFgubm9kZSxYLGxhLE4uU0hPUlRDVVQpLEwucmVtb3ZlRWRnZShRLFQpfWZ1bmN0aW9uIG0oTCxRLFQpe2xldCBYPUwuY29yZUdyYXBoLGFhPVgubm9kZShRKTthYS5pc091dEV4dHJhY3Q9ITA7Xy5lYWNoKFgucHJlZGVjZXNzb3JzKFEpLGxhPT57cChYLGxhLFEpfSk7KEcuZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlfHxUKSYmXy5lYWNoKFguc3VjY2Vzc29ycyhRKSxsYT0+e3AoWCxRLGxhKX0pOzA9PT1YLm5laWdoYm9ycyhRKS5sZW5ndGgmJihhYS5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUsTC5pc29sYXRlZE91dEV4dHJhY3QucHVzaChhYSksWC5yZW1vdmVOb2RlKFEpKX1mdW5jdGlvbiBuKEwsUSxUKXtsZXQgWD1MLmNvcmVHcmFwaCxhYT0KWC5ub2RlKFEpO2FhLmlzSW5FeHRyYWN0PSEwO18uZWFjaChYLnN1Y2Nlc3NvcnMoUSksbGE9PntwKFgsUSxsYSl9KTsoRy5kZXRhY2hBbGxFZGdlc0ZvckhpZ2hEZWdyZWV8fFQpJiZfLmVhY2goWC5wcmVkZWNlc3NvcnMoUSksbGE9PntwKFgsbGEsUSl9KTswPT09WC5uZWlnaGJvcnMoUSkubGVuZ3RoJiYoYWEubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLEwuaXNvbGF0ZWRJbkV4dHJhY3QucHVzaChhYSksWC5yZW1vdmVOb2RlKFEpKX1mdW5jdGlvbiBxKEwsUSl7aWYoTC50eXBlPT09ZC5Ob2RlVHlwZS5PUClmb3IodmFyIFQ9MDtUPFEubGVuZ3RoO1QrKyl7aWYoTC5vcD09PVFbVF0pcmV0dXJuITB9ZWxzZSBpZihMLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEmJihMPUwuZ2V0Um9vdE9wKCkpKWZvcihUPTA7VDxRLmxlbmd0aDtUKyspaWYoTC5vcD09PVFbVF0pcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24gdShMKXtsZXQgUT1MLmNvcmVHcmFwaDtfLmVhY2goUS5ub2RlcygpLApUPT57US5ub2RlKFQpLm5vZGUuaW5jbHVkZSE9PWQuSW5jbHVzaW9uVHlwZS5FWENMVURFfHxULnN0YXJ0c1dpdGgoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKXx8KEwuY29yZUdyYXBoLm91dEVkZ2VzKFQpLmxlbmd0aD5MLmNvcmVHcmFwaC5pbkVkZ2VzKFQpLmxlbmd0aD9tKEwsVCwhMCk6bihMLFQsITApKX0pfWZ1bmN0aW9uIHgoTCl7bGV0IFE9TC5jb3JlR3JhcGg7Xy5lYWNoKFEubm9kZXMoKSxUPT57bGV0IFg9US5ub2RlKFQpO1gubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEJiZxKFgubm9kZSxHLm91dEV4dHJhY3RUeXBlcykmJm0oTCxUKX0pfWZ1bmN0aW9uIEEoTCl7bGV0IFE9TC5jb3JlR3JhcGg7Xy5lYWNoKFEubm9kZXMoKSxUPT57bGV0IFg9US5ub2RlKFQpO1gubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEJiZxKFgubm9kZSxHLmluRXh0cmFjdFR5cGVzKSYmbihMLFQpfSl9ZnVuY3Rpb24geShMKXtsZXQgUT0KTC5jb3JlR3JhcGgsVD17fSxYPXt9LGFhPTA7Xy5lYWNoKFEubm9kZXMoKSxrYT0+e2lmKFEubm9kZShrYSkubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEKXt2YXIgWT1fLnJlZHVjZShRLnByZWRlY2Vzc29ycyhrYSksKHZhLHhhKT0+e3hhPVEuZWRnZSh4YSxrYSkubWV0YWVkZ2U7cmV0dXJuIHZhKyh4YS5udW1SZWd1bGFyRWRnZXM/MTowKX0sMCk7MD09PVkmJjA8US5wcmVkZWNlc3NvcnMoa2EpLmxlbmd0aCYmKFk9US5wcmVkZWNlc3NvcnMoa2EpLmxlbmd0aCk7dmFyIEVhPV8ucmVkdWNlKFEuc3VjY2Vzc29ycyhrYSksKHZhLHhhKT0+e3hhPVEuZWRnZShrYSx4YSkubWV0YWVkZ2U7cmV0dXJuIHZhKyh4YS5udW1SZWd1bGFyRWRnZXM/MTowKX0sMCk7MD09PUVhJiYwPFEuc3VjY2Vzc29ycyhrYSkubGVuZ3RoJiYoRWE9US5zdWNjZXNzb3JzKGthKS5sZW5ndGgpO1Rba2FdPVk7WFtrYV09RWE7YWErK319KTtpZighKGFhPEcubWluTm9kZUNvdW50Rm9yRXh0cmFjdGlvbikpe3ZhciBsYT0KRy5taW5EZWdyZWVGb3JFeHRyYWN0aW9uLTEsWj1NYXRoLnJvdW5kKC43NSphYSksYmE9TWF0aC5yb3VuZCguMjUqYWEpLGVhPU9iamVjdC5rZXlzKFQpLnNvcnQoKGthLFkpPT5UW2thXS1UW1ldKSxjYT1UW2VhW1pdXTtjYT1jYStjYS1UW2VhW2JhXV07Y2E9TWF0aC5tYXgoY2EsbGEpO2ZvcihsZXQga2E9YWEtMTtUW2VhW2thXV0+Y2E7a2EtLSluKEwsZWFba2FdKTtlYT1PYmplY3Qua2V5cyhYKS5zb3J0KChrYSxZKT0+WFtrYV0tWFtZXSk7Wj1YW2VhW1pdXTtiYT1aKzQqKFotWFtlYVtiYV1dKTtiYT1NYXRoLm1heChiYSxsYSk7Zm9yKGxhPWFhLTE7WFtlYVtsYV1dPmJhO2xhLS0pKFo9US5ub2RlKGVhW2xhXSkpJiYhWi5pc0luRXh0cmFjdCYmbShMLGVhW2xhXSl9fWZ1bmN0aW9uIHcoTCl7bGV0IFE9TC5jb3JlR3JhcGgsVD17fTtfLmVhY2goUS5lZGdlcygpLFg9PntRLmVkZ2UoWCkubWV0YWVkZ2UubnVtUmVndWxhckVkZ2VzfHwoKFRbWC52XT1UW1gudl18fFtdKS5wdXNoKFgpLAooVFtYLnddPVRbWC53XXx8W10pLnB1c2goWCkpfSk7Xy5lYWNoKFQsWD0+e1gubGVuZ3RoPkcubWF4Q29udHJvbERlZ3JlZSYmXy5lYWNoKFgsYWE9PnAoUSxhYS52LGFhLncpKX0pfWZ1bmN0aW9uIEMoTCl7dShMKTtHLm91dEV4dHJhY3RUeXBlcyYmeChMKTtHLmluRXh0cmFjdFR5cGVzJiZBKEwpO3koTCk7Ry5tYXhDb250cm9sRGVncmVlJiZ3KEwpO2xldCBRPUwuY29yZUdyYXBoO18uZWFjaChRLm5vZGVzKCksVD0+e2xldCBYPVEubm9kZShUKTt2YXIgYWE9US5uZWlnaGJvcnMoVCkubGVuZ3RoO2lmKFgubm9kZS5pbmNsdWRlPT09ZC5JbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEJiYwPT09YWEpe2FhPTA8WC5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aDtsZXQgbGE9MDxYLmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg7WC5pc0luRXh0cmFjdD8oTC5pc29sYXRlZEluRXh0cmFjdC5wdXNoKFgpLFgubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLFEucmVtb3ZlTm9kZShUKSk6ClguaXNPdXRFeHRyYWN0PyhMLmlzb2xhdGVkT3V0RXh0cmFjdC5wdXNoKFgpLFgubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLFEucmVtb3ZlTm9kZShUKSk6Ry5leHRyYWN0SXNvbGF0ZWROb2Rlc1dpdGhBbm5vdGF0aW9uc09uT25lU2lkZSYmKGFhJiYhbGE/KFguaXNJbkV4dHJhY3Q9ITAsTC5pc29sYXRlZEluRXh0cmFjdC5wdXNoKFgpLFgubm9kZS5pbmNsdWRlPWQuSW5jbHVzaW9uVHlwZS5FWENMVURFLFEucmVtb3ZlTm9kZShUKSk6bGEmJiFhYSYmKFguaXNPdXRFeHRyYWN0PSEwLEwuaXNvbGF0ZWRPdXRFeHRyYWN0LnB1c2goWCksWC5ub2RlLmluY2x1ZGU9ZC5JbmNsdXNpb25UeXBlLkVYQ0xVREUsUS5yZW1vdmVOb2RlKFQpKSl9fSl9Zi5PcE5vZGVDb2xvcnM9e0RFRkFVTFRfRklMTDoiI2ZmZmZmZiIsREVGQVVMVF9TVFJPS0U6IiNiMmIyYjIiLENPTVBBVElCTEU6IiMwZjlkNTgiLElOQ09NUEFUSUJMRToiI2RiNDQzNyJ9O2YuTWV0YW5vZGVDb2xvcnM9CntERUZBVUxUX0ZJTEw6IiNkOWQ5ZDkiLERFRkFVTFRfU1RST0tFOiIjYTZhNmE2IixTQVRVUkFUSU9OOi42LExJR0hUTkVTUzouODUsRVhQQU5ERURfQ09MT1I6IiNmMGYwZjAiLEhVRVM6WzIyMCwxMDAsMTgwLDQwLDIwLDM0MCwyNjAsMzAwLDE0MCw2MF0sU1RSVUNUVVJFX1BBTEVUVEUoTCxRKXt2YXIgVD1mLk1ldGFub2RlQ29sb3JzLkhVRVM7TD1UW0wlVC5sZW5ndGhdO1Q9TWF0aC5zaW4oTCpNYXRoLlBJLzM2MCk7cmV0dXJuIGQzLmhzbChMLC4wMSooUT8zMDo5MC02MCpUKSwuMDEqKFE/OTU6ODApKS50b1N0cmluZygpfSxERVZJQ0VfUEFMRVRURShMKXtyZXR1cm4gZi5NZXRhbm9kZUNvbG9ycy5TVFJVQ1RVUkVfUEFMRVRURShMKX0sWExBX0NMVVNURVJfUEFMRVRURShMKXtyZXR1cm4gZi5NZXRhbm9kZUNvbG9ycy5TVFJVQ1RVUkVfUEFMRVRURShMKX0sVU5LTk9XTjoiI2VlZSIsR1JBRElFTlRfT1VUTElORToiIzg4OCJ9O2YuU2VyaWVzTm9kZUNvbG9ycz17REVGQVVMVF9GSUxMOiJ3aGl0ZSIsCkRFRkFVTFRfU1RST0tFOiIjYjJiMmIyIn07Y29uc3QgRz17ZW5hYmxlRXh0cmFjdGlvbjohMCxtaW5Ob2RlQ291bnRGb3JFeHRyYWN0aW9uOjE1LG1pbkRlZ3JlZUZvckV4dHJhY3Rpb246NSxtYXhDb250cm9sRGVncmVlOjQsbWF4QnJpZGdlUGF0aERlZ3JlZTo0LG91dEV4dHJhY3RUeXBlczpbIk5vT3AiXSxpbkV4dHJhY3RUeXBlczpbXSxkZXRhY2hBbGxFZGdlc0ZvckhpZ2hEZWdyZWU6ITAsZXh0cmFjdElzb2xhdGVkTm9kZXNXaXRoQW5ub3RhdGlvbnNPbk9uZVNpZGU6ITAsZW5hYmxlQnJpZGdlZ3JhcGg6ITAsbWluTWF4Q29sb3JzOlsiI2ZmZjVmMCIsIiNmYjZhNGEiXSxtYXhBbm5vdGF0aW9uczo1fSxEPW5ldyBSZWdFeHAoIl4oPzoiK2IuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCsiKT8oXFx3KylfW2EtejAtOV17OH0oPzpfXFxkKyk/JCIpO2NsYXNzIEJ7Y29uc3RydWN0b3IoTCxRKXt0aGlzLmhpZXJhcmNoeT1MO3RoaXMuZGlzcGxheWluZ1N0YXRzPQpRO3RoaXMuaW5kZXg9e307dGhpcy5yZW5kZXJlZE9wTmFtZXM9W107dGhpcy5jb21wdXRlU2NhbGVzKCk7dGhpcy5oYXNTdWJoaWVyYXJjaHk9e307dGhpcy5yb290PW5ldyBNKEwucm9vdCxMLmdyYXBoT3B0aW9ucyk7dGhpcy5pbmRleFtMLnJvb3QubmFtZV09dGhpcy5yb290O3RoaXMucmVuZGVyZWRPcE5hbWVzLnB1c2goTC5yb290Lm5hbWUpO3RoaXMuYnVpbGRTdWJoaWVyYXJjaHkoTC5yb290Lm5hbWUpO3RoaXMucm9vdC5leHBhbmRlZD0hMDt0aGlzLnRyYWNlSW5wdXRzPSExfWNvbXB1dGVTY2FsZXMoKXt0aGlzLmRldmljZUNvbG9yTWFwPWQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS5kZXZpY2VzKS5yYW5nZShfLm1hcChkMy5yYW5nZSh0aGlzLmhpZXJhcmNoeS5kZXZpY2VzLmxlbmd0aCksZi5NZXRhbm9kZUNvbG9ycy5ERVZJQ0VfUEFMRVRURSkpO3RoaXMueGxhQ2x1c3RlckNvbG9yTWFwPWQzLnNjYWxlT3JkaW5hbCgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS54bGFDbHVzdGVycykucmFuZ2UoXy5tYXAoZDMucmFuZ2UodGhpcy5oaWVyYXJjaHkueGxhQ2x1c3RlcnMubGVuZ3RoKSwKZi5NZXRhbm9kZUNvbG9ycy5YTEFfQ0xVU1RFUl9QQUxFVFRFKSk7bGV0IEw9dGhpcy5oaWVyYXJjaHkucm9vdC5tZXRhZ3JhcGg7dmFyIFE9ZDMubWF4KEwubm9kZXMoKSxUPT57VD1MLm5vZGUoVCk7aWYobnVsbCE9VC5zdGF0cylyZXR1cm4gVC5zdGF0cy50b3RhbEJ5dGVzfSk7dGhpcy5tZW1vcnlVc2FnZVNjYWxlPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLFFdKS5yYW5nZShHLm1pbk1heENvbG9ycyk7UT1kMy5tYXgoTC5ub2RlcygpLFQ9PntUPUwubm9kZShUKTtpZihudWxsIT1ULnN0YXRzKXJldHVybiBULnN0YXRzLmdldFRvdGFsTWljcm9zKCl9KTt0aGlzLmNvbXB1dGVUaW1lU2NhbGU9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oWzAsUV0pLnJhbmdlKEcubWluTWF4Q29sb3JzKTt0aGlzLmVkZ2VXaWR0aFNpemVkQmFzZWRTY2FsZT10aGlzLmhpZXJhcmNoeS5oYXNTaGFwZUluZm8/ZC5zY2VuZS5lZGdlLkVER0VfV0lEVEhfU0laRV9CQVNFRF9TQ0FMRTpkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihbMSwKdGhpcy5oaWVyYXJjaHkubWF4TWV0YUVkZ2VTaXplXSkucmFuZ2UoW2Quc2NlbmUuZWRnZS5NSU5fRURHRV9XSURUSCxkLnNjZW5lLmVkZ2UuTUFYX0VER0VfV0lEVEhdKX1nZXRSZW5kZXJOb2RlQnlOYW1lKEwpe3JldHVybiB0aGlzLmluZGV4W0xdfWdldE5vZGVCeU5hbWUoTCl7cmV0dXJuIHRoaXMuaGllcmFyY2h5Lm5vZGUoTCl9Y29sb3JIaXN0b2dyYW0oTCxRKXtpZigwPE9iamVjdC5rZXlzKEwpLmxlbmd0aCl7Y29uc3QgVD1fLnN1bShPYmplY3Qua2V5cyhMKS5tYXAoWD0+TFtYXSkpO3JldHVybiBPYmplY3Qua2V5cyhMKS5tYXAoWD0+KHtjb2xvcjpRKFgpLHByb3BvcnRpb246TFtYXS9UfSkpfWNvbnNvbGUuaW5mbygibm8gcGFpcnMgZm91bmQhIik7cmV0dXJuIG51bGx9Z2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKEwpe2lmKCFMKXJldHVybiBudWxsO2lmKEwgaW4gdGhpcy5pbmRleClyZXR1cm4gdGhpcy5pbmRleFtMXTt2YXIgUT10aGlzLmhpZXJhcmNoeS5ub2RlKEwpOwppZighUSlyZXR1cm4gbnVsbDtsZXQgVD1RLmlzR3JvdXBOb2RlP25ldyBNKFEsdGhpcy5oaWVyYXJjaHkuZ3JhcGhPcHRpb25zKTpuZXcgSChRKTt0aGlzLmluZGV4W0xdPVQ7dGhpcy5yZW5kZXJlZE9wTmFtZXMucHVzaChMKTtRLnN0YXRzJiYoVC5tZW1vcnlDb2xvcj10aGlzLm1lbW9yeVVzYWdlU2NhbGUoUS5zdGF0cy50b3RhbEJ5dGVzKSxULmNvbXB1dGVUaW1lQ29sb3I9dGhpcy5jb21wdXRlVGltZVNjYWxlKFEuc3RhdHMuZ2V0VG90YWxNaWNyb3MoKSkpO1QuaXNGYWRlZE91dD10aGlzLmRpc3BsYXlpbmdTdGF0cyYmIWIuZ3JhcGgudXRpbC5oYXNEaXNwbGF5YWJsZU5vZGVTdGF0cyhRLnN0YXRzKTt2YXIgWD1udWxsLGFhPW51bGwsbGE9bnVsbDtpZihRLmlzR3JvdXBOb2RlKXtYPVEuZGV2aWNlSGlzdG9ncmFtO2FhPVEueGxhQ2x1c3Rlckhpc3RvZ3JhbTt2YXIgWj1RLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZTtRPVEuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU7CmlmKDAhPVp8fDAhPVEpbGE9Wi8oWitRKX1lbHNlKFo9VC5ub2RlLmRldmljZSkmJihYPXtbWl06MX0pLChaPVQubm9kZS54bGFDbHVzdGVyKSYmKGFhPXtbWl06MX0pLFQubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5PUCYmKGxhPVQubm9kZS5jb21wYXRpYmxlPzE6MCk7WCYmKFQuZGV2aWNlQ29sb3JzPXRoaXMuY29sb3JIaXN0b2dyYW0oWCx0aGlzLmRldmljZUNvbG9yTWFwKSk7YWEmJihULnhsYUNsdXN0ZXJDb2xvcnM9dGhpcy5jb2xvckhpc3RvZ3JhbShhYSx0aGlzLnhsYUNsdXN0ZXJDb2xvck1hcCkpO251bGwhPWxhJiYoVC5jb21wYXRpYmlsaXR5Q29sb3JzPVt7Y29sb3I6Yi5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkNPTVBBVElCTEUscHJvcG9ydGlvbjpsYX0se2NvbG9yOmIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5JTkNPTVBBVElCTEUscHJvcG9ydGlvbjoxLWxhfV0pO3JldHVybiB0aGlzLmluZGV4W0xdfWdldE5lYXJlc3RWaXNpYmxlQW5jZXN0b3IoTCl7dmFyIFE9CmQuZ2V0SGllcmFyY2hpY2FsUGF0aChMKTtsZXQgVD0wLFg9bnVsbDtmb3IoO1Q8US5sZW5ndGgmJihMPVFbVF0sWD10aGlzLmdldFJlbmRlck5vZGVCeU5hbWUoTCksWC5leHBhbmRlZCk7VCsrKTtyZXR1cm4gVD09US5sZW5ndGgtMiYmKFE9UVtUKzFdLFguaW5Bbm5vdGF0aW9ucy5ub2RlTmFtZXNbUV18fFgub3V0QW5ub3RhdGlvbnMubm9kZU5hbWVzW1FdKT9ROkx9c2V0RGVwdGgoTCl7bCh0aGlzLnJvb3QsK0wpfWlzTm9kZUF1eGlsaWFyeShMKXtsZXQgUT10aGlzLmdldFJlbmRlck5vZGVCeU5hbWUoTC5ub2RlLnBhcmVudE5vZGUubmFtZSksVD1fLmZpbmQoUS5pc29sYXRlZEluRXh0cmFjdCxYPT5YLm5vZGUubmFtZT09PUwubm9kZS5uYW1lKTtpZihUKXJldHVybiEwO1Q9Xy5maW5kKFEuaXNvbGF0ZWRPdXRFeHRyYWN0LFg9Plgubm9kZS5uYW1lPT09TC5ub2RlLm5hbWUpO3JldHVybiEhVH1nZXROYW1lc09mUmVuZGVyZWRPcHMoKXtyZXR1cm4gdGhpcy5yZW5kZXJlZE9wTmFtZXN9Y2xvbmVBbmRBZGRGdW5jdGlvbk9wTm9kZShMLApRLFQsWCl7dmFyIGFhPVQubmFtZS5yZXBsYWNlKFEsWCk7bGV0IGxhPUwubWV0YWdyYXBoLm5vZGUoYWEpO2lmKGxhKXJldHVybiBsYTtsYT1uZXcgZC5PcE5vZGVJbXBsKHtuYW1lOmFhLGlucHV0OltdLGRldmljZTpULmRldmljZSxvcDpULm9wLGF0dHI6Xy5jbG9uZURlZXAoVC5hdHRyKX0pO2xhLmNhcmRpbmFsaXR5PVQuY2FyZGluYWxpdHk7bGEuaW5jbHVkZT1ULmluY2x1ZGU7bGEub3V0cHV0U2hhcGVzPV8uY2xvbmVEZWVwKFQub3V0cHV0U2hhcGVzKTtsYS54bGFDbHVzdGVyPVQueGxhQ2x1c3RlcjtsYS5mdW5jdGlvbklucHV0SW5kZXg9VC5mdW5jdGlvbklucHV0SW5kZXg7bGEuZnVuY3Rpb25PdXRwdXRJbmRleD1ULmZ1bmN0aW9uT3V0cHV0SW5kZXg7bGEuaW5wdXRzPVQuaW5wdXRzLm1hcChaPT57Y29uc3QgYmE9Xy5jbG9uZShaKTtiYS5uYW1lPVoubmFtZS5yZXBsYWNlKFEsWCk7cmV0dXJuIGJhfSk7bGEucGFyZW50Tm9kZT1MO0wubWV0YWdyYXBoLnNldE5vZGUobGEubmFtZSwKbGEpO3RoaXMuaGllcmFyY2h5LnNldE5vZGUobGEubmFtZSxsYSk7YWE9Wj0+dGhpcy5jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKEwsUSxaLFgpO2xhLmluRW1iZWRkaW5ncz1ULmluRW1iZWRkaW5ncy5tYXAoYWEpO2xhLm91dEVtYmVkZGluZ3M9VC5vdXRFbWJlZGRpbmdzLm1hcChhYSk7cmV0dXJuIGxhfWNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGUoTCxRLFQsWCxhYSl7Y29uc3QgbGE9e307TD10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIoTCxRLFQsWCxhYSxsYSk7Xy5pc0VtcHR5KGxhKXx8dGhpcy5wYXRjaEVkZ2VzRnJvbUZ1bmN0aW9uT3V0cHV0cyhRLGxhKTtyZXR1cm4gTH1jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlSGVscGVyKEwsUSxULFgsYWEsbGEpe2NvbnN0IFo9Yi5ncmFwaC5jcmVhdGVNZXRhbm9kZShULm5hbWUucmVwbGFjZShYLGFhKSk7Wi5kZXB0aD1ULmRlcHRoO1ouY2FyZGluYWxpdHk9VC5jYXJkaW5hbGl0eTtaLnRlbXBsYXRlSWQ9ClQudGVtcGxhdGVJZDtaLm9wSGlzdG9ncmFtPV8uY2xvbmUoVC5vcEhpc3RvZ3JhbSk7Wi5kZXZpY2VIaXN0b2dyYW09Xy5jbG9uZShULmRldmljZUhpc3RvZ3JhbSk7Wi54bGFDbHVzdGVySGlzdG9ncmFtPV8uY2xvbmUoVC54bGFDbHVzdGVySGlzdG9ncmFtKTtaLmhhc05vbkNvbnRyb2xFZGdlcz1ULmhhc05vbkNvbnRyb2xFZGdlcztaLmluY2x1ZGU9VC5pbmNsdWRlO1oubm9kZUF0dHJpYnV0ZXM9Xy5jbG9uZShULm5vZGVBdHRyaWJ1dGVzKTtaLmFzc29jaWF0ZWRGdW5jdGlvbj1ULmFzc29jaWF0ZWRGdW5jdGlvbjtfLmVhY2goVC5tZXRhZ3JhcGgubm9kZXMoKSxiYT0+e2JhPVQubWV0YWdyYXBoLm5vZGUoYmEpO3N3aXRjaChiYS50eXBlKXtjYXNlIGQuTm9kZVR5cGUuTUVUQTpiYT10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIoTCxRLGJhLFgsYWEsbGEpO2JhLnBhcmVudE5vZGU9WjtaLm1ldGFncmFwaC5zZXROb2RlKGJhLm5hbWUsYmEpO3RoaXMuaGllcmFyY2h5LnNldE5vZGUoYmEubmFtZSwKYmEpO2JyZWFrO2Nhc2UgZC5Ob2RlVHlwZS5PUDpiYT10aGlzLmNsb25lQW5kQWRkRnVuY3Rpb25PcE5vZGUoWixYLGJhLGFhKTtfLmlzTnVtYmVyKGJhLmZ1bmN0aW9uSW5wdXRJbmRleCkmJnRoaXMucGF0Y2hFZGdlc0ludG9GdW5jdGlvbklucHV0cyhRLGJhKTtfLmlzTnVtYmVyKGJhLmZ1bmN0aW9uT3V0cHV0SW5kZXgpJiYobGFbYmEuZnVuY3Rpb25PdXRwdXRJbmRleF09YmEpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKGJhLm5hbWUrIiBpcyBvZGRseSBuZWl0aGVyIGEgbWV0YW5vZGUgbm9yIGFuIG9wbm9kZS4iKX19KTt0aGlzLmNsb25lTGlicmFyeU1ldGFub2RlRWRnZXMoVCxaLFgsYWEpO3JldHVybiBafWNsb25lTGlicmFyeU1ldGFub2RlRWRnZXMoTCxRLFQsWCl7Xy5lYWNoKEwubWV0YWdyYXBoLmVkZ2VzKCksYWE9PnthYT1MLm1ldGFncmFwaC5lZGdlKGFhKTtjb25zdCBsYT1hYS52LnJlcGxhY2UoVCxYKSxaPWFhLncucmVwbGFjZShULFgpLGJhPW5ldyBkLk1ldGFlZGdlSW1wbChsYSwKWik7YmEuaW5ib3VuZD1hYS5pbmJvdW5kO2JhLm51bVJlZ3VsYXJFZGdlcz1hYS5udW1SZWd1bGFyRWRnZXM7YmEubnVtQ29udHJvbEVkZ2VzPWFhLm51bUNvbnRyb2xFZGdlcztiYS5udW1SZWZFZGdlcz1hYS5udW1SZWZFZGdlcztiYS50b3RhbFNpemU9YWEudG90YWxTaXplO2FhLmJhc2VFZGdlTGlzdCYmKGJhLmJhc2VFZGdlTGlzdD1hYS5iYXNlRWRnZUxpc3QubWFwKGVhPT57Y29uc3QgY2E9Xy5jbG9uZShlYSk7Y2Eudj1lYS52LnJlcGxhY2UoVCxYKTtjYS53PWVhLncucmVwbGFjZShULFgpO3JldHVybiBjYX0pKTtRLm1ldGFncmFwaC5ub2RlKFopP1EubWV0YWdyYXBoLnNldEVkZ2UobGEsWixiYSk6US5tZXRhZ3JhcGguc2V0RWRnZShaLGxhLGJhKX0pfXBhdGNoRWRnZXNJbnRvRnVuY3Rpb25JbnB1dHMoTCxRKXtsZXQgVD1NYXRoLm1pbihRLmZ1bmN0aW9uSW5wdXRJbmRleCxMLmlucHV0cy5sZW5ndGgtMSk7Zm9yKHZhciBYPV8uY2xvbmUoTC5pbnB1dHNbVF0pO1guaXNDb250cm9sRGVwZW5kZW5jeTspVCsrLApYPUwuaW5wdXRzW1RdO1EuaW5wdXRzLnB1c2goWCk7WD10aGlzLmhpZXJhcmNoeS5nZXRQcmVkZWNlc3NvcnMoTC5uYW1lKTtsZXQgYWEsbGE9MDtfLmVhY2goWC5yZWd1bGFyLFo9PntsYSs9Wi5udW1SZWd1bGFyRWRnZXM7aWYobGE+VClyZXR1cm4gYWE9WiwhMX0pO18uZWFjaChhYS5iYXNlRWRnZUxpc3QsWj0+e1oudz09PUwubmFtZSYmKFoudz1RLm5hbWUpO1oudj09PUwubmFtZSYmKFoudj1RLm5hbWUpfSl9cGF0Y2hFZGdlc0Zyb21GdW5jdGlvbk91dHB1dHMoTCxRKXtjb25zdCBUPXRoaXMuaGllcmFyY2h5LmdldFN1Y2Nlc3NvcnMoTC5uYW1lKTtfLmVhY2goVC5yZWd1bGFyLFg9PntfLmVhY2goWC5iYXNlRWRnZUxpc3QsYWE9Pntjb25zdCBsYT10aGlzLmhpZXJhcmNoeS5ub2RlKGFhLncpO18uZWFjaChsYS5pbnB1dHMsWj0+e1oubmFtZT09PUwubmFtZSYmKFoubmFtZT1RW1oub3V0cHV0VGVuc29yS2V5XS5uYW1lLFoub3V0cHV0VGVuc29yS2V5PWFhLm91dHB1dFRlbnNvcktleSl9KX0pOwpfLmVhY2goWC5iYXNlRWRnZUxpc3QsYWE9PnthYS52PVFbYWEub3V0cHV0VGVuc29yS2V5XS5uYW1lO2FhLm91dHB1dFRlbnNvcktleT0iMCJ9KX0pfWJ1aWxkU3ViaGllcmFyY2h5KEwpe2lmKCEoTCBpbiB0aGlzLmhhc1N1YmhpZXJhcmNoeSkpe3RoaXMuaGFzU3ViaGllcmFyY2h5W0xdPSEwO3ZhciBRPXRoaXMuaW5kZXhbTF07aWYoUS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEF8fFEubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMpe3ZhciBUPVEubm9kZS5tZXRhZ3JhcGgsWD1RLmNvcmVHcmFwaCxhYT1bXSxsYT1bXTtfLmlzRW1wdHkodGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9ucyl8fChfLmVhY2goVC5ub2RlcygpLHhhPT57Y29uc3QgQWE9VC5ub2RlKHhhKSxGYT10aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zW0FhLm9wXTtGYSYmMCE9PXhhLmluZGV4T2YoYi5ncmFwaC5GVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKSYmKHhhPXRoaXMuY2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZShULApBYSxGYS5ub2RlLEZhLm5vZGUubmFtZSxBYS5uYW1lKSxhYS5wdXNoKEFhKSxsYS5wdXNoKHhhKSl9KSxfLmVhY2gobGEsKHhhLEFhKT0+e0FhPWFhW0FhXTt4YS5wYXJlbnROb2RlPUFhLnBhcmVudE5vZGU7VC5zZXROb2RlKEFhLm5hbWUseGEpO3RoaXMuaGllcmFyY2h5LnNldE5vZGUoQWEubmFtZSx4YSl9KSk7Xy5lYWNoKFQubm9kZXMoKSx4YT0+e2xldCBBYT10aGlzLmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZSh4YSksRmE9QWEubm9kZTtYLnNldE5vZGUoeGEsQWEpO0ZhLmlzR3JvdXBOb2RlfHwoXy5lYWNoKEZhLmluRW1iZWRkaW5ncyx5YT0+e2xldCBTYT1uZXcgSyhudWxsKSxYYT1uZXcgSCh5YSk7aChBYSx5YSxYYSxTYSxOLkNPTlNUQU5UKTt0aGlzLmluZGV4W3lhLm5hbWVdPVhhfSksXy5lYWNoKEZhLm91dEVtYmVkZGluZ3MseWE9PntsZXQgU2E9bmV3IEsobnVsbCksWGE9bmV3IEgoeWEpO2soQWEseWEsWGEsU2EsTi5TVU1NQVJZKTt0aGlzLmluZGV4W3lhLm5hbWVdPQpYYX0pKX0pO18uZWFjaChULmVkZ2VzKCkseGE9Pnt2YXIgQWE9VC5lZGdlKHhhKTtBYT1uZXcgSyhBYSk7QWEuaXNGYWRlZE91dD10aGlzLmluZGV4W3hhLnZdLmlzRmFkZWRPdXR8fHRoaXMuaW5kZXhbeGEud10uaXNGYWRlZE91dDtYLnNldEVkZ2UoeGEudix4YS53LEFhKX0pO0cuZW5hYmxlRXh0cmFjdGlvbiYmUS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLk1FVEEmJkMoUSk7Xy5pc0VtcHR5KHRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnMpfHx0aGlzLmJ1aWxkU3ViaGllcmFyY2hpZXNGb3JOZWVkZWRGdW5jdGlvbnMoVCk7TD09PWIuZ3JhcGguUk9PVF9OQU1FJiZfLmZvck93bih0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zLHhhPT57eGE9eGEubm9kZTtjb25zdCBBYT10aGlzLmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZSh4YS5uYW1lKTtRLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LnB1c2goQWEpO0FhLm5vZGUuaW5jbHVkZT1kLkluY2x1c2lvblR5cGUuRVhDTFVERTsKWC5yZW1vdmVOb2RlKHhhLm5hbWUpfSk7dmFyIFo9US5ub2RlLnBhcmVudE5vZGU7aWYoWil7dmFyIGJhPXRoaXMuaW5kZXhbWi5uYW1lXSxlYT0oeGEsLi4uQWEpPT5BYS5jb25jYXQoW3hhPyJJTiI6Ik9VVCJdKS5qb2luKCJ+fiIpLGNhPXRoaXMuaGllcmFyY2h5LmdldEJyaWRnZWdyYXBoKEwpLGthPXt9LFk9e30sRWE9e307Xy5lYWNoKGNhLmVkZ2VzKCkseGE9PntsZXQgQWE9ISFULm5vZGUoeGEudyksRmE9QWE/eGEudjp4YS53O2NhLmVkZ2UoeGEpLm51bVJlZ3VsYXJFZGdlcz9BYT9ZW0ZhXT0oWVtGYV18fDApKzE6a2FbRmFdPShrYVtGYV18fDApKzE6RWFbRmFdPShFYVtGYV18fDApKzF9KTt2YXIgdmE9dGhpcy5oaWVyYXJjaHkuZ2V0Tm9kZU1hcCgpO18uZWFjaChjYS5lZGdlcygpLHhhPT57dmFyIEFhPWNhLmVkZ2UoeGEpO2xldCBGYT0hIVQubm9kZSh4YS53KSxbeWEsU2FdPUZhP1t4YS53LHhhLnZdOlt4YS52LHhhLnddO3ZhciBYYT10aGlzLmluZGV4W3lhXSx1Yj10aGlzLmluZGV4W1NhXSwKQmI9dWI/dWIubm9kZTp2YVtTYV0scWI9IUFhLm51bVJlZ3VsYXJFZGdlcyYmRWFbU2FdPkcubWF4Q29udHJvbERlZ3JlZSxbLHpiXT1GYT9bUS5pbkFubm90YXRpb25zLFhhLmluQW5ub3RhdGlvbnNdOltRLm91dEFubm90YXRpb25zLFhhLm91dEFubm90YXRpb25zXTtsZXQgdmI9KEZhP1k6a2EpW1NhXT5HLm1heEJyaWRnZVBhdGhEZWdyZWU7eGE9bnVsbDt2YXIgR2I9ITE7Ry5lbmFibGVCcmlkZ2VncmFwaCYmIXZiJiYhcWImJlhhLmlzSW5Db3JlKCkmJihHYj1OYj0+YmEuY29yZUdyYXBoLmVkZ2UoRmE/e3Y6TmIsdzpMfTp7djpMLHc6TmJ9KSwoeGE9R2IoU2EpKXx8KHhhPUdiKGVhKEZhLFNhLFoubmFtZSkpKSxHYj0hIXhhKTtYYT0hMTtpZih4YSYmIUFhLm51bVJlZ3VsYXJFZGdlcyl7WGE9eGE7Zm9yKHFiPWJhLm5vZGU7WGEuYWRqb2luaW5nTWV0YWVkZ2U7KVhhPVhhLmFkam9pbmluZ01ldGFlZGdlLHFiPXFiLnBhcmVudE5vZGU7cWI9dGhpcy5oaWVyYXJjaHkuZ2V0VG9wb2xvZ2ljYWxPcmRlcmluZyhxYi5uYW1lKTsKWGE9WGEubWV0YWVkZ2U7WGE9cWJbWGEudl0+cWJbWGEud119R2ImJiFYYT8oQmI9ZWEoRmEsTCksdWI9ZWEoRmEsU2EsTCksemI9WC5ub2RlKHViKSx6Ynx8KEdiPVgubm9kZShCYiksR2J8fChHYj1uZXcgSCh7bmFtZTpCYix0eXBlOmQuTm9kZVR5cGUuQlJJREdFLGlzR3JvdXBOb2RlOiExLGNhcmRpbmFsaXR5OjAscGFyZW50Tm9kZTpudWxsLHN0YXRzOm51bGwsaW5jbHVkZTpkLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQsaW5ib3VuZDpGYSxub2RlQXR0cmlidXRlczp7fX0pLHRoaXMuaW5kZXhbQmJdPUdiLFguc2V0Tm9kZShCYixHYikpLHpiPW5ldyBIKHtuYW1lOnViLHR5cGU6ZC5Ob2RlVHlwZS5CUklER0UsaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MSxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCxpbmNsdWRlOmQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCxpbmJvdW5kOkZhLG5vZGVBdHRyaWJ1dGVzOnt9fSksdGhpcy5pbmRleFt1Yl09emIsWC5zZXROb2RlKHViLAp6YiksWC5zZXRQYXJlbnQodWIsQmIpLEdiLm5vZGUuY2FyZGluYWxpdHkrKyksQWE9bmV3IEsoQWEpLEFhLmFkam9pbmluZ01ldGFlZGdlPXhhLEZhP1guc2V0RWRnZSh1Yix5YSxBYSk6WC5zZXRFZGdlKHlhLHViLEFhKSk6emIucHVzaChuZXcgSShCYix1YixuZXcgSyhBYSksTi5TSE9SVENVVCxGYSkpfSk7Xy5lYWNoKFshMCwhMV0seGE9PntsZXQgQWE9ZWEoeGEsTCksRmE9WC5ub2RlKEFhKTtGYSYmXy5lYWNoKFgubm9kZXMoKSx5YT0+e2lmKFgubm9kZSh5YSkubm9kZS50eXBlIT09ZC5Ob2RlVHlwZS5CUklER0UmJih4YT8hWC5wcmVkZWNlc3NvcnMoeWEpLmxlbmd0aDohWC5zdWNjZXNzb3JzKHlhKS5sZW5ndGgpKXt2YXIgU2E9ZWEoeGEsTCwiU1RSVUNUVVJBTF9UQVJHRVQiKSxYYT1YLm5vZGUoU2EpO1hhfHwoWGE9bmV3IEgoe25hbWU6U2EsdHlwZTpkLk5vZGVUeXBlLkJSSURHRSxpc0dyb3VwTm9kZTohMSxjYXJkaW5hbGl0eToxLHBhcmVudE5vZGU6bnVsbCxzdGF0czpudWxsLAppbmNsdWRlOmQuSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCxpbmJvdW5kOnhhLG5vZGVBdHRyaWJ1dGVzOnt9fSksWGEuc3RydWN0dXJhbD0hMCx0aGlzLmluZGV4W1NhXT1YYSxYLnNldE5vZGUoU2EsWGEpLEZhLm5vZGUuY2FyZGluYWxpdHkrKyxYLnNldFBhcmVudChTYSxBYSkpO1hhPW5ldyBLKG51bGwpO1hhLnN0cnVjdHVyYWw9ITA7WGEud2VpZ2h0LS07eGE/WC5zZXRFZGdlKFNhLHlhLFhhKTpYLnNldEVkZ2UoeWEsU2EsWGEpfX0pfSl9fX19YnVpbGRTdWJoaWVyYXJjaGllc0Zvck5lZWRlZEZ1bmN0aW9ucyhMKXtfLmVhY2goTC5lZGdlcygpLFE9PntRPUwuZWRnZShRKTtRPW5ldyBLKFEpO18uZm9yRWFjaChRLm1ldGFlZGdlLmJhc2VFZGdlTGlzdCxUPT57dmFyIFg9VC52LnNwbGl0KGIuZ3JhcGguTkFNRVNQQUNFX0RFTElNKTtmb3IodmFyIGFhPVgubGVuZ3RoOzA8PWFhO2FhLS0pe1Q9WC5zbGljZSgwLGFhKTtjb25zdCBsYT10aGlzLmhpZXJhcmNoeS5ub2RlKFQuam9pbihiLmdyYXBoLk5BTUVTUEFDRV9ERUxJTSkpOwppZihsYSl7aWYobGEudHlwZT09PWQuTm9kZVR5cGUuT1AmJnRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnNbbGEub3BdKWZvcihYPTE7WDxULmxlbmd0aDtYKyspKGFhPVQuc2xpY2UoMCxYKS5qb2luKGIuZ3JhcGguTkFNRVNQQUNFX0RFTElNKSkmJnRoaXMuYnVpbGRTdWJoaWVyYXJjaHkoYWEpO2JyZWFrfX19KX0pfX1mLlJlbmRlckdyYXBoSW5mbz1CO2NsYXNzIEl7Y29uc3RydWN0b3IoTCxRLFQsWCxhYSl7dGhpcy5ub2RlPUw7dGhpcy5yZW5kZXJOb2RlSW5mbz1RO3RoaXMucmVuZGVyTWV0YWVkZ2VJbmZvPVQ7dGhpcy5hbm5vdGF0aW9uVHlwZT1YO3RoaXMuaGVpZ2h0PXRoaXMud2lkdGg9dGhpcy5keT10aGlzLmR4PTA7VCYmVC5tZXRhZWRnZSYmKHRoaXMudj1ULm1ldGFlZGdlLnYsdGhpcy53PVQubWV0YWVkZ2Uudyk7dGhpcy5pc0luPWFhO3RoaXMucG9pbnRzPVtdfX1mLkFubm90YXRpb249STtsZXQgTjsoZnVuY3Rpb24oTCl7TFtMLlNIT1JUQ1VUPTBdPSJTSE9SVENVVCI7CkxbTC5DT05TVEFOVD0xXT0iQ09OU1RBTlQiO0xbTC5TVU1NQVJZPTJdPSJTVU1NQVJZIjtMW0wuRUxMSVBTSVM9M109IkVMTElQU0lTIn0pKE49Zi5Bbm5vdGF0aW9uVHlwZXx8KGYuQW5ub3RhdGlvblR5cGU9e30pKTtjbGFzcyBPe2NvbnN0cnVjdG9yKCl7dGhpcy5saXN0PVtdO3RoaXMubm9kZU5hbWVzPXt9fXB1c2goTCl7aWYoIShMLm5vZGUubmFtZSBpbiB0aGlzLm5vZGVOYW1lcykpaWYodGhpcy5ub2RlTmFtZXNbTC5ub2RlLm5hbWVdPSEwLHRoaXMubGlzdC5sZW5ndGg8Ry5tYXhBbm5vdGF0aW9ucyl0aGlzLmxpc3QucHVzaChMKTtlbHNle3ZhciBRPXRoaXMubGlzdFt0aGlzLmxpc3QubGVuZ3RoLTFdO1EuYW5ub3RhdGlvblR5cGU9PT1OLkVMTElQU0lTPyhMPVEubm9kZSxMLnNldE51bU1vcmVOb2RlcygrK0wubnVtTW9yZU5vZGVzKSk6KFE9bmV3IGIuZ3JhcGguRWxsaXBzaXNOb2RlSW1wbCgxKSx0aGlzLmxpc3QucHVzaChuZXcgSShRLG5ldyBIKFEpLG51bGwsTi5FTExJUFNJUywKTC5pc0luKSkpfX19Zi5Bbm5vdGF0aW9uTGlzdD1PO2NsYXNzIEh7Y29uc3RydWN0b3IoTCl7dGhpcy5ub2RlPUw7dGhpcy5leHBhbmRlZD0hMTt0aGlzLmluQW5ub3RhdGlvbnM9bmV3IE87dGhpcy5vdXRBbm5vdGF0aW9ucz1uZXcgTzt0aGlzLm91dGJveFdpZHRoPXRoaXMuaW5ib3hXaWR0aD10aGlzLmhlaWdodD10aGlzLndpZHRoPXRoaXMueT10aGlzLng9MDt0aGlzLnN0cnVjdHVyYWw9dGhpcy5leGNsdWRlZD0hMTt0aGlzLnBhZGRpbmdCb3R0b209dGhpcy5wYWRkaW5nUmlnaHQ9dGhpcy5wYWRkaW5nTGVmdD10aGlzLnBhZGRpbmdUb3A9dGhpcy5sYWJlbEhlaWdodD10aGlzLnJhZGl1cz10aGlzLmxhYmVsT2Zmc2V0PTA7dGhpcy5pc091dEV4dHJhY3Q9dGhpcy5pc0luRXh0cmFjdD0hMTt0aGlzLmNvcmVCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMuaXNGYWRlZE91dD0hMTt0aGlzLmRpc3BsYXlOYW1lPUwubmFtZS5zdWJzdHJpbmcoTC5uYW1lLmxhc3RJbmRleE9mKGIuZ3JhcGguTkFNRVNQQUNFX0RFTElNKSsKMSk7TC50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBJiZMLmFzc29jaWF0ZWRGdW5jdGlvbiYmKChMPXRoaXMuZGlzcGxheU5hbWUubWF0Y2goRCkpP3RoaXMuZGlzcGxheU5hbWU9TFsxXTpfLnN0YXJ0c1dpdGgodGhpcy5kaXNwbGF5TmFtZSxiLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpJiYodGhpcy5kaXNwbGF5TmFtZT10aGlzLmRpc3BsYXlOYW1lLnN1YnN0cmluZyhiLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgubGVuZ3RoKSkpfWlzSW5Db3JlKCl7cmV0dXJuIXRoaXMuaXNJbkV4dHJhY3QmJiF0aGlzLmlzT3V0RXh0cmFjdCYmIXRoaXMuaXNMaWJyYXJ5RnVuY3Rpb259fWYuUmVuZGVyTm9kZUluZm89SDtjbGFzcyBLe2NvbnN0cnVjdG9yKEwpe3RoaXMubWV0YWVkZ2U9TDt0aGlzLmFkam9pbmluZ01ldGFlZGdlPW51bGw7dGhpcy5zdHJ1Y3R1cmFsPSExO3RoaXMud2VpZ2h0PTE7dGhpcy5pc0ZhZGVkT3V0PSExfX1mLlJlbmRlck1ldGFlZGdlSW5mbz0KSztjbGFzcyBNIGV4dGVuZHMgSHtjb25zdHJ1Y3RvcihMLFEpe3N1cGVyKEwpO0w9TC5tZXRhZ3JhcGguZ3JhcGgoKTtRLmNvbXBvdW5kPSEwO3RoaXMuY29yZUdyYXBoPWQuY3JlYXRlR3JhcGgoTC5uYW1lLGQuR3JhcGhUeXBlLkNPUkUsUSk7dGhpcy5pbkV4dHJhY3RCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9O3RoaXMub3V0RXh0cmFjdEJveD17d2lkdGg6MCxoZWlnaHQ6MH07dGhpcy5saWJyYXJ5RnVuY3Rpb25zQm94PXt3aWR0aDowLGhlaWdodDowfTt0aGlzLmlzb2xhdGVkSW5FeHRyYWN0PVtdO3RoaXMuaXNvbGF0ZWRPdXRFeHRyYWN0PVtdO3RoaXMubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3Q9W119fWYuUmVuZGVyR3JvdXBOb2RlSW5mbz1NO2YubWFrZUluRXh0cmFjdD1uO2YubWFwSW5kZXhUb0h1ZT1mdW5jdGlvbihMKXtyZXR1cm4gMSs1NzkuMjU2MTY3OTcyNSpMJTM1OH07Zi5leHBhbmRVbnRpbE5vZGVJc1Nob3duPWZ1bmN0aW9uKEwsUSl7dmFyIFQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNjZW5lIik7ClE9US5zcGxpdCgiLyIpO3ZhciBYPVFbUS5sZW5ndGgtMV0ubWF0Y2goLyguKik6XHcrLyk7Mj09PVgubGVuZ3RoJiYoUVtRLmxlbmd0aC0xXT1YWzFdKTtYPVFbMF07bGV0IGFhPUwuZ2V0UmVuZGVyTm9kZUJ5TmFtZShYKTtmb3IobGV0IGxhPTE7bGE8US5sZW5ndGgmJmFhLm5vZGUudHlwZSE9PWIuZ3JhcGguTm9kZVR5cGUuT1A7bGErKylMLmJ1aWxkU3ViaGllcmFyY2h5KFgpLGFhLmV4cGFuZGVkPSEwLFQuc2V0Tm9kZUV4cGFuZGVkKGFhKSxYKz0iLyIrUVtsYV0sYWE9TC5nZXRSZW5kZXJOb2RlQnlOYW1lKFgpO3JldHVybiBhYS5ub2RlLm5hbWV9fSkoZC5yZW5kZXJ8fChkLnJlbmRlcj17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vc2NlbmUuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChxLHUseCxBKXt2YXIgeT1rKHEsdSx4KTtpZigheS5lbXB0eSgpKXJldHVybiB5O3U9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsdSk7aWYoeCBpbnN0YW5jZW9mIEFycmF5KWZvcih5PTA7eTx4Lmxlbmd0aDt5KyspdS5jbGFzc0xpc3QuYWRkKHhbeV0pO2Vsc2UgdS5jbGFzc0xpc3QuYWRkKHgpO0E/cS5ub2RlKCkuaW5zZXJ0QmVmb3JlKHUsQSk6cS5ub2RlKCkuYXBwZW5kQ2hpbGQodSk7cmV0dXJuIGQzLnNlbGVjdCh1KS5kYXR1bShxLmRhdHVtKCkpfWZ1bmN0aW9uIGsocSx1LHgpe3E9cS5ub2RlKCkuY2hpbGROb2Rlcztmb3IobGV0IEE9MDtBPHEubGVuZ3RoO0ErKyl7bGV0IHk9cVtBXTtpZih5LnRhZ05hbWU9PT11KWlmKHggaW5zdGFuY2VvZiBBcnJheSl7bGV0IHc9ITA7Zm9yKGxldCBDPTA7Qzx4Lmxlbmd0aDtDKyspdz13JiZ5LmNsYXNzTGlzdC5jb250YWlucyh4W0NdKTsKaWYodylyZXR1cm4gZDMuc2VsZWN0KHkpfWVsc2UgaWYoIXh8fHkuY2xhc3NMaXN0LmNvbnRhaW5zKHgpKXJldHVybiBkMy5zZWxlY3QoeSl9cmV0dXJuIGQzLnNlbGVjdChudWxsKX1mdW5jdGlvbiB0KHEsdSl7bGV0IHg9dS5ub2RlLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUz8wOmQubGF5b3V0LlBBUkFNUy5zdWJzY2VuZS5tZXRhLmxhYmVsSGVpZ2h0O2woayhxLCJnIixmLkNsYXNzLlNjZW5lLkNPUkUpLDAseCk7dmFyIEE9MDx1Lmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aCx5PTA8dS5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoO2xldCB3PTA8dS5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGgsQz1kLmxheW91dC5QQVJBTVMuc3Vic2NlbmUubWV0YS5leHRyYWN0WE9mZnNldCxHPTA7QSYmKEcrPXUub3V0RXh0cmFjdEJveC53aWR0aCk7eSYmKEcrPXUub3V0RXh0cmFjdEJveC53aWR0aCk7QSYmKEE9dS5jb3JlQm94LndpZHRoLEE9RzxkLmxheW91dC5NSU5fQVVYX1dJRFRIPwpBLWQubGF5b3V0Lk1JTl9BVVhfV0lEVEgrdS5pbkV4dHJhY3RCb3gud2lkdGgvMjpBLXUuaW5FeHRyYWN0Qm94LndpZHRoLzItdS5vdXRFeHRyYWN0Qm94LndpZHRoLSh5P0M6MCksQT1BLXUubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aC0odz9DOjApLGwoayhxLCJnIixmLkNsYXNzLlNjZW5lLklORVhUUkFDVCksQSx4KSk7eSYmKHk9dS5jb3JlQm94LndpZHRoLHk9RzxkLmxheW91dC5NSU5fQVVYX1dJRFRIP3ktZC5sYXlvdXQuTUlOX0FVWF9XSURUSCt1Lm91dEV4dHJhY3RCb3gud2lkdGgvMjp5LXUub3V0RXh0cmFjdEJveC53aWR0aC8yLHk9eS11LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgtKHc/QzowKSxsKGsocSwiZyIsZi5DbGFzcy5TY2VuZS5PVVRFWFRSQUNUKSx5LHgpKTt3JiYodT11LmNvcmVCb3gud2lkdGgtdS5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoLzIsbChrKHEsImciLGYuQ2xhc3MuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSksdSx4KSl9ZnVuY3Rpb24gbChxLAp1LHgpe251bGwhPXEuYXR0cigidHJhbnNmb3JtIikmJihxPXEudHJhbnNpdGlvbigicG9zaXRpb24iKSk7cS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit1KyIsIit4KyIpIil9ZnVuY3Rpb24gcChxLHUpe3JldHVybiB1P3EudG9GaXhlZCgwKToxPD1NYXRoLmFicyhxKT9xLnRvRml4ZWQoMSk6cS50b0V4cG9uZW50aWFsKDEpfWZ1bmN0aW9uIG0ocSx1LHgsQSl7bGV0IHk9IkRldmljZTogIitxLmRldmljZV9uYW1lKyJcbiI7eSs9ImR0eXBlOiAiK3EuZHR5cGUrIlxuIjtsZXQgdz0iKHNjYWxhcikiOzA8cS5zaGFwZS5sZW5ndGgmJih3PSIoIitxLnNoYXBlLmpvaW4oIiwiKSsiKSIpO3k9eSsoIlxuc2hhcGU6ICIrdysiXG5cbiMoZWxlbWVudHMpOiAiKSsodSsiXG4iKTtxPVtdO2Zvcih1PTA7dTx4Lmxlbmd0aDt1KyspMDx4W3VdJiZxLnB1c2goIiMoIitmLmhlYWx0aFBpbGxFbnRyaWVzW3VdLmxhYmVsKyIpOiAiK3hbdV0pO3krPXEuam9pbigiLCAiKSsiXG5cbiI7QS5tYXg+PQpBLm1pbiYmKHkrPSJtaW46ICIrQS5taW4rIiwgbWF4OiAiK0EubWF4KyJcbiIseSs9Im1lYW46ICIrQS5tZWFuKyIsIHN0ZGRldjogIitBLnN0ZGRldik7cmV0dXJuIHl9ZnVuY3Rpb24gbihxLHUseCxBLHk9NjAsdz0xMCxDPTAsRyl7ZDMuc2VsZWN0KHEucGFyZW50Tm9kZSkuc2VsZWN0QWxsKCIuaGVhbHRoLXBpbGwiKS5yZW1vdmUoKTtpZih1KXt2YXIgRD11LnZhbHVlLEI9RC5zbGljZSgyLDgpLEk9QlswXSxOPUJbMV0sTz1CWzVdLEg9RFsxXSxLPXttaW46RFs4XSxtYXg6RFs5XSxtZWFuOkRbMTBdLHN0ZGRldjpNYXRoLnNxcnQoRFsxMV0pfTtudWxsPT15JiYoeT02MCk7bnVsbD09dyYmKHc9MTApO251bGw9PUMmJihDPTApO251bGwhPXgmJngubm9kZS50eXBlPT09Yi5ncmFwaC5Ob2RlVHlwZS5PUCYmKHkvPTIsdy89Mik7RD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJnIik7RC5jbGFzc0xpc3QuYWRkKCJoZWFsdGgtcGlsbCIpO3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmLlNWR19OQU1FU1BBQ0UsCiJkZWZzIik7RC5hcHBlbmRDaGlsZChNKTt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJsaW5lYXJHcmFkaWVudCIpO0E9ImhlYWx0aC1waWxsLWdyYWRpZW50LSIrQTtMLnNldEF0dHJpYnV0ZSgiaWQiLEEpO3ZhciBRPTAsVD0iMCUiO2ZvcihsZXQgYWE9MDthYTxCLmxlbmd0aDthYSsrKWlmKEJbYWFdKXtRKz1CW2FhXTt2YXIgWD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJzdG9wIik7WC5zZXRBdHRyaWJ1dGUoIm9mZnNldCIsVCk7WC5zZXRBdHRyaWJ1dGUoInN0b3AtY29sb3IiLGYuaGVhbHRoUGlsbEVudHJpZXNbYWFdLmJhY2tncm91bmRfY29sb3IpO0wuYXBwZW5kQ2hpbGQoWCk7VD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJzdG9wIik7WD0xMDAqUS9IKyIlIjtULnNldEF0dHJpYnV0ZSgib2Zmc2V0IixYKTtULnNldEF0dHJpYnV0ZSgic3RvcC1jb2xvciIsZi5oZWFsdGhQaWxsRW50cmllc1thYV0uYmFja2dyb3VuZF9jb2xvcik7CkwuYXBwZW5kQ2hpbGQoVCk7VD1YfU0uYXBwZW5kQ2hpbGQoTCk7TT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJyZWN0Iik7TS5zZXRBdHRyaWJ1dGUoImZpbGwiLCJ1cmwoIyIrQSsiKSIpO00uc2V0QXR0cmlidXRlKCJ3aWR0aCIsU3RyaW5nKHkpKTtNLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixTdHJpbmcodykpO00uc2V0QXR0cmlidXRlKCJ5IixTdHJpbmcoQykpO0QuYXBwZW5kQ2hpbGQoTSk7TT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZi5TVkdfTkFNRVNQQUNFLCJ0aXRsZSIpO00udGV4dENvbnRlbnQ9bSh1LEgsQixLKTtELmFwcGVuZENoaWxkKE0pO3U9ITE7aWYobnVsbCE9eCYmKE09eC54LXkvMix3PXgueS13LXguaGVpZ2h0LzItMiwwPngubGFiZWxPZmZzZXQmJih3Kz14LmxhYmVsT2Zmc2V0KSxELnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrTSsiLCAiK3crIikiKSwoQlsyXXx8QlszXXx8Qls0XSkmJih4PXgubm9kZS5hdHRyKSYmCngubGVuZ3RoKSlmb3IoQj0wO0I8eC5sZW5ndGg7QisrKWlmKCJUIj09PXhbQl0ua2V5KXt1PSh4PXhbQl0udmFsdWUudHlwZSkmJi9eRFRfKEJPT0x8SU5UfFVJTlQpLy50ZXN0KHgpO2JyZWFrfXg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGYuU1ZHX05BTUVTUEFDRSwidGV4dCIpO2lmKE51bWJlci5pc0Zpbml0ZShLLm1pbikmJk51bWJlci5pc0Zpbml0ZShLLm1heCkpe2lmKEI9cChLLm1pbix1KSxLPXAoSy5tYXgsdSkseC50ZXh0Q29udGVudD0xPEg/QisiIH4gIitLOkIsMDxJfHwwPE58fDA8Tyl4LnRleHRDb250ZW50Kz0iICgiLEg9W10sMDxJJiZILnB1c2goYE5hTlx1MDBkNyR7SX1gKSwwPE4mJkgucHVzaChgLVx1MjIxZVx1MDBkNyR7Tn1gKSwwPE8mJkgucHVzaChgK1x1MjIxZVx1MDBkNyR7T31gKSx4LnRleHRDb250ZW50Kz1ILmpvaW4oIjsgIikrIikifWVsc2UgeC50ZXh0Q29udGVudD0iKE5vIGZpbml0ZSBlbGVtZW50cykiO3guY2xhc3NMaXN0LmFkZCgiaGVhbHRoLXBpbGwtc3RhdHMiKTsKbnVsbD09RyYmKEc9eS8yKTt4LnNldEF0dHJpYnV0ZSgieCIsU3RyaW5nKEcpKTt4LnNldEF0dHJpYnV0ZSgieSIsU3RyaW5nKEMtMikpO0QuYXBwZW5kQ2hpbGQoeCk7UG9seW1lci5kb20ocS5wYXJlbnROb2RlKS5hcHBlbmRDaGlsZChEKX19Zi5TVkdfTkFNRVNQQUNFPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7Zi5DbGFzcz17Tm9kZTp7Q09OVEFJTkVSOiJub2RlcyIsR1JPVVA6Im5vZGUiLFNIQVBFOiJub2Rlc2hhcGUiLENPTE9SX1RBUkdFVDoibm9kZWNvbG9ydGFyZ2V0IixMQUJFTDoibm9kZWxhYmVsIixCVVRUT05fQ09OVEFJTkVSOiJidXR0b25jb250YWluZXIiLEJVVFRPTl9DSVJDTEU6ImJ1dHRvbmNpcmNsZSIsRVhQQU5EX0JVVFRPTjoiZXhwYW5kYnV0dG9uIixDT0xMQVBTRV9CVVRUT046ImNvbGxhcHNlYnV0dG9uIn0sRWRnZTp7Q09OVEFJTkVSOiJlZGdlcyIsR1JPVVA6ImVkZ2UiLExJTkU6ImVkZ2VsaW5lIixSRUZFUkVOQ0VfRURHRToicmVmZXJlbmNlZWRnZSIsClJFRl9MSU5FOiJyZWZsaW5lIixTRUxFQ1RBQkxFOiJzZWxlY3RhYmxlZWRnZSIsU0VMRUNURUQ6InNlbGVjdGVkZWRnZSIsU1RSVUNUVVJBTDoic3RydWN0dXJhbCJ9LEFubm90YXRpb246e09VVEJPWDoib3V0LWFubm90YXRpb25zIixJTkJPWDoiaW4tYW5ub3RhdGlvbnMiLEdST1VQOiJhbm5vdGF0aW9uIixOT0RFOiJhbm5vdGF0aW9uLW5vZGUiLEVER0U6ImFubm90YXRpb24tZWRnZSIsQ09OVFJPTF9FREdFOiJhbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSIsTEFCRUw6ImFubm90YXRpb24tbGFiZWwiLEVMTElQU0lTOiJhbm5vdGF0aW9uLWVsbGlwc2lzIn0sU2NlbmU6e0dST1VQOiJzY2VuZSIsQ09SRToiY29yZSIsRlVOQ1RJT05fTElCUkFSWToiZnVuY3Rpb24tbGlicmFyeSIsSU5FWFRSQUNUOiJpbi1leHRyYWN0IixPVVRFWFRSQUNUOiJvdXQtZXh0cmFjdCJ9LFN1YnNjZW5lOntHUk9VUDoic3Vic2NlbmUifSxPUE5PREU6Im9wIixNRVRBTk9ERToibWV0YSIsU0VSSUVTTk9ERToic2VyaWVzIiwKQlJJREdFTk9ERToiYnJpZGdlIixFTExJUFNJU05PREU6ImVsbGlwc2lzIn07Zi5oZWFsdGhQaWxsRW50cmllcz1be2JhY2tncm91bmRfY29sb3I6IiNDQzJGMkMiLGxhYmVsOiJOYU4ifSx7YmFja2dyb3VuZF9jb2xvcjoiI0ZGOEQwMCIsbGFiZWw6Ii1cdTIyMWUifSx7YmFja2dyb3VuZF9jb2xvcjoiI0VBRUFFQSIsbGFiZWw6Ii0ifSx7YmFja2dyb3VuZF9jb2xvcjoiI0E1QTVBNSIsbGFiZWw6IjAifSx7YmFja2dyb3VuZF9jb2xvcjoiIzI2MjYyNiIsbGFiZWw6IisifSx7YmFja2dyb3VuZF9jb2xvcjoiIzAwM0VENCIsbGFiZWw6IitcdTIyMWUifV07Zi5maXQ9ZnVuY3Rpb24ocSx1LHgsQSl7dmFyIHk9cS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtsZXQgdz1udWxsO3RyeXtpZih3PXUuZ2V0QkJveCgpLDA9PT13LndpZHRoKXJldHVybn1jYXRjaChDKXtyZXR1cm59dT1kLmxheW91dC5QQVJBTVMuZ3JhcGg7eT1kMy56b29tSWRlbnRpdHkuc2NhbGUoLjkqTWF0aC5taW4oeS53aWR0aC8Kdy53aWR0aCx5LmhlaWdodC93LmhlaWdodCwyKSkudHJhbnNsYXRlKHUucGFkZGluZy5wYWRkaW5nTGVmdCx1LnBhZGRpbmcucGFkZGluZ1RvcCk7ZDMuc2VsZWN0KHEpLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApLmNhbGwoeC50cmFuc2Zvcm0seSkub24oImVuZC5maXR0ZWQiLCgpPT57eC5vbigiZW5kLmZpdHRlZCIsbnVsbCk7QSgpfSl9O2YucGFuVG9Ob2RlPWZ1bmN0aW9uKHEsdSx4LEEpe3g9ZDMuc2VsZWN0KHUpLnNlbGVjdChgW2RhdGEtbmFtZT0iJHtxfSJdYCkubm9kZSgpO2lmKCF4KXJldHVybiBjb25zb2xlLndhcm4oYHBhblRvTm9kZSgpIGZhaWxlZCBmb3Igbm9kZSBuYW1lICIke3F9ImApLCExO3ZhciB5PXguZ2V0QkJveCgpLHc9eC5nZXRTY3JlZW5DVE0oKTtxPXUuY3JlYXRlU1ZHUG9pbnQoKTt4PXUuY3JlYXRlU1ZHUG9pbnQoKTtxLng9eS54O3EueT15Lnk7eC54PXkueCt5LndpZHRoO3gueT15LnkreS5oZWlnaHQ7cT1xLm1hdHJpeFRyYW5zZm9ybSh3KTt4PQp4Lm1hdHJpeFRyYW5zZm9ybSh3KTt3PShHLEQsQixJKT0+IShHPkImJkQ8SSk7eT11LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2NvbnN0IEM9eS50b3AreS5oZWlnaHQtMTUwO3JldHVybiB3KHEueCx4LngseS5sZWZ0LHkubGVmdCt5LndpZHRoLTMyMCl8fHcocS55LHgueSx5LnRvcCxDKT8odz15LmxlZnQreS53aWR0aC8yLShxLngreC54KS8yLHE9eS50b3AreS5oZWlnaHQvMi0ocS55K3gueSkvMix4PWQzLnpvb21UcmFuc2Zvcm0odSksZDMuc2VsZWN0KHUpLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApLmNhbGwoQS50cmFuc2xhdGVCeSx3L3guayxxL3guayksITApOiExfTtmLnNlbGVjdE9yQ3JlYXRlQ2hpbGQ9aDtmLnNlbGVjdENoaWxkPWs7Zi5idWlsZEdyb3VwPWZ1bmN0aW9uKHEsdSx4LEEpe0E9QXx8Zi5DbGFzcy5TY2VuZS5HUk9VUDtsZXQgeT1rKHEsImciLEEpLmVtcHR5KCk7cT1oKHEsImciLEEpO0E9aChxLCJnIixmLkNsYXNzLlNjZW5lLkNPUkUpO2xldCB3PV8ucmVkdWNlKHUuY29yZUdyYXBoLm5vZGVzKCksCihDLEcpPT57Rz11LmNvcmVHcmFwaC5ub2RlKEcpO0cuZXhjbHVkZWR8fEMucHVzaChHKTtyZXR1cm4gQ30sW10pO3Uubm9kZS50eXBlPT09ZC5Ob2RlVHlwZS5TRVJJRVMmJncucmV2ZXJzZSgpO2YuZWRnZS5idWlsZEdyb3VwKEEsdS5jb3JlR3JhcGgseCk7Zi5ub2RlLmJ1aWxkR3JvdXAoQSx3LHgpOzA8dS5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGg/KEE9aChxLCJnIixmLkNsYXNzLlNjZW5lLklORVhUUkFDVCksZi5ub2RlLmJ1aWxkR3JvdXAoQSx1Lmlzb2xhdGVkSW5FeHRyYWN0LHgpKTprKHEsImciLGYuQ2xhc3MuU2NlbmUuSU5FWFRSQUNUKS5yZW1vdmUoKTswPHUuaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aD8oQT1oKHEsImciLGYuQ2xhc3MuU2NlbmUuT1VURVhUUkFDVCksZi5ub2RlLmJ1aWxkR3JvdXAoQSx1Lmlzb2xhdGVkT3V0RXh0cmFjdCx4KSk6ayhxLCJnIixmLkNsYXNzLlNjZW5lLk9VVEVYVFJBQ1QpLnJlbW92ZSgpOzA8dS5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGg/CihBPWgocSwiZyIsZi5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKSxmLm5vZGUuYnVpbGRHcm91cChBLHUubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QseCkpOmsocSwiZyIsZi5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKS5yZW1vdmUoKTt0KHEsdSk7eSYmcS5hdHRyKCJvcGFjaXR5IiwwKS50cmFuc2l0aW9uKCkuYXR0cigib3BhY2l0eSIsMSk7cmV0dXJuIHF9O2YuYWRkR3JhcGhDbGlja0xpc3RlbmVyPWZ1bmN0aW9uKHEsdSl7ZDMuc2VsZWN0KHEpLm9uKCJjbGljayIsKCk9Pnt1LmZpcmUoImdyYXBoLXNlbGVjdCIpfSl9O2YudHJhbnNsYXRlPWw7Zi5wb3NpdGlvblJlY3Q9ZnVuY3Rpb24ocSx1LHgsQSx5KXtxLnRyYW5zaXRpb24oKS5hdHRyKCJ4Iix1LUEvMikuYXR0cigieSIseC15LzIpLmF0dHIoIndpZHRoIixBKS5hdHRyKCJoZWlnaHQiLHkpfTtmLnBvc2l0aW9uVHJpYW5nbGU9ZnVuY3Rpb24ocSx1LHgsQSx5KXt5Lz0yO0EvPTI7dT1bW3UseC15XSxbdStBLAp4K3ldLFt1LUEseCt5XV07cS50cmFuc2l0aW9uKCkuYXR0cigicG9pbnRzIix1Lm1hcCh3PT53LmpvaW4oIiwiKSkuam9pbigiICIpKX07Zi5wb3NpdGlvbkJ1dHRvbj1mdW5jdGlvbihxLHUpe2xldCB4PWQubGF5b3V0LmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGUodSkrKHUuZXhwYW5kZWQ/dS53aWR0aDp1LmNvcmVCb3gud2lkdGgpLzItNixBPXUueS0odS5leHBhbmRlZD91LmhlaWdodDp1LmNvcmVCb3guaGVpZ2h0KS8yKzY7dS5ub2RlLnR5cGUhPT1kLk5vZGVUeXBlLlNFUklFU3x8dS5leHBhbmRlZHx8KHgrPTEwLEEtPTIpO3U9InRyYW5zbGF0ZSgiK3grIiwiK0ErIikiO3Euc2VsZWN0QWxsKCJwYXRoIikudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsdSk7cS5zZWxlY3QoImNpcmNsZSIpLnRyYW5zaXRpb24oKS5hdHRyKHtjeDp4LGN5OkEscjpkLmxheW91dC5QQVJBTVMubm9kZVNpemUubWV0YS5leHBhbmRCdXR0b25SYWRpdXN9KX07Zi5wb3NpdGlvbkVsbGlwc2U9CmZ1bmN0aW9uKHEsdSx4LEEseSl7cS50cmFuc2l0aW9uKCkuYXR0cigiY3giLHUpLmF0dHIoImN5Iix4KS5hdHRyKCJyeCIsQS8yKS5hdHRyKCJyeSIseS8yKX07Zi5odW1hbml6ZUhlYWx0aFBpbGxTdGF0PXA7Zi5hZGRIZWFsdGhQaWxsPW47Zi5hZGRIZWFsdGhQaWxscz1mdW5jdGlvbihxLHUseCl7aWYodSl7dmFyIEE9MTtkMy5zZWxlY3QocSkuc2VsZWN0QWxsKCJnLm5vZGVzaGFwZSIpLmVhY2goZnVuY3Rpb24oeSl7Y29uc3Qgdz11W3kubm9kZS5uYW1lXTtuKHRoaXMsdz93W3hdOm51bGwseSxBKyspfSl9fX0pKGQuc2NlbmV8fChkLnNjZW5lPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi90ZW1wbGF0ZS5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBoKG4pe2xldCBxPV8ubWFwKHtkZXB0aDpuLmRlcHRoLCJ8VnwiOm4ubWV0YWdyYXBoLm5vZGVzKCkubGVuZ3RoLCJ8RXwiOm4ubWV0YWdyYXBoLmVkZ2VzKCkubGVuZ3RofSxmdW5jdGlvbih1LHgpe3JldHVybiB4KyJceDNkIit1fSkuam9pbigiICIpO249Xy5tYXAobi5vcEhpc3RvZ3JhbSxmdW5jdGlvbih1LHgpe3JldHVybiB4KyJceDNkIit1fSkuam9pbigiLCIpO3JldHVybiBxKyIgW29wc10gIitufWZ1bmN0aW9uIGsobil7Y29uc3QgcT1uLmdldE5vZGVNYXAoKTtsZXQgdT1PYmplY3Qua2V5cyhxKS5yZWR1Y2UoKHgsQSk9Pntjb25zdCB5PXFbQV07aWYoeS50eXBlIT09ZC5Ob2RlVHlwZS5NRVRBKXJldHVybiB4O0E9QS5zcGxpdCgiLyIpLmxlbmd0aC0xO2xldCB3PWgoeSksQz14W3ddfHx7bm9kZXM6W10sbGV2ZWw6QX07eFt3XT1DO0Mubm9kZXMucHVzaCh5KTtDLmxldmVsPkEmJihDLmxldmVsPQpBKTtyZXR1cm4geH0se30pO3JldHVybiBPYmplY3Qua2V5cyh1KS5tYXAoeD0+W3gsdVt4XV0pLmZpbHRlcigoWyx4XSk9Pnt4PXgubm9kZXM7aWYoMTx4Lmxlbmd0aClyZXR1cm4hMDt4PXhbMF07cmV0dXJuIHgudHlwZT09PWQuTm9kZVR5cGUuTUVUQSYmeC5hc3NvY2lhdGVkRnVuY3Rpb259KS5zb3J0KChbLHhdKT0+eC5ub2Rlc1swXS5kZXB0aCl9ZnVuY3Rpb24gdChuLHEpe3JldHVybiBfLnJlZHVjZShuLGZ1bmN0aW9uKHUseCl7bGV0IEE9eFswXSx5PVtdO3hbMV0ubm9kZXMuZm9yRWFjaChmdW5jdGlvbih3KXtmb3IobGV0IEM9MDtDPHkubGVuZ3RoO0MrKylpZighcXx8cCh5W0NdLm1ldGFub2RlLm1ldGFncmFwaCx3Lm1ldGFncmFwaCkpe3cudGVtcGxhdGVJZD15W0NdLm1ldGFub2RlLnRlbXBsYXRlSWQ7eVtDXS5tZW1iZXJzLnB1c2gody5uYW1lKTtyZXR1cm59dy50ZW1wbGF0ZUlkPUErIlsiK3kubGVuZ3RoKyJdIjt5LnB1c2goe21ldGFub2RlOncsbWVtYmVyczpbdy5uYW1lXX0pfSk7CnkuZm9yRWFjaChmdW5jdGlvbih3KXt1W3cubWV0YW5vZGUudGVtcGxhdGVJZF09e2xldmVsOnhbMV0ubGV2ZWwsbm9kZXM6dy5tZW1iZXJzfX0pO3JldHVybiB1fSx7fSl9ZnVuY3Rpb24gbChuLHEsdSl7cmV0dXJuIF8uc29ydEJ5KG4sW3g9PnEubm9kZSh4KS5vcCx4PT5xLm5vZGUoeCkudGVtcGxhdGVJZCx4PT5xLm5laWdoYm9ycyh4KS5sZW5ndGgseD0+cS5wcmVkZWNlc3NvcnMoeCkubGVuZ3RoLHg9PnEuc3VjY2Vzc29ycyh4KS5sZW5ndGgseD0+eC5zdWJzdHIodS5sZW5ndGgpXSl9ZnVuY3Rpb24gcChuLHEpe2Z1bmN0aW9uIHUoSSxOKXtsZXQgTz1JLnN1YnN0cih4Lmxlbmd0aCksSD1OLnN1YnN0cihBLmxlbmd0aCk7aWYoeVtPXV53W0hdKXJldHVybiBjb25zb2xlLndhcm4oImRpZmZlcmVudCB2aXNpdCBwYXR0ZXJuIiwiWyIreCsiXSIsTywiWyIrQSsiXSIsSCksITA7eVtPXXx8KHlbT109d1tIXT0hMCxDLnB1c2goe24xOkksbjI6Tn0pKTtyZXR1cm4hMX1pZighYi5ncmFwaC5oYXNTaW1pbGFyRGVncmVlU2VxdWVuY2UobiwKcSkpcmV0dXJuITE7bGV0IHg9bi5ncmFwaCgpLm5hbWUsQT1xLmdyYXBoKCkubmFtZSx5PXt9LHc9e30sQz1bXTt2YXIgRz1uLnNvdXJjZXMoKSxEPXEuc291cmNlcygpO2lmKEcubGVuZ3RoIT09RC5sZW5ndGgpcmV0dXJuIGNvbnNvbGUubG9nKCJkaWZmZXJlbnQgc291cmNlIGxlbmd0aCIpLCExO0c9bChHLG4seCk7RD1sKEQscSxBKTtmb3IodmFyIEI9MDtCPEcubGVuZ3RoO0IrKylpZih1KEdbQl0sRFtCXSkpcmV0dXJuITE7Zm9yKDswPEMubGVuZ3RoOyl7RD1DLnBvcCgpO2lmKCFtKG4ubm9kZShELm4xKSxxLm5vZGUoRC5uMikpKXJldHVybiExO0c9bi5zdWNjZXNzb3JzKEQubjEpO0Q9cS5zdWNjZXNzb3JzKEQubjIpO2lmKEcubGVuZ3RoIT09RC5sZW5ndGgpcmV0dXJuIGNvbnNvbGUubG9nKCIjIG9mIHN1Y2Nlc3NvcnMgbWlzbWF0Y2giLEcsRCksITE7Rz1sKEcsbix4KTtEPWwoRCxxLEEpO2ZvcihCPTA7QjxHLmxlbmd0aDtCKyspaWYodShHW0JdLERbQl0pKXJldHVybiExfXJldHVybiEwfQpmdW5jdGlvbiBtKG4scSl7aWYobi50eXBlPT09ZC5Ob2RlVHlwZS5NRVRBKXJldHVybiBuLnRlbXBsYXRlSWQmJnEudGVtcGxhdGVJZCYmbi50ZW1wbGF0ZUlkPT09cS50ZW1wbGF0ZUlkO2lmKG4udHlwZT09PWQuTm9kZVR5cGUuT1AmJnEudHlwZT09PWQuTm9kZVR5cGUuT1ApcmV0dXJuIG4ub3A9PT1xLm9wO2lmKG4udHlwZT09PWQuTm9kZVR5cGUuU0VSSUVTJiZxLnR5cGU9PT1kLk5vZGVUeXBlLlNFUklFUyl7bGV0IHU9bi5tZXRhZ3JhcGgubm9kZUNvdW50KCk7cmV0dXJuIHU9PT1xLm1ldGFncmFwaC5ub2RlQ291bnQoKSYmKDA9PT11fHxuLm1ldGFncmFwaC5ub2RlKG4ubWV0YWdyYXBoLm5vZGVzKClbMF0pLm9wPT09cS5tZXRhZ3JhcGgubm9kZShxLm1ldGFncmFwaC5ub2RlcygpWzBdKS5vcCl9cmV0dXJuITF9Zi5kZXRlY3Q9ZnVuY3Rpb24obixxKXtuPWsobik7bGV0IHU9dChuLHEpO3JldHVybiBPYmplY3Qua2V5cyh1KS5zb3J0KHg9PnVbeF0ubGV2ZWwpLnJlZHVjZSgoeCwKQSk9Pnt4W0FdPXVbQV07cmV0dXJuIHh9LHt9KX19KShkLnRlbXBsYXRlfHwoZC50ZW1wbGF0ZT17fSkpfSkoYi5ncmFwaHx8KGIuZ3JhcGg9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb21tb24vdXRpbC5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmLnRpbWU9ZnVuY3Rpb24oaCxrKXtsZXQgdD1EYXRlLm5vdygpO2s9aygpO2NvbnNvbGUubG9nKGgsIjoiLERhdGUubm93KCktdCwibXMiKTtyZXR1cm4ga307Zi5nZXRUcmFja2VyPWZ1bmN0aW9uKGgpe3JldHVybntzZXRNZXNzYWdlOmZ1bmN0aW9uKGspe2guc2V0KCJwcm9ncmVzcyIse3ZhbHVlOmgucHJvZ3Jlc3MudmFsdWUsbXNnOmt9KX0sdXBkYXRlUHJvZ3Jlc3M6ZnVuY3Rpb24oayl7aC5zZXQoInByb2dyZXNzIix7dmFsdWU6aC5wcm9ncmVzcy52YWx1ZStrLG1zZzpoLnByb2dyZXNzLm1zZ30pfSxyZXBvcnRFcnJvcjpmdW5jdGlvbihrLHQpe2NvbnNvbGUuZXJyb3IodC5zdGFjayk7aC5zZXQoInByb2dyZXNzIix7dmFsdWU6aC5wcm9ncmVzcy52YWx1ZSxtc2c6ayxlcnJvcjohMH0pfX19O2YuZ2V0U3VidGFza1RyYWNrZXI9ZnVuY3Rpb24oaCxrLHQpe3JldHVybntzZXRNZXNzYWdlOmZ1bmN0aW9uKGwpe2guc2V0TWVzc2FnZSh0KwoiOiAiK2wpfSx1cGRhdGVQcm9ncmVzczpmdW5jdGlvbihsKXtoLnVwZGF0ZVByb2dyZXNzKGwqay8xMDApfSxyZXBvcnRFcnJvcjpmdW5jdGlvbihsLHApe2gucmVwb3J0RXJyb3IodCsiOiAiK2wscCl9fX07Zi5ydW5UYXNrPWZ1bmN0aW9uKGgsayl7ay5zZXRNZXNzYWdlKCJSZWFkaW5nIG1ldGFkYXRhIHBidHh0Iik7dHJ5e2xldCB0PWIuZ3JhcGgudXRpbC50aW1lKCJSZWFkaW5nIG1ldGFkYXRhIHBidHh0IixoKTtrLnVwZGF0ZVByb2dyZXNzKDQwKTtyZXR1cm4gdH1jYXRjaCh0KXtrLnJlcG9ydEVycm9yKCJGYWlsZWQgUmVhZGluZyBtZXRhZGF0YSBwYnR4dCIsdCl9fTtmLnJ1bkFzeW5jVGFzaz1mdW5jdGlvbihoLGssdCxsKXtyZXR1cm4gbmV3IFByb21pc2UocD0+e2wuc2V0TWVzc2FnZShoKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dHJ5e2xldCBtPWIuZ3JhcGgudXRpbC50aW1lKGgsdCk7bC51cGRhdGVQcm9ncmVzcyhrKTtwKG0pfWNhdGNoKG0pe2wucmVwb3J0RXJyb3IoIkZhaWxlZCAiKwpoLG0pfX0sMjApfSl9O2YucnVuQXN5bmNQcm9taXNlVGFzaz1mdW5jdGlvbihoLGssdCxsKXtyZXR1cm4gbmV3IFByb21pc2UoKHAsbSk9PntmdW5jdGlvbiBuKHEpe2wucmVwb3J0RXJyb3IoIkZhaWxlZCAiK2gscSk7bShxKX1sLnNldE1lc3NhZ2UoaCk7c2V0VGltZW91dChmdW5jdGlvbigpe3RyeXtsZXQgcT1EYXRlLm5vdygpO3QoKS50aGVuKGZ1bmN0aW9uKHUpe2NvbnNvbGUubG9nKGgsIjoiLERhdGUubm93KCktcSwibXMiKTtsLnVwZGF0ZVByb2dyZXNzKGspO3AodSl9KS5jYXRjaChuKX1jYXRjaChxKXtuKHEpfX0sMjApfSl9O2YuZXNjYXBlUXVlcnlTZWxlY3Rvcj1mdW5jdGlvbihoKXtyZXR1cm4gaC5yZXBsYWNlKC8oWzouXFtcXSwvXFxcKFwpXSkvZywiXFwkMSIpfTtmLk1FTU9SWV9VTklUUz1be3N5bWJvbDoiQiJ9LHtzeW1ib2w6IktCIixudW1Vbml0czoxMDI0fSx7c3ltYm9sOiJNQiIsbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiR0IiLG51bVVuaXRzOjEwMjR9LHtzeW1ib2w6IlRCIiwKbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiUEIiLG51bVVuaXRzOjEwMjR9XTtmLlRJTUVfVU5JVFM9W3tzeW1ib2w6Ilx1MDBiNXMifSx7c3ltYm9sOiJtcyIsbnVtVW5pdHM6MUUzfSx7c3ltYm9sOiJzIixudW1Vbml0czoxRTN9LHtzeW1ib2w6Im1pbiIsbnVtVW5pdHM6NjB9LHtzeW1ib2w6ImhyIixudW1Vbml0czo2MH0se3N5bWJvbDoiZGF5cyIsbnVtVW5pdHM6MjR9XTtmLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZT1mdW5jdGlvbihoLGssdD0wKXtyZXR1cm4gdCsxPGsubGVuZ3RoJiZoPj1rW3QrMV0ubnVtVW5pdHM/Yi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShoL2tbdCsxXS5udW1Vbml0cyxrLHQrMSk6TnVtYmVyKGgudG9QcmVjaXNpb24oMykpKyIgIitrW3RdLnN5bWJvbH07Zi5oYXNEaXNwbGF5YWJsZU5vZGVTdGF0cz1mdW5jdGlvbihoKXtyZXR1cm4gaCYmKDA8aC50b3RhbEJ5dGVzfHwwPGguZ2V0VG90YWxNaWNyb3MoKXx8aC5vdXRwdXRTaXplKT8KITA6ITF9O2YucmVtb3ZlQ29tbW9uUHJlZml4PWZ1bmN0aW9uKGgpe2lmKDI+aC5sZW5ndGgpcmV0dXJuIGg7bGV0IGs9MCx0PTAsbD1fLm1pbihfLm1hcChoLHA9PnAubGVuZ3RoKSk7Zm9yKDs7KXtrKys7bGV0IHA9Xy5tYXAoaCxtPT5tLnN1YnN0cmluZygwLGspKTtpZihwLmV2ZXJ5KChtLG4pPT4wPT09bj8hMDptPT09cFtuLTFdKSl7aWYoaz49bClyZXR1cm4gaDt0PWt9ZWxzZSBicmVha31yZXR1cm4gXy5tYXAoaCxwPT5wLnN1YnN0cmluZyh0KSl9O2YuY29tcHV0ZUh1bWFuRnJpZW5kbHlUaW1lPWZ1bmN0aW9uKGgpe2g9K25ldyBEYXRlLStuZXcgRGF0ZShoLzFFMyk7cmV0dXJuIDNFND5oPyJqdXN0IG5vdyI6NkU0Pmg/TWF0aC5mbG9vcihoLzFFMykrIiBzZWNvbmRzIGFnbyI6MTJFND5oPyJhIG1pbnV0ZSBhZ28iOjM2RTU+aD9NYXRoLmZsb29yKGgvNkU0KSsiIG1pbnV0ZXMgYWdvIjoxPT1NYXRoLmZsb29yKGgvMzZFNSk/ImFuIGhvdXIgYWdvIjo4NjRFNT5oP01hdGguZmxvb3IoaC8KMzZFNSkrIiBob3VycyBhZ28iOjE3MjhFNT5oPyJ5ZXN0ZXJkYXkiOk1hdGguZmxvb3IoaC84NjRFNSkrIiBkYXlzIGFnbyJ9fSkoZC51dGlsfHwoZC51dGlsPXt9KSl9KShiLmdyYXBofHwoYi5ncmFwaD17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi9taW5pbWFwLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7Y2xhc3MgZntjb25zdHJ1Y3RvcihoLGssdCxsLHAsbSl7dGhpcy5zdmc9aDt0aGlzLmxhYmVsUGFkZGluZz1tO3RoaXMuem9vbUc9azt0aGlzLm1haW5ab29tPXQ7dGhpcy5tYXhXYW5kSD1wO2g9ZDMuc2VsZWN0KGwuc2hhZG93Um9vdCk7bGV0IG49aC5zZWxlY3QoInN2ZyIpLHE9bi5zZWxlY3QoInJlY3QiKTt0aGlzLnZpZXdwb2ludENvb3JkPXt4OjAseTowfTtrPWQzLmRyYWcoKS5zdWJqZWN0KE9iamVjdCkub24oImRyYWciLCgpPT57dGhpcy52aWV3cG9pbnRDb29yZC54PWQzLmV2ZW50Lng7dGhpcy52aWV3cG9pbnRDb29yZC55PWQzLmV2ZW50Lnk7dGhpcy51cGRhdGVWaWV3cG9pbnQoKX0pO3EuZGF0dW0odGhpcy52aWV3cG9pbnRDb29yZCkuY2FsbChrKTtuLm9uKCJjbGljayIsKCk9PntpZighZDMuZXZlbnQuZGVmYXVsdFByZXZlbnRlZCl7dmFyIHU9TnVtYmVyKHEuYXR0cigid2lkdGgiKSkseD1OdW1iZXIocS5hdHRyKCJoZWlnaHQiKSksCkE9ZDMubW91c2Uobi5ub2RlKCkpO3RoaXMudmlld3BvaW50Q29vcmQueD1BWzBdLXUvMjt0aGlzLnZpZXdwb2ludENvb3JkLnk9QVsxXS14LzI7dGhpcy51cGRhdGVWaWV3cG9pbnQoKX19KTt0aGlzLnZpZXdwb2ludD1xLm5vZGUoKTt0aGlzLm1pbmltYXBTdmc9bi5ub2RlKCk7dGhpcy5taW5pbWFwPWw7dGhpcy5jYW52YXM9aC5zZWxlY3QoImNhbnZhcy5maXJzdCIpLm5vZGUoKTt0aGlzLmNhbnZhc0J1ZmZlcj1oLnNlbGVjdCgiY2FudmFzLnNlY29uZCIpLm5vZGUoKTt0aGlzLmRvd25sb2FkQ2FudmFzPWguc2VsZWN0KCJjYW52YXMuZG93bmxvYWQiKS5ub2RlKCk7ZDMuc2VsZWN0KHRoaXMuZG93bmxvYWRDYW52YXMpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpO3RoaXMudXBkYXRlKCl9dXBkYXRlVmlld3BvaW50KCl7ZDMuc2VsZWN0KHRoaXMudmlld3BvaW50KS5hdHRyKCJ4Iix0aGlzLnZpZXdwb2ludENvb3JkLngpLmF0dHIoInkiLHRoaXMudmlld3BvaW50Q29vcmQueSk7bGV0IGg9Ci10aGlzLnZpZXdwb2ludENvb3JkLngqdGhpcy5zY2FsZU1haW4vdGhpcy5zY2FsZU1pbmltYXAsaz0tdGhpcy52aWV3cG9pbnRDb29yZC55KnRoaXMuc2NhbGVNYWluL3RoaXMuc2NhbGVNaW5pbWFwO2QzLnNlbGVjdCh0aGlzLnN2ZykuY2FsbCh0aGlzLm1haW5ab29tLnRyYW5zZm9ybSxkMy56b29tSWRlbnRpdHkudHJhbnNsYXRlKGgsaykuc2NhbGUodGhpcy5zY2FsZU1haW4pKX11cGRhdGUoKXtsZXQgaD1udWxsO3RyeXtpZihoPXRoaXMuem9vbUcuZ2V0QkJveCgpLDA9PT1oLndpZHRoKXJldHVybn1jYXRjaCh1KXtyZXR1cm59dmFyIGs9ZDMuc2VsZWN0KCIjZ3JhcGhkb3dubG9hZCIpO3RoaXMuZG93bmxvYWQ9ay5ub2RlKCk7ay5vbigiY2xpY2siLCgpPT57VVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLmRvd25sb2FkLmhyZWYpO3ZhciB1PXRoaXMuZG93bmxvYWRDYW52YXMudG9EYXRhVVJMKCJpbWFnZS9wbmciKTtjb25zdCB4PXUuc2xpY2UoMCx1LmluZGV4T2YoIiwiKSk7aWYoeC5lbmRzV2l0aCgiO2Jhc2U2NCIpKXt2YXIgQT0KYXRvYih1LnNsaWNlKHUuaW5kZXhPZigiLCIpKzEpKTt1PShuZXcgVWludDhBcnJheShBLmxlbmd0aCkpLm1hcCgoeSx3KT0+QS5jaGFyQ29kZUF0KHcpKTt0aGlzLmRvd25sb2FkLmhyZWY9VVJMLmNyZWF0ZU9iamVjdFVSTChuZXcgQmxvYihbdV0se3R5cGU6ImltYWdlL3BuZyJ9KSl9ZWxzZSBjb25zb2xlLndhcm4oYG5vbi1iYXNlNjQgZGF0YSBVUkwgKCR7eH0pOyBjYW5ub3QgdXNlIGJsb2IgZG93bmxvYWRgKSx0aGlzLmRvd25sb2FkLmhyZWY9dX0pO2s9ZDMuc2VsZWN0KHRoaXMuc3ZnKTt2YXIgdD0iIixsPXRoaXMuc3ZnO2w9KGwuZ2V0Um9vdE5vZGU/bC5nZXRSb290Tm9kZSgpOnRoaXMuc3ZnLnBhcmVudE5vZGUpLnN0eWxlU2hlZXRzO2Zvcih2YXIgcD0wO3A8bC5sZW5ndGg7cCsrKXRyeXt2YXIgbT1sW3BdLmNzc1J1bGVzfHxsW3BdLnJ1bGVzO2lmKG51bGwhPW0pZm9yKGxldCB1PTA7dTxtLmxlbmd0aDt1KyspdCs9bVt1XS5jc3NUZXh0LnJlcGxhY2UoLyA/dGYtW1x3LV0rID8vZywKIiIpKyJcbiJ9Y2F0Y2godSl7aWYoIlNlY3VyaXR5RXJyb3IiIT09dS5uYW1lKXRocm93IHU7fW09ay5hcHBlbmQoInN0eWxlIik7bS50ZXh0KHQpO3Q9ZDMuc2VsZWN0KHRoaXMuem9vbUcpO2w9dC5hdHRyKCJ0cmFuc2Zvcm0iKTt0LmF0dHIoInRyYW5zZm9ybSIsbnVsbCk7aC5oZWlnaHQrPWgueTtoLndpZHRoKz1oLng7aC5oZWlnaHQrPTIqdGhpcy5sYWJlbFBhZGRpbmc7aC53aWR0aCs9Mip0aGlzLmxhYmVsUGFkZGluZztrLmF0dHIoIndpZHRoIixoLndpZHRoKS5hdHRyKCJoZWlnaHQiLGguaGVpZ2h0KTt0aGlzLnNjYWxlTWluaW1hcD10aGlzLm1heFdhbmRIL01hdGgubWF4KGgud2lkdGgsaC5oZWlnaHQpO3RoaXMubWluaW1hcFNpemU9e3dpZHRoOmgud2lkdGgqdGhpcy5zY2FsZU1pbmltYXAsaGVpZ2h0OmguaGVpZ2h0KnRoaXMuc2NhbGVNaW5pbWFwfTtkMy5zZWxlY3QodGhpcy5taW5pbWFwU3ZnKS5hdHRyKHRoaXMubWluaW1hcFNpemUpO2QzLnNlbGVjdCh0aGlzLmNhbnZhc0J1ZmZlcikuYXR0cih0aGlzLm1pbmltYXBTaXplKTsKcD1kMy5zZWxlY3QodGhpcy5kb3dubG9hZENhbnZhcyk7cC5zdHlsZSgid2lkdGgiLGgud2lkdGgpO3Auc3R5bGUoImhlaWdodCIsaC5oZWlnaHQpO3AuYXR0cigid2lkdGgiLDMqaC53aWR0aCk7cC5hdHRyKCJoZWlnaHQiLDMqaC5oZWlnaHQpO251bGwhPXRoaXMudHJhbnNsYXRlJiZudWxsIT10aGlzLnpvb20mJnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKT0+dGhpcy56b29tKCkpO2xldCBuPShuZXcgWE1MU2VyaWFsaXplcikuc2VyaWFsaXplVG9TdHJpbmcodGhpcy5zdmcpO20ucmVtb3ZlKCk7ay5hdHRyKCJ3aWR0aCIsbnVsbCkuYXR0cigiaGVpZ2h0IixudWxsKTt0LmF0dHIoInRyYW5zZm9ybSIsbCk7bGV0IHE9bmV3IEltYWdlO3Eub25sb2FkPSgpPT57dmFyIHU9dGhpcy5jYW52YXNCdWZmZXIuZ2V0Q29udGV4dCgiMmQiKTt1LmNsZWFyUmVjdCgwLDAsdGhpcy5jYW52YXNCdWZmZXIud2lkdGgsdGhpcy5jYW52YXNCdWZmZXIuaGVpZ2h0KTt1LmRyYXdJbWFnZShxLDAsMCx0aGlzLm1pbmltYXBTaXplLndpZHRoLAp0aGlzLm1pbmltYXBTaXplLmhlaWdodCk7cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpPT57ZDMuc2VsZWN0KHRoaXMuY2FudmFzQnVmZmVyKS5zdHlsZSgiZGlzcGxheSIsbnVsbCk7ZDMuc2VsZWN0KHRoaXMuY2FudmFzKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKTtbdGhpcy5jYW52YXMsdGhpcy5jYW52YXNCdWZmZXJdPVt0aGlzLmNhbnZhc0J1ZmZlcix0aGlzLmNhbnZhc119KTt1PXRoaXMuZG93bmxvYWRDYW52YXMuZ2V0Q29udGV4dCgiMmQiKTt1LmNsZWFyUmVjdCgwLDAsdGhpcy5kb3dubG9hZENhbnZhcy53aWR0aCx0aGlzLmRvd25sb2FkQ2FudmFzLmhlaWdodCk7dS5kcmF3SW1hZ2UocSwwLDAsdGhpcy5kb3dubG9hZENhbnZhcy53aWR0aCx0aGlzLmRvd25sb2FkQ2FudmFzLmhlaWdodCl9O3Eub25lcnJvcj0oKT0+e3Euc3JjPVVSTC5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW25dLHt0eXBlOiJpbWFnZS9zdmcreG1sO2NoYXJzZXRceDNkdXRmLTgifSkpfTtxLnNyYz0KImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0XHgzZHV0Zi04LCIrZW5jb2RlVVJJQ29tcG9uZW50KG4pfXpvb20oaCl7aWYobnVsbCE9dGhpcy5zY2FsZU1pbmltYXApe2gmJih0aGlzLnRyYW5zbGF0ZT1baC54LGgueV0sdGhpcy5zY2FsZU1haW49aC5rKTt2YXIgaz10aGlzLnN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0PWQzLnNlbGVjdCh0aGlzLnZpZXdwb2ludCk7dGhpcy52aWV3cG9pbnRDb29yZC54PS10aGlzLnRyYW5zbGF0ZVswXSp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjt0aGlzLnZpZXdwb2ludENvb3JkLnk9LXRoaXMudHJhbnNsYXRlWzFdKnRoaXMuc2NhbGVNaW5pbWFwL3RoaXMuc2NhbGVNYWluO2g9ay53aWR0aCp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbjtrPWsuaGVpZ2h0KnRoaXMuc2NhbGVNaW5pbWFwL3RoaXMuc2NhbGVNYWluO3QuYXR0cigieCIsdGhpcy52aWV3cG9pbnRDb29yZC54KS5hdHRyKCJ5Iix0aGlzLnZpZXdwb2ludENvb3JkLnkpLmF0dHIoIndpZHRoIiwKaCkuYXR0cigiaGVpZ2h0IixrKTt0PXRoaXMubWluaW1hcFNpemUud2lkdGg7dmFyIGw9dGhpcy5taW5pbWFwU2l6ZS5oZWlnaHQscD10aGlzLnZpZXdwb2ludENvb3JkLngsbT10aGlzLnZpZXdwb2ludENvb3JkLnk7Ljg+KE1hdGgubWluKE1hdGgubWF4KDAscCtoKSx0KS1NYXRoLm1pbihNYXRoLm1heCgwLHApLHQpKSooTWF0aC5taW4oTWF0aC5tYXgoMCxtK2spLGwpLU1hdGgubWluKE1hdGgubWF4KDAsbSksbCkpLyh0KmwpP3RoaXMubWluaW1hcC5jbGFzc0xpc3QucmVtb3ZlKCJoaWRkZW4iKTp0aGlzLm1pbmltYXAuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIil9fX1kLk1pbmltYXA9Zn0pKGIuc2NlbmV8fChiLnNjZW5lPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgvdGYtZ3JhcGgtbWluaW1hcC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1taW5pbWFwIixpbml0OmZ1bmN0aW9uKGIsZCxmLGgsayl7cmV0dXJuIG5ldyB0Zi5zY2VuZS5NaW5pbWFwKGIsZCxmLHRoaXMsaCxrKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC90Zi1ncmFwaC1zY2VuZS5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1zY2VuZSIscHJvcGVydGllczp7cmVuZGVySGllcmFyY2h5Ok9iamVjdCxuYW1lOlN0cmluZyxjb2xvckJ5OlN0cmluZyx0cmFjZUlucHV0czpCb29sZWFuLF9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZTpCb29sZWFuLF9pc0F0dGFjaGVkOkJvb2xlYW4sX3pvb206T2JqZWN0LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9oaWdobGlnaHRlZE5vZGVDaGFuZ2VkIn0sc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX3NlbGVjdGVkTm9kZUNoYW5nZWQifSxoYW5kbGVFZGdlU2VsZWN0ZWQ6T2JqZWN0LF96b29tZWQ6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX29uWm9vbUNoYW5nZWQiLHZhbHVlOiExfSxfem9vbVN0YXJ0Q29vcmRzOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfem9vbVRyYW5zZm9ybTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX21heFpvb21EaXN0YW5jZUZvckNsaWNrOnt0eXBlOk51bWJlciwKdmFsdWU6MjB9LHRlbXBsYXRlSW5kZXg6RnVuY3Rpb24sbWluaW1hcDpPYmplY3QsX25vZGVHcm91cEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sX2Fubm90YXRpb25Hcm91cEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sX2VkZ2VHcm91cEluZGV4Ont0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt9fX0sbWF4TWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplOnt0eXBlOk51bWJlcix2YWx1ZTo5fSxtaW5NZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjZ9LG1heE1ldGFub2RlTGFiZWxMZW5ndGhMYXJnZUZvbnQ6e3R5cGU6TnVtYmVyLHZhbHVlOjExfSxtYXhNZXRhbm9kZUxhYmVsTGVuZ3RoOnt0eXBlOk51bWJlcix2YWx1ZToxOH0scHJvZ3Jlc3M6T2JqZWN0LG5vZGVDb250ZXh0TWVudUl0ZW1zOkFycmF5LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LApoZWFsdGhQaWxsU3RlcEluZGV4Ok51bWJlcn0sb2JzZXJ2ZXJzOlsiX2NvbG9yQnlDaGFuZ2VkKGNvbG9yQnkpIiwiX3JlbmRlckhpZXJhcmNoeUNoYW5nZWQocmVuZGVySGllcmFyY2h5KSIsIl9hbmltYXRlQW5kRml0KF9pc0F0dGFjaGVkLCByZW5kZXJIaWVyYXJjaHkpIiwiX3VwZGF0ZUhlYWx0aFBpbGxzKG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMsIGhlYWx0aFBpbGxTdGVwSW5kZXgpIiwiX3VwZGF0ZUlucHV0VHJhY2UodHJhY2VJbnB1dHMsIHNlbGVjdGVkTm9kZSkiXSxnZXROb2RlOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRSZW5kZXJOb2RlQnlOYW1lKGIpfSxpc05vZGVFeHBhbmRlZDpmdW5jdGlvbihiKXtyZXR1cm4gYi5leHBhbmRlZH0sc2V0Tm9kZUV4cGFuZGVkOmZ1bmN0aW9uKCl7dGhpcy5fYnVpbGQodGhpcy5yZW5kZXJIaWVyYXJjaHkpO3RoaXMuX3VwZGF0ZUxhYmVscyghdGhpcy5fem9vbWVkKX0scGFuVG9Ob2RlKGIpe3RmLmdyYXBoLnNjZW5lLnBhblRvTm9kZShiLAp0aGlzLiQuc3ZnLHRoaXMuJC5yb290LHRoaXMuX3pvb20pJiYodGhpcy5fem9vbWVkPSEwKX0sZ2V0R3JhcGhTdmdSb290KCl7cmV0dXJuIHRoaXMuJC5zdmd9LGdldENvbnRleHRNZW51KCl7cmV0dXJuIHRoaXMuJC5jb250ZXh0TWVudX0sX3Jlc2V0U3RhdGU6ZnVuY3Rpb24oKXt0aGlzLl9ub2RlR3JvdXBJbmRleD17fTt0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleD17fTt0aGlzLl9lZGdlR3JvdXBJbmRleD17fTt0aGlzLl91cGRhdGVMYWJlbHMoITEpO2QzLnNlbGVjdCh0aGlzLiQuc3ZnKS5zZWxlY3QoIiNyb290Iikuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7dGYuZ3JhcGguc2NlbmUubm9kZS5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zKHRoaXMuJC5zdmcpfSxfYnVpbGQ6ZnVuY3Rpb24oYil7dGhpcy50ZW1wbGF0ZUluZGV4PWIuaGllcmFyY2h5LmdldFRlbXBsYXRlSW5kZXgoKTt0Zi5ncmFwaC51dGlsLnRpbWUoInRmLWdyYXBoLXNjZW5lIChsYXlvdXQpOiIsZnVuY3Rpb24oKXt0Zi5ncmFwaC5sYXlvdXQubGF5b3V0U2NlbmUoYi5yb290LAp0aGlzKX0uYmluZCh0aGlzKSk7dGYuZ3JhcGgudXRpbC50aW1lKCJ0Zi1ncmFwaC1zY2VuZSAoYnVpbGQgc2NlbmUpOiIsZnVuY3Rpb24oKXt0Zi5ncmFwaC5zY2VuZS5idWlsZEdyb3VwKGQzLnNlbGVjdCh0aGlzLiQucm9vdCksYi5yb290LHRoaXMpO3RmLmdyYXBoLnNjZW5lLmFkZEdyYXBoQ2xpY2tMaXN0ZW5lcih0aGlzLiQuc3ZnLHRoaXMpO3RoaXMuX3VwZGF0ZUlucHV0VHJhY2UoKX0uYmluZCh0aGlzKSk7c2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUhlYWx0aFBpbGxzKHRoaXMubm9kZU5hbWVzVG9IZWFsdGhQaWxscyx0aGlzLmhlYWx0aFBpbGxTdGVwSW5kZXgpO3RoaXMubWluaW1hcC51cGRhdGUoKX0uYmluZCh0aGlzKSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLmFuaW1hdGlvbi5kdXJhdGlvbil9LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fem9vbT1kMy56b29tKCkub24oImVuZCIsZnVuY3Rpb24oKXt0aGlzLl96b29tU3RhcnRDb29yZHMmJihNYXRoLnNxcnQoTWF0aC5wb3codGhpcy5fem9vbVN0YXJ0Q29vcmRzLngtCnRoaXMuX3pvb21UcmFuc2Zvcm0ueCwyKStNYXRoLnBvdyh0aGlzLl96b29tU3RhcnRDb29yZHMueS10aGlzLl96b29tVHJhbnNmb3JtLnksMikpPHRoaXMuX21heFpvb21EaXN0YW5jZUZvckNsaWNrP3RoaXMuX2ZpcmVFbmFibGVDbGljaygpOnNldFRpbWVvdXQodGhpcy5fZmlyZUVuYWJsZUNsaWNrLmJpbmQodGhpcyksNTApKTt0aGlzLl96b29tU3RhcnRDb29yZHM9bnVsbH0uYmluZCh0aGlzKSkub24oInpvb20iLGZ1bmN0aW9uKCl7dGhpcy5fem9vbVRyYW5zZm9ybT1kMy5ldmVudC50cmFuc2Zvcm07dGhpcy5fem9vbVN0YXJ0Q29vcmRzfHwodGhpcy5fem9vbVN0YXJ0Q29vcmRzPXRoaXMuX3pvb21UcmFuc2Zvcm0sdGhpcy5maXJlKCJkaXNhYmxlLWNsaWNrIikpO3RoaXMuX3pvb21lZD0hMDtkMy5zZWxlY3QodGhpcy4kLnJvb3QpLmF0dHIoInRyYW5zZm9ybSIsZDMuZXZlbnQudHJhbnNmb3JtKTt0aGlzLm1pbmltYXAuem9vbShkMy5ldmVudC50cmFuc2Zvcm0pfS5iaW5kKHRoaXMpKTsKZDMuc2VsZWN0KHRoaXMuJC5zdmcpLmNhbGwodGhpcy5fem9vbSkub24oImRibGNsaWNrLnpvb20iLG51bGwpO2QzLnNlbGVjdCh3aW5kb3cpLm9uKCJyZXNpemUiLGZ1bmN0aW9uKCl7dGhpcy5taW5pbWFwLnpvb20oKX0uYmluZCh0aGlzKSk7dGhpcy5taW5pbWFwPXRoaXMuJC5taW5pbWFwLmluaXQodGhpcy4kLnN2Zyx0aGlzLiQucm9vdCx0aGlzLl96b29tLHRmLmdyYXBoLmxheW91dC5QQVJBTVMubWluaW1hcC5zaXplLHRmLmdyYXBoLmxheW91dC5QQVJBTVMuc3Vic2NlbmUubWV0YS5sYWJlbEhlaWdodCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwhMCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwhMSl9LF9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlPSExO3RoaXMuX3Jlc2V0U3RhdGUoKTt0aGlzLl9idWlsZChiKX0sX2FuaW1hdGVBbmRGaXQ6ZnVuY3Rpb24oYil7IXRoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlJiYKYiYmc2V0VGltZW91dCh0aGlzLmZpdC5iaW5kKHRoaXMpLHRmLmdyYXBoLmxheW91dC5QQVJBTVMuYW5pbWF0aW9uLmR1cmF0aW9uKX0sX3VwZGF0ZUxhYmVsczpmdW5jdGlvbihiKXt2YXIgZD10aGlzLiQkKCIudGl0bGUiKSxmPWQuc3R5bGUsaD10aGlzLiQkKCIuYXV4VGl0bGUiKSxrPWguc3R5bGUsdD10aGlzLiQkKCIuZnVuY3Rpb25MaWJyYXJ5VGl0bGUiKS5zdHlsZTtjb25zdCBsPWQzLnNlbGVjdCh0aGlzLiQuc3ZnKTt2YXIgcD1sLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5DT1JFKS5ub2RlKCk7aWYoYiYmcCYmdGhpcy5wcm9ncmVzcyYmMTAwPT09dGhpcy5wcm9ncmVzcy52YWx1ZSl7Yj1sLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5JTkVYVFJBQ1QpLm5vZGUoKXx8bC5zZWxlY3QoIi4iKwp0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5HUk9VUCsiXHgzZS4iK3RmLmdyYXBoLnNjZW5lLkNsYXNzLlNjZW5lLk9VVEVYVFJBQ1QpLm5vZGUoKTt2YXIgbT1wLmdldENUTSgpLmU7cD1iP2IuZ2V0Q1RNKCkuZTpudWxsO2YuZGlzcGxheT0iaW5saW5lIjtmLmxlZnQ9bSsicHgiO251bGwhPT1wJiZwIT09bT8oay5kaXNwbGF5PSJpbmxpbmUiLHA9TWF0aC5tYXgobStkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLHApLGsubGVmdD1wKyJweCIpOmsuZGlzcGxheT0ibm9uZSI7ZD0oZD1sLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKS5ub2RlKCkpP2QuZ2V0Q1RNKCkuZTpudWxsO251bGwhPT1kJiZkIT09cD8odC5kaXNwbGF5PSJpbmxpbmUiLGQ9TWF0aC5tYXgocCtoLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLGQpLHQubGVmdD1kKyJweCIpOgp0LmRpc3BsYXk9Im5vbmUifWVsc2UgZi5kaXNwbGF5PSJub25lIixrLmRpc3BsYXk9Im5vbmUiLHQuZGlzcGxheT0ibm9uZSJ9LF9jb2xvckJ5Q2hhbmdlZDpmdW5jdGlvbigpe251bGwhPXRoaXMucmVuZGVySGllcmFyY2h5JiYoXy5lYWNoKHRoaXMuX25vZGVHcm91cEluZGV4LChiLGQpPT57dGhpcy5fdXBkYXRlTm9kZVN0YXRlKGQpfSksdGhpcy5taW5pbWFwLnVwZGF0ZSgpKX0sZml0OmZ1bmN0aW9uKCl7dGhpcy5faGFzUmVuZGVySGllcmFyY2h5QmVlbkZpdE9uY2U9ITA7dGYuZ3JhcGguc2NlbmUuZml0KHRoaXMuJC5zdmcsdGhpcy4kLnJvb3QsdGhpcy5fem9vbSxmdW5jdGlvbigpe3RoaXMuX3pvb21lZD0hMX0uYmluZCh0aGlzKSl9LGlzTm9kZVNlbGVjdGVkOmZ1bmN0aW9uKGIpe3JldHVybiBiPT09dGhpcy5zZWxlY3RlZE5vZGV9LGlzTm9kZUhpZ2hsaWdodGVkOmZ1bmN0aW9uKGIpe3JldHVybiBiPT09dGhpcy5oaWdobGlnaHRlZE5vZGV9LGFkZEFubm90YXRpb25Hcm91cDpmdW5jdGlvbihiLApkLGYpe2I9Yi5ub2RlLm5hbWU7dGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbYl09dGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbYl18fHt9O3RoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2JdW2Qubm9kZS5uYW1lXT1mfSxnZXRBbm5vdGF0aW9uR3JvdXBzSW5kZXg6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4W2JdfSxyZW1vdmVBbm5vdGF0aW9uR3JvdXA6ZnVuY3Rpb24oYixkKXtkZWxldGUgdGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbYi5ub2RlLm5hbWVdW2Qubm9kZS5uYW1lXX0sYWRkTm9kZUdyb3VwOmZ1bmN0aW9uKGIsZCl7dGhpcy5fbm9kZUdyb3VwSW5kZXhbYl09ZH0sZ2V0Tm9kZUdyb3VwOmZ1bmN0aW9uKGIpe3JldHVybiB0aGlzLl9ub2RlR3JvdXBJbmRleFtiXX0scmVtb3ZlTm9kZUdyb3VwOmZ1bmN0aW9uKGIpe2RlbGV0ZSB0aGlzLl9ub2RlR3JvdXBJbmRleFtiXX0sYWRkRWRnZUdyb3VwOmZ1bmN0aW9uKGIsZCl7dGhpcy5fZWRnZUdyb3VwSW5kZXhbYl09CmR9LGdldEVkZ2VHcm91cDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5fZWRnZUdyb3VwSW5kZXhbYl19LF91cGRhdGVIZWFsdGhQaWxsczpmdW5jdGlvbihiLGQpe3RmLmdyYXBoLnNjZW5lLmFkZEhlYWx0aFBpbGxzKHRoaXMuJC5zdmcsYixkKX0sX3VwZGF0ZU5vZGVTdGF0ZTpmdW5jdGlvbihiKXt2YXIgZD10aGlzLmdldE5vZGUoYiksZj10aGlzLmdldE5vZGVHcm91cChiKTtmJiZ0Zi5ncmFwaC5zY2VuZS5ub2RlLnN0eWxpemUoZixkLHRoaXMpO2Qubm9kZS50eXBlPT09dGYuZ3JhcGguTm9kZVR5cGUuTUVUQSYmZC5ub2RlLmFzc29jaWF0ZWRGdW5jdGlvbiYmIWQuaXNMaWJyYXJ5RnVuY3Rpb24mJihmPWQzLnNlbGVjdCgiLiIrdGYuZ3JhcGguc2NlbmUuQ2xhc3MuU2NlbmUuR1JPVVArIlx4M2UuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKycgZ1tkYXRhLW5hbWVceDNkIicrKHRmLmdyYXBoLkZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgrCmQubm9kZS5hc3NvY2lhdGVkRnVuY3Rpb24pKyciXScpLHRmLmdyYXBoLnNjZW5lLm5vZGUuc3R5bGl6ZShmLGQsdGhpcykpO18uZWFjaCh0aGlzLmdldEFubm90YXRpb25Hcm91cHNJbmRleChiKSxoPT57dGYuZ3JhcGguc2NlbmUubm9kZS5zdHlsaXplKGgsZCx0aGlzLHRmLmdyYXBoLnNjZW5lLkNsYXNzLkFubm90YXRpb24uTk9ERSl9KX0sX3NlbGVjdGVkTm9kZUNoYW5nZWQ6ZnVuY3Rpb24oYixkKXtpZihiIT09ZCYmKGQmJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShkKSxiKSl7dGhpcy5taW5pbWFwLnVwZGF0ZSgpO2Q9dGhpcy5yZW5kZXJIaWVyYXJjaHkuaGllcmFyY2h5Lm5vZGUoYik7Zm9yKHZhciBmPVtdO251bGwhPWQucGFyZW50Tm9kZSYmZC5wYXJlbnROb2RlLm5hbWUhPXRmLmdyYXBoLlJPT1RfTkFNRTspZD1kLnBhcmVudE5vZGUsZi5wdXNoKGQubmFtZSk7dmFyIGg7Xy5mb3JFYWNoUmlnaHQoZixrPT57dGhpcy5yZW5kZXJIaWVyYXJjaHkuYnVpbGRTdWJoaWVyYXJjaHkoayk7Cms9dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShrKTtrLm5vZGUuaXNHcm91cE5vZGUmJiFrLmV4cGFuZGVkJiYoay5leHBhbmRlZD0hMCxofHwoaD1rKSl9KTtoJiYodGhpcy5zZXROb2RlRXhwYW5kZWQoaCksdGhpcy5fem9vbWVkPSEwKTtiJiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUoYik7c2V0VGltZW91dCgoKT0+e3RoaXMucGFuVG9Ob2RlKGIpfSx0Zi5ncmFwaC5sYXlvdXQuUEFSQU1TLmFuaW1hdGlvbi5kdXJhdGlvbil9fSxfaGlnaGxpZ2h0ZWROb2RlQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2IhPT1kJiYoYiYmdGhpcy5fdXBkYXRlTm9kZVN0YXRlKGIpLGQmJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShkKSl9LF9vblpvb21DaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlTGFiZWxzKCF0aGlzLl96b29tZWQpfSxfZmlyZUVuYWJsZUNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5maXJlKCJlbmFibGUtY2xpY2siKX0sX3VwZGF0ZUlucHV0VHJhY2U6ZnVuY3Rpb24oKXt0Zi5ncmFwaC5zY2VuZS5ub2RlLnVwZGF0ZUlucHV0VHJhY2UodGhpcy5nZXRHcmFwaFN2Z1Jvb3QoKSwKdGhpcy5yZW5kZXJIaWVyYXJjaHksdGhpcy5zZWxlY3RlZE5vZGUsdGhpcy50cmFjZUlucHV0cyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgvdGYtZ3JhcGguaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZ3JhcGgiLHByb3BlcnRpZXM6e2dyYXBoSGllcmFyY2h5Ont0eXBlOk9iamVjdCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9ncmFwaENoYW5nZWQifSxiYXNpY0dyYXBoOk9iamVjdCxzdGF0czpPYmplY3QsZGV2aWNlc0ZvclN0YXRzOk9iamVjdCxoaWVyYXJjaHlQYXJhbXM6T2JqZWN0LHByb2dyZXNzOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHRpdGxlOlN0cmluZyxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sc2VsZWN0ZWRFZGdlOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LF9sYXN0U2VsZWN0ZWRFZGdlR3JvdXA6T2JqZWN0LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxjb2xvckJ5OlN0cmluZyxjb2xvckJ5UGFyYW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHJlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSx0cmFjZUlucHV0czpCb29sZWFuLApub2RlQ29udGV4dE1lbnVJdGVtczpBcnJheSxfcmVuZGVyRGVwdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LF9hbGxvd0dyYXBoU2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LGhlYWx0aFBpbGxTdGVwSW5kZXg6TnVtYmVyLGVkZ2VXaWR0aEZ1bmN0aW9uOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0saGFuZGxlTm9kZVNlbGVjdGVkOnt0eXBlOk9iamVjdCx2YWx1ZToiIn0sZWRnZUxhYmVsRnVuY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOiIifSxoYW5kbGVFZGdlU2VsZWN0ZWQ6e3R5cGU6T2JqZWN0LHZhbHVlOiIifX0sb2JzZXJ2ZXJzOlsiX3N0YXRzQ2hhbmdlZChzdGF0cywgZGV2aWNlc0ZvclN0YXRzKSIsIl9idWlsZE5ld1JlbmRlckhpZXJhcmNoeShncmFwaEhpZXJhcmNoeSwgZWRnZVdpZHRoRnVuY3Rpb24sIGhhbmRsZU5vZGVTZWxlY3RlZCwgZWRnZUxhYmVsRnVuY3Rpb24sIGhhbmRsZUVkZ2VTZWxlY3RlZCkiLCJfc2VsZWN0ZWROb2RlQ2hhbmdlZChzZWxlY3RlZE5vZGUpIiwKIl9zZWxlY3RlZEVkZ2VDaGFuZ2VkKHNlbGVjdGVkRWRnZSkiXSxwYW5Ub05vZGUoYil7dGhpcy4kJCgidGYtZ3JhcGgtc2NlbmUiKS5wYW5Ub05vZGUoYil9LF9idWlsZE5ld1JlbmRlckhpZXJhcmNoeShiKXtiJiZ0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeShiKX0sX3N0YXRzQ2hhbmdlZDpmdW5jdGlvbihiLGQpe3RoaXMuZ3JhcGhIaWVyYXJjaHkmJihiJiZkJiYodGYuZ3JhcGguam9pblN0YXRzSW5mb1dpdGhHcmFwaCh0aGlzLmJhc2ljR3JhcGgsYixkKSx0Zi5ncmFwaC5oaWVyYXJjaHkuam9pbkFuZEFnZ3JlZ2F0ZVN0YXRzKHRoaXMuZ3JhcGhIaWVyYXJjaHkpKSx0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KSl9LF9idWlsZFJlbmRlckhpZXJhcmNoeTpmdW5jdGlvbihiKXt0Zi5ncmFwaC51dGlsLnRpbWUoIm5ldyB0Zi5ncmFwaC5yZW5kZXIuSGllcmFyY2h5IixmdW5jdGlvbigpe2Z1bmN0aW9uIGQoaCl7cmV0dXJue21pblZhbHVlOmguZG9tYWluKClbMF0sCm1heFZhbHVlOmguZG9tYWluKClbMV0sc3RhcnRDb2xvcjpoLnJhbmdlKClbMF0sZW5kQ29sb3I6aC5yYW5nZSgpWzFdfX1pZihiLnJvb3QudHlwZT09PXRmLmdyYXBoLk5vZGVUeXBlLk1FVEEpe3ZhciBmPW5ldyB0Zi5ncmFwaC5yZW5kZXIuUmVuZGVyR3JhcGhJbmZvKGIsISF0aGlzLnN0YXRzKTtmLmVkZ2VMYWJlbEZ1bmN0aW9uPXRoaXMuZWRnZUxhYmVsRnVuY3Rpb247Zi5lZGdlV2lkdGhGdW5jdGlvbj10aGlzLmVkZ2VXaWR0aEZ1bmN0aW9uO3RoaXMuX3NldENvbG9yQnlQYXJhbXMoe2NvbXB1dGVfdGltZTpkKGYuY29tcHV0ZVRpbWVTY2FsZSksbWVtb3J5OmQoZi5tZW1vcnlVc2FnZVNjYWxlKSxkZXZpY2U6Xy5tYXAoZi5kZXZpY2VDb2xvck1hcC5kb21haW4oKSxmdW5jdGlvbihoKXtyZXR1cm57ZGV2aWNlOmgsY29sb3I6Zi5kZXZpY2VDb2xvck1hcChoKX19KSx4bGFfY2x1c3RlcjpfLm1hcChmLnhsYUNsdXN0ZXJDb2xvck1hcC5kb21haW4oKSxmdW5jdGlvbihoKXtyZXR1cm57eGxhX2NsdXN0ZXI6aCwKY29sb3I6Zi54bGFDbHVzdGVyQ29sb3JNYXAoaCl9fSl9KTt0aGlzLl9zZXRSZW5kZXJIaWVyYXJjaHkoZik7dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuZmlyZSgicmVuZGVyZWQiKX0pfX0uYmluZCh0aGlzKSl9LF9nZXRWaXNpYmxlOmZ1bmN0aW9uKGIpe3JldHVybiBiP3RoaXMucmVuZGVySGllcmFyY2h5LmdldE5lYXJlc3RWaXNpYmxlQW5jZXN0b3IoYik6Yn0sbGlzdGVuZXJzOnsiZ3JhcGgtc2VsZWN0IjoiX2dyYXBoU2VsZWN0ZWQiLCJkaXNhYmxlLWNsaWNrIjoiX2Rpc2FibGVDbGljayIsImVuYWJsZS1jbGljayI6Il9lbmFibGVDbGljayIsIm5vZGUtdG9nZ2xlLWV4cGFuZCI6Il9ub2RlVG9nZ2xlRXhwYW5kIiwibm9kZS1zZWxlY3QiOiJfbm9kZVNlbGVjdGVkIiwibm9kZS1oaWdobGlnaHQiOiJfbm9kZUhpZ2hsaWdodGVkIiwibm9kZS11bmhpZ2hsaWdodCI6Il9ub2RlVW5oaWdobGlnaHRlZCIsIm5vZGUtdG9nZ2xlLWV4dHJhY3QiOiJfbm9kZVRvZ2dsZUV4dHJhY3QiLAoibm9kZS10b2dnbGUtc2VyaWVzZ3JvdXAiOiJfbm9kZVRvZ2dsZVNlcmllc0dyb3VwIiwiZWRnZS1zZWxlY3QiOiJfZWRnZVNlbGVjdGVkIiwiYW5ub3RhdGlvbi1zZWxlY3QiOiJfbm9kZVNlbGVjdGVkIiwiYW5ub3RhdGlvbi1oaWdobGlnaHQiOiJfbm9kZUhpZ2hsaWdodGVkIiwiYW5ub3RhdGlvbi11bmhpZ2hsaWdodCI6Il9ub2RlVW5oaWdobGlnaHRlZCJ9LGZpdDpmdW5jdGlvbigpe3RoaXMuJC5zY2VuZS5maXQoKX0sX2dyYXBoQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZ3JhcGgtc2VsZWN0Iil9LF9ncmFwaFNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdCYmKHRoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLG51bGwpLHRoaXMuc2V0KCJzZWxlY3RlZEVkZ2UiLG51bGwpKTt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfSxfZGlzYWJsZUNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMX0sX2VuYWJsZUNsaWNrOmZ1bmN0aW9uKCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0KITB9LF9zZWxlY3RlZE5vZGVDaGFuZ2VkKGIpe3RoaXMuaGFuZGxlTm9kZVNlbGVjdGVkJiZ0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZChiKX0sX3NlbGVjdGVkRWRnZUNoYW5nZWQoYil7dGhpcy5fZGVzZWxlY3RQcmV2aW91c0VkZ2UoKTtiJiYodGhpcy5fbGFzdFNlbGVjdGVkRWRnZUdyb3VwLmNsYXNzZWQodGYuZ3JhcGguc2NlbmUuQ2xhc3MuRWRnZS5TRUxFQ1RFRCwhMCksdGhpcy5fdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2UoYikpO3RoaXMuaGFuZGxlRWRnZVNlbGVjdGVkJiZ0aGlzLmhhbmRsZUVkZ2VTZWxlY3RlZChiKX0sX25vZGVTZWxlY3RlZDpmdW5jdGlvbihiKXt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0JiZ0aGlzLnNldCgic2VsZWN0ZWROb2RlIixiLmRldGFpbC5uYW1lKTt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfSxfZWRnZVNlbGVjdGVkKGIpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3QmJih0aGlzLnNldCgiX2xhc3RTZWxlY3RlZEVkZ2VHcm91cCIsYi5kZXRhaWwuZWRnZUdyb3VwKSwKdGhpcy5zZXQoInNlbGVjdGVkRWRnZSIsYi5kZXRhaWwuZWRnZURhdGEpKTt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfSxfbm9kZUhpZ2hsaWdodGVkOmZ1bmN0aW9uKGIpe3RoaXMuc2V0KCJoaWdobGlnaHRlZE5vZGUiLGIuZGV0YWlsLm5hbWUpfSxfbm9kZVVuaGlnaGxpZ2h0ZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldCgiaGlnaGxpZ2h0ZWROb2RlIixudWxsKX0sX25vZGVUb2dnbGVFeHBhbmQ6ZnVuY3Rpb24oYil7dGhpcy5fbm9kZVNlbGVjdGVkKGIpO2I9Yi5kZXRhaWwubmFtZTt2YXIgZD10aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRSZW5kZXJOb2RlQnlOYW1lKGIpO2Qubm9kZS50eXBlIT09dGYuZ3JhcGguTm9kZVR5cGUuT1AmJih0aGlzLnJlbmRlckhpZXJhcmNoeS5idWlsZFN1YmhpZXJhcmNoeShiKSxkLmV4cGFuZGVkPSFkLmV4cGFuZGVkLHRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLiQuc2NlbmUuc2V0Tm9kZUV4cGFuZGVkKGQpfSw3NSkpfSxfbm9kZVRvZ2dsZUV4dHJhY3Q6ZnVuY3Rpb24oYil7dGhpcy5ub2RlVG9nZ2xlRXh0cmFjdChiLmRldGFpbC5uYW1lKX0sCm5vZGVUb2dnbGVFeHRyYWN0OmZ1bmN0aW9uKGIpe2I9dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShiKTtiLm5vZGUuaW5jbHVkZT1iLm5vZGUuaW5jbHVkZT09dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5JTkNMVURFP3RmLmdyYXBoLkluY2x1c2lvblR5cGUuRVhDTFVERTpiLm5vZGUuaW5jbHVkZT09dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5FWENMVURFP3RmLmdyYXBoLkluY2x1c2lvblR5cGUuSU5DTFVERTp0aGlzLnJlbmRlckhpZXJhcmNoeS5pc05vZGVBdXhpbGlhcnkoYik/dGYuZ3JhcGguSW5jbHVzaW9uVHlwZS5JTkNMVURFOnRmLmdyYXBoLkluY2x1c2lvblR5cGUuRVhDTFVERTt0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KX0sX25vZGVUb2dnbGVTZXJpZXNHcm91cDpmdW5jdGlvbihiKXt0aGlzLm5vZGVUb2dnbGVTZXJpZXNHcm91cChiLmRldGFpbC5uYW1lKX0sbm9kZVRvZ2dsZVNlcmllc0dyb3VwOmZ1bmN0aW9uKGIpe3RmLmdyYXBoLnRvZ2dsZU5vZGVTZXJpZXNHcm91cCh0aGlzLmhpZXJhcmNoeVBhcmFtcy5zZXJpZXNNYXAsCmIpO3RoaXMuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOjAsbXNnOiIifSk7dGYuZ3JhcGguaGllcmFyY2h5LmJ1aWxkKHRoaXMuYmFzaWNHcmFwaCx0aGlzLmhpZXJhcmNoeVBhcmFtcyx0Zi5ncmFwaC51dGlsLmdldFN1YnRhc2tUcmFja2VyKHRmLmdyYXBoLnV0aWwuZ2V0VHJhY2tlcih0aGlzKSwxMDAsIk5hbWVzcGFjZSBoaWVyYXJjaHkiKSkudGhlbihmdW5jdGlvbihkKXt0aGlzLnNldCgiZ3JhcGhIaWVyYXJjaHkiLGQpO3RoaXMuX2J1aWxkUmVuZGVySGllcmFyY2h5KHRoaXMuZ3JhcGhIaWVyYXJjaHkpfS5iaW5kKHRoaXMpKX0sX2Rlc2VsZWN0UHJldmlvdXNFZGdlKCl7ZDMuc2VsZWN0KCIuIit0Zi5ncmFwaC5zY2VuZS5DbGFzcy5FZGdlLlNFTEVDVEVEKS5jbGFzc2VkKHRmLmdyYXBoLnNjZW5lLkNsYXNzLkVkZ2UuU0VMRUNURUQsITEpLmVhY2goYj0+e2lmKGIubGFiZWwpe2NvbnN0IGQ9ZDMuc2VsZWN0KHRoaXMpLnNlbGVjdEFsbCgicGF0aC5lZGdlbGluZSIpO2IubGFiZWwuc3RhcnRNYXJrZXJJZCYmCmQuc3R5bGUoIm1hcmtlci1zdGFydCIsYHVybCgjJHtiLmxhYmVsLnN0YXJ0TWFya2VySWR9KWApO2IubGFiZWwuZW5kTWFya2VySWQmJmQuc3R5bGUoIm1hcmtlci1lbmQiLGB1cmwoIyR7Yi5sYWJlbC5lbmRNYXJrZXJJZH0pYCl9fSl9LF91cGRhdGVNYXJrZXJPZlNlbGVjdGVkRWRnZShiKXtpZihiLmxhYmVsKXt2YXIgZD1iLmxhYmVsLnN0YXJ0TWFya2VySWR8fGIubGFiZWwuZW5kTWFya2VySWQ7aWYoZCl7Y29uc3QgZj1kLnJlcGxhY2UoImRhdGFmbG93LSIsInNlbGVjdGVkLSIpO2xldCBoPXRoaXMuJCQoIiMiK2YpO2h8fChkPXRoaXMuJC5zY2VuZS5xdWVyeVNlbGVjdG9yKCIjIitkKSxoPWQuY2xvbmVOb2RlKCEwKSxoLnNldEF0dHJpYnV0ZSgiaWQiLGYpLGguY2xhc3NMaXN0LmFkZCgic2VsZWN0ZWQtYXJyb3doZWFkIiksZC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGgpKTtiPWIubGFiZWwuc3RhcnRNYXJrZXJJZD8ibWFya2VyLXN0YXJ0IjoibWFya2VyLWVuZCI7dGhpcy5fbGFzdFNlbGVjdGVkRWRnZUdyb3VwLnNlbGVjdEFsbCgicGF0aC5lZGdlbGluZSIpLnN0eWxlKGIsCmB1cmwoIyR7Zn0pYCl9fX0sbm90OmZ1bmN0aW9uKGIpe3JldHVybiFifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWxvYWRlci90Zi1ncmFwaC1sb2FkZXIuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtbG9hZGVyIixfdGVtcGxhdGU6bnVsbCxwcm9wZXJ0aWVzOntkYXRhc2V0czpBcnJheSxzZWxlY3RlZERhdGE6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LHNlbGVjdGVkRmlsZTpPYmplY3QsY29tcGF0aWJpbGl0eVByb3ZpZGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IGIuZ3JhcGgub3AuVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyfSxvdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0scHJvZ3Jlc3M6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sb3V0R3JhcGhIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0R3JhcGg6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0SGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9fSxvYnNlcnZlcnM6WyJfbG9hZERhdGEoZGF0YXNldHMsIHNlbGVjdGVkRGF0YSwgb3ZlcnJpZGluZ0hpZXJhcmNoeVBhcmFtcywgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSIsCiJfbG9hZEZpbGUoc2VsZWN0ZWRGaWxlLCBvdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zLCBjb21wYXRpYmlsaXR5UHJvdmlkZXIpIl0sX2xvYWREYXRhKCl7dGhpcy5kZWJvdW5jZSgibG9hZCIsKCk9Pntjb25zdCBmPXRoaXMuZGF0YXNldHNbdGhpcy5zZWxlY3RlZERhdGFdO2YmJnRoaXMuX3BhcnNlQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoZi5wYXRoKX0pfSxfcGFyc2VBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChmLGgpe2NvbnN0IGs9dGhpcy5vdmVycmlkaW5nSGllcmFyY2h5UGFyYW1zLHQ9dGhpcy5jb21wYXRpYmlsaXR5UHJvdmlkZXI7dGhpcy5wcm9ncmVzcz17dmFsdWU6MCxtc2c6IiJ9O2NvbnN0IGw9Yi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcykscD1PYmplY3QuYXNzaWduKHt9LGIuZ3JhcGguaGllcmFyY2h5LkRlZmF1bHRIaWVyYXJjaHlQYXJhbXMsayk7Yi5ncmFwaC5sb2FkZXIuZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChsLApmLGgsdCxwKS50aGVuKCh7Z3JhcGg6bSxncmFwaEhpZXJhcmNoeTpufSk9Pnt0aGlzLl9zZXRPdXRIaWVyYXJjaHlQYXJhbXMocCk7dGhpcy5fc2V0T3V0R3JhcGgobSk7dGhpcy5fc2V0T3V0R3JhcGhIaWVyYXJjaHkobil9KX0sX2xvYWRGaWxlKGYpe2lmKGYpe2Y9Zi50YXJnZXQ7dmFyIGg9Zi5maWxlc1swXTtoJiYoZi52YWx1ZT0iIix0aGlzLl9wYXJzZUFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKG51bGwsaCkpfX19KX0pKGQubG9hZGVyfHwoZC5sb2FkZXI9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL2hlYWx0aC1waWxscy5qcwp2YXIgVmk7CihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGssdCl7aWYobnVsbD09ayl0aHJvdyBFcnJvcihgTWlzc2luZyByZWZWYWx1ZSBmb3IgY29uZGl0aW9uICgke3R9KS5gKTt9ZnVuY3Rpb24gZihrKXtyZXR1cm4gbnVsbD09a3x8MD09ay5sZW5ndGh8fDEhPT1rWzBdfWNvbnN0IGg9e0lORl9PUl9OQU46e2Rlc2NyaXB0aW9uOiJDb250YWlucyArLy1cdTIyMWUgb3IgTmFOIixwcmVkaWNhdGU6az0+MDxrWzJdfHwwPGtbM118fDA8a1s3XX0sSU5GOntkZXNjcmlwdGlvbjoiQ29udGFpbnMgKy8tXHUyMjFlIixwcmVkaWNhdGU6az0+MDxrWzNdfHwwPGtbN119LE5BTjp7ZGVzY3JpcHRpb246IkNvbnRhaW5zIE5hTiIscHJlZGljYXRlOms9PjA8a1syXX0sTUFYX0dUOntkZXNjcmlwdGlvbjoiTWF4IFx4M2UiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiTUFYX0dUIik7cmV0dXJuIGtbOV0+dH19LE1BWF9MVDp7ZGVzY3JpcHRpb246Ik1heCBceDNjIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIk1BWF9MVCIpOwpyZXR1cm4ga1s5XTx0fX0sTUlOX0dUOntkZXNjcmlwdGlvbjoiTWluIFx4M2UiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiTUlOX0dUIik7cmV0dXJuIGtbOF0+dH19LE1JTl9MVDp7ZGVzY3JpcHRpb246Ik1pbiBceDNjIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIk1JTl9MVCIpO3JldHVybiBrWzhdPHR9fSxNRUFOX0dUOntkZXNjcmlwdGlvbjoiTWVhbiBceDNlIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIk1FQU5fR1QiKTtyZXR1cm4ga1sxMF0+dH19LE1FQU5fTFQ6e2Rlc2NyaXB0aW9uOiJNZWFuIFx4M2MiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiTUVBTl9MVCIpO3JldHVybiBrWzEwXTx0fX0sUkFOR0VfR1Q6e2Rlc2NyaXB0aW9uOiJNYXggLSBNaW4gXHgzZSIscHJlZGljYXRlOihrLHQpPT57ZCh0LCJSQU5HRV9HVCIpO3JldHVybiBrWzldLWtbOF0+dH19LFJBTkdFX0xUOntkZXNjcmlwdGlvbjoiTWF4IC0gTWluIFx4M2MiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiUkFOR0VfTFQiKTsKcmV0dXJuIGtbOV0ta1s4XTx0fX0sU1REREVWX0dUOntkZXNjcmlwdGlvbjoiU3RhbmRhcmQgZGV2aWF0aW9uIFx4M2UiLHByZWRpY2F0ZTooayx0KT0+e2QodCwiU1REREVWX0dUIik7cmV0dXJuIE1hdGguc3FydChrWzExXSk+dH19LFNURERFVl9MVDp7ZGVzY3JpcHRpb246IlN0YW5kYXJkIGRldmlhdGlvbiBceDNjIixwcmVkaWNhdGU6KGssdCk9PntkKHQsIlNURERFVl9MVCIpO3JldHVybiBNYXRoLnNxcnQoa1sxMV0pPHR9fX07Yi50ZW5zb3JDb25kaXRpb25EZXNjcmlwdGlvbjJLZXk9ZnVuY3Rpb24oayl7Zm9yKGNvbnN0IHQgaW4gaClpZihoLmhhc093blByb3BlcnR5KHQpJiZoW3RdLmRlc2NyaXB0aW9uPT09aylyZXR1cm4gdDtyZXR1cm4gbnVsbH07Yi5jaGVja0hlYWx0aFBpbGxBZ2FpbnN0VGVuc29yQ29uZGl0aW9uS2V5PWZ1bmN0aW9uKGssdCxsKXtpZihmKHQpKXJldHVybiExO2s9aFtrXS5wcmVkaWNhdGU7cmV0dXJuIGsodCxsKX19KShWaXx8KFZpPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLWNvbnRpbnVlLWRpYWxvZy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1jb250aW51ZS1kaWFsb2ciLHByb3BlcnRpZXM6e2NvbnRpbnVlTnVtOnt0eXBlOk51bWJlcix2YWx1ZTo1fSxzZXNzaW9uUnVuR286RnVuY3Rpb24sdGVuc29yQ29uZGl0aW9uR286RnVuY3Rpb24sZm9yY2VDb250aW51YXRpb25TdG9wOkZ1bmN0aW9uLF9jb250aW51ZUJ1dHRvblRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJDb250aW51ZS4uLiJ9LF9jb250aW51ZUJ1dHRvbkNvbnRpbnVlVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IkNvbnRpbnVlLi4uIixyZWFkb25seTohMH0sX2NvbnRpbnVlQnV0dG9uU3RvcFRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJTdG9wIENvbnRpbnVhdGlvbiIscmVhZG9ubHk6ITB9LF9zZWxlY3RlZFRlbnNvckNvbmRpdGlvbjpTdHJpbmcsX3RlbnNvckNvbmRpdGlvblJlZlZhbHVlOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sX2lzUmVmVmFsdWVJbnB1dEhpZGRlbjp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLApub3RpZnk6ITB9fSxvYnNlcnZlcnM6WyJfb25TZWxlY3RlZFRlbnNvckNvbmRpdGlvbkNoYW5nZWQoX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uKSJdLG5vdGlmeUNvbnRpbnVhdGlvblN0b3AoKXt0aGlzLnVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dCghMSl9LF9vcGVuRGlhbG9nKCl7dGhpcy4kLmNvbnRpbnVlRGlhbG9nLm9wZW4oKX0sX2Nsb3NlRGlhbG9nKCl7dGhpcy4kLmNvbnRpbnVlRGlhbG9nLmNsb3NlKCl9LF9jb250aW51ZUJ1dHRvbkNhbGxiYWNrKCl7dGhpcy5fY29udGludWVCdXR0b25UZXh0PT09dGhpcy5fY29udGludWVCdXR0b25TdG9wVGV4dD90aGlzLmZvcmNlQ29udGludWF0aW9uU3RvcCgpOnRoaXMuX29wZW5EaWFsb2coKX0sdXBkYXRlQ29udGludWVCdXR0b25UZXh0KGIpe3RoaXMuc2V0KCJfY29udGludWVCdXR0b25UZXh0IixiP3RoaXMuX2NvbnRpbnVlQnV0dG9uU3RvcFRleHQ6dGhpcy5fY29udGludWVCdXR0b25Db250aW51ZVRleHQpfSxfc2Vzc2lvblJ1bkdvQnV0dG9uQ2FsbGJhY2soKXswPAp0aGlzLmNvbnRpbnVlTnVtPyh0aGlzLnNlc3Npb25SdW5Hbyh0aGlzLmNvbnRpbnVlTnVtKSx0aGlzLnVwZGF0ZUNvbnRpbnVlQnV0dG9uVGV4dCghMCksdGhpcy5fY2xvc2VEaWFsb2coKSk6dGhpcy5zZXQoImNvbnRpbnVlTnVtIiwxKX0sX3RlbnNvckNvbnRpbnVlR29CdXR0b25DYWxsYmFjaygpe2lmKG51bGwhPXRoaXMuX3NlbGVjdGVkVGVuc29yQ29uZGl0aW9uKXt2YXIgYj1WaS50ZW5zb3JDb25kaXRpb25EZXNjcmlwdGlvbjJLZXkodGhpcy5fc2VsZWN0ZWRUZW5zb3JDb25kaXRpb24pO251bGw9PWImJmNvbnNvbGUuZXJyb3IoIkludmFsaWQgVGVuc29yIENvbmRpdGlvbiBuYW1lOiIrdGhpcy5fc2VsZWN0ZWRUZW5zb3JDb25kaXRpb24pO3ZhciBkPU51bWJlcih0aGlzLl90ZW5zb3JDb25kaXRpb25SZWZWYWx1ZSk7TnVtYmVyLmlzRmluaXRlKGQpPyh0aGlzLnRlbnNvckNvbmRpdGlvbkdvKGIsZCksdGhpcy51cGRhdGVDb250aW51ZUJ1dHRvblRleHQoITApLHRoaXMuX2Nsb3NlRGlhbG9nKCkpOgp0aGlzLnNldCgiX3RlbnNvckNvbmRpdGlvblJlZlZhbHVlIiwwKX19LF9vblNlbGVjdGVkVGVuc29yQ29uZGl0aW9uQ2hhbmdlZChiKXtiPVZpLnRlbnNvckNvbmRpdGlvbkRlc2NyaXB0aW9uMktleShiKTt0aGlzLnNldCgiX2lzUmVmVmFsdWVJbnB1dEhpZGRlbiIsLTEhPT1bIklORl9PUl9OQU4iLCJJTkYiLCJOQU4iXS5pbmRleE9mKGIpKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItaW5pdGlhbC1kaWFsb2ciLHByb3BlcnRpZXM6e190aXRsZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX2N1c3RvbU1lc3NhZ2U6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9oYXNDdXN0b21NZXNzYWdlOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSGFzQ3VzdG9tTWVzc2FnZShfY3VzdG9tTWVzc2FnZSkifSxfaG9zdDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3BvcnQ6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9vcGVuOnt0eXBlOkJvb2xlYW59LF9oaWRkZW46e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVIaWRkZW4oX29wZW4pIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvcGVuRGlhbG9nKGIsZCl7dGhpcy5zZXQoIl90aXRsZSIsIkRlYnVnZ2VyIGlzIHdhaXRpbmcgZm9yIFNlc3Npb24ucnVuKCkgY29ubmVjdGlvbnMuLi4iKTt0aGlzLnNldCgiX2N1c3RvbU1lc3NhZ2UiLG51bGwpO3RoaXMuJC5kaWFsb2cub3BlbigpOwpudWxsIT1iJiZudWxsIT1kJiYodGhpcy5zZXQoIl9ob3N0IixiKSx0aGlzLnNldCgiX3BvcnQiLGQpKX0sY2xvc2VEaWFsb2coKXt0aGlzLiQuZGlhbG9nLmNsb3NlKCl9LG9wZW5EaXNhYmxlZERpYWxvZygpe3RoaXMuc2V0KCJfdGl0bGUiLCJEZWJ1Z2dlciBpcyBub3QgZW5hYmxlZCBpbiB0aGlzIFRlbnNvckJvYXJkIGluc3RhbmNlIik7dGhpcy5zZXQoIl9jdXN0b21NZXNzYWdlIiwiVG8gZW5hYmxlIHRoZSBkZWJ1Z2dlciBpbiBUZW5zb3JCb2FyZCwgdXNlIHRoZSBmbGFnOiAtLWRlYnVnZ2VyX3BvcnQgXHgzY3BvcnRfbnVtYmVyXHgzZSIpO3RoaXMuJC5kaWFsb2cub3BlbigpfSxfY29tcHV0ZUhpZGRlbihiKXtyZXR1cm4hYn0sX2NvbXB1dGVIYXNDdXN0b21NZXNzYWdlKGIpe3JldHVybiFfLmlzRW1wdHkoYil9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLWRlYnVnZ2VyLXJlc2l6ZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtZGVidWdnZXItcmVzaXplciIscHJvcGVydGllczp7Y3VycmVudExlbmd0aDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxtaW5MZW5ndGg6TnVtYmVyLG1heExlbmd0aDpOdW1iZXIsaXNIb3Jpem9udGFsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfcmVzaXplcklkZW50aWZpZXI6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMCxyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9pc1ZlcnRpY2FsOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNWZXJ0aWNhbChpc0hvcml6b250YWwpIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAscmVhZE9ubHk6ITB9LF9kcmFnU3RhcnRQb3NpdGlvbjpOdW1iZXIsX2RyYWdTdGFydExlbmd0aDpOdW1iZXIsX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2s6T2JqZWN0LF9wcmV2aW91c01vdXNlVXBDYWxsYmFjazpPYmplY3R9LGxpc3RlbmVyczp7bW91c2Vkb3duOiJfaGFuZGxlTW91c2VEb3duIn0sCl9oYW5kbGVNb3VzZURvd24oYil7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2VuZERyYWcoKTt0aGlzLl9wcmV2aW91c01vdXNlTW92ZUNhbGxiYWNrPWQ9PntkLnByZXZlbnREZWZhdWx0KCk7ZD10aGlzLl9kcmFnU3RhcnRMZW5ndGgrKHRoaXMuX2dldFBvc2l0aW9uUmVsYXRpdmVUb1ZpZXdwb3J0KGQpLXRoaXMuX2RyYWdTdGFydFBvc2l0aW9uKTtkPU1hdGgubWF4KGQsdGhpcy5taW5MZW5ndGgpO2Q9TWF0aC5taW4oZCx0aGlzLm1heExlbmd0aCk7dGhpcy5zZXQoImN1cnJlbnRMZW5ndGgiLGQpfTt0aGlzLl9wcmV2aW91c01vdXNlVXBDYWxsYmFjaz1kPT57ZC5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2VuZERyYWcoKX07dGhpcy5zZXQoIl9kcmFnU3RhcnRQb3NpdGlvbiIsdGhpcy5fZ2V0UG9zaXRpb25SZWxhdGl2ZVRvVmlld3BvcnQoYikpO3RoaXMuc2V0KCJfZHJhZ1N0YXJ0TGVuZ3RoIix0aGlzLmN1cnJlbnRMZW5ndGgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwKdGhpcy5fcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2ssITEpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHRoaXMuX3ByZXZpb3VzTW91c2VNb3ZlQ2FsbGJhY2ssITEpfSxfZ2V0UG9zaXRpb25SZWxhdGl2ZVRvVmlld3BvcnQoYil7cmV0dXJuIHRoaXMuaXNIb3Jpem9udGFsP2IuY2xpZW50WTpiLmNsaWVudFh9LF9lbmREcmFnKCl7d2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsdGhpcy5fcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjaywhMSk7dGhpcy5fcHJldmlvdXNNb3VzZU1vdmVDYWxsYmFjaz1udWxsO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0aGlzLl9wcmV2aW91c01vdXNlVXBDYWxsYmFjaywhMSk7dGhpcy5fcHJldmlvdXNNb3VzZVVwQ2FsbGJhY2s9bnVsbH0sX2NvbXB1dGVJc1ZlcnRpY2FsKGIpe3JldHVybiFifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC9zZWxlY3Rpb24tdHJlZS1ub2RlLmpzCihmdW5jdGlvbihiKXtiLk5PREVfTkFNRV9TRVBBUkFUT1I9Ii8iO2IuREVWSUNFX05BTUVfUEFUVEVSTj0vXlwvam9iOltBLVphLXowLTlfXStcL3JlcGxpY2E6WzAtOV9dK1wvdGFzazpbMC05XStcL2RldmljZTpbQS1aYS16MC05X10rOlswLTldKy87bGV0IGQ7KGZ1bmN0aW9uKGspe2tbay5FTVBUWT0wXT0iRU1QVFkiO2tbay5DSEVDS0VEPTFdPSJDSEVDS0VEIjtrW2suUEFSVElBTD0yXT0iUEFSVElBTCJ9KShkPWIuQ2hlY2tib3hTdGF0ZXx8KGIuQ2hlY2tib3hTdGF0ZT17fSkpO2Iuc3BsaXROb2RlTmFtZT1mdW5jdGlvbihrKXtsZXQgdD1bXTtjb25zdCBsPWsubWF0Y2goYi5ERVZJQ0VfTkFNRV9QQVRURVJOKTtudWxsIT1sJiYodC5wdXNoKGxbMF0pLCIvIiE9PWtbbFswXS5sZW5ndGhdJiZjb25zb2xlLmVycm9yKCdObyBzbGFzaCAoIi8iKSBhZnRlciBkZXZpY2UgbmFtZSBpbiBub2RlIG5hbWU6JyxrKSxrPWsuc2xpY2UobFswXS5sZW5ndGgrMSkpO3JldHVybiB0LmNvbmNhdChrLnNwbGl0KGIuTk9ERV9OQU1FX1NFUEFSQVRPUikpfTsKYi5nZXRDbGVhbk5vZGVOYW1lPWZ1bmN0aW9uKGspe2xldCB0PWs7Y29uc3QgbD1rLm1hdGNoKGIuREVWSUNFX05BTUVfUEFUVEVSTik7bnVsbCE9bD8odC5sZW5ndGg+bFswXS5sZW5ndGgmJiIvIiE9dFtsWzBdLmxlbmd0aF0mJmNvbnNvbGUuZXJyb3IoJ05vIHNsYXNoICgiLyIpIGFmdGVyIGRldmljZSBuYW1lIGluIG5vZGUgbmFtZTonLGspLHQ9dC5zbGljZShsWzBdLmxlbmd0aCsxKSk6Ii8iPT09dFswXSYmKHQ9dC5zbGljZSgxKSk7dC5pbmRleE9mKCIpIik9PT10Lmxlbmd0aC0xJiYodD10LnNsaWNlKDAsdC5pbmRleE9mKCIvKCIpKSk7cmV0dXJuIHR9O2Iuc29ydEFuZEJhc2VFeHBhbmREZWJ1Z1dhdGNoZXM9ZnVuY3Rpb24oayl7ay5zb3J0KChsLHApPT5sLm5vZGVfbmFtZTxwLm5vZGVfbmFtZT8tMTpsLm5vZGVfbmFtZT5wLm5vZGVfbmFtZT8xOmwub3V0cHV0X3Nsb3QtcC5vdXRwdXRfc2xvdCk7Zm9yKGxldCBsPTA7bDxrLmxlbmd0aDsrK2wpe3ZhciB0PWtbbF0ubm9kZV9uYW1lKwoiLyI7bGV0IHA9ITE7Zm9yKGxldCBtPWwrMTttPGsubGVuZ3RoOysrbSlpZigwPT09a1ttXS5ub2RlX25hbWUuaW5kZXhPZih0KSl7cD0hMDticmVha31wJiYodD1rW2xdLm5vZGVfbmFtZS5zcGxpdCgiLyIpLGtbbF0ubm9kZV9uYW1lKz0iLygiK3RbdC5sZW5ndGgtMV0rIikiKX19O2IucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uPWZ1bmN0aW9uKGspe3JldHVybiBrLmVuZHNXaXRoKCIpIik/ay5zbGljZSgwLGsubGFzdEluZGV4T2YoIi8oIikpOmt9O2IuYXNzZW1ibGVEZXZpY2VBbmROb2RlTmFtZXM9ZnVuY3Rpb24oayl7Y29uc3QgdD1bbnVsbCxudWxsXTtpZihrWzBdLm1hdGNoKGIuREVWSUNFX05BTUVfUEFUVEVSTikpe2xldCBsPWtbMF07Ii8iPT09bFtsLmxlbmd0aC0xXSYmKGw9bC5zbGljZSgwLGwubGVuZ3RoLTEpKTt0WzBdPWw7dFsxXT1rLnNsaWNlKDEpLmpvaW4oIi8iKX1lbHNlIHRbMV09ay5qb2luKCIvIik7cmV0dXJuIHR9O2xldCBmOyhmdW5jdGlvbihrKXtrW2suTm9kZU5hbWU9CjBdPSJOb2RlTmFtZSI7a1trLk9wVHlwZT0xXT0iT3BUeXBlIn0pKGY9Yi5EZWJ1Z1dhdGNoRmlsdGVyTW9kZXx8KGIuRGVidWdXYXRjaEZpbHRlck1vZGU9e30pKTtiLmZpbHRlckRlYnVnV2F0Y2hlcz1mdW5jdGlvbihrLHQsbCl7aWYodD09PWYuTm9kZU5hbWUpcmV0dXJuIGsuZmlsdGVyKHA9PnAubm9kZV9uYW1lLm1hdGNoKGwpKTtpZih0PT09Zi5PcFR5cGUpcmV0dXJuIGsuZmlsdGVyKHA9PnAub3BfdHlwZS5tYXRjaChsKSl9O2NsYXNzIGh7Y29uc3RydWN0b3Ioayx0LGwscCl7dGhpcy5kZWJ1Z1dhdGNoQ2hhbmdlPXQ7dGhpcy5kZWJ1Z1dhdGNoPXA7dGhpcy5uYW1lPWs7dGhpcy5kZWJ1Z1dhdGNoPXA7dGhpcy5jaGVja2JveFN0YXRlPWQuRU1QVFk7dGhpcy5wYXJlbnQ9bDt0aGlzLmNoaWxkcmVuPXt9O3RoaXMuY2hlY2tib3g9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItY2hlY2tib3giKTt0aGlzLmNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoImNoYW5nZSIsKCk9Pgp7dGhpcy5faGFuZGxlQ2hhbmdlKCl9LCExKX1faGFuZGxlQ2hhbmdlKCl7aWYodGhpcy5hdm9pZFByb3BhZ2F0aW9uKXRoaXMuZGVidWdXYXRjaCYmdGhpcy5kZWJ1Z1dhdGNoQ2hhbmdlKHRoaXMuZGVidWdXYXRjaCx0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCkpO2Vsc2UgaWYodGhpcy5kZWJ1Z1dhdGNoKXRoaXMuc2V0Q2hlY2tib3hTdGF0ZSh0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCk/ZC5DSEVDS0VEOmQuRU1QVFksITApLHRoaXMuaXNDaGVja2JveENoZWNrZWQoKT90aGlzLnNldE5vZGVzQWJvdmVUb0NoZWNrZWQoKTp0aGlzLnNldE5vZGVzQWJvdmVUb0VtcHR5KCksdGhpcy5kZWJ1Z1dhdGNoQ2hhbmdlKHRoaXMuZGVidWdXYXRjaCx0aGlzLmlzQ2hlY2tib3hDaGVja2VkKCkpO2Vsc2UgaWYodGhpcy5zZXRDaGVja2JveFN0YXRlKHRoaXMuaXNDaGVja2JveENoZWNrZWQoKT9kLkNIRUNLRUQ6ZC5FTVBUWSwhMCksdGhpcy5pc0NoZWNrYm94Q2hlY2tlZCgpKXtjb25zdCB0PV8udmFsdWVzKHRoaXMuY2hpbGRyZW4pOwpmb3IoO3QubGVuZ3RoOyl7dmFyIGs9dC5wb3AoKTtfLmZvckVhY2goay5jaGlsZHJlbixsPT50LnB1c2gobCkpO2suc2V0Q2hlY2tib3hTdGF0ZShkLkNIRUNLRUQsITApfXRoaXMuc2V0Tm9kZXNBYm92ZVRvQ2hlY2tlZCgpfWVsc2V7Y29uc3QgdD1fLnZhbHVlcyh0aGlzLmNoaWxkcmVuKTtmb3IoO3QubGVuZ3RoOylrPXQucG9wKCksXy5mb3JFYWNoKGsuY2hpbGRyZW4sbD0+dC5wdXNoKGwpKSxrLnNldENoZWNrYm94U3RhdGUoZC5FTVBUWSwhMCk7dGhpcy5zZXROb2Rlc0Fib3ZlVG9FbXB0eSgpfX1pc0xlYWYoKXtyZXR1cm4hIXRoaXMuZGVidWdXYXRjaH1zZXRUb0FsbENoZWNrZWRFeHRlcm5hbGx5KCl7dGhpcy5zZXRDaGVja2JveFN0YXRlKGQuQ0hFQ0tFRCk7dGhpcy5faGFuZGxlQ2hhbmdlKCl9c2V0Q2hlY2tib3hTdGF0ZShrLHQpe3RoaXMuYXZvaWRQcm9wYWdhdGlvbj10O3RoaXMuY2hlY2tib3hTdGF0ZT1rO3RoaXMuY2hlY2tib3guY2xhc3NMaXN0LnRvZ2dsZSgicGFydGlhbC1jaGVja2JveCIsCms9PT1kLlBBUlRJQUwpO2s9PT1kLkNIRUNLRUQ/dGhpcy5jaGVja2JveC5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIik6dGhpcy5jaGVja2JveC5yZW1vdmVBdHRyaWJ1dGUoImNoZWNrZWQiKTt0aGlzLmF2b2lkUHJvcGFnYXRpb249ITF9aXNDaGVja2JveENoZWNrZWQoKXtyZXR1cm4gdGhpcy5jaGVja2JveC5oYXNBdHRyaWJ1dGUoImNoZWNrZWQiKX1zZXROb2Rlc0Fib3ZlVG9DaGVja2VkKCl7bGV0IGs9dGhpcy5wYXJlbnQsdD0hMTtmb3IoO2s7KXQ/ay5zZXRDaGVja2JveFN0YXRlKGQuUEFSVElBTCwhMCk6KHQ9LTEhPT1fLmZpbmRJbmRleChfLnZhbHVlcyhrLmNoaWxkcmVuKSxsPT5sLmNoZWNrYm94U3RhdGUhPT1kLkNIRUNLRUQpLGsuc2V0Q2hlY2tib3hTdGF0ZSh0P2QuUEFSVElBTDpkLkNIRUNLRUQsITApKSxrPWsucGFyZW50fXNldE5vZGVzQWJvdmVUb0VtcHR5KCl7bGV0IGs9dGhpcy5wYXJlbnQsdD0hMTtmb3IoO2s7KXQ/ay5zZXRDaGVja2JveFN0YXRlKGQuUEFSVElBTCwKITApOih0PS0xIT09Xy5maW5kSW5kZXgoXy52YWx1ZXMoay5jaGlsZHJlbiksbD0+bC5jaGVja2JveFN0YXRlIT09ZC5FTVBUWSksay5zZXRDaGVja2JveFN0YXRlKHQ/ZC5QQVJUSUFMOmQuRU1QVFksITApKSxrPWsucGFyZW50fXNldExldmVsRG9tKGspe3RoaXMubGV2ZWxEb209a319Yi5TZWxlY3Rpb25UcmVlTm9kZT1ofSkoVml8fChWaT17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1vcC1zZWxlY3Rvci5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1vcC1zZWxlY3RvciIscHJvcGVydGllczp7ZGVidWdXYXRjaGVzOkFycmF5LGRlYnVnV2F0Y2hDaGFuZ2U6T2JqZWN0LG5vZGVDbGlja2VkOkZ1bmN0aW9uLGZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZm9yY2VFeHBhbmROb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmc6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfbGV2ZWxOYW1lMkNvbnRhaW5lcjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX2xldmVsTmFtZTJOb2RlOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfd2F0Y2hIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZVdhdGNoSGllcmFyY2h5KGRlYnVnV2F0Y2hlcywgZGVidWdXYXRjaENoYW5nZSwgX2ZpbHRlck1vZGUsIF9maWx0ZXJJbnB1dCkifSxfZmlsdGVyTW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6Ik5vZGUgTmFtZSIsCm5vdGlmeTohMH0sX2ZpbHRlcklucHV0Ont0eXBlOlN0cmluZyx2YWx1ZToiIixub3RpZnk6ITB9LF9pc0xvYWRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2hpZ2hsaWdodGVkTGV2ZWxEb206e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9fSxvYnNlcnZlcnM6WyJfcmVuZGVySGllcmFyY2h5V2l0aFRpbWVvdXQoX3dhdGNoSGllcmFyY2h5LCBkZWJ1Z1dhdGNoQ2hhbmdlKSIsIl9oYW5kbGVGb3JjZU5vZGVFeHBhbmRBbmRDaGVjayhmb3JjZUV4cGFuZEFuZENoZWNrTm9kZU5hbWUpIiwiX2hhbmRsZUZvcmNlTm9kZUV4cGFuZChmb3JjZUV4cGFuZE5vZGVOYW1lKSJdLF9jb21wdXRlV2F0Y2hIaWVyYXJjaHkoYixkLGYsaCl7aD1oLnRyaW0oKTtsZXQgaz1iO251bGwhPWYmJjA8aC5sZW5ndGgmJihrPVZpLmZpbHRlckRlYnVnV2F0Y2hlcyhiLFZpLkRlYnVnV2F0Y2hGaWx0ZXJNb2RlW2YucmVwbGFjZSgvXHMvZywiIildLG5ldyBSZWdFeHAoaCkpKTtjb25zdCB0PW5ldyBWaS5TZWxlY3Rpb25UcmVlTm9kZSgiIiwKZCk7dC5pc1Jvb3Q9ITA7Xy5mb3JFYWNoKGssbD0+e2NvbnN0IHA9Vmkuc3BsaXROb2RlTmFtZShsLmRldmljZV9uYW1lKyIvIitsLm5vZGVfbmFtZSk7bGV0IG09dDtfLmZvckVhY2gocCwobixxKT0+e3E9PT1wLmxlbmd0aC0xPyhxPW5ldyBWaS5TZWxlY3Rpb25UcmVlTm9kZShuLGQsbSxsKSxtLmNoaWxkcmVuW25dPXEpOihtLmNoaWxkcmVuW25dfHwobS5jaGlsZHJlbltuXT1uZXcgVmkuU2VsZWN0aW9uVHJlZU5vZGUobixkLG0pKSxtPW0uY2hpbGRyZW5bbl0pfSl9KTtyZXR1cm4gdH0sX2NsZWFyU2VsZWN0b3JIaWVyYXJjaHkoKXtjb25zdCBiPXRoaXMuJCQoIiNzZWxlY3Rvci1oaWVyYXJjaHkiKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpfSxfcmVuZGVySGllcmFyY2h5V2l0aFRpbWVvdXQoYixkLGYsaCl7dGhpcy5faXNMb2FkaW5nfHwodGhpcy5zZXQoIl9pc0xvYWRpbmciLCEwKSx0aGlzLl9jbGVhclNlbGVjdG9ySGllcmFyY2h5KCksCnNldFRpbWVvdXQoKCk9Pnt0aGlzLl9yZW5kZXJIaWVyYXJjaHkoYixkLGYsaCl9LDEwKSl9LF9yZW5kZXJIaWVyYXJjaHkoYixkKXt0aGlzLnNldCgiX2xldmVsTmFtZTJDb250YWluZXIiLHt9KTt0aGlzLnNldCgiX2xldmVsTmFtZTJOb2RlIix7fSk7Yj10aGlzLl9yZW5kZXJMZXZlbChudWxsLG51bGwsYixkKTtQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2VsZWN0b3ItaGllcmFyY2h5IikpLmFwcGVuZENoaWxkKGIpO3RoaXMuc2V0KCJfaXNMb2FkaW5nIiwhMSl9LF9yZW5kZXJMZXZlbChiLGQsZixoKXtjb25zdCBrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO251bGwhPWImJmsuc2V0QXR0cmlidXRlKCJsZXZlbC1uYW1lIixiKTtsZXQgdDt0PW51bGw9PWQ/YjpkKyIvIitiO1BvbHltZXIuZG9tKGspLmNsYXNzTGlzdC5hZGQoImxldmVsLWNvbnRhaW5lciIpO2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaXJvbi1jb2xsYXBzZSIpO2lmKGIpe3RoaXMuX2xldmVsTmFtZTJDb250YWluZXJbdF09Cmw7bC5yZW1vdmVBdHRyaWJ1dGUoIm9wZW5lZCIpO1BvbHltZXIuZG9tKGspLmNsYXNzTGlzdC5hZGQoImluZGVudGVkLWxldmVsLWNvbnRhaW5lciIpO2Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7UG9seW1lci5kb20oZCkuY2xhc3NMaXN0LmFkZCgibGV2ZWwtdGl0bGUiKTtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWljb24tYnV0dG9uIik7UG9seW1lci5kb20obikuY2xhc3NMaXN0LmFkZCgibm9kZS1leHBhbmQtYnV0dG9uIik7Y29uc3QgcT0oKT0+e24uc2V0QXR0cmlidXRlKCJpY29uIixsLmhhc0F0dHJpYnV0ZSgib3BlbmVkIik/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUiKX07bi5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCk9PntsLmhhc0F0dHJpYnV0ZSgib3BlbmVkIik/bC5yZW1vdmVBdHRyaWJ1dGUoIm9wZW5lZCIpOmwuc2V0QXR0cmlidXRlKCJvcGVuZWQiLCEwKTtxKCl9LCExKTtxKCk7UG9seW1lci5kb20oZCkuYXBwZW5kQ2hpbGQobik7ClBvbHltZXIuZG9tKGQpLmFwcGVuZENoaWxkKGYuY2hlY2tib3gpO2Yuc2V0TGV2ZWxEb20oZCk7Y29uc3QgdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7UG9seW1lci5kb20odSkuY2xhc3NMaXN0LmFkZCgibGV2ZWwtdGl0bGUtdGV4dCIpO3UudGV4dENvbnRlbnQ9YjtQb2x5bWVyLmRvbShkKS5hcHBlbmRDaGlsZCh1KTtQb2x5bWVyLmRvbShrKS5hcHBlbmRDaGlsZChkKTsoYi5tYXRjaChWaS5ERVZJQ0VfTkFNRV9QQVRURVJOKXx8MT09PU9iamVjdC5rZXlzKGYuY2hpbGRyZW4pLmxlbmd0aCkmJmwuc2V0QXR0cmlidXRlKCJvcGVuZWQiLCEwKX1lbHNlIGwuc2V0QXR0cmlidXRlKCJvcGVuZWQiLCEwKTtjb25zdCBwPVtdLG09W107UG9seW1lci5kb20obCkuY2xhc3NMaXN0LmFkZCgiY29udGVudC1jb250YWluZXIiKTtfLmZvckVhY2goZi5jaGlsZHJlbiwobixxKT0+e2NvbnN0IHU9bi5kZWJ1Z1dhdGNoO3ZhciB4PXQ7bnVsbD09dCYmKHg9IiIpO3grPSIvIitxOwp0aGlzLl9sZXZlbE5hbWUyTm9kZVt4XT1uO251bGwhPXRoaXMuX3NlbGVjdGVkRGVidWdXYXRjaE1hcHBpbmdbeF0mJihuLnNldENoZWNrYm94U3RhdGUoVmkuQ2hlY2tib3hTdGF0ZS5DSEVDS0VEKSxuLnNldE5vZGVzQWJvdmVUb0NoZWNrZWQoKSk7aWYodSl7eD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtQb2x5bWVyLmRvbSh4KS5jbGFzc0xpc3QuYWRkKCJvcC1kZXNjcmlwdGlvbiIpO24uY2hlY2tib3guYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix5PT57dGhpcy5faGFuZGxlTGVhZk5vZGVTZWxlY3RlZChoLHUseS50YXJnZXQuY2hlY2tlZCl9LCExKTtQb2x5bWVyLmRvbSh4KS5hcHBlbmRDaGlsZChuLmNoZWNrYm94KTtuLnNldExldmVsRG9tKHgpO3ZhciBBPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtBLnRleHRDb250ZW50PSJbIit1Lm9wX3R5cGUrIl0iO0Euc2V0QXR0cmlidXRlKCJjbGFzcyIsIm9wLXR5cGUiKTtQb2x5bWVyLmRvbSh4KS5hcHBlbmRDaGlsZChBKTsKQT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7QS50ZXh0Q29udGVudD1xO0Euc2V0QXR0cmlidXRlKCJjbGFzcyIsIm9wLXRpdGxlLWxlYWYiKTtBLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIiwoKT0+e2NvbnN0IHk9dGhpcy5fZ2V0RGV2aWNlQW5kTm9kZU5hbWVzKHEsayk7dGhpcy5ub2RlQ2xpY2tlZCh5WzBdLHlbMV0pfSwhMSk7UG9seW1lci5kb20oeCkuYXBwZW5kQ2hpbGQoQSk7bS5wdXNoKHgpfWVsc2Ugbi5jaGVja2JveC5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLHk9Pnt0aGlzLl9oYW5kbGVNZXRhTm9kZUNoYW5nZShuLGgseS50YXJnZXQuY2hlY2tlZCl9KSxwLnB1c2godGhpcy5fcmVuZGVyTGV2ZWwocSx0LG4saCkpfSk7Yj1uPT57UG9seW1lci5kb20obCkuYXBwZW5kQ2hpbGQobil9O18uZm9yRWFjaChtLGIpO18uZm9yRWFjaChwLGIpO1BvbHltZXIuZG9tKGspLmFwcGVuZENoaWxkKGwpO3JldHVybiBrfSxfZ2V0TGVhZkRlYnVnV2F0Y2hlcyhiLGQpe2IuZGVidWdXYXRjaD8KZC5wdXNoKGIuZGVidWdXYXRjaCk6Xy5mb3JFYWNoKGIuY2hpbGRyZW4sZj0+e3RoaXMuX2dldExlYWZEZWJ1Z1dhdGNoZXMoZixkKX0pfSxfZ2V0RGV2aWNlQW5kTm9kZU5hbWVzKGIsZCl7Zm9yKGI9W2JdOzspe2NvbnN0IGY9ZC5nZXRBdHRyaWJ1dGUoImxldmVsLW5hbWUiKTtpZihudWxsPT1mKWJyZWFrO2Vsc2UgYi5wdXNoKGYpO2Q9UG9seW1lci5kb20oZCkucGFyZW50Tm9kZS5wYXJlbnROb2RlfWIucmV2ZXJzZSgpO3JldHVybiBWaS5hc3NlbWJsZURldmljZUFuZE5vZGVOYW1lcyhiKX0sX2hhbmRsZU1ldGFOb2RlQ2hhbmdlKGIsZCxmKXtsZXQgaD1bXTt0aGlzLl9nZXRMZWFmRGVidWdXYXRjaGVzKGIsaCk7Xy5mb3JFYWNoKGgsaz0+e3RoaXMuX2hhbmRsZUxlYWZOb2RlU2VsZWN0ZWQoZCxrLGYpfSl9LF9oYW5kbGVMZWFmTm9kZVNlbGVjdGVkKGIsZCxmKXtjb25zdCBoPWQuZGV2aWNlX25hbWUrIi8iK2Qubm9kZV9uYW1lO2Y/dGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1toXT0KZDpkZWxldGUgdGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1toXTtiKGQsZil9LF9oYW5kbGVGb3JjZU5vZGUoYixkKXt0aGlzLnNldCgiX2ZpbHRlcklucHV0IiwiIik7c2V0VGltZW91dCgoKT0+e2lmKG51bGwhPWImJm51bGwhPXRoaXMuX2xldmVsTmFtZTJDb250YWluZXIpe3ZhciBmPVZpLnNwbGl0Tm9kZU5hbWUoYik7Zm9yKGxldCBrPTE7azw9Zi5sZW5ndGg7KytrKXt2YXIgaD1mLnNsaWNlKDAsaykuam9pbigiLyIpO2NvbnN0IHQ9dGhpcy5fbGV2ZWxOYW1lMk5vZGVbaF07bnVsbCE9dCYmbnVsbCE9dC5sZXZlbERvbSYmdC5sZXZlbERvbS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImNlbnRlciIsYmVoYXZpb3VyOiJzbW9vdGgifSk7azxmLmxlbmd0aD9udWxsIT10aGlzLl9sZXZlbE5hbWUyQ29udGFpbmVyW2hdJiZ0aGlzLl9sZXZlbE5hbWUyQ29udGFpbmVyW2hdLnNldEF0dHJpYnV0ZSgib3BlbmVkIiwhMCk6KHQuZGVidWdXYXRjaHx8dGhpcy5faGFuZGxlTWV0YU5vZGVDaGFuZ2UodCwKdC5kZWJ1Z1dhdGNoQ2hhbmdlLCEwKSxkJiYodC5zZXRUb0FsbENoZWNrZWRFeHRlcm5hbGx5KCksKGg9dC5kZWJ1Z1dhdGNoKSYmbnVsbD09dGhpcy5fc2VsZWN0ZWREZWJ1Z1dhdGNoTWFwcGluZ1toLm5vZGVfbmFtZV0mJih0aGlzLl9zZWxlY3RlZERlYnVnV2F0Y2hNYXBwaW5nW2JdPWgpKSxudWxsIT10aGlzLl9oaWdobGlnaHRlZExldmVsRG9tJiZ0aGlzLl9oaWdobGlnaHRlZExldmVsRG9tLmNsYXNzTGlzdC5yZW1vdmUoImhpZ2hsaWdodGVkIiksdC5sZXZlbERvbS5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRlZCIpLHRoaXMuc2V0KCJfaGlnaGxpZ2h0ZWRMZXZlbERvbSIsdC5sZXZlbERvbSkpfX19LDIwKX0sX2hhbmRsZUZvcmNlTm9kZUV4cGFuZEFuZENoZWNrKGIpe3RoaXMuX2hhbmRsZUZvcmNlTm9kZShiLCEwKX0sX2hhbmRsZUZvcmNlTm9kZUV4cGFuZChiKXt0aGlzLl9oYW5kbGVGb3JjZU5vZGUoYiwhMSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXNlc3Npb24tcnVucy12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNlc3Npb24tcnVucy12aWV3Iixwcm9wZXJ0aWVzOntsYXRlc3RTZXNzaW9uUnVuOk9iamVjdCxzZXNzaW9uUnVuS2V5VG9EZXZpY2VOYW1lczpPYmplY3Qsc29sZUFjdGl2ZTpCb29sZWFuLG5vZGVPclRlbnNvckNsaWNrZWQ6RnVuY3Rpb24sX3J1bktleTJDb3VudDp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9ydW5LZXkyTnVtRGV2aWNlczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9hY3RpdmVSdW5LZXk6U3RyaW5nfSxvYnNlcnZlcnM6WyJyZW5kZXJMYXRlc3QobGF0ZXN0U2Vzc2lvblJ1bikiLCJzZXRTb2xlQWN0aXZlU3RhdHVzKHNvbGVBY3RpdmUpIl0scmVuZGVyTGF0ZXN0KGIpe2I9SlNPTi5zdHJpbmdpZnkoYik7dGhpcy5fcnVuS2V5MkNvdW50W2JdPXZvaWQgMD09PXRoaXMuX3J1bktleTJDb3VudFtiXT8xOnRoaXMuX3J1bktleTJDb3VudFtiXSsxO3ZvaWQgMD09PXRoaXMuX3J1bktleTJOdW1EZXZpY2VzW2JdJiYodGhpcy5fcnVuS2V5Mk51bURldmljZXNbYl09CjApO3RoaXMuX2FjdGl2ZVJ1bktleT1iO3RoaXMuX3JlbmRlclNlc3Npb25SdW5UYWJsZSgpfSx1cGRhdGVOdW1EZXZpY2VzKGIpe251bGwhPXRoaXMuX2FjdGl2ZVJ1bktleSYmKHRoaXMuX3J1bktleTJOdW1EZXZpY2VzW3RoaXMuX2FjdGl2ZVJ1bktleV09Yix0aGlzLl9yZW5kZXJTZXNzaW9uUnVuVGFibGUoKSl9LHNldFNvbGVBY3RpdmVTdGF0dXMoKXt0aGlzLl9yZW5kZXJTZXNzaW9uUnVuVGFibGUoKX0sX3JlbmRlclNlc3Npb25SdW5UYWJsZSgpe3RoaXMuX2NsZWFyVGFibGUoKTt0aGlzLl9yZW5kZXJIZWFkZXIoKTtsZXQgYjtmb3IoY29uc3QgZiBpbiB0aGlzLl9ydW5LZXkyQ291bnQpaWYodGhpcy5fcnVuS2V5MkNvdW50Lmhhc093blByb3BlcnR5KGYpKXt2YXIgZD1KU09OLnBhcnNlKGYpOyhkPXRoaXMuX3JlbmRlclJvdyhkLHRoaXMuX3J1bktleTJOdW1EZXZpY2VzW2ZdLHRoaXMuX3J1bktleTJDb3VudFtmXSx0aGlzLl9hY3RpdmVSdW5LZXk9PT1mLHRoaXMuc29sZUFjdGl2ZSkpJiYKKGI9ZCl9YiYmKFBvbHltZXIuZG9tKHRoaXMuJCQoIiNzZXNzaW9uLXJ1bnMtdGFibGUiKSkucGFyZW50Tm9kZS5wYXJlbnROb2RlLnNjcm9sbFRvcD1iLm9mZnNldFRvcCl9LF9jbGVhclRhYmxlKCl7Y29uc3QgYj10aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIik7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX0sX3JlbmRlckhlYWRlcigpe2NvbnN0IGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidHIiKSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7ZC50ZXh0Q29udGVudD0iRmVlZHMiO2NvbnN0IGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGgiKTtmLnRleHRDb250ZW50PSJGZXRjaGVzIjtjb25zdCBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7aC50ZXh0Q29udGVudD0iVGFyZ2V0cyI7Y29uc3Qgaz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0aCIpO2sudGV4dENvbnRlbnQ9IiMoRGV2aWNlcykiO2NvbnN0IHQ9CmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRoIik7dC50ZXh0Q29udGVudD0iQ291bnQiO2IuYXBwZW5kQ2hpbGQoZCk7Yi5hcHBlbmRDaGlsZChmKTtiLmFwcGVuZENoaWxkKGgpO2IuYXBwZW5kQ2hpbGQoayk7Yi5hcHBlbmRDaGlsZCh0KTtQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIikpLmFwcGVuZENoaWxkKGIpfSxfcmVuZGVyUm93KGIsZCxmLGgsayl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLGw9dGhpcy5fcmVuZGVyR3JhcGhFbGVtZW50cyhiLmZlZWRzKSxwPXRoaXMuX3JlbmRlckdyYXBoRWxlbWVudHMoYi5mZXRjaGVzKTtiPXRoaXMuX3JlbmRlckdyYXBoRWxlbWVudHMoYi50YXJnZXRzKTtjb25zdCBtPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7bS50ZXh0Q29udGVudD1kO2Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtkLnRleHRDb250ZW50PWY7dC5hcHBlbmRDaGlsZChsKTt0LmFwcGVuZENoaWxkKHApOwp0LmFwcGVuZENoaWxkKGIpO3QuYXBwZW5kQ2hpbGQobSk7dC5hcHBlbmRDaGlsZChkKTtoJiYoaz90LnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJzb2xlLWFjdGl2ZS1zZXNzaW9uLXJ1biIpOnQuc2V0QXR0cmlidXRlKCJjbGFzcyIsImFjdGl2ZS1zZXNzaW9uLXJ1biIpKTtQb2x5bWVyLmRvbSh0aGlzLiQkKCIjc2Vzc2lvbi1ydW5zLXRhYmxlIikpLmFwcGVuZENoaWxkKHQpO2lmKGgpcmV0dXJuIHR9LF9yZW5kZXJHcmFwaEVsZW1lbnRzKGIpe2NvbnN0IGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtfLmZvckVhY2goYixmPT57Y29uc3QgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnRleHRDb250ZW50PWY7aC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwibm9kZS1vci10ZW5zb3ItZWxlbWVudCIpO2guYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57dGhpcy5ub2RlT3JUZW5zb3JDbGlja2VkKGYpfSk7ZC5hcHBlbmRDaGlsZChoKX0pO3JldHVybiBkfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1zb3VyY2UtY29kZS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXNvdXJjZS1jb2RlLXZpZXciLHByb3BlcnRpZXM6e3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxmb2N1c05vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfb2xkRm9jdXNOb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sZGVidWdXYXRjaGVzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxub2RlQ2xpY2tlZDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSxjb250aW51ZVRvTm9kZTp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSxfaGlnaGxpZ2h0ZWRFbGVtZW50czp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX2ZpbGVQYXRoU2VsZWN0ZWQ6TnVtYmVyLF9mdWxsRmlsZVBhdGhzOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9LF9zaG9ydEZpbGVQYXRoczp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfSxfZmlsZUxpbmVzOnt0eXBlOkFycmF5LHZhbHVlOm51bGx9LF9ub2RlTmFtZTJEZXZpY2VOYW1lOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSwKX25vZGVOYW1lMkJhc2VFeHBhbmRlZE5vZGVOYW1lOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfbm9kZU5hbWUyTm9kZUVsZW1lbnRzOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsfSxfbm9kZU5hbWUyU3RhY2tUb3BOb2RlRWxlbWVudDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3NldEhpZ2h0bGlnaHRPcmlnaW5Ob2RlRWxlbWVudDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX2Z1bGxTdGFja1Nob3duOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9mdWxsU3RhY2tOb2RlTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3JlbmRlckRlbGF5TWlsbGlzOnt0eXBlOk51bWJlcix2YWx1ZTo1MCxyZWFkb25seTohMH19LG9ic2VydmVyczpbIl9yZW5kZXJGaWxlKF9maWxlUGF0aFNlbGVjdGVkKSIsIl9mb2N1c09uTm9kZShmb2N1c05vZGVOYW1lKSJdLHJlbmRlcihiKXtudWxsIT1iJiZ0aGlzLnNldCgiX2RlYnVnV2F0Y2hlcyIsYik7dGhpcy5fcXVlcnlTb3VyY2VDb2RlRW5kUG9pbnQoe21vZGU6InBhdGhzIn0pLnRoZW4oZD0+Cnt0aGlzLnNldCgiX2Z1bGxGaWxlUGF0aHMiLGQucGF0aHMpO2NvbnN0IGY9ZC5wYXRocy5tYXAoaD0+KHtpZDpoLG5hbWU6dGhpcy5fc2hvcnRlblBhdGgoaCxkLnBhdGhzKX0pKTt0aGlzLnNldCgiX3Nob3J0RmlsZVBhdGhzIixmKTswPGYubGVuZ3RoJiZ0aGlzLnNldCgiX2ZpbGVQYXRoU2VsZWN0ZWQiLDApfSl9LF9zaG9ydGVuUGF0aChiKXtiPWIucmVwbGFjZSgvXFwvZywiLyIpO2I9Yi5zcGxpdCgiLyIpO3JldHVybiBiW2IubGVuZ3RoLTFdfSxfcmVuZGVyRmlsZShiKXtpZihudWxsIT1iKXt2YXIgZD10aGlzLl9zaG9ydEZpbGVQYXRoc1tiXS5pZDt0aGlzLl9xdWVyeVNvdXJjZUNvZGVFbmRQb2ludCh7bW9kZToiY29udGVudCIsZmlsZV9wYXRoOmR9KS50aGVuKGY9Pntjb25zdCBoPVtdLGs9Zi5jb250ZW50W2RdLHQ9Zi5saW5lbm9fdG9fb3BfbmFtZV9hbmRfc3RhY2tfcG9zO2Y9e307Zm9yKHZhciBsIGluIHQpdC5oYXNPd25Qcm9wZXJ0eShsKSYmKGZbbF09dFtsXS5sZW5ndGgpOwp0aGlzLl9maWx0ZXJGaWxlVHJhY2ViYWNrc0J5RGVidWdXYXRjaGVzKHQpO2ZvcihsPTA7bDxrLmxlbmd0aDsrK2wpe2NvbnN0IG09bCsxO2gucHVzaCh7bGluZW5vOm0sbnVtTm9kZXM6bnVsbCE9dFttXT9TdHJpbmcodFttXS5sZW5ndGgpKyIvIitTdHJpbmcoZlttXSkrIiBcdTI1YmMiOiIiLHRleHQ6dGhpcy5faHRtbEVzY2FwZShrW2xdKX0pfXRoaXMuc2V0KCJfZmlsZUxpbmVzIixoKTtjb25zdCBwPXRoaXM7c2V0VGltZW91dCgoKT0+e2NvbnN0IG09e30sbj17fTtmb3IoY29uc3QgdSBpbiB0KXtpZighdC5oYXNPd25Qcm9wZXJ0eSh1KSljb250aW51ZTtmb3IodmFyIHE9cC4kJCgiI3NvdXJjZS1saW5lLW5vZGVzLSIrdSk7cS5maXJzdENoaWxkOylxLnJlbW92ZUNoaWxkKHEuZmlyc3RDaGlsZCk7Y29uc3QgeD10W3VdO3guc29ydChmdW5jdGlvbihBLHkpe3JldHVybiBBWzBdPHlbMF0/LTE6QVswXT55WzBdPzE6MH0pO2ZvcihsZXQgQT0wO0E8eC5sZW5ndGg7KytBKXtjb25zdCB5PQp4W0FdWzBdLHc9eFtBXVsxXSxDPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO0cuc2V0QXR0cmlidXRlKCJjbGFzcyIsInNvdXJjZS1saW5lLW5vZGUtZW50dHJ5Iik7Ry5zZXRBdHRyaWJ1dGUoInNvdXJjZUxpbmVubyIsdSk7Ry50ZXh0Q29udGVudD15O0cuYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e3RoaXMubm9kZUNsaWNrZWQodGhpcy5fbm9kZU5hbWUyRGV2aWNlTmFtZVt5XSx0aGlzLl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZVt5XSwhMCl9KTtjb25zdCBEPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInBhcGVyLWljb24tYnV0dG9uIik7RC5zZXRBdHRyaWJ1dGUoImljb24iLCJmaWx0ZXItbGlzdCIpO0Quc2V0QXR0cmlidXRlKCJ0aXRsZSIsIlNob3cgc3RhY2siKTtELmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9Pnt0aGlzLl9oaWdobGlnaHROb2RlRWxlbWVudHMoeSk7dGhpcy5zZXQoIl9mdWxsU3RhY2tOb2RlTmFtZSIsCnkpO3RoaXMuc2V0KCJfZnVsbFN0YWNrU2hvd24iLCEwKTt0aGlzLl9wb3B1bGF0ZUZ1bGxTdGFjayh5LHRoaXMuX2Z1bGxGaWxlUGF0aHNbdGhpcy5fZmlsZVBhdGhTZWxlY3RlZF0sTnVtYmVyKHUpKX0pO2NvbnN0IEI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItaWNvbi1idXR0b24iKTtCLnNldEF0dHJpYnV0ZSgiaWNvbiIsImZvcndhcmQiKTtCLnNldEF0dHJpYnV0ZSgidGl0bGUiLCJDb250aW51ZSB0byIpO0IuYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e3RoaXMubm9kZUNsaWNrZWQodGhpcy5fbm9kZU5hbWUyRGV2aWNlTmFtZVt5XSx0aGlzLl9ub2RlTmFtZTJCYXNlRXhwYW5kZWROb2RlTmFtZVt5XSwhMCk7Y29uc3QgST10aGlzLl9ub2RlTmFtZTJEZXZpY2VOYW1lW3ldLE49dGhpcy5fbm9kZU5hbWUyQmFzZUV4cGFuZGVkTm9kZU5hbWVbeV07dGhpcy5zZXQoIl9zZXRIaWdodGxpZ2h0T3JpZ2luTm9kZUVsZW1lbnQiLEcpO3RoaXMuY29udGludWVUb05vZGUoSSwKTil9KTtDLmFwcGVuZENoaWxkKEQpO0MuYXBwZW5kQ2hpbGQoQik7Qy5hcHBlbmRDaGlsZChHKTtxLmFwcGVuZENoaWxkKEMpO20uaGFzT3duUHJvcGVydHkoeSl8fChtW3ldPVtdKTttW3ldLnB1c2goRyk7bi5oYXNPd25Qcm9wZXJ0eSh5KXx8KG5beV09W0csd10pO3c+blt5XVsxXSYmKG5beV09W0csd10pfXEuc2V0QXR0cmlidXRlKCJoaWRkZW4iLCEwKTtxPXAuJCQoIiNzb3VyY2UtbGluZS1ub2RlLXRvZ2dsZS0iK3UpO251bGw9PXEuZ2V0QXR0cmlidXRlKCJ0YXBDYWxsYmFja1NldCIpJiYocS5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLCgpPT57cC5fdG9nZ2xlTGluZU5vZGVzKE51bWJlcih1KSl9KSxxLnNldEF0dHJpYnV0ZSgidGFwQ2FsbGJhY2tTZXQiLCEwKSl9cC5zZXQoIl9ub2RlTmFtZTJOb2RlRWxlbWVudHMiLG0pO2Zvcihjb25zdCB1IGluIG4pbi5oYXNPd25Qcm9wZXJ0eSh1KSYmKG5bdV09blt1XVswXSk7cC5zZXQoIl9ub2RlTmFtZTJTdGFja1RvcE5vZGVFbGVtZW50IiwKbil9LHRoaXMuX3JlbmRlckRlbGF5TWlsbGlzKX0pfX0sX3RvZ2dsZUxpbmVOb2RlcyhiLGQ9ITEpe2I9dGhpcy4kJCgiI3NvdXJjZS1saW5lLW5vZGVzLSIrYik7bnVsbD09Yi5nZXRBdHRyaWJ1dGUoImhpZGRlbiIpJiYhMCE9PWQ/Yi5zZXRBdHRyaWJ1dGUoImhpZGRlbiIsITApOmIucmVtb3ZlQXR0cmlidXRlKCJoaWRkZW4iKX0sX2ZpbHRlckZpbGVUcmFjZWJhY2tzQnlEZWJ1Z1dhdGNoZXMoYil7Y29uc3QgZD10aGlzLmRlYnVnV2F0Y2hlcy5tYXAoaz0+VmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGsubm9kZV9uYW1lKSksZj17fSxoPXt9O2Zvcihjb25zdCBrIG9mIHRoaXMuZGVidWdXYXRjaGVzKXtjb25zdCB0PVZpLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihrLm5vZGVfbmFtZSk7Zlt0XT1rLmRldmljZV9uYW1lO2hbdF09ay5ub2RlX25hbWV9dGhpcy5zZXQoIl9ub2RlTmFtZTJEZXZpY2VOYW1lIixmKTt0aGlzLnNldCgiX25vZGVOYW1lMkJhc2VFeHBhbmRlZE5vZGVOYW1lIiwKaCk7Zm9yKGNvbnN0IGsgaW4gYiliLmhhc093blByb3BlcnR5KGspJiYoYltrXT1iW2tdLmZpbHRlcih0PT5fLmluY2x1ZGVzKGQsdFswXSkpKX0sX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KGIpe2NvbnN0IGQ9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL3NvdXJjZV9jb2RlIik7Yj12Yy5hZGRQYXJhbXMoZCxiKTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpfSxfaHRtbEVzY2FwZShiKXtyZXR1cm4gYi5yZXBsYWNlKC8gL2csIlx1MDBhMCIpfSxfZm9jdXNPbk5vZGUoYil7aWYobnVsbCE9Yil7dmFyIGQ9dGhpcy5fc2hvcnRGaWxlUGF0aHNbdGhpcy5fZmlsZVBhdGhTZWxlY3RlZF0uaWQsZj10aGlzO3RoaXMuX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KHttb2RlOiJvcF90cmFjZWJhY2siLG9wX25hbWU6Yn0pLnRoZW4oaD0+e2NvbnN0IGs9aC5vcF90cmFjZWJhY2tbYl07aD1bXTtmb3IobGV0IGw9MDtsPGsubGVuZ3RoOysrbCl7Y29uc3QgcD0Ka1tsXVsxXTtrW2xdWzBdPT09ZCYmaC5wdXNoKHApfWZvcih2YXIgdCBvZiBmLl9oaWdobGlnaHRlZEVsZW1lbnRzKXQuY2xhc3NMaXN0LnJlbW92ZSgiaGlnaGxpZ2h0ZWQtc291cmNlLWxpbmUiKTt0PVtdO2Zvcihjb25zdCBsIG9mIGgpaD10aGlzLiQkKCIjc291cmNlLWxpbmUtIitsKSx0LnB1c2goaCksaC5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRlZC1zb3VyY2UtbGluZSIpLGYuX3RvZ2dsZUxpbmVOb2RlcyhsLCEwKTtmLnNldCgiX2hpZ2hsaWdodGVkRWxlbWVudHMiLHQpO3RoaXMuX2hpZ2hsaWdodE5vZGVFbGVtZW50cyhiKX0pfX0sX2hpZ2hsaWdodE5vZGVFbGVtZW50cyhiKXtpZihudWxsIT10aGlzLl9vbGRGb2N1c05vZGVOYW1lKWZvcihjb25zdCBkIG9mIHRoaXMuX25vZGVOYW1lMk5vZGVFbGVtZW50c1t0aGlzLl9vbGRGb2N1c05vZGVOYW1lXSlkLnN0eWxlWyJmb250LXdlaWdodCJdPSJub3JtYWwiO2Zvcihjb25zdCBkIG9mIHRoaXMuX25vZGVOYW1lMk5vZGVFbGVtZW50c1tiXSlkLnN0eWxlWyJmb250LXdlaWdodCJdPQoiYm9sZCI7bnVsbD09dGhpcy5fc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50P3RoaXMuX25vZGVOYW1lMlN0YWNrVG9wTm9kZUVsZW1lbnRbYl0uc2Nyb2xsSW50b1ZpZXcoe2Jsb2NrOiJjZW50ZXIiLGJlaGF2aW91cjoic21vb3RoIn0pOnRoaXMuc2V0KCJfc2V0SGlnaHRsaWdodE9yaWdpbk5vZGVFbGVtZW50IixudWxsKTt0aGlzLnNldCgiX29sZEZvY3VzTm9kZU5hbWUiLGIpfSxfcG9wdWxhdGVGdWxsU3RhY2soYixkLGYpe3RoaXMuX3F1ZXJ5U291cmNlQ29kZUVuZFBvaW50KHttb2RlOiJvcF90cmFjZWJhY2siLG9wX25hbWU6Yn0pLnRoZW4oaD0+e2NvbnN0IGs9dGhpcy4kJCgiI2Z1bGwtc3RhY2stY29udGVudCIpO2Zvcig7ay5maXJzdENoaWxkOylrLnJlbW92ZUNoaWxkKGsuZmlyc3RDaGlsZCk7Zm9yKGNvbnN0IHQgb2YgaC5vcF90cmFjZWJhY2tbYl0pe2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGkiKSxwPXRbMF0sbT1OdW1iZXIodFsxXSk7bC50ZXh0Q29udGVudD0KcCsiOiAiK1N0cmluZyhtKTtfLmluY2x1ZGVzKHRoaXMuX2Z1bGxGaWxlUGF0aHMscCk/KGwuY2xhc3NMaXN0LmFkZCgic3RhY2stZnJhbWUtY2xpY2thYmxlIiksbC5zdHlsZS5jb2xvcj0iYmx1ZSIsbC5zdHlsZVsidGV4dC1kZWNvcmF0aW9uIl09InVuZGVybGluZSIsbC5zdHlsZS5jdXJzb3I9InBvaW50ZXIiLHA9PT1kJiZtPT09ZiYmKGwuc3R5bGVbImZvbnQtd2VpZ2h0Il09ImJvbGQiKSxsLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsKCk9Pnt0aGlzLnNldCgiX2ZpbGVQYXRoU2VsZWN0ZWQiLHRoaXMuX2Z1bGxGaWxlUGF0aHMuaW5kZXhPZihwKSk7c2V0VGltZW91dCgoKT0+e3RoaXMuX3RvZ2dsZUxpbmVOb2RlcyhtLCEwKTtmb3IoY29uc3QgbiBvZiB0aGlzLl9ub2RlTmFtZTJOb2RlRWxlbWVudHNbYl0pTnVtYmVyKG4uZ2V0QXR0cmlidXRlKCJzb3VyY2VMaW5lbm8iKSk9PT1OdW1iZXIobSkmJihuLnNjcm9sbEludG9WaWV3KHtibG9jazoiY2VudGVyIixiZWhhdmlvdXI6InNtb290aCJ9KSwKdGhpcy5zZXQoIl9zZXRIaWdodGxpZ2h0T3JpZ2luTm9kZUVsZW1lbnQiLGwpLHRoaXMuX2hpZ2hsaWdodE5vZGVFbGVtZW50cyhiKSxkPT09cCYmZj09PW18fHRoaXMuX3BvcHVsYXRlRnVsbFN0YWNrKGIscCxtKSl9LDIqdGhpcy5fcmVuZGVyRGVsYXlNaWxsaXMpfSkpOihsLmNsYXNzTGlzdC5hZGQoInN0YWNrLWZyYW1lLW5vbmNsaWNrYWJsZSIpLGwuc3R5bGUuY29sb3I9IiM1NTUiKTtrLmFwcGVuZENoaWxkKGwpfX0pfSxfY2xvc2VGdWxsU3RhY2tEaWFsb2coKXt0aGlzLnNldCgiX2Z1bGxTdGFja1Nob3duIiwhMSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXRlbnNvci1kYXRhLXN1bW1hcnkuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtdGVuc29yLWRhdGEtc3VtbWFyeSIscHJvcGVydGllczp7bGF0ZXN0VGVuc29yRGF0YTpPYmplY3QsZXhwYW5kSGFuZGxlcjpPYmplY3QsY29udGludWVUb0NhbGxiYWNrOkZ1bmN0aW9uLGhpZ2hsaWdodGVkTm9kZU5hbWU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHRlbnNvck5hbWVDbGlja2VkOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOm51bGx9LGdldEhlYWx0aFBpbGw6RnVuY3Rpb24sX2hlYWx0aFBpbGxzRW5hYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLG5vdGlmeTohMH0sX3dhdGNoS2V5czp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX3dhdGNoS2V5MkRhdGE6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfd2F0Y2hLZXkyQ291bnQ6e3R5cGU6T2JqZWN0LHZhbHVlOnt9fSxfd2F0Y2hLZXkyRXhwYW5kSGFuZGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6e319LF93YXRjaEtleTJWYWx1ZVNob3J0Ont0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX3dhdGNoS2V5MlJvdzp7dHlwZTpPYmplY3QsCnZhbHVlOnt9fSxfYWN0aXZlV2F0Y2hLZXk6U3RyaW5nLF9oZWFsdGhQaWxsV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjIwMCxyZWFkb25seTohMH0sX2hlYWx0aFBpbGxIZWlnaHQ6e3R5cGU6TnVtYmVyLHZhbHVlOjMyLHJlYWRvbmx5OiEwfX0sb2JzZXJ2ZXJzOlsiX3JlbmRlckxhdGVzdChsYXRlc3RUZW5zb3JEYXRhLCBleHBhbmRIYW5kbGVyKSIsIl9oaWdobGlnaHQoaGlnaGxpZ2h0ZWROb2RlTmFtZSkiXSxsaXN0ZW5lcnM6eyJzaG93LWhlYWx0aC1waWxscy5jaGFuZ2UiOiJfc2hvd0hlYWx0aFBpbGxzQ2hhbmdlZCJ9LHJlYWR5KCl7dGhpcy5fcmVuZGVySGVhbHRoUGlsbExlZ2VuZCgpfSxlbmFibGVIZWFsdGhQaWxscygpe3RoaXMuc2V0KCJfaGVhbHRoUGlsbHNFbmFibGVkIiwhMCk7dGhpcy5fcmVuZGVySGVhbHRoUGlsbExlZ2VuZCgpfSxfc2hvd0hlYWx0aFBpbGxzQ2hhbmdlZCgpe3RoaXMuX2hlYWx0aFBpbGxzRW5hYmxlZD90aGlzLl9yZW5kZXJIZWFsdGhQaWxsTGVnZW5kKCk6CnRoaXMuX2NsZWFySGVhbHRoUGlsbExlZ2VuZCgpO3RoaXMuX3JlbmRlckFsbCgpfSxfcmVuZGVyQWxsKCl7dGhpcy5fY2xlYXJUZW5zb3JEYXRhVGFibGUoKTtmb3IoY29uc3QgYiBvZiB0aGlzLl93YXRjaEtleXMpdGhpcy5fcmVuZGVyTGF0ZXN0KHRoaXMuX3dhdGNoS2V5MkRhdGFbYl0sdGhpcy5fd2F0Y2hLZXkyRXhwYW5kSGFuZGxlcltiXSl9LF90ZW5zb3JEYXRhMldhdGNoS2V5KGIpe3JldHVybiBiLmRldmljZU5hbWUrIi8iK2IudGVuc29yTmFtZSsiOiIrYi5kZWJ1Z09wfSxfcmVuZGVyTGF0ZXN0KGIsZCl7aWYoYil7dmFyIGY9dGhpcy5fdGVuc29yRGF0YTJXYXRjaEtleShiKSxoPW51bGw7IlVuaW5pdGlhbGl6ZWQiIT09Yi5kdHlwZSYmIlVuc3VwcG9ydGVkIiE9PWIuZHR5cGUmJihoPSgpPT5kKGIpKTt2YXIgaz1udWxsIT1iLnZhbHVlP0pTT04uc3RyaW5naWZ5KGIudmFsdWUsKHQsbCk9PmwudG9GaXhlZD9OdW1iZXIobC50b0ZpeGVkKDMpKTpsKToiKENsaWNrIHRvIHZpZXcpIjsKdGhpcy5fd2F0Y2hLZXkyRGF0YVtmXT1iOy0xPT09dGhpcy5fd2F0Y2hLZXlzLmluZGV4T2YoZik/KHRoaXMuX3dhdGNoS2V5cy5wdXNoKGYpLHRoaXMuX3dhdGNoS2V5MkNvdW50W2ZdPTEpOnRoaXMuX3dhdGNoS2V5MkNvdW50W2ZdKz0xO3RoaXMuX3dhdGNoS2V5MkV4cGFuZEhhbmRsZXJbZl09aDt0aGlzLl93YXRjaEtleTJWYWx1ZVNob3J0W2ZdPWs7dGhpcy5fYWN0aXZlV2F0Y2hLZXk9Zjt0aGlzLl9yZW1vdmVBY3RpdmVTdGF0dXNGcm9tQWxsUm93cygpO3RoaXMuX3JlbmRlclJvdyhmKX19LF9jbGVhclRlbnNvckRhdGFUYWJsZSgpe2Zvcihjb25zdCBiIGluIHRoaXMuX3dhdGNoS2V5MlJvdyl0aGlzLl93YXRjaEtleTJSb3cuaGFzT3duUHJvcGVydHkoYikmJih0aGlzLl93YXRjaEtleTJSb3dbYl0ucmVtb3ZlKCksZGVsZXRlIHRoaXMuX3dhdGNoS2V5MlJvd1tiXSl9LF9jbGVhclRlbnNvckRhdGFSb3coYil7Zm9yKDtiLmZpcnN0Q2hpbGQ7KWIucmVtb3ZlQ2hpbGQoYi5maXJzdENoaWxkKX0sCl9jbGVhckhlYWx0aFBpbGxMZWdlbmQoKXtjb25zdCBiPXRoaXMuJCQoIiNoZWFsdGgtcGlsbC1sZWdlbmQiKTtmb3IoO2IuZmlyc3RDaGlsZDspYi5yZW1vdmVDaGlsZChiLmZpcnN0Q2hpbGQpfSxfcmVuZGVySGVhbHRoUGlsbExlZ2VuZCgpe3RoaXMuX2NsZWFySGVhbHRoUGlsbExlZ2VuZCgpO2NvbnN0IGI9dGhpcy4kJCgiI2hlYWx0aC1waWxsLWxlZ2VuZCIpO3ZhciBkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2QudGV4dENvbnRlbnQ9IkxlZ2VuZDoiO2IuYXBwZW5kQ2hpbGQoZCk7ZC5zdHlsZVsibWFyZ2luLXJpZ2h0Il09IjAuNWVtIjtkLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI7Zm9yKGQ9MDtkPHRmLmdyYXBoLnNjZW5lLmhlYWx0aFBpbGxFbnRyaWVzLmxlbmd0aDsrK2Qpe2NvbnN0IGY9dGYuZ3JhcGguc2NlbmUuaGVhbHRoUGlsbEVudHJpZXNbZF0saD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtoLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayI7Cmguc3R5bGVbIm1hcmdpbi1yaWdodCJdPSIwLjI1ZW0iO2NvbnN0IGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO2sudGV4dENvbnRlbnQ9Ilx1MjVhMCI7ay5zdHlsZS5jb2xvcj1mLmJhY2tncm91bmRfY29sb3I7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7dC50ZXh0Q29udGVudD1mLmxhYmVsO3Quc3R5bGUuY29sb3I9Zi5iYWNrZ3JvdW5kX2NvbG9yO2guYXBwZW5kQ2hpbGQoayk7aC5hcHBlbmRDaGlsZCh0KTtiLmFwcGVuZENoaWxkKGgpfX0sX3JlbW92ZUFjdGl2ZVN0YXR1c0Zyb21BbGxSb3dzKCl7Zm9yKGNvbnN0IGIgaW4gdGhpcy5fd2F0Y2hLZXkyUm93KXtpZighdGhpcy5fd2F0Y2hLZXkyUm93Lmhhc093blByb3BlcnR5KGIpKWNvbnRpbnVlO2NvbnN0IGQ9dGhpcy5fd2F0Y2hLZXkyUm93W2JdO1BvbHltZXIuZG9tKGQpLmNsYXNzTGlzdC5yZW1vdmUoImFjdGl2ZS10ZW5zb3IiKTtQb2x5bWVyLmRvbShkKS5jbGFzc0xpc3QucmVtb3ZlKCJoaWdobGlnaHRlZCIpfX0sCl9yZW5kZXJSb3coYil7bGV0IGQsZj0hMTtudWxsIT10aGlzLl93YXRjaEtleTJSb3dbYl0/KGQ9dGhpcy5fd2F0Y2hLZXkyUm93W2JdLHRoaXMuX2NsZWFyVGVuc29yRGF0YVJvdyhkKSxmPSExKTooZD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpLGY9ITApO2NvbnN0IGg9dGhpcy5fd2F0Y2hLZXkyRGF0YVtiXS5kZXZpY2VOYW1lLGs9dGhpcy5fd2F0Y2hLZXkyRGF0YVtiXS5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lLHQ9aCsiLyIrazt2YXIgbD10aGlzLl93YXRjaEtleTJDb3VudFtiXSxwPXRoaXMuX3dhdGNoS2V5MkRhdGFbYl0udGVuc29yTmFtZSxtPXRoaXMuX3dhdGNoS2V5MkRhdGFbYl0uZGVidWdPcCxuPXRoaXMuX3dhdGNoS2V5MlZhbHVlU2hvcnRbYl07Y29uc3QgcT10aGlzLl93YXRjaEtleTJFeHBhbmRIYW5kbGVyW2JdLHU9Yj09PXRoaXMuX2FjdGl2ZVdhdGNoS2V5LHg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtQb2x5bWVyLmRvbSh4KS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3ItbmFtZSIpOwp4LnN0eWxlWyJ0ZXh0LWRlY29yYXRpb24iXT0idW5kZXJsaW5lIjt4LnN0eWxlLmN1cnNvcj0icG9pbnRlciI7eC50ZXh0Q29udGVudD1wO3guYWRkRXZlbnRMaXN0ZW5lcigidGFwIiwoKT0+e251bGwhPXRoaXMudGVuc29yTmFtZUNsaWNrZWQmJnRoaXMudGVuc29yTmFtZUNsaWNrZWQoaCxrKX0pO2NvbnN0IEE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtBLnRleHRDb250ZW50PWw7Y29uc3QgeT10aGlzLl93YXRjaEtleTJEYXRhW2JdLmR0eXBlO2w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtjb25zdCB3PXRoaXMuX3dhdGNoS2V5MkRhdGFbYl0uc2hhcGU7bC50ZXh0Q29udGVudD15O2NvbnN0IEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtDLnRleHRDb250ZW50PUpTT04uc3RyaW5naWZ5KHcpO2NvbnN0IEc9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtHLnRleHRDb250ZW50PW47UG9seW1lci5kb20oRykuY2xhc3NMaXN0LmFkZCgidmFsdWUtZXhwYW5zaW9uLWxpbmsiKTsKbnVsbCE9cSYmKEcuYWRkRXZlbnRMaXN0ZW5lcigidGFwIixxLCExKSxHLnN0eWxlWyJ0ZXh0LWRlY29yYXRpb24iXT0idW5kZXJsaW5lIixHLnN0eWxlLmN1cnNvcj0icG9pbnRlciIpO249bnVsbDtuPXRoaXMuX2hlYWx0aFBpbGxzRW5hYmxlZD90aGlzLl9yZW5kZXJIZWFsdGhQaWxsKHArIjoiK20se2RldmljZV9uYW1lOmgsbm9kZV9uYW1lOmssZHR5cGU6eSxzaGFwZTp3LHZhbHVlOm51bGx9LHEpOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7cD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO209ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItaWNvbi1idXR0b24iKTttLnNldEF0dHJpYnV0ZSgiaWNvbiIsImZvcndhcmQiKTttLnNldEF0dHJpYnV0ZSgidGl0bGUiLCJDb250aW51ZSB0byIpO20uYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57dGhpcy5jb250aW51ZVRvQ2FsbGJhY2soaCxrKX0pO3AuYXBwZW5kQ2hpbGQobSk7ZC5hcHBlbmRDaGlsZCh4KTsKZC5hcHBlbmRDaGlsZChBKTtkLmFwcGVuZENoaWxkKGwpO2QuYXBwZW5kQ2hpbGQoQyk7ZC5hcHBlbmRDaGlsZChHKTtkLmFwcGVuZENoaWxkKG4pO2QuYXBwZW5kQ2hpbGQocCk7ZC5zZXRBdHRyaWJ1dGUoIm5vZGVOYW1lV2l0aERldmljZSIsdCk7dSYmKFBvbHltZXIuZG9tKGQpLmNsYXNzTGlzdC5hZGQoImFjdGl2ZS10ZW5zb3IiKSxQb2x5bWVyLmRvbShkKS5jbGFzc0xpc3QuYWRkKCJoaWdobGlnaHRlZCIpKTt0aGlzLl93YXRjaEtleTJSb3dbYl09ZDtmJiZQb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGVuc29yLWRhdGEtdGFibGUgdGJvZHkiKSkuYXBwZW5kQ2hpbGQoZCk7ZC5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImVuZCIsaW5saW5lOiJuZWFyZXN0IixiZWhhdmlvdXI6InNtb290aCJ9KX0sX3JlbmRlckhlYWx0aFBpbGwoYixkLGYpe2NvbnN0IGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTtQb2x5bWVyLmRvbShoKS5jbGFzc0xpc3QuYWRkKCJoZWFsdGgtcGlsbCIpOwpudWxsIT1mJiZoLmFkZEV2ZW50TGlzdGVuZXIoInRhcCIsZiwhMSk7Zj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlModGYuZ3JhcGguc2NlbmUuU1ZHX05BTUVTUEFDRSwic3ZnIik7Zi5zZXRBdHRyaWJ1dGUoIndpZHRoIix0aGlzLl9oZWFsdGhQaWxsV2lkdGgpO2Yuc2V0QXR0cmlidXRlKCJoZWlnaHQiLHRoaXMuX2hlYWx0aFBpbGxIZWlnaHQpO2NvbnN0IGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHRmLmdyYXBoLnNjZW5lLlNWR19OQU1FU1BBQ0UsImciKTtmLmFwcGVuZENoaWxkKGspO2guYXBwZW5kQ2hpbGQoZik7Y29uc3QgdD0idGRwLyIrYjt0aGlzLmdldEhlYWx0aFBpbGwoYixkLmRldmljZV9uYW1lLGQubm9kZV9uYW1lLGw9PntudWxsPT1sPyhoLnRleHRDb250ZW50PSJOL0EiLGguc3R5bGUuY29sb3I9ImdyYXkiKTooZC52YWx1ZT1sLHRmLmdyYXBoLnNjZW5lLmFkZEhlYWx0aFBpbGwoayxkLG51bGwsdCx0aGlzLl9oZWFsdGhQaWxsV2lkdGgsdGhpcy5faGVhbHRoUGlsbEhlaWdodC8KMix0aGlzLl9oZWFsdGhQaWxsSGVpZ2h0LzIsMCkpfSk7cmV0dXJuIGh9LF9oaWdobGlnaHQoYil7UG9seW1lci5kb20odGhpcy4kJCgiI3RlbnNvci1kYXRhLXRhYmxlIikpO2NvbnN0IGQ9W107Zm9yKGNvbnN0IGYgaW4gdGhpcy5fd2F0Y2hLZXkyUm93KXtpZighdGhpcy5fd2F0Y2hLZXkyUm93Lmhhc093blByb3BlcnR5KGYpKWNvbnRpbnVlO2NvbnN0IGg9dGhpcy5fd2F0Y2hLZXkyUm93W2ZdO251bGwhPWguZ2V0QXR0cmlidXRlJiYoaC5nZXRBdHRyaWJ1dGUoIm5vZGVOYW1lV2l0aERldmljZSIpPT09Yj9kLnB1c2goaCk6UG9seW1lci5kb20oaCkuY2xhc3NMaXN0LnJlbW92ZSgiaGlnaGxpZ2h0ZWQiKSl9aWYobnVsbCE9Yilmb3IoYj0wO2I8ZC5sZW5ndGg7KytiKVBvbHltZXIuZG9tKGRbYl0pLmNsYXNzTGlzdC5hZGQoImhpZ2hsaWdodGVkIiksZFtiXS5zY3JvbGxJbnRvVmlldyh7YmxvY2s6ImVuZCIsaW5saW5lOiJuZWFyZXN0IixiZWhhdmlvdXI6InNtb290aCJ9KX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90ZW5zb3Itd2lkZ2V0L3RlbnNvcl93aWRnZXRfYmluYXJ5LmpzCnZhciBXaT10aGlzJiZ0aGlzLl9fZXh0ZW5kc3x8ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGQsZil7Yj1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24oaCxrKXtoLl9fcHJvdG9fXz1rfXx8ZnVuY3Rpb24oaCxrKXtmb3IodmFyIHQgaW4gaylrLmhhc093blByb3BlcnR5KHQpJiYoaFt0XT1rW3RdKX07cmV0dXJuIGIoZCxmKX1yZXR1cm4gZnVuY3Rpb24oZCxmKXtmdW5jdGlvbiBoKCl7dGhpcy5jb25zdHJ1Y3Rvcj1kfWIoZCxmKTtkLnByb3RvdHlwZT1udWxsPT09Zj9PYmplY3QuY3JlYXRlKGYpOihoLnByb3RvdHlwZT1mLnByb3RvdHlwZSxuZXcgaCl9fSgpLFhpPXRoaXMmJnRoaXMuX19nZW5lcmF0b3J8fGZ1bmN0aW9uKGIsZCl7ZnVuY3Rpb24gZihuKXtyZXR1cm4gZnVuY3Rpb24ocSl7cmV0dXJuIGgoW24scV0pfX1mdW5jdGlvbiBoKG4pe2lmKHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLiIpOwpmb3IoO2s7KXRyeXtpZih0PTEsbCYmKHA9blswXSYyP2xbInJldHVybiJdOm5bMF0/bFsidGhyb3ciXXx8KChwPWxbInJldHVybiJdKSYmcC5jYWxsKGwpLDApOmwubmV4dCkmJiEocD1wLmNhbGwobCxuWzFdKSkuZG9uZSlyZXR1cm4gcDtpZihsPTAscCluPVtuWzBdJjIscC52YWx1ZV07c3dpdGNoKG5bMF0pe2Nhc2UgMDpjYXNlIDE6cD1uO2JyZWFrO2Nhc2UgNDpyZXR1cm4gay5sYWJlbCsrLHt2YWx1ZTpuWzFdLGRvbmU6ITF9O2Nhc2UgNTprLmxhYmVsKys7bD1uWzFdO249WzBdO2NvbnRpbnVlO2Nhc2UgNzpuPWsub3BzLnBvcCgpO2sudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKCEocD1rLnRyeXMscD0wPHAubGVuZ3RoJiZwW3AubGVuZ3RoLTFdKSYmKDY9PT1uWzBdfHwyPT09blswXSkpe2s9MDtjb250aW51ZX1pZigzPT09blswXSYmKCFwfHxuWzFdPnBbMF0mJm5bMV08cFszXSkpay5sYWJlbD1uWzFdO2Vsc2UgaWYoNj09PW5bMF0mJmsubGFiZWw8cFsxXSlrLmxhYmVsPQpwWzFdLHA9bjtlbHNlIGlmKHAmJmsubGFiZWw8cFsyXSlrLmxhYmVsPXBbMl0say5vcHMucHVzaChuKTtlbHNle3BbMl0mJmsub3BzLnBvcCgpO2sudHJ5cy5wb3AoKTtjb250aW51ZX19bj1kLmNhbGwoYixrKX1jYXRjaChxKXtuPVs2LHFdLGw9MH1maW5hbGx5e3Q9cD0wfWlmKG5bMF0mNSl0aHJvdyBuWzFdO3JldHVybnt2YWx1ZTpuWzBdP25bMV06dm9pZCAwLGRvbmU6ITB9fXZhciBrPXtsYWJlbDowLHNlbnQ6ZnVuY3Rpb24oKXtpZihwWzBdJjEpdGhyb3cgcFsxXTtyZXR1cm4gcFsxXX0sdHJ5czpbXSxvcHM6W119LHQsbCxwLG07cmV0dXJuIG09e25leHQ6ZigwKSwidGhyb3ciOmYoMSksInJldHVybiI6ZigyKX0sImZ1bmN0aW9uIj09PXR5cGVvZiBTeW1ib2wmJihtW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLG19LFlpPXRoaXMmJnRoaXMuX19yZWFkfHxmdW5jdGlvbihiLGQpe3ZhciBmPSJmdW5jdGlvbiI9PT10eXBlb2YgU3ltYm9sJiZiW1N5bWJvbC5pdGVyYXRvcl07CmlmKCFmKXJldHVybiBiO2I9Zi5jYWxsKGIpO3ZhciBoLGs9W107dHJ5e2Zvcig7KHZvaWQgMD09PWR8fDA8ZC0tKSYmIShoPWIubmV4dCgpKS5kb25lOylrLnB1c2goaC52YWx1ZSl9Y2F0Y2gobCl7dmFyIHQ9e2Vycm9yOmx9fWZpbmFsbHl7dHJ5e2gmJiFoLmRvbmUmJihmPWJbInJldHVybiJdKSYmZi5jYWxsKGIpfWZpbmFsbHl7aWYodCl0aHJvdyB0LmVycm9yO319cmV0dXJuIGt9OwooZnVuY3Rpb24oKXtmdW5jdGlvbiBiKEgsSyxNLEwpe3JldHVybiBuZXcgKE18fChNPVByb21pc2UpKShmdW5jdGlvbihRLFQpe2Z1bmN0aW9uIFgoWil7dHJ5e2xhKEwubmV4dChaKSl9Y2F0Y2goYmEpe1QoYmEpfX1mdW5jdGlvbiBhYShaKXt0cnl7bGEoTFsidGhyb3ciXShaKSl9Y2F0Y2goYmEpe1QoYmEpfX1mdW5jdGlvbiBsYShaKXtaLmRvbmU/UShaLnZhbHVlKToobmV3IE0oZnVuY3Rpb24oYmEpe2JhKFoudmFsdWUpfSkpLnRoZW4oWCxhYSl9bGEoKEw9TC5hcHBseShILEt8fFtdKSkubmV4dCgpKX0pfWZ1bmN0aW9uIGQoSCl7cmV0dXJuIG51bGwhPT1ILm1hdGNoKC9eaW50WzAtOV0rJC8pfHxudWxsIT09SC5tYXRjaCgvXnVpbnRbMC05XSskLyl9ZnVuY3Rpb24gZihIKXtyZXR1cm4gbnVsbCE9PUgubWF0Y2goL15mbG9hdFswLTldKyQvKXx8bnVsbCE9PUgubWF0Y2goL15iZmxvYXRbMC05XSskLyl9ZnVuY3Rpb24gaChIKXtyZXR1cm4iYm9vbCI9PT1ILnRvTG93ZXJDYXNlKCl8fAoiYm9vbGVhbiI9PT1ILnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gayhIKXtyZXR1cm4ic3RyIj09PUgudG9Mb3dlckNhc2UoKXx8InN0cmluZyI9PT1ILnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gdChIKXt2YXIgSz0xO0guZm9yRWFjaChmdW5jdGlvbihNKXtLKj1NfSk7cmV0dXJuIEt9ZnVuY3Rpb24gbChIKXtyZXR1cm4gMD09PUgubGVuZ3RoPyJzY2FsYXIiOiJbIitIKyJdIn1mdW5jdGlvbiBwKEgpe3ZhciBLPXtzbGljaW5nRGltc0FuZEluZGljZXM6W10sdmlld2luZ0RpbXM6W10sdmVydGljYWxSYW5nZTpudWxsLGhvcml6b250YWxSYW5nZTpudWxsfSxNPUgubGVuZ3RoO2lmKDE9PT1NKUsudmlld2luZ0RpbXM9WzBdO2Vsc2UgaWYoMTxNKXtpZigyPE0pZm9yKHZhciBMPTA7TDxNLTI7KytMKUsuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLnB1c2goe2RpbTpMLGluZGV4OjA9PT1IW0xdP251bGw6MH0pO2ZvcihMPUgubGVuZ3RoLTI7TDxILmxlbmd0aDsrK0wpSy52aWV3aW5nRGltcy5wdXNoKEwpfXJldHVybiBLfQpmdW5jdGlvbiBtKEgsSyl7aWYoSC52aWV3aW5nRGltc1swXSE9PUsudmlld2luZ0RpbXNbMF18fEgudmlld2luZ0RpbXNbMV0hPT1LLnZpZXdpbmdEaW1zWzFdKXJldHVybiExO0s9SC5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKE0pe3JldHVybiBNLmRpbX0pO0suc29ydCgpO0g9SC5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKE0pe3JldHVybiBNLmRpbX0pO0guc29ydCgpO3JldHVybiBKU09OLnN0cmluZ2lmeShLKT09PUpTT04uc3RyaW5naWZ5KEgpfWZ1bmN0aW9uIG4oSCl7cmV0dXJuIDIwPj1ILmxlbmd0aD9IOkguc2xpY2UoMCwxMCkrIi4uLiIrSC5zbGljZShILmxlbmd0aC03LEgubGVuZ3RoKX1mdW5jdGlvbiBxKEgsSyxNLEwpe3ZvaWQgMD09PU0mJihNPTIpO2lmKGlzTmFOKEgpKXJldHVybiJOYU4iO2lmKC1JbmZpbml0eT09PUgpcmV0dXJuIi1cdTIyMWUiO2lmKEluZmluaXR5PT09SClyZXR1cm4iK1x1MjIxZSI7bnVsbD09TCYmKEw9Ck1hdGguYWJzKEgpLEw9MUUzPkwmJi4wMTw9THx8MD09PUw/ImZpeGVkIjoiZXhwb25lbnRpYWwiKTtyZXR1cm4gbnVsbD09THx8ImZpeGVkIj09PUw/Sz8iIitIOkgudG9GaXhlZChNKTpILnRvRXhwb25lbnRpYWwoTSl9ZnVuY3Rpb24gdShILEspe3ZvaWQgMD09PUsmJihLPSEwKTtyZXR1cm4gSD9LPyJUIjoiVHJ1ZSI6Sz8iRiI6IkZhbHNlIn1mdW5jdGlvbiB4KEgsSyl7dm9pZCAwPT09SyYmKEs9NCk7cmV0dXJuIG51bGw9PT1LfHxILmxlbmd0aDw9Sz9IOkguc2xpY2UoMCxLLTEpKyJcdTIwMjYifXZhciBBPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLKXt0aGlzLmlzU2hvd249ITE7dGhpcy5ibHVySGlkZUZ1bmN0aW9uPW51bGw7dGhpcy5kcm9wZG93bj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0aGlzLmRyb3Bkb3duLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duIik7dGhpcy5kcm9wZG93bi5zdHlsZS5wb3NpdGlvbj0iZml4ZWQiO3RoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheT0KIm5vbmUiO0suYXBwZW5kQ2hpbGQodGhpcy5kcm9wZG93bil9SC5wcm90b3R5cGUuc2hvdz1mdW5jdGlvbihLLE0sTCl7dmFyIFE9dGhpcztMLmZvckVhY2goZnVuY3Rpb24oWCl7dmFyIGFhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2FhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbSIpO2FhLnRleHRDb250ZW50PVguY2FwdGlvbjtRLmRyb3Bkb3duLmFwcGVuZENoaWxkKGFhKTtYLmRpc2FibGVkP2FhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1kaXNhYmxlZCIpOihhYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24obGEpe2xhLnN0b3BQcm9wYWdhdGlvbigpO1EuZHJvcGRvd24uY2xpY2soKTtpZihudWxsIT09WC5vbkNsaWNrKVgub25DbGljayhsYSk7US5oaWRlKCl9KSxhYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbihsYSl7aWYobnVsbCE9PQpYLm9uSG92ZXIpWC5vbkhvdmVyKGxhKTthYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1kcm9wZG93bi1tZW51LWl0ZW0tYWN0aXZlIil9KSxhYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe2FhLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUiKTtpZihudWxsIT09WC5vbkhvdmVyKXtmb3IodmFyIGxhPVtdLFo9MDtaPGFhLmNoaWxkcmVuLmxlbmd0aDsrK1ope3ZhciBiYT1hYS5jaGlsZHJlbltaXTtiYS5jbGFzc0xpc3QuY29udGFpbnMoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duIikmJmxhLnB1c2goYmEpfWxhLmZvckVhY2goZnVuY3Rpb24oZWEpe3JldHVybiBhYS5yZW1vdmVDaGlsZChlYSl9KX19KSl9KTt0aGlzLmRyb3Bkb3duLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjt0aGlzLmRyb3Bkb3duLnN0eWxlLnRvcD1LKyJweCI7dGhpcy5kcm9wZG93bi5zdHlsZS5sZWZ0PQpNKyJweCI7TD10aGlzLmRyb3Bkb3duLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3ZhciBUPUwubGVmdC1NO3RoaXMuZHJvcGRvd24uc3R5bGUudG9wPShLLShMLnRvcC1LKSkudG9GaXhlZCgxKSsicHgiO3RoaXMuZHJvcGRvd24uc3R5bGUubGVmdD0oTS1UKS50b0ZpeGVkKDEpKyJweCI7dGhpcy5pc1Nob3duPSEwO3RoaXMuYmx1ckhpZGVGdW5jdGlvbj1mdW5jdGlvbigpe1EuaGlkZSgpfTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cmV0dXJuIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsUS5ibHVySGlkZUZ1bmN0aW9uKX0sNTApfTtILnByb3RvdHlwZS5oaWRlPWZ1bmN0aW9uKCl7Zm9yKHRoaXMuZHJvcGRvd24uc3R5bGUuZGlzcGxheT0ibm9uZSI7dGhpcy5kcm9wZG93bi5maXJzdENoaWxkOyl0aGlzLmRyb3Bkb3duLnJlbW92ZUNoaWxkKHRoaXMuZHJvcGRvd24uZmlyc3RDaGlsZCk7dGhpcy5pc1Nob3duPSExO251bGwhPXRoaXMuYmx1ckhpZGVGdW5jdGlvbiYmd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNsaWNrIiwKdGhpcy5ibHVySGlkZUZ1bmN0aW9uKX07SC5wcm90b3R5cGUuc2hvd249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc1Nob3dufTtyZXR1cm4gSH0oKSx5PWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLLE0pe3ZhciBMPXRoaXM7dGhpcy5jb25maWc9Szt0aGlzLnBhcmVudEVsZW1lbnQ9TTt0aGlzLmJhc2VGbGF0TWVudT1uZXcgQSh0aGlzLnBhcmVudEVsZW1lbnQpO3RoaXMuY3VycmVudENob2ljZVNlbGVjdGlvbnM9e307dGhpcy5jb25maWcuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihRLFQpe251bGwhPVEub3B0aW9ucyYmKEwuY3VycmVudENob2ljZVNlbGVjdGlvbnNbVF09US5kZWZhdWx0U2VsZWN0aW9uKX0pfUgucHJvdG90eXBlLnNob3c9ZnVuY3Rpb24oSyxNKXt2YXIgTD10aGlzLFE9W107dGhpcy5jb25maWcuaXRlbXMuZm9yRWFjaChmdW5jdGlvbihULFgpe3ZhciBhYT17Y2FwdGlvbjpULmNhcHRpb24sb25DbGljazpudWxsLG9uSG92ZXI6bnVsbH07aWYobnVsbCE9VC5vcHRpb25zKXt2YXIgbGE9CkwuY3VycmVudENob2ljZVNlbGVjdGlvbnNbWF07YWEub25Ib3Zlcj1mdW5jdGlvbihaKXt2YXIgYmE9Wi50YXJnZXQsZWE9W107VC5vcHRpb25zLmZvckVhY2goZnVuY3Rpb24oY2Esa2Epe2VhLnB1c2goe2NhcHRpb246a2E9PT1sYT9jYSsiIChcdTI3MTMpIjpjYSxvbkNsaWNrOmZ1bmN0aW9uKCl7bGEhPT1rYSYmKEwuY3VycmVudENob2ljZVNlbGVjdGlvbnNbWF09a2EsVC5jYWxsYmFjayhrYSkpfSxvbkhvdmVyOm51bGx9KX0pO1o9bmV3IEEoYmEpO2JhPWJhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1ouc2hvdyhiYS50b3AsYmEucmlnaHQsZWEpfX1lbHNlIGFhLm9uQ2xpY2s9VC5jYWxsYmFjaztudWxsPT1ULmlzRW5hYmxlZHx8VC5pc0VuYWJsZWQoKXx8KGFhLmRpc2FibGVkPSEwKTtRLnB1c2goYWEpfSk7dGhpcy5iYXNlRmxhdE1lbnUuc2hvdyhLLE0sUSl9O0gucHJvdG90eXBlLmhpZGU9ZnVuY3Rpb24oKXt0aGlzLmJhc2VGbGF0TWVudS5oaWRlKCl9O0gucHJvdG90eXBlLnNob3duPQpmdW5jdGlvbigpe3JldHVybiB0aGlzLmJhc2VGbGF0TWVudS5zaG93bigpfTtyZXR1cm4gSH0oKSx3OyhmdW5jdGlvbihIKXtIW0guVVA9MV09IlVQIjtIW0guRE9XTj0yXT0iRE9XTiI7SFtILkxFRlQ9M109IkxFRlQiO0hbSC5SSUdIVD00XT0iUklHSFQifSkod3x8KHc9e30pKTt2YXIgQz1mdW5jdGlvbigpe2Z1bmN0aW9uIEgoSyxNLEwsUSxULFgpe3RoaXMuc2hhcGU9Szt0aGlzLnNsaWNlRGltcz1bXTt0aGlzLnNsaWNlSW5kaWNlcz1bXTtpZigwPT09dCh0aGlzLnNoYXBlKSl0aHJvdyBFcnJvcigiVGVuc29yRWxlbWVudFNlbGVjdGlvbiBkb2Vzbid0IHN1cHBvcnQgdGVuc29yIHdpdGggemVybyBlbGVtZW50cy4iKTtmb3IoSz0wO0s8TS5zbGljaW5nRGltc0FuZEluZGljZXMubGVuZ3RoOysrSyl7dGhpcy5zbGljZURpbXMucHVzaChNLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tLXS5kaW0pO3ZhciBhYT1NLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tLXS5pbmRleDtpZihudWxsPT09CmFhKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIFRlbnNvckVsZW1lbnRTZWxlY3Rpb24gZHVlIHRvIHVuZGV0ZXJtaW5lZCBzbGljaW5nIGluZGV4IGF0IGRpbWVuc2lvbiAiK0spO3RoaXMuc2xpY2VJbmRpY2VzLnB1c2goYWEpfXRoaXMucmFuaz10aGlzLnNoYXBlLmxlbmd0aDtpZigwPHRoaXMucmFuayYmdGhpcy5zbGljZURpbXMubGVuZ3RoPj10aGlzLnJhbmspdGhyb3cgRXJyb3IoIkV4cGVjdGVkIHNsaWNlRGltcyB0byBoYXZlIGEgbGVuZ3RoIGxlc3MgdGhhbiByYW5rICIrdGhpcy5yYW5rKyIsIGJ1dCBnb3QgbGVuZ3RoICIrdGhpcy5zbGljZURpbXMubGVuZ3RoKTt0aGlzLnZpZXdEaW1zPVtdO2ZvcihLPTA7Szx0aGlzLnJhbms7KytLKS0xPT09dGhpcy5zbGljZURpbXMuaW5kZXhPZihLKSYmdGhpcy52aWV3RGltcy5wdXNoKEspO2lmKDI8dGhpcy52aWV3RGltcy5sZW5ndGgpdGhyb3cgRXJyb3IoIk9ubHkgc2VsZWN0aW9ucyBpbiAxRCBhbmQgMkQgYXJlIHN1cHBvcnRlZC4iKTsKdGhpcy5yb3dTdGFydD1udWxsPT1MPzA6TDt0aGlzLmNvbFN0YXJ0PW51bGw9PVE/MDpRO3RoaXMucm93Q291bnQ9bnVsbD09VD8xOlQ7dGhpcy5jb2xDb3VudD1udWxsPT1YPzE6WH1ILnByb3RvdHlwZS5nZXRFbGVtZW50U3RhdHVzPWZ1bmN0aW9uKEspe2lmKEsubGVuZ3RoIT09dGhpcy5yYW5rKXRocm93IEVycm9yKCJFeHBlY3RlZCBpbmRpY2VzIHRvIGhhdmUgYSByYW5rIG9mICIrdGhpcy5yYW5rKyIsIGJ1dCBnb3QgIisoSy5sZW5ndGgrIiAoWyIrSysiXSkiKSk7Zm9yKHZhciBNPTA7TTxLLmxlbmd0aDsrK00paWYoLTEhPT10aGlzLnNsaWNlRGltcy5pbmRleE9mKE0pJiZLW01dIT09dGhpcy5zbGljZUluZGljZXNbdGhpcy5zbGljZURpbXMuaW5kZXhPZihNKV0pcmV0dXJuIG51bGw7TT1udWxsO3ZhciBMPXRoaXMucm93U3RhcnQrdGhpcy5yb3dDb3VudCxRPXRoaXMuY29sU3RhcnQrdGhpcy5jb2xDb3VudDtpZigwPT09dGhpcy52aWV3RGltcy5sZW5ndGgpMD09PUsubGVuZ3RoJiYKKE09e3RvcEVkZ2U6ITAsYm90dG9tRWRnZTohMCxsZWZ0RWRnZTohMCxyaWdodEVkZ2U6ITB9KTtlbHNlIGlmKDE9PT10aGlzLnZpZXdEaW1zLmxlbmd0aCl7dmFyIFQ9dGhpcy52aWV3RGltc1swXTtLW1RdPj10aGlzLnJvd1N0YXJ0JiZLW1RdPEwmJihNPXt0b3BFZGdlOktbVF09PT10aGlzLnJvd1N0YXJ0LGJvdHRvbUVkZ2U6S1tUXT09PUwtMSxsZWZ0RWRnZTohMCxyaWdodEVkZ2U6ITB9KX1lbHNlIGlmKDI9PT10aGlzLnZpZXdEaW1zLmxlbmd0aCl7VD10aGlzLnZpZXdEaW1zWzBdO3ZhciBYPXRoaXMudmlld0RpbXNbMV07S1tUXT49dGhpcy5yb3dTdGFydCYmS1tUXTxMJiZLW1hdPj10aGlzLmNvbFN0YXJ0JiZLW1hdPFEmJihNPXt0b3BFZGdlOktbVF09PT10aGlzLnJvd1N0YXJ0LGJvdHRvbUVkZ2U6S1tUXT09PUwtMSxsZWZ0RWRnZTpLW1hdPT09dGhpcy5jb2xTdGFydCxyaWdodEVkZ2U6S1tYXT09PVEtMX0pfWVsc2UgdGhyb3cgRXJyb3IoIlVuZXhwZWN0ZWQgbGVuZ3RoIG9mIHZpZXdEaW1zOiAiKwp0aGlzLnZpZXdEaW1zKTtyZXR1cm4gTX07SC5wcm90b3R5cGUubW92ZT1mdW5jdGlvbihLLE0pe3ZhciBMPW51bGw7aWYoMD09PXRoaXMucmFua3x8MT09PXRoaXMucmFuayYmKEs9PT13LkxFRlR8fEs9PT13LlJJR0hUKSlyZXR1cm4gbnVsbDtpZihudWxsPT09TS52ZXJ0aWNhbFJhbmdlfHxudWxsPT09TS52ZXJ0aWNhbFJhbmdlWzFdKXRocm93IEVycm9yKCJGYWlsZWQgdG8gbW92ZSBkdWUgdG8gdW5kZXRlcm1pbmVkIHZlcnRpY2FsIHJhbmdlLiIpO0s9PT13LlVQPzA8dGhpcy5yb3dTdGFydCYmKHRoaXMucm93U3RhcnQtLSxudWxsIT1NLnZlcnRpY2FsUmFuZ2UmJnRoaXMucm93U3RhcnQ8TS52ZXJ0aWNhbFJhbmdlWzBdJiYoTD13LlVQKSk6Sz09PXcuRE9XTj9udWxsIT1NLnZpZXdpbmdEaW1zJiZudWxsIT1NLnZpZXdpbmdEaW1zWzBdJiZ0aGlzLnJvd1N0YXJ0PHRoaXMuc2hhcGVbTS52aWV3aW5nRGltc1swXV0tMSYmKHRoaXMucm93U3RhcnQrKyxudWxsIT1NLnZlcnRpY2FsUmFuZ2UmJgp0aGlzLnJvd1N0YXJ0Pj1NLnZlcnRpY2FsUmFuZ2VbMV0mJihMPXcuRE9XTikpOks9PT13LkxFRlQ/MDx0aGlzLmNvbFN0YXJ0JiYodGhpcy5jb2xTdGFydC0tLG51bGwhPU0uaG9yaXpvbnRhbFJhbmdlJiZ0aGlzLmNvbFN0YXJ0PE0uaG9yaXpvbnRhbFJhbmdlWzBdJiYoTD13LkxFRlQpKTpLPT09dy5SSUdIVCYmbnVsbCE9TS52aWV3aW5nRGltcyYmbnVsbCE9TS52aWV3aW5nRGltc1sxXSYmdGhpcy5jb2xTdGFydDx0aGlzLnNoYXBlW00udmlld2luZ0RpbXNbMV1dLTEmJih0aGlzLmNvbFN0YXJ0KyssbnVsbCE9TS5ob3Jpem9udGFsUmFuZ2UmJnRoaXMuY29sU3RhcnQ+PU0uaG9yaXpvbnRhbFJhbmdlWzFdJiYoTD13LlJJR0hUKSk7dGhpcy5jb2xDb3VudD10aGlzLnJvd0NvdW50PTE7cmV0dXJuIEx9O0gucHJvdG90eXBlLmdldFJvd1N0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm93U3RhcnR9O0gucHJvdG90eXBlLmdldFJvd0NvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucm93Q291bnR9OwpILnByb3RvdHlwZS5nZXRDb2xTdGFydD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbFN0YXJ0fTtILnByb3RvdHlwZS5nZXRDb2xDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmNvbENvdW50fTtyZXR1cm4gSH0oKSxHPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLLE0sTCl7dm9pZCAwPT09TCYmKEw9ZnVuY3Rpb24oKXt9KTt0aGlzLnJvb3REaXY9Szt0aGlzLnNoYXBlPU07dGhpcy5vblNsaWNpbmdTcGVjQ2hhbmdlPUw7dGhpcy5kaW1Db250cm9scz1bXTt0aGlzLmRpbUlucHV0cz1bXTt0aGlzLmNvbW1hcz1bXTt0aGlzLmRyb3Bkb3ducz1bXTt0aGlzLmJyYWNrZXREaXZzPVtudWxsLG51bGxdO3RoaXMuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkPVtdO3RoaXMucmFuaz10aGlzLnNoYXBlLmxlbmd0aDtpZigzPnRoaXMucmFuayl0aHJvdyBFcnJvcigiRGltZW5zaW9uIGNvbnRyb2wgaXMgbm90IGFwcGxpY2FibGUgdG8gdGVuc29yIHNoYXBlcyBsZXNzIHRoYW4gM0Q6IHJlY2VpdmVkICIrCih0aGlzLnJhbmsrIkQgdGVuc29yIHNoYXBlOiAiKSsoSlNPTi5zdHJpbmdpZnkodGhpcy5zaGFwZSkrIi4iKSk7dGhpcy5jcmVhdGVDb21wb25lbnRzKCk7dGhpcy5zbGljaW5nU3BlYz1wKE0pfUgucHJvdG90eXBlLmNyZWF0ZUNvbXBvbmVudHM9ZnVuY3Rpb24oKXtmb3IodmFyIEs9dGhpczt0aGlzLnJvb3REaXYuZmlyc3RDaGlsZDspdGhpcy5yb290RGl2LnJlbW92ZUNoaWxkKHRoaXMucm9vdERpdi5maXJzdENoaWxkKTt0aGlzLmRpbUNvbnRyb2xzPVtdO3RoaXMuZGltSW5wdXRzPVtdO3RoaXMuY29tbWFzPVtdO3RoaXMuZHJvcGRvd25zPVtdO3RoaXMuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkPVtdO3RoaXMuYnJhY2tldERpdnNbMF09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5icmFja2V0RGl2c1swXS50ZXh0Q29udGVudD0iU2xpY2luZzogWyI7dGhpcy5icmFja2V0RGl2c1swXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyIpOwp0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQodGhpcy5icmFja2V0RGl2c1swXSk7Zm9yKHZhciBNPTA7TTx0aGlzLnJhbms7KytNKXt2YXIgTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtMLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7TC50aXRsZT0iRGltZW5zaW9uICIrTSsiOiBzaXplXHgzZCIrdGhpcy5zaGFwZVtNXTt0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQoTCk7dGhpcy5kaW1Db250cm9scy5wdXNoKEwpO3RoaXMuZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkLnB1c2goITEpO0w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtMLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7TC5zdHlsZS5kaXNwbGF5PSJub25lIjt0aGlzLnJvb3REaXYuYXBwZW5kQ2hpbGQoTCk7dGhpcy5kaW1JbnB1dHMucHVzaChMKTtNPHRoaXMucmFuay0xJiYoTD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxMLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWNvbW1hIiksCkwudGV4dENvbnRlbnQ9IiwiLHRoaXMucm9vdERpdi5hcHBlbmRDaGlsZChMKSx0aGlzLmNvbW1hcy5wdXNoKEwpKTtMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0wuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24iKTtMLnN0eWxlLmRpc3BsYXk9Im5vbmUiO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZChMKTt0aGlzLmRyb3Bkb3ducy5wdXNoKEwpfXRoaXMuYnJhY2tldERpdnNbMV09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dGhpcy5icmFja2V0RGl2c1sxXS50ZXh0Q29udGVudD0iXSI7dGhpcy5icmFja2V0RGl2c1sxXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1icmFja2V0cyIpO3RoaXMucm9vdERpdi5hcHBlbmRDaGlsZCh0aGlzLmJyYWNrZXREaXZzWzFdKTt0aGlzLnJvb3REaXYuYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtLLmNsZWFyQWxsRHJvcGRvd25zKCl9KX07SC5wcm90b3R5cGUucmVuZGVyPQpmdW5jdGlvbihLKXtmdW5jdGlvbiBNKGFhKXt2YXIgbGE9WC5kaW1Db250cm9sc1thYV0sWj1YLmRpbUlucHV0c1thYV0sYmE9WC5kcm9wZG93bnNbYWFdO2lmKCJub25lIiE9PVouc3R5bGUuZGlzcGxheSlyZXR1cm4iY29udGludWUiO3ZhciBlYT1YLnNoYXBlW2FhXTtpZigtMSE9PVEuaW5kZXhPZihhYSkpe3ZhciBjYT1UW1EuaW5kZXhPZihhYSldO2xhLnRleHRDb250ZW50PVN0cmluZyhjYSk7Wi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbSIpO1oudHlwZT0ibnVtYmVyIjtaLm1pbj0iMCI7Wi5tYXg9U3RyaW5nKGVhLTEpO1oudmFsdWU9U3RyaW5nKGNhKTtYLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFthYV18fChsYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtMLmNsZWFyQWxsRHJvcGRvd25zKCk7bGEuc3R5bGUuZGlzcGxheT0ibm9uZSI7Wi5zdHlsZS5kaXNwbGF5PSJpbmxpbmUtYmxvY2sifSksWi5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLApmdW5jdGlvbigpe2lmKG51bGw9PT1MLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJTbGljaW5nIGNvbnRyb2wgY2hhbmdlIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBzcGVjLiIpO3ZhciBrYT1wYXJzZUludChaLnZhbHVlLDEwKTshaXNGaW5pdGUoa2EpfHwwPmthfHxrYT49ZWF8fE1hdGguZmxvb3IoZWEpIT1lYT9aLnZhbHVlPVN0cmluZyhMLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tRLmluZGV4T2YoYWEpXS5pbmRleCk6KEwuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzW1EuaW5kZXhPZihhYSldLmluZGV4PWthLGxhLnRleHRDb250ZW50PVN0cmluZyhrYSksTC5vblNsaWNpbmdTcGVjQ2hhbmdlKEwuc2xpY2luZ1NwZWMpKX0pLFouYWRkRXZlbnRMaXN0ZW5lcigiYmx1ciIsZnVuY3Rpb24oKXtaLnN0eWxlLmRpc3BsYXk9Im5vbmUiO2xhLnN0eWxlLmRpc3BsYXk9ImlubGluZS1ibG9jayJ9KSxYLmRpbUNvbnRyb2xzTGlzdGVuZXJBdHRhY2hlZFthYV09CiEwKX1lbHNle2lmKFguc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF09PT1hYSl7aWYobnVsbD09PVguc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyB2ZXJ0aWNhbCByYW5nZS4iKTtsYS50ZXh0Q29udGVudD0iXHUyMTk1ICIrWC5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdKyI6IitYLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV19ZWxzZXtpZihudWxsPT09WC5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZS4iKTtsYS50ZXh0Q29udGVudD0iXHUyMTk0ICIrWC5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0rIjoiK1guc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdfWxhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltIik7WC5kaW1Db250cm9sc0xpc3RlbmVyQXR0YWNoZWRbYWFdfHwobGEuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGthPQpsYS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtMLnJlbmRlckRyb3Bkb3duTWVudUl0ZW1zKGJhLGthLmJvdHRvbSxrYS5sZWZ0LGFhKX0pLFguZGltQ29udHJvbHNMaXN0ZW5lckF0dGFjaGVkW2FhXT0hMCl9fXZhciBMPXRoaXM7bnVsbCE9SyYmKHRoaXMuc2xpY2luZ1NwZWM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShLKSkpO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJTbGljaW5nIGNvbnRyb2wgcmVuZGVyaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBzbGljaW5nIHNwZWMuIik7dmFyIFE9dGhpcy5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKGFhKXtyZXR1cm4gYWEuZGltfSksVD10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24oYWEpe3JldHVybiBhYS5pbmRleH0pLFg9dGhpcztmb3IoSz0wO0s8dGhpcy5yYW5rOysrSylNKEspfTtILnByb3RvdHlwZS5yZW5kZXJEcm9wZG93bk1lbnVJdGVtcz0KZnVuY3Rpb24oSyxNLEwsUSl7ZnVuY3Rpb24gVChlYSl7aWYoLTE9PT1hYS5pbmRleE9mKGVhKXx8UT09PWxhLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdJiZlYTw9bGEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF18fFE9PWxhLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdJiZlYT49bGEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV0pcmV0dXJuImNvbnRpbnVlIjt2YXIgY2E9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Y2EuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtIik7Y2EudGV4dENvbnRlbnQ9IlN3YXAgd2l0aCBkaW1lbnNpb24gIitlYTtLLmFwcGVuZENoaWxkKGNhKTtjYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbigpe2NhLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtZGltLWRyb3Bkb3duLW1lbnUtaXRlbS1hY3RpdmUiKTtYLmRpbUNvbnRyb2xzW2VhXS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWRpbS1oaWdobGlnaHRlZCIpfSk7CmNhLmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlbGVhdmUiLGZ1bmN0aW9uKCl7Y2EuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC1kaW0tZHJvcGRvd24tbWVudS1pdGVtLWFjdGl2ZSIpO1guZGltQ29udHJvbHNbZWFdLmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtZGltLWhpZ2hsaWdodGVkIil9KTt2YXIga2E9bGEuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF09PT1RO2NhLmFkZEV2ZW50TGlzdGVuZXIoImNsaWNrIixmdW5jdGlvbigpe2lmKG51bGw9PT1YLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJEaW1lbnNpb24gc3dhcHBpbmcgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIHNsaWNpbmcgc3BlYyIpO3ZhciBZPWFhLmluZGV4T2YoZWEpO1guc2xpY2luZ1NwZWMudmlld2luZ0RpbXNba2E/MDoxXT1lYTtYLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlc1tZXT17ZGltOlEsaW5kZXg6MH07WC5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlPW51bGw7WC5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2U9Cm51bGw7aWYoWC5vblNsaWNpbmdTcGVjQ2hhbmdlKVgub25TbGljaW5nU3BlY0NoYW5nZShYLnNsaWNpbmdTcGVjKX0pfXZhciBYPXRoaXM7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMpdGhyb3cgRXJyb3IoIlNsaWNpbmcgY29udHJvbCBjYW5ub3QgcmVuZGVyIGRyb3Bkb3duIG1lbnUgaXRlbXMgZHVlIHRvIG1pc3Npbmcgc2xpY2luZyBzcGVjLiIpO3RoaXMuY2xlYXJBbGxEcm9wZG93bnMoKTtmb3IodmFyIGFhPXRoaXMuc2xpY2luZ1NwZWMuc2xpY2luZ0RpbXNBbmRJbmRpY2VzLm1hcChmdW5jdGlvbihlYSl7cmV0dXJuIGVhLmRpbX0pLGxhPXRoaXMsWj0wO1o8dGhpcy5yYW5rOysrWilUKFopO0suYWRkRXZlbnRMaXN0ZW5lcigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtLLnN0eWxlLmRpc3BsYXk9Im5vbmUifSk7aWYoSy5maXJzdENoaWxkKXtLLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCI7Sy5zdHlsZS50b3A9TSsicHgiO0suc3R5bGUubGVmdD1MKyJweCI7Sy5zdHlsZS5kaXNwbGF5PQoiYmxvY2siO1o9Sy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt2YXIgYmE9Wi5sZWZ0LUw7Sy5zdHlsZS50b3A9KE0tKFoudG9wLU0pKS50b0ZpeGVkKDEpKyJweCI7Sy5zdHlsZS5sZWZ0PShMLWJhKS50b0ZpeGVkKDEpKyJweCJ9fTtILnByb3RvdHlwZS5zZXRTbGljaW5nU3BlYz1mdW5jdGlvbihLKXt0aGlzLnNsaWNpbmdTcGVjPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoSykpO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjKXRocm93IEVycm9yKCJDYW5ub3Qgc2V0IHNsaWNpbmcgc3BlYyB0byBudWxsLiIpO3RoaXMucmVuZGVyKHRoaXMuc2xpY2luZ1NwZWMpfTtILnByb3RvdHlwZS5jbGVhckFsbERyb3Bkb3ducz1mdW5jdGlvbigpe3RoaXMuZHJvcGRvd25zLmZvckVhY2goZnVuY3Rpb24oSyl7aWYobnVsbCE9Syl7Zm9yKDtLLmZpcnN0Q2hpbGQ7KUsucmVtb3ZlQ2hpbGQoSy5maXJzdENoaWxkKTtLLnN0eWxlLmRpc3BsYXk9Im5vbmUifX0pfTtyZXR1cm4gSH0oKSxEPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSChLKXt0aGlzLmNvbmZpZz0KSztpZighaXNGaW5pdGUoSy5taW4pKXRocm93IEVycm9yKCJtaW4gdmFsdWUgKCIrSy5taW4rIikgaXMgbm90IGZpbml0ZSIpO2lmKCFpc0Zpbml0ZShLLm1heCkpdGhyb3cgRXJyb3IoIm1heCB2YWx1ZSAoIitLLm1heCsiKSBpcyBub3QgZmluaXRlIik7aWYoSy5tYXg8Sy5taW4pdGhyb3cgRXJyb3IoIm1heCAoIitLLm1heCsiKSBpcyBceDNjIG1pbiAoIitLLm1pbisiKSIpO31ILnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oSyxNKXtpZih0aGlzLmNvbmZpZy5taW4hPT10aGlzLmNvbmZpZy5tYXgpe3ZhciBMPUsuZ2V0Q29udGV4dCgiMmQiKTtpZihudWxsIT1MKXtmb3IodmFyIFE9Sy53aWR0aC8xMDAsVD1LLmhlaWdodCxYPS42KlQsYWE9MDsxMDA+YWE7KythYSl7dmFyIGxhPVEqYWEsWj0uMipULGJhPVlpKHRoaXMuZ2V0UkdCKGFhLzEwMCoodGhpcy5jb25maWcubWF4LXRoaXMuY29uZmlnLm1pbikrdGhpcy5jb25maWcubWluKSwzKSxlYT1iYVswXSxjYT1iYVsxXTtiYT1iYVsyXTsKTC5iZWdpblBhdGgoKTtMLmZpbGxTdHlsZT0icmdiYSgiK2VhKyIsICIrY2ErIiwgIitiYSsiLCAxKSI7TC5maWxsUmVjdChsYSxaLFEsWCk7TC5zdHJva2UoKX1udWxsIT1NJiZNPj10aGlzLmNvbmZpZy5taW4mJk08PXRoaXMuY29uZmlnLm1heCYmKEs9KE0tdGhpcy5jb25maWcubWluKS8odGhpcy5jb25maWcubWF4LXRoaXMuY29uZmlnLm1pbikqSy53aWR0aCxMLmJlZ2luUGF0aCgpLEwuZmlsbFN0eWxlPSJyZ2JhKDAsIDAsIDAsIDEpIixMLm1vdmVUbyhLLC4yKlQpLEwubGluZVRvKEstNCwwKSxMLmxpbmVUbyhLKzQsMCksTC5maWxsKCksTC5iZWdpblBhdGgoKSxMLm1vdmVUbyhLLC44KlQpLEwubGluZVRvKEstNCxUKSxMLmxpbmVUbyhLKzQsVCksTC5maWxsKCkpfX19O3JldHVybiBIfSgpLEI9ZnVuY3Rpb24oSCl7ZnVuY3Rpb24gSygpe3JldHVybiBudWxsIT09SCYmSC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9V2koSyxIKTtLLnByb3RvdHlwZS5nZXRSR0I9ZnVuY3Rpb24oTSl7aWYoaXNOYU4oTSkpcmV0dXJuWzI1NSwKMCwwXTtpZighaXNGaW5pdGUoTSkpcmV0dXJuIDA8TT9bMCwwLDI1NV06WzI1NSwxMjcuNSwwXTtNPXRoaXMuY29uZmlnLm1pbj09PXRoaXMuY29uZmlnLm1heD8uNTooTS10aGlzLmNvbmZpZy5taW4pLyh0aGlzLmNvbmZpZy5tYXgtdGhpcy5jb25maWcubWluKTtNPU1hdGgubWF4KE1hdGgubWluKE0sMSksMCk7cmV0dXJuWzI1NSpNLDI1NSpNLDI1NSpNXX07cmV0dXJuIEt9KEQpO0Q9ZnVuY3Rpb24oSCl7ZnVuY3Rpb24gSygpe3JldHVybiBudWxsIT09SCYmSC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXN9V2koSyxIKTtLLnByb3RvdHlwZS5nZXRSR0I9ZnVuY3Rpb24oTSl7aWYoaXNOYU4oTSkpcmV0dXJuWzYzLjc1LDYzLjc1LDYzLjc1XTtpZighaXNGaW5pdGUoTSkpcmV0dXJuIDA+TT9bMTI3LjUsMTI3LjUsMTI3LjVdOlsxOTEuMjUsMTkxLjI1LDE5MS4yNV07dmFyIEw9MCxRPTAsVD0wO009dGhpcy5jb25maWcubWluPT09dGhpcy5jb25maWcubWF4Py41OihNLXRoaXMuY29uZmlnLm1pbikvCih0aGlzLmNvbmZpZy5tYXgtdGhpcy5jb25maWcubWluKTtNPU1hdGgubWF4KE1hdGgubWluKE0sMSksMCk7LjM1Pj1NPyhRPU0vLjM1LFQ9MSk6LjM1PE0mJi42NT49TT8oTD0oTS0uMzUpLyguNjUtLjM1KSxRPTEsVD0oLjY1LU0pLyguNjUtLjM1KSk6LjY1PE0mJihMPTEsUT0oMS1NKS8uMzUpO3JldHVyblsyNTUqTCwyNTUqUSwyNTUqVF19O3JldHVybiBLfShEKTt2YXIgSTsoZnVuY3Rpb24oSCl7SFtILlRFWFQ9MV09IlRFWFQiO0hbSC5JTUFHRT0yXT0iSU1BR0UifSkoSXx8KEk9e30pKTt2YXIgTj17R3JheXNjYWxlOkIsSmV0OkR9LE89ZnVuY3Rpb24oKXtmdW5jdGlvbiBIKEssTSxMKXt0aGlzLnJvb3RFbGVtZW50PUs7dGhpcy50ZW5zb3JWaWV3PU07dGhpcy5iYXNlUnVsZXJUaWNrPXRoaXMudG9wUnVsZXI9dGhpcy52YWx1ZVNlY3Rpb249dGhpcy5zbGljaW5nU3BlY1Jvb3Q9dGhpcy5tZW51VGh1bWI9dGhpcy5pbmZvU3Vic2VjdGlvbj10aGlzLmhlYWRlclNlY3Rpb249bnVsbDsKdGhpcy50b3BSdWxlclRpY2tzPVtdO3RoaXMubGVmdFJ1bGVyVGlja3M9W107dGhpcy52YWx1ZVJvd3M9W107dGhpcy52YWx1ZURpdnM9W107dGhpcy5zbGljaW5nQ29udHJvbD10aGlzLnZhbHVlVG9vbHRpcD1udWxsO3RoaXMuY29sc0N1dG9mZj10aGlzLnJvd3NDdXRvZmY9ITE7dGhpcy5tZW51PXRoaXMubWVudUNvbmZpZz10aGlzLnNlbGVjdGlvbj1udWxsO3RoaXMuY29sb3JNYXBOYW1lPSJHcmF5c2NhbGUiO3RoaXMuY29sb3JNYXA9bnVsbDt0aGlzLnNob3dJbmRpY2VzT25UaWNrcz0hMTt0aGlzLmltYWdlQ2VsbFNpemU9MTY7dGhpcy5taW5JbWFnZUNlbGxTaXplPTQ7dGhpcy5tYXhJbWFnZUNlbGxTaXplPTQwO3RoaXMuem9vbVN0ZXBSYXRpbz0xLjI7dGhpcy5udW1lcmljU3VtbWFyeT1udWxsO3RoaXMub3B0aW9ucz1MfHx7fTt0aGlzLnNsaWNpbmdTcGVjPXAodGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGUpO3RoaXMucmFuaz10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZS5sZW5ndGg7CnRoaXMudmFsdWVSZW5kZXJNb2RlPUkuVEVYVH1ILnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYih0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gWGkodGhpcyxmdW5jdGlvbihLKXtzd2l0Y2goSy5sYWJlbCl7Y2FzZSAwOnRoaXMucm9vdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldCIpO3RoaXMucmVuZGVySGVhZGVyKCk7aWYoIShkKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKXx8Zih0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fGgodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxrKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKSkpdGhyb3cgRXJyb3IoIlJlbmRlcmluZyBkdHlwZSAiK3RoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKyIgaXMgbm90IHN1cHBvcnRlZCB5ZXQuIik7cmV0dXJuWzQsdGhpcy5yZW5kZXJWYWx1ZXMoKV07Y2FzZSAxOnJldHVybiBLLnNlbnQoKSxbMl19fSl9KX07SC5wcm90b3R5cGUucmVuZGVySGVhZGVyPQpmdW5jdGlvbigpe251bGw9PXRoaXMuaGVhZGVyU2VjdGlvbiYmKHRoaXMuaGVhZGVyU2VjdGlvbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLmhlYWRlclNlY3Rpb24uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1oZWFkZXIiKSx0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuaGVhZGVyU2VjdGlvbiksdGhpcy5jcmVhdGVNZW51KCkpO3RoaXMucmVuZGVySW5mbygpfTtILnByb3RvdHlwZS5yZW5kZXJJbmZvPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMuaGVhZGVyU2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBpbmZvIGZhaWxlZCBkdWUgdG8gbWlzaW5nIGhlYWRlciBzZWN0aW9uIik7bnVsbD09dGhpcy5pbmZvU3Vic2VjdGlvbiYmKHRoaXMuaW5mb1N1YnNlY3Rpb249ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy5pbmZvU3Vic2VjdGlvbi5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWluZm8iKSwKdGhpcy5oZWFkZXJTZWN0aW9uLmFwcGVuZENoaWxkKHRoaXMuaW5mb1N1YnNlY3Rpb24pKTtmb3IoO3RoaXMuaW5mb1N1YnNlY3Rpb24uZmlyc3RDaGlsZDspdGhpcy5pbmZvU3Vic2VjdGlvbi5yZW1vdmVDaGlsZCh0aGlzLmluZm9TdWJzZWN0aW9uLmZpcnN0Q2hpbGQpO3RoaXMucmVuZGVyTmFtZSgpO3RoaXMucmVuZGVyRFR5cGUoKTt0aGlzLnJlbmRlclNoYXBlKCl9O0gucHJvdG90eXBlLnJlbmRlck5hbWU9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLmluZm9TdWJzZWN0aW9uKXRocm93IEVycm9yKCJSZW5kZXJpbmcgdGVuc29yIG5hbWUgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGluZm8gc3Vic2VjdGlvbi4iKTtpZihudWxsIT10aGlzLm9wdGlvbnMubmFtZSYmMCE9PXRoaXMub3B0aW9ucy5uYW1lLmxlbmd0aCl7dmFyIEs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Sy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRlbnNvci1uYW1lIik7Sy50ZXh0Q29udGVudD0Kbih0aGlzLm9wdGlvbnMubmFtZSk7Sy50aXRsZT10aGlzLm9wdGlvbnMubmFtZTt0aGlzLmluZm9TdWJzZWN0aW9uLmFwcGVuZENoaWxkKEspfX07SC5wcm90b3R5cGUucmVuZGVyRFR5cGU9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLmluZm9TdWJzZWN0aW9uKXRocm93IEVycm9yKCJSZW5kZXJpbmcgdGVuc29yIGR0eXBlIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBpbmZvIHN1YnNlY3Rpb24uIik7dmFyIEs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7Sy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LWR0eXBlIik7dmFyIE09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1kdHlwZS1sYWJlbCIpO00udGV4dENvbnRlbnQ9ImR0eXBlOiI7Sy5hcHBlbmRDaGlsZChNKTtNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTtNLnRleHRDb250ZW50PXRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlO0suYXBwZW5kQ2hpbGQoTSk7CnRoaXMuaW5mb1N1YnNlY3Rpb24uYXBwZW5kQ2hpbGQoSyl9O0gucHJvdG90eXBlLnJlbmRlclNoYXBlPWZ1bmN0aW9uKCl7aWYobnVsbD09dGhpcy5pbmZvU3Vic2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIHRlbnNvciBzaGFwZSBmYWlsZWQgZHVlIHRvIG1pc3NpbmcgaW5mbyBzdWJzZWN0aW9uLiIpO3ZhciBLPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO0suY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZSIpO3ZhciBNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZS1sYWJlbCIpO00udGV4dENvbnRlbnQ9InNoYXBlOiI7Sy5hcHBlbmRDaGlsZChNKTtNPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO00uY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC1zaGFwZS12YWx1ZSIpO00udGV4dENvbnRlbnQ9bCh0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZSk7Sy5hcHBlbmRDaGlsZChNKTsKdGhpcy5pbmZvU3Vic2VjdGlvbi5hcHBlbmRDaGlsZChLKX07SC5wcm90b3R5cGUuY3JlYXRlTWVudT1mdW5jdGlvbigpe3ZhciBLPXRoaXM7dGhpcy5tZW51Q29uZmlnPXtpdGVtczpbXX07aWYoZih0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSl8fGQodGhpcy50ZW5zb3JWaWV3LnNwZWMuZHR5cGUpfHxoKHRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlKSl0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiU2VsZWN0IGRpc3BsYXkgbW9kZS4uLiIsb3B0aW9uczpbIlRleHQiLCJJbWFnZSJdLGRlZmF1bHRTZWxlY3Rpb246MCxjYWxsYmFjazpmdW5jdGlvbihNKXswPT09TT8oSy52YWx1ZVJlbmRlck1vZGU9SS5URVhULEsucmVuZGVyVmFsdWVzKCkpOihLLnZhbHVlUmVuZGVyTW9kZT1JLklNQUdFLEsudGVuc29yVmlldy5nZXROdW1lcmljU3VtbWFyeSgpLnRoZW4oZnVuY3Rpb24oTCl7Sy5udW1lcmljU3VtbWFyeT1MO0sucmVuZGVyVmFsdWVzKCl9KSl9fSksdGhpcy5tZW51Q29uZmlnLml0ZW1zLnB1c2goe2NhcHRpb246IlNlbGVjdCBjb2xvciBtYXAuLi4iLApvcHRpb25zOk9iamVjdC5rZXlzKE4pLGRlZmF1bHRTZWxlY3Rpb246MCxjYWxsYmFjazpmdW5jdGlvbihNKXtLLmNvbG9yTWFwTmFtZT1PYmplY3Qua2V5cyhOKVtNXTtLLnJlbmRlclZhbHVlcygpfSxpc0VuYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4gSy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFfX0pLHRoaXMubWVudUNvbmZpZy5pdGVtcy5wdXNoKHtjYXB0aW9uOiJab29tIGluIChJbWFnZSBtb2RlKSIsY2FsbGJhY2s6ZnVuY3Rpb24oKXtLLnpvb21Jbk9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIEsudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRX19KSx0aGlzLm1lbnVDb25maWcuaXRlbXMucHVzaCh7Y2FwdGlvbjoiWm9vbSBvdXQgKEltYWdlIG1vZGUpIixjYWxsYmFjazpmdW5jdGlvbigpe0suem9vbU91dE9uZVN0ZXBBbmRSZW5kZXJWYWx1ZXMoKX0saXNFbmFibGVkOmZ1bmN0aW9uKCl7cmV0dXJuIEsudmFsdWVSZW5kZXJNb2RlPT09CkkuSU1BR0V9fSk7bnVsbCE9PXRoaXMubWVudUNvbmZpZyYmMDx0aGlzLm1lbnVDb25maWcuaXRlbXMubGVuZ3RoJiYodGhpcy5tZW51PW5ldyB5KHRoaXMubWVudUNvbmZpZyx0aGlzLmhlYWRlclNlY3Rpb24pLHRoaXMucmVuZGVyTWVudVRodW1iKCkpfTtILnByb3RvdHlwZS56b29tSW5PbmVTdGVwQW5kUmVuZGVyVmFsdWVzPWZ1bmN0aW9uKCl7dGhpcy5pbWFnZUNlbGxTaXplKnRoaXMuem9vbVN0ZXBSYXRpbzw9dGhpcy5tYXhJbWFnZUNlbGxTaXplJiYodGhpcy5pbWFnZUNlbGxTaXplKj10aGlzLnpvb21TdGVwUmF0aW8sdGhpcy5yZW5kZXJWYWx1ZXMoKSl9O0gucHJvdG90eXBlLnpvb21PdXRPbmVTdGVwQW5kUmVuZGVyVmFsdWVzPWZ1bmN0aW9uKCl7dGhpcy5pbWFnZUNlbGxTaXplL3RoaXMuem9vbVN0ZXBSYXRpbz49dGhpcy5taW5JbWFnZUNlbGxTaXplJiYodGhpcy5pbWFnZUNlbGxTaXplLz10aGlzLnpvb21TdGVwUmF0aW8sdGhpcy5yZW5kZXJWYWx1ZXMoKSl9O0gucHJvdG90eXBlLnJlbmRlck1lbnVUaHVtYj0KZnVuY3Rpb24oKXt2YXIgSz10aGlzO2lmKG51bGw9PXRoaXMuaGVhZGVyU2VjdGlvbil0aHJvdyBFcnJvcigiUmVuZGVyaW5nIG1lbnUgdGh1bWIgZmFpbGVkIGR1ZSB0byBtaXNzaW5nIGhlYWRlciBzZWN0aW9uLiIpO3RoaXMubWVudVRodW1iPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMubWVudVRodW1iLnRleHRDb250ZW50PSJcdTIyZWUiO3RoaXMubWVudVRodW1iLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtbWVudS10aHVtYiIpO3RoaXMuaGVhZGVyU2VjdGlvbi5hcHBlbmRDaGlsZCh0aGlzLm1lbnVUaHVtYik7dGhpcy5tZW51VGh1bWIuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLGZ1bmN0aW9uKCl7aWYobnVsbCE9PUsubWVudSlpZihLLm1lbnUuc2hvd24oKSlLLm1lbnUuaGlkZSgpO2Vsc2V7dmFyIE09Sy5tZW51VGh1bWIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Sy5tZW51LnNob3coTS5ib3R0b20sTS5sZWZ0KX19KX07SC5wcm90b3R5cGUucmVuZGVyVmFsdWVzPQpmdW5jdGlvbigpe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBLPXRoaXM7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oTSl7c3dpdGNoKE0ubGFiZWwpe2Nhc2UgMDpyZXR1cm4gMjx0aGlzLnJhbmsmJm51bGw9PT10aGlzLnNsaWNpbmdTcGVjUm9vdCYmKHRoaXMuc2xpY2luZ1NwZWNSb290PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMuc2xpY2luZ1NwZWNSb290LmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtc2xpY2luZy1ncm91cCIpLHRoaXMucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5zbGljaW5nU3BlY1Jvb3QpKSxudWxsPT10aGlzLnZhbHVlU2VjdGlvbiYmKHRoaXMudmFsdWVTZWN0aW9uPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLHRoaXMudmFsdWVTZWN0aW9uLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtc2VjdGlvbiIpLHRoaXMucm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy52YWx1ZVNlY3Rpb24pLAp0aGlzLnZhbHVlU2VjdGlvbi5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsZnVuY3Rpb24oTCl7cmV0dXJuIGIoSyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIFE7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oVCl7c3dpdGNoKFQubGFiZWwpe2Nhc2UgMDpRPSExO251bGw9PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXl8fCJjdHJsIj09PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXk/UT1MLmN0cmxLZXk6ImFsdCI9PT10aGlzLm9wdGlvbnMud2hlZWxab29tS2V5P1E9TC5hbHRLZXk6InNoaWZ0Ij09PXRoaXMub3B0aW9ucy53aGVlbFpvb21LZXkmJihRPUwuc2hpZnRLZXkpO2lmKFEmJnRoaXMudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRSlyZXR1cm4gTC5zdG9wUHJvcGFnYXRpb24oKSxMLnByZXZlbnREZWZhdWx0KCksMDxMLmRlbHRhWT90aGlzLnpvb21PdXRPbmVTdGVwQW5kUmVuZGVyVmFsdWVzKCk6dGhpcy56b29tSW5PbmVTdGVwQW5kUmVuZGVyVmFsdWVzKCksWzJdO2lmKG51bGw9PQp0aGlzLnNlbGVjdGlvbilyZXR1cm5bMl07TC5zdG9wUHJvcGFnYXRpb24oKTtMLnByZXZlbnREZWZhdWx0KCk7dGhpcy5oaWRlVmFsdWVUb29sdGlwKCk7cmV0dXJuWzQsdGhpcy5zY3JvbGxVcE9yRG93bigwPEwuZGVsdGFZP3cuRE9XTjp3LlVQKV07Y2FzZSAxOnJldHVybiBULnNlbnQoKSxbMl19fSl9KX0pLHRoaXMudmFsdWVTZWN0aW9uLnRhYkluZGV4PTEwMjQsdGhpcy52YWx1ZVNlY3Rpb24uYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsZnVuY3Rpb24oTCl7dmFyIFE9WzM4LDQwLDM3LDM5XTtpZihudWxsIT1LLnNlbGVjdGlvbiYmLTEhPT1RLmluZGV4T2YoTC5rZXlDb2RlKSl7TC5zdG9wUHJvcGFnYXRpb24oKTtMLnByZXZlbnREZWZhdWx0KCk7Sy5oaWRlVmFsdWVUb29sdGlwKCk7dmFyIFQ9UT1udWxsOzM4PT09TC5rZXlDb2RlP1Q9dy5VUDo0MD09PUwua2V5Q29kZT9UPXcuRE9XTjozNz09PUwua2V5Q29kZT9UPXcuTEVGVDozOT09PUwua2V5Q29kZSYmKFQ9dy5SSUdIVCk7Cm51bGwhPT1UJiYoUT1LLnNlbGVjdGlvbi5tb3ZlKFQsSy5zbGljaW5nU3BlYykpO251bGw9PT1RP0sucmVuZGVyU2VsZWN0aW9uKCk6UT09PXcuVVB8fFE9PT13LkRPV04/Sy5zY3JvbGxVcE9yRG93bihRKTooUT09PXcuTEVGVHx8UT09PXcuUklHSFQpJiZLLnNjcm9sbExlZnRPclJpZ2h0KFEpfX0pKSx0aGlzLmNsZWFyVmFsdWVTZWN0aW9uKCksdGhpcy5jcmVhdGVUb3BSdWxlcigpLHRoaXMuY3JlYXRlTGVmdFJ1bGVyKCksdGhpcy5jcmVhdGVWYWx1ZURpdnMoKSxbNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTtjYXNlIDE6cmV0dXJuIE0uc2VudCgpLDI8dGhpcy5yYW5rJiYodGhpcy5zbGljaW5nQ29udHJvbD1uZXcgRyh0aGlzLnNsaWNpbmdTcGVjUm9vdCx0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZSxmdW5jdGlvbihMKXtyZXR1cm4gYihLLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24oKXtyZXR1cm4gWGkodGhpcyxmdW5jdGlvbihRKXtzd2l0Y2goUS5sYWJlbCl7Y2FzZSAwOmlmKG0odGhpcy5zbGljaW5nU3BlYywKTCkpcmV0dXJuWzMsMl07dGhpcy5zbGljaW5nU3BlYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEwpKTtyZXR1cm5bNCx0aGlzLnJlbmRlcigpXTtjYXNlIDE6cmV0dXJuIFEuc2VudCgpLFszLDRdO2Nhc2UgMjpyZXR1cm4gdGhpcy5zbGljaW5nU3BlYz1KU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KEwpKSxbNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTtjYXNlIDM6US5zZW50KCksUS5sYWJlbD00O2Nhc2UgNDpyZXR1cm5bMl19fSl9KX0pLHRoaXMuc2xpY2luZ0NvbnRyb2wucmVuZGVyKHRoaXMuc2xpY2luZ1NwZWMpKSxbMl19fSl9KX07SC5wcm90b3R5cGUuY2xlYXJWYWx1ZVNlY3Rpb249ZnVuY3Rpb24oKXtpZihudWxsIT09dGhpcy52YWx1ZVNlY3Rpb24pe2Zvcig7dGhpcy52YWx1ZVNlY3Rpb24uZmlyc3RDaGlsZDspdGhpcy52YWx1ZVNlY3Rpb24ucmVtb3ZlQ2hpbGQodGhpcy52YWx1ZVNlY3Rpb24uZmlyc3RDaGlsZCk7dGhpcy50b3BSdWxlcj1udWxsOwp0aGlzLnZhbHVlUm93cz1bXX19O0gucHJvdG90eXBlLmNyZWF0ZVRvcFJ1bGVyPWZ1bmN0aW9uKCl7dmFyIEs9dGhpcztpZihudWxsPT09dGhpcy52YWx1ZVNlY3Rpb24pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjcmVhdGUgdG9wIHJ1bGVyIGR1ZSB0byBtaXNzaW5nIHZhbHVlIHNlY3Rpb24uIik7bnVsbD09dGhpcy50b3BSdWxlciYmKHRoaXMudG9wUnVsZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy50b3BSdWxlci5jbGFzc0xpc3QuYWRkKCJ0ZW5lc29yLXdpZGdldC10b3AtcnVsZXIiKSx0aGlzLnRvcFJ1bGVyLnN0eWxlLndoaXRlU3BhY2U9Im5vd3JhcCIsdGhpcy52YWx1ZVNlY3Rpb24uYXBwZW5kQ2hpbGQodGhpcy50b3BSdWxlciksdGhpcy50b3BSdWxlclRpY2tzPVtdLHRoaXMudG9wUnVsZXIuYWRkRXZlbnRMaXN0ZW5lcigid2hlZWwiLGZ1bmN0aW9uKFgpe3JldHVybiBiKEssdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKGFhKXtzd2l0Y2goYWEubGFiZWwpe2Nhc2UgMDppZihudWxsPT0KdGhpcy5zZWxlY3Rpb24pcmV0dXJuWzJdO1guc3RvcFByb3BhZ2F0aW9uKCk7WC5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuaGlkZVZhbHVlVG9vbHRpcCgpO3JldHVybls0LHRoaXMuc2Nyb2xsTGVmdE9yUmlnaHQoMDxYLmRlbHRhWT93LlJJR0hUOncuTEVGVCldO2Nhc2UgMTpyZXR1cm4gYWEuc2VudCgpLFsyXX19KX0pfSkpO2Zvcig7dGhpcy50b3BSdWxlci5maXJzdENoaWxkOyl0aGlzLnRvcFJ1bGVyLnJlbW92ZUNoaWxkKHRoaXMudG9wUnVsZXIuZmlyc3RDaGlsZCk7dGhpcy5iYXNlUnVsZXJUaWNrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3RoaXMuYmFzZVJ1bGVyVGljay5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRvcC1ydWxlci10aWNrIik7dGhpcy50b3BSdWxlci5hcHBlbmRDaGlsZCh0aGlzLmJhc2VSdWxlclRpY2spOzI8PXRoaXMucmFuayYmKHRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlPVswLG51bGxdKTt2YXIgTT0xPj10aGlzLnJhbms/CjE6dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV07dmFyIEw9dGhpcy5yb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDt0aGlzLmNvbHNDdXRvZmY9ITE7Zm9yKHZhciBRPTA7UTxNOysrUSl7dmFyIFQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7VC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXRvcC1ydWxlci10aWNrIik7dGhpcy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFJiYoVC5zdHlsZS53aWR0aD10aGlzLmltYWdlQ2VsbFNpemUrInB4Iik7dGhpcy50b3BSdWxlci5hcHBlbmRDaGlsZChUKTt0aGlzLnRvcFJ1bGVyVGlja3MucHVzaChUKTtpZihULmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0Pj1MKXtpZigyPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyBob3Jpem9udGFsIHJhbmdlIGZvciAiKwp0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPVErMTt0aGlzLmNvbHNDdXRvZmY9ITB9YnJlYWt9fWlmKCF0aGlzLmNvbHNDdXRvZmYmJjI8PXRoaXMucmFuayl7aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIGhvcml6b250YWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT1NfX07SC5wcm90b3R5cGUuY3JlYXRlTGVmdFJ1bGVyPWZ1bmN0aW9uKCl7aWYobnVsbD09PXRoaXMudmFsdWVTZWN0aW9uKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY3JlYXRlIGxlZnQgcnVsZXIgZHVlIHRvIG1pc3NpbmcgdmFsdWUgc2VjdGlvbi4iKTt0aGlzLnZhbHVlUm93cz1bXTt0aGlzLmxlZnRSdWxlclRpY2tzPVtdOzE8PXRoaXMucmFuayYmKHRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZT0KWzAsbnVsbF0pO3ZhciBLPTA9PT10aGlzLnJhbms/MTp0aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTt0aGlzLnJvd3NDdXRvZmY9ITE7Zm9yKHZhciBNPXRoaXMucm9vdEVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tLEw9MDtMPEs7KytMKXt2YXIgUT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtRLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtcm93Iik7dGhpcy52YWx1ZVJlbmRlck1vZGU9PT1JLklNQUdFJiYoUS5zdHlsZS5oZWlnaHQ9dGhpcy5pbWFnZUNlbGxTaXplKyJweCIsUS5zdHlsZS5saW5lSGVpZ2h0PXRoaXMuaW1hZ2VDZWxsU2l6ZSsicHgiKTt0aGlzLnZhbHVlU2VjdGlvbi5hcHBlbmRDaGlsZChRKTt0aGlzLnZhbHVlUm93cy5wdXNoKFEpO3ZhciBUPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO1QuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC10b3AtcnVsZXItdGljayIpOwp0aGlzLnZhbHVlUmVuZGVyTW9kZT09PUkuSU1BR0UmJihULnN0eWxlLmhlaWdodD10aGlzLmltYWdlQ2VsbFNpemUrInB4IixULnN0eWxlLmxpbmVIZWlnaHQ9dGhpcy5pbWFnZUNlbGxTaXplKyJweCIpO1EuYXBwZW5kQ2hpbGQoVCk7dGhpcy5sZWZ0UnVsZXJUaWNrcy5wdXNoKFQpO2lmKFQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tPj1NKXtpZigxPD10aGlzLnJhbmspe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgdmVydGljYWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV09TCsxO3RoaXMucm93c0N1dG9mZj0hMH1icmVha319aWYoIXRoaXMucm93c0N1dG9mZiYmMTw9dGhpcy5yYW5rKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRpY2FsIHJhbmdlIGZvciAiKwp0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3RoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1LfX07SC5wcm90b3R5cGUuY3JlYXRlVmFsdWVEaXZzPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gSyhhYSl7ZnVuY3Rpb24gbGEoYmEpe3ZhciBlYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtlYS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdiIpO1QudmFsdWVSZW5kZXJNb2RlPT09SS5JTUFHRSYmKGVhLnN0eWxlLndpZHRoPVQuaW1hZ2VDZWxsU2l6ZSsicHgiLGVhLnN0eWxlLmhlaWdodD1ULmltYWdlQ2VsbFNpemUrInB4IixlYS5zdHlsZS5saW5lSGVpZ2h0PVQuaW1hZ2VDZWxsU2l6ZSsicHgiKTtULnZhbHVlUm93c1thYV0uYXBwZW5kQ2hpbGQoZWEpO1QudmFsdWVEaXZzW2FhXS5wdXNoKGVhKTtlYS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsZnVuY3Rpb24oKXtNLnNlbGVjdGlvbj1uZXcgQyhNLnRlbnNvclZpZXcuc3BlYy5zaGFwZSxNLnNsaWNpbmdTcGVjLApudWxsPT1NLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2V8fG51bGw9PU0uc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXT8wOk0uc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXSthYSxudWxsPT1NLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZXx8bnVsbD09TS5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMF0/MDpNLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXStiYSwxLDEpO00ucmVuZGVyU2VsZWN0aW9uKCl9KTtlYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWVudGVyIixmdW5jdGlvbigpe3ZhciBjYT1lYS5nZXRBdHRyaWJ1dGUoImRldGFpbGVkLXZhbHVlIik7aWYobnVsbCE9PWNhKXt2YXIga2E9TS5yb290RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxZPWVhLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLEVhPVkuYm90dG9tLVkudG9wLHZhPVkucmlnaHQtWS5sZWZ0LHhhPU0uY2FsY3VsYXRlSW5kaWNlcyhhYSxiYSk7TS5kcmF3VmFsdWVUb29sdGlwKHhhLApjYSxZLnRvcC1rYS50b3ArLjgqRWEsWS5sZWZ0LWthLmxlZnQrLjc1KnZhKX19KTtlYS5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWxlYXZlIixmdW5jdGlvbigpe00uaGlkZVZhbHVlVG9vbHRpcCgpfSl9VC52YWx1ZURpdnNbYWFdPVtdO2Zvcih2YXIgWj0wO1o8TDsrK1opbGEoWil9dmFyIE09dGhpcztpZihudWxsPT09dGhpcy52YWx1ZVJvd3MpdGhyb3cgRXJyb3IoIlZhbHVlIHJvd3MgYXJlIHVuZXhwZWN0ZWRseSB1bmluaXRpYWxpemVkLiIpO3RoaXMudmFsdWVEaXZzPVtdO2Zvcih2YXIgTD10aGlzLnRvcFJ1bGVyVGlja3MubGVuZ3RoLFE9dGhpcy52YWx1ZVJvd3MubGVuZ3RoLFQ9dGhpcyxYPTA7WDxROysrWClLKFgpfTtILnByb3RvdHlwZS5yZW5kZXJUb3BSdWxlcj1mdW5jdGlvbigpe2lmKDI8PXRoaXMucmFuaylmb3IodmFyIEs9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV0sTT0wO008dGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aDsrK00pe2lmKG51bGw9PT0KdGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgaG9yaXpvbnRhbCByYW5nZSBmb3IgIit0aGlzLnJhbmsrIkQgdGVuc29yLiIpO3ZhciBMPXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdK007dGhpcy5zaG93SW5kaWNlc09uVGlja3MmJih0aGlzLnRvcFJ1bGVyVGlja3NbTV0udGV4dENvbnRlbnQ9TDxLPyIiK0w6IiIpfX07SC5wcm90b3R5cGUucmVuZGVyTGVmdFJ1bGVyPWZ1bmN0aW9uKCl7aWYoMTw9dGhpcy5yYW5rKWZvcih2YXIgSz10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXSxNPTA7TTx0aGlzLmxlZnRSdWxlclRpY2tzLmxlbmd0aDsrK00pe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2UpdGhyb3cgRXJyb3IoIk1pc3NpbmcgdmVydGNpYWwgcmFuZ2UgZm9yICIrdGhpcy5yYW5rKyJEIHRlbnNvci4iKTt2YXIgTD10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0rCk07dGhpcy5zaG93SW5kaWNlc09uVGlja3MmJih0aGlzLmxlZnRSdWxlclRpY2tzW01dLnRleHRDb250ZW50PUw8Sz8iIitMOiIiKX19O0gucHJvdG90eXBlLnJlbmRlclZhbHVlRGl2cz1mdW5jdGlvbigpe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBLLE0sTCxRLFQsWCxhYSxsYSxaLGJhLGVhLGNhLGthLFksRWEsdmEseGE7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oQWEpe3N3aXRjaChBYS5sYWJlbCl7Y2FzZSAwOnJldHVybiBLPXRoaXMudmFsdWVEaXZzLmxlbmd0aCxNPXRoaXMudmFsdWVEaXZzWzBdLmxlbmd0aCxbNCx0aGlzLnRlbnNvclZpZXcudmlldyh0aGlzLnNsaWNpbmdTcGVjKV07Y2FzZSAxOkw9QWEuc2VudCgpOzA9PT10aGlzLnJhbms/TD1bW0xdXToxPT09dGhpcy5yYW5rJiYoTD1MLm1hcChmdW5jdGlvbihGYSl7cmV0dXJuW0ZhXX0pKTtRPXRoaXMuZ2V0VmFsdWVDbGFzcygpO1Q9dGhpcy52YWx1ZVJlbmRlck1vZGU7aWYoVD09PQpJLklNQUdFKXtpZihudWxsPT10aGlzLm51bWVyaWNTdW1tYXJ5KXRocm93IEVycm9yKCJGYWlsZWQgdG8gcmVuZGVyIGltYWdlIHJlcHJlc2VudGF0aW9uIG9mIHRlbnNvciBkdWUgdG8gbWlzc2luZyBudW1lcmljIHN1bW1hcnkiKTtYPXRoaXMubnVtZXJpY1N1bW1hcnk7YWE9WC5taW5pbXVtO2xhPVgubWF4aW11bTtpZihudWxsPT1hYXx8bnVsbD09bGEpdGhyb3cgRXJyb3IoIkZhaWxlZCB0byByZW5kZXIgaW1hZ2UgcmVwcmVzZW50YXRpb24gb2YgdGVuc29yIGR1ZSB0byBtaXNzaW5nIG1pbmltdW0gb3IgbWF4aW11bSB2YWx1ZXMgaW4gbnVtZXJpYyBzdW1tYXJ5Iik7Wj17bWluOmFhLG1heDpsYX07dGhpcy5jb2xvck1hcD10aGlzLmNvbG9yTWFwTmFtZSBpbiBOP25ldyBOW3RoaXMuY29sb3JNYXBOYW1lXShaKTpuZXcgQihaKX1mb3IoYmE9MDtiYTxLOysrYmEpZm9yKGVhPTA7ZWE8TTsrK2VhKWNhPXRoaXMudmFsdWVEaXZzW2JhXVtlYV0sYmE8TC5sZW5ndGgmJmVhPExbYmFdLmxlbmd0aD8KKGthPUxbYmFdW2VhXSxUPT09SS5JTUFHRT8oWT1ZaSh0aGlzLmNvbG9yTWFwLmdldFJHQihrYSksMyksRWE9WVswXSx2YT1ZWzFdLHhhPVlbMl0sY2Euc3R5bGUuYmFja2dyb3VuZENvbG9yPSJyZ2IoIitFYSsiLCAiK3ZhKyIsICIreGErIikiKToibnVtZXJpYyI9PT1RP2NhLnRleHRDb250ZW50PXEoa2EsZCh0aGlzLnRlbnNvclZpZXcuc3BlYy5kdHlwZSkpOiJib29sZWFuIj09PVE/Y2EudGV4dENvbnRlbnQ9dShrYSk6InN0cmluZyI9PT1RJiYoY2EudGV4dENvbnRlbnQ9eChrYSkpLGNhLnNldEF0dHJpYnV0ZSgiZGV0YWlsZWQtdmFsdWUiLHRoaXMuZ2V0RGV0YWlsZWRWYWx1ZVRvb2x0aXBTdHJpbmcoa2EpKSk6KGNhLnRleHRDb250ZW50PSIiLGNhLnNldEF0dHJpYnV0ZSgiZGV0YWlsZWQtdmFsdWUiLCIiKSk7dGhpcy5yZW5kZXJTZWxlY3Rpb24oKTtyZXR1cm5bMl19fSl9KX07SC5wcm90b3R5cGUuZ2V0RGV0YWlsZWRWYWx1ZVRvb2x0aXBTdHJpbmc9ZnVuY3Rpb24oSyl7cmV0dXJuImJvb2xlYW4iPT09CnRoaXMuZ2V0VmFsdWVDbGFzcygpP3UoSywhMSk6InN0cmluZyI9PT10aGlzLmdldFZhbHVlQ2xhc3MoKT8iTGVuZ3RoLSIrSy5sZW5ndGgrJyBzdHJpbmc6ICInK3goSyw1MDApKyciJzpTdHJpbmcoSyl9O0gucHJvdG90eXBlLnJlbmRlclNlbGVjdGlvbj1mdW5jdGlvbigpe2lmKG51bGwhPXRoaXMuc2VsZWN0aW9uKWZvcih2YXIgSz10aGlzLnZhbHVlRGl2cy5sZW5ndGgsTT10aGlzLnZhbHVlRGl2c1swXS5sZW5ndGgsTD0wO0w8SzsrK0wpZm9yKHZhciBRPTA7UTxNOysrUSl7dmFyIFQ9dGhpcy52YWx1ZURpdnNbTF1bUV07VC5jbGFzc0xpc3QucmVtb3ZlKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24iKTtULmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi10b3AiKTtULmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1ib3R0b20iKTtULmNsYXNzTGlzdC5yZW1vdmUoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1sZWZ0Iik7ClQuY2xhc3NMaXN0LnJlbW92ZSgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXJpZ2h0Iik7dmFyIFg9dGhpcy5jYWxjdWxhdGVJbmRpY2VzKEwsUSk7WD10aGlzLnNlbGVjdGlvbi5nZXRFbGVtZW50U3RhdHVzKFgpO251bGwhPT1YJiYoVC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24iKSxYLnRvcEVkZ2UmJlQuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS1kaXYtc2VsZWN0aW9uLXRvcCIpLFguYm90dG9tRWRnZSYmVC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tYm90dG9tIiksWC5sZWZ0RWRnZSYmVC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLWRpdi1zZWxlY3Rpb24tbGVmdCIpLFgucmlnaHRFZGdlJiZULmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtZGl2LXNlbGVjdGlvbi1yaWdodCIpKX19O0gucHJvdG90eXBlLmNhbGN1bGF0ZUluZGljZXM9CmZ1bmN0aW9uKEssTSl7Zm9yKHZhciBMPVtdLFE9dGhpcy5zbGljaW5nU3BlYy5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKGZ1bmN0aW9uKGxhKXtyZXR1cm4gbGEuZGltfSksVD10aGlzLnNsaWNpbmdTcGVjLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAoZnVuY3Rpb24obGEpe3JldHVybiBsYS5pbmRleH0pLFg9MDtYPHRoaXMucmFuazsrK1gpaWYoLTEhPT1RLmluZGV4T2YoWCkpe3ZhciBhYT1UW1EuaW5kZXhPZihYKV07aWYobnVsbD09PWFhKXRocm93IEVycm9yKCJGYWlsZWQgdG8gY2FsY3VsYXRlIGluZGljZXM6IFVuZGV0ZXJtaW5lZCBpbmRleCBhdCBkaW1lbnNpb24gIitYKTtMLnB1c2goYWEpfWVsc2UgaWYoWD09PXRoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMF0pe2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2V8fG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF0pdGhyb3cgRXJyb3IoIkZhaWxlZCB0byBjYWxjdWxhdGUgaW5kaWNlcyBkdWUgdG8gdW5kZXJ0ZXJtaW5lZCB2ZXJ0aWNhbCByYW5nZS4iKTsKTC5wdXNoKHRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVswXStLKX1lbHNlIGlmKFg9PT10aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdKXtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2V8fG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXSl0aHJvdyBFcnJvcigiRmFpbGVkIHRvIGNhbGN1bGF0ZSBpbmRpY2VzIGR1ZSB0byB1bmRlcnRlcm1pbmVkIHZlcnRpY2FsIHJhbmdlLiIpO0wucHVzaCh0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVswXStNKX1yZXR1cm4gTH07SC5wcm90b3R5cGUuZHJhd1ZhbHVlVG9vbHRpcD1mdW5jdGlvbihLLE0sTCxRKXtudWxsPT09dGhpcy52YWx1ZVRvb2x0aXAmJih0aGlzLnZhbHVlVG9vbHRpcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnZhbHVlVG9vbHRpcC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAiKSx0aGlzLnJvb3RFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMudmFsdWVUb29sdGlwKSk7CmZvcig7dGhpcy52YWx1ZVRvb2x0aXAuZmlyc3RDaGlsZDspdGhpcy52YWx1ZVRvb2x0aXAucmVtb3ZlQ2hpbGQodGhpcy52YWx1ZVRvb2x0aXAuZmlyc3RDaGlsZCk7dmFyIFQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7VC5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itd2lkZ2V0LXZhbHVlLXRvb2x0aXAtaW5kaWNlcyIpO1QudGV4dENvbnRlbnQ9IkluZGljZXM6ICIrSlNPTi5zdHJpbmdpZnkoSyk7dGhpcy52YWx1ZVRvb2x0aXAuYXBwZW5kQ2hpbGQoVCk7Sz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtLLmNsYXNzTGlzdC5hZGQoInRlbnNvci13aWRnZXQtdmFsdWUtdG9vbHRpcC12YWx1ZSIpO0sudGV4dENvbnRlbnQ9TTt0aGlzLnZhbHVlVG9vbHRpcC5hcHBlbmRDaGlsZChLKTt0aGlzLnZhbHVlVG9vbHRpcC5zdHlsZS50b3A9TCsicHgiO3RoaXMudmFsdWVUb29sdGlwLnN0eWxlLmxlZnQ9USsicHgiO3RoaXMudmFsdWVUb29sdGlwLnN0eWxlLmRpc3BsYXk9ImJsb2NrIjsKdGhpcy52YWx1ZVJlbmRlck1vZGU9PUkuSU1BR0UmJm51bGwhPXRoaXMuY29sb3JNYXAmJihMPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLEwuY2xhc3NMaXN0LmFkZCgidGVuc29yLXdpZGdldC12YWx1ZS10b29sdGlwLWNvbG9yYmFyIiksdGhpcy52YWx1ZVRvb2x0aXAuYXBwZW5kQ2hpbGQoTCksdGhpcy5jb2xvck1hcC5yZW5kZXIoTCxwYXJzZUZsb2F0KE0pKSl9O0gucHJvdG90eXBlLmhpZGVWYWx1ZVRvb2x0aXA9ZnVuY3Rpb24oKXtudWxsIT10aGlzLnZhbHVlVG9vbHRpcCYmKHRoaXMudmFsdWVUb29sdGlwLnN0eWxlLmRpc3BsYXk9Im5vbmUiKX07SC5wcm90b3R5cGUucmVuZGVyUnVsZXJzQW5kVmFsdWVEaXZzPWZ1bmN0aW9uKCl7cmV0dXJuIGIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oSyl7c3dpdGNoKEsubGFiZWwpe2Nhc2UgMDpyZXR1cm4gbnVsbCE9dGhpcy5zbGljaW5nQ29udHJvbCYmdGhpcy5zbGljaW5nQ29udHJvbC5zZXRTbGljaW5nU3BlYyh0aGlzLnNsaWNpbmdTcGVjKSwKdGhpcy5jYWxjdWxhdGVTaG93SW5kaWNlc09uUnVsZXJUaWNrcygpLHRoaXMucmVuZGVyVG9wUnVsZXIoKSx0aGlzLnJlbmRlckxlZnRSdWxlcigpLFs0LHRoaXMucmVuZGVyVmFsdWVEaXZzKCldO2Nhc2UgMTpyZXR1cm4gSy5zZW50KCksWzJdfX0pfSl9O0gucHJvdG90eXBlLmNhbGN1bGF0ZVNob3dJbmRpY2VzT25SdWxlclRpY2tzPWZ1bmN0aW9uKCl7aWYoMjw9dGhpcy5yYW5rKXt2YXIgSz10aGlzLnRvcFJ1bGVyVGlja3NbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7dGhpcy5zaG93SW5kaWNlc09uVGlja3M9Sy5yaWdodC1LLmxlZnQ+OSpNYXRoLmNlaWwoTWF0aC5sb2codGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV0pL01hdGguTE4xMCl9ZWxzZSAxPT09dGhpcy5yYW5rPyhLPXRoaXMubGVmdFJ1bGVyVGlja3NbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksdGhpcy5zaG93SW5kaWNlc09uVGlja3M9MTY8Sy5ib3R0b20tCksudG9wKTp0aGlzLnNob3dJbmRpY2VzT25UaWNrcz0hMX07SC5wcm90b3R5cGUuc2Nyb2xsSG9yaXpvbnRhbGx5PWZ1bmN0aW9uKEspe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBNLEw7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oUSl7c3dpdGNoKFEubGFiZWwpe2Nhc2UgMDppZigxPj10aGlzLnJhbmspcmV0dXJuWzJdO2lmKG51bGw9PT10aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyBob3Jpem9udGFsIHJhbmdlIGZvciAiK3RoaXMucmFuaysiRCB0ZW5zb3IuIik7TT10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzFdXTtpZigwPkt8fEs+PU0pdGhyb3cgRXJyb3IoIkluZGV4IG91dCBvZiBib3VuZDogIitLKyIgaXMgb3V0c2lkZSBbMCwgIitNKyJdKSIpO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdPUs7dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2VbMV09CksrdGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aDtMPXRoaXMudGVuc29yVmlldy5zcGVjLnNoYXBlW3RoaXMuc2xpY2luZ1NwZWMudmlld2luZ0RpbXNbMV1dO3RoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzFdPkwmJih0aGlzLnNsaWNpbmdTcGVjLmhvcml6b250YWxSYW5nZVsxXT1MKTtyZXR1cm5bNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTtjYXNlIDE6cmV0dXJuIFEuc2VudCgpLFsyXX19KX0pfTtILnByb3RvdHlwZS5zY3JvbGxWZXJ0aWNhbGx5PWZ1bmN0aW9uKEspe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3ZhciBNLEw7cmV0dXJuIFhpKHRoaXMsZnVuY3Rpb24oUSl7c3dpdGNoKFEubGFiZWwpe2Nhc2UgMDppZigwPT09dGhpcy5yYW5rKXJldHVyblsyXTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlKXRocm93IEVycm9yKCJNaXNzaW5nIHZlcnRpY2FsIHJhbmdlIGZvciAiK3RoaXMucmFuaysKIkQgdGVuc29yLiIpO2lmKG51bGw9PT10aGlzLnZhbHVlUm93cyl0aHJvdyBFcnJvcigiVmVydGljYWwgc2Nyb2xsaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyB2YWx1ZSByb3dzLiIpO009dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1swXV07aWYoMD5LfHxLPj1NKXRocm93IEVycm9yKCJJbmRleCBvdXQgb2YgYm91bmQ6ICIrSysiIGlzIG91dHNpZGUgWzAsICIrTSsiXSkiKTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMF09Szt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV09Syt0aGlzLnZhbHVlUm93cy5sZW5ndGg7TD10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXTt0aGlzLnNsaWNpbmdTcGVjLnZlcnRpY2FsUmFuZ2VbMV0+TCYmKHRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZVsxXT1MKTtyZXR1cm5bNCx0aGlzLnJlbmRlclJ1bGVyc0FuZFZhbHVlRGl2cygpXTsKY2FzZSAxOnJldHVybiBRLnNlbnQoKSxbMl19fSl9KX07SC5wcm90b3R5cGUuc2Nyb2xsVXBPckRvd249ZnVuY3Rpb24oSyl7cmV0dXJuIGIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIE0sTCxRO3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKFQpe3N3aXRjaChULmxhYmVsKXtjYXNlIDA6aWYoMD09PXRoaXMucmFua3x8IXRoaXMucm93c0N1dG9mZilyZXR1cm5bMl07aWYobnVsbD09PXRoaXMuc2xpY2luZ1NwZWMudmVydGljYWxSYW5nZSl0aHJvdyBFcnJvcigiTWlzc2luZyB2ZXJ0aWNhbCByYW5nZSBmb3IgIit0aGlzLnJhbmsrIkQgdGVuc29yLiIpO2lmKG51bGw9PT10aGlzLnZhbHVlUm93cyl0aHJvdyBFcnJvcigiVmVydGljYWwgc2Nyb2xsaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyB2YWx1ZSByb3dzLiIpO009dGhpcy5zbGljaW5nU3BlYy52ZXJ0aWNhbFJhbmdlWzBdO2lmKEshPT13LkRPV04pcmV0dXJuWzMsM107TD10aGlzLnZhbHVlUm93cy5sZW5ndGgtCjE7UT10aGlzLnRlbnNvclZpZXcuc3BlYy5zaGFwZVt0aGlzLnNsaWNpbmdTcGVjLnZpZXdpbmdEaW1zWzBdXS1MO3JldHVybiBNPFE/WzQsdGhpcy5zY3JvbGxWZXJ0aWNhbGx5KE0rMSldOlszLDJdO2Nhc2UgMTpULnNlbnQoKSxULmxhYmVsPTI7Y2FzZSAyOnJldHVyblszLDVdO2Nhc2UgMzpyZXR1cm4gMDw9TS0xP1s0LHRoaXMuc2Nyb2xsVmVydGljYWxseShNLTEpXTpbMyw1XTtjYXNlIDQ6VC5zZW50KCksVC5sYWJlbD01O2Nhc2UgNTpyZXR1cm5bMl19fSl9KX07SC5wcm90b3R5cGUuc2Nyb2xsTGVmdE9yUmlnaHQ9ZnVuY3Rpb24oSyl7cmV0dXJuIGIodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKCl7dmFyIE0sTCxRO3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKFQpe3N3aXRjaChULmxhYmVsKXtjYXNlIDA6aWYoMT49dGhpcy5yYW5rfHwhdGhpcy5jb2xzQ3V0b2ZmKXJldHVyblsyXTtpZihudWxsPT09dGhpcy5zbGljaW5nU3BlYy5ob3Jpem9udGFsUmFuZ2UpdGhyb3cgRXJyb3IoIkhvcml6b250YWwgc2Nyb2xsaW5nIGZhaWxlZCBkdWUgdG8gbWlzc2luZyBob3Jpem9udGFsIHJhbmdlLiIpOwpNPXRoaXMuc2xpY2luZ1NwZWMuaG9yaXpvbnRhbFJhbmdlWzBdO2lmKEshPT13LlJJR0hUKXJldHVyblszLDNdO0w9dGhpcy50b3BSdWxlclRpY2tzLmxlbmd0aC0xO1E9dGhpcy50ZW5zb3JWaWV3LnNwZWMuc2hhcGVbdGhpcy5zbGljaW5nU3BlYy52aWV3aW5nRGltc1sxXV0tTDtyZXR1cm4gTTxRP1s0LHRoaXMuc2Nyb2xsSG9yaXpvbnRhbGx5KE0rMSldOlszLDJdO2Nhc2UgMTpULnNlbnQoKSxULmxhYmVsPTI7Y2FzZSAyOnJldHVyblszLDVdO2Nhc2UgMzpyZXR1cm4gMDw9TS0xP1s0LHRoaXMuc2Nyb2xsSG9yaXpvbnRhbGx5KE0tMSldOlszLDVdO2Nhc2UgNDpULnNlbnQoKSxULmxhYmVsPTU7Y2FzZSA1OnJldHVyblsyXX19KX0pfTtILnByb3RvdHlwZS5uYXZpZ2F0ZVRvSW5kaWNlcz1mdW5jdGlvbigpe3JldHVybiBiKHRoaXMsdm9pZCAwLHZvaWQgMCxmdW5jdGlvbigpe3JldHVybiBYaSh0aGlzLGZ1bmN0aW9uKCl7dGhyb3cgRXJyb3IoIm5hdmlnYXRlVG9JbmRpY2VzKCkgaXMgbm90IGltcGxlbWVudGVkIHlldC4iKTsKfSl9KX07SC5wcm90b3R5cGUuZ2V0VmFsdWVDbGFzcz1mdW5jdGlvbigpe3ZhciBLPXRoaXMudGVuc29yVmlldy5zcGVjLmR0eXBlO3JldHVybiBkKEspfHxmKEspPyJudW1lcmljIjpoKEspPyJib29sZWFuIjoic3RyaW5nIn07cmV0dXJuIEh9KCk7RD1PYmplY3QuZnJlZXplKHt0ZW5zb3JXaWRnZXQ6ZnVuY3Rpb24oSCxLLE0pe3JldHVybiBuZXcgTyhILEssTSl9LFZFUlNJT046IjAuMC4wIn0pO3dpbmRvdy50ZW5zb3Jfd2lkZ2V0PUR9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90Zi1kZWJ1Z2dlci1saW5lLWNoYXJ0Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRlYnVnZ2VyLWxpbmUtY2hhcnQiLHByb3BlcnRpZXM6e2RhdGE6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9kZWZhdWx0U2VyaWVzTmFtZTp7dHlwZTpTdHJpbmcsdmFsdWU6Il9fZGVidWdnZXJfZGF0YV9fIixyZWFkb25seTohMH0sX2xpbmVDaGFydFhDb21wb25lbnRzQ3JlYXRpb25NZXRob2Q6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLHZhbHVlOigpPT4oKT0+e2NvbnN0IGI9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3JldHVybntzY2FsZTpiLGF4aXM6bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWMoYiwiYm90dG9tIiksYWNjZXNzb3I6ZD0+ZC5zdGVwfX19LF9saW5lQ2hhcnRZVmFsdWVBY2Nlc3Nvcjp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PmI9PmIuc2NhbGFyfSxfbGluZUNoYXJ0VG9vbHRpcENvbHVtbnM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsdmFsdWU6KCk9Plt7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOmI9Pgoic3RlcFx4M2QiK2IuZGF0dW0uc3RlcCsiOyBzY2FsYXJceDNkICIrYi5kYXR1bS5zY2FsYXJ9XX0sX2xpbmVDaGFydFNtb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH19LG9ic2VydmVyczpbInJlbmRlcihkYXRhKSJdLHJlbmRlcihiKXtpZihudWxsIT1iKXt2YXIgZD10aGlzLiQkKCJ2ei1saW5lLWNoYXJ0MiIpO2Quc2V0VmlzaWJsZVNlcmllcyhbdGhpcy5fZGVmYXVsdFNlcmllc05hbWVdKTt2YXIgZj1bXSxoPWIueDtiPWIueTtmb3IobGV0IGs9MDtrPGgubGVuZ3RoOysraylmLnB1c2goe3N0ZXA6aFtrXSxzY2FsYXI6YltrXX0pO2Quc2V0U2VyaWVzRGF0YSh0aGlzLl9kZWZhdWx0U2VyaWVzTmFtZSxmKX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXRlbnNvci12YWx1ZS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRlbnNvci12YWx1ZS12aWV3Iixwcm9wZXJ0aWVzOnt2aWV3SWQ6U3RyaW5nLHRlbnNvck5hbWU6U3RyaW5nLGRlYnVnT3A6U3RyaW5nLGRldmljZU5hbWU6U3RyaW5nLG1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU6U3RyaW5nLHNsaWNpbmc6U3RyaW5nLHRpbWVJbmRpY2VzOlN0cmluZyxkdHlwZTpTdHJpbmcsc2hhcGU6QXJyYXksY29udGludWVUb0J1dHRvbkNhbGxiYWNrOk9iamVjdCxjbG9zZUJ1dHRvbkNhbGxiYWNrOk9iamVjdCx0ZW5zb3JOYW1lQ2FsbGJhY2s6T2JqZWN0LHRlbnNvcldpZGdldDpPYmplY3QsZ2V0SGVhbHRoUGlsbDpGdW5jdGlvbixfaXNUZW5zb3JWYWx1ZVNjYWxhcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaXNUZW5zb3JWYWx1ZUxpbmVDaGFydDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaXNUZW5zb3JWYWx1ZUltYWdlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9kYXRhU2NhbGFyOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfSwKX2xpbmVDaGFydERhdGE6e3R5cGU6QXJyYXksdmFsdWU6bnVsbH0sX2RhdGFJbWFnZVNyYzp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyKDEwKX19LG9ic2VydmVyczpbIl91cGRhdGVUaW1lSW5kaWNlc1RvZ2dsZSh0aW1lSW5kaWNlcykiXSxyZW5kZXJUZW5zb3JWYWx1ZSgpe2lmKHRoaXMudGVuc29yTmFtZSlpZihudWxsPT10aGlzLnNsaWNpbmcpe3RoaXMuc2V0KCJfdXNlVGVuc29yV2lkZ2V0IiwhMCk7Y29uc3QgZD17c3BlYzp7ZHR5cGU6dGhpcy5kdHlwZSxzaGFwZTp0aGlzLnNoYXBlfSxnZXQ6KCk9Pnt0aHJvdyBFcnJvcigidGVuc29yVmlldy5nZXQoKSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LiIpO30sdmlldzpmPT57Y29uc3QgaD10aGlzO3JldHVybiBoYyhmdW5jdGlvbiooKXtjb25zdCBrPWguc2hhcGUubGVuZ3RoLHQ9Zi5zbGljaW5nRGltc0FuZEluZGljZXMubWFwKG09PgptLmRpbSksbD1mLnNsaWNpbmdEaW1zQW5kSW5kaWNlcy5tYXAobT0+bS5pbmRleCk7bGV0IHA9IlsiO2ZvcihsZXQgbT0wO208azsrK20pLTEhPT10LmluZGV4T2YobSk/cCs9YCR7bFt0LmluZGV4T2YobSldfWA6Zi52aWV3aW5nRGltc1swXT09PW0/cCs9YCR7Zi52ZXJ0aWNhbFJhbmdlWzBdfToke2YudmVydGljYWxSYW5nZVsxXX1gOmYudmlld2luZ0RpbXNbMV09PT1tJiYocCs9YCR7Zi5ob3Jpem9udGFsUmFuZ2VbMF19OiR7Zi5ob3Jpem9udGFsUmFuZ2VbMV19YCksbTxrLTEmJihwKz0iLCIpO3ArPSJdIjtyZXR1cm4gbmV3IFByb21pc2UoKG0sbik9Pntjb25zdCBxPWguX2dldFRlbnNvckRhdGFVUkwoe3dhdGNoX2tleTpoLnRlbnNvck5hbWUrIjoiK2guZGVidWdPcCxzbGljaW5nOnAsdGltZV9pbmRpY2VzOmgudGltZUluZGljZXMsbWFwcGluZzoibm9uZSJ9KTtoLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHEpLnRoZW4odT0+e251bGw9PXUuZXJyb3I/bSh1LnRlbnNvcl9kYXRhW3UudGVuc29yX2RhdGEubGVuZ3RoLQoxXSk6bih1LmVycm9yKX0pLmNhdGNoKHU9Pm4odSkpfSl9KX0sZ2V0TnVtZXJpY1N1bW1hcnk6KCk9Pntjb25zdCBmPXRoaXM7cmV0dXJuIGhjKGZ1bmN0aW9uKigpe3JldHVybiBuZXcgUHJvbWlzZSgoaCxrKT0+e2NvbnN0IHQ9Zi50ZW5zb3JOYW1lKyI6IitmLmRlYnVnT3A7Zi5nZXRIZWFsdGhQaWxsKHQsZi5kZXZpY2VOYW1lLGYubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSxsPT57bnVsbD09bD9rKGBGYWlsZWQgdG8gZ2V0IGhlYWx0aCBwaWxsIGZvciB3YXRjaCBrZXkgJHt0fWApOmgoe2VsZW1lbnRDb3VudDpsWzFdLG1pbmltdW06bFs4XSxtYXhpbXVtOmxbOV19KX0pfSl9KX19O3NldFRpbWVvdXQoKCk9PntudWxsPT10aGlzLnRlbnNvcldpZGdldCYmKHRoaXMudGVuc29yV2lkZ2V0PXRlbnNvcl93aWRnZXQudGVuc29yV2lkZ2V0KHRoaXMuJCQoIiN0ZW5zb3Itd2lkZ2V0IiksZCx7d2hlZWxab29tS2V5OiJhbHQifSkpO3RoaXMudGVuc29yV2lkZ2V0LnJlbmRlcigpfSwKMTApfWVsc2V7dGhpcy5zZXQoIl91c2VUZW5zb3JXaWRnZXQiLCExKTt2YXIgYj10aGlzLl9yYW5rRnJvbVNsaWNpbmcodGhpcy5zbGljaW5nLnRyaW0oKSk7Y29uc3QgZD10aGlzLl9pc1RpbWVJbmRpY2VzU2luZ2xlU3RlcCh0aGlzLnRpbWVJbmRpY2VzKTtsZXQgZj1iO2lmKCFkKXtpZigxPGIpe3RoaXMuX3Nob3dUb2FzdCgiSGlzdG9yeSBmb3IgdGVuc29ycyBceDNlIDFEIGlzIG5vdCB5ZXQgc3VwcG9ydGVkLiIpO3JldHVybn1mKz0xfWI9dGhpcy5fZ2V0VGVuc29yRGF0YVVSTCh7d2F0Y2hfa2V5OnRoaXMudGVuc29yTmFtZSsiOiIrdGhpcy5kZWJ1Z09wLHNsaWNpbmc6dGhpcy5zbGljaW5nLHRpbWVfaW5kaWNlczp0aGlzLnRpbWVJbmRpY2VzLG1hcHBpbmc6Mjw9Zj8iaW1hZ2UvcG5nIjoibm9uZSJ9KTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oaD0+e3RoaXMuJCQoIiNkZWJ1Zy1vcCIpLnRleHRDb250ZW50PXRoaXMuX2NhbGN1bGF0ZURlYnVnT3BUb0Rpc3BsYXkoKTsKaWYobnVsbCE9aC5lcnJvcil0aGlzLl9zaG93VG9hc3QoaC5lcnJvci50eXBlKyI6ICIraC5lcnJvci5tZXNzYWdlKTtlbHNlIGlmKGg9ZD9oLnRlbnNvcl9kYXRhWzBdOmgudGVuc29yX2RhdGEsMD09PWYpdGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoInNjYWxhciIpLHRoaXMuc2V0KCJfZGF0YVNjYWxhciIsaCk7ZWxzZSBpZigxPT09Zil7dGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoImxpbmVDaGFydCIpO2xldCBrPXt4OltdLHk6aH07Zm9yKGxldCB0PTA7dDxoLmxlbmd0aDsrK3Qpay54LnB1c2godCsxKTt0aGlzLnNldCgiX2xpbmVDaGFydERhdGEiLGspfWVsc2UgMjw9Zj8odGhpcy5fc2V0VmlzdWFsaXphdGlvblR5cGUoImltYWdlIiksdGhpcy5zZXQoIl9kYXRhSW1hZ2VTcmMiLCJkYXRhOmltYWdlL3BuZztiYXNlNjQsIitoKSk6dGhpcy5fc2hvd1RvYXN0KCJWaXN1YWxpemF0aW9uIG9mIHJhbmstIitmKyIgdGVuc29ycyBpcyBub3QgeWV0IHN1cHBvcnRlZC4iKX0pfX0sCnJlZnJlc2goKXt0aGlzLnRlbnNvck5hbWUudHJpbSgpJiZ0aGlzLnJlbmRlclRlbnNvclZhbHVlKCl9LF9nZXRUZW5zb3JEYXRhVVJMKGIpe2NvbnN0IGQ9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL3RlbnNvcl9kYXRhIik7cmV0dXJuIHZjLmFkZFBhcmFtcyhkLGIpfSxfcmFua0Zyb21TbGljaW5nKGIpe2Iuc3RhcnRzV2l0aCgiWyIpJiYoYj1iLnNsaWNlKDEsYi5sZW5ndGgtMSkpO2lmKDA9PT1iLmxlbmd0aClyZXR1cm4gMDt7Yj1iLnNwbGl0KCIsIik7bGV0IGQ9Yi5sZW5ndGg7Zm9yKGNvbnN0IGYgb2YgYilpc05hTihOdW1iZXIoZikpfHxkLS07cmV0dXJuIGR9fSxfc2V0VmlzdWFsaXphdGlvblR5cGUoYil7InNjYWxhciI9PT1iPyh0aGlzLnNldCgiX2lzVmFsdWVTY2FsYXIiLCEwKSx0aGlzLnNldCgiX2lzVmFsdWVMaW5lQ2hhcnQiLCExKSx0aGlzLnNldCgiX2lzVmFsdWVJbWFnZSIsITEpKToibGluZUNoYXJ0Ij09PWI/KHRoaXMuc2V0KCJfaXNWYWx1ZVNjYWxhciIsCiExKSx0aGlzLnNldCgiX2lzVmFsdWVMaW5lQ2hhcnQiLCEwKSx0aGlzLnNldCgiX2lzVmFsdWVJbWFnZSIsITEpKToiaW1hZ2UiPT09Yj8odGhpcy5zZXQoIl9pc1ZhbHVlU2NhbGFyIiwhMSksdGhpcy5zZXQoIl9pc1ZhbHVlTGluZUNoYXJ0IiwhMSksdGhpcy5zZXQoIl9pc1ZhbHVlSW1hZ2UiLCEwKSk6Y29uc29sZS5lcnJvcigiSW52YWxpZCB2aXN1YWxpemF0aW9uVHlwZToiLGIpfSxfdGltZUluZGljZXNUb2dnbGVCdXR0b25DYWxsYmFjaygpeyJmdWxsIGhpc3RvcnkiPT09UG9seW1lci5kb20odGhpcy4kJCgiI3RpbWUtaW5kaWNlcy10b2dnbGUtYnV0dG9uIikpLnRleHRDb250ZW50LnRvTG93ZXJDYXNlKCk/dGhpcy5zZXQoInRpbWVJbmRpY2VzIiwiOiIpOnRoaXMuc2V0KCJ0aW1lSW5kaWNlcyIsIi0xIik7dGhpcy5yZW5kZXJUZW5zb3JWYWx1ZSgpfSxfdXBkYXRlVGltZUluZGljZXNUb2dnbGUoYil7dGhpcy5faXNUaW1lSW5kaWNlc1NpbmdsZVN0ZXAoYik/UG9seW1lci5kb20odGhpcy4kJCgiI3RpbWUtaW5kaWNlcy10b2dnbGUtYnV0dG9uIikpLnRleHRDb250ZW50PQoiRnVsbCBIaXN0b3J5IjpQb2x5bWVyLmRvbSh0aGlzLiQkKCIjdGltZS1pbmRpY2VzLXRvZ2dsZS1idXR0b24iKSkudGV4dENvbnRlbnQ9IkxhdGVzdCBUaW1lIFBvaW50In0sX2lzVGltZUluZGljZXNTaW5nbGVTdGVwKGIpe2Iuc3RhcnRzV2l0aCgiWyIpJiYoYj1iLnNsaWNlKDEsYi5sZW5ndGgtMSkpO3JldHVybiFpc05hTihOdW1iZXIoYikpfSxfY2FsY3VsYXRlRGVidWdPcFRvRGlzcGxheSgpe3JldHVybiJEZWJ1Z0lkZW50aXR5Ij09PXRoaXMuZGVidWdPcD8iIjp0aGlzLmRlYnVnT3B9LF9zaG93VG9hc3QoYil7dGhpcy4kLnRlbnNvclZhbHVlVG9hc3Quc2V0QXR0cmlidXRlKCJ0ZXh0IixiKTt0aGlzLiQudGVuc29yVmFsdWVUb2FzdC5vcGVuKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGVidWdnZXItZGFzaGJvYXJkL3RmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRlbnNvci12YWx1ZS1tdWx0aS12aWV3Iixwcm9wZXJ0aWVzOntjb250aW51ZVRvQ2FsbGJhY2s6RnVuY3Rpb24sdGVuc29yTmFtZUNsaWNrZWQ6RnVuY3Rpb24sX3RlbnNvclZpZXdDb3VudGVyOnt0eXBlOk51bWJlcix2YWx1ZTowfSxnZXRIZWFsdGhQaWxsOkZ1bmN0aW9ufSxhZGRWaWV3KGIpe2NvbnN0IGQ9dGhpcy4kJCgiI211bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciIpLGY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGYtdGVuc29yLXZhbHVlLXZpZXciKTtmLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCJkZWJ1Z2dlci10ZW5zb3ItdmlldyIpO2Yudmlld0lkPWIudmlld0lkO2YudGVuc29yTmFtZT1iLnRlbnNvck5hbWU7Zi5kZWJ1Z09wPWIuZGVidWdPcDtmLmRldmljZU5hbWU9Yi5kZXZpY2VOYW1lO2YubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZT1iLm1heWJlQmFzZUV4cGFuZGVkTm9kZU5hbWU7Zi5kdHlwZT1iLmR0eXBlO2Yuc2hhcGU9Yi5zaGFwZTsKZi5zbGljaW5nPWIuc2xpY2luZztmLnRpbWVJbmRpY2VzPWIudGltZUluZGljZXM7Zi5jbG9zZUJ1dHRvbkNhbGxiYWNrPXRoaXMuX2NyZWF0ZUNsb3NlQnV0dG9uQ2FsbGJhY2soYi52aWV3SWQpO2YuY29udGludWVUb0J1dHRvbkNhbGxiYWNrPSgpPT57dGhpcy5jb250aW51ZVRvQ2FsbGJhY2soYi5kZXZpY2VOYW1lLGIubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSl9O2YudGVuc29yTmFtZUNhbGxiYWNrPSgpPT57dGhpcy50ZW5zb3JOYW1lQ2xpY2tlZChiLmRldmljZU5hbWUsYi5tYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lKX07Zi5nZXRIZWFsdGhQaWxsPXRoaXMuZ2V0SGVhbHRoUGlsbDtkLmFwcGVuZENoaWxkKGYpO2YucmVmcmVzaCgpfSxnZXRWaWV3cygpe2NvbnN0IGI9W107Xy5mb3JFYWNoKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKSxkPT57Yi5wdXNoKHt2aWV3SWQ6ZC52aWV3SWQsdGVuc29yTmFtZTpkLnRlbnNvck5hbWUsCmRlYnVnT3A6ZC5kZWJ1Z09wLHNsaWNpbmc6ZC5zbGljaW5nLHRpbWVJbmRpY2VzOmQudGltZUluZGljZXN9KX0pO3JldHVybiBifSxyZW5kZXJUZW5zb3JWYWx1ZXMoKXtfLmZvckVhY2godGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoIi5kZWJ1Z2dlci10ZW5zb3ItdmlldyIpLGI9PntiLnJlbmRlclRlbnNvclZhbHVlKCl9KX0sX3JlZHJhd1ZpZXdzKGIpe2NvbnN0IGQ9dGhpcy4kJCgiI211bHRpLXRlbnNvci12aWV3LWNvbnRhaW5lciIpO18uZm9yRWFjaCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRlYnVnZ2VyLXRlbnNvci12aWV3IiksZj0+e2QucmVtb3ZlQ2hpbGQoZil9KTtfLmZvckVhY2goYixmPT57dGhpcy5hZGRWaWV3KGYpfSl9LF9jcmVhdGVDbG9zZUJ1dHRvbkNhbGxiYWNrKGIpe3JldHVybigpPT57Y29uc3QgZD1bXSxmPXRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuZGVidWdnZXItdGVuc29yLXZpZXciKTtmb3IobGV0IGg9MDtoPGYubGVuZ3RoOysraCl7Y29uc3Qgaz0KZltoXTtrLnZpZXdJZCE9PWImJmQucHVzaCh7dmlld0lkOmsudmlld0lkLHRlbnNvck5hbWU6ay50ZW5zb3JOYW1lLGRlYnVnT3A6ay5kZWJ1Z09wLGR0eXBlOmsuZHR5cGUsc2hhcGU6ay5zaGFwZSxzbGljaW5nOmsuc2xpY2luZyx0aW1lSW5kaWNlczprLnRpbWVJbmRpY2VzfSl9dGhpcy5fcmVkcmF3Vmlld3MoZCl9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWRlYnVnZ2VyLWRhc2hib2FyZC90ZW5zb3Itc2hhcGUtaGVscGVyLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYsaCl7cmV0dXJuIGY8PWg/Ijo6IjoiOjoiK01hdGguY2VpbChmL2gpfWIuZ2V0RGVmYXVsdFNsaWNpbmc9ZnVuY3Rpb24oZil7cmV0dXJuIDA9PT1mLmxlbmd0aD8iIjoxPT09Zi5sZW5ndGg/IlsiK2QoZlswXSwxRTMpKyJdIjoyPT09Zi5sZW5ndGg/IlsiK2QoZlswXSwyNTApKyIsICIrZChmWzFdLDI1MCkrIl0iOm51bGx9O2IucmFua0Zyb21TbGljaW5nPWZ1bmN0aW9uKGYpe2Yuc3RhcnRzV2l0aCgiWyIpJiYoZj1mLnNsaWNlKDEsZi5sZW5ndGgtMSkpO2lmKDA9PT1mLmxlbmd0aClyZXR1cm4gMDt7Zj1mLnNwbGl0KCIsIik7bGV0IGg9Zi5sZW5ndGg7Zm9yKGNvbnN0IGsgb2YgZilpc05hTihOdW1iZXIoaykpfHxoLS07cmV0dXJuIGh9fX0pKFZpfHwoVmk9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1kZWJ1Z2dlci1kYXNoYm9hcmQvdGYtZGVidWdnZXItZGFzaGJvYXJkLmh0bWwuanMKY29uc3QgWmk9KCk9PndpbmRvdy5pbm5lckhlaWdodHx8ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodHx8ZG9jdW1lbnQuYm9keS5jbGllbnRIZWlnaHQsSGs9KCk9PndpbmRvdy5pbm5lcldpZHRofHxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGh8fGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGgsSWs9KFppKCktNzApLzI7ClBvbHltZXIoe2lzOiJ0Zi1kZWJ1Z2dlci1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e190b3BSaWdodFRhYnM6e3R5cGU6QXJyYXksdmFsdWU6W3tpZDoidGFiLXJ1bnRpbWUtZ3JhcGhzIixuYW1lOiJSdW50aW1lIEdyYXBocyJ9LHtpZDoidGFiLXRlbnNvci12YWx1ZXMiLG5hbWU6IlRlbnNvciBWYWx1ZXMifV0scmVhZG9ubHk6ITB9LF9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfdG9wUmlnaHRTZWxlY3RlZDp7dHlwZTpTdHJpbmcsdmFsdWU6IjAiLG9ic2VydmVyOiJfdG9wUmlnaHRTZWxlY3RlZENoYW5nZWQifSxfbG9uZ1BvbGxDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3N0ZXBCdXR0b25UZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiU3RlcCJ9LF9jb250aW51ZUJ1dHRvblRleHQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJDb250aW51ZS4uLiJ9LApfdGVuc29yVmlld0lkQ291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0saXNSZWxvYWREaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLHJlYWRPbmx5OiEwfSxhbHJlYWR5U3RhcnRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY3VycmVudFNlc3Npb25SdW5JbmZvOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfc2Vzc2lvblJ1blRvdGFsQ291bnRlcjp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3Nlc3Npb25SdW5Db3VudGVyczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX2FjdGl2ZVNlc3Npb25SdW5LZXk6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LF9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlczp7dHlwZTpBcnJheSx2YWx1ZTpbXX0sX2FjdGl2ZVNlc3Npb25SdW5OdW1EZXZpY2VzOnt0eXBlOk51bWJlcix2YWx1ZTotMX0sX2FjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWU6e3R5cGU6U3RyaW5nLAp2YWx1ZTpudWxsLG5vdGlmeTohMH0sX2hpZ2hsaWdodE5vZGVOYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfY29udGludWVUb1R5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY29udGludWVUb0NvdW50ZXI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9jb250aW51ZVN0b3A6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2NvbnRpbnVlVG9UYXJnZXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxfY29udGludWVUb0NvdW50ZXJUYXJnZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOi0xfSxfZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lOlN0cmluZyxfZm9yY2VFeHBhbmROb2RlTmFtZTpTdHJpbmcsX3NvdXJjZUZvY3VzTm9kZU5hbWU6U3RyaW5nLF9zb3VyY2VDb2RlU2hvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX3Nob3dTb3VyY2VDb2RlQ2hhbmdlZCJ9LF9ncmFwaFByb2dyZXNzOnt0eXBlOk9iamVjdH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+Cm5ldyB2Yy5SZXF1ZXN0TWFuYWdlcig1MCl9LF9idXN5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9sZWZ0UGFuZVdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTpwZC5nZXROdW1iZXJJbml0aWFsaXplcigiX2xlZnRQYW5lV2lkdGgiLHtkZWZhdWx0VmFsdWU6NDUwfSksb2JzZXJ2ZXI6Il9sZWZ0UGFuZVdpZHRoT2JzZXJ2ZXIifSxfbWlubGVmdFBhbmVXaWR0aDp7dHlwZTpOdW1iZXIsdmFsdWU6NDUwLHJlYWRPbmx5OiEwfSxfbWF4bGVmdFBhbmVXaWR0aDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4bGVmdFBhbmVXaWR0aChfd2luZG93V2lkdGgsIF9tYXhNYWluQ29udGVudFdpZHRoLCBfcmVzaXplcldpZHRoKSJ9LF9tYXhNYWluQ29udGVudFdpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTozNTAscmVhZE9ubHk6ITB9LF90b3BSaWdodFF1YWRyYW50SGVpZ2h0Ont0eXBlOk51bWJlcix2YWx1ZTpwZC5nZXROdW1iZXJJbml0aWFsaXplcigiX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQiLAp7ZGVmYXVsdFZhbHVlOklrfSksb2JzZXJ2ZXI6Il90b3BSaWdodFF1YWRyYW50SGVpZ2h0T2JzZXJ2ZXIifSxfbWluVG9wUmlnaHRRdWFkcmFudEhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjAwLHJlYWRPbmx5OiEwfSxfbWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodDp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlTWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodChfd2luZG93SGVpZ2h0LCBfcmVzaXplcldpZHRoKSJ9LF9yZXNpemVyV2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjMwLHJlYWRPbmx5OiEwfSxfd2luZG93V2lkdGg6TnVtYmVyLF93aW5kb3dIZWlnaHQ6TnVtYmVyLF9kZWJ1Z1dhdGNoZXM6QXJyYXksX2xhdGVzdFNlc3Npb25SdW46T2JqZWN0fSxvYnNlcnZlcnM6WyJfb25BY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lQ2hhbmdlKF9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lKSIsIl9zaXplRGFzaGJvYXJkUmVnaW9ucyhfbGVmdFBhbmVXaWR0aCwgX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQsIF93aW5kb3dXaWR0aCkiLAoiX2dyYXBoUHJvZ3Jlc3NVcGRhdGVkKF9ncmFwaFByb2dyZXNzKSJdLHJlYWR5KCl7dGhpcy5faGFuZGxlV2luZG93UmVzaXplKCk7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsKCk9Pnt0aGlzLl9oYW5kbGVXaW5kb3dSZXNpemUoKX0sITEpO3RoaXMucmVsb2FkKCl9LGxvbmdfcG9sbCgpe2NvbnN0IGI9e3BvczorK3RoaXMuX2xvbmdQb2xsQ291bnR9O2xldCBkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9jb21tIik7ZD12Yy5hZGRQYXJhbXMoZCxiKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGQpLnRoZW4oZj0+e2NvbnN0IGg9Zi50eXBlO2Y9Zi5kYXRhO2lmKCJtZXRhIj09PWgpe3ZhciBrPWYucnVuX2tleSx0PWtbMF0uc3BsaXQoIiwiKSxsPWtbMV0uc3BsaXQoIiwiKTtjb25zdCBtPWtbMl0uc3BsaXQoIiwiKTt2YXIgcD10aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5O3RoaXMuc2V0KCJfYWN0aXZlU2Vzc2lvblJ1bktleSIsCmspO3RoaXMuc2V0KCJfbGF0ZXN0U2Vzc2lvblJ1biIse2ZlZWRzOnQsZmV0Y2hlczpsLHRhcmdldHM6bX0pO3RoaXMuc2V0KCJfc2Vzc2lvblJ1blNvbGVBY3RpdmUiLCEwKTt2b2lkIDA9PT10aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2tdPyh0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2tdPVtdLHRoaXMuc2V0KCJfYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMiLFtdKSk6dGhpcy5zZXQoIl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcyIsdGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1trXSk7dGhpcy5fY3VycmVudFNlc3Npb25SdW5JbmZvPXQ9IkZlZWRzOiAiK3QrIjsgRmV0Y2hlczogIitsKyI7IFRhcmdldHM6ICIrbTt0aGlzLl9zZXNzaW9uUnVuQ291bnRlcnMuaGFzT3duUHJvcGVydHkodCk/dGhpcy5fc2Vzc2lvblJ1bkNvdW50ZXJzW3RdKz0xOnRoaXMuX3Nlc3Npb25SdW5Db3VudGVyc1t0XT0xO3RoaXMuX3Nlc3Npb25SdW5Ub3RhbENvdW50ZXIrKzsKdGhpcy4kLmluaXRpYWxEaWFsb2cuY2xvc2VEaWFsb2coKTt0aGlzLl9jb250aW51ZVRvVHlwZSYmXy5pc0VxdWFsKHAsayl8fCh0aGlzLl9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHMoaywhMSksdGhpcy5fYW5ub3VuY2VOZXdTZXNzaW9uUnVuKCkpfWVsc2UidGVuc29yIj09PWg/KGs9Zi5kZXZpY2VfbmFtZSxwPWYubm9kZV9uYW1lLHQ9Zi5tYXliZV9iYXNlX2V4cGFuZGVkX25vZGVfbmFtZSx0aGlzLl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lIT1rP3RoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsayk6IXRoaXMuX2NvbnRpbnVlVG9UeXBlJiZ0aGlzLl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSYmKHRoaXMuX2ZvY3VzT25HcmFwaE5vZGUoayx0KSx0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLGsrIi8iK3QpKSx0aGlzLnNldCgiX3Nlc3Npb25SdW5Tb2xlQWN0aXZlIiwhMSksbD1wKyI6IitmLm91dHB1dF9zbG90LHRoaXMuc2V0KCJfbGF0ZXN0VGVuc29yRGF0YSIsCntkZXZpY2VOYW1lOmssdGVuc29yTmFtZTpsLG5vZGVOYW1lOnAsbWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZTp0LGRlYnVnT3A6Zi5kZWJ1Z19vcCxkdHlwZTpmLmR0eXBlLHNoYXBlOmYuc2hhcGUsdmFsdWU6Zi52YWx1ZXN9KSx0aGlzLl9tYXliZVVwZGF0ZVRlbnNvclZhbHVlVmlld3MobCxmLmRlYnVnX29wKSx0aGlzLnNldCgiX2J1c3kiLCExKSk6Y29uc29sZS5lcnJvcigiSW52YWxpZCBsb25nLXBvbGxpbmcgcmVzcG9uc2UgdHlwZTogIixoKTtudWxsIT10aGlzLl9jb250aW51ZVRvVHlwZSYmdGhpcy5fcHJvY2Vzc0NvbnRpbnVlVG8oaCxmKTt0aGlzLmxvbmdfcG9sbCgpfSl9LF9wcm9jZXNzQ29udGludWVUbyhiLGQpe3RoaXMuX2NvbnRpbnVlU3RvcD90aGlzLl9jbGVhckNvbnRpbnVlVG8oKToiU2Vzc2lvblJ1biI9PT10aGlzLl9jb250aW51ZVRvVHlwZT90aGlzLl9wcm9jZXNzQ29udGludWVUb1Nlc3Npb25SdW4oIm1ldGEiPT09Yik6IlRlbnNvckNvbmRpdGlvbiI9PT0KdGhpcy5fY29udGludWVUb1R5cGU/dGhpcy5fc3RlcCgpOiJvcCI9PT10aGlzLl9jb250aW51ZVRvVHlwZT90aGlzLl9wcm9jZXNzQ29udGludWVUb09wKCJtZXRhIj09PWIsZCk6bnVsbCE9dGhpcy5fY29udGludWVUb1R5cGUmJiIiIT09dGhpcy5fY29udGludWVUb1R5cGUmJmNvbnNvbGUuZXJyb3IoIkludmFsaWQgX2NvbnRpbnVlVG9UeXBlOiIsdGhpcy5fY29udGludWVUb1R5cGUpfSxfcHJvY2Vzc0NvbnRpbnVlVG9TZXNzaW9uUnVuKGIpe2ImJnRoaXMuc2V0KCJfY29udGludWVUb0NvdW50ZXIiLHRoaXMuX2NvbnRpbnVlVG9Db3VudGVyKzEpO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyPHRoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0P3RoaXMuX3N0ZXAoKTp0aGlzLl9jbGVhckNvbnRpbnVlVG8oKX0sX3Byb2Nlc3NDb250aW51ZVRvT3AoYixkKXtiJiZ0aGlzLl9hbm5vdW5jZU5ld1Nlc3Npb25SdW4oKTtiPWQuZGV2aWNlX25hbWU7ZD1kLm1heWJlX2Jhc2VfZXhwYW5kZWRfbm9kZV9uYW1lOwpjb25zdCBmPW51bGw9PWQ/bnVsbDpWaS5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oZCk7YisiLyIrZD09PXRoaXMuX2NvbnRpbnVlVG9UYXJnZXR8fGIrIi8iK2Y9PT10aGlzLl9jb250aW51ZVRvVGFyZ2V0Pyh0aGlzLl9jbGVhckNvbnRpbnVlVG8oKSx0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsZikpOnRoaXMuX3N0ZXAoKX0sX21heWJlVXBkYXRlVGVuc29yVmFsdWVWaWV3cyhiLGQpe2NvbnN0IGY9dGhpcy4kJCgiI3RlbnNvclZhbHVlTXVsdGlWaWV3Iik7aWYobnVsbCE9Zil7dmFyIGg9ITE7Xy5mb3JFYWNoKGYuZ2V0Vmlld3MoKSxrPT57aWYoay50ZW5zb3JOYW1lPT09YiYmay5kZWJ1Z09wPT09ZClyZXR1cm4gaD0hMCwhMX0pO2gmJmYucmVuZGVyVGVuc29yVmFsdWVzKCl9fSxyZWxvYWQoKXtpZighdGhpcy5hbHJlYWR5U3RhcnRlZCl7dGhpcy5zZXQoImFscmVhZHlTdGFydGVkIiwhMCk7dmFyIGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwKIi9kZWJ1Z2dlcl9ncnBjX2hvc3RfcG9ydCIpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT57MDxkLnBvcnQ/KHRoaXMuJC5pbml0aWFsRGlhbG9nLm9wZW5EaWFsb2coZC5ob3N0LGQucG9ydCksdGhpcy5sb25nX3BvbGwoKSk6dGhpcy4kLmluaXRpYWxEaWFsb2cub3BlbkRpc2FibGVkRGlhbG9nKCl9KX19LF9zaG93U291cmNlQ29kZUNoYW5nZWQoKXt0aGlzLl9zb3VyY2VDb2RlU2hvd24/KHRoaXMuJCQoIiNub2RlLWVudHJpZXMiKS5zdHlsZS5oZWlnaHQ9IjQwJSIsdGhpcy4kLnNvdXJjZUNvZGVWaWV3LnJlbmRlcigpKTp0aGlzLiQkKCIjbm9kZS1lbnRyaWVzIikuc3R5bGUuaGVpZ2h0PSI4MCUifSxfc2hvd1RvYXN0KGIpe3RoaXMuJC50b2FzdC5zZXRBdHRyaWJ1dGUoInRleHQiLGIpO3RoaXMuJC50b2FzdC5vcGVuKCl9LF9hbm5vdW5jZU5ld1Nlc3Npb25SdW4oKXt0aGlzLl9zaG93VG9hc3QoIlNlc3Npb24ucnVuKCkgIyIrdGhpcy5fc2Vzc2lvblJ1blRvdGFsQ291bnRlcisKIiBpcyBzdGFydGluZy4iKX0sX2Rpc3BsYXlHcmFwaChiLGQpe2I9e3J1bl9rZXk6SlNPTi5zdHJpbmdpZnkoYiksZGV2aWNlX25hbWU6ZH07Yj12Yy5hZGRQYXJhbXMoIi9kYXRhL3BsdWdpbi9kZWJ1Z2dlci9kZWJ1Z2dlcl9ncmFwaCIsYik7dGhpcy4kLmxvYWRlci5kYXRhc2V0cz1be25hbWU6Ii9kZWJ1Z2dlcl9ncmFwaCIscGF0aDpifV07dGhpcy4kLmxvYWRlci5zZXQoInNlbGVjdGVkRGF0YXNldCIsMCl9LF9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHMoYixkKXtkP2NvbnNvbGUubG9nKCJQb2xsaW5nIGZvciBmaXJzdCBHcmFwaERlZiBmb3IgcnVuIGtleToiLGIpOnRoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsbnVsbCk7dmFyIGY9e21vZGU6InJldHJpZXZlX2FsbCIscnVuX2tleTpKU09OLnN0cmluZ2lmeShiKX07Y29uc3QgaD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvZ2F0ZWRfZ3JwYyIpO2Y9dmMuYWRkUGFyYW1zKGgsCmYpO2xldCBrPVtdO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZikudGhlbih0PT57aWYoMD09dC5kZXZpY2VfbmFtZXMubGVuZ3RoKWR8fHRoaXMuX3N0ZXAoKSx0aGlzLl9wcm9jZXNzR2F0ZWRHcnBjRGVidWdPcHMoYiwhMCk7ZWxzZXt2YXIgbD1udWxsO2Zvcihjb25zdCBwIGluIHQuZ2F0ZWRfZ3JwY190ZW5zb3JzKWlmKHQuZ2F0ZWRfZ3JwY190ZW5zb3JzLmhhc093blByb3BlcnR5KHApKXstMT09PXRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbYl0uaW5kZXhPZihwKSYmKHRoaXMuX3Nlc3Npb25SdW5LZXkyRGV2aWNlTmFtZXNbYl0ucHVzaChwKSx0aGlzLiQuc2Vzc2lvblJ1bnNWaWV3LnVwZGF0ZU51bURldmljZXModGhpcy5fc2Vzc2lvblJ1bktleTJEZXZpY2VOYW1lc1tiXS5sZW5ndGgpKTt0aGlzLnNldCgiX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzIix0aGlzLl9zZXNzaW9uUnVuS2V5MkRldmljZU5hbWVzW2JdLnNsaWNlKCkpO2w9dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXNbdGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMubGVuZ3RoLQoxXTtjb25zdCBtPXQuZ2F0ZWRfZ3JwY190ZW5zb3JzW3BdO2ZvcihsZXQgbj0wO248bS5sZW5ndGg7KytuKWsucHVzaCh7ZGV2aWNlX25hbWU6cCxub2RlX25hbWU6bVtuXVswXSxvcF90eXBlOm1bbl1bMV0sb3V0cHV0X3Nsb3Q6bVtuXVsyXSxkZWJ1Z19vcDptW25dWzNdfSl9bnVsbCE9bCYmKHRoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsbCksdD1Qb2x5bWVyLmRvbSh0aGlzLiQkKCIjYWN0aXZlLXJ1bnRpbWUtZ3JhcGgtZGV2aWNlLW5hbWUiKSksbnVsbCE9dCYmdC5zZXRBdHRyaWJ1dGUoInNlbGVjdGVkIixsKSk7Vmkuc29ydEFuZEJhc2VFeHBhbmREZWJ1Z1dhdGNoZXMoayk7dGhpcy5zZXQoIl9kZWJ1Z1dhdGNoZXMiLGspO3RoaXMuJC5zb3VyY2VDb2RlVmlldy5yZW5kZXIoayl9fSl9LF9jcmVhdGVEZWJ1Z1dhdGNoQ2hhbmdlSGFuZGxlcigpe3JldHVybihiLGQpPT57ZD1kPyJicmVhayI6ImRpc2FibGUiO3RoaXMuX3JlcXVlc3RCcmVha3BvaW50U3RhdGVDaGFuZ2UoVmkuZ2V0Q2xlYW5Ob2RlTmFtZShiLmRldmljZV9uYW1lKwoiLyIrYi5ub2RlX25hbWUpLGIub3V0cHV0X3Nsb3QsYi5kZWJ1Z19vcCxkKX19LF9mb2N1c09uR3JhcGhOb2RlKGIsZCl7bnVsbCE9YiYmdGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSE9PWImJnRoaXMuc2V0KCJfYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSIsYik7dGhpcy5fc2V0VG9wUmlnaHRSdW50aW1lR3JhcGhzVG9BY3RpdmUoKTtjb25zdCBmPXRoaXMuJCQoIiNncmFwaCIpO2lmKGYuc2VsZWN0ZWROb2RlPT09ZClmLnBhblRvTm9kZShkKTtlbHNle2NvbnN0IGg9Zi5nZXQoInJlbmRlckhpZXJhcmNoeSIpLmhpZXJhcmNoeS5nZXROb2RlTWFwKCk7bnVsbD09aFtkXSYmKGQ9VmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpKTtudWxsIT1oW2RdJiZmLnNldCgic2VsZWN0ZWROb2RlIixkKX10aGlzLnNldCgiX2hpZ2hsaWdodE5vZGVOYW1lIixiKyIvIitkKX0sX2NyZWF0ZU5vZGVDbGlja2VkSGFuZGxlcigpe3JldHVybihiLGQsZik9Pnt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJgohMCE9PWYmJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsVmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpKTt0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGIsZCk7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIixiKyIvIitkKX19LF9jcmVhdGVGZWVkRmV0Y2hUYXJnZXRDbGlja2VkSGFuZGxlcigpe3JldHVybiBiPT57bGV0IGQ9YjstMSE9PWQuaW5kZXhPZigiOiIpJiYoZD1kLnNsaWNlKDAsZC5pbmRleE9mKCI6IikpKTtiPV8uZmluZCh0aGlzLl9kZWJ1Z1dhdGNoZXMsZj0+Zi5ub2RlX25hbWU9PT1kfHwwPT09Zi5ub2RlX25hbWUuaW5kZXhPZihkKSYmIigiPT09Zi5ub2RlX25hbWVbZC5sZW5ndGhdKTtudWxsPT1iP3RoaXMuX3Nob3dUb2FzdCgiTm9kZSAnIitkKyInIGlzIG5vdCBpbiB0aGUgcnVudGltZSBncmFwaCBvZiB0aGUgY3VycmVudCBTZXNzaW9uLnJ1biBvciBkb2VzIG5vdCBoYXZlIGEgZGVidWcgb3AgYXR0YWNoZWQuIik6dGhpcy5fZm9jdXNPbkdyYXBoTm9kZShiLmRldmljZV9uYW1lLApkKX19LF9jcmVhdGVUZW5zb3JEYXRhRXhwYW5kSGFuZGxlcigpe3JldHVybiBiPT57dGhpcy5fc2V0VG9wUmlnaHRUZW5zb3JWYWx1ZXNUb0FjdGl2ZSgpO3NldFRpbWVvdXQoKCk9Pnt0aGlzLiQkKCIjdGVuc29yVmFsdWVNdWx0aVZpZXciKS5hZGRWaWV3KHt2aWV3SWQ6dGhpcy5fY3JlYXRlVGVuc29yVmlld0lkKCksZGV2aWNlTmFtZTpiLmRldmljZU5hbWUsdGVuc29yTmFtZTpiLnRlbnNvck5hbWUsbm9kZU5hbWU6Yi5ub2RlTmFtZSxtYXliZUJhc2VFeHBhbmRlZE5vZGVOYW1lOmIubWF5YmVCYXNlRXhwYW5kZWROb2RlTmFtZSxkZWJ1Z09wOmIuZGVidWdPcCxkdHlwZTpiLmR0eXBlLHNoYXBlOmIuc2hhcGUsc2xpY2luZzpWaS5nZXREZWZhdWx0U2xpY2luZyhiLnNoYXBlKSx0aW1lSW5kaWNlczoiLTEifSl9LDEwKX19LF9jcmVhdGVUZW5zb3JWaWV3SWQoKXtjb25zdCBiPSJkZWJ1Z2dlci10ZW5zb3Itdmlldy0iK3RoaXMuX3RlbnNvclZpZXdJZENvdW50ZXI7dGhpcy5fdGVuc29yVmlld0lkQ291bnRlcisrOwpyZXR1cm4gYn0sX2NyZWF0ZU5vZGVDb250ZXh0TWVudUl0ZW1zKCl7cmV0dXJuW3t0aXRsZTooKT0+IkV4cGFuZCBhbmQgaGlnaGxpZ2h0IixhY3Rpb246Yj0+e2NvbnN0IGQ9VmkuZ2V0Q2xlYW5Ob2RlTmFtZShiLm5vZGUubmFtZSk7Yj10aGlzLl9hY3RpdmVSdW50aW1lR3JhcGhEZXZpY2VOYW1lKyIvIitiLm5vZGUubmFtZTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLGIpO3RoaXMuc2V0KCJfaGlnaGxpZ2h0Tm9kZU5hbWUiLGIpO3RoaXMuX3NvdXJjZUNvZGVTaG93biYmdGhpcy5zZXQoIl9zb3VyY2VGb2N1c05vZGVOYW1lIixWaS5yZW1vdmVOb2RlTmFtZUJhc2VFeHBhbnNpb24oZCkpfX0se3RpdGxlOigpPT4iQWRkIGJyZWFrcG9pbnQiLGFjdGlvbjpiPT57Y29uc3QgZD1WaS5nZXRDbGVhbk5vZGVOYW1lKGIubm9kZS5uYW1lKTt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kQW5kQ2hlY2tOb2RlTmFtZSIsdGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSsKIi8iK2Iubm9kZS5uYW1lKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsVmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGQpKX19LHt0aXRsZTooKT0+IkNvbnRpbnVlIHRvIixhY3Rpb246Yj0+ey0xIT09WyJfQXJnIiwiX1JldHZhbCJdLmluZGV4T2YoYi5ub2RlLm9wKT90aGlzLl9zaG93VG9hc3QoJ0Nhbm5vdCBjb250aW51ZSB0byBub2RlICInK2Iubm9kZS5uYW1lKyciLCBkdWUgdG8gb3AgdHlwZSAiJytiLm5vZGUub3ArJyIuJyk6dGhpcy5fY29udGludWVUb05vZGUodGhpcy5fYWN0aXZlUnVudGltZUdyYXBoRGV2aWNlTmFtZSxiLm5vZGUubmFtZSl9fV19LF9jcmVhdGVHZXRIZWFsdGhQaWxsKCl7cmV0dXJuKGIsZCxmLGgpPT57dmFyIGs9e3dhdGNoX2tleTpiLHRpbWVfaW5kaWNlczoiLTEiLG1hcHBpbmc6ImhlYWx0aC1waWxsIn07Y29uc3QgdD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLAoiL3RlbnNvcl9kYXRhIik7az12Yy5hZGRQYXJhbXModCxrKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGspLnRoZW4obD0+e2w9bC50ZW5zb3JfZGF0YVswXTtoKGwpO3RoaXMuX2NvbmRpdGlvbmFsSGVhbHRoUGlsbFN0b3AoYixkLGYsbCl9KX19LF9jb25kaXRpb25hbEhlYWx0aFBpbGxTdG9wKGIsZCxmLGgpe2lmKCJUZW5zb3JDb25kaXRpb24iPT09dGhpcy5fY29udGludWVUb1R5cGUmJlZpLmNoZWNrSGVhbHRoUGlsbEFnYWluc3RUZW5zb3JDb25kaXRpb25LZXkodGhpcy5fY29udGludWVUb1RhcmdldCxoLHRoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0KSl7dGhpcy5zZXQoIl9jb250aW51ZVN0b3AiLCEwKTtoPVZpLnJlbW92ZU5vZGVOYW1lQmFzZUV4cGFuc2lvbihmKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsaCk7dGhpcy5fZm9jdXNPbkdyYXBoTm9kZShkLGYpO2NvbnN0IGs9ZCsiLyIrZjt0aGlzLnNldCgiX2ZvcmNlRXhwYW5kTm9kZU5hbWUiLAprKTtzZXRUaW1lb3V0KCgpPT57dGhpcy5zZXQoIl9oaWdobGlnaHROb2RlTmFtZSIsbnVsbCk7dGhpcy5zZXQoIl9oaWdobGlnaHROb2RlTmFtZSIsayl9LDEwMCk7dGhpcy5fc2hvd1RvYXN0KCdUZW5zb3IgY29uZGl0aW9uICInK3RoaXMuX2NvbnRpbnVlVG9UYXJnZXQrJyIgaXMgbWV0IGJ5IHdhdGNoIGtleTogIicrYisnIi5cblN0b3BwaW5nIGNvbnRpbnVhdGlvbi4nKX19LF9jb250aW51ZVRvTm9kZShiLGQpe2NvbnN0IGY9VmkuZ2V0Q2xlYW5Ob2RlTmFtZShkKTtiPWIrIi8iK2Q7dGhpcy5fcmVxdWVzdEJyZWFrcG9pbnRTdGF0ZUNoYW5nZShmLDAsIkRlYnVnSWRlbnRpdHkiLCJicmVhayIpO3RoaXMuc2V0KCJfZm9yY2VFeHBhbmRBbmRDaGVja05vZGVOYW1lIixiKTt0aGlzLl9zb3VyY2VDb2RlU2hvd24mJnRoaXMuc2V0KCJfc291cmNlRm9jdXNOb2RlTmFtZSIsVmkucmVtb3ZlTm9kZU5hbWVCYXNlRXhwYW5zaW9uKGYpKTt0aGlzLl9zZXRDb250aW51ZVRvKCJvcCIsYik7CnRoaXMuJC5jb250aW51ZURpYWxvZy51cGRhdGVDb250aW51ZUJ1dHRvblRleHQoITApO3RoaXMuX3N0ZXAoKX0sX2NyZWF0ZUNvbnRpbnVlVG9Ob2RlSGFuZGxlcigpe3JldHVybihiLGQpPT57dGhpcy5fY29udGludWVUb05vZGUoYixkKX19LF9vbkFjdGl2ZVJ1bnRpbWVHcmFwaERldmljZU5hbWVDaGFuZ2UoYil7Y29uc3QgZD1Qb2x5bWVyLmRvbSh0aGlzLiQkKCIjcnVudGltZS1ncmFwaC1kZXZpY2UtbmFtZSIpKTtpZigwPHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5EZXZpY2VzLmxlbmd0aCl7bGV0IGY7Zj1iKygiIChkZXZpY2UgIisodGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMuaW5kZXhPZihiKSsxKSsiIG9mICIrdGhpcy5fYWN0aXZlU2Vzc2lvblJ1bkRldmljZXMubGVuZ3RoKyIpIik7dGhpcy5faXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUmJm51bGwhPWQmJihkLnRleHRDb250ZW50PWYpfWVsc2UgdGhpcy5faXNUb3BSaWdodFJ1bnRpbWVHcmFwaHNBY3RpdmUmJgpudWxsIT1kJiYoZC50ZXh0Q29udGVudD0iV2FpdGluZyBmb3IgZGV2aWNlLi4uIik7bnVsbCE9YiYmdGhpcy5fZGlzcGxheUdyYXBoKHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXksYil9LF9zdGVwKCl7aWYobnVsbCE9dGhpcy5fYWN0aXZlU2Vzc2lvblJ1bktleSl7dGhpcy5zZXQoIl9idXN5IiwhMCk7dmFyIGI9e21vZGU6InJldHJpZXZlX2RldmljZV9uYW1lcyIscnVuX2tleTpKU09OLnN0cmluZ2lmeSh0aGlzLl9hY3RpdmVTZXNzaW9uUnVuS2V5KX0sZD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvZ2F0ZWRfZ3JwYyIpO2I9dmMuYWRkUGFyYW1zKGQsYik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGY9PntsZXQgaD0hMTtmb3IobGV0IGs9MDtrPGYuZGV2aWNlX25hbWVzLmxlbmd0aDsrK2spaWYoLTE9PT10aGlzLl9hY3RpdmVTZXNzaW9uUnVuRGV2aWNlcy5pbmRleE9mKGYuZGV2aWNlX25hbWVzW2tdKSl7aD0hMDticmVha31mPQp2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvYWNrIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChmKS50aGVuKCgpPT57aCYmdGhpcy5fcHJvY2Vzc0dhdGVkR3JwY0RlYnVnT3BzKHRoaXMuX2FjdGl2ZVNlc3Npb25SdW5LZXksITEpfSl9KX19LF9jcmVhdGVTZXNzaW9uUnVuR28oKXtyZXR1cm4gYj0+e3RoaXMuX3NldENvbnRpbnVlVG8oIlNlc3Npb25SdW4iLHRoaXMuX2N1cnJlbnRTZXNzaW9uUnVuSW5mbyxiKTt0aGlzLl9zdGVwKCl9fSxfY3JlYXRlVGVuc29yQ29uZGl0aW9uR28oKXtyZXR1cm4oYixkKT0+e3RoaXMuX3NldENvbnRpbnVlVG8oIlRlbnNvckNvbmRpdGlvbiIsYixkKTt0aGlzLiQudGVuc29yRGF0YVN1bW1hcnkuZW5hYmxlSGVhbHRoUGlsbHMoKTt0aGlzLl9zdGVwKCl9fSxfY3JlYXRlRm9yY2VDb250aW51YXRpb25TdG9wKCl7cmV0dXJuKCk9Pnt0aGlzLl9zaG93VG9hc3QoJ0NvbnRpbnVhdGlvbiBvZiB0eXBlICInK3RoaXMuX2NvbnRpbnVlVG9UeXBlKwonIiB3YXMgaW50ZXJydXB0ZWQgYnkgdXNlci4nKTt0aGlzLnNldCgiX2NvbnRpbnVlU3RvcCIsITApfX0sX3NldENvbnRpbnVlVG8oYixkLGY9LTEpe3RoaXMuX2NvbnRpbnVlVG9UeXBlPWI7dGhpcy5fY29udGludWVUb1RhcmdldD1kO3RoaXMuX2NvbnRpbnVlVG9Db3VudGVyVGFyZ2V0PWY7dGhpcy5fY29udGludWVUb0NvdW50ZXI9MDt0aGlzLl9jb250aW51ZVN0b3A9ITF9LF9jbGVhckNvbnRpbnVlVG8oKXt0aGlzLiQuY29udGludWVEaWFsb2cubm90aWZ5Q29udGludWF0aW9uU3RvcCgpO3RoaXMuX2NvbnRpbnVlVG9UYXJnZXQ9dGhpcy5fY29udGludWVUb1R5cGU9IiI7dGhpcy5fY29udGludWVUb0NvdW50ZXJUYXJnZXQ9LTE7dGhpcy5fY29udGludWVUb0NvdW50ZXI9MDt0aGlzLl9jb250aW51ZVN0b3A9ITE7dGhpcy5zZXQoIl9idXN5IiwhMSl9LF9jcmVhdGVDb250aW51ZVRvQ2FsbGJhY2soKXtyZXR1cm4oYixkKT0+e3RoaXMuX3NldENvbnRpbnVlVG8oIm9wIixiKyIvIisKZCk7dGhpcy5fc3RlcCgpO3RoaXMuX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlJiZ0aGlzLl9mb2N1c09uR3JhcGhOb2RlKGIsZCk7dGhpcy5zZXQoIl9mb3JjZUV4cGFuZE5vZGVOYW1lIixiKyIvIitkKX19LF90b3BSaWdodFNlbGVjdGVkQ2hhbmdlZChiKXtiPXRoaXMuX3RvcFJpZ2h0VGFic1tiXS5pZDt0aGlzLnNldCgiX2lzVG9wUmlnaHRSdW50aW1lR3JhcGhzQWN0aXZlIiwidGFiLXJ1bnRpbWUtZ3JhcGhzIj09PWIpO3RoaXMuc2V0KCJfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZSIsInRhYi10ZW5zb3ItdmFsdWVzIj09PWIpfSxfc2V0VG9wUmlnaHRSdW50aW1lR3JhcGhzVG9BY3RpdmUoKXt0aGlzLnNldCgiX3RvcFJpZ2h0U2VsZWN0ZWQiLCIwIik7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSIsITApO3RoaXMuc2V0KCJfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZSIsITEpfSxfc2V0VG9wUmlnaHRUZW5zb3JWYWx1ZXNUb0FjdGl2ZSgpe3RoaXMuc2V0KCJfdG9wUmlnaHRTZWxlY3RlZCIsCiIxIik7dGhpcy5zZXQoIl9pc1RvcFJpZ2h0UnVudGltZUdyYXBoc0FjdGl2ZSIsITEpO3RoaXMuc2V0KCJfaXNUb3BSaWdodFRlbnNvclZhbHVlc0FjdGl2ZSIsITApfSxfcmVxdWVzdEJyZWFrcG9pbnRTdGF0ZUNoYW5nZShiLGQsZixoKXtiPXttb2RlOiJzZXRfc3RhdGUiLG5vZGVfbmFtZTpiLG91dHB1dF9zbG90OmQsZGVidWdfb3A6ZixzdGF0ZTpofTtkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9nYXRlZF9ncnBjIik7Yj12Yy5hZGRQYXJhbXMoZCxiKTt0aGlzLnNldCgiX2J1c3kiLCEwKTt0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oaz0+e3RoaXMuc2V0KCJfYnVzeSIsITEpO2NvbnNvbGUubG9nKCJCcmVha3BvaW50IHNldF9zdGF0ZSByZXNwb25zZTogIixrKX0pfSxfZ3JhcGhQcm9ncmVzc1VwZGF0ZWQoYil7Y29uc3QgZD10aGlzLiQkKCIjdG9wLXJpZ2h0LXByb2dyZXNzLWJhciIpO251bGw9PXRoaXMuX2xhdGVzdFNlc3Npb25SdW4/CihkLnNldEF0dHJpYnV0ZSgidmFsdWUiLDApLHRoaXMuc2V0KCJfYnVzeSIsITEpKTooZC5zZXRBdHRyaWJ1dGUoInZhbHVlIixiLnZhbHVlKSx0aGlzLnNldCgiX2J1c3kiLDEwMD5iLnZhbHVlKSl9LF9oYW5kbGVXaW5kb3dSZXNpemUoKXt0aGlzLnNldCgiX3dpbmRvd1dpZHRoIixIaygpKTt0aGlzLnNldCgiX3dpbmRvd0hlaWdodCIsWmkoKSk7dGhpcy5fc2l6ZURhc2hib2FyZFJlZ2lvbnModGhpcy5fbGVmdFBhbmVXaWR0aCx0aGlzLl90b3BSaWdodFF1YWRyYW50SGVpZ2h0LHRoaXMuX3dpbmRvd1dpZHRoKX0sX2NvbXB1dGVNYXhsZWZ0UGFuZVdpZHRoKGIsZCxmKXtyZXR1cm4gYi1kLWZ9LF9jb21wdXRlTWF4VG9wUmlnaHRRdWFkcmFudEhlaWdodChiLGQpe3JldHVybiBiLWQtNzB9LF9zaXplRGFzaGJvYXJkUmVnaW9ucyhiLGQsZil7dGhpcy4kJCgiI2xlZnQtcGFuZSIpLnN0eWxlLndpZHRoPWIrInB4IjtiPWYtYi10aGlzLl9yZXNpemVyV2lkdGgtODt0aGlzLiQkKCIjY2VudGVyLWNvbnRlbnQiKS5zdHlsZS53aWR0aD0KYisicHgiO2I9ZC10aGlzLl9yZXNpemVyV2lkdGg7dGhpcy4kJCgiI3RvcC1yaWdodC1xdWFkcmFudCIpLnN0eWxlLmhlaWdodD1iKyJweCI7dGhpcy4kJCgiI3RlbnNvci1kYXRhIikuc3R5bGUudG9wPWQrInB4In0sX2xlZnRQYW5lV2lkdGhPYnNlcnZlcjpwZC5nZXROdW1iZXJPYnNlcnZlcigiX2xlZnRQYW5lV2lkdGgiLHtkZWZhdWx0VmFsdWU6NDUwfSksX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHRPYnNlcnZlcjpwZC5nZXROdW1iZXJPYnNlcnZlcigiX3RvcFJpZ2h0UXVhZHJhbnRIZWlnaHQiLHtkZWZhdWx0VmFsdWU6SWt9KX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLW1hdGVyaWFsL3BhcGVyLW1hdGVyaWFsLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLW1hdGVyaWFsIixwcm9wZXJ0aWVzOntlbGV2YXRpb246e3R5cGU6TnVtYmVyLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZToxfSxhbmltYXRlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMX19fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkL3RmLWdyYXBoLWRlYnVnZ2VyLWRhdGEtY2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQiLHByb3BlcnRpZXM6e3JlbmRlckhpZXJhcmNoeTpPYmplY3QsZGVidWdnZXJOdW1lcmljQWxlcnRzOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sbm9kZU5hbWVzVG9IZWFsdGhQaWxsczpPYmplY3QsaGVhbHRoUGlsbFN0ZXBJbmRleDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxzcGVjaWZpY0hlYWx0aFBpbGxTdGVwOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sc2VsZWN0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LGhpZ2hsaWdodGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxzZWxlY3RlZE5vZGVJbmNsdWRlOnt0eXBlOk51bWJlcixub3RpZnk6ITB9LGFyZUhlYWx0aFBpbGxzTG9hZGluZzpCb29sZWFuLGhlYWx0aFBpbGxFbnRyaWVzOnt0eXBlOkFycmF5LHZhbHVlOnRmLmdyYXBoLnNjZW5lLmhlYWx0aFBpbGxFbnRyaWVzLHJlYWRPbmx5OiEwfSxoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlOnt0eXBlOkFycmF5LApjb21wdXRlZDoiX2NvbXB1dGVIZWFsdGhQaWxsRm9yTm9kZShub2RlTmFtZXNUb0hlYWx0aFBpbGxzLCBoZWFsdGhQaWxsU3RlcEluZGV4LCBzZWxlY3RlZE5vZGUsIGFsbFN0ZXBzTW9kZUVuYWJsZWQsIGFyZUhlYWx0aFBpbGxzTG9hZGluZykifSxhbGxTdGVwc01vZGVFbmFibGVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSxfYmlnZ2VzdFN0ZXBFdmVyU2Vlbjp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlQmlnZ2VzdFN0ZXBFdmVyU2Vlbihub2RlTmFtZXNUb0hlYWx0aFBpbGxzKSJ9LF9tYXhTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU1heFN0ZXBJbmRleChub2RlTmFtZXNUb0hlYWx0aFBpbGxzKSJ9LF9jdXJyZW50U3RlcERpc3BsYXlWYWx1ZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlQ3VycmVudFN0ZXBEaXNwbGF5VmFsdWUobm9kZU5hbWVzVG9IZWFsdGhQaWxscywgaGVhbHRoUGlsbFN0ZXBJbmRleCwgYWxsU3RlcHNNb2RlRW5hYmxlZCwgc3BlY2lmaWNIZWFsdGhQaWxsU3RlcCwgYXJlSGVhbHRoUGlsbHNMb2FkaW5nKSJ9fSwKb2JzZXJ2ZXJzOlsiX3VwZGF0ZUFsZXJ0c0xpc3QoZGVidWdnZXJOdW1lcmljQWxlcnRzKSJdLHJlYWR5OmZ1bmN0aW9uKCl7dmFyIGI9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5Db250YWluZXIiKSxkPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInRmLWRhc2hib2FyZC1sYXlvdXQgLnNjcm9sbGJhciIpO2ImJmQmJihiLnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGQuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpfSxfaGVhbHRoUGlsbHNBdmFpbGFibGU6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYiYmZH0sX2NvbXB1dGVUZW5zb3JDb3VudFN0cmluZzpmdW5jdGlvbihiLGQpe3JldHVybiBiP2JbZF0udG9GaXhlZCgwKToiIn0sX2NvbXB1dGVIZWFsdGhQaWxsRm9yTm9kZTpmdW5jdGlvbihiLGQsZixoLGspe2lmKGt8fCFmKXJldHVybiBudWxsO2I9YltmXTtyZXR1cm4gYj8oZD1iW2g/MDpkXSk/ZC52YWx1ZS5zbGljZSgyLDgpOm51bGw6bnVsbH0sX2NvbXB1dGVDdXJyZW50U3RlcERpc3BsYXlWYWx1ZTpmdW5jdGlvbihiLApkLGYsaCxrKXtpZihmKXJldHVybiBoLnRvRml4ZWQoMCk7aWYoaylyZXR1cm4gMDtmb3IobGV0IHQgaW4gYilyZXR1cm4gYlt0XVtkXS5zdGVwLnRvRml4ZWQoMCk7cmV0dXJuIDB9LF9jb21wdXRlQmlnZ2VzdFN0ZXBFdmVyU2VlbjpmdW5jdGlvbihiKXtmb3IobGV0IGQgaW4gYilyZXR1cm4gYj1iW2RdLE1hdGgubWF4KHRoaXMuX2JpZ2dlc3RTdGVwRXZlclNlZW4sYltiLmxlbmd0aC0xXS5zdGVwKTtyZXR1cm4gdGhpcy5fYmlnZ2VzdFN0ZXBFdmVyU2Vlbnx8MH0sX2NvbXB1dGVNYXhTdGVwSW5kZXg6ZnVuY3Rpb24oYil7Zm9yKGxldCBkIGluIGIpcmV0dXJuIGJbZF0ubGVuZ3RoLTE7cmV0dXJuIDB9LF9oYXNEZWJ1Z2dlck51bWVyaWNBbGVydHM6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIubGVuZ3RofSxfdXBkYXRlQWxlcnRzTGlzdDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLiQkKCIjbnVtZXJpYy1hbGVydHMtYm9keSIpO2lmKGQpe2QuaW5uZXJIVE1MPSIiO2Zvcih2YXIgZj0KMDtmPGIubGVuZ3RoO2YrKyl7dmFyIGg9YltmXSxrPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIiksdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO3QuaW5uZXJIVE1MPXRmLmdyYXBoLnV0aWwuY29tcHV0ZUh1bWFuRnJpZW5kbHlUaW1lKGguZmlyc3RfdGltZXN0YW1wKTt0LmNsYXNzTGlzdC5hZGQoImZpcnN0LW9mZmVuc2UtdGQiKTtrLmFwcGVuZENoaWxkKHQpO3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGQiKTt0LmNsYXNzTGlzdC5hZGQoInRlbnNvci1kZXZpY2UtdGQiKTt2YXIgbD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoInRlbnNvci1zZWN0aW9uLXdpdGhpbi10YWJsZSIpO2wuaW5uZXJIVE1MPWgudGVuc29yX25hbWU7dGhpcy5fYWRkT3BFeHBhbnNpb25MaXN0ZW5lcihsLGgudGVuc29yX25hbWUpO3QuYXBwZW5kQ2hpbGQobCk7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtsLmNsYXNzTGlzdC5hZGQoImRldmljZS1zZWN0aW9uLXdpdGhpbi10YWJsZSIpOwpsLmlubmVySFRNTD0iKCIraC5kZXZpY2VfbmFtZSsiKSI7dC5hcHBlbmRDaGlsZChsKTtrLmFwcGVuZENoaWxkKHQpO3Q9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC5jbGFzc0xpc3QuYWRkKCJtaW5pLWhlYWx0aC1waWxsIik7bD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO2wuY2xhc3NMaXN0LmFkZCgibWluaS1oZWFsdGgtcGlsbC10ZCIpO2wuYXBwZW5kQ2hpbGQodCk7ay5hcHBlbmRDaGlsZChsKTtoLm5lZ19pbmZfZXZlbnRfY291bnQmJihsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGwuY2xhc3NMaXN0LmFkZCgibmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLGwuaW5uZXJIVE1MPWgubmVnX2luZl9ldmVudF9jb3VudCxsLnNldEF0dHJpYnV0ZSgidGl0bGUiLGgubmVnX2luZl9ldmVudF9jb3VudCsiIGV2ZW50cyB3aXRoIC1cdTIyMWUiKSx0LmFwcGVuZENoaWxkKGwpKTtoLnBvc19pbmZfZXZlbnRfY291bnQmJihsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLApsLmNsYXNzTGlzdC5hZGQoInBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24iKSxsLmlubmVySFRNTD1oLnBvc19pbmZfZXZlbnRfY291bnQsbC5zZXRBdHRyaWJ1dGUoInRpdGxlIixoLnBvc19pbmZfZXZlbnRfY291bnQrIiBldmVudHMgd2l0aCArXHUyMjFlIiksdC5hcHBlbmRDaGlsZChsKSk7aC5uYW5fZXZlbnRfY291bnQmJihsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLGwuY2xhc3NMaXN0LmFkZCgibmFuLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLGwuaW5uZXJIVE1MPWgubmFuX2V2ZW50X2NvdW50LGwuc2V0QXR0cmlidXRlKCJ0aXRsZSIsaC5uYW5fZXZlbnRfY291bnQrIiBldmVudHMgd2l0aCBOYU4iKSx0LmFwcGVuZENoaWxkKGwpKTtQb2x5bWVyLmRvbShkKS5hcHBlbmRDaGlsZChrKX19fSxfYWRkT3BFeHBhbnNpb25MaXN0ZW5lcjpmdW5jdGlvbihiLGQpe2IuYWRkRXZlbnRMaXN0ZW5lcigiY2xpY2siLCgpPT57dmFyIGY9dGYuZ3JhcGgucmVuZGVyLmV4cGFuZFVudGlsTm9kZUlzU2hvd24odGhpcy5yZW5kZXJIaWVyYXJjaHksCmQpLGgsaz1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJ0Zi1ncmFwaC1pbmZvI2dyYXBoLWluZm8iKTtrJiYoaD1rLnNjcm9sbEhlaWdodC1rLnNjcm9sbFRvcCk7dmFyIHQ9dGhpcy5zZWxlY3RlZE5vZGU7dGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsZik7Zj0oKT0+e2suc2Nyb2xsVG9wPWsuc2Nyb2xsSGVpZ2h0LWh9O2smJih0P2YoKTp3aW5kb3cuc2V0VGltZW91dChmLDIwKSl9KX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1zY3JvbGwtdGFyZ2V0LWJlaGF2aW9yL2lyb24tc2Nyb2xsLXRhcmdldC1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvblNjcm9sbFRhcmdldEJlaGF2aW9yPXtwcm9wZXJ0aWVzOntzY3JvbGxUYXJnZXQ6e3R5cGU6SFRNTEVsZW1lbnQsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGVmYXVsdFNjcm9sbFRhcmdldH19fSxvYnNlcnZlcnM6WyJfc2Nyb2xsVGFyZ2V0Q2hhbmdlZChzY3JvbGxUYXJnZXQsIGlzQXR0YWNoZWQpIl0sX3Nob3VsZEhhdmVMaXN0ZW5lcjohMCxfc2Nyb2xsVGFyZ2V0Q2hhbmdlZDpmdW5jdGlvbihiLGQpe3RoaXMuX29sZFNjcm9sbFRhcmdldCYmKHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKCExLHRoaXMuX29sZFNjcm9sbFRhcmdldCksdGhpcy5fb2xkU2Nyb2xsVGFyZ2V0PW51bGwpO2QmJigiZG9jdW1lbnQiPT09Yj90aGlzLnNjcm9sbFRhcmdldD10aGlzLl9kb2M6InN0cmluZyI9PT10eXBlb2YgYj90aGlzLnNjcm9sbFRhcmdldD0oZD10aGlzLmRvbUhvc3QpJiZkLiQ/ZC4kW2JdOlBvbHltZXIuZG9tKHRoaXMub3duZXJEb2N1bWVudCkucXVlcnlTZWxlY3RvcigiIyIrCmIpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuX29sZFNjcm9sbFRhcmdldD1iLHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKHRoaXMuX3Nob3VsZEhhdmVMaXN0ZW5lcixiKSkpfSxfc2Nyb2xsSGFuZGxlcjpmdW5jdGlvbigpe30sZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXMuX2RvY30sZ2V0IF9kb2MoKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmRvY3VtZW50RWxlbWVudH0sZ2V0IF9zY3JvbGxUb3AoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpP3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5wYWdlWU9mZnNldDp0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A6MH0sZ2V0IF9zY3JvbGxMZWZ0KCl7cmV0dXJuIHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKT90aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cucGFnZVhPZmZzZXQ6dGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdDoKMH0sc2V0IF9zY3JvbGxUb3AoYil7dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnNjcm9sbFRvKHdpbmRvdy5wYWdlWE9mZnNldCxiKTp0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkmJih0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9Yil9LHNldCBfc2Nyb2xsTGVmdChiKXt0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuc2Nyb2xsVG8oYix3aW5kb3cucGFnZVlPZmZzZXQpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9Yil9LHNjcm9sbDpmdW5jdGlvbihiLGQpe3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5zY3JvbGxUbyhiLGQpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9Yix0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9ZCl9LGdldCBfc2Nyb2xsVGFyZ2V0V2lkdGgoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpPwp0aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuaW5uZXJXaWR0aDp0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRXaWR0aDowfSxnZXQgX3Njcm9sbFRhcmdldEhlaWdodCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LmlubmVySGVpZ2h0OnRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodDowfSxfaXNWYWxpZFNjcm9sbFRhcmdldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNjcm9sbFRhcmdldCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50fSxfdG9nZ2xlU2Nyb2xsTGlzdGVuZXI6ZnVuY3Rpb24oYixkKXtkPWQ9PT10aGlzLl9kb2M/d2luZG93OmQ7Yj90aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXJ8fCh0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXI9dGhpcy5fc2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpLGQuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIpKToKdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyJiYoZC5yZW1vdmVFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlciksdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyPW51bGwpfSx0b2dnbGVTY3JvbGxMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLl9zaG91bGRIYXZlTGlzdGVuZXI9Yjt0aGlzLl90b2dnbGVTY3JvbGxMaXN0ZW5lcihiLHRoaXMuc2Nyb2xsVGFyZ2V0KX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tbGlzdC9pcm9uLWxpc3QuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pLGQ9YiYmODw9YlsxXSxmPW51bGwhPVBvbHltZXIuZmx1c2gsaD1mP1BvbHltZXIuQXN5bmMuYW5pbWF0aW9uRnJhbWU6MCxrPWY/UG9seW1lci5Bc3luYy5pZGxlUGVyaW9kOjEsdD1mP1BvbHltZXIuQXN5bmMubWljcm9UYXNrOjI7UG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3J8fChQb2x5bWVyLk9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvcj17fSk7UG9seW1lcih7aXM6Imlyb24tbGlzdCIscHJvcGVydGllczp7aXRlbXM6e3R5cGU6QXJyYXl9LGFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXRlbSJ9LGluZGV4QXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpbmRleCJ9LHNlbGVjdGVkQXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJzZWxlY3RlZCJ9LGdyaWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsCm9ic2VydmVyOiJfZ3JpZENoYW5nZWQifSxzZWxlY3Rpb25FbmFibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxzZWxlY3RlZEl0ZW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LG11bHRpU2VsZWN0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MH19LG9ic2VydmVyczpbIl9pdGVtc0NoYW5nZWQoaXRlbXMuKikiLCJfc2VsZWN0aW9uRW5hYmxlZENoYW5nZWQoc2VsZWN0aW9uRW5hYmxlZCkiLCJfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkKG11bHRpU2VsZWN0aW9uKSIsIl9zZXRPdmVyZmxvdyhzY3JvbGxUYXJnZXQsIHNjcm9sbE9mZnNldCkiXSxiZWhhdmlvcnM6W1BvbHltZXIuVGVtcGxhdGl6ZXIsUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JdLApfcmF0aW86LjUsX3Njcm9sbGVyUGFkZGluZ1RvcDowLF9zY3JvbGxQb3NpdGlvbjowLF9waHlzaWNhbFNpemU6MCxfcGh5c2ljYWxBdmVyYWdlOjAsX3BoeXNpY2FsQXZlcmFnZUNvdW50OjAsX3BoeXNpY2FsVG9wOjAsX3ZpcnR1YWxDb3VudDowLF9lc3RTY3JvbGxIZWlnaHQ6MCxfc2Nyb2xsSGVpZ2h0OjAsX3ZpZXdwb3J0SGVpZ2h0OjAsX3ZpZXdwb3J0V2lkdGg6MCxfcGh5c2ljYWxJdGVtczpudWxsLF9waHlzaWNhbFNpemVzOm51bGwsX2ZpcnN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2NvbGxlY3Rpb246bnVsbCxfbGFzdFZpc2libGVJbmRleFZhbDpudWxsLF9tYXhQYWdlczoyLF9mb2N1c2VkSXRlbTpudWxsLF9mb2N1c2VkVmlydHVhbEluZGV4Oi0xLF9mb2N1c2VkUGh5c2ljYWxJbmRleDotMSxfb2Zmc2NyZWVuRm9jdXNlZEl0ZW06bnVsbCxfZm9jdXNCYWNrZmlsbEl0ZW06bnVsbCxfaXRlbXNQZXJSb3c6MSxfaXRlbVdpZHRoOjAsX3Jvd0hlaWdodDowLF90ZW1wbGF0ZUNvc3Q6MCwKX3BhcmVudE1vZGVsOiEwLGdldCBfcGh5c2ljYWxCb3R0b20oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fcGh5c2ljYWxTaXplfSxnZXQgX3Njcm9sbEJvdHRvbSgpe3JldHVybiB0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF92aXJ0dWFsRW5kKCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTF9LGdldCBfaGlkZGVuQ29udGVudFNpemUoKXtyZXR1cm4odGhpcy5ncmlkP3RoaXMuX3BoeXNpY2FsUm93cyp0aGlzLl9yb3dIZWlnaHQ6dGhpcy5fcGh5c2ljYWxTaXplKS10aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF9pdGVtc1BhcmVudCgpe3JldHVybiBQb2x5bWVyLmRvbShQb2x5bWVyLmRvbSh0aGlzLl91c2VyVGVtcGxhdGUpLnBhcmVudE5vZGUpfSxnZXQgX21heFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fdmlld3BvcnRIZWlnaHQrdGhpcy5fc2Nyb2xsT2Zmc2V0fSwKZ2V0IF9tYXhWaXJ0dWFsU3RhcnQoKXt2YXIgbD10aGlzLl9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93KHRoaXMuX3ZpcnR1YWxDb3VudCk7cmV0dXJuIE1hdGgubWF4KDAsbC10aGlzLl9waHlzaWNhbENvdW50KX0sc2V0IF92aXJ0dWFsU3RhcnQobCl7bD10aGlzLl9jbGFtcChsLDAsdGhpcy5fbWF4VmlydHVhbFN0YXJ0KTt0aGlzLmdyaWQmJihsLT1sJXRoaXMuX2l0ZW1zUGVyUm93KTt0aGlzLl92aXJ0dWFsU3RhcnRWYWw9bH0sZ2V0IF92aXJ0dWFsU3RhcnQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0VmFsfHwwfSxzZXQgX3BoeXNpY2FsU3RhcnQobCl7bCU9dGhpcy5fcGh5c2ljYWxDb3VudDswPmwmJihsPXRoaXMuX3BoeXNpY2FsQ291bnQrbCk7dGhpcy5ncmlkJiYobC09bCV0aGlzLl9pdGVtc1BlclJvdyk7dGhpcy5fcGh5c2ljYWxTdGFydFZhbD1sfSxnZXQgX3BoeXNpY2FsU3RhcnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTdGFydFZhbHx8MH0sZ2V0IF9waHlzaWNhbEVuZCgpe3JldHVybih0aGlzLl9waHlzaWNhbFN0YXJ0Kwp0aGlzLl9waHlzaWNhbENvdW50LTEpJXRoaXMuX3BoeXNpY2FsQ291bnR9LHNldCBfcGh5c2ljYWxDb3VudChsKXt0aGlzLl9waHlzaWNhbENvdW50VmFsPWx9LGdldCBfcGh5c2ljYWxDb3VudCgpe3JldHVybiB0aGlzLl9waHlzaWNhbENvdW50VmFsfHwwfSxnZXQgX29wdFBoeXNpY2FsU2l6ZSgpe3JldHVybiAwPT09dGhpcy5fdmlld3BvcnRIZWlnaHQ/SW5maW5pdHk6dGhpcy5fdmlld3BvcnRIZWlnaHQqdGhpcy5fbWF4UGFnZXN9LGdldCBfaXNWaXNpYmxlKCl7cmV0dXJuISghdGhpcy5vZmZzZXRXaWR0aCYmIXRoaXMub2Zmc2V0SGVpZ2h0KX0sZ2V0IGZpcnN0VmlzaWJsZUluZGV4KCl7dmFyIGw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09bCl7dmFyIHA9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPWw9dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKG0sbil7cCs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG0pOwppZihwPnRoaXMuX3Njcm9sbFBvc2l0aW9uKXJldHVybiB0aGlzLmdyaWQ/bi1uJXRoaXMuX2l0ZW1zUGVyUm93Om47aWYodGhpcy5ncmlkJiZ0aGlzLl92aXJ0dWFsQ291bnQtMT09PW4pcmV0dXJuIG4tbiV0aGlzLl9pdGVtc1BlclJvd30pfHwwfXJldHVybiBsfSxnZXQgbGFzdFZpc2libGVJbmRleCgpe3ZhciBsPXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09bCl7aWYodGhpcy5ncmlkKWw9TWF0aC5taW4odGhpcy5fdmlydHVhbENvdW50LHRoaXMuZmlyc3RWaXNpYmxlSW5kZXgrdGhpcy5fZXN0Um93c0luVmlldyp0aGlzLl9pdGVtc1BlclJvdy0xKTtlbHNle3ZhciBwPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSxuKXtwPHRoaXMuX3Njcm9sbEJvdHRvbSYmKGw9bik7cCs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KG0pfSl9dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1sfXJldHVybiBsfSwKZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXN9LGdldCBfdmlydHVhbFJvd0NvdW50KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aXJ0dWFsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpfSxnZXQgX2VzdFJvd3NJblZpZXcoKXtyZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3ZpZXdwb3J0SGVpZ2h0L3RoaXMuX3Jvd0hlaWdodCl9LGdldCBfcGh5c2ljYWxSb3dzKCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9zY3JvbGxPZmZzZXQoKXtyZXR1cm4gdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wK3RoaXMuc2Nyb2xsT2Zmc2V0fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2RpZEZvY3VzLmJpbmQodGhpcyksITApfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsaCk7dGhpcy5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLAoiX3Jlc2l6ZUhhbmRsZXIiKTt0aGlzLmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51bmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsIl9yZXNpemVIYW5kbGVyIik7dGhpcy51bmxpc3Rlbih0aGlzLCJrZXlkb3duIiwiX2tleWRvd25IYW5kbGVyIil9LF9zZXRPdmVyZmxvdzpmdW5jdGlvbihsKXt0aGlzLnN0eWxlLndlYmtpdE92ZXJmbG93U2Nyb2xsaW5nPWw9PT10aGlzPyJ0b3VjaCI6IiI7dGhpcy5zdHlsZS5vdmVyZmxvd1k9bD09PXRoaXM/ImF1dG8iOiIiO3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpfSx1cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXM6ZnVuY3Rpb24oKXt2YXIgbD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3A9CnRoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcz8wOnBhcnNlSW50KGxbInBhZGRpbmctdG9wIl0sMTApO3RoaXMuX2lzUlRMPSJydGwiPT09bC5kaXJlY3Rpb247dGhpcy5fdmlld3BvcnRXaWR0aD10aGlzLiQuaXRlbXMub2Zmc2V0V2lkdGg7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0O3RoaXMuZ3JpZCYmdGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKX0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgbD1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuX21heFNjcm9sbFRvcCx0aGlzLl9zY3JvbGxUb3ApKSxwPWwtdGhpcy5fc2Nyb2xsUG9zaXRpb24sbT0wPD1wO3RoaXMuX3Njcm9sbFBvc2l0aW9uPWw7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsO01hdGguYWJzKHApPnRoaXMuX3BoeXNpY2FsU2l6ZSYmMDx0aGlzLl9waHlzaWNhbFNpemU/KHAtPXRoaXMuX3Njcm9sbE9mZnNldCxtPU1hdGgucm91bmQocC8KdGhpcy5fcGh5c2ljYWxBdmVyYWdlKSp0aGlzLl9pdGVtc1BlclJvdyx0aGlzLl92aXJ0dWFsU3RhcnQrPW0sdGhpcy5fcGh5c2ljYWxTdGFydCs9bSx0aGlzLl9waHlzaWNhbFRvcD1NYXRoLmZsb29yKHRoaXMuX3ZpcnR1YWxTdGFydC90aGlzLl9pdGVtc1BlclJvdykqdGhpcy5fcGh5c2ljYWxBdmVyYWdlLHRoaXMuX3VwZGF0ZSgpKTowPHRoaXMuX3BoeXNpY2FsQ291bnQmJihsPXRoaXMuX2dldFJldXNhYmxlcyhtKSxtPyh0aGlzLl9waHlzaWNhbFRvcD1sLnBoeXNpY2FsVG9wLHRoaXMuX3ZpcnR1YWxTdGFydCs9bC5pbmRleGVzLmxlbmd0aCx0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sLmluZGV4ZXMubGVuZ3RoKToodGhpcy5fdmlydHVhbFN0YXJ0LT1sLmluZGV4ZXMubGVuZ3RoLHRoaXMuX3BoeXNpY2FsU3RhcnQtPWwuaW5kZXhlcy5sZW5ndGgpLHRoaXMuX3VwZGF0ZShsLmluZGV4ZXMsbT9udWxsOmwuaW5kZXhlcyksdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsCnRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcywwKSx0KSl9LF9nZXRSZXVzYWJsZXM6ZnVuY3Rpb24obCl7dmFyIHA9W10sbT10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSp0aGlzLl9yYXRpbyxuPXRoaXMuX3ZpcnR1YWxTdGFydCxxPXRoaXMuX3ZpcnR1YWxFbmQsdT10aGlzLl9waHlzaWNhbENvdW50LHg9dGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0O3ZhciBBPXRoaXMuX3BoeXNpY2FsQm90dG9tK3RoaXMuX3Njcm9sbE9mZnNldDt2YXIgeT10aGlzLl9zY3JvbGxUb3Asdz10aGlzLl9zY3JvbGxCb3R0b207aWYobCl7dmFyIEM9dGhpcy5fcGh5c2ljYWxTdGFydDtBPXkteH1lbHNlIEM9dGhpcy5fcGh5c2ljYWxFbmQsQS09dztmb3IoOzspe3ZhciBHPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChDKTtBLT1HO2lmKHAubGVuZ3RoPj11fHxBPD1tKWJyZWFrO2lmKGwpe2lmKHErcC5sZW5ndGgrMT49dGhpcy5fdmlydHVhbENvdW50KWJyZWFrOwppZih4K0c+PXktdGhpcy5fc2Nyb2xsT2Zmc2V0KWJyZWFrO3AucHVzaChDKTt4Kz1HO0M9KEMrMSkldX1lbHNle2lmKDA+PW4tcC5sZW5ndGgpYnJlYWs7aWYoeCt0aGlzLl9waHlzaWNhbFNpemUtRzw9dylicmVhaztwLnB1c2goQyk7eC09RztDPTA9PT1DP3UtMTpDLTF9fXJldHVybntpbmRleGVzOnAscGh5c2ljYWxUb3A6eC10aGlzLl9zY3JvbGxPZmZzZXR9fSxfdXBkYXRlOmZ1bmN0aW9uKGwscCl7aWYoIShsJiYwPT09bC5sZW5ndGh8fDA9PT10aGlzLl9waHlzaWNhbENvdW50KSl7dGhpcy5fbWFuYWdlRm9jdXMoKTt0aGlzLl9hc3NpZ25Nb2RlbHMobCk7dGhpcy5fdXBkYXRlTWV0cmljcyhsKTtpZihwKWZvcig7cC5sZW5ndGg7KWw9cC5wb3AoKSx0aGlzLl9waHlzaWNhbFRvcC09dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGwpO3RoaXMuX3Bvc2l0aW9uSXRlbXMoKTt0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKX19LF9jcmVhdGVQb29sOmZ1bmN0aW9uKGwpe3RoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCk7CnZhciBwLG09QXJyYXkobCk7Zm9yKHA9MDtwPGw7cCsrKXt2YXIgbj10aGlzLnN0YW1wKG51bGwpO21bcF09bi5yb290LnF1ZXJ5U2VsZWN0b3IoIioiKTt0aGlzLl9pdGVtc1BhcmVudC5hcHBlbmRDaGlsZChuLnJvb3QpfXJldHVybiBtfSxfaXNDbGllbnRGdWxsOmZ1bmN0aW9uKCl7cmV0dXJuIDAhPXRoaXMuX3Njcm9sbEJvdHRvbSYmdGhpcy5fcGh5c2ljYWxCb3R0b20tMT49dGhpcy5fc2Nyb2xsQm90dG9tJiZ0aGlzLl9waHlzaWNhbFRvcDw9dGhpcy5fc2Nyb2xsUG9zaXRpb259LF9pbmNyZWFzZVBvb2xJZk5lZWRlZDpmdW5jdGlvbihsKXtsPXRoaXMuX2NsYW1wKHRoaXMuX3BoeXNpY2FsQ291bnQrbCwzLHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQpO2w9dGhpcy5fY29udmVydEluZGV4VG9Db21wbGV0ZVJvdyhsKTtpZih0aGlzLmdyaWQpe3ZhciBwPWwldGhpcy5faXRlbXNQZXJSb3c7cCYmbC1wPD10aGlzLl9waHlzaWNhbENvdW50JiYobCs9dGhpcy5faXRlbXNQZXJSb3cpOwpsLT1wfWwtPXRoaXMuX3BoeXNpY2FsQ291bnQ7cD1NYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpO2lmKCEoMD5sKSl7aWYoMDxsKXtwPXdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKTtbXS5wdXNoLmFwcGx5KHRoaXMuX3BoeXNpY2FsSXRlbXMsdGhpcy5fY3JlYXRlUG9vbChsKSk7Zm9yKHZhciBtPTA7bTxsO20rKyl0aGlzLl9waHlzaWNhbFNpemVzLnB1c2goMCk7dGhpcy5fcGh5c2ljYWxDb3VudCs9bDt0aGlzLl9waHlzaWNhbFN0YXJ0PnRoaXMuX3BoeXNpY2FsRW5kJiZ0aGlzLl9pc0luZGV4UmVuZGVyZWQodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkmJnRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCk8dGhpcy5fcGh5c2ljYWxFbmQmJih0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sKTt0aGlzLl91cGRhdGUoKTt0aGlzLl90ZW1wbGF0ZUNvc3Q9KHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKS1wKS9sO3A9TWF0aC5yb3VuZCguNSoKdGhpcy5fcGh5c2ljYWxDb3VudCl9dGhpcy5fdmlydHVhbEVuZD49dGhpcy5fdmlydHVhbENvdW50LTF8fDA9PT1wfHwodGhpcy5faXNDbGllbnRGdWxsKCk/dGhpcy5fcGh5c2ljYWxTaXplPHRoaXMuX29wdFBoeXNpY2FsU2l6ZSYmdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQuYmluZCh0aGlzLHRoaXMuX2NsYW1wKE1hdGgucm91bmQoNTAvdGhpcy5fdGVtcGxhdGVDb3N0KSwxLHApKSxrKTp0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIix0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMscCksdCkpfX0sX3JlbmRlcjpmdW5jdGlvbigpe2lmKHRoaXMuaXNBdHRhY2hlZCYmdGhpcy5faXNWaXNpYmxlKWlmKDAhPT10aGlzLl9waHlzaWNhbENvdW50KXt2YXIgbD10aGlzLl9nZXRSZXVzYWJsZXMoITApO3RoaXMuX3BoeXNpY2FsVG9wPWwucGh5c2ljYWxUb3A7dGhpcy5fdmlydHVhbFN0YXJ0Kz0KbC5pbmRleGVzLmxlbmd0aDt0aGlzLl9waHlzaWNhbFN0YXJ0Kz1sLmluZGV4ZXMubGVuZ3RoO3RoaXMuX3VwZGF0ZShsLmluZGV4ZXMpO3RoaXMuX3VwZGF0ZSgpO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDApfWVsc2UgMDx0aGlzLl92aXJ0dWFsQ291bnQmJih0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDMpKX0sX2Vuc3VyZVRlbXBsYXRpemVkOmZ1bmN0aW9uKCl7aWYoIXRoaXMuY3Rvcil7KHRoaXMuX3VzZXJUZW1wbGF0ZT10aGlzLnF1ZXJ5RWZmZWN0aXZlQ2hpbGRyZW4oInRlbXBsYXRlIikpfHxjb25zb2xlLndhcm4oImlyb24tbGlzdCByZXF1aXJlcyBhIHRlbXBsYXRlIHRvIGJlIHByb3ZpZGVkIGluIGxpZ2h0LWRvbSIpO3ZhciBsPXtfX2tleV9fOiEwfTtsW3RoaXMuYXNdPSEwO2xbdGhpcy5pbmRleEFzXT0hMDtsW3RoaXMuc2VsZWN0ZWRBc109ITA7bC50YWJJbmRleD0hMDt0aGlzLl9pbnN0YW5jZVByb3BzPQpsO3RoaXMudGVtcGxhdGl6ZSh0aGlzLl91c2VyVGVtcGxhdGUsdGhpcy5tdXRhYmxlRGF0YSl9fSxfZ3JpZENoYW5nZWQ6ZnVuY3Rpb24obCxwKXsidW5kZWZpbmVkIiE9PXR5cGVvZiBwJiYodGhpcy5ub3RpZnlSZXNpemUoKSxQb2x5bWVyLmZsdXNoP1BvbHltZXIuZmx1c2goKTpQb2x5bWVyLmRvbS5mbHVzaCgpLGwmJnRoaXMuX3VwZGF0ZUdyaWRNZXRyaWNzKCkpfSxfaXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGwpe2lmKCJpdGVtcyI9PT1sLnBhdGgpdGhpcy5fcGh5c2ljYWxUb3A9dGhpcy5fdmlydHVhbFN0YXJ0PTAsdGhpcy5fdmlydHVhbENvdW50PXRoaXMuaXRlbXM/dGhpcy5pdGVtcy5sZW5ndGg6MCx0aGlzLl9jb2xsZWN0aW9uPXRoaXMuaXRlbXMmJlBvbHltZXIuQ29sbGVjdGlvbj9Qb2x5bWVyLkNvbGxlY3Rpb24uZ2V0KHRoaXMuaXRlbXMpOm51bGwsdGhpcy5fcGh5c2ljYWxJbmRleEZvcktleT17fSx0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPQpudWxsLHRoaXMuX3BoeXNpY2FsQ291bnQ9dGhpcy5fcGh5c2ljYWxDb3VudHx8MCx0aGlzLl9waHlzaWNhbEl0ZW1zPXRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdLHRoaXMuX3BoeXNpY2FsU2l6ZXM9dGhpcy5fcGh5c2ljYWxTaXplc3x8W10sdGhpcy5fcGh5c2ljYWxTdGFydD0wLHRoaXMuX3Njcm9sbFRvcD50aGlzLl9zY3JvbGxPZmZzZXQmJnRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24oMCksdGhpcy5fcmVtb3ZlRm9jdXNlZEl0ZW0oKSx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpO2Vsc2UgaWYoIml0ZW1zLnNwbGljZXMiPT09bC5wYXRoKXt0aGlzLl9hZGp1c3RWaXJ0dWFsSW5kZXgobC52YWx1ZS5pbmRleFNwbGljZXMpO3RoaXMuX3ZpcnR1YWxDb3VudD10aGlzLml0ZW1zP3RoaXMuaXRlbXMubGVuZ3RoOjA7aWYobC52YWx1ZS5pbmRleFNwbGljZXMuc29tZShmdW5jdGlvbihtKXtyZXR1cm4gMDxtLmFkZGVkQ291bnR8fDA8bS5yZW1vdmVkLmxlbmd0aH0pKXt2YXIgcD0KdGhpcy5fZ2V0QWN0aXZlRWxlbWVudCgpO3RoaXMuY29udGFpbnMocCkmJnAuYmx1cigpfWw9bC52YWx1ZS5pbmRleFNwbGljZXMuc29tZShmdW5jdGlvbihtKXtyZXR1cm4gbS5pbmRleCttLmFkZGVkQ291bnQ+PXRoaXMuX3ZpcnR1YWxTdGFydCYmbS5pbmRleDw9dGhpcy5fdmlydHVhbEVuZH0sdGhpcyk7dGhpcy5faXNDbGllbnRGdWxsKCkmJiFsfHx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLGgpfWVsc2UiaXRlbXMubGVuZ3RoIiE9PWwucGF0aCYmdGhpcy5fZm9yd2FyZEl0ZW1QYXRoKGwucGF0aCxsLnZhbHVlKX0sX2ZvcndhcmRJdGVtUGF0aDpmdW5jdGlvbihsLHApe2w9bC5zbGljZSg2KTt2YXIgbT1sLmluZGV4T2YoIi4iKTstMT09PW0mJihtPWwubGVuZ3RoKTt2YXIgbixxPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTtpZihmKXt2YXIgdT1wYXJzZUludChsLnN1YnN0cmluZygwLG0pLDEwKTtpZihuPXRoaXMuX2lzSW5kZXhSZW5kZXJlZCh1KSl7dmFyIHg9CnRoaXMuX2dldFBoeXNpY2FsSW5kZXgodSk7dmFyIEE9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t4XSl9ZWxzZSBxJiYoQT1xKTtpZighQXx8QVt0aGlzLmluZGV4QXNdIT09dSlyZXR1cm59ZWxzZSBpZih1PWwuc3Vic3RyaW5nKDAsbSkscSYmcS5fX2tleV9fPT09dSlBPXE7ZWxzZSBpZih4PXRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbdV0sQT10aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3hdKSwhQXx8QS5fX2tleV9fIT09dSlyZXR1cm47bD1sLnN1YnN0cmluZyhtKzEpO2w9dGhpcy5hcysobD8iLiIrbDoiIik7Zj9BLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgobCxwLCExLCEwKTpBLm5vdGlmeVBhdGgobCxwLCEwKTtBLl9mbHVzaFByb3BlcnRpZXMmJkEuX2ZsdXNoUHJvcGVydGllcyghMCk7biYmKHRoaXMuX3VwZGF0ZU1ldHJpY3MoW3hdKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCksdGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCkpfSwKX2FkanVzdFZpcnR1YWxJbmRleDpmdW5jdGlvbihsKXtsLmZvckVhY2goZnVuY3Rpb24ocCl7cC5yZW1vdmVkLmZvckVhY2godGhpcy5fcmVtb3ZlSXRlbSx0aGlzKTtwLmluZGV4PHRoaXMuX3ZpcnR1YWxTdGFydCYmKHA9TWF0aC5tYXgocC5hZGRlZENvdW50LXAucmVtb3ZlZC5sZW5ndGgscC5pbmRleC10aGlzLl92aXJ0dWFsU3RhcnQpLHRoaXMuX3ZpcnR1YWxTdGFydCs9cCwwPD10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4JiYodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCs9cCkpfSx0aGlzKX0sX3JlbW92ZUl0ZW06ZnVuY3Rpb24obCl7dGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0KGwpO3RoaXMuX2ZvY3VzZWRJdGVtJiZ0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9mb2N1c2VkSXRlbSlbdGhpcy5hc109PT1sJiZ0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpfSxfaXRlcmF0ZUl0ZW1zOmZ1bmN0aW9uKGwscCl7dmFyIG0sbjtpZigyPT09YXJndW1lbnRzLmxlbmd0aCYmcClmb3Iobj0KMDtuPHAubGVuZ3RoO24rKyl7dmFyIHE9cFtuXTt2YXIgdT10aGlzLl9jb21wdXRlVmlkeChxKTtpZihudWxsIT0obT1sLmNhbGwodGhpcyxxLHUpKSlyZXR1cm4gbX1lbHNle3E9dGhpcy5fcGh5c2ljYWxTdGFydDtmb3IodT10aGlzLl92aXJ0dWFsU3RhcnQ7cTx0aGlzLl9waHlzaWNhbENvdW50O3ErKyx1KyspaWYobnVsbCE9KG09bC5jYWxsKHRoaXMscSx1KSkpcmV0dXJuIG07Zm9yKHE9MDtxPHRoaXMuX3BoeXNpY2FsU3RhcnQ7cSsrLHUrKylpZihudWxsIT0obT1sLmNhbGwodGhpcyxxLHUpKSlyZXR1cm4gbX19LF9jb21wdXRlVmlkeDpmdW5jdGlvbihsKXtyZXR1cm4gbD49dGhpcy5fcGh5c2ljYWxTdGFydD90aGlzLl92aXJ0dWFsU3RhcnQrKGwtdGhpcy5fcGh5c2ljYWxTdGFydCk6dGhpcy5fdmlydHVhbFN0YXJ0Kyh0aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3BoeXNpY2FsU3RhcnQpK2x9LF9hc3NpZ25Nb2RlbHM6ZnVuY3Rpb24obCl7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKHAsCm0pe3ZhciBuPXRoaXMuX3BoeXNpY2FsSXRlbXNbcF0scT10aGlzLml0ZW1zJiZ0aGlzLml0ZW1zW21dO2lmKG51bGwhPXEpe3ZhciB1PXRoaXMubW9kZWxGb3JFbGVtZW50KG4pO3UuX19rZXlfXz10aGlzLl9jb2xsZWN0aW9uP3RoaXMuX2NvbGxlY3Rpb24uZ2V0S2V5KHEpOm51bGw7dGhpcy5fZm9yd2FyZFByb3BlcnR5KHUsdGhpcy5hcyxxKTt0aGlzLl9mb3J3YXJkUHJvcGVydHkodSx0aGlzLnNlbGVjdGVkQXMsdGhpcy4kLnNlbGVjdG9yLmlzU2VsZWN0ZWQocSkpO3RoaXMuX2ZvcndhcmRQcm9wZXJ0eSh1LHRoaXMuaW5kZXhBcyxtKTt0aGlzLl9mb3J3YXJkUHJvcGVydHkodSwidGFiSW5kZXgiLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9PT1tPzA6LTEpO3RoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbdS5fX2tleV9fXT1wO3UuX2ZsdXNoUHJvcGVydGllcyYmdS5fZmx1c2hQcm9wZXJ0aWVzKCEwKTtuLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIil9ZWxzZSBuLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwKIiIpfSxsKX0sX3VwZGF0ZU1ldHJpY3M6ZnVuY3Rpb24obCl7UG9seW1lci5mbHVzaD9Qb2x5bWVyLmZsdXNoKCk6UG9seW1lci5kb20uZmx1c2goKTt2YXIgcD0wLG09MCxuPXRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50LHE9dGhpcy5fcGh5c2ljYWxBdmVyYWdlO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbih1KXttKz10aGlzLl9waHlzaWNhbFNpemVzW3VdO3RoaXMuX3BoeXNpY2FsU2l6ZXNbdV09dGhpcy5fcGh5c2ljYWxJdGVtc1t1XS5vZmZzZXRIZWlnaHQ7cCs9dGhpcy5fcGh5c2ljYWxTaXplc1t1XTt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCs9dGhpcy5fcGh5c2ljYWxTaXplc1t1XT8xOjB9LGwpO3RoaXMuZ3JpZD8odGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKSx0aGlzLl9waHlzaWNhbFNpemU9TWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3Jvd0hlaWdodCk6KG09MT09PXRoaXMuX2l0ZW1zUGVyUm93P206Ck1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9yb3dIZWlnaHQsdGhpcy5fcGh5c2ljYWxTaXplPXRoaXMuX3BoeXNpY2FsU2l6ZStwLW0sdGhpcy5faXRlbXNQZXJSb3c9MSk7dGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQhPT1uJiYodGhpcy5fcGh5c2ljYWxBdmVyYWdlPU1hdGgucm91bmQoKHEqbitwKS90aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCkpfSxfdXBkYXRlR3JpZE1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9pdGVtV2lkdGg9MDx0aGlzLl9waHlzaWNhbENvdW50P3RoaXMuX3BoeXNpY2FsSXRlbXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg6MjAwO3RoaXMuX3Jvd0hlaWdodD0wPHRoaXMuX3BoeXNpY2FsQ291bnQ/dGhpcy5fcGh5c2ljYWxJdGVtc1swXS5vZmZzZXRIZWlnaHQ6MjAwO3RoaXMuX2l0ZW1zUGVyUm93PXRoaXMuX2l0ZW1XaWR0aD9NYXRoLmZsb29yKHRoaXMuX3ZpZXdwb3J0V2lkdGgvdGhpcy5faXRlbVdpZHRoKToKdGhpcy5faXRlbXNQZXJSb3d9LF9wb3NpdGlvbkl0ZW1zOmZ1bmN0aW9uKCl7dGhpcy5fYWRqdXN0U2Nyb2xsUG9zaXRpb24oKTt2YXIgbD10aGlzLl9waHlzaWNhbFRvcDtpZih0aGlzLmdyaWQpe3ZhciBwPSh0aGlzLl92aWV3cG9ydFdpZHRoLXRoaXMuX2l0ZW1zUGVyUm93KnRoaXMuX2l0ZW1XaWR0aCkvMjt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSxuKXt2YXIgcT1NYXRoLmZsb29yKG4ldGhpcy5faXRlbXNQZXJSb3cqdGhpcy5faXRlbVdpZHRoK3ApO3RoaXMuX2lzUlRMJiYocSo9LTEpO3RoaXMudHJhbnNsYXRlM2QocSsicHgiLGwrInB4IiwwLHRoaXMuX3BoeXNpY2FsSXRlbXNbbV0pO3RoaXMuX3Nob3VsZFJlbmRlck5leHRSb3cobikmJihsKz10aGlzLl9yb3dIZWlnaHQpfSl9ZWxzZSB0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24obSl7dGhpcy50cmFuc2xhdGUzZCgwLGwrInB4IiwwLHRoaXMuX3BoeXNpY2FsSXRlbXNbbV0pO2wrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbbV19KX0sCl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQ6ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuZ3JpZD90aGlzLl9jb21wdXRlVmlkeChsKSV0aGlzLl9pdGVtc1BlclJvdyE9PXRoaXMuX2l0ZW1zUGVyUm93LTE/MDp0aGlzLl9yb3dIZWlnaHQ6dGhpcy5fcGh5c2ljYWxTaXplc1tsXX0sX3Nob3VsZFJlbmRlck5leHRSb3c6ZnVuY3Rpb24obCl7cmV0dXJuIGwldGhpcy5faXRlbXNQZXJSb3c9PT10aGlzLl9pdGVtc1BlclJvdy0xfSxfYWRqdXN0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXt2YXIgbD0wPT09dGhpcy5fdmlydHVhbFN0YXJ0P3RoaXMuX3BoeXNpY2FsVG9wOk1hdGgubWluKHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3BoeXNpY2FsVG9wLDApO2lmKDAhPT1sKXt0aGlzLl9waHlzaWNhbFRvcC09bDt2YXIgcD10aGlzLl9zY3JvbGxUb3A7IWQmJjA8cCYmdGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbihwLWwpfX0sX3Jlc2V0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24obCl7dGhpcy5zY3JvbGxUYXJnZXQmJgowPD1sJiYodGhpcy5fc2Nyb2xsUG9zaXRpb249dGhpcy5fc2Nyb2xsVG9wPWwpfSxfdXBkYXRlU2Nyb2xsZXJTaXplOmZ1bmN0aW9uKGwpe3RoaXMuX2VzdFNjcm9sbEhlaWdodD10aGlzLmdyaWQ/dGhpcy5fdmlydHVhbFJvd0NvdW50KnRoaXMuX3Jvd0hlaWdodDp0aGlzLl9waHlzaWNhbEJvdHRvbStNYXRoLm1heCh0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQsMCkqdGhpcy5fcGh5c2ljYWxBdmVyYWdlO2lmKChsPShsPShsPWx8fDA9PT10aGlzLl9zY3JvbGxIZWlnaHQpfHx0aGlzLl9zY3JvbGxQb3NpdGlvbj49dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3BoeXNpY2FsU2l6ZSl8fHRoaXMuZ3JpZCYmdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodDx0aGlzLl9lc3RTY3JvbGxIZWlnaHQpfHxNYXRoLmFicyh0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fc2Nyb2xsSGVpZ2h0KT49dGhpcy5fdmlld3BvcnRIZWlnaHQpdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodD0KdGhpcy5fZXN0U2Nyb2xsSGVpZ2h0KyJweCIsdGhpcy5fc2Nyb2xsSGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodH0sc2Nyb2xsVG9JdGVtOmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGwpKX0sc2Nyb2xsVG9JbmRleDpmdW5jdGlvbihsKXtpZighKCJudW1iZXIiIT09dHlwZW9mIGx8fDA+bHx8bD50aGlzLml0ZW1zLmxlbmd0aC0xKSYmKFBvbHltZXIuZmx1c2g/UG9seW1lci5mbHVzaCgpOlBvbHltZXIuZG9tLmZsdXNoKCksMCE9PXRoaXMuX3BoeXNpY2FsQ291bnQpKXtsPXRoaXMuX2NsYW1wKGwsMCx0aGlzLl92aXJ0dWFsQ291bnQtMSk7aWYoIXRoaXMuX2lzSW5kZXhSZW5kZXJlZChsKXx8bD49dGhpcy5fbWF4VmlydHVhbFN0YXJ0KXRoaXMuX3ZpcnR1YWxTdGFydD10aGlzLmdyaWQ/bC0yKnRoaXMuX2l0ZW1zUGVyUm93OmwtMTt0aGlzLl9tYW5hZ2VGb2N1cygpO3RoaXMuX2Fzc2lnbk1vZGVscygpO3RoaXMuX3VwZGF0ZU1ldHJpY3MoKTsKdGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtmb3IodmFyIHA9dGhpcy5fcGh5c2ljYWxTdGFydCxtPXRoaXMuX3ZpcnR1YWxTdGFydCxuPTAscT10aGlzLl9oaWRkZW5Db250ZW50U2l6ZTttPGwmJm48PXE7KW4rPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChwKSxwPShwKzEpJXRoaXMuX3BoeXNpY2FsQ291bnQsbSsrO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSghMCk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsT2Zmc2V0K24pO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKDApO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbH19LF9yZXNldEF2ZXJhZ2U6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudD0KdGhpcy5fcGh5c2ljYWxBdmVyYWdlPTB9LF9yZXNpemVIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLGZ1bmN0aW9uKCl7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsO3RoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCk7dGhpcy5faXNWaXNpYmxlPyh0aGlzLnRvZ2dsZVNjcm9sbExpc3RlbmVyKCEwKSx0aGlzLl9yZXNldEF2ZXJhZ2UoKSx0aGlzLl9yZW5kZXIoKSk6dGhpcy50b2dnbGVTY3JvbGxMaXN0ZW5lcighMSl9LGgpfSxzZWxlY3RJdGVtOmZ1bmN0aW9uKGwpe3JldHVybiB0aGlzLnNlbGVjdEluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihsKSl9LHNlbGVjdEluZGV4OmZ1bmN0aW9uKGwpe2lmKCEoMD5sfHxsPj10aGlzLl92aXJ0dWFsQ291bnQpKXshdGhpcy5tdWx0aVNlbGVjdGlvbiYmdGhpcy5zZWxlY3RlZEl0ZW0mJnRoaXMuY2xlYXJTZWxlY3Rpb24oKTtpZih0aGlzLl9pc0luZGV4UmVuZGVyZWQobCkpe3ZhciBwPQp0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgobCldKTtwJiYocFt0aGlzLnNlbGVjdGVkQXNdPSEwKTt0aGlzLnVwZGF0ZVNpemVGb3JJbmRleChsKX10aGlzLiQuc2VsZWN0b3Iuc2VsZWN0SW5kZXg/dGhpcy4kLnNlbGVjdG9yLnNlbGVjdEluZGV4KGwpOnRoaXMuJC5zZWxlY3Rvci5zZWxlY3QodGhpcy5pdGVtc1tsXSl9fSxkZXNlbGVjdEl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMuZGVzZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YobCkpfSxkZXNlbGVjdEluZGV4OmZ1bmN0aW9uKGwpezA+bHx8bD49dGhpcy5fdmlydHVhbENvdW50fHwodGhpcy5faXNJbmRleFJlbmRlcmVkKGwpJiYodGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KGwpXSlbdGhpcy5zZWxlY3RlZEFzXT0hMSx0aGlzLnVwZGF0ZVNpemVGb3JJbmRleChsKSksdGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0SW5kZXg/CnRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdEluZGV4KGwpOnRoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdCh0aGlzLml0ZW1zW2xdKSl9LHRvZ2dsZVNlbGVjdGlvbkZvckl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMudG9nZ2xlU2VsZWN0aW9uRm9ySW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGwpKX0sdG9nZ2xlU2VsZWN0aW9uRm9ySW5kZXg6ZnVuY3Rpb24obCl7KHRoaXMuJC5zZWxlY3Rvci5pc0luZGV4U2VsZWN0ZWQ/dGhpcy4kLnNlbGVjdG9yLmlzSW5kZXhTZWxlY3RlZChsKTp0aGlzLiQuc2VsZWN0b3IuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2xdKSk/dGhpcy5kZXNlbGVjdEluZGV4KGwpOnRoaXMuc2VsZWN0SW5kZXgobCl9LGNsZWFyU2VsZWN0aW9uOmZ1bmN0aW9uKCl7dGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKGwpe3RoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbbF0pW3RoaXMuc2VsZWN0ZWRBc109ITF9KTt0aGlzLiQuc2VsZWN0b3IuY2xlYXJTZWxlY3Rpb24oKX0sCl9zZWxlY3Rpb25FbmFibGVkQ2hhbmdlZDpmdW5jdGlvbihsKXsobD90aGlzLmxpc3Rlbjp0aGlzLnVubGlzdGVuKS5jYWxsKHRoaXMsdGhpcywidGFwIiwiX3NlbGVjdGlvbkhhbmRsZXIiKX0sX3NlbGVjdGlvbkhhbmRsZXI6ZnVuY3Rpb24obCl7dmFyIHA9dGhpcy5tb2RlbEZvckVsZW1lbnQobC50YXJnZXQpO2lmKHApe3ZhciBtPVBvbHltZXIuZG9tKGwpLnBhdGhbMF07bD10aGlzLl9nZXRBY3RpdmVFbGVtZW50KCk7dmFyIG49dGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KHBbdGhpcy5pbmRleEFzXSldO2lmKCJpbnB1dCIhPT1tLmxvY2FsTmFtZSYmImJ1dHRvbiIhPT1tLmxvY2FsTmFtZSYmInNlbGVjdCIhPT1tLmxvY2FsTmFtZSl7bT1wLnRhYkluZGV4O3AudGFiSW5kZXg9LTEwMDt2YXIgcT1sP2wudGFiSW5kZXg6LTE7cC50YWJJbmRleD1tO2wmJm4hPT1sJiZuLmNvbnRhaW5zKGwpJiYtMTAwIT09cXx8dGhpcy50b2dnbGVTZWxlY3Rpb25Gb3JJdGVtKHBbdGhpcy5hc10pfX19LApfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkOmZ1bmN0aW9uKGwpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKTt0aGlzLiQuc2VsZWN0b3IubXVsdGk9bH0sdXBkYXRlU2l6ZUZvckl0ZW06ZnVuY3Rpb24obCl7cmV0dXJuIHRoaXMudXBkYXRlU2l6ZUZvckluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihsKSl9LHVwZGF0ZVNpemVGb3JJbmRleDpmdW5jdGlvbihsKXtpZighdGhpcy5faXNJbmRleFJlbmRlcmVkKGwpKXJldHVybiBudWxsO3RoaXMuX3VwZGF0ZU1ldHJpY3MoW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgobCldKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7cmV0dXJuIG51bGx9LF9tYW5hZ2VGb2N1czpmdW5jdGlvbigpe3ZhciBsPXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg7MDw9bCYmbDx0aGlzLl92aXJ0dWFsQ291bnQ/dGhpcy5faXNJbmRleFJlbmRlcmVkKGwpP3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpOnRoaXMuX2NyZWF0ZUZvY3VzQmFja2ZpbGxJdGVtKCk6MDx0aGlzLl92aXJ0dWFsQ291bnQmJgowPHRoaXMuX3BoeXNpY2FsQ291bnQmJih0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD10aGlzLl9waHlzaWNhbFN0YXJ0LHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9dGhpcy5fdmlydHVhbFN0YXJ0LHRoaXMuX2ZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fcGh5c2ljYWxTdGFydF0pfSxfY29udmVydEluZGV4VG9Db21wbGV0ZVJvdzpmdW5jdGlvbihsKXt0aGlzLl9pdGVtc1BlclJvdz10aGlzLl9pdGVtc1BlclJvd3x8MTtyZXR1cm4gdGhpcy5ncmlkP01hdGguY2VpbChsL3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9pdGVtc1BlclJvdzpsfSxfaXNJbmRleFJlbmRlcmVkOmZ1bmN0aW9uKGwpe3JldHVybiBsPj10aGlzLl92aXJ0dWFsU3RhcnQmJmw8PXRoaXMuX3ZpcnR1YWxFbmR9LF9pc0luZGV4VmlzaWJsZTpmdW5jdGlvbihsKXtyZXR1cm4gbD49dGhpcy5maXJzdFZpc2libGVJbmRleCYmbDw9dGhpcy5sYXN0VmlzaWJsZUluZGV4fSxfZ2V0UGh5c2ljYWxJbmRleDpmdW5jdGlvbihsKXtyZXR1cm4gZj8KKHRoaXMuX3BoeXNpY2FsU3RhcnQrKGwtdGhpcy5fdmlydHVhbFN0YXJ0KSkldGhpcy5fcGh5c2ljYWxDb3VudDp0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5W3RoaXMuX2NvbGxlY3Rpb24uZ2V0S2V5KHRoaXMuaXRlbXNbbF0pXX0sZm9jdXNJdGVtOmZ1bmN0aW9uKGwpe3RoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKGwpfSxfZm9jdXNQaHlzaWNhbEl0ZW06ZnVuY3Rpb24obCl7aWYoISgwPmx8fGw+PXRoaXMuX3ZpcnR1YWxDb3VudCkpe3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpO3RoaXMuX2lzSW5kZXhSZW5kZXJlZChsKXx8dGhpcy5zY3JvbGxUb0luZGV4KGwpO3ZhciBwPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChsKV0sbT10aGlzLm1vZGVsRm9yRWxlbWVudChwKSxuO20udGFiSW5kZXg9LTEwMDstMTAwPT09cC50YWJJbmRleCYmKG49cCk7bnx8KG49UG9seW1lci5kb20ocCkucXVlcnlTZWxlY3RvcignW3RhYmluZGV4XHgzZCItMTAwIl0nKSk7Cm0udGFiSW5kZXg9MDt0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4PWw7biYmbi5mb2N1cygpfX0sX3JlbW92ZUZvY3VzZWRJdGVtOmZ1bmN0aW9uKCl7dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0mJnRoaXMuX2l0ZW1zUGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTt0aGlzLl9mb2N1c2VkSXRlbT10aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbT1udWxsO3RoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9LTF9LF9jcmVhdGVGb2N1c0JhY2tmaWxsSXRlbTpmdW5jdGlvbigpe3ZhciBsPXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4O2lmKCEodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW18fDA+dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkpe2lmKCF0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSl7dmFyIHA9dGhpcy5zdGFtcChudWxsKTt0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT0KcC5yb290LnF1ZXJ5U2VsZWN0b3IoIioiKTt0aGlzLl9pdGVtc1BhcmVudC5hcHBlbmRDaGlsZChwLnJvb3QpfXRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbbF07dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pLnRhYkluZGV4PTA7dGhpcy5fcGh5c2ljYWxJdGVtc1tsXT10aGlzLl9mb2N1c0JhY2tmaWxsSXRlbTt0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD1sO3RoaXMudHJhbnNsYXRlM2QoMCwiLTEwMDAwcHgiLDAsdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pfX0sX3Jlc3RvcmVGb2N1c2VkSXRlbTpmdW5jdGlvbigpe2lmKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtJiYhKDA+dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkpe3RoaXMuX2Fzc2lnbk1vZGVscygpO3ZhciBsPXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksCnA9dGhpcy5fcGh5c2ljYWxJdGVtc1tsXTtpZihwKXt2YXIgbT10aGlzLm1vZGVsRm9yRWxlbWVudChwKSxuPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTttW3RoaXMuYXNdPT09blt0aGlzLmFzXT8odGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW09cCxtLnRhYkluZGV4PS0xLHRoaXMuX3BoeXNpY2FsSXRlbXNbbF09dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy50cmFuc2xhdGUzZCgwLCItMTAwMDBweCIsMCx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSkpOih0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtPW51bGwpO3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPW51bGx9fX0sX2RpZEZvY3VzOmZ1bmN0aW9uKGwpe2w9dGhpcy5tb2RlbEZvckVsZW1lbnQobC50YXJnZXQpO3ZhciBwPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX2ZvY3VzZWRJdGVtKSxtPW51bGwhPT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSwKbj10aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4O2wmJihwPT09bD90aGlzLl9pc0luZGV4VmlzaWJsZShuKXx8dGhpcy5zY3JvbGxUb0luZGV4KG4pOih0aGlzLl9yZXN0b3JlRm9jdXNlZEl0ZW0oKSxwJiYocC50YWJJbmRleD0tMSksbC50YWJJbmRleD0wLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9bj1sW3RoaXMuaW5kZXhBc10sdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg9dGhpcy5fZ2V0UGh5c2ljYWxJbmRleChuKSx0aGlzLl9mb2N1c2VkSXRlbT10aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4XSxtJiYhdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0mJnRoaXMuX3VwZGF0ZSgpKSl9LF9rZXlkb3duSGFuZGxlcjpmdW5jdGlvbihsKXtzd2l0Y2gobC5rZXlDb2RlKXtjYXNlIDQwOnRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg8dGhpcy5fdmlydHVhbENvdW50LTEmJmwucHJldmVudERlZmF1bHQoKTt0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KwoodGhpcy5ncmlkP3RoaXMuX2l0ZW1zUGVyUm93OjEpKTticmVhaztjYXNlIDM5OnRoaXMuZ3JpZCYmdGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCsodGhpcy5faXNSVEw/LTE6MSkpO2JyZWFrO2Nhc2UgMzg6MDx0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4JiZsLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleC0odGhpcy5ncmlkP3RoaXMuX2l0ZW1zUGVyUm93OjEpKTticmVhaztjYXNlIDM3OnRoaXMuZ3JpZCYmdGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCsodGhpcy5faXNSVEw/MTotMSkpO2JyZWFrO2Nhc2UgMTM6dGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0odGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksdGhpcy5zZWxlY3Rpb25FbmFibGVkJiZ0aGlzLl9zZWxlY3Rpb25IYW5kbGVyKGwpfX0sX2NsYW1wOmZ1bmN0aW9uKGwsCnAsbSl7cmV0dXJuIE1hdGgubWluKG0sTWF0aC5tYXgocCxsKSl9LF9kZWJvdW5jZTpmdW5jdGlvbihsLHAsbSl7Zj8odGhpcy5fZGVib3VuY2Vycz10aGlzLl9kZWJvdW5jZXJzfHx7fSx0aGlzLl9kZWJvdW5jZXJzW2xdPVBvbHltZXIuRGVib3VuY2VyLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlcnNbbF0sbSxwLmJpbmQodGhpcykpLFBvbHltZXIuZW5xdWV1ZURlYm91bmNlcih0aGlzLl9kZWJvdW5jZXJzW2xdKSk6UG9seW1lci5kb20uYWRkRGVib3VuY2VyKHRoaXMuZGVib3VuY2UobCxwKSl9LF9mb3J3YXJkUHJvcGVydHk6ZnVuY3Rpb24obCxwLG0pe2Y/bC5fc2V0UGVuZGluZ1Byb3BlcnR5KHAsbSk6bFtwXT1tfSxfZm9yd2FyZEhvc3RQcm9wVjI6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJnRoaXMubW9kZWxGb3JFbGVtZW50KG0pLmZvcndhcmRIb3N0UHJvcChsLApwKX0sdGhpcyl9LF9ub3RpZnlJbnN0YW5jZVByb3BWMjpmdW5jdGlvbihsLHAsbSl7UG9seW1lci5QYXRoLm1hdGNoZXModGhpcy5hcyxwKSYmKGw9bFt0aGlzLmluZGV4QXNdLHA9PXRoaXMuYXMmJih0aGlzLml0ZW1zW2xdPW0pLHRoaXMubm90aWZ5UGF0aChQb2x5bWVyLlBhdGgudHJhbnNsYXRlKHRoaXMuYXMsIml0ZW1zLiIrbCxwKSxtKSl9LF9nZXRTdGFtcGVkQ2hpbGRyZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxJdGVtc30sX2ZvcndhcmRJbnN0YW5jZVBhdGg6ZnVuY3Rpb24obCxwLG0pezA9PT1wLmluZGV4T2YodGhpcy5hcysiLiIpJiZ0aGlzLm5vdGlmeVBhdGgoIml0ZW1zLiIrbC5fX2tleV9fKyIuIitwLnNsaWNlKHRoaXMuYXMubGVuZ3RoKzEpLG0pfSxfZm9yd2FyZFBhcmVudFBhdGg6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJgp0aGlzLm1vZGVsRm9yRWxlbWVudChtKS5ub3RpZnlQYXRoKGwscCwhMCl9LHRoaXMpfSxfZm9yd2FyZFBhcmVudFByb3A6ZnVuY3Rpb24obCxwKXsodGhpcy5fcGh5c2ljYWxJdGVtc3x8W10pLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW1dKS5mb3JFYWNoKGZ1bmN0aW9uKG0pe20mJih0aGlzLm1vZGVsRm9yRWxlbWVudChtKVtsXT1wKX0sdGhpcyl9LF9nZXRBY3RpdmVFbGVtZW50OmZ1bmN0aW9uKCl7dmFyIGw9dGhpcy5faXRlbXNQYXJlbnQubm9kZS5kb21Ib3N0O3JldHVybiBQb2x5bWVyLmRvbShsP2wucm9vdDpkb2N1bWVudCkuYWN0aXZlRWxlbWVudH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaXRlbS9wYXBlci1pdGVtLWJvZHkuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItaXRlbS1ib2R5In0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWNvbW1vbi90Zi1ncmFwaC1pY29uLmpzCihmdW5jdGlvbihiKXsoZnVuY3Rpb24oZCl7KGZ1bmN0aW9uKGYpe2xldCBoOyhmdW5jdGlvbihrKXtrLkNPTlNUPSJDT05TVCI7ay5NRVRBPSJNRVRBIjtrLk9QPSJPUCI7ay5TRVJJRVM9IlNFUklFUyI7ay5TVU1NQVJZPSJTVU1NQVJZIn0pKGg9Zi5HcmFwaEljb25UeXBlfHwoZi5HcmFwaEljb25UeXBlPXt9KSk7UG9seW1lcih7aXM6InRmLWdyYXBoLWljb24iLHByb3BlcnRpZXM6e3R5cGU6U3RyaW5nLHZlcnRpY2FsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZpbGxPdmVycmlkZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sc3Ryb2tlT3ZlcnJpZGU6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LGZhZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9maWxsOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVGaWxsKHR5cGUsIGZpbGxPdmVycmlkZSkifSxfc3Ryb2tlOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVTdHJva2UodHlwZSwgc3Ryb2tlT3ZlcnJpZGUpIn19LApnZXRTdmdEZWZpbmFibGVFbGVtZW50KCl7cmV0dXJuIHRoaXMuJC5zdmdEZWZzfSxfY29tcHV0ZUZpbGwoayx0KXtpZihudWxsIT10KXJldHVybiB0O3N3aXRjaChrKXtjYXNlIGguTUVUQTpyZXR1cm4gYi5ncmFwaC5yZW5kZXIuTWV0YW5vZGVDb2xvcnMuREVGQVVMVF9GSUxMO2Nhc2UgaC5TRVJJRVM6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLlNlcmllc05vZGVDb2xvcnMuREVGQVVMVF9GSUxMO2RlZmF1bHQ6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5ERUZBVUxUX0ZJTEx9fSxfY29tcHV0ZVN0cm9rZShrLHQpe2lmKG51bGwhPXQpcmV0dXJuIHQ7c3dpdGNoKGspe2Nhc2UgaC5NRVRBOnJldHVybiBiLmdyYXBoLnJlbmRlci5NZXRhbm9kZUNvbG9ycy5ERUZBVUxUX1NUUk9LRTtjYXNlIGguU0VSSUVTOnJldHVybiBiLmdyYXBoLnJlbmRlci5TZXJpZXNOb2RlQ29sb3JzLkRFRkFVTFRfU1RST0tFO2RlZmF1bHQ6cmV0dXJuIGIuZ3JhcGgucmVuZGVyLk9wTm9kZUNvbG9ycy5ERUZBVUxUX1NUUk9LRX19LApfaXNUeXBlKGssdCl7cmV0dXJuIGs9PT10fSxfZmFkZWRDbGFzczpmdW5jdGlvbihrLHQpe3JldHVybiBrPyJmYWRlZC0iK3Q6IiJ9fSl9KShkLmljb258fChkLmljb249e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtY29tbW9uL3RmLW5vZGUtaWNvbi5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ub2RlLWljb24iLHByb3BlcnRpZXM6e25vZGU6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LHJlbmRlckluZm86e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LGNvbG9yQnk6e3R5cGU6T2JqZWN0LHZhbHVlOiJzdHJ1Y3R1cmFsIn0sdGVtcGxhdGVJbmRleDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpudWxsfSx0eXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSx2ZXJ0aWNhbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxjb25zdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzdW1tYXJ5Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZpbGw6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LF9maWxsT3ZlcnJpZGU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUZpbGxPdmVycmlkZShub2RlLCByZW5kZXJJbmZvLCBjb2xvckJ5LCB0ZW1wbGF0ZUluZGV4LCBmaWxsKSIsb2JzZXJ2ZXI6Il9vbkZpbGxPdmVycmlkZUNoYW5nZWQifX0sCl9jb21wdXRlRmlsbE92ZXJyaWRlOmZ1bmN0aW9uKGIsZCxmLGgsayl7cmV0dXJuIGImJmQmJmYmJmg/KGI9dGYuZ3JhcGguc2NlbmUubm9kZSxiLmdldEZpbGxGb3JOb2RlKGgsYi5Db2xvckJ5W2YudG9VcHBlckNhc2UoKV0sZCwhMSkpOmt9LF9nZXRTdHJva2VPdmVycmlkZTpmdW5jdGlvbihiKXtyZXR1cm4gYj90Zi5ncmFwaC5zY2VuZS5ub2RlLmdldFN0cm9rZUZvckZpbGwoYik6bnVsbH0sX2dldFR5cGU6ZnVuY3Rpb24oYixkLGYsaCl7Y29uc3Qgaz10Zi5ncmFwaC5pY29uLkdyYXBoSWNvblR5cGU7aWYoYilzd2l0Y2goYi50eXBlKXtjYXNlIHRmLmdyYXBoLk5vZGVUeXBlLk9QOnJldHVybiBiPWIub3AsInN0cmluZyIhPT10eXBlb2YgYj9rLk9QOiJDb25zdCI9PT1ifHxmP2suQ09OU1Q6Yi5lbmRzV2l0aCgiU3VtbWFyeSIpfHxkP2suU1VNTUFSWTprLk9QO2Nhc2UgdGYuZ3JhcGguTm9kZVR5cGUuTUVUQTpyZXR1cm4gay5NRVRBO2Nhc2UgdGYuZ3JhcGguTm9kZVR5cGUuU0VSSUVTOnJldHVybiBrLlNFUklFU31yZXR1cm4gaH0sCl9pc1ZlcnRpY2FsOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/Yi5oYXNOb25Db250cm9sRWRnZXM6ISFkfSxfZ2V0RmFkZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIuaXNGYWRlZE91dH0sX29uRmlsbE92ZXJyaWRlQ2hhbmdlZChiLGQpe2NvbnN0IGY9dGhpcy5ub2RlLGg9dGhpcy5yZW5kZXJJbmZvLGs9dGhpcy5jb2xvckJ5LHQ9dGhpcy50ZW1wbGF0ZUluZGV4LGw9dGYuZ3JhcGguc2NlbmUubm9kZTtiIT09ZCYmbC5yZW1vdmVHcmFkaWVudERlZmluaXRpb25zKHRoaXMuJC5pY29uLmdldFN2Z0RlZmluYWJsZUVsZW1lbnQoKSk7ZiYmaCYmayYmdCYmbC5nZXRGaWxsRm9yTm9kZSh0LGwuQ29sb3JCeVtrLnRvVXBwZXJDYXNlKCldLGgsITEsdGhpcy4kLmljb24uZ2V0U3ZnRGVmaW5hYmxlRWxlbWVudCgpKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtb3AtY29tcGF0LWNhcmQvdGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtIixwcm9wZXJ0aWVzOntjYXJkTm9kZTpPYmplY3QsaXRlbU5vZGU6T2JqZWN0LGVkZ2VMYWJlbDpTdHJpbmcsaXRlbVJlbmRlckluZm86T2JqZWN0LG5hbWU6U3RyaW5nLGl0ZW1UeXBlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2l0ZW1UeXBlQ2hhbmdlZCJ9LGNvbG9yQnk6U3RyaW5nLGNvbG9yQnlQYXJhbXM6T2JqZWN0LHRlbXBsYXRlSW5kZXg6RnVuY3Rpb259LF9pdGVtVHlwZUNoYW5nZWQ6ZnVuY3Rpb24oKXsic3Vibm9kZSIhPT10aGlzLml0ZW1UeXBlP3RoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LmFkZCgiY2xpY2thYmxlIik6dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QucmVtb3ZlKCJjbGlja2FibGUiKX0sX25vZGVMaXN0ZW5lcjpmdW5jdGlvbihiKXt0aGlzLmZpcmUoIm5vZGUtbGlzdC1pdGVtLSIrYi50eXBlLHtub2RlTmFtZTp0aGlzLm5hbWUsdHlwZTp0aGlzLml0ZW1UeXBlfSl9LApfZmFkZWRDbGFzczpmdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5pc0ZhZGVkT3V0PyJmYWRlZCI6IiJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkL3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWdyYXBoLW9wLWNvbXBhdC1jYXJkIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTpPYmplY3QsaGllcmFyY2h5UGFyYW1zOk9iamVjdCxyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LG5vZGVUaXRsZTpTdHJpbmcsX3RlbXBsYXRlSW5kZXg6e3R5cGU6RnVuY3Rpb24sY29tcHV0ZWQ6Il9nZXRUZW1wbGF0ZUluZGV4KGdyYXBoSGllcmFyY2h5KSJ9LF9pbmNvbXBhdGlibGVPcE5vZGVzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldEluY29tcGF0aWJsZU9wTm9kZXMoZ3JhcGhIaWVyYXJjaHksIGhpZXJhcmNoeVBhcmFtcykifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sX29wQ29tcGF0U2NvcmU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZU9wQ29tcGF0U2NvcmUoZ3JhcGhIaWVyYXJjaHkpIn0sX29wQ29tcGF0U2NvcmVMYWJlbDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXRPcENvbXBhdFNjb3JlTGFiZWwoX29wQ29tcGF0U2NvcmUpIn0sCl9vcENvbXBhdENvbG9yOnt0eXBlOlN0cmluZyx2YWx1ZTp0Zi5ncmFwaC5yZW5kZXIuT3BOb2RlQ29sb3JzLkNPTVBBVElCTEV9LF9vcEluY29tcGF0Q29sb3I6e3R5cGU6U3RyaW5nLHZhbHVlOnRmLmdyYXBoLnJlbmRlci5PcE5vZGVDb2xvcnMuSU5DT01QQVRJQkxFfSxfdG90YWxJbmNvbXBhdE9wczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbEluY29tcGF0aWJsZU9wcyhncmFwaEhpZXJhcmNoeSkifX0sX2dldFRlbXBsYXRlSW5kZXg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0VGVtcGxhdGVJbmRleCgpfSxfZ2V0Tm9kZTpmdW5jdGlvbihiLGQpe3JldHVybiBkLm5vZGUoYil9LF9nZXRQcmludGFibGVIVE1MTm9kZU5hbWU6ZnVuY3Rpb24oYil7cmV0dXJuKGJ8fCIiKS5yZXBsYWNlKC9cLy9nLCJceDNjd2JyXHgzZS8iKX0sX2dldFJlbmRlckluZm86ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMucmVuZGVySGllcmFyY2h5LmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZShiKX0sCl90b2dnbGVFeHBhbmRlZDpmdW5jdGlvbigpe3RoaXMuX2V4cGFuZGVkPSF0aGlzLl9leHBhbmRlZH0sX2dldFRvZ2dsZUljb246ZnVuY3Rpb24oYil7cmV0dXJuIGI/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfcmVzaXplTGlzdDpmdW5jdGlvbihiKXsoYj1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGIpKSYmYi5maXJlKCJpcm9uLXJlc2l6ZSIpfSxfZ2V0SW5jb21wYXRpYmxlT3BOb2RlczpmdW5jdGlvbihiLGQpe2lmKGImJmIucm9vdClyZXR1cm4gdGhpcy5hc3luYyh0aGlzLl9yZXNpemVMaXN0LmJpbmQodGhpcywiI2luY29tcGF0aWJsZU9wc0xpc3QiKSksdGYuZ3JhcGguaGllcmFyY2h5LmdldEluY29tcGF0aWJsZU9wcyhiLGQpfSxfY29tcHV0ZU9wQ29tcGF0U2NvcmU6ZnVuY3Rpb24oYil7aWYoYiYmYi5yb290KXt2YXIgZD1iLnJvb3Q7Yj1kLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZTtkPWQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU7CnJldHVybiAwPT1iJiYwPT1kPzA6TWF0aC5mbG9vcigxMDAqYi8oYitkKSkvMTAwfXJldHVybiAwfSxfZ2V0T3BDb21wYXRTY29yZUxhYmVsOmZ1bmN0aW9uKGIpe3JldHVybiBkMy5mb3JtYXQoIi4wJSIpKGIpfSxfZ2V0VG90YWxJbmNvbXBhdGlibGVPcHM6ZnVuY3Rpb24oYil7cmV0dXJuIGImJmIucm9vdD9iLnJvb3QuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU6MH19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtaW5mby90Zi1ub2RlLWxpc3QtaXRlbS5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ub2RlLWxpc3QtaXRlbSIscHJvcGVydGllczp7Y2FyZE5vZGU6T2JqZWN0LGl0ZW1Ob2RlOk9iamVjdCxlZGdlTGFiZWw6U3RyaW5nLGl0ZW1SZW5kZXJJbmZvOk9iamVjdCxuYW1lOlN0cmluZyxpdGVtVHlwZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9pdGVtVHlwZUNoYW5nZWQifSxjb2xvckJ5OlN0cmluZyxjb2xvckJ5UGFyYW1zOk9iamVjdCx0ZW1wbGF0ZUluZGV4OkZ1bmN0aW9ufSxfaXRlbVR5cGVDaGFuZ2VkOmZ1bmN0aW9uKCl7InN1Ym5vZGUiIT09dGhpcy5pdGVtVHlwZT90aGlzLiRbImxpc3QtaXRlbSJdLmNsYXNzTGlzdC5hZGQoImNsaWNrYWJsZSIpOnRoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LnJlbW92ZSgiY2xpY2thYmxlIil9LF9ub2RlTGlzdGVuZXI6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJub2RlLWxpc3QtaXRlbS0iK2IudHlwZSx7Y2FyZE5vZGU6dGhpcy5jYXJkTm9kZS5uYW1lLG5vZGVOYW1lOnRoaXMubmFtZSwKdHlwZTp0aGlzLml0ZW1UeXBlfSl9LF9mYWRlZENsYXNzOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLmlzRmFkZWRPdXQ/ImZhZGVkIjoiIn19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtaW5mby90Zi1ub2RlLWluZm8uaHRtbC5qcwooZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtbm9kZS1pbmZvIixwcm9wZXJ0aWVzOntncmFwaE5vZGVOYW1lOlN0cmluZyxncmFwaEhpZXJhcmNoeTpPYmplY3QscmVuZGVySGllcmFyY2h5Ok9iamVjdCxjb2xvckJ5OlN0cmluZyxfdGVtcGxhdGVJbmRleDp7dHlwZTpGdW5jdGlvbixjb21wdXRlZDoiX2dldFRlbXBsYXRlSW5kZXgoZ3JhcGhIaWVyYXJjaHkpIn0sX25vZGU6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0Tm9kZShncmFwaE5vZGVOYW1lLCBncmFwaEhpZXJhcmNoeSkiLG9ic2VydmVyOiJfcmVzZXRTdGF0ZSJ9LF9ub2RlU3RhdHM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0Tm9kZVN0YXRzKGdyYXBoTm9kZU5hbWUsIGdyYXBoSGllcmFyY2h5KSIsb2JzZXJ2ZXI6Il9yZXNldFN0YXRlIn0sX2hhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2dldEhhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzKF9ub2RlU3RhdHMpIn0sX25vZGVTdGF0c0Zvcm1hdHRlZEJ5dGVzOnt0eXBlOlN0cmluZywKY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRCeXRlcyhfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZShfbm9kZVN0YXRzKSJ9LF9ub2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldE5vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzKF9ub2RlU3RhdHMpIn0sbm9kZUluY2x1ZGU6e3R5cGU6TnVtYmVyLG9ic2VydmVyOiJfbm9kZUluY2x1ZGVTdGF0ZUNoYW5nZWQifSxfYXR0cmlidXRlczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEF0dHJpYnV0ZXMoX25vZGUpIn0sX2RldmljZTp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9nZXREZXZpY2UoX25vZGUpIn0sX3N1Y2Nlc3NvcnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0U3VjY2Vzc29ycyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sCl9wcmVkZWNlc3NvcnM6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0UHJlZGVjZXNzb3JzKF9ub2RlLCBncmFwaEhpZXJhcmNoeSkifSxfZnVuY3Rpb25Vc2FnZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9nZXRGdW5jdGlvblVzYWdlcyhfbm9kZSwgZ3JhcGhIaWVyYXJjaHkpIn0sX3N1Ym5vZGVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0U3Vibm9kZXMoX25vZGUpIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITB9LF90b3RhbFByZWRlY2Vzc29yczp7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9nZXRUb3RhbFByZWQoX3ByZWRlY2Vzc29ycykifSxfdG90YWxTdWNjZXNzb3JzOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2dldFRvdGFsU3VjYyhfc3VjY2Vzc29ycykifSxfb3BlbmVkQ29udHJvbFByZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX29wZW5lZENvbnRyb2xTdWNjOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9hdXhCdXR0b25UZXh0OlN0cmluZyxfZ3JvdXBCdXR0b25UZXh0OlN0cmluZ30sCmV4cGFuZE5vZGU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoIl9ub2RlLmV4cGFuZCIsdGhpcy5ub2RlKX0sX2dldFRlbXBsYXRlSW5kZXg6ZnVuY3Rpb24oYil7cmV0dXJuIGIuZ2V0VGVtcGxhdGVJbmRleCgpfSxfZ2V0Tm9kZTpmdW5jdGlvbihiLGQpe3JldHVybiBkLm5vZGUoYil9LF9nZXROb2RlU3RhdHM6ZnVuY3Rpb24oYixkKXtyZXR1cm4oYj10aGlzLl9nZXROb2RlKGIsZCkpP2Iuc3RhdHM6bnVsbH0sX2dldFRvdGFsTWljcm9zOmZ1bmN0aW9uKGIpe3JldHVybiBiP2IuZ2V0VG90YWxNaWNyb3MoKTowfSxfZ2V0SGFzRGlzcGxheWFibGVOb2RlU3RhdHM6ZnVuY3Rpb24oYil7cmV0dXJuIHRmLmdyYXBoLnV0aWwuaGFzRGlzcGxheWFibGVOb2RlU3RhdHMoYil9LF9nZXROb2RlU3RhdHNGb3JtYXR0ZWRCeXRlczpmdW5jdGlvbihiKXtpZihiJiZiLnRvdGFsQnl0ZXMpcmV0dXJuIHRmLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKGIudG90YWxCeXRlcyx0Zi5ncmFwaC51dGlsLk1FTU9SWV9VTklUUyl9LApfZ2V0Tm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWU6ZnVuY3Rpb24oYil7aWYoYiYmYi5nZXRUb3RhbE1pY3JvcygpKXJldHVybiB0Zi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShiLmdldFRvdGFsTWljcm9zKCksdGYuZ3JhcGgudXRpbC5USU1FX1VOSVRTKX0sX2dldE5vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzOmZ1bmN0aW9uKGIpe2lmKGImJmIub3V0cHV0U2l6ZSYmYi5vdXRwdXRTaXplLmxlbmd0aClyZXR1cm4gXy5tYXAoYi5vdXRwdXRTaXplLGZ1bmN0aW9uKGQpe3JldHVybiAwPT09ZC5sZW5ndGg/InNjYWxhciI6IlsiK2Quam9pbigiLCAiKSsiXSJ9KX0sX2dldFByaW50YWJsZUhUTUxOb2RlTmFtZTpmdW5jdGlvbihiKXtyZXR1cm4oYnx8IiIpLnJlcGxhY2UoL1wvL2csIlx4M2N3YnJceDNlLyIpfSxfZ2V0UmVuZGVySW5mbzpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKGIpfSwKX2dldEF0dHJpYnV0ZXM6ZnVuY3Rpb24oYil7dGhpcy5hc3luYyh0aGlzLl9yZXNpemVMaXN0LmJpbmQodGhpcywiI2F0dHJpYnV0ZXNMaXN0IikpO2lmKCFifHwhYi5hdHRyKXJldHVybltdO3ZhciBkPVtdO18uZWFjaChiLmF0dHIsZnVuY3Rpb24oZil7Zi5rZXk9PT10Zi5ncmFwaC5MQVJHRV9BVFRSU19LRVk/ZD1kLmNvbmNhdChmLnZhbHVlLmxpc3Qucy5tYXAoZnVuY3Rpb24oaCl7cmV0dXJue2tleTpoLHZhbHVlOiJUb28gbGFyZ2UgdG8gc2hvdy4uLiJ9fSkpOmQucHVzaCh7a2V5OmYua2V5LHZhbHVlOkpTT04uc3RyaW5naWZ5KGYudmFsdWUpfSl9KTtyZXR1cm4gZH0sX2dldERldmljZTpmdW5jdGlvbihiKXtyZXR1cm4gYj9iLmRldmljZTpudWxsfSxfZ2V0U3VjY2Vzc29ycyhiLGQpe3RoaXMuX3JlZnJlc2hOb2RlSXRlbUxpc3QoImlucHV0c0xpc3QiKTtyZXR1cm4gYj90aGlzLl9jb252ZXJ0RWRnZUxpc3RUb0VkZ2VJbmZvTGlzdChkLmdldFN1Y2Nlc3NvcnMoYi5uYW1lKSwKITEsYi5pc0dyb3VwTm9kZSk6e3JlZ3VsYXI6W10sY29udHJvbDpbXX19LF9nZXRQcmVkZWNlc3NvcnMoYixkKXt0aGlzLl9yZWZyZXNoTm9kZUl0ZW1MaXN0KCJvdXRwdXRzTGlzdCIpO3JldHVybiBiP3RoaXMuX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0KGQuZ2V0UHJlZGVjZXNzb3JzKGIubmFtZSksITAsYi5pc0dyb3VwTm9kZSk6e3JlZ3VsYXI6W10sY29udHJvbDpbXX19LF9nZXRGdW5jdGlvblVzYWdlcyhiLGQpe3RoaXMuX3JlZnJlc2hOb2RlSXRlbUxpc3QoImZ1bmN0aW9uVXNhZ2VzTGlzdCIpO3JldHVybiBiJiZiLnR5cGU9PT10Zi5ncmFwaC5Ob2RlVHlwZS5NRVRBPyhiPWQubGlicmFyeUZ1bmN0aW9uc1tiLmFzc29jaWF0ZWRGdW5jdGlvbl0pP2IudXNhZ2VzOltdOltdfSxfcmVmcmVzaE5vZGVJdGVtTGlzdChiKXt0aGlzLmFzeW5jKHRoaXMuX3Jlc2l6ZUxpc3QuYmluZCh0aGlzLGAjJHtifWApKX0sX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0OmZ1bmN0aW9uKGIsCmQsZil7dmFyIGg9dD0+Xy5tYXAodC5iYXNlRWRnZUxpc3QsbD0+e3ZhciBwPWQ/bC52OmwudztyZXR1cm57bmFtZTpwLG5vZGU6dGhpcy5fZ2V0Tm9kZShwLHRoaXMuZ3JhcGhIaWVyYXJjaHkpLGVkZ2VMYWJlbDp0Zi5ncmFwaC5zY2VuZS5lZGdlLmdldExhYmVsRm9yQmFzZUVkZ2UobCx0aGlzLnJlbmRlckhpZXJhcmNoeSkscmVuZGVySW5mbzp0aGlzLl9nZXRSZW5kZXJJbmZvKHAsdGhpcy5yZW5kZXJIaWVyYXJjaHkpfX0pLGs9ZnVuY3Rpb24odCl7dmFyIGw9W107Xy5lYWNoKHQscD0+e3ZhciBtPWQ/cC52OnAudztmJiYxIT1wLmJhc2VFZGdlTGlzdC5sZW5ndGg/bC5wdXNoKHtuYW1lOm0sbm9kZTp0aGlzLl9nZXROb2RlKG0sdGhpcy5ncmFwaEhpZXJhcmNoeSksZWRnZUxhYmVsOnRmLmdyYXBoLnNjZW5lLmVkZ2UuZ2V0TGFiZWxGb3JFZGdlKHAsdGhpcy5yZW5kZXJIaWVyYXJjaHkpLHJlbmRlckluZm86dGhpcy5fZ2V0UmVuZGVySW5mbyhtLHRoaXMucmVuZGVySGllcmFyY2h5KX0pOgpsPWwuY29uY2F0KGgocCkpfSk7cmV0dXJuIGx9LmJpbmQodGhpcyk7cmV0dXJue3JlZ3VsYXI6ayhiLnJlZ3VsYXIpLGNvbnRyb2w6ayhiLmNvbnRyb2wpfX0sX2dldFN1Ym5vZGVzOmZ1bmN0aW9uKGIpe3JldHVybiBiJiZiLm1ldGFncmFwaD9iLm1ldGFncmFwaC5ub2RlcygpOm51bGx9LF9nZXRUb3RhbFByZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIGIucmVndWxhci5sZW5ndGgrYi5jb250cm9sLmxlbmd0aH0sX2dldFRvdGFsU3VjYzpmdW5jdGlvbihiKXtyZXR1cm4gYi5yZWd1bGFyLmxlbmd0aCtiLmNvbnRyb2wubGVuZ3RofSxfdG9nZ2xlQ29udHJvbFByZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vcGVuZWRDb250cm9sUHJlZD0hdGhpcy5fb3BlbmVkQ29udHJvbFByZWR9LF90b2dnbGVDb250cm9sU3VjYzpmdW5jdGlvbigpe3RoaXMuX29wZW5lZENvbnRyb2xTdWNjPSF0aGlzLl9vcGVuZWRDb250cm9sU3VjY30sX3RvZ2dsZUV4cGFuZGVkOmZ1bmN0aW9uKCl7dGhpcy5fZXhwYW5kZWQ9CiF0aGlzLl9leHBhbmRlZH0sX2dldFRvZ2dsZUljb246ZnVuY3Rpb24oYil7cmV0dXJuIGI/ImV4cGFuZC1sZXNzIjoiZXhwYW5kLW1vcmUifSxfcmVzZXRTdGF0ZTpmdW5jdGlvbigpe3RoaXMuX29wZW5lZENvbnRyb2xTdWNjPXRoaXMuX29wZW5lZENvbnRyb2xQcmVkPSExO3RoaXMuc2V0KCJfZ3JvdXBCdXR0b25UZXh0Iix0Zi5ncmFwaC5zY2VuZS5ub2RlLmdldEdyb3VwU2V0dGluZ0xhYmVsKHRoaXMuX25vZGUpKTt0aGlzLl9ub2RlJiYoUG9seW1lci5kb20odGhpcy4kLm5vZGV0aXRsZSkuaW5uZXJIVE1MPXRoaXMuX2dldFByaW50YWJsZUhUTUxOb2RlTmFtZSh0aGlzLl9ub2RlLm5hbWUpKX0sX3Jlc2l6ZUxpc3Q6ZnVuY3Rpb24oYil7KGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihiKSkmJmIuZmlyZSgiaXJvbi1yZXNpemUiKX0sX3RvZ2dsZUluY2x1ZGU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoIm5vZGUtdG9nZ2xlLWluY2x1c2lvbiIse25hbWU6dGhpcy5ncmFwaE5vZGVOYW1lfSl9LApfbm9kZUluY2x1ZGVTdGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5zZXQoIl9hdXhCdXR0b25UZXh0Iix0Zi5ncmFwaC5nZXRJbmNsdWRlTm9kZUJ1dHRvblN0cmluZyhiKSl9LF90b2dnbGVHcm91cDpmdW5jdGlvbigpe3ZhciBiPXRmLmdyYXBoLnNjZW5lLm5vZGUuZ2V0U2VyaWVzTmFtZSh0aGlzLl9ub2RlKTt0aGlzLmZpcmUoIm5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwIix7bmFtZTpifSl9LF9pc0xpYnJhcnlGdW5jdGlvbihiKXtyZXR1cm4gYiYmYi5uYW1lLnN0YXJ0c1dpdGgodGYuZ3JhcGguRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCl9LF9pc0luU2VyaWVzOmZ1bmN0aW9uKGIpe3JldHVybiB0Zi5ncmFwaC5zY2VuZS5ub2RlLmNhbkJlSW5TZXJpZXMoYil9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWluZm8vdGYtZ3JhcGgtaW5mby5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ncmFwaC1pbmZvIixwcm9wZXJ0aWVzOnt0aXRsZTpTdHJpbmcsZ3JhcGhIaWVyYXJjaHk6T2JqZWN0LGdyYXBoOk9iamVjdCxyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM6T2JqZWN0LGhlYWx0aFBpbGxTdGVwSW5kZXg6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sY29sb3JCeTpTdHJpbmcsY29tcGF0Tm9kZVRpdGxlOlN0cmluZyxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0saGlnaGxpZ2h0ZWROb2RlOnt0eXBlOlN0cmluZyxub3RpZnk6ITB9LHNlbGVjdGVkTm9kZUluY2x1ZGU6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sZGVidWdnZXJEYXRhRW5hYmxlZDpCb29sZWFufSxsaXN0ZW5lcnM6eyJub2RlLWxpc3QtaXRlbS1jbGljayI6Il9ub2RlTGlzdEl0ZW1DbGlja2VkIiwibm9kZS1saXN0LWl0ZW0tbW91c2VvdmVyIjoiX25vZGVMaXN0SXRlbU1vdXNlb3ZlciIsIm5vZGUtbGlzdC1pdGVtLW1vdXNlb3V0IjoiX25vZGVMaXN0SXRlbU1vdXNlb3V0In0sCl9ub2RlTGlzdEl0ZW1DbGlja2VkOmZ1bmN0aW9uKGIpe3RoaXMuc2VsZWN0ZWROb2RlPWIuZGV0YWlsLm5vZGVOYW1lfSxfbm9kZUxpc3RJdGVtTW91c2VvdmVyOmZ1bmN0aW9uKGIpe3RoaXMuaGlnaGxpZ2h0ZWROb2RlPWIuZGV0YWlsLm5vZGVOYW1lfSxfbm9kZUxpc3RJdGVtTW91c2VvdXQ6ZnVuY3Rpb24oKXt0aGlzLmhpZ2hsaWdodGVkTm9kZT1udWxsfSxfaGVhbHRoUGlsbHNBdmFpbGFibGU6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYiYmZCYmMDxPYmplY3Qua2V5cyhkKS5sZW5ndGh9LF9lcXVhbHM6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYj09PWR9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLWJvYXJkL3RmLWdyYXBoLWJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoLWJvYXJkIixwcm9wZXJ0aWVzOntncmFwaEhpZXJhcmNoeTpPYmplY3QsZ3JhcGg6T2JqZWN0LHN0YXRzOk9iamVjdCxwcm9ncmVzczpPYmplY3QsdHJhY2VJbnB1dHM6Qm9vbGVhbixjb2xvckJ5OlN0cmluZyxjb2xvckJ5UGFyYW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LHJlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxkZWJ1Z2dlckRhdGFFbmFibGVkOkJvb2xlYW4sYXJlSGVhbHRoUGlsbHNMb2FkaW5nOkJvb2xlYW4sZGVidWdnZXJOdW1lcmljQWxlcnRzOnt0eXBlOkFycmF5LG5vdGlmeTohMH0sbm9kZU5hbWVzVG9IZWFsdGhQaWxsczpPYmplY3QsYWxsU3RlcHNNb2RlRW5hYmxlZDp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCx2YWx1ZTohMX0sc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwLHZhbHVlOjB9LGhlYWx0aFBpbGxTdGVwSW5kZXg6TnVtYmVyLHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsCm5vdGlmeTohMH0sY29tcGF0Tm9kZVRpdGxlOnt0eXBlOlN0cmluZyx2YWx1ZToiVFBVIENvbXBhdGliaWxpdHkifSxlZGdlV2lkdGhGdW5jdGlvbjpPYmplY3QsX3NlbGVjdGVkTm9kZUluY2x1ZGU6TnVtYmVyLF9oaWdobGlnaHRlZE5vZGU6U3RyaW5nLGhhbmRsZU5vZGVTZWxlY3RlZDpPYmplY3QsZWRnZUxhYmVsRnVuY3Rpb246T2JqZWN0LGhhbmRsZUVkZ2VTZWxlY3RlZDpPYmplY3R9LG9ic2VydmVyczpbIl91cGRhdGVOb2RlSW5jbHVkZShzZWxlY3RlZE5vZGUsIHJlbmRlckhpZXJhcmNoeSkiXSxmaXQ6ZnVuY3Rpb24oKXt0aGlzLiQuZ3JhcGguZml0KCl9LF9pc05vdENvbXBsZXRlOmZ1bmN0aW9uKGIpe3JldHVybiAxMDA+Yi52YWx1ZX0sX2dldENvbnRhaW5lckNsYXNzOmZ1bmN0aW9uKGIpe3ZhciBkPSJjb250YWluZXIiO2IuZXJyb3ImJihkKz0iIGVycm9yIik7dGhpcy5faXNOb3RDb21wbGV0ZShiKSYmKGQrPSIgbG9hZGluZyIpO3JldHVybiBkfSxfb25Ob2RlSW5jbHVzaW9uVG9nZ2xlZChiKXt0aGlzLiQuZ3JhcGgubm9kZVRvZ2dsZUV4dHJhY3QoYi5kZXRhaWwubmFtZSl9LApfb25Ob2RlU2VyaWVzR3JvdXBUb2dnbGVkKGIpe3RoaXMuJC5ncmFwaC5ub2RlVG9nZ2xlU2VyaWVzR3JvdXAoYi5kZXRhaWwubmFtZSl9LF91cGRhdGVOb2RlSW5jbHVkZSgpe2NvbnN0IGI9dGhpcy5yZW5kZXJIaWVyYXJjaHk/dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0Tm9kZUJ5TmFtZSh0aGlzLnNlbGVjdGVkTm9kZSk6bnVsbDt0aGlzLl9zZWxlY3RlZE5vZGVJbmNsdWRlPWI/Yi5pbmNsdWRlOnRmLmdyYXBoLkluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUR9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vaXJvbi1tZW51LWJlaGF2aW9yL2lyb24tbWVudWJhci1iZWhhdmlvci5odG1sLmpzClBvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGw9e2hvc3RBdHRyaWJ1dGVzOntyb2xlOiJtZW51YmFyIn0sa2V5QmluZGluZ3M6e2xlZnQ6Il9vbkxlZnRLZXkiLHJpZ2h0OiJfb25SaWdodEtleSJ9LF9vblVwS2V5OmZ1bmN0aW9uKGIpe3RoaXMuZm9jdXNlZEl0ZW0uY2xpY2soKTtiLmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vbkRvd25LZXk6ZnVuY3Rpb24oYil7dGhpcy5mb2N1c2VkSXRlbS5jbGljaygpO2IuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sZ2V0IF9pc1JUTCgpe3JldHVybiJydGwiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlyZWN0aW9ufSxfb25MZWZ0S2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2lzUlRMP3RoaXMuX2ZvY3VzTmV4dCgpOnRoaXMuX2ZvY3VzUHJldmlvdXMoKTtiLmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vblJpZ2h0S2V5OmZ1bmN0aW9uKGIpe3RoaXMuX2lzUlRMPwp0aGlzLl9mb2N1c1ByZXZpb3VzKCk6dGhpcy5fZm9jdXNOZXh0KCk7Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxfb25LZXlkb3duOmZ1bmN0aW9uKGIpe3RoaXMua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzKGIsInVwIGRvd24gbGVmdCByaWdodCBlc2MiKXx8dGhpcy5fZm9jdXNXaXRoS2V5Ym9hcmRFdmVudChiKX19O1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvcj1bUG9seW1lci5Jcm9uTWVudUJlaGF2aW9yLFBvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXJhZGlvLWJ1dHRvbi9wYXBlci1yYWRpby1idXR0b24uaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItcmFkaW8tYnV0dG9uIixiZWhhdmlvcnM6W1BvbHltZXIuUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9yXSxob3N0QXR0cmlidXRlczp7cm9sZToicmFkaW8iLCJhcmlhLWNoZWNrZWQiOiExLHRhYmluZGV4OjB9LHByb3BlcnRpZXM6e2FyaWFBY3RpdmVBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJhcmlhLWNoZWNrZWQifX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLnJhZGlvQ29udGFpbmVyfSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLGZ1bmN0aW9uKCl7aWYoIi0xcHgiPT09dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUiKS50cmltKCkpe3ZhciBiPXBhcnNlRmxvYXQodGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSIpLnRyaW0oKSksCmQ9TWF0aC5mbG9vcigzKmIpO2QlMiE9PWIlMiYmZCsrO3RoaXMudXBkYXRlU3R5bGVzKHsiLS1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUiOmQrInB4In0pfX0pfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXJhZGlvLWdyb3VwL3BhcGVyLXJhZGlvLWdyb3VwLmh0bWwuanMKUG9seW1lcih7aXM6InBhcGVyLXJhZGlvLWdyb3VwIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvcl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InJhZGlvZ3JvdXAifSxwcm9wZXJ0aWVzOnthdHRyRm9yU2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJuYW1lIn0sc2VsZWN0ZWRBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJjaGVja2VkIn0sc2VsZWN0YWJsZTp7dHlwZTpTdHJpbmcsdmFsdWU6InBhcGVyLXJhZGlvLWJ1dHRvbiJ9LGFsbG93RW1wdHlTZWxlY3Rpb246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LHNlbGVjdDpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl92YWx1ZVRvSXRlbShiKTtpZighZHx8IWQuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKXtpZih0aGlzLnNlbGVjdGVkKXtkPXRoaXMuX3ZhbHVlVG9JdGVtKHRoaXMuc2VsZWN0ZWQpO2lmKHRoaXMuc2VsZWN0ZWQ9PWIpaWYodGhpcy5hbGxvd0VtcHR5U2VsZWN0aW9uKWI9IiI7ZWxzZXtkJiYKKGQuY2hlY2tlZD0hMCk7cmV0dXJufWQmJihkLmNoZWNrZWQ9ITEpfVBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvci5zZWxlY3QuYXBwbHkodGhpcyxbYl0pO3RoaXMuZmlyZSgicGFwZXItcmFkaW8tZ3JvdXAtY2hhbmdlZCIpfX0sX2FjdGl2YXRlRm9jdXNlZEl0ZW06ZnVuY3Rpb24oKXt0aGlzLl9pdGVtQWN0aXZhdGUodGhpcy5fdmFsdWVGb3JJdGVtKHRoaXMuZm9jdXNlZEl0ZW0pLHRoaXMuZm9jdXNlZEl0ZW0pfSxfb25VcEtleTpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c1ByZXZpb3VzKCk7Yi5wcmV2ZW50RGVmYXVsdCgpO3RoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uRG93bktleTpmdW5jdGlvbihiKXt0aGlzLl9mb2N1c05leHQoKTtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5fYWN0aXZhdGVGb2N1c2VkSXRlbSgpfSxfb25MZWZ0S2V5OmZ1bmN0aW9uKGIpe1BvbHltZXIuSXJvbk1lbnViYXJCZWhhdmlvckltcGwuX29uTGVmdEtleS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7CnRoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uUmlnaHRLZXk6ZnVuY3Rpb24oYil7UG9seW1lci5Jcm9uTWVudWJhckJlaGF2aW9ySW1wbC5fb25SaWdodEtleS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7dGhpcy5fYWN0aXZhdGVGb2N1c2VkSXRlbSgpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXRvb2x0aXAvcGFwZXItdG9vbHRpcC5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10b29sdGlwIixob3N0QXR0cmlidXRlczp7cm9sZToidG9vbHRpcCIsdGFiaW5kZXg6LTF9LHByb3BlcnRpZXM6e2Zvcjp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9maW5kVGFyZ2V0In0sbWFudWFsTW9kZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfbWFudWFsTW9kZUNoYW5nZWQifSxwb3NpdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6ImJvdHRvbSJ9LGZpdFRvVmlzaWJsZUJvdW5kczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxvZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjE0fSxtYXJnaW5Ub3A6e3R5cGU6TnVtYmVyLHZhbHVlOjE0fSxhbmltYXRpb25EZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6NTAwLG9ic2VydmVyOiJfZGVsYXlDaGFuZ2UifSxhbmltYXRpb25FbnRyeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LGFuaW1hdGlvbkV4aXQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxhbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0LAp2YWx1ZTpmdW5jdGlvbigpe3JldHVybntlbnRyeTpbe25hbWU6ImZhZGUtaW4tYW5pbWF0aW9uIixub2RlOnRoaXMsdGltaW5nOntkZWxheTowfX1dLGV4aXQ6W3tuYW1lOiJmYWRlLW91dC1hbmltYXRpb24iLG5vZGU6dGhpc31dfX19LF9zaG93aW5nOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxsaXN0ZW5lcnM6e3dlYmtpdEFuaW1hdGlvbkVuZDoiX29uQW5pbWF0aW9uRW5kIn0sZ2V0IHRhcmdldCgpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMpLnBhcmVudE5vZGUsZD1Qb2x5bWVyLmRvbSh0aGlzKS5nZXRPd25lclJvb3QoKTtyZXR1cm4gdGhpcy5mb3I/UG9seW1lci5kb20oZCkucXVlcnlTZWxlY3RvcigiIyIrdGhpcy5mb3IpOmIubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERT9kLmhvc3Q6Yn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9maW5kVGFyZ2V0KCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5tYW51YWxNb2RlfHx0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKX0sCnBsYXlBbmltYXRpb246ZnVuY3Rpb24oYil7ImVudHJ5Ij09PWI/dGhpcy5zaG93KCk6ImV4aXQiPT09YiYmdGhpcy5oaWRlKCl9LGNhbmNlbEFuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImNhbmNlbC1hbmltYXRpb24iKX0sc2hvdzpmdW5jdGlvbigpe2lmKCF0aGlzLl9zaG93aW5nKXtpZigiIj09PVBvbHltZXIuZG9tKHRoaXMpLnRleHRDb250ZW50LnRyaW0oKSl7Zm9yKHZhciBiPSEwLGQ9UG9seW1lci5kb20odGhpcykuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpLGY9MDtmPGQubGVuZ3RoO2YrKylpZigiIiE9PWRbZl0udGV4dENvbnRlbnQudHJpbSgpKXtiPSExO2JyZWFrfWlmKGIpcmV0dXJufXRoaXMuX3Nob3dpbmc9ITA7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIik7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgiY2FuY2VsLWFuaW1hdGlvbiIpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZXhpdCIpKTsKdGhpcy51cGRhdGVQb3NpdGlvbigpO3RoaXMuX2FuaW1hdGlvblBsYXlpbmc9ITA7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJlbnRyeSIpKX19LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLl9zaG93aW5nJiYodGhpcy5fYW5pbWF0aW9uUGxheWluZz8odGhpcy5fc2hvd2luZz0hMSx0aGlzLl9jYW5jZWxBbmltYXRpb24oKSk6KHRoaXMuX29uQW5pbWF0aW9uRmluaXNoKCksdGhpcy5fc2hvd2luZz0hMSx0aGlzLl9hbmltYXRpb25QbGF5aW5nPSEwKSl9LHVwZGF0ZVBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fdGFyZ2V0JiZ0aGlzLm9mZnNldFBhcmVudCl7dmFyIGI9dGhpcy5vZmZzZXQ7MTQhPXRoaXMubWFyZ2luVG9wJiYxND09dGhpcy5vZmZzZXQmJihiPXRoaXMubWFyZ2luVG9wKTt2YXIgZD10aGlzLm9mZnNldFBhcmVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxmPXRoaXMuX3RhcmdldC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKaD10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGs9KGYud2lkdGgtaC53aWR0aCkvMix0PShmLmhlaWdodC1oLmhlaWdodCkvMixsPWYubGVmdC1kLmxlZnQscD1mLnRvcC1kLnRvcDtzd2l0Y2godGhpcy5wb3NpdGlvbil7Y2FzZSAidG9wIjp2YXIgbT1sK2s7dmFyIG49cC1oLmhlaWdodC1iO2JyZWFrO2Nhc2UgImJvdHRvbSI6bT1sK2s7bj1wK2YuaGVpZ2h0K2I7YnJlYWs7Y2FzZSAibGVmdCI6bT1sLWgud2lkdGgtYjtuPXArdDticmVhaztjYXNlICJyaWdodCI6bT1sK2Yud2lkdGgrYixuPXArdH10aGlzLmZpdFRvVmlzaWJsZUJvdW5kcz8oZC5sZWZ0K20raC53aWR0aD53aW5kb3cuaW5uZXJXaWR0aD8odGhpcy5zdHlsZS5yaWdodD0iMHB4Iix0aGlzLnN0eWxlLmxlZnQ9ImF1dG8iKToodGhpcy5zdHlsZS5sZWZ0PU1hdGgubWF4KDAsbSkrInB4Iix0aGlzLnN0eWxlLnJpZ2h0PSJhdXRvIiksZC50b3ArbitoLmhlaWdodD53aW5kb3cuaW5uZXJIZWlnaHQ/KHRoaXMuc3R5bGUuYm90dG9tPQpkLmhlaWdodCsicHgiLHRoaXMuc3R5bGUudG9wPSJhdXRvIik6KHRoaXMuc3R5bGUudG9wPU1hdGgubWF4KC1kLnRvcCxuKSsicHgiLHRoaXMuc3R5bGUuYm90dG9tPSJhdXRvIikpOih0aGlzLnN0eWxlLmxlZnQ9bSsicHgiLHRoaXMuc3R5bGUudG9wPW4rInB4Iil9fSxfYWRkTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdGFyZ2V0JiYodGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWVudGVyIiwic2hvdyIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwiZm9jdXMiLCJzaG93IiksdGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWxlYXZlIiwiaGlkZSIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwiYmx1ciIsImhpZGUiKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsInRhcCIsImhpZGUiKSk7dGhpcy5saXN0ZW4odGhpcy4kLnRvb2x0aXAsImFuaW1hdGlvbmVuZCIsIl9vbkFuaW1hdGlvbkVuZCIpO3RoaXMubGlzdGVuKHRoaXMsIm1vdXNlZW50ZXIiLCJoaWRlIil9LApfZmluZFRhcmdldDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZXx8dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCk7dGhpcy5fdGFyZ2V0PXRoaXMudGFyZ2V0O3RoaXMubWFudWFsTW9kZXx8dGhpcy5fYWRkTGlzdGVuZXJzKCl9LF9kZWxheUNoYW5nZTpmdW5jdGlvbihiKXs1MDAhPT1iJiZ0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1pbiI6YisibXMifSl9LF9tYW51YWxNb2RlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZT90aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKTp0aGlzLl9hZGRMaXN0ZW5lcnMoKX0sX2NhbmNlbEFuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZW50cnkiKSk7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpO3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKTsKdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIil9LF9vbkFuaW1hdGlvbkZpbmlzaDpmdW5jdGlvbigpe3RoaXMuX3Nob3dpbmcmJih0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImVudHJ5IikpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoImNhbmNlbC1hbmltYXRpb24iKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSkpfSxfb25BbmltYXRpb25FbmQ6ZnVuY3Rpb24oKXt0aGlzLl9hbmltYXRpb25QbGF5aW5nPSExO3RoaXMuX3Nob3dpbmd8fCh0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCgiaGlkZGVuIikpfSxfZ2V0QW5pbWF0aW9uVHlwZTpmdW5jdGlvbihiKXtpZigiZW50cnkiPT09YiYmIiIhPT10aGlzLmFuaW1hdGlvbkVudHJ5KXJldHVybiB0aGlzLmFuaW1hdGlvbkVudHJ5OwppZigiZXhpdCI9PT1iJiYiIiE9PXRoaXMuYW5pbWF0aW9uRXhpdClyZXR1cm4gdGhpcy5hbmltYXRpb25FeGl0O2lmKHRoaXMuYW5pbWF0aW9uQ29uZmlnW2JdJiYic3RyaW5nIj09PXR5cGVvZiB0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS5uYW1lKXtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS50aW1pbmcmJnRoaXMuYW5pbWF0aW9uQ29uZmlnW2JdWzBdLnRpbWluZy5kZWxheSYmMCE9PXRoaXMuYW5pbWF0aW9uQ29uZmlnW2JdWzBdLnRpbWluZy5kZWxheSl7dmFyIGQ9dGhpcy5hbmltYXRpb25Db25maWdbYl1bMF0udGltaW5nLmRlbGF5OyJlbnRyeSI9PT1iP3RoaXMudXBkYXRlU3R5bGVzKHsiLS1wYXBlci10b29sdGlwLWRlbGF5LWluIjpkKyJtcyJ9KToiZXhpdCI9PT1iJiZ0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQiOmQrIm1zIn0pfXJldHVybiB0aGlzLmFuaW1hdGlvbkNvbmZpZ1tiXVswXS5uYW1lfX0sX3JlbW92ZUxpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX3RhcmdldCYmCih0aGlzLnVubGlzdGVuKHRoaXMuX3RhcmdldCwibW91c2VlbnRlciIsInNob3ciKSx0aGlzLnVubGlzdGVuKHRoaXMuX3RhcmdldCwiZm9jdXMiLCJzaG93IiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsIm1vdXNlbGVhdmUiLCJoaWRlIiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsImJsdXIiLCJoaWRlIiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsInRhcCIsImhpZGUiKSk7dGhpcy51bmxpc3Rlbih0aGlzLiQudG9vbHRpcCwiYW5pbWF0aW9uZW5kIiwiX29uQW5pbWF0aW9uRW5kIik7dGhpcy51bmxpc3Rlbih0aGlzLCJtb3VzZWVudGVyIiwiaGlkZSIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWdyYXBoLW5vZGUtc2VhcmNoL3RmLWdyYXBoLW5vZGUtc2VhcmNoLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWdyYXBoLW5vZGUtc2VhcmNoIixwcm9wZXJ0aWVzOntyZW5kZXJIaWVyYXJjaHk6T2JqZWN0LHNlbGVjdGVkTm9kZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxfcmF3UmVnZXhJbnB1dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9yZWdleElucHV0Ont0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSZWdleElucHV0KHJlbmRlckhpZXJhcmNoeSwgX3Jhd1JlZ2V4SW5wdXQpIn0sX3ByZXZpb3VzUmVnZXhJbnB1dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9zZWFyY2hUaW1lb3V0RGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjE1MCxyZWFkT25seTohMH0sX3NlYXJjaFBlbmRpbmc6Qm9vbGVhbixfbWF4UmVnZXhSZXN1bHRzOnt0eXBlOk51bWJlcix2YWx1ZTo0Mn0sX3JlZ2V4TWF0Y2hlczpBcnJheX0sb2JzZXJ2ZXJzOlsiX3JlZ2V4SW5wdXRDaGFuZ2VkKF9yZWdleElucHV0KSJdLF9jb21wdXRlUmVnZXhJbnB1dChiLGQpe3JldHVybiBkLnRyaW0oKX0sCl9yZWdleElucHV0Q2hhbmdlZCgpe3RoaXMuX3JlcXVlc3RTZWFyY2goKX0sX2NsZWFyU2VhcmNoUmVzdWx0cygpe3RoaXMuc2V0KCJfcmVnZXhNYXRjaGVzIixbXSl9LF9yZXF1ZXN0U2VhcmNoKCl7dGhpcy5fc2VhcmNoUGVuZGluZ3x8KHRoaXMuX3JlZ2V4SW5wdXQ9PT10aGlzLl9wcmV2aW91c1JlZ2V4SW5wdXQ/dGhpcy5fc2VhcmNoUGVuZGluZz0hMToodGhpcy5fc2VhcmNoUGVuZGluZz0hMCx0aGlzLl9leGVjdXRlU2VhcmNoKCksdGhpcy5hc3luYygoKT0+e3RoaXMuX3NlYXJjaFBlbmRpbmc9ITE7dGhpcy5fcmVxdWVzdFNlYXJjaCgpfSx0aGlzLl9zZWFyY2hUaW1lb3V0RGVsYXkpKSl9LF9leGVjdXRlU2VhcmNoKCl7aWYodGhpcy5fcHJldmlvdXNSZWdleElucHV0PXRoaXMuX3JlZ2V4SW5wdXQpe3RyeXt2YXIgYj1uZXcgUmVnRXhwKHRoaXMuX3JlZ2V4SW5wdXQpfWNhdGNoKGYpe3RoaXMuX2NsZWFyU2VhcmNoUmVzdWx0cygpO3JldHVybn12YXIgZD1bXTtfLmVhY2godGhpcy5yZW5kZXJIaWVyYXJjaHkuaGllcmFyY2h5LmdldE5vZGVNYXAoKSwKKGYsaCk9PntpZihkLmxlbmd0aD49dGhpcy5fbWF4UmVnZXhSZXN1bHRzKXJldHVybiExO2IudGVzdChoKSYmZC5wdXNoKGgpfSk7dGhpcy5zZXQoIl9yZWdleE1hdGNoZXMiLGQpfWVsc2UgdGhpcy5fY2xlYXJTZWFyY2hSZXN1bHRzKCl9LF9tYXRjaENsaWNrZWQoYil7dGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsYi5tb2RlbC5pdGVtKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ncmFwaC1jb250cm9scy90Zi1ncmFwaC1jb250cm9scy5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtjb25zdCBoPS9kZXZpY2U6KFteOl0rOlswLTldKykkLyxrPVt7cmVnZXg6aH1dLHQ9W107bGV0IGw7KGZ1bmN0aW9uKG0pe20uQ09NUFVURV9USU1FPSJjb21wdXRlX3RpbWUiO20uTUVNT1JZPSJtZW1vcnkiO20uU1RSVUNUVVJFPSJzdHJ1Y3R1cmUiO20uWExBX0NMVVNURVI9InhsYV9jbHVzdGVyIjttLk9QX0NPTVBBVElCSUxJVFk9Im9wX2NvbXBhdGliaWxpdHkifSkobD1mLkNvbG9yQnl8fChmLkNvbG9yQnk9e30pKTtjb25zdCBwPW5ldyBTZXQoW2wuQ09NUFVURV9USU1FLGwuTUVNT1JZXSk7UG9seW1lcih7aXM6InRmLWdyYXBoLWNvbnRyb2xzIixwcm9wZXJ0aWVzOntzdGF0czp7dmFsdWU6bnVsbCx0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3N0YXRzQ2hhbmdlZCJ9LGRldmljZXNGb3JTdGF0czp7dmFsdWU6bnVsbCx0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZG9ubHk6ITB9LGNvbG9yQnk6e3R5cGU6U3RyaW5nLAp2YWx1ZTpsLlNUUlVDVFVSRSxub3RpZnk6ITB9LGNvbG9yQnlQYXJhbXM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxyZWFkb25seTohMH0sZGF0YXNldHM6e3R5cGU6QXJyYXksb2JzZXJ2ZXI6Il9kYXRhc2V0c0NoYW5nZWQiLHZhbHVlOigpPT5bXX0scmVuZGVySGllcmFyY2h5Ont0eXBlOk9iamVjdH0sc2VsZWN0aW9uOnt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZE9ubHk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlU2VsZWN0aW9uKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgsIF9zZWxlY3RlZEdyYXBoVHlwZSkifSxzZWxlY3RlZEZpbGU6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sX3NlbGVjdGVkUnVuSW5kZXg6e3R5cGU6TnVtYmVyLHZhbHVlOjAsb2JzZXJ2ZXI6Il9zZWxlY3RlZFJ1bkluZGV4Q2hhbmdlZCJ9LHRyYWNlSW5wdXRzOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxfc2VsZWN0ZWRUYWdJbmRleDp7dHlwZTpOdW1iZXIsCnZhbHVlOjAsb2JzZXJ2ZXI6Il9zZWxlY3RlZFRhZ0luZGV4Q2hhbmdlZCJ9LF9zZWxlY3RlZEdyYXBoVHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6Yi5ncmFwaC5TZWxlY3Rpb25UeXBlLk9QX0dSQVBIfSxzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2N1cnJlbnREZXZpY2VzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0Q3VycmVudERldmljZXMoZGV2aWNlc0ZvclN0YXRzKSJ9LF9jdXJyZW50RGV2aWNlUGFyYW1zOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfZ2V0Q3VycmVudERldmljZVBhcmFtcyhjb2xvckJ5UGFyYW1zKSJ9LF9jdXJyZW50WGxhQ2x1c3RlclBhcmFtczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2dldEN1cnJlbnRYbGFDbHVzdGVyUGFyYW1zKGNvbG9yQnlQYXJhbXMpIn0sX2N1cnJlbnRHcmFkaWVudFBhcmFtczp7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9nZXRDdXJyZW50R3JhZGllbnRQYXJhbXMoY29sb3JCeVBhcmFtcywgY29sb3JCeSkifSwKc2hvd1Nlc3Npb25SdW5zRHJvcGRvd246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH0sc2hvd1VwbG9hZEJ1dHRvbjp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxoZWFsdGhQaWxsc0ZlYXR1cmVFbmFibGVkOkJvb2xlYW4saGVhbHRoUGlsbHNUb2dnbGVkT246e3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9LF9sZWdlbmRPcGVuZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19LF94bGFDbHVzdGVyc1Byb3ZpZGVkOmZ1bmN0aW9uKG0pe3JldHVybiBtJiZtLmhpZXJhcmNoeSYmMDxtLmhpZXJhcmNoeS54bGFDbHVzdGVycy5sZW5ndGh9LF9zdGF0c0NoYW5nZWQ6ZnVuY3Rpb24obSl7aWYobnVsbCE9bSl7dmFyIG49e307Xy5lYWNoKG0uZGV2X3N0YXRzLGZ1bmN0aW9uKHEpe3ZhciB1PV8uc29tZShrLGZ1bmN0aW9uKEEpe3JldHVybiBBLnJlZ2V4LnRlc3QocS5kZXZpY2UpfSkseD1fLnNvbWUodCxmdW5jdGlvbihBKXtyZXR1cm4gQS5yZWdleC50ZXN0KHEuZGV2aWNlKX0pO3UmJiF4JiYobltxLmRldmljZV09CiEwKX0pO3RoaXMuc2V0KCJkZXZpY2VzRm9yU3RhdHMiLG4pfX0sX2dldEN1cnJlbnREZXZpY2VzOmZ1bmN0aW9uKG0pe3ZhciBuPXRoaXMuc3RhdHM7bj0obj9uLmRldl9zdGF0czpbXSkubWFwKHU9PnUuZGV2aWNlKS5maWx0ZXIodT0+ay5zb21lKHg9PngucmVnZXgudGVzdCh1KSkpO2NvbnN0IHE9Yi5ncmFwaC51dGlsLnJlbW92ZUNvbW1vblByZWZpeChuKTtpZigxPT1xLmxlbmd0aCl7Y29uc3QgdT1xWzBdLm1hdGNoKGgpO3UmJihxWzBdPXVbMV0pfXJldHVybiBuLm1hcCgodSx4KT0+e2xldCBBPW51bGw7dC5mb3JFYWNoKHk9Pnt5LnJlZ2V4LnRlc3QodSkmJihBPXkubXNnKX0pO3JldHVybntkZXZpY2U6dSxzdWZmaXg6cVt4XSx1c2VkOm1bdV0saWdub3JlZE1zZzpBfX0pfSxfZGV2aWNlQ2hlY2tib3hDbGlja2VkOmZ1bmN0aW9uKG0pe209bS50YXJnZXQ7Y29uc3Qgbj1PYmplY3QuYXNzaWduKHt9LHRoaXMuZGV2aWNlc0ZvclN0YXRzKSxxPW0udmFsdWU7bS5jaGVja2VkPwpuW3FdPSEwOmRlbGV0ZSBuW3FdO3RoaXMuc2V0KCJkZXZpY2VzRm9yU3RhdHMiLG4pfSxfbnVtVGFnczpmdW5jdGlvbihtLG4pe3JldHVybiB0aGlzLl9nZXRUYWdzKG0sbikubGVuZ3RofSxfZ2V0VGFnczpmdW5jdGlvbihtLG4pe3JldHVybiBtJiZtW25dP21bbl0udGFnczpbXX0sX2ZpdDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiZml0LXRhcCIpfSxfaXNHcmFkaWVudENvbG9yaW5nOmZ1bmN0aW9uKG0sbil7cmV0dXJuIHAuaGFzKG4pJiZudWxsIT1tfSxfZXF1YWxzOmZ1bmN0aW9uKG0sbil7cmV0dXJuIG09PT1ufSxfZ2V0Q3VycmVudERldmljZVBhcmFtczpmdW5jdGlvbihtKXttPW0uZGV2aWNlLmZpbHRlcih1PT5rLnNvbWUoeD0+eC5yZWdleC50ZXN0KHUuZGV2aWNlKSkpO2NvbnN0IG49Yi5ncmFwaC51dGlsLnJlbW92ZUNvbW1vblByZWZpeChtLm1hcCh1PT51LmRldmljZSkpO2lmKDE9PW4ubGVuZ3RoKXt2YXIgcT1uWzBdLm1hdGNoKGgpO3EmJihuWzBdPXFbMV0pfXJldHVybiBtLm1hcCgodSwKeCk9Pih7ZGV2aWNlOm5beF0sY29sb3I6dS5jb2xvcn0pKX0sX2dldEN1cnJlbnRYbGFDbHVzdGVyUGFyYW1zOmZ1bmN0aW9uKG0pe3JldHVybiBtLnhsYV9jbHVzdGVyfSxfZ2V0Q3VycmVudEdyYWRpZW50UGFyYW1zOmZ1bmN0aW9uKG0sbil7aWYodGhpcy5faXNHcmFkaWVudENvbG9yaW5nKHRoaXMuc3RhdHMsbikpe209bVtuXTt2YXIgcT1tLm1pblZhbHVlLHU9bS5tYXhWYWx1ZTtuPT09bC5NRU1PUlk/KHE9Yi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShxLGIuZ3JhcGgudXRpbC5NRU1PUllfVU5JVFMpLHU9Yi5ncmFwaC51dGlsLmNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZSh1LGIuZ3JhcGgudXRpbC5NRU1PUllfVU5JVFMpKTpuPT09bC5DT01QVVRFX1RJTUUmJihxPWIuZ3JhcGgudXRpbC5jb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUocSxiLmdyYXBoLnV0aWwuVElNRV9VTklUUyksdT1iLmdyYXBoLnV0aWwuY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKHUsCmIuZ3JhcGgudXRpbC5USU1FX1VOSVRTKSk7cmV0dXJue21pblZhbHVlOnEsbWF4VmFsdWU6dSxzdGFydENvbG9yOm0uc3RhcnRDb2xvcixlbmRDb2xvcjptLmVuZENvbG9yfX19LGRvd25sb2FkOmZ1bmN0aW9uKCl7dGhpcy4kLmdyYXBoZG93bmxvYWQuY2xpY2soKX0sX3VwZGF0ZUZpbGVJbnB1dDpmdW5jdGlvbihtKXt2YXIgbj1tLnRhcmdldC5maWxlc1swXTtpZihuKXtuPW4ubmFtZTt2YXIgcT1uLmxhc3RJbmRleE9mKCIuIik7MDw9cSYmKG49bi5zdWJzdHJpbmcoMCxxKSk7cT1uLmxhc3RJbmRleE9mKCIvIik7MDw9cSYmKG49bi5zdWJzdHJpbmcocSsxKSk7dGhpcy5fc2V0RG93bmxvYWRGaWxlbmFtZShuKTt0aGlzLnNldCgic2VsZWN0ZWRGaWxlIixtKX19LF9kYXRhc2V0c0NoYW5nZWQ6ZnVuY3Rpb24obSxuKXtudWxsIT1uJiYodGhpcy5fc2VsZWN0ZWRSdW5JbmRleD0wKX0sX2NvbXB1dGVTZWxlY3Rpb246ZnVuY3Rpb24obSxuLHEsdSl7cmV0dXJuIG1bbl0mJm1bbl0udGFnc1txXT8Ke3J1bjptW25dLm5hbWUsdGFnOm1bbl0udGFnc1txXS50YWcsdHlwZTp1fTpudWxsfSxfc2VsZWN0ZWRSdW5JbmRleENoYW5nZWQ6ZnVuY3Rpb24obSl7dGhpcy5kYXRhc2V0cyYmKHRoaXMuY29sb3JCeT1sLlNUUlVDVFVSRSx0aGlzLl9zZWxlY3RlZFRhZ0luZGV4PTAsdGhpcy5fc2VsZWN0ZWRHcmFwaFR5cGU9dGhpcy5fZ2V0RGVmYXVsdFNlbGVjdGlvblR5cGUoKSx0aGlzLnRyYWNlSW5wdXRzPSExLHRoaXMuX3NldERvd25sb2FkRmlsZW5hbWUodGhpcy5kYXRhc2V0c1ttXT90aGlzLmRhdGFzZXRzW21dLm5hbWU6IiIpKX0sX3NlbGVjdGVkVGFnSW5kZXhDaGFuZ2VkKCl7dGhpcy5fc2VsZWN0ZWRHcmFwaFR5cGU9dGhpcy5fZ2V0RGVmYXVsdFNlbGVjdGlvblR5cGUoKX0sX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCl7Y29uc3QgbT10aGlzLmRhdGFzZXRzLG49dGhpcy5fc2VsZWN0ZWRSdW5JbmRleCxxPXRoaXMuX3NlbGVjdGVkVGFnSW5kZXg7cmV0dXJuIG0mJm1bbl0mJm1bbl0udGFnc1txXSYmCiFtW25dLnRhZ3NbcV0ub3BHcmFwaD9tW25dLnRhZ3NbcV0ucHJvZmlsZT9iLmdyYXBoLlNlbGVjdGlvblR5cGUuUFJPRklMRTptW25dLnRhZ3NbcV0uY29uY2VwdHVhbEdyYXBoP2IuZ3JhcGguU2VsZWN0aW9uVHlwZS5DT05DRVBUVUFMX0dSQVBIOmIuZ3JhcGguU2VsZWN0aW9uVHlwZS5PUF9HUkFQSDpiLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEh9LF9nZXRGaWxlOmZ1bmN0aW9uKCl7dGhpcy4kJCgiI2ZpbGUiKS5jbGljaygpfSxfc2V0RG93bmxvYWRGaWxlbmFtZTpmdW5jdGlvbihtKXt0aGlzLiQuZ3JhcGhkb3dubG9hZC5zZXRBdHRyaWJ1dGUoImRvd25sb2FkIixtKyIucG5nIil9LF9zdGF0c05vdE51bGw6ZnVuY3Rpb24obSl7cmV0dXJuIG51bGwhPT1tfSxfdG9nZ2xlTGVnZW5kT3Blbigpe3RoaXMuc2V0KCJfbGVnZW5kT3BlbmVkIiwhdGhpcy5fbGVnZW5kT3BlbmVkKX0sX2dldFRvZ2dsZVRleHQobSl7cmV0dXJuIG0/IkNsb3NlIGxlZ2VuZC4iOiJFeHBhbmQgbGVnZW5kLiJ9LApfZ2V0VG9nZ2xlTGVnZW5kSWNvbihtKXtyZXR1cm4gbT8iZXhwYW5kLW1vcmUiOiJleHBhbmQtbGVzcyJ9LF9nZXRTZWxlY3Rpb25PcEdyYXBoRGlzYWJsZWQobSxuLHEpe3JldHVybiFtW25dfHwhbVtuXS50YWdzW3FdfHwhbVtuXS50YWdzW3FdLm9wR3JhcGh9LF9nZXRTZWxlY3Rpb25Qcm9maWxlRGlzYWJsZWQobSxuLHEpe3JldHVybiFtW25dfHwhbVtuXS50YWdzW3FdfHwhbVtuXS50YWdzW3FdLnByb2ZpbGV9LF9nZXRTZWxlY3Rpb25Db25jZXB0dWFsR3JhcGhEaXNhYmxlZChtLG4scSl7cmV0dXJuIW1bbl18fCFtW25dLnRhZ3NbcV18fCFtW25dLnRhZ3NbcV0uY29uY2VwdHVhbEdyYXBofX0pfSkoZC5jb250cm9sc3x8KGQuY29udHJvbHM9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtbG9hZGVyL3RmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXIuanMKVWk9dGhpcyYmdGhpcy5fX2F3YWl0ZXJ8fGZ1bmN0aW9uKGIsZCxmLGgpe3JldHVybiBuZXcgKGZ8fChmPVByb21pc2UpKShmdW5jdGlvbihrLHQpe2Z1bmN0aW9uIGwobil7dHJ5e20oaC5uZXh0KG4pKX1jYXRjaChxKXt0KHEpfX1mdW5jdGlvbiBwKG4pe3RyeXttKGhbInRocm93Il0obikpfWNhdGNoKHEpe3QocSl9fWZ1bmN0aW9uIG0obil7bi5kb25lP2sobi52YWx1ZSk6KG5ldyBmKGZ1bmN0aW9uKHEpe3Eobi52YWx1ZSl9KSkudGhlbihsLHApfW0oKGg9aC5hcHBseShiLGR8fFtdKSkubmV4dCgpKX0pfTsKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oKXtQb2x5bWVyKHtpczoidGYtZ3JhcGgtZGFzaGJvYXJkLWxvYWRlciIsX3RlbXBsYXRlOm51bGwscHJvcGVydGllczp7ZGF0YXNldHM6QXJyYXkscHJvZ3Jlc3M6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sc2VsZWN0aW9uOk9iamVjdCxzZWxlY3RlZEZpbGU6T2JqZWN0LGNvbXBhdGliaWxpdHlQcm92aWRlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyBiLmdyYXBoLm9wLlRwdUNvbXBhdGliaWxpdHlQcm92aWRlcn0saGllcmFyY2h5UGFyYW1zOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+Yi5ncmFwaC5oaWVyYXJjaHkuRGVmYXVsdEhpZXJhcmNoeVBhcmFtc30sb3V0R3JhcGhIaWVyYXJjaHk6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0R3JhcGg6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sb3V0U3RhdHM6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sCl9ncmFwaFJ1blRhZzpPYmplY3R9LG9ic2VydmVyczpbIl9zZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdGlvbiwgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSIsIl9zZWxlY3RlZEZpbGVDaGFuZ2VkKHNlbGVjdGVkRmlsZSwgY29tcGF0aWJpbGl0eVByb3ZpZGVyKSJdLF9zZWxlY3Rpb25DaGFuZ2VkKCl7dGhpcy5kZWJvdW5jZSgic2VsZWN0aW9uY2hhbmdlIiwoKT0+e3RoaXMuX2xvYWQodGhpcy5zZWxlY3Rpb24pfSl9LF9sb2FkOmZ1bmN0aW9uKGYpe2NvbnN0IGg9Zi5ydW4saz1mLnRhZztmPWYudHlwZTtzd2l0Y2goZil7Y2FzZSBiLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEg6Y2FzZSBiLmdyYXBoLlNlbGVjdGlvblR5cGUuQ09OQ0VQVFVBTF9HUkFQSDp0aGlzLl9zZXRPdXRTdGF0cyhudWxsKTt2YXIgdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3Quc2V0KCJydW4iLGgpO3Quc2V0KCJjb25jZXB0dWFsIixTdHJpbmcoZj09PWIuZ3JhcGguU2VsZWN0aW9uVHlwZS5DT05DRVBUVUFMX0dSQVBIKSk7CmsmJnQuc2V0KCJ0YWciLGspO2Y9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9ncmFwaCIsdCk7cmV0dXJuIHRoaXMuX2ZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoZikudGhlbigoKT0+e3RoaXMuX2dyYXBoUnVuVGFnPXtydW46aCx0YWc6a319KTtjYXNlIGIuZ3JhcGguU2VsZWN0aW9uVHlwZS5QUk9GSUxFOnsoe3RhZ3M6Zn09dGhpcy5kYXRhc2V0cy5maW5kKCh7bmFtZTptfSk9Pm09PT1oKSk7Y29uc3QgbD1mLmZpbmQobT0+bS50YWc9PT1rKS5vcEdyYXBoP2s6bnVsbDtjb25zb2xlLmFzc2VydChmLmZpbmQobT0+bS50YWc9PT1sKSxgUmVxdWlyZWQgdGFnICgke2x9KSBpcyBtaXNzaW5nLmApO2Y9dGhpcy5fZ3JhcGhSdW5UYWcmJnRoaXMuX2dyYXBoUnVuVGFnLnJ1bj09PWgmJnRoaXMuX2dyYXBoUnVuVGFnLnRhZz09PWw/UHJvbWlzZS5yZXNvbHZlKCk6dGhpcy5fbG9hZCh7cnVuOmgsdGFnOmwsdHlwZTpiLmdyYXBoLlNlbGVjdGlvblR5cGUuT1BfR1JBUEh9KTsKdD1uZXcgVVJMU2VhcmNoUGFyYW1zO3Quc2V0KCJ0YWciLGspO3Quc2V0KCJydW4iLGgpO2NvbnN0IHA9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9ydW5fbWV0YWRhdGEiLHQpO3JldHVybiBmLnRoZW4oKCk9PnRoaXMuX3JlYWRBbmRQYXJzZU1ldGFkYXRhKHApKX1kZWZhdWx0OnJldHVybiBQcm9taXNlLnJlamVjdChFcnJvcihgVW5rbm93biBzZWxlY3Rpb24gdHlwZTogJHtmfWApKX19LF9yZWFkQW5kUGFyc2VNZXRhZGF0YTpmdW5jdGlvbihmKXt0aGlzLnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTowLG1zZzoiIn0pO2IuZ3JhcGgucGFyc2VyLmZldGNoQW5kUGFyc2VNZXRhZGF0YShmLGIuZ3JhcGgudXRpbC5nZXRUcmFja2VyKHRoaXMpKS50aGVuKGg9Pnt0aGlzLl9zZXRPdXRTdGF0cyhoKX0pfSxfZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaDpmdW5jdGlvbihmLGgpe3JldHVybiBVaSh0aGlzLHZvaWQgMCx2b2lkIDAsZnVuY3Rpb24qKCl7dGhpcy5zZXQoInByb2dyZXNzIiwKe3ZhbHVlOjAsbXNnOiIifSk7cmV0dXJuIGIuZ3JhcGgubG9hZGVyLmZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoYi5ncmFwaC51dGlsLmdldFRyYWNrZXIodGhpcyksZixoLHRoaXMuY29tcGF0aWJpbGl0eVByb3ZpZGVyLHRoaXMuaGllcmFyY2h5UGFyYW1zKS50aGVuKCh7Z3JhcGg6ayxncmFwaEhpZXJhcmNoeTp0fSk9Pnt0aGlzLl9zZXRPdXRHcmFwaChrKTt0aGlzLl9zZXRPdXRHcmFwaEhpZXJhcmNoeSh0KX0pfSl9LF9zZWxlY3RlZEZpbGVDaGFuZ2VkOmZ1bmN0aW9uKGYpe2lmKGYpe2Y9Zi50YXJnZXQ7dmFyIGg9Zi5maWxlc1swXTtoJiYoZi52YWx1ZT0iIix0aGlzLl9mZXRjaEFuZENvbnN0cnVjdEhpZXJhcmNoaWNhbEdyYXBoKG51bGwsaCkpfX19KX0pKGQubG9hZGVyfHwoZC5sb2FkZXI9e30pKX0pKGIuZ3JhcGh8fChiLmdyYXBoPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZ3JhcGgtZGFzaGJvYXJkL3RmLWdyYXBoLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ncmFwaC1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e19kYXRhc2V0czp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9kYXRhc2V0c0ZldGNoZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3NlbGVjdGVkRGF0YXNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3JlbmRlckhpZXJhcmNoeTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX2RlYnVnZ2VyRGF0YUVuYWJsZWQ6Qm9vbGVhbixhbGxTdGVwc01vZGVFbmFibGVkOkJvb2xlYW4sc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0saGVhbHRoUGlsbHNUb2dnbGVkT246e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2hlYWx0aFBpbGxzVG9nZ2xlZE9uQ2hhbmdlZCJ9LApzZWxlY3RlZE5vZGU6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sX2lzQXR0YWNoZWQ6Qm9vbGVhbixfaW5pdGlhbGl6ZWQ6Qm9vbGVhbixfYXJlSGVhbHRoUGlsbHNMb2FkaW5nOkJvb2xlYW4sX2RlYnVnZ2VyTnVtZXJpY0FsZXJ0czp7dHlwZTpBcnJheSx2YWx1ZTpbXSxub3RpZnk6ITB9LF9ub2RlTmFtZXNUb0hlYWx0aFBpbGxzOnt0eXBlOk9iamVjdCx2YWx1ZTp7fX0sX2hlYWx0aFBpbGxTdGVwSW5kZXg6TnVtYmVyLF9oZWFsdGhQaWxsUmVxdWVzdElkOnt0eXBlOk51bWJlcix2YWx1ZToxfSxfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZDpOdW1iZXIsX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVyRGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjUwMCxyZWFkT25seTohMH0scnVuczpBcnJheSxydW46e3R5cGU6U3RyaW5nLG5vdGlmeTohMCx2YWx1ZTpwZC5nZXRTdHJpbmdJbml0aWFsaXplcigicnVuIix7ZGVmYXVsdFZhbHVlOiIiLHVzZUxvY2FsU3RvcmFnZTohMX0pLG9ic2VydmVyOiJfcnVuT2JzZXJ2ZXIifSwKX3NlbGVjdGlvbjp7dHlwZTpPYmplY3R9LF9jb21wYXRpYmlsaXR5UHJvdmlkZXI6T2JqZWN0LF90cmFjZUlucHV0czpCb29sZWFufSxsaXN0ZW5lcnM6eyJub2RlLXRvZ2dsZS1leHBhbmQiOiJfaGFuZGxlTm9kZVRvZ2dsZUV4cGFuZCJ9LG9ic2VydmVyczpbIl9tYXliZUZldGNoSGVhbHRoUGlsbHMoX2RlYnVnZ2VyRGF0YUVuYWJsZWQsIGFsbFN0ZXBzTW9kZUVuYWJsZWQsIHNwZWNpZmljSGVhbHRoUGlsbFN0ZXAsIF9zZWxlY3RlZE5vZGUpIiwiX21heWJlSW5pdGlhbGl6ZURhc2hib2FyZChfaXNBdHRhY2hlZCkiLCJfZGV0ZXJtaW5lU2VsZWN0ZWREYXRhc2V0KF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgcnVuKSIsIl91cGRhdGVTZWxlY3RlZERhdGFzZXROYW1lKF9kYXRhc2V0c0ZldGNoZWQsIF9kYXRhc2V0cywgX3NlbGVjdGVkRGF0YXNldCkiXSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITApfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsCiExKX0scmVsb2FkOmZ1bmN0aW9uKCl7dGhpcy5fZGVidWdnZXJEYXRhRW5hYmxlZHx8dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShiPT57Yi5jYW5jZWxsZWR8fGIudmFsdWVbImRlYnVnZ2VyIl0mJnRoaXMuc2V0KCJfZGVidWdnZXJEYXRhRW5hYmxlZCIsITApfSkpO3RoaXMuX21heWJlRmV0Y2hIZWFsdGhQaWxscygpfSxfZml0OmZ1bmN0aW9uKCl7dGhpcy4kJCgiI2dyYXBoYm9hcmQiKS5maXQoKX0sX3J1bk9ic2VydmVyOnBkLmdldFN0cmluZ09ic2VydmVyKCJydW4iLHtkZWZhdWx0VmFsdWU6IiIscG9seW1lclByb3BlcnR5OiJydW4iLHVzZUxvY2FsU3RvcmFnZTohMX0pLF9mZXRjaERhdGFzZXQoKXtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL2luZm8iKSl9LF9mZXRjaEhlYWx0aFBpbGxzKGIsCmQpe2I9e25vZGVfbmFtZXM6SlNPTi5zdHJpbmdpZnkoYikscnVuOiJfX2RlYnVnZ2VyX2RhdGFfXyJ9O3ZvaWQgMCE9PWQmJihiLnN0ZXA9ZCk7ZD12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiZGVidWdnZXIiLCIvaGVhbHRoX3BpbGxzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZCxiKX0sX2ZldGNoRGVidWdnZXJOdW1lcmljc0FsZXJ0cygpe3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkZWJ1Z2dlciIsIi9udW1lcmljc19hbGVydF9yZXBvcnQiKSl9LF9ncmFwaFVybChiLGQsZil7cmV0dXJuIHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvZ3JhcGgiLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3J1bjpiLGxpbWl0X2F0dHJfc2l6ZTpkLGxhcmdlX2F0dHJzX2tleTpmfSkpfSxfc2hvdWxkUmVxdWVzdEhlYWx0aFBpbGxzOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RlYnVnZ2VyRGF0YUVuYWJsZWQmJgp0aGlzLmhlYWx0aFBpbGxzVG9nZ2xlZE9uJiZ0aGlzLl9yZW5kZXJIaWVyYXJjaHkmJnRoaXMuX2RhdGFzZXRzU3RhdGUodGhpcy5fZGF0YXNldHNGZXRjaGVkLHRoaXMuX2RhdGFzZXRzLCJQUkVTRU5UIil9LF9tYXliZUluaXRpYWxpemVEYXNoYm9hcmQ6ZnVuY3Rpb24oYil7IXRoaXMuX2luaXRpYWxpemVkJiZiJiYodGhpcy5zZXQoIl9jb21wYXRpYmlsaXR5UHJvdmlkZXIiLG5ldyB0Zi5ncmFwaC5vcC5UcHVDb21wYXRpYmlsaXR5UHJvdmlkZXIpLHRoaXMuX2luaXRpYWxpemVkPSEwLHRoaXMuX2ZldGNoRGF0YXNldCgpLnRoZW4oZD0+e3RoaXMuX2RhdGFzZXRzPU9iamVjdC5rZXlzKGQpLnNvcnQocmMuY29tcGFyZVRhZ05hbWVzKS5tYXAoZj0+e2NvbnN0IGg9ZFtmXTt2YXIgaz1PYmplY3Qua2V5cyhoLnRhZ3MpLnNvcnQocmMuY29tcGFyZVRhZ05hbWVzKS5tYXAodD0+aC50YWdzW3RdKS5tYXAoKHt0YWc6dCxjb25jZXB0dWFsX2dyYXBoOmwsb3BfZ3JhcGg6cCxwcm9maWxlOm19KT0+Cih7dGFnOnQsZGlzcGxheU5hbWU6dCxjb25jZXB0dWFsR3JhcGg6bCxvcEdyYXBoOnAscHJvZmlsZTptfSkpO2s9aC5ydW5fZ3JhcGg/W3t0YWc6bnVsbCxkaXNwbGF5TmFtZToiRGVmYXVsdCIsY29uY2VwdHVhbEdyYXBoOiExLG9wR3JhcGg6ITAscHJvZmlsZTohMX0sLi4ua106aztyZXR1cm57bmFtZTpmLHRhZ3M6a319KTt0aGlzLl9kYXRhc2V0c0ZldGNoZWQ9ITB9KSl9LF9kZXRlcm1pbmVTZWxlY3RlZERhdGFzZXQoYixkLGYpe2Y/KGQ9ZC5maW5kSW5kZXgoaD0+aC5uYW1lPT09ZiksLTE9PT1kP2ImJihiPXRoaXMuJCQoIiNlcnJvci1kaWFsb2ciKSxiLnRleHRDb250ZW50PWBObyBkYXRhc2V0IG5hbWVkICIke2Z9IiBjb3VsZCBiZSBmb3VuZC5gLGIub3BlbigpKTp0aGlzLnNldCgiX3NlbGVjdGVkRGF0YXNldCIsZCkpOnRoaXMuc2V0KCJfc2VsZWN0ZWREYXRhc2V0IiwwKX0sX3VwZGF0ZVNlbGVjdGVkRGF0YXNldE5hbWUoYixkLGYpe2ImJihkLmxlbmd0aDw9Znx8dGhpcy5zZXQoInJ1biIsCmRbZl0ubmFtZSkpfSxfcmVxdWVzdEhlYWx0aFBpbGxzOmZ1bmN0aW9uKCl7dGhpcy5zZXQoIl9hcmVIZWFsdGhQaWxsc0xvYWRpbmciLCEwKTt2YXIgYj0rK3RoaXMuX2hlYWx0aFBpbGxSZXF1ZXN0SWQ7bnVsbCE9PXRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQmJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQpLHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ9bnVsbCk7dGhpcy5hbGxTdGVwc01vZGVFbmFibGVkP3RoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ9c2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQ9bnVsbDt0aGlzLl9pbml0aWF0ZU5ldHdvcmtSZXF1ZXN0Rm9ySGVhbHRoUGlsbHMoYil9LmJpbmQodGhpcyksdGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJEZWxheSk6dGhpcy5faW5pdGlhdGVOZXR3b3JrUmVxdWVzdEZvckhlYWx0aFBpbGxzKGIpfSwKX2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxsczpmdW5jdGlvbihiKXtpZih0aGlzLl9oZWFsdGhQaWxsUmVxdWVzdElkPT09Yil7dmFyIGQ9dGhpcy5fZmV0Y2hIZWFsdGhQaWxscyh0aGlzLl9yZW5kZXJIaWVyYXJjaHkuZ2V0TmFtZXNPZlJlbmRlcmVkT3BzKCksdGhpcy5hbGxTdGVwc01vZGVFbmFibGVkP3RoaXMuc3BlY2lmaWNIZWFsdGhQaWxsU3RlcDp2b2lkIDApLGY9dGhpcy5fZmV0Y2hEZWJ1Z2dlck51bWVyaWNzQWxlcnRzKCk7UHJvbWlzZS5hbGwoW2QsZl0pLnRoZW4oZnVuY3Rpb24oaCl7dmFyIGs9aFswXTtoPWhbMV07aWYodGhpcy5oZWFsdGhQaWxsc1RvZ2dsZWRPbiYmYj09PXRoaXMuX2hlYWx0aFBpbGxSZXF1ZXN0SWQpe2Zvcih2YXIgdCBpbiBrKXt0aGlzLnNldCgiX2hlYWx0aFBpbGxTdGVwSW5kZXgiLGtbdF0ubGVuZ3RoLTEpO2JyZWFrfXRoaXMuc2V0KCJfZGVidWdnZXJOdW1lcmljQWxlcnRzIixoKTt0aGlzLnNldCgiX25vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLAprKTt0aGlzLnNldCgiX2FyZUhlYWx0aFBpbGxzTG9hZGluZyIsITEpO3RoaXMuc2V0KCJfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCIsbnVsbCl9fS5iaW5kKHRoaXMpKX19LF9kYXRhc2V0c1N0YXRlOmZ1bmN0aW9uKGIsZCxmKXtyZXR1cm4gYj9kJiZkLmxlbmd0aD8iUFJFU0VOVCI9PT1mOiJFTVBUWSI9PT1mOiJOT1RfTE9BREVEIj09PWZ9LF9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5yZWxvYWQoKX0sX2hhbmRsZU5vZGVUb2dnbGVFeHBhbmQ6ZnVuY3Rpb24oKXt0aGlzLl9tYXliZUZldGNoSGVhbHRoUGlsbHMoKX0sX2hlYWx0aFBpbGxzVG9nZ2xlZE9uQ2hhbmdlZDpmdW5jdGlvbihiKXtiP3RoaXMucmVsb2FkKCk6dGhpcy5zZXQoIl9ub2RlTmFtZXNUb0hlYWx0aFBpbGxzIix7fSl9LF9tYXliZUZldGNoSGVhbHRoUGlsbHM6ZnVuY3Rpb24oKXt0aGlzLl9zaG91bGRSZXF1ZXN0SGVhbHRoUGlsbHMoKSYmdGhpcy5fcmVxdWVzdEhlYWx0aFBpbGxzKCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdnotZGlzdHJpYnV0aW9uLWNoYXJ0L3Z6LWRpc3RyaWJ1dGlvbi1jaGFydC5qcwp2YXIgSms7CihmdW5jdGlvbihiKXtjbGFzcyBke2NvbnN0cnVjdG9yKGYsaCl7dGhpcy5ydW4yZGF0YXNldHM9e307dGhpcy5jb2xvclNjYWxlPWg7dGhpcy5idWlsZENoYXJ0KGYpfWdldERhdGFzZXQoZil7dm9pZCAwPT09dGhpcy5ydW4yZGF0YXNldHNbZl0mJih0aGlzLnJ1bjJkYXRhc2V0c1tmXT1uZXcgUGxvdHRhYmxlLkRhdGFzZXQoW10se3J1bjpmfSkpO3JldHVybiB0aGlzLnJ1bjJkYXRhc2V0c1tmXX1idWlsZENoYXJ0KGYpe3RoaXMub3V0ZXImJnRoaXMub3V0ZXIuZGVzdHJveSgpO2Y9cmcuZ2V0WENvbXBvbmVudHMoZik7dGhpcy54QWNjZXNzb3I9Zi5hY2Nlc3Nvcjt0aGlzLnhTY2FsZT1mLnNjYWxlO3RoaXMueEF4aXM9Zi5heGlzO3RoaXMueEF4aXMubWFyZ2luKDApLnRpY2tMYWJlbFBhZGRpbmcoMyk7dGhpcy55U2NhbGU9bmV3IFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyO3RoaXMueUF4aXM9bmV3IFBsb3R0YWJsZS5BeGVzLk51bWVyaWModGhpcy55U2NhbGUsImxlZnQiKTtmPQpyZy5tdWx0aXNjYWxlRm9ybWF0dGVyKHJnLllfQVhJU19GT1JNQVRURVJfUFJFQ0lTSU9OKTt0aGlzLnlBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDUpLmZvcm1hdHRlcihmKTt0aGlzLnlBeGlzLnVzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uKCk7Zj10aGlzLmJ1aWxkUGxvdCh0aGlzLnhBY2Nlc3Nvcix0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSk7dGhpcy5ncmlkbGluZXM9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyaWRsaW5lcyh0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSk7dGhpcy5jZW50ZXI9bmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKFt0aGlzLmdyaWRsaW5lcyxmXSk7dGhpcy5vdXRlcj1uZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoW1t0aGlzLnlBeGlzLHRoaXMuY2VudGVyXSxbbnVsbCx0aGlzLnhBeGlzXV0pfWJ1aWxkUGxvdChmLGgsayl7bGV0IHQ9WzAsMjI4LDE1ODcsMzA4NSw1RTMsNjkxNSw4NDEzLDk3NzIsMUU0XSxsPV8ucmFuZ2UodC5sZW5ndGgtCjEpLm1hcCh1PT4odFt1KzFdLXRbdV0pLzI1MDApLHA9dC5tYXAoKHUseCk9PkE9PkFbeF1bMV0pLG09cFs0XSxuPV8ucmFuZ2UocC5sZW5ndGgtMSkubWFwKHU9PntsZXQgeD1uZXcgUGxvdHRhYmxlLlBsb3RzLkFyZWE7eC54KGYsaCk7bGV0IEE9NDx1P3BbdV06cFt1KzFdO3gueSg0PHU/cFt1KzFdOnBbdV0sayk7eC55MChBKTt4LmF0dHIoImZpbGwiLCh5LHcsQyk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShDLm1ldGFkYXRhKCkucnVuKSk7eC5hdHRyKCJzdHJva2UiLCh5LHcsQyk9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShDLm1ldGFkYXRhKCkucnVuKSk7eC5hdHRyKCJzdHJva2Utd2VpZ2h0IiwoKT0+IjAuNXB4Iik7eC5hdHRyKCJzdHJva2Utb3BhY2l0eSIsKCk9PmxbdV0pO3guYXR0cigiZmlsbC1vcGFjaXR5IiwoKT0+bFt1XSk7cmV0dXJuIHh9KSxxPW5ldyBQbG90dGFibGUuUGxvdHMuTGluZTtxLngoZixoKTtxLnkobSxrKTtxLmF0dHIoInN0cm9rZSIsKHUseCxBKT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKEEucnVuKSk7CnRoaXMucGxvdHM9bjtyZXR1cm4gbmV3IFBsb3R0YWJsZS5Db21wb25lbnRzLkdyb3VwKG4pfXNldFZpc2libGVTZXJpZXMoZil7dGhpcy5ydW5zPWY7bGV0IGg9Zi5tYXAoaz0+dGhpcy5nZXREYXRhc2V0KGspKTt0aGlzLnBsb3RzLmZvckVhY2goaz0+ay5kYXRhc2V0cyhoKSl9c2V0U2VyaWVzRGF0YShmLGgpe3RoaXMuZ2V0RGF0YXNldChmKS5kYXRhKGgpfXJlbmRlclRvKGYpe3RoaXMudGFyZ2V0U1ZHPWY7dGhpcy5vdXRlci5yZW5kZXJUbyhmKX1yZWRyYXcoKXt0aGlzLm91dGVyLnJlZHJhdygpfWRlc3Ryb3koKXt0aGlzLm91dGVyLmRlc3Ryb3koKX19Yi5EaXN0cmlidXRpb25DaGFydD1kO1BvbHltZXIoe2lzOiJ2ei1kaXN0cmlidXRpb24tY2hhcnQiLHByb3BlcnRpZXM6e2NvbG9yU2NhbGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBQbG90dGFibGUuU2NhbGVzLkNvbG9yKS5yYW5nZShkMy5zY2hlbWVDYXRlZ29yeTEwKX19LHhUeXBlOnt0eXBlOlN0cmluZywKdmFsdWU6InN0ZXAifSxfYXR0YWNoZWQ6Qm9vbGVhbixfY2hhcnQ6T2JqZWN0LF92aXNpYmxlU2VyaWVzQ2FjaGU6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9zZXJpZXNEYXRhQ2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fSxfbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkOnt0eXBlOk51bWJlcix2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX21ha2VDaGFydCh4VHlwZSwgY29sb3JTY2FsZSwgX2F0dGFjaGVkKSIsIl9yZWxvYWRGcm9tQ2FjaGUoX2NoYXJ0KSJdLHNldFZpc2libGVTZXJpZXM6ZnVuY3Rpb24oZil7dGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlPWY7dGhpcy5fY2hhcnQmJih0aGlzLl9jaGFydC5zZXRWaXNpYmxlU2VyaWVzKGYpLHRoaXMucmVkcmF3KCkpfSxzZXRTZXJpZXNEYXRhOmZ1bmN0aW9uKGYsaCl7dGhpcy5fc2VyaWVzRGF0YUNhY2hlW2ZdPWg7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEoZiwKaCl9LHJlZHJhdzpmdW5jdGlvbigpe3RoaXMuX2NoYXJ0LnJlZHJhdygpfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5jaGFydGRpdiwhMCl9LF9tYWtlQ2hhcnQ6ZnVuY3Rpb24oZixoLGspe251bGw9PT10aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQmJnRoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKTt0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9dGhpcy5hc3luYyhmdW5jdGlvbigpe3RoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD1udWxsO2lmKGspe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5kZXN0cm95KCk7dmFyIHQ9bmV3IGQoZixoKSxsPWQzLnNlbGVjdCh0aGlzLiQuY2hhcnRkaXYpO3QucmVuZGVyVG8obCk7dGhpcy5fY2hhcnQ9dH19LDM1MCl9LF9yZWxvYWRGcm9tQ2FjaGU6ZnVuY3Rpb24oKXt0aGlzLl9jaGFydCYmKHRoaXMuX2NoYXJ0LnNldFZpc2libGVTZXJpZXModGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlKSwKdGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLmZvckVhY2goZnVuY3Rpb24oZil7dGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShmLHRoaXMuX3Nlcmllc0RhdGFDYWNoZVtmXXx8W10pfS5iaW5kKHRoaXMpKSl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITB9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITF9fSl9KShKa3x8KEprPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZC90Zi1kaXN0cmlidXRpb24tbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiLHByb3BlcnRpZXM6e3J1bjpTdHJpbmcsdGFnOlN0cmluZyx0YWdNZXRhZGF0YTpPYmplY3QseFR5cGU6U3RyaW5nLGRhdGFUb0xvYWQ6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlRGF0YVRvTG9hZChydW4sIHRhZykifSxnZXREYXRhTG9hZE5hbWU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7cnVuOmJ9KT0+Yn0sZ2V0RGF0YUxvYWRVcmw6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9Pih7dGFnOmIscnVuOmR9KT0+dmMuYWRkUGFyYW1zKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJkaXN0cmlidXRpb25zIiwiL2Rpc3RyaWJ1dGlvbnMiKSx7dGFnOmIscnVuOmR9KX0sbG9hZERhdGFDYWxsYmFjazp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybihiLGQsZik9PntiPWYubWFwKGg9Pntjb25zdCBbayx0LGxdPWg7bC53YWxsX3RpbWU9bmV3IERhdGUoMUUzKmspO2wuc3RlcD10O3JldHVybiBsfSk7CmQ9dGhpcy5nZXREYXRhTG9hZE5hbWUoZCk7dGhpcy4kLmNoYXJ0LnNldFNlcmllc0RhdGEoZCxiKTt0aGlzLiQuY2hhcnQuc2V0VmlzaWJsZVNlcmllcyhbZF0pfX19LF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHtzY2FsZTpwZi5ydW5zQ29sb3JTY2FsZX0pLHJlYWRPbmx5OiEwfSxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfZXhwYW5kZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHJlcXVlc3RNYW5hZ2VyOk9iamVjdCxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn19LG9ic2VydmVyczpbInJlbG9hZChydW4sIHRhZykiXSxiZWhhdmlvcnM6W3FkLkRhdGFMb2FkZXJCZWhhdmlvcl0sX2NvbXB1dGVEYXRhVG9Mb2FkKGIsZCl7cmV0dXJuW3tydW46Yix0YWc6ZH1dfSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlLnNjYWxlKGIpfSwKcmVkcmF3KCl7dGhpcy4kLmNoYXJ0LnJlZHJhdygpfSxfdG9nZ2xlRXhwYW5kZWQoKXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZC90Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e194VHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6InN0ZXAifSxfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZzpPYmplY3QsX3J1blRvVGFnSW5mbzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWREaXN0cmlidXRpb25zKCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoImRpc3RyaWJ1dGlvbnMiLAoiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxrPT5PYmplY3Qua2V5cyhrKSksaD12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09aC5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWciLGYpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pfX0pfSxfcmVsb2FkRGlzdHJpYnV0aW9ucygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1kaXN0cmlidXRpb24tbG9hZGVyIikuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtyZXR1cm4gJGMuY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhiLGQsZil9LF90YWdNZXRhZGF0YShiLApkLGYpe3JldHVybiBiW2RdW2ZdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzL3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzLmh0bWwuanMKUG9seW1lcih7aXM6InZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToib2Zmc2V0In0sdGltZVByb3BlcnR5Ont0eXBlOlN0cmluZyx2YWx1ZToic3RlcCJ9LGJpbnM6e3R5cGU6U3RyaW5nLHZhbHVlOiJiaW5zIn0seDp7dHlwZTpTdHJpbmcsdmFsdWU6IngifSxkeDp7dHlwZTpTdHJpbmcsdmFsdWU6ImR4In0seTp7dHlwZTpTdHJpbmcsdmFsdWU6InkifSxjb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBkMy5zY2FsZU9yZGluYWwoZDMuc2NoZW1lQ2F0ZWdvcnkxMCl9fSxtb2RlVHJhbnNpdGlvbkR1cmF0aW9uOnt0eXBlOk51bWJlcix2YWx1ZTo1MDB9LF9hdHRhY2hlZDpCb29sZWFuLF9uYW1lOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfZGF0YTp7dHlwZTpBcnJheSx2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsicmVkcmF3KHRpbWVQcm9wZXJ0eSwgX2F0dGFjaGVkKSIsIl9tb2RlUmVkcmF3KG1vZGUpIl0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLnN2ZywhMCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITB9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXR0YWNoZWQ9ITF9LHNldFNlcmllc0RhdGE6ZnVuY3Rpb24oYixkKXt0aGlzLl9uYW1lPWI7dGhpcy5fZGF0YT1kO3RoaXMucmVkcmF3KCl9LHJlZHJhdzpmdW5jdGlvbigpe3RoaXMuX2RyYXcoMCl9LF9tb2RlUmVkcmF3OmZ1bmN0aW9uKCl7dGhpcy5fZHJhdyh0aGlzLm1vZGVUcmFuc2l0aW9uRHVyYXRpb24pfSxfZHJhdzpmdW5jdGlvbihiKXtpZih0aGlzLl9hdHRhY2hlZCYmdGhpcy5fZGF0YSl7aWYodm9pZCAwPT09Yil0aHJvdyBFcnJvcigidnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgX2RyYXcgbmVlZHMgZHVyYXRpb24iKTtpZigwPj10aGlzLl9kYXRhLmxlbmd0aCl0aHJvdyBFcnJvcigiTm90IGVub3VnaCBzdGVwcyBpbiB0aGUgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdLmhhc093blByb3BlcnR5KHRoaXMuYmlucykpdGhyb3cgRXJyb3IoIk5vIGJpbnMgcHJvcGVydHkgb2YgJyIrCnRoaXMuYmlucysiJyBpbiBkYXRhIik7aWYoMD49dGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdLmxlbmd0aCl0aHJvdyBFcnJvcigiTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBiaW4gaW4gYmlucyBpbiBkYXRhIik7aWYoIXRoaXMuX2RhdGFbMF1bdGhpcy5iaW5zXVswXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLngpKXRocm93IEVycm9yKCJObyB4IHByb3BlcnR5ICciK3RoaXMueCsiJyBvbiBiaW5zIGRhdGEiKTtpZighdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMuZHgpKXRocm93IEVycm9yKCJObyBkeCBwcm9wZXJ0eSAnIit0aGlzLmR4KyInIG9uIGJpbnMgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdW3RoaXMuYmluc11bMF0uaGFzT3duUHJvcGVydHkodGhpcy55KSl0aHJvdyBFcnJvcigiTm8geSBwcm9wZXJ0eSAnIit0aGlzLnkrIicgb24gYmlucyBkYXRhIik7dmFyIGQ9dGhpcy50aW1lUHJvcGVydHksZj10aGlzLngsaD10aGlzLmJpbnMsaz10aGlzLmR4LAp0PXRoaXMueSxsPXRoaXMuX2RhdGEscD10aGlzLm1vZGUsbT1kMy5oY2wodGhpcy5jb2xvclNjYWxlKHRoaXMuX25hbWUpKSxuPWQzLnNlbGVjdCh0aGlzLiQudG9vbHRpcCkscT1mdW5jdGlvbih5YSl7cmV0dXJuIHlhW2ZdfSx1PWZ1bmN0aW9uKHlhKXtyZXR1cm4geWFbdF19LHg9ZnVuY3Rpb24oeWEpe3JldHVybiB5YVtmXSt5YVtrXX0sQT1mdW5jdGlvbih5YSl7cmV0dXJuIHlhW2RdfTsicmVsYXRpdmUiPT09ZCYmKEE9ZnVuY3Rpb24oeWEpe3JldHVybiB5YS53YWxsX3RpbWUtbFswXS53YWxsX3RpbWV9KTt2YXIgeT10aGlzLiQuc3ZnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHc9eS53aWR0aCxDPXkuaGVpZ2h0LEc9NTtpZigib2Zmc2V0Ij09PXApe3ZhciBEPUMvMi41O0c9RCs1fWVsc2UgRD1DLUctMjA7dmFyIEI9dy0yNC02MCxJPUMtRy0yMDtkMy5taW4obCxxKTtkMy5tYXgobCx4KTt2YXIgTj1kMy5mb3JtYXQoIi4zbiIpO3k9ZDMuZm9ybWF0KCIuMGYiKTsid2FsbF90aW1lIj09PQpkP3k9ZDMudGltZUZvcm1hdCgiJW0vJWQgJVgiKToicmVsYXRpdmUiPT09ZCYmKHk9ZnVuY3Rpb24oeWEpe3JldHVybiBkMy5mb3JtYXQoIi4xciIpKHlhLzM2RTUpKyJoIn0pO3ZhciBPPWwubWFwKGZ1bmN0aW9uKHlhKXtyZXR1cm5bZDMubWluKHlhW2hdLHEpLGQzLm1heCh5YVtoXSx4KV19KSxIPWwubWFwKGZ1bmN0aW9uKHlhKXtyZXR1cm4gZDMuZXh0ZW50KHlhW2hdLHUpfSksSz1kMy5leHRlbnQobCxBKSxNPSgid2FsbF90aW1lIj09PWQ/ZDMuc2NhbGVUaW1lKCk6ZDMuc2NhbGVMaW5lYXIoKSkuZG9tYWluKEspLnJhbmdlKFswLCJvZmZzZXQiPT09cD9JOjBdKSxMPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFswLGQzLm1heChsLGZ1bmN0aW9uKHlhLFNhKXtyZXR1cm4gSFtTYV1bMV19KV0pLnJhbmdlKFtELDBdKSxRPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKEwuZG9tYWluKCkpLnJhbmdlKFs1MDAsMF0pLFQ9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oW2QzLm1pbihsLGZ1bmN0aW9uKHlhLApTYSl7cmV0dXJuIE9bU2FdWzBdfSksZDMubWF4KGwsZnVuY3Rpb24oeWEsU2Epe3JldHVybiBPW1NhXVsxXX0pXSkubmljZSgpLnJhbmdlKFswLEJdKSxYPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFQuZG9tYWluKCkpLnJhbmdlKFswLDUwMF0pLGFhPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGQzLmV4dGVudChsLEEpKS5yYW5nZShbbS5kYXJrZXIoKSxtLmJyaWdodGVyKCldKS5pbnRlcnBvbGF0ZShkMy5pbnRlcnBvbGF0ZUhjbCk7bT1kMy5heGlzQm90dG9tKFQpLnRpY2tzKCk7dmFyIGxhPWQzLmF4aXNSaWdodChNKS50aWNrcygpLnRpY2tGb3JtYXQoeSksWj1kMy5heGlzUmlnaHQoTCkudGlja3MoKS50aWNrU2l6ZShCKzUpLnRpY2tGb3JtYXQoTiksYmE9ZnVuY3Rpb24oeWEpe3JldHVybiB5YVtmXSt5YVtrXS8yfSxlYT1kMy5saW5lKCkueChmdW5jdGlvbih5YSl7cmV0dXJuIFgoYmEoeWEpKX0pLnkoZnVuY3Rpb24oeWEpe3JldHVybiBRKHlhW3RdKX0pLGNhPWZ1bmN0aW9uKHlhKXtyZXR1cm4iTSIrClgoYmEoeWFbMF0pKSsiLCIrUSgwKSsiTCIrZWEoeWEpLnNsaWNlKDEpKyJMIitYKGJhKHlhW3lhLmxlbmd0aC0xXSkpKyIsIitRKDApfSxrYT10aGlzLiQuc3ZnO3k9ZDMuc2VsZWN0KGthKTtiPXkudHJhbnNpdGlvbigpLmR1cmF0aW9uKGIpO3k9eS5zZWxlY3QoImciKS5jbGFzc2VkKCJzbWFsbCIsZnVuY3Rpb24oKXtyZXR1cm4gMDxCJiYxNTA+PUJ9KS5jbGFzc2VkKCJtZWRpdW0iLGZ1bmN0aW9uKCl7cmV0dXJuIDE1MDxCJiYzMDA+PUJ9KS5jbGFzc2VkKCJsYXJnZSIsZnVuY3Rpb24oKXtyZXR1cm4gMzAwPEJ9KTtiPWIuc2VsZWN0KCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKDI0LCIrRysiKSIpO3ZhciBZPWQzLmJpc2VjdG9yKHgpLmxlZnQ7Sz15LnNlbGVjdCgiLnN0YWdlIikub24oIm1vdXNlb3ZlciIsZnVuY3Rpb24oKXt2YS5zdHlsZSgib3BhY2l0eSIsMSk7eGEuc3R5bGUoIm9wYWNpdHkiLDEpO0FhLnN0eWxlKCJvcGFjaXR5IiwxKTtGYS5zdHlsZSgib3BhY2l0eSIsCjEpO24uc3R5bGUoIm9wYWNpdHkiLDEpfSkub24oIm1vdXNlb3V0IixmdW5jdGlvbigpe3ZhLnN0eWxlKCJvcGFjaXR5IiwwKTt4YS5zdHlsZSgib3BhY2l0eSIsMCk7QWEuc3R5bGUoIm9wYWNpdHkiLDApO0ZhLnN0eWxlKCJvcGFjaXR5IiwwKTt2YS5jbGFzc2VkKCJob3Zlci1jbG9zZXN0IiwhMSk7RWEuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsITEpO24uc3R5bGUoIm9wYWNpdHkiLDApfSkub24oIm1vdXNlbW92ZSIsZnVuY3Rpb24oKXtmdW5jdGlvbiB5YShBYil7cmV0dXJuIE1hdGgubWluKEFiW2hdLmxlbmd0aC0xLFkoQWJbaF0sWGEpKX12YXIgU2E9ZDMubW91c2UodGhpcyksWGE9VC5pbnZlcnQoU2FbMF0pO00uaW52ZXJ0KFNhWzFdKTt2YXIgdWIsQmI9SW5maW5pdHkscWI7dmEuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbihBYil7dmFyIEhiPXlhKEFiKTtxYj1BYjt2YXIgaWM9VChBYltoXVtIYl1bZl0rQWJbaF1bSGJdW2tdLzIpO0hiPUwoQWJbaF1bSGJdW3RdKTt2YXIgYmM9CiJvZmZzZXQiPT09cD9NKEEoQWIpKS0oRC1IYik6SGI7YmM9TWF0aC5hYnMoU2FbMV0tYmMpO2JjPEJiJiYoQmI9YmMsdWI9QWIpO3JldHVybiJ0cmFuc2xhdGUoIitpYysiLCIrSGIrIikifSk7dmEuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbihBYil7dmFyIEhiPXlhKEFiKTtyZXR1cm4gQWJbaF1bSGJdW3RdfSk7dmEuY2xhc3NlZCgiaG92ZXItY2xvc2VzdCIsZnVuY3Rpb24oQWIpe3JldHVybiBBYj09PXVifSk7RWEuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsZnVuY3Rpb24oQWIpe3JldHVybiBBYj09PXVifSk7dmFyIHpiPXlhKHFiKTt4YS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK1QocWJbaF1bemJdW2ZdK3FiW2hdW3piXVtrXS8yKSsiLCAiK0krIikifSkuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiBOKHFiW2hdW3piXVtmXStxYltoXVt6Yl1ba10vMil9KTt2YXIgdmI9bGEudGlja0Zvcm1hdCgpO0FhLmF0dHIoInRyYW5zZm9ybSIsCmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wP00oQSh1YikpOjApKyIpIn0pLnN0eWxlKCJkaXNwbGF5Iiwib2Zmc2V0Ij09PXA/IiI6Im5vbmUiKS5zZWxlY3QoInRleHQiKS50ZXh0KGZ1bmN0aW9uKCl7cmV0dXJuIHZiKEEodWIpKX0pO3ZhciBHYj1aLnRpY2tGb3JtYXQoKTtGYS5hdHRyKCJ0cmFuc2Zvcm0iLGZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wPzA6TCh1YltoXVt6Yl1bdF0pKSsiKSJ9KS5zdHlsZSgiZGlzcGxheSIsIm9mZnNldCI9PT1wPyJub25lIjoiIikuc2VsZWN0KCJ0ZXh0IikudGV4dChmdW5jdGlvbigpe3JldHVybiBHYih1YltoXVt6Yl1bdF0pfSk7dmFyIE5iPWQzLm1vdXNlKGthKTtuLnN0eWxlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIisoTmJbMF0rMTUpKyJweCwiKyhOYlsxXS0xNSkrInB4KSIpLnNlbGVjdCgic3BhbiIpLnRleHQoIm9mZnNldCI9PT1wP0diKHViW2hdW3piXVt0XSk6Cigic3RlcCI9PT1kPyJzdGVwICI6IiIpK3ZiKEEodWIpKSl9KTtLLnNlbGVjdCgiLmJhY2tncm91bmQiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoLTI0LCIrLUcrIikiKS5hdHRyKCJ3aWR0aCIsdykuYXR0cigiaGVpZ2h0IixDKTtDPUsuc2VsZWN0QWxsKCIuaGlzdG9ncmFtIikuZGF0YShsKTtDLmV4aXQoKS5yZW1vdmUoKTt3PUMuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImhpc3RvZ3JhbSIpO0M9dy5tZXJnZShDKS5zb3J0KGZ1bmN0aW9uKHlhLFNhKXtyZXR1cm4gQSh5YSktQShTYSl9KTtHPWIuc2VsZWN0QWxsKCIuaGlzdG9ncmFtIikuYXR0cigidHJhbnNmb3JtIixmdW5jdGlvbih5YSl7cmV0dXJuInRyYW5zbGF0ZSgwLCAiKygib2Zmc2V0Ij09PXA/TShBKHlhKSktRDowKSsiKSJ9KTt3LmFwcGVuZCgibGluZSIpLmF0dHIoImNsYXNzIiwiYmFzZWxpbmUiKTtHLnNlbGVjdCgiLmJhc2VsaW5lIikuc3R5bGUoInN0cm9rZS1vcGFjaXR5IixmdW5jdGlvbigpe3JldHVybiJvZmZzZXQiPT09CnA/LjE6MH0pLmF0dHIoInkxIixEKS5hdHRyKCJ5MiIsRCkuYXR0cigieDIiLEIpO3cuYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJvdXRsaW5lIik7dmFyIEVhPUMuc2VsZWN0KCIub3V0bGluZSIpLmF0dHIoInZlY3Rvci1lZmZlY3QiLCJub24tc2NhbGluZy1zdHJva2UiKS5hdHRyKCJkIixmdW5jdGlvbih5YSl7cmV0dXJuIGNhKHlhW2hdKX0pLnN0eWxlKCJzdHJva2Utd2lkdGgiLDEpO0cuc2VsZWN0KCIub3V0bGluZSIpLmF0dHIoInRyYW5zZm9ybSIsInNjYWxlKCIrQi81MDArIiwgIitELzUwMCsiKSIpLnN0eWxlKCJzdHJva2UiLGZ1bmN0aW9uKHlhKXtyZXR1cm4ib2Zmc2V0Ij09PXA/IndoaXRlIjphYShBKHlhKSl9KS5zdHlsZSgiZmlsbC1vcGFjaXR5IixmdW5jdGlvbigpe3JldHVybiJvZmZzZXQiPT09cD8xOjB9KS5zdHlsZSgiZmlsbCIsZnVuY3Rpb24oeWEpe3JldHVybiBhYShBKHlhKSl9KTt3PXcuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJob3ZlciIpLnN0eWxlKCJmaWxsIiwKZnVuY3Rpb24oeWEpe3JldHVybiBhYShBKHlhKSl9KTt2YXIgdmE9Qy5zZWxlY3QoIi5ob3ZlciIpO3cuYXBwZW5kKCJjaXJjbGUiKS5hdHRyKCJyIiwyKTt3LmFwcGVuZCgidGV4dCIpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoImR4Iiw0KTt3PXkuc2VsZWN0KCIueC1heGlzLWhvdmVyIikuc2VsZWN0QWxsKCIubGFiZWwiKS5kYXRhKFsieCJdKTtDPXcuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVsIik7dmFyIHhhPXcubWVyZ2UoQyk7Qy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtMjApLmF0dHIoInkiLDYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7Qy5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDApLmF0dHIoInkxIiwwKS5hdHRyKCJ5MiIsNik7Qy5hcHBlbmQoInRleHQiKS5hdHRyKCJkeSIsMTgpO3c9eS5zZWxlY3QoIi55LWF4aXMtaG92ZXIiKS5zZWxlY3RBbGwoIi5sYWJlbCIpLmRhdGEoWyJ5Il0pOwpDPXcuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImxhYmVsIik7dmFyIEFhPXcubWVyZ2UoQyk7Qy5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4Iiw4KS5hdHRyKCJ5IiwtNikuYXR0cigid2lkdGgiLDQwKS5hdHRyKCJoZWlnaHQiLDE0KTtDLmFwcGVuZCgibGluZSIpLmF0dHIoIngxIiwwKS5hdHRyKCJ4MiIsNikuYXR0cigieTEiLDApLmF0dHIoInkyIiwwKTtDLmFwcGVuZCgidGV4dCIpLmF0dHIoImR4Iiw4KS5hdHRyKCJkeSIsNCk7eT15LnNlbGVjdCgiLnktc2xpY2UtYXhpcy1ob3ZlciIpLnNlbGVjdEFsbCgiLmxhYmVsIikuZGF0YShbInkiXSk7dz15LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpO3ZhciBGYT15Lm1lcmdlKHcpO3cuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsOCkuYXR0cigieSIsLTYpLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IiwxNCk7dy5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDYpLmF0dHIoInkxIiwKMCkuYXR0cigieTIiLDApO3cuYXBwZW5kKCJ0ZXh0IikuYXR0cigiZHgiLDgpLmF0dHIoImR5Iiw0KTtiLnNlbGVjdCgiLnkuYXhpcy5zbGljZSIpLnN0eWxlKCJvcGFjaXR5Iiwib2Zmc2V0Ij09PXA/MDoxKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwgIisoIm9mZnNldCI9PT1wPy1EOjApKyIpIikuY2FsbChaKTtiLnNlbGVjdCgiLnguYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCAiK0krIikiKS5jYWxsKG0pO2Iuc2VsZWN0KCIueS5heGlzIikuc3R5bGUoIm9wYWNpdHkiLCJvZmZzZXQiPT09cD8xOjApLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK0IrIiwgIisoIm9mZnNldCI9PT1wPzA6SSkrIikiKS5jYWxsKGxhKTtiLnNlbGVjdEFsbCgiLnRpY2sgdGV4dCIpLmF0dHIoImZpbGwiLCIjYWFhIik7Yi5zZWxlY3RBbGwoIi5heGlzIHBhdGguZG9tYWluIikuYXR0cigic3Ryb2tlIiwibm9uZSIpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1oaXN0b2dyYW0tZGFzaGJvYXJkL2hpc3RvZ3JhbUNvcmUuanMKdmFyIEtrOwooZnVuY3Rpb24oYil7ZnVuY3Rpb24gZChoKXtjb25zdCBbayx0LGxdPWg7cmV0dXJue3dhbGxfdGltZTprLHN0ZXA6dCxtaW46ZDMubWluKGwubWFwKChbcF0pPT5wKSksbWF4OmQzLm1heChsLm1hcCgoWyxwXSk9PnApKSxidWNrZXRzOmwubWFwKChbcCxtLG5dKT0+KHtsZWZ0OnAscmlnaHQ6bSxjb3VudDpufSkpfX1mdW5jdGlvbiBmKGgsayx0LGw9MzApe3Q9PT1rJiYodD0xLjEqaysxLGs9ay8xLjEtMSk7Y29uc3QgcD0odC1rKS9sO2xldCBtPTA7cmV0dXJuIGQzLnJhbmdlKGssdCxwKS5tYXAobj0+e2NvbnN0IHE9bitwO2xldCB1PTA7Zm9yKDttPGguYnVja2V0cy5sZW5ndGg7KXtjb25zdCBBPU1hdGgubWluKHQsaC5idWNrZXRzW21dLnJpZ2h0KTt2YXIgeD1NYXRoLm1heChrLGguYnVja2V0c1ttXS5sZWZ0KTtjb25zdCB5PU1hdGgubWluKEEscSktTWF0aC5tYXgoeCxuKTt4PXkvKEEteCkqaC5idWNrZXRzW21dLmNvdW50O3UrPTA8eT94OjA7aWYoQT5xKWJyZWFrO20rK31yZXR1cm57eDpuLApkeDpwLHk6dX19KX1iLmJhY2tlbmRUb0ludGVybWVkaWF0ZT1kO2IuaW50ZXJtZWRpYXRlVG9EMz1mO2IuYmFja2VuZFRvVno9ZnVuY3Rpb24oaCl7aD1oLm1hcChkKTtjb25zdCBrPWQzLm1pbihoLGw9PmwubWluKSx0PWQzLm1heChoLGw9PmwubWF4KTtyZXR1cm4gaC5tYXAobD0+KHt3YWxsX3RpbWU6bC53YWxsX3RpbWUsc3RlcDpsLnN0ZXAsYmluczpmKGwsayx0KX0pKX19KShLa3x8KEtrPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaGlzdG9ncmFtLWRhc2hib2FyZC90Zi1oaXN0b2dyYW0tbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhpc3RvZ3JhbS1sb2FkZXIiLHByb3BlcnRpZXM6e3J1bjpTdHJpbmcsdGFnOlN0cmluZyxkYXRhVG9Mb2FkOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZURhdGFUb0xvYWQocnVuLCB0YWcpIn0sZ2V0RGF0YUxvYWROYW1lOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT4oe3J1bjpifSk9PmJ9LGdldERhdGFMb2FkVXJsOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOigpPT4oe3RhZzpiLHJ1bjpkfSk9PnZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiaGlzdG9ncmFtcyIsIi9oaXN0b2dyYW1zIikse3RhZzpiLHJ1bjpkfSl9LGxvYWREYXRhQ2FsbGJhY2s6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oYixkLGYpPT57Yj1Lay5iYWNrZW5kVG9WeihmKTtkPXRoaXMuZ2V0RGF0YUxvYWROYW1lKGQpO3RoaXMuJC5jaGFydC5zZXRTZXJpZXNEYXRhKGQsYil9fX0sdGFnTWV0YWRhdGE6T2JqZWN0LHRpbWVQcm9wZXJ0eTpTdHJpbmcsCmhpc3RvZ3JhbU1vZGU6U3RyaW5nLF9jb2xvclNjYWxlRnVuY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5wZi5ydW5zQ29sb3JTY2FsZX0sX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sX2V4cGFuZGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0sb2JzZXJ2ZXJzOlsicmVsb2FkKHJ1biwgdGFnLCByZXF1ZXN0TWFuYWdlcikiXSxiZWhhdmlvcnM6W3FkLkRhdGFMb2FkZXJCZWhhdmlvcl0sX2NvbXB1dGVEYXRhVG9Mb2FkKGIsZCl7cmV0dXJuW3tydW46Yix0YWc6ZH1dfSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlRnVuY3Rpb24oYil9LHJlZHJhdygpe3RoaXMuJC5jaGFydC5yZWRyYXcoKX0sX3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKTt0aGlzLnJlZHJhdygpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhpc3RvZ3JhbS1kYXNoYm9hcmQvdGYtaGlzdG9ncmFtLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfaGlzdG9ncmFtTW9kZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZnNldCJ9LF90aW1lUHJvcGVydHk6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sX3NlbGVjdGVkUnVuczpBcnJheSxfcnVuVG9UYWc6T2JqZWN0LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOlN0cmluZyxfcmVzdGFtcDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY2F0ZWdvcmllc0RvbVJlYWR5OkJvb2xlYW4sX2NhdGVnb3JpZXM6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9tYWtlQ2F0ZWdvcmllcyhfcnVuVG9UYWcsIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIn0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyfX0sbGlzdGVuZXJzOnsiY29udGVudC12aXNpYmlsaXR5LWNoYW5nZWQiOiJfcmVkcmF3Q2F0ZWdvcnlQYW5lIn0sCl9yZWRyYXdDYXRlZ29yeVBhbmUoYixkKXtkJiZiLnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1oaXN0b2dyYW0tbG9hZGVyIikuZm9yRWFjaChmPT5mLnJlZHJhdygpKX0scmVhZHkoKXt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpPT57dGhpcy5fcmVsb2FkSGlzdG9ncmFtcygpfSl9LF9mZXRjaFRhZ3MoKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJoaXN0b2dyYW1zIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxrPT5PYmplY3Qua2V5cyhrKSksaD12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09aC5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWciLGYpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKTt0aGlzLmFzeW5jKCgpPT4Ke3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZEhpc3RvZ3JhbXMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtaGlzdG9ncmFtLWxvYWRlciIpLmZvckVhY2goYj0+e2IucmVsb2FkKCl9KX0sX3Nob3VsZE9wZW4oYil7cmV0dXJuIDI+PWJ9LF9tYWtlQ2F0ZWdvcmllcyhiLGQsZil7cmV0dXJuICRjLmNhdGVnb3JpemVSdW5UYWdDb21iaW5hdGlvbnMoYixkLGYpfSxfdGFnTWV0YWRhdGEoYixkLGYpe3JldHVybiBiW2RdW2ZdfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRleHQtZGFzaGJvYXJkL3RmLXRleHQtbG9hZGVyLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRleHQtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsX3J1bkNvbG9yOnt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihydW4pIn0sX3RleHRzOnt0eXBlOkFycmF5LHZhbHVlOltdfSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX2NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9fSxfY29tcHV0ZVJ1bkNvbG9yKGIpe3JldHVybiBwZi5ydW5zQ29sb3JTY2FsZShiKX0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXtpZih0aGlzLl9hdHRhY2hlZCl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO3ZhciBiPXZjLmFkZFBhcmFtcyh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgidGV4dCIsIi90ZXh0Iikse3RhZzp0aGlzLnRhZyxydW46dGhpcy5ydW59KSxkPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZShmPT57Zi5jYW5jZWxsZWR8fAooZj1mLnZhbHVlLm1hcChoPT4oe3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqaC53YWxsX3RpbWUpLHN0ZXA6aC5zdGVwLHRleHQ6aC50ZXh0fSkpLHRoaXMuc2V0KCJfdGV4dHMiLGYuc2xpY2UoKS5yZXZlcnNlKCkpKX0pO3RoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQpfX0sX2Zvcm1hdFN0ZXAoYil7cmV0dXJuIGQzLmZvcm1hdCgiLCIpKGIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRleHQtZGFzaGJvYXJkL3RmLXRleHQtZGFzaGJvYXJkLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXRleHQtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZzpPYmplY3QsX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlciwgX2NhdGVnb3JpZXNEb21SZWFkeSkifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe3RoaXMuX2ZldGNoVGFncygpLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRUZXh0cygpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgidGV4dCIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoYikudGhlbihkPT4Ke2lmKCFfLmlzRXF1YWwoZCx0aGlzLl9ydW5Ub1RhZykpe3ZhciBmPXZjLmdldFRhZ3MoZCk7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1mLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZyIsZCk7dGhpcy5hc3luYygoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KX19KX0sX3JlbG9hZFRleHRzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLXRleHQtbG9hZGVyIikuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfbWFrZUNhdGVnb3JpZXMoYixkLGYpe3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGIsZCxmKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wci1jdXJ2ZS1kYXNoYm9hcmQvdGYtcHItY3VydmUtY2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1wci1jdXJ2ZS1jYXJkIixwcm9wZXJ0aWVzOntydW5zOkFycmF5LHRhZzpTdHJpbmcsdGFnTWV0YWRhdGE6T2JqZWN0LHJ1blRvU3RlcENhcDpPYmplY3QscmVxdWVzdE1hbmFnZXI6T2JqZWN0LGFjdGl2ZTpCb29sZWFuLF9leHBhbmRlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX3J1blRvUHJDdXJ2ZUVudHJ5Ont0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnk6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcnVuc1dpdGhTdGVwQXZhaWxhYmxlOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVJ1bnNXaXRoU3RlcEF2YWlsYWJsZShydW5zLCBfcnVuVG9QckN1cnZlRW50cnkpIn0sX3NldE9mUmVsZXZhbnRSdW5zOnt0eXBlOk9iamVjdCxjb21wdXRlZDoiX2NvbXB1dGVTZXRPZlJlbGV2YW50UnVucyhfcnVuc1dpdGhTdGVwQXZhaWxhYmxlKSJ9LF9ydW5Ub0RhdGFPdmVyVGltZTpPYmplY3QsCl9jb2xvclNjYWxlRnVuY3Rpb246e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe3NjYWxlOnBmLnJ1bnNDb2xvclNjYWxlfSl9LF9jYW5jZWxsZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuQ2FuY2VsbGVyfSxfYXR0YWNoZWQ6Qm9vbGVhbixfeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDp7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsdmFsdWU6KCk9PigpPT57Y29uc3QgYj1uZXcgUGxvdHRhYmxlLlNjYWxlcy5MaW5lYXI7cmV0dXJue3NjYWxlOmIsYXhpczpuZXcgUGxvdHRhYmxlLkF4ZXMuTnVtZXJpYyhiLCJib3R0b20iKSxhY2Nlc3NvcjpkPT5kLnJlY2FsbH19fSxfeVZhbHVlQWNjZXNzb3I6e3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLHZhbHVlOigpPT5iPT5iLnByZWNpc2lvbn0sX3Rvb2x0aXBDb2x1bW5zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLHZhbHVlOigpPT57Y29uc3QgYj1yZy5tdWx0aXNjYWxlRm9ybWF0dGVyKHJnLllfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OKSwKZD1mPT5pc05hTihmKT8iTmFOIjpiKGYpO3JldHVyblt7dGl0bGU6IlJ1biIsZXZhbHVhdGU6Zj0+Zi5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZX0se3RpdGxlOiJUaHJlc2hvbGQiLGV2YWx1YXRlOmY9PmQoZi5kYXR1bS50aHJlc2hvbGRzKX0se3RpdGxlOiJQcmVjaXNpb24iLGV2YWx1YXRlOmY9PmQoZi5kYXR1bS5wcmVjaXNpb24pfSx7dGl0bGU6IlJlY2FsbCIsZXZhbHVhdGU6Zj0+ZChmLmRhdHVtLnJlY2FsbCl9LHt0aXRsZToiVFAiLGV2YWx1YXRlOmY9PmYuZGF0dW0udHJ1ZV9wb3NpdGl2ZXN9LHt0aXRsZToiRlAiLGV2YWx1YXRlOmY9PmYuZGF0dW0uZmFsc2VfcG9zaXRpdmVzfSx7dGl0bGU6IlROIixldmFsdWF0ZTpmPT5mLmRhdHVtLnRydWVfbmVnYXRpdmVzfSx7dGl0bGU6IkZOIixldmFsdWF0ZTpmPT5mLmRhdHVtLmZhbHNlX25lZ2F0aXZlc31dfX0sX3Nlcmllc0RhdGFGaWVsZHM6e3R5cGU6QXJyYXksdmFsdWU6InRocmVzaG9sZHMgcHJlY2lzaW9uIHJlY2FsbCB0cnVlX3Bvc2l0aXZlcyBmYWxzZV9wb3NpdGl2ZXMgdHJ1ZV9uZWdhdGl2ZXMgZmFsc2VfbmVnYXRpdmVzIi5zcGxpdCgiICIpLApyZWFkT25seTohMH0sX2RlZmF1bHRYUmFuZ2U6e3R5cGU6QXJyYXksdmFsdWU6Wy0uMDUsMS4wNV0scmVhZE9ubHk6ITB9LF9kZWZhdWx0WVJhbmdlOnt0eXBlOkFycmF5LHZhbHVlOlstLjA1LDEuMDVdLHJlYWRPbmx5OiEwfSxfZGF0YVVybDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBiPT57Y29uc3QgZD10aGlzLnRhZztyZXR1cm4gdmMuYWRkUGFyYW1zKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJwcl9jdXJ2ZXMiLCIvcHJfY3VydmVzIikse3RhZzpkLHJ1bjpifSl9fX0sX3Ntb290aGluZ0VuYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH19LG9ic2VydmVyczpbInJlbG9hZChydW5zLCB0YWcpIiwiX3NldENoYXJ0RGF0YShfcnVuVG9QckN1cnZlRW50cnksIF9wcmV2aW91c1J1blRvUHJDdXJ2ZUVudHJ5LCBfc2V0T2ZSZWxldmFudFJ1bnMpIiwiX3VwZGF0ZVJ1blRvUHJDdXJ2ZUVudHJ5KF9ydW5Ub0RhdGFPdmVyVGltZSwgcnVuVG9TdGVwQ2FwKSJdLApfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpe3JldHVybihiLGQsZik9Pnt0aGlzLnNldCgiX3J1blRvRGF0YU92ZXJUaW1lIixPYmplY3QuYXNzaWduKHt9LHRoaXMuX3J1blRvRGF0YU92ZXJUaW1lLGYpKX19LF9jb21wdXRlUnVuQ29sb3IoYil7cmV0dXJuIHRoaXMuX2NvbG9yU2NhbGVGdW5jdGlvbi5zY2FsZShiKX0sYXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMDt0aGlzLnJlbG9hZCgpfSxyZWxvYWQoKXt0aGlzLl9hdHRhY2hlZCYmKDA9PT10aGlzLnJ1bnMubGVuZ3RoP3RoaXMuc2V0KCJfcnVuVG9EYXRhT3ZlclRpbWUiLHt9KTp0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVsb2FkKCkpfSxfc2V0Q2hhcnREYXRhKGIsZCxmKXtfLmZvck93bihiLChoLGspPT57Y29uc3QgdD1kW2tdO3QmJmJba10uc3RlcD09PXQuc3RlcHx8KGZba10/dGhpcy5fdXBkYXRlU2VyaWVzRGF0YUZvclJ1bihrLGgpOnRoaXMuX2NsZWFyU2VyaWVzRGF0YShrKSl9KX0sCl91cGRhdGVTZXJpZXNEYXRhRm9yUnVuKGIsZCl7Y29uc3QgZj1fLnJlZHVjZSh0aGlzLl9zZXJpZXNEYXRhRmllbGRzLChrLHQpPT57a1t0XT1kW3RdLnNsaWNlKCkucmV2ZXJzZSgpO3JldHVybiBrfSx7fSksaD1BcnJheShmW3RoaXMuX3Nlcmllc0RhdGFGaWVsZHNbMF1dLmxlbmd0aCk7Zm9yKGxldCBrPTA7azxoLmxlbmd0aDtrKyspaFtrXT1fLm1hcFZhbHVlcyhmLHQ9PnRba10pO3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5zZXRTZXJpZXNEYXRhKGIsaCl9LF9jbGVhclNlcmllc0RhdGEoYil7dGhpcy4kJCgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpLnNldFNlcmllc0RhdGEoYixbXSl9LF91cGRhdGVSdW5Ub1ByQ3VydmVFbnRyeShiLGQpe2NvbnN0IGY9e307Xy5mb3JPd24oYiwoaCxrKT0+e2gmJmgubGVuZ3RoJiYoZltrXT10aGlzLl9jb21wdXRlRW50cnlDbG9zZXN0T3JFcXVhbFRvU3RlcENhcChkW2tdLGgpKX0pO3RoaXMuc2V0KCJfcHJldmlvdXNSdW5Ub1ByQ3VydmVFbnRyeSIsCnRoaXMuX3J1blRvUHJDdXJ2ZUVudHJ5KTt0aGlzLnNldCgiX3J1blRvUHJDdXJ2ZUVudHJ5IixmKX0sX2NvbXB1dGVFbnRyeUNsb3Nlc3RPckVxdWFsVG9TdGVwQ2FwKGIsZCl7Yj1NYXRoLm1pbihfLnNvcnRlZEluZGV4KGQubWFwKGY9PmYuc3RlcCksYiksZC5sZW5ndGgtMSk7cmV0dXJuIGRbYl19LF9jb21wdXRlUnVuc1dpdGhTdGVwQXZhaWxhYmxlKGIsZCl7cmV0dXJuIF8uZmlsdGVyKGIsZj0+ZFtmXSkuc29ydCgpfSxfY29tcHV0ZVNldE9mUmVsZXZhbnRSdW5zKGIpe2NvbnN0IGQ9e307Xy5mb3JFYWNoKGIsZj0+e2RbZl09ITB9KTtyZXR1cm4gZH0sX2NvbXB1dGVDdXJyZW50U3RlcEZvclJ1bihiLGQpe3JldHVybihiPWJbZF0pP2Iuc3RlcDpudWxsfSxfY29tcHV0ZUN1cnJlbnRXYWxsVGltZUZvclJ1bihiLGQpe3JldHVybihiPWJbZF0pPyhuZXcgRGF0ZSgxRTMqYi53YWxsX3RpbWUpKS50b1N0cmluZygpOm51bGx9LF90b2dnbGVFeHBhbmRlZCgpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLAohdGhpcy5fZXhwYW5kZWQpO3RoaXMucmVkcmF3KCl9LF9yZXNldERvbWFpbigpe3RoaXMuJCQoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKS5yZXNldERvbWFpbigpfSxyZWRyYXcoKXt0aGlzLiQkKCJ0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyIikucmVkcmF3KCl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcHItY3VydmUtZGFzaGJvYXJkL3RmLXByLWN1cnZlLXN0ZXBzLXNlbGVjdG9yLmh0bWwuanMKUG9seW1lcih7aXM6InRmLXByLWN1cnZlLXN0ZXBzLXNlbGVjdG9yIixwcm9wZXJ0aWVzOntydW5zOkFycmF5LHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXM6T2JqZWN0LHJ1blRvU3RlcDp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLGNvbXB1dGVkOiJfY29tcHV0ZVJ1blRvU3RlcChydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBfcnVuVG9TdGVwSW5kZXgpIn0sdGltZURpc3BsYXlUeXBlOlN0cmluZyxfcnVuVG9TdGVwSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcnVuc1dpdGhTbGlkZXJzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZVJ1bnNXaXRoU2xpZGVycyhydW5zLCBydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzKSJ9fSxvYnNlcnZlcnM6WyJfdXBkYXRlU3RlcHNGb3JOZXdSdW5zKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMpIl0sX2NvbXB1dGVDb2xvckZvclJ1bihiKXtyZXR1cm4gcGYucnVuc0NvbG9yU2NhbGUoYil9LF9jb21wdXRlVGltZVRleHRGb3JSdW4oYiwKZCxmLGgpe2Q9ZFtmXTtpZighXy5pc051bWJlcihkKSlyZXR1cm4iIjtiPWJbZl07aWYoIWIpcmV0dXJuIiI7Yj1iW2RdW2hdO2lmKCJzdGVwIj09PWgpcmV0dXJuYHN0ZXAgJHtifWA7aWYoInJlbGF0aXZlIj09PWgpcmV0dXJuIDE+Yj9gJHsoMUUzKmIpLnRvRml4ZWQoMil9IG1zYDpgJHtiLnRvRml4ZWQoMil9IHNgO2lmKCJ3YWxsX3RpbWUiPT09aClyZXR1cm4obmV3IERhdGUoMUUzKmIpKS50b1N0cmluZygpO3Rocm93IEVycm9yKGBUaGUgZGlzcGxheSB0eXBlIG9mICR7aH0gaXMgbm90IHJlY29nbml6ZWQuYCk7fSxfc2xpZGVyVmFsdWVDaGFuZ2VkKGIpe2NvbnN0IGQ9Yi50YXJnZXQuZGF0YXNldC5ydW4sZj1iLnRhcmdldC5pbW1lZGlhdGVWYWx1ZSxoPU9iamVjdC5hc3NpZ24oe30sdGhpcy5fcnVuVG9TdGVwSW5kZXgpO2lzTmFOKGYpP2RlbGV0ZSBoW2RdOmhbZF09Yi50YXJnZXQuaW1tZWRpYXRlVmFsdWU7dGhpcy5fcnVuVG9TdGVwSW5kZXg9aH0sX2NvbXB1dGVNYXhTdGVwSW5kZXhGb3JSdW4oYiwKZCl7cmV0dXJuKGI9YltkXSkmJmIubGVuZ3RoP2IubGVuZ3RoLTE6MH0sX3VwZGF0ZVN0ZXBzRm9yTmV3UnVucyhiKXtjb25zdCBkPU9iamVjdC5hc3NpZ24oe30sdGhpcy5fcnVuVG9TdGVwSW5kZXgpO18uZm9yT3duKGIsKGYsaCk9PntfLmlzTnVtYmVyKGRbaF0pfHwoZFtoXT1mLmxlbmd0aC0xKX0pO3RoaXMuX3J1blRvU3RlcEluZGV4PWR9LF9nZXRTdGVwKGIsZCl7cmV0dXJuIHRoaXMuX3J1blRvU3RlcEluZGV4P3RoaXMuX3J1blRvU3RlcEluZGV4W2RdOjB9LF9jb21wdXRlUnVuVG9TdGVwKGIsZCl7Y29uc3QgZj17fTtfLmZvck93bihkLChoLGspPT57Y29uc3QgdD1iW2tdO3QmJihmW2tdPXRbaF0uc3RlcCl9KTtyZXR1cm4gZn0sX2NvbXB1dGVSdW5zV2l0aFNsaWRlcnMoYixkKXtyZXR1cm4gYi5maWx0ZXIoZj0+ZFtmXSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtcHItY3VydmUtZGFzaGJvYXJkL3RmLXByLWN1cnZlLWRhc2hib2FyZC5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQiLHByb3BlcnRpZXM6e190aW1lRGlzcGxheVR5cGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGVwIn0sX3NlbGVjdGVkUnVuczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W119LF9ydW5Ub1RhZ0luZm86e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe30pfSxfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllczp7dHlwZTpPYmplY3QsdmFsdWU6e319LF9yZWxldmFudFNlbGVjdGVkUnVuczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX2NvbXB1dGVSZWxldmFudFNlbGVjdGVkUnVucyhfc2VsZWN0ZWRSdW5zLCBfcnVuVG9UYWdJbmZvKSJ9LF9ydW5zV2l0aFByQ3VydmVEYXRhOkFycmF5LF9ydW5Ub1N0ZXA6e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sX2RhdGFOb3RGb3VuZDpCb29sZWFuLF90YWdGaWx0ZXI6U3RyaW5nLF9jYXRlZ29yaWVzRG9tUmVhZHk6Qm9vbGVhbixfY2F0ZWdvcmllczp7dHlwZTpBcnJheSxjb21wdXRlZDoiX21ha2VDYXRlZ29yaWVzKF9ydW5Ub1RhZ0luZm8sIF9zZWxlY3RlZFJ1bnMsIF90YWdGaWx0ZXIsIF9jYXRlZ29yaWVzRG9tUmVhZHkpIn0sCl9nZXRDYXRlZ29yeUl0ZW1LZXk6e3R5cGU6RnVuY3Rpb24sdmFsdWU6KCk9PmI9PmIudGFnfSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9LF9zdGVwOnt0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH19LHJlYWR5KCl7dGhpcy5yZWxvYWQoKX0scmVsb2FkKCl7UHJvbWlzZS5hbGwoW3RoaXMuX2ZldGNoVGFncygpLHRoaXMuX2ZldGNoVGltZUVudHJpZXNQZXJSdW4oKV0pLnRoZW4oKCk9Pnt0aGlzLl9yZWxvYWRDYXJkcygpfSl9LF9zaG91bGRPcGVuKGIpe3JldHVybiAyPj1ifSxfZmV0Y2hUYWdzKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgicHJfY3VydmVzIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntpZighXy5pc0VxdWFsKGQsdGhpcy5fcnVuVG9UYWdJbmZvKSl7dmFyIGY9Xy5tYXBWYWx1ZXMoZCxoPT5fLmtleXMoaCkpOwpmPXZjLmdldFRhZ3MoZik7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1mLmxlbmd0aCk7dGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLGQpO3RoaXMuYXN5bmMoKCk9Pnt0aGlzLnNldCgiX2NhdGVnb3JpZXNEb21SZWFkeSIsITApfSl9fSl9LF9mZXRjaFRpbWVFbnRyaWVzUGVyUnVuKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgicHJfY3VydmVzIiwiL2F2YWlsYWJsZV90aW1lX2VudHJpZXMiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9PntfLmZvck93bihkLGY9PntfLmZvckVhY2goZixoPT57aC5yZWxhdGl2ZT1oLndhbGxfdGltZS1mWzBdLndhbGxfdGltZX0pfSk7dGhpcy5zZXQoIl9ydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzIixkKTtkPV8ua2V5cyhkKS5zbGljZSgpLnNvcnQoKTtfLmlzRXF1YWwoZCx0aGlzLl9ydW5zV2l0aFByQ3VydmVEYXRhKXx8dGhpcy5zZXQoIl9ydW5zV2l0aFByQ3VydmVEYXRhIiwKZCl9KX0sX3JlbG9hZENhcmRzKCl7Xy5mb3JFYWNoKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1wci1jdXJ2ZS1jYXJkIiksYj0+e2IucmVsb2FkKCl9KX0sX21ha2VDYXRlZ29yaWVzKGIsZCxmKXtiPV8ubWFwVmFsdWVzKGIsaD0+T2JqZWN0LmtleXMoaCkpO3JldHVybiAkYy5jYXRlZ29yaXplVGFncyhiLGQsZil9LF9jb21wdXRlQ29sb3JGb3JSdW4oYil7cmV0dXJuIHBmLnJ1bnNDb2xvclNjYWxlKGIpfSxfY29tcHV0ZVJlbGV2YW50U2VsZWN0ZWRSdW5zKGIsZCl7cmV0dXJuIGIuZmlsdGVyKGY9PmRbZl0pfSxfdGFnTWV0YWRhdGEoYixkLGYpe2NvbnN0IGg9e307ZC5mb3JFYWNoKGs9PntoW2tdPWJba11bZl19KTtkPWYucmVwbGFjZSgvXC9wcl9jdXJ2ZXMkLywiIik7cmV0dXJuIHJmLmFnZ3JlZ2F0ZVRhZ0luZm8oaCxkKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wcm9maWxlLXJlZGlyZWN0LWRhc2hib2FyZC90Zi1wcm9maWxlLXJlZGlyZWN0LWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1wcm9maWxlLXJlZGlyZWN0LWRhc2hib2FyZCIscHJvcGVydGllczp7X2luc3RhbGxDb21tYW5kOnt0eXBlOlN0cmluZyxyZWFkT25seTohMCx2YWx1ZToicGlwIGluc3RhbGwgLVUgdGVuc29yYm9hcmRfcGx1Z2luX3Byb2ZpbGUifX0sX2NvcHlJbnN0YWxsQ29tbWFuZCgpe2NvbnN0IGI9dGhpcztyZXR1cm4gaGMoZnVuY3Rpb24qKCl7Y29uc3QgZD0oKT0+aGMoZnVuY3Rpb24qKCl7Yi4kLmNvbW1hbmRUZXh0YXJlYS5zZWxlY3QoKTt0cnl7eWllbGQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQoYi5faW5zdGFsbENvbW1hbmQpfWNhdGNoKGYpe2lmKCFkb2N1bWVudC5leGVjQ29tbWFuZCgiY29weSIpKXJldHVybiBQcm9taXNlLnJlamVjdCgpfX0pO3RyeXt5aWVsZCBkKCksYi4kLmNvcGllZE1lc3NhZ2UuaW5uZXJUZXh0PSJDb3BpZWQuIn1jYXRjaChmKXtiLiQuY29waWVkTWVzc2FnZS5pbm5lclRleHQ9IkZhaWxlZCB0byBjb3B5IHRvIGNsaXBib2FyZC4ifX0pfSwKX3JlbW92ZUNvcGllZE1lc3NhZ2UoKXt0aGlzLiQuY29waWVkTWVzc2FnZS5pbm5lclRleHQ9IiJ9fSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL3BsdWdpbi1kaWFsb2cuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtcGx1Z2luLWRpYWxvZyIscHJvcGVydGllczp7X3RpdGxlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxfY3VzdG9tTWVzc2FnZTp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX29wZW46e3R5cGU6Qm9vbGVhbn0sX2hpZGRlbjp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUhpZGRlbihfb3BlbikiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX3VzZU5hdGl2ZUJhY2tkcm9wOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVhZE9ubHk6ITB9fSxvcGVuTm9UZW5zb3JGbG93RGlhbG9nKCl7dGhpcy5vcGVuRGlhbG9nKCJUaGlzIHBsdWdpbiBpcyBkaXNhYmxlZCB3aXRob3V0IFRlbnNvckZsb3ciLCdUbyBlbmFibGUgdGhpcyBwbHVnaW4gaW4gVGVuc29yQm9hcmQsIGluc3RhbGwgVGVuc29yRmxvdyB3aXRoICJwaXAgaW5zdGFsbCB0ZW5zb3JmbG93IiBvciBlcXVpdmFsZW50LicpfSxvcGVuT2xkVGVuc29yRmxvd0RpYWxvZyhiKXt0aGlzLm9wZW5EaWFsb2coIlRoaXMgcGx1Z2luIGlzIGRpc2FibGVkIHdpdGhvdXQgVGVuc29yRmxvdyAiKwpiLCJUbyBlbmFibGUgdGhpcyBwbHVnaW4gaW4gVGVuc29yQm9hcmQsIGluc3RhbGwgVGVuc29yRmxvdyAiK2IrJyBvciBncmVhdGVyIHdpdGggInBpcCBpbnN0YWxsIHRlbnNvcmZsb3ciIG9yIGVxdWl2YWxlbnQuJyl9LG9wZW5EaWFsb2coYixkKXt0aGlzLnNldCgiX3RpdGxlIixiKTt0aGlzLnNldCgiX2N1c3RvbU1lc3NhZ2UiLGQpO3RoaXMuJC5kaWFsb2cub3BlbigpfSxjbG9zZURpYWxvZygpe3RoaXMuJC5kaWFsb2cuY2xvc2UoKX0sX2NvbXB1dGVIaWRkZW4oYil7cmV0dXJuIWJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmVob2xkZXItZGFzaGJvYXJkL3RmLWJlaG9sZGVyLXZpZGVvLmh0bWwuanMKKGZ1bmN0aW9uKCl7Y29uc3QgYj12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgiYmVob2xkZXIiLCIvYmVob2xkZXItZnJhbWUiKSxkPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9waW5nIik7UG9seW1lcih7aXM6InRmLWJlaG9sZGVyLXZpZGVvIixwcm9wZXJ0aWVzOntmcHM6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG9ic2VydmVyOiJfZnBzQ2hhbmdlZCJ9LHBpbmdTbGVlcDp7dHlwZTpOdW1iZXIsdmFsdWU6MUUzfSx4aHJUaW1lb3V0Ont0eXBlOk51bWJlcix2YWx1ZToyNTAwfSxfaW1hZ2VVUkw6e3R5cGU6U3RyaW5nLHZhbHVlOiJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFEL0FDd0FBQUFBQVFBQkFBQUNBRHNceDNkIn0sX3hocjpPYmplY3QsX3RpbWVyOk51bWJlcixfaXNEZWFkOkJvb2xlYW59LGF0dGFjaGVkKCl7dGhpcy5zZXQoIl9pbWFnZVVSTCIsYik7dGhpcy5fcGluZygpfSxkZXRhY2hlZCgpe3RoaXMuX2NsZWFyKCk7CnRoaXMuc2V0KCJfaW1hZ2VVUkwiLCJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFEL0FDd0FBQUFBQVFBQkFBQUNBRHNceDNkIil9LF9waW5nKCl7dGhpcy5fY2xlYXIoKTt0aGlzLl94aHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3RoaXMuX3hoci5vcGVuKCJHRVQiLGQsITApO3RoaXMuX3hoci50aW1lb3V0PXRoaXMueGhyVGltZW91dDt0aGlzLl94aHIub25sb2FkPXRoaXMuX29uUGluZ0xvYWQuYmluZCh0aGlzKTt0aGlzLl94aHIub25lcnJvcj10aGlzLl9vblBpbmcuYmluZCh0aGlzLCExLHRoaXMucGluZ1NsZWVwKTt0aGlzLl94aHIub250aW1lb3V0PXRoaXMuX29uUGluZy5iaW5kKHRoaXMsITEsMSk7dGhpcy5feGhyLnNlbmQobnVsbCl9LF9vblBpbmdMb2FkKCl7aWYoMjAwPT10aGlzLl94aHIuc3RhdHVzKXtjb25zdCBmPUpTT04ucGFyc2UodGhpcy5feGhyLnJlc3BvbnNlVGV4dCk7dGhpcy5fb25QaW5nKCJhbGl2ZSI9PWYuc3RhdHVzLHRoaXMucGluZ1NsZWVwKX1lbHNlIHRoaXMuX29uUGluZyghMSwKdGhpcy5waW5nU2xlZXApfSxfb25QaW5nKGYsaCl7ZiYmdGhpcy5faXNEZWFkJiZ0aGlzLnNldCgiX2ltYWdlVVJMIixiKyI/dFx4M2QiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpKTt0aGlzLl9pc0RlYWQ9IWY7dGhpcy5fdGltZXI9d2luZG93LnNldFRpbWVvdXQoKCk9PnRoaXMuX3BpbmcoKSxoKX0sX2NsZWFyKCl7dGhpcy5fdGltZXImJih3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVyKSx0aGlzLl90aW1lcj1udWxsKTt0aGlzLl94aHImJih0aGlzLl94aHIucmVhZHlTdGF0ZTxYTUxIdHRwUmVxdWVzdC5ET05FJiZ0aGlzLl94aHIuYWJvcnQoKSx0aGlzLl94aHI9bnVsbCl9LF9mcHNDaGFuZ2VkKGYsaCl7MD09Zj90aGlzLl9jbGVhcigpOjA9PWgmJnRoaXMuX3BpbmcoKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtYmVob2xkZXItZGFzaGJvYXJkL3RmLWJlaG9sZGVyLWluZm8uaHRtbC5qcwooZnVuY3Rpb24oKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9zZWN0aW9uLWluZm8iKTtQb2x5bWVyKHtpczoidGYtYmVob2xkZXItaW5mbyIscHJvcGVydGllczp7ZnBzOnt0eXBlOk51bWJlcix2YWx1ZToxMCxvYnNlcnZlcjoiX2Zwc0NoYW5nZWQifSx4aHJUaW1lb3V0Ont0eXBlOk51bWJlcix2YWx1ZToxRTR9LF9pdGVtczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W3tuYW1lOiJMb2FkaW5nLi4uIn1dfSxfeGhyOk9iamVjdCxfdGltZXI6TnVtYmVyfSxhdHRhY2hlZCgpe3RoaXMuX2xvYWQoKX0sZGV0YWNoZWQoKXt0aGlzLl9jbGVhcigpfSxfbG9hZCgpe3RoaXMuX2NsZWFyKCk7dGhpcy5feGhyPW5ldyBYTUxIdHRwUmVxdWVzdDt0aGlzLl94aHIub3BlbigiR0VUIixiLCEwKTt0aGlzLl94aHIudGltZW91dD10aGlzLnhoclRpbWVvdXQ7dGhpcy5feGhyLm9ubG9hZD10aGlzLl9vbkxvYWQuYmluZCh0aGlzKTt0aGlzLl94aHIub25lcnJvcj0KdGhpcy5fcmV0cnkuYmluZCh0aGlzLHRoaXMuX2dldFNsZWVwKCkpO3RoaXMuX3hoci5vbnRpbWVvdXQ9dGhpcy5fcmV0cnkuYmluZCh0aGlzLDEpO3RoaXMuX3hoci5zZW5kKG51bGwpfSxfb25Mb2FkKCl7aWYoMjAwPT10aGlzLl94aHIuc3RhdHVzKXtjb25zdCBkPUpTT04ucGFyc2UodGhpcy5feGhyLnJlc3BvbnNlVGV4dCk7Y29uc29sZS5hc3NlcnQoQXJyYXkuaXNBcnJheShkKSwiRXhwZWN0ZWQgcmVzcG9uc2UgdG8gYmUgaW4gYW4gYXJyYXkiKTt0aGlzLl9pdGVtcz1kfXRoaXMuX3JldHJ5KHRoaXMuX2dldFNsZWVwKCkpfSxfcmV0cnkoZCl7dGhpcy5fdGltZXI9d2luZG93LnNldFRpbWVvdXQodGhpcy5fbG9hZC5iaW5kKHRoaXMpLGQpfSxfZ2V0U2xlZXAoKXtyZXR1cm4gMUUzLygwPT09dGhpcy5mcHM/MTp0aGlzLmZwcyl9LF9jbGVhcigpe3RoaXMuX3RpbWVyJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9bnVsbCk7dGhpcy5feGhyJiYKKHRoaXMuX3hoci5yZWFkeVN0YXRlPFhNTEh0dHBSZXF1ZXN0LkRPTkUmJnRoaXMuX3hoci5hYm9ydCgpLHRoaXMuX3hocj1udWxsKX0sX2Zwc0NoYW5nZWQoZCxmKXswPT1kP3RoaXMuX2NsZWFyKCk6MD09ZiYmdGhpcy5fbG9hZCgpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1iZWhvbGRlci1kYXNoYm9hcmQvdGYtYmVob2xkZXItZGFzaGJvYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWJlaG9sZGVyLWRhc2hib2FyZCIscHJvcGVydGllczp7X3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyKDEwLDApfSxfaXNBdmFpbGFibGU6Qm9vbGVhbixfdmFsdWVzOnt0eXBlOlN0cmluZyx2YWx1ZToidHJhaW5hYmxlX3ZhcmlhYmxlcyIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJ2YXJpYW5jZSIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX3NjYWxpbmc6e3R5cGU6U3RyaW5nLHZhbHVlOiJsYXllciIsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX3dpbmRvd1NpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjE1LG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9wcmV2aW91c0ZQUzp7dHlwZTpOdW1iZXIsdmFsdWU6MzB9LF9GUFM6e3R5cGU6TnVtYmVyLHZhbHVlOjEwLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LApfcmVjb3JkVGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6InN0YXJ0IHJlY29yZGluZyJ9LF9pc1JlY29yZGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9zaG93QWxsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9jb25maWdDaGFuZ2VkIn0sX2NvbG9ybWFwOnt0eXBlOlN0cmluZyx2YWx1ZToibWFnbWEiLG9ic2VydmVyOiJfY29uZmlnQ2hhbmdlZCJ9LF9pc19hY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifSxfY29udHJvbHNfZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2NvbmZpZ0NoYW5nZWQifX0sX3ZhbHVlc05vdEZyYW1lKGIpe3JldHVybiJmcmFtZXMiIT09Yn0sX3ZhcmlhbmNlU2VsZWN0ZWQoYil7cmV0dXJuInZhcmlhbmNlIj09PWJ9LF9jb25maWdDaGFuZ2VkKCl7aWYodGhpcy5faXNfYWN0aXZlJiYhdGhpcy5fY29udHJvbHNfZGlzYWJsZWQpe3ZhciBiPQpbdGhpcy5fdmFsdWVzLHRoaXMuX21vZGUsdGhpcy5fc2NhbGluZyx0aGlzLl93aW5kb3dTaXplLHRoaXMuX0ZQUyx0aGlzLl9pc1JlY29yZGluZyx0aGlzLl9zaG93QWxsLHRoaXMuX2NvbG9ybWFwXSxkO2ZvcihkIG9mIGIpaWYoInVuZGVmaW5lZCI9PT10eXBlb2YgZHx8IiI9PT1kKXJldHVybjtiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsIi9jaGFuZ2UtY29uZmlnIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiLHt2YWx1ZXM6dGhpcy5fdmFsdWVzLG1vZGU6dGhpcy5fbW9kZSxzY2FsaW5nOnRoaXMuX3NjYWxpbmcsd2luZG93X3NpemU6dGhpcy5fd2luZG93U2l6ZSxGUFM6dGhpcy5fRlBTLGlzX3JlY29yZGluZzp0aGlzLl9pc1JlY29yZGluZyxzaG93X2FsbDp0aGlzLl9zaG93QWxsLGNvbG9ybWFwOnRoaXMuX2NvbG9ybWFwfSl9fSxfdG9nZ2xlUmVjb3JkKCl7InN0YXJ0IHJlY29yZGluZyI9PXRoaXMuX3JlY29yZFRleHQ/KHRoaXMuc2V0KCJfcmVjb3JkVGV4dCIsCiJzdG9wIHJlY29yZGluZyIpLHRoaXMuc2V0KCJfaXNSZWNvcmRpbmciLCEwKSk6KHRoaXMuc2V0KCJfcmVjb3JkVGV4dCIsInN0YXJ0IHJlY29yZGluZyIpLHRoaXMuc2V0KCJfaXNSZWNvcmRpbmciLCExKSk7dGhpcy4kLnJlY29yZF9idXR0b24uY2xhc3NMaXN0LnRvZ2dsZSgiaXMtcmVjb3JkaW5nIil9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh2Yy5nZXRSb3V0ZXIoKS5wbHVnaW5zTGlzdGluZygpKS50aGVuKGI9PnsiYmVob2xkZXIiaW4gYj8odGhpcy4kLmluaXRpYWxEaWFsb2cuY2xvc2VEaWFsb2coKSx0aGlzLnNldCgiX2lzQXZhaWxhYmxlIiwhMCkpOih0aGlzLiQuaW5pdGlhbERpYWxvZy5vcGVuTm9UZW5zb3JGbG93RGlhbG9nKCksdGhpcy5zZXQoIl9pc0F2YWlsYWJsZSIsITEpKX0pfSxyZWFkeSgpe3RoaXMucmVsb2FkKCl9LHJlbG9hZCgpe2lmKHRoaXMuX2lzQXZhaWxhYmxlKXtjb25zdCBiPXZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJiZWhvbGRlciIsCiIvaXMtYWN0aXZlIik7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChiKS50aGVuKGQ9Pnt0aGlzLnNldCgiX2lzX2FjdGl2ZSIsZC5pc19hY3RpdmUpO3RoaXMuc2V0KCJfY29udHJvbHNfZGlzYWJsZWQiLCFkLmlzX2NvbmZpZ193cml0YWJsZSl9KX19fSk7cWYucmVnaXN0ZXJEYXNoYm9hcmQoKX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy11dGlscy90Zi1ocGFyYW1zLXV0aWxzLmh0bWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChCKXtyZXR1cm4iIiE9PUIuZGlzcGxheU5hbWUmJnZvaWQgMCE9PUIuZGlzcGxheU5hbWU/Qi5kaXNwbGF5TmFtZTpCLm5hbWV9ZnVuY3Rpb24gayhCKXtpZigiIiE9PUIuZGlzcGxheU5hbWUmJnZvaWQgMCE9PUIuZGlzcGxheU5hbWUpcmV0dXJuIEIuZGlzcGxheU5hbWU7bGV0IEk9Qi5uYW1lLmdyb3VwO0I9Qi5uYW1lLnRhZzt2b2lkIDA9PT1JJiYoST0iIik7dm9pZCAwPT09QiYmKEI9IiIpO3JldHVybiIiPT09ST9COkkrIi4iK0J9ZnVuY3Rpb24gdChCKXtyZXR1cm4gQi5ocGFyYW1Db2x1bW5zLmxlbmd0aH1mdW5jdGlvbiBsKEIpe3JldHVybiBCLm1ldHJpY0NvbHVtbnMubGVuZ3RofWZ1bmN0aW9uIHAoQixJKXtyZXR1cm4gQltJXX1mdW5jdGlvbiBtKEIsSSl7cmV0dXJuIEIuZmluZChOPT5fLmlzRXF1YWwoTi5uYW1lLEkpKX1mdW5jdGlvbiBuKEIsSSxOKXtyZXR1cm4gSS5ocGFyYW1zW0IuaHBhcmFtQ29sdW1uc1tOXS5ocGFyYW1JbmZvLm5hbWVdfQpmdW5jdGlvbiBxKEIsSSxOKXtCPW0oSS5tZXRyaWNWYWx1ZXMsQi5tZXRyaWNDb2x1bW5zW05dLm1ldHJpY0luZm8ubmFtZSk7cmV0dXJuIHZvaWQgMD09PUI/dm9pZCAwOkIudmFsdWV9ZnVuY3Rpb24gdShCLEksTil7cmV0dXJuIE48Qi5ocGFyYW1Db2x1bW5zLmxlbmd0aD9uKEIsSSxOKTpxKEIsSSxOLUIuaHBhcmFtQ29sdW1ucy5sZW5ndGgpfWZ1bmN0aW9uIHgoQil7cmV0dXJuIEIuaHBhcmFtSW5mb3MubGVuZ3RofWZ1bmN0aW9uIEEoQil7cmV0dXJuIEIubWV0cmljSW5mb3MubGVuZ3RofWZ1bmN0aW9uIHkoQixJLE4pe3JldHVybiBJLmhwYXJhbXNbQi5ocGFyYW1JbmZvc1tOXS5uYW1lXX1mdW5jdGlvbiB3KEIsSSxOKXtCPW0oSS5tZXRyaWNWYWx1ZXMsQi5tZXRyaWNJbmZvc1tOXS5uYW1lKTtyZXR1cm4gdm9pZCAwPT09Qj92b2lkIDA6Qi52YWx1ZX1mdW5jdGlvbiBDKEIsSSxOKXtyZXR1cm4gTjxCLmhwYXJhbUluZm9zLmxlbmd0aD95KEIsSSxOKTp3KEIsSSxOLUIuaHBhcmFtSW5mb3MubGVuZ3RoKX0KZnVuY3Rpb24gRyhCKXtyZXR1cm4gXy5pc051bWJlcihCKT9CLnRvUHJlY2lzaW9uKDUpOnZvaWQgMD09PUI/IiI6Qi50b1N0cmluZygpfWZ1bmN0aW9uIEQoQixJKXtyZXR1cm4gQipCK0kqSX1mLmhwYXJhbU5hbWU9aDtmLm1ldHJpY05hbWU9aztmLnNjaGVtYUNvbHVtbk5hbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gSTxCLmhwYXJhbUNvbHVtbnMubGVuZ3RoP2goQi5ocGFyYW1Db2x1bW5zW0ldLmhwYXJhbUluZm8pOmsoQi5tZXRyaWNDb2x1bW5zW0ktQi5ocGFyYW1Db2x1bW5zLmxlbmd0aF0ubWV0cmljSW5mbyl9O2YubnVtSFBhcmFtcz10O2YubnVtTWV0cmljcz1sO2YubnVtQ29sdW1ucz1mdW5jdGlvbihCKXtyZXR1cm4gdChCKStsKEIpfTtmLmhwYXJhbVZhbHVlQnlOYW1lPXA7Zi5tZXRyaWNWYWx1ZUJ5TmFtZT1tO2YuaHBhcmFtVmFsdWVCeUluZGV4PW47Zi5tZXRyaWNWYWx1ZUJ5SW5kZXg9cTtmLmNvbHVtblZhbHVlQnlJbmRleD11O2YubnVtZXJpY0NvbHVtbkV4dGVudD0KZnVuY3Rpb24oQixJLE4pe3JldHVybiBkMy5leHRlbnQoSSxPPT51KEIsTyxOKSl9O2YuZ2V0QWJzb2x1dGVDb2x1bW5JbmRleD1mdW5jdGlvbihCLEksTil7aWYoTjxJLmhwYXJhbUluZm9zLmxlbmd0aClCPUIuaHBhcmFtQ29sdW1ucy5maW5kSW5kZXgoTz0+Ty5ocGFyYW1JbmZvLm5hbWU9PT1JLmhwYXJhbUluZm9zW05dLm5hbWUpO2Vsc2V7Y29uc3QgTz1JLm1ldHJpY0luZm9zW04tSS5ocGFyYW1JbmZvcy5sZW5ndGhdLm5hbWU7Qj1CLmhwYXJhbUNvbHVtbnMubGVuZ3RoK0IubWV0cmljQ29sdW1ucy5maW5kSW5kZXgoSD0+SC5tZXRyaWNJbmZvLm5hbWU9PT1PKX1jb25zb2xlLmFzc2VydCgtMSE9PUIpO3JldHVybiBCfTtmLnNjaGVtYVZpc2libGVDb2x1bW5OYW1lPWZ1bmN0aW9uKEIsSSl7cmV0dXJuIEk8Qi5ocGFyYW1JbmZvcy5sZW5ndGg/aChCLmhwYXJhbUluZm9zW0ldKTprKEIubWV0cmljSW5mb3NbSS1CLmhwYXJhbUluZm9zLmxlbmd0aF0pfTtmLm51bVZpc2libGVIUGFyYW1zPQp4O2YubnVtVmlzaWJsZU1ldHJpY3M9QTtmLm51bVZpc2libGVDb2x1bW5zPWZ1bmN0aW9uKEIpe3JldHVybiB4KEIpK0EoQil9O2YudmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQ9ZnVuY3Rpb24oQixJLE4pe3JldHVybiBkMy5leHRlbnQoSSxPPT5DKEIsTyxOKSl9O2YucHJldHR5UHJpbnRIUGFyYW1WYWx1ZUJ5TmFtZT1mdW5jdGlvbihCLEkpe3JldHVybiBHKHAoQixJKSl9O2YucHJldHR5UHJpbnRNZXRyaWNWYWx1ZUJ5TmFtZT1mdW5jdGlvbihCLEkpe3JldHVybiBHKG0oQixJKSl9O2Yuc2Vzc2lvbkdyb3VwV2l0aE5hbWU9ZnVuY3Rpb24oQixJKXtyZXR1cm4gQi5maW5kKE49Pk4ubmFtZT09PUkpfTtmLmhwYXJhbVZhbHVlQnlWaXNpYmxlSW5kZXg9eTtmLm1ldHJpY1ZhbHVlQnlWaXNpYmxlSW5kZXg9dztmLmNvbHVtblZhbHVlQnlWaXNpYmxlSW5kZXg9QztmLnByZXR0eVByaW50PUc7Zi5sMk5vcm1TcXVhcmVkPUQ7Zi5ldWNsaWRlYW5EaXN0PWZ1bmN0aW9uKEIsSSxOLE8pe3JldHVybiBNYXRoLnNxcnQoRChCLQpOLEktTykpfTtmLnBvaW50VG9SZWN0YW5nbGVEaXN0PWZ1bmN0aW9uKEIsSSxOLE8sSCxLKXtpZihCPE4mJkk8TylyZXR1cm4gZi5ldWNsaWRlYW5EaXN0KEIsSSxOLE8pO2lmKE48PUImJkI8SCYmSTxPKXJldHVybiBPLUk7aWYoSDw9QiYmSTxPKXJldHVybiBmLmV1Y2xpZGVhbkRpc3QoQixJLEgsTyk7aWYoQjxOJiZPPD1JJiZJPEspcmV0dXJuIE4tQjtpZihOPD1CJiZCPEgmJk88PUkmJkk8SylyZXR1cm4gMDtpZihIPD1CJiZPPD1JJiZJPEspcmV0dXJuIEItSDtpZihCPE4mJks8PUkpcmV0dXJuIGYuZXVjbGlkZWFuRGlzdChCLEksTixLKTtpZihOPD1CJiZCPEgmJks8PUkpcmV0dXJuIEktSztpZihIPD1CJiZLPD1JKXJldHVybiBmLmV1Y2xpZGVhbkRpc3QoQixJLEgsSyk7dGhyb3ciUG9pbnQgKHgseSkgbXVzdCBiZSBpbiBvbmUgb2YgdGhlIHJlZ2lvbnMgZGVmaW5lZCBhYm92ZS4iO307Zi50cmFuc2xhdGVTdHI9ZnVuY3Rpb24oQixJKXtyZXR1cm4gdm9pZCAwPT09ST8idHJhbnNsYXRlKCIrCkIrIikiOiJ0cmFuc2xhdGUoIitCKyIsIitJKyIpIn07Zi5yb3RhdGVTdHI9ZnVuY3Rpb24oQixJKXtsZXQgTj0icm90YXRlKDkwIjt2b2lkIDAhPT1CJiZ2b2lkIDAhPT1JJiYoTj1OKyIsIitCKyIsIitJKTtyZXR1cm4gTisiKSJ9O2YuaXNOdWxsT3JVbmRlZmluZWQ9ZnVuY3Rpb24oQil7cmV0dXJuIG51bGw9PT1CfHx2b2lkIDA9PT1CfTtmLnF1YWRUcmVlVmlzaXRQb2ludHNJblJlY3Q9ZnVuY3Rpb24oQixJLE4sTyxILEspe0IudmlzaXQoKE0sTCxRLFQsWCk9PntpZih2b2lkIDA9PT1NLmxlbmd0aCl7ZG8gTD1CLngoKShNLmRhdGEpLFE9Qi55KCkoTS5kYXRhKSxJPD1MJiZMPE8mJk48PVEmJlE8SCYmSyhNLmRhdGEpO3doaWxlKE09TS5uZXh0KTtyZXR1cm4hMH1yZXR1cm4gTD49T3x8VDw9SXx8UT49SHx8WDw9Tn0pfTtmLnF1YWRUcmVlVmlzaXRQb2ludHNJbkRpc2s9ZnVuY3Rpb24oQixJLE4sTyxIKXtCLnZpc2l0KChLLE0sTCxRLFQpPT57aWYodm9pZCAwPT09Sy5sZW5ndGgpe2RvIE09CkIueCgpKEsuZGF0YSksTD1CLnkoKShLLmRhdGEpLE09Zi5ldWNsaWRlYW5EaXN0KEksTixNLEwpLE08PU8mJkgoSy5kYXRhLE0pO3doaWxlKEs9Sy5uZXh0KTtyZXR1cm4hMH1yZXR1cm4gZi5wb2ludFRvUmVjdGFuZ2xlRGlzdChJLE4sTSxMLFEsVCk+T30pfTtmLmZpbHRlclNldD1mdW5jdGlvbihCLEkpe2NvbnN0IE49bmV3IFNldDtCLmZvckVhY2goTz0+e0koTykmJk4uYWRkKE8pfSk7cmV0dXJuIE59O2Yuc2V0QXJyYXlPYnNlcnZhYmx5PWZ1bmN0aW9uKEIsSSl7Y29uc3QgTj1CLmdldCgic2Vzc2lvbkdyb3VwcyIsQik7QXJyYXkuaXNBcnJheShOKT9CLnNwbGljZS5hcHBseShCLFsic2Vzc2lvbkdyb3VwcyIsMCxOLmxlbmd0aF0uY29uY2F0KEkpKTpCLnNldCgic2Vzc2lvbkdyb3VwcyIsSSl9O2YuaGFzaE9mU3RyaW5nPWZ1bmN0aW9uKEIpe2xldCBJPTA7Zm9yKGxldCBOPTA7TjxCLmxlbmd0aDsrK04pST0zMSpJK0IuY2hhckNvZGVBdChOKSY0Mjk0OTY3Mjk1O3JldHVybiBJKwpNYXRoLnBvdygyLDMxKX19KShkLnV0aWxzfHwoZC51dGlscz17fSkpfSkoYi5ocGFyYW1zfHwoYi5ocGFyYW1zPXt9KSl9KSh0Znx8KHRmPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLXNwbGl0LWxheW91dC92YWFkaW4tc3BsaXQtbGF5b3V0Lmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1zcGxpdC1sYXlvdXQiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3JdLHByb3BlcnRpZXM6e3ZlcnRpY2FsOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfSxfcHJldmlvdXNQcmltYXJ5UG9pbnRlckV2ZW50czpTdHJpbmcsX3ByZXZpb3VzU2Vjb25kYXJ5UG9pbnRlckV2ZW50czpTdHJpbmd9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXI9UG9seW1lci5kb20odGhpcykub2JzZXJ2ZU5vZGVzKHRoaXMuX3Byb2Nlc3NDaGlsZHJlbil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7UG9seW1lci5kb20odGhpcykudW5vYnNlcnZlTm9kZXModGhpcy5fb2JzZXJ2ZXIpfSxfcHJvY2Vzc0NoaWxkcmVuOmZ1bmN0aW9uKCl7dGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpLmZpbHRlcihmdW5jdGlvbihiKXtyZXR1cm4gYi5jbGFzc0xpc3QuY29udGFpbnMoInNwbGl0dGVyLWhhbmRsZSIpPwooUG9seW1lci5kb20oYikuc2V0QXR0cmlidXRlKCJzbG90IiwiaGFuZGxlIiksITEpOiEwfSkuZm9yRWFjaChmdW5jdGlvbihiLGQpezA9PT1kPyh0aGlzLl9wcmltYXJ5Q2hpbGQ9YixQb2x5bWVyLmRvbShiKS5zZXRBdHRyaWJ1dGUoInNsb3QiLCJwcmltYXJ5IikpOjE9PWQ/KHRoaXMuX3NlY29uZGFyeUNoaWxkPWIsUG9seW1lci5kb20oYikuc2V0QXR0cmlidXRlKCJzbG90Iiwic2Vjb25kYXJ5IikpOlBvbHltZXIuZG9tKGIpLnJlbW92ZUF0dHJpYnV0ZSgic2xvdCIpfS5iaW5kKHRoaXMpKX0sX3NldEZsZXhCYXNpczpmdW5jdGlvbihiLGQsZil7ZD1NYXRoLm1heCgwLE1hdGgubWluKGQsZikpOzA9PT1kJiYoZD0xRS02KTtiLnN0eWxlLmZsZXg9IjEgMSAiK2QrInB4In0sX29uSGFuZGxlVHJhY2s6ZnVuY3Rpb24oYil7aWYodGhpcy5fcHJpbWFyeUNoaWxkJiZ0aGlzLl9zZWNvbmRhcnlDaGlsZCl7dmFyIGQ9dGhpcy52ZXJ0aWNhbD8iaGVpZ2h0Ijoid2lkdGgiOyJzdGFydCI9PT0KYi5kZXRhaWwuc3RhdGU/KHRoaXMuX3N0YXJ0U2l6ZT17Y29udGFpbmVyOnRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClbZF0tdGhpcy4kLnNwbGl0dGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RdLHByaW1hcnk6dGhpcy5fcHJpbWFyeUNoaWxkLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpW2RdLHNlY29uZGFyeTp0aGlzLl9zZWNvbmRhcnlDaGlsZC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVtkXX0sdGhpcy5fcHJldmlvdXNQcmltYXJ5UG9pbnRlckV2ZW50cz10aGlzLl9wcmltYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cyx0aGlzLl9wcmV2aW91c1NlY29uZGFyeVBvaW50ZXJFdmVudHM9dGhpcy5fc2Vjb25kYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cyx0aGlzLl9wcmltYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIsdGhpcy5fc2Vjb25kYXJ5Q2hpbGQuc3R5bGUucG9pbnRlckV2ZW50cz0ibm9uZSIpOihkPXRoaXMudmVydGljYWw/Yi5kZXRhaWwuZHk6CmIuZGV0YWlsLmR4LHRoaXMuX3NldEZsZXhCYXNpcyh0aGlzLl9wcmltYXJ5Q2hpbGQsdGhpcy5fc3RhcnRTaXplLnByaW1hcnkrZCx0aGlzLl9zdGFydFNpemUuY29udGFpbmVyKSx0aGlzLl9zZXRGbGV4QmFzaXModGhpcy5fc2Vjb25kYXJ5Q2hpbGQsdGhpcy5fc3RhcnRTaXplLnNlY29uZGFyeS1kLHRoaXMuX3N0YXJ0U2l6ZS5jb250YWluZXIpLHRoaXMubm90aWZ5UmVzaXplKCksImVuZCI9PT1iLmRldGFpbC5zdGF0ZSYmKGRlbGV0ZSB0aGlzLl9zdGFydFNpemUsdGhpcy5fcHJpbWFyeUNoaWxkLnN0eWxlLnBvaW50ZXJFdmVudHM9dGhpcy5fcHJldmlvdXNQcmltYXJ5UG9pbnRlckV2ZW50cyx0aGlzLl9zZWNvbmRhcnlDaGlsZC5zdHlsZS5wb2ludGVyRXZlbnRzPXRoaXMuX3ByZXZpb3VzU2Vjb25kYXJ5UG9pbnRlckV2ZW50cykpfX0sX3ByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKGIpe2IucHJldmVudERlZmF1bHQoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXF1ZXJ5LXBhbmUvdGYtaHBhcmFtcy1xdWVyeS1wYW5lLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtcXVlcnktcGFuZSIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLGNvbmZpZ3VyYXRpb246e3R5cGU6T2JqZWN0LHZhbHVlOigpPT4oe3NjaGVtYTp7aHBhcmFtQ29sdW1uczpbXSxtZXRyaWNDb2x1bW5zOltdfSxjb2x1bW5zVmlzaWJpbGl0eTpbXSx2aXNpYmxlU2NoZW1hOntocGFyYW1JbmZvczpbXSxtZXRyaWNJbmZvczpbXX19KSxyZWFkT25seTohMCxub3RpZnk6ITB9LHNlc3Npb25Hcm91cHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sX2V4cGVyaW1lbnQ6T2JqZWN0LF9ocGFyYW1zOkFycmF5LF9tZXRyaWNzOkFycmF5LF9zdGF0dXNlczp7dHlwZTpBcnJheSx2YWx1ZTooKT0+W3t2YWx1ZToiU1RBVFVTX1VOS05PV04iLGRpc3BsYXlOYW1lOiJVbmtub3duIixhbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19TVUNDRVNTIixkaXNwbGF5TmFtZToiU3VjY2VzcyIsCmFsbG93ZWQ6ITB9LHt2YWx1ZToiU1RBVFVTX0ZBSUxVUkUiLGRpc3BsYXlOYW1lOiJGYWlsdXJlIixhbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19SVU5OSU5HIixkaXNwbGF5TmFtZToiUnVubmluZyIsYWxsb3dlZDohMH1dfSxfZ2V0RXhwZXJpbWVudFJlc29sdmVkOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiBuZXcgUHJvbWlzZShiPT57dGhpcy5fcmVzb2x2ZUdldEV4cGVyaW1lbnQ9Yn0pfX0sX3Jlc29sdmVHZXRFeHBlcmltZW50OkZ1bmN0aW9uLF9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlcjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pm5ldyB2Yy5DYW5jZWxsZXJ9LF9zb3J0QnlJbmRleDpOdW1iZXIsX3NvcnREaXJlY3Rpb246TnVtYmVyLF9wYWdlU2l6ZUlucHV0Ont0eXBlOk9iamVjdCx2YWx1ZTp7dmFsdWU6IjEwMCIsaW52YWxpZDohMX19LF9wYWdlTnVtYmVySW5wdXQ6e3R5cGU6T2JqZWN0LHZhbHVlOnt2YWx1ZToiMSIsaW52YWxpZDohMX19LApfcGFnZUNvdW50U3RyOnt0eXBlOlN0cmluZyx2YWx1ZToiPyJ9LF90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0cjpTdHJpbmcsX3Nlc3Npb25Hcm91cHNSZXF1ZXN0Ok9iamVjdH0sb2JzZXJ2ZXJzOlsiX2NvbXB1dGVFeHBlcmltZW50QW5kUmVsYXRlZFByb3BzKGJhY2tlbmQsIGV4cGVyaW1lbnROYW1lKSIsIl91cGRhdGVDb25maWd1cmF0aW9uKF9ocGFyYW1zLiosIF9tZXRyaWNzLiopIl0scmVsb2FkKCl7dGhpcy5fcXVlcnlTZXJ2ZXIoKX0sX2NzdlVybChiLGQpe3JldHVybiB0aGlzLl9kb3dubG9hZERhdGFVcmwoYixkLCJjc3YiKX0sX2pzb25VcmwoYixkKXtyZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCwianNvbiIpfSxfbGF0ZXhVcmwoYixkKXtyZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhVXJsKGIsZCwibGF0ZXgiKX0sX2Rvd25sb2FkRGF0YVVybChiLGQsZil7cmV0dXJuIHRoaXMuYmFja2VuZC5nZXREb3dubG9hZFVybChmLGIsZC5jb2x1bW5zVmlzaWJpbGl0eSl9LApfY29tcHV0ZUV4cGVyaW1lbnRBbmRSZWxhdGVkUHJvcHMoKXtjb25zdCBiPXRmLmhwYXJhbXMudXRpbHM7Yi5pc051bGxPclVuZGVmaW5lZCh0aGlzLmJhY2tlbmQpfHxiLmlzTnVsbE9yVW5kZWZpbmVkKHRoaXMuZXhwZXJpbWVudE5hbWUpfHx0aGlzLmJhY2tlbmQuZ2V0RXhwZXJpbWVudCh7ZXhwZXJpbWVudE5hbWU6dGhpcy5leHBlcmltZW50TmFtZX0pLnRoZW4oZD0+e18uaXNFcXVhbChkLHRoaXMuX2V4cGVyaW1lbnQpfHwodGhpcy5zZXQoIl9leHBlcmltZW50IixkKSx0aGlzLl9jb21wdXRlSFBhcmFtcygpLHRoaXMuX2NvbXB1dGVNZXRyaWNzKCksdGhpcy5fcXVlcnlTZXJ2ZXIoKSx0aGlzLl9yZXNvbHZlR2V0RXhwZXJpbWVudCgpKX0pfSxfY29tcHV0ZUhQYXJhbXMoKXtjb25zdCBiPVtdO3RoaXMuX2V4cGVyaW1lbnQuaHBhcmFtSW5mb3MuZm9yRWFjaCgoZCxmKT0+e2NvbnN0IGg9e2luZm86ZCxkaXNwbGF5ZWQ6NT5mLGZpbHRlcjp7fX07aC5pbmZvLmhhc093blByb3BlcnR5KCJkb21haW5EaXNjcmV0ZSIpPwooaC5maWx0ZXIuZG9tYWluRGlzY3JldGU9W10saC5pbmZvLmRvbWFpbkRpc2NyZXRlLmZvckVhY2goaz0+e2guZmlsdGVyLmRvbWFpbkRpc2NyZXRlLnB1c2goe3ZhbHVlOmssY2hlY2tlZDohMH0pfSkpOiJEQVRBX1RZUEVfQk9PTCI9PT1oLmluZm8udHlwZT9oLmZpbHRlci5kb21haW5EaXNjcmV0ZT1be3ZhbHVlOiExLGNoZWNrZWQ6ITB9LHt2YWx1ZTohMCxjaGVja2VkOiEwfV06IkRBVEFfVFlQRV9GTE9BVDY0Ij09PWguaW5mby50eXBlP2guZmlsdGVyLmludGVydmFsPXttaW46e3ZhbHVlOiIiLGludmFsaWQ6ITF9LG1heDp7dmFsdWU6IiIsaW52YWxpZDohMX19OiJEQVRBX1RZUEVfU1RSSU5HIj09PWguaW5mby50eXBlP2guZmlsdGVyLnJlZ2V4cD0iIjpjb25zb2xlLndhcm4oInVua25vd24gaHBhcmFtLmluZm8udHlwZTogJXMiLGguaW5mby50eXBlKTtiLnB1c2goaCl9KTt0aGlzLnNldCgiX2hwYXJhbXMiLGIpfSxfY29tcHV0ZU1ldHJpY3MoKXtjb25zdCBiPVtdO3RoaXMuX2V4cGVyaW1lbnQubWV0cmljSW5mb3MuZm9yRWFjaCgoZCwKZik9PntiLnB1c2goe2luZm86ZCxmaWx0ZXI6e2ludGVydmFsOnttaW46e3ZhbHVlOiIiLGludmFsaWQ6ITF9LG1heDp7dmFsdWU6IiIsaW52YWxpZDohMX19fSxkaXNwbGF5ZWQ6NT5mfSl9KTt0aGlzLnNldCgiX21ldHJpY3MiLGIpfSxfY29tcHV0ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9ocGFyYW1zJiZ0aGlzLl9tZXRyaWNzP3tocGFyYW1Db2x1bW5zOnRoaXMuX2hwYXJhbXMubWFwKGI9Pih7aHBhcmFtSW5mbzpiLmluZm99KSksbWV0cmljQ29sdW1uczp0aGlzLl9tZXRyaWNzLm1hcChiPT4oe21ldHJpY0luZm86Yi5pbmZvfSkpfTp7aHBhcmFtQ29sdW1uczpbXSxtZXRyaWNDb2x1bW5zOltdfX0sX3VwZGF0ZUNvbmZpZ3VyYXRpb24oKXt0aGlzLmRlYm91bmNlKCJfdXBkYXRlQ29uZmlndXJhdGlvbiIsKCk9Pnt0aGlzLl9zZXRDb25maWd1cmF0aW9uKHtzY2hlbWE6dGhpcy5fY29tcHV0ZVNjaGVtYSgpLGNvbHVtbnNWaXNpYmlsaXR5OnRoaXMuX2NvbXB1dGVDb2x1bW5zVmlzaWJpbGl0eSgpLAp2aXNpYmxlU2NoZW1hOnRoaXMuX2NvbXB1dGVWaXNpYmxlU2NoZW1hKCl9KX0pfSxfY29tcHV0ZUNvbHVtbnNWaXNpYmlsaXR5KCl7cmV0dXJuIHRoaXMuX2hwYXJhbXMmJnRoaXMuX21ldHJpY3M/dGhpcy5faHBhcmFtcy5tYXAoYj0+Yi5kaXNwbGF5ZWQpLmNvbmNhdCh0aGlzLl9tZXRyaWNzLm1hcChiPT5iLmRpc3BsYXllZCkpOltdfSxfY29tcHV0ZVZpc2libGVTY2hlbWEoKXtpZighdGhpcy5faHBhcmFtc3x8IXRoaXMuX21ldHJpY3MpcmV0dXJue2hwYXJhbUluZm9zOltdLG1ldHJpY0luZm9zOltdfTtjb25zdCBiPXRoaXMuX2hwYXJhbXMuZmlsdGVyKGY9PmYuZGlzcGxheWVkKS5tYXAoZj0+Zi5pbmZvKSxkPXRoaXMuX21ldHJpY3MuZmlsdGVyKGY9PmYuZGlzcGxheWVkKS5tYXAoZj0+Zi5pbmZvKTtyZXR1cm57aHBhcmFtSW5mb3M6YixtZXRyaWNJbmZvczpkfX0sX3F1ZXJ5U2VydmVyKCl7dGhpcy5kZWJvdW5jZSgicXVlcnlTZXJ2ZXIiLCgpPT50aGlzLl9xdWVyeVNlcnZlck5vRGVib3VuY2UoKSwKMTAwKX0sX3F1ZXJ5U2VydmVyTm9EZWJvdW5jZSgpe3JldHVybiB0aGlzLl9zZW5kTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCkudGhlbih0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlci5jYW5jZWxsYWJsZSgoe3ZhbHVlOmIsY2FuY2VsbGVkOmR9KT0+e2R8fCgwPD1iLnRvdGFsU2l6ZT8odGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLFN0cmluZyhNYXRoLmNlaWwoYi50b3RhbFNpemUvK3RoaXMuX3BhZ2VTaXplSW5wdXQudmFsdWUpKSksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsYi50b3RhbFNpemUpKToodGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLCI/IiksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsIlVua25vd24iKSksdGYuaHBhcmFtcy51dGlscy5zZXRBcnJheU9ic2VydmFibHkodGhpcyxiLnNlc3Npb25Hcm91cHMpKX0pKX0sX3NlbmRMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QoKXtjb25zdCBiPXRoaXMuX2J1aWxkTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCk7CmlmKG51bGwhPT1iKXJldHVybiB0aGlzLnNldCgiX3Nlc3Npb25Hcm91cHNSZXF1ZXN0IixiKSx0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlci5jYW5jZWxBbGwoKSx0aGlzLmJhY2tlbmQubGlzdFNlc3Npb25Hcm91cHMoYil9LF9idWlsZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpe2Z1bmN0aW9uIGIobSl7dmFyIG49Zi5nZXQobSsiLm1pbi52YWx1ZSIpO2NvbnNvbGUuYXNzZXJ0KHZvaWQgMCE9PW4pO249IiI9PT1uPyItSW5maW5pdHkiOituO2Yuc2V0KG0rIi5taW4uaW52YWxpZCIsaXNOYU4obikpO2g9aCYmIWlzTmFOKG4pO3ZhciBxPWYuZ2V0KG0rIi5tYXgudmFsdWUiKTtjb25zb2xlLmFzc2VydCh2b2lkIDAhPT1xKTtxPSIiPT09cT8iSW5maW5pdHkiOitxO2Yuc2V0KG0rIi5tYXguaW52YWxpZCIsaXNOYU4ocSkpO2g9aCYmIWlzTmFOKHEpO3JldHVybiBpc05hTihuKXx8aXNOYU4ocSk/bnVsbDp7bWluVmFsdWU6bixtYXhWYWx1ZTpxfX1mdW5jdGlvbiBkKG0pe3ZhciBuPQpmLmdldChtKyIudmFsdWUiKTtjb25zb2xlLmFzc2VydCh2b2lkIDAhPT1uKTtuPStuO2NvbnN0IHE9TnVtYmVyLmlzSW50ZWdlcihuKSYmMDxuO2Yuc2V0KG0rIi5pbnZhbGlkIiwhcSk7aD1oJiZxO3JldHVybiBxP246bnVsbH1jb25zdCBmPXRoaXM7bGV0IGg9ITA7Y29uc3Qgaz10aGlzLl9zdGF0dXNlcy5maWx0ZXIobT0+bS5hbGxvd2VkKS5tYXAobT0+bS52YWx1ZSk7bGV0IHQ9W107dGhpcy5faHBhcmFtcy5mb3JFYWNoKChtLG4pPT57bGV0IHE9e2hwYXJhbTptLmluZm8ubmFtZX07aWYobS5maWx0ZXIuZG9tYWluRGlzY3JldGUpcS5maWx0ZXJEaXNjcmV0ZT1bXSxtLmZpbHRlci5kb21haW5EaXNjcmV0ZS5mb3JFYWNoKHU9Pnt1LmNoZWNrZWQmJnEuZmlsdGVyRGlzY3JldGUucHVzaCh1LnZhbHVlKX0pO2Vsc2UgaWYobS5maWx0ZXIuaW50ZXJ2YWwpcS5maWx0ZXJJbnRlcnZhbD1iKCJfaHBhcmFtcy4iK24rIi5maWx0ZXIuaW50ZXJ2YWwiKTtlbHNlIGlmKG0uZmlsdGVyLnJlZ2V4cClxLmZpbHRlclJlZ2V4cD0KbS5maWx0ZXIucmVnZXhwO2Vsc2UgcmV0dXJuIGNvbnNvbGUuZXJyb3IoImhwYXJhbS5maWx0ZXIgd2l0aCBubyBkb21haW5EaXNjcmV0ZSwgaW50ZXJ2YWwgb3IgcmVnZXhwIHByb3BlcnRpZXMgc2V0OiAlcyIsbSksbnVsbDt0LnB1c2gocSl9KTt0aGlzLl9tZXRyaWNzLmZvckVhY2goKG0sbik9PnttPXttZXRyaWM6bS5pbmZvLm5hbWUsZmlsdGVySW50ZXJ2YWw6YigiX21ldHJpY3MuIituKyIuZmlsdGVyLmludGVydmFsIil9O3QucHVzaChtKX0pO2lmKHZvaWQgMCE9PXRoaXMuX3NvcnRCeUluZGV4JiZ2b2lkIDAhPT10aGlzLl9zb3J0RGlyZWN0aW9uKXtpZighKHRoaXMuX3NvcnRCeUluZGV4IGluIHQpKXJldHVybiBjb25zb2xlLmVycm9yKCJObyBjb2x1bW4gaW4gY29sUGFyYW1zIHdpdGggaW5kZXggc29ydEJ5SW5kZXg6ICVzIix0aGlzLl9zb3J0QnlJbmRleCksbnVsbDt0W3RoaXMuX3NvcnRCeUluZGV4XS5vcmRlcj0wPT09dGhpcy5fc29ydERpcmVjdGlvbj8iT1JERVJfQVNDIjoKIk9SREVSX0RFU0MifWNvbnN0IGw9ZCgiX3BhZ2VOdW1iZXJJbnB1dCIpLHA9ZCgiX3BhZ2VTaXplSW5wdXQiKTtyZXR1cm4gaD97ZXhwZXJpbWVudE5hbWU6dGhpcy5leHBlcmltZW50TmFtZSxhbGxvd2VkU3RhdHVzZXM6ayxjb2xQYXJhbXM6dCxzdGFydEluZGV4OnAqKGwtMSksc2xpY2VTaXplOnB9Om51bGx9LF9tZXRyaWNTb3J0QnlJbmRleChiKXtyZXR1cm4gYit0aGlzLl9ocGFyYW1zLmxlbmd0aH0sX2hwYXJhbU5hbWU6dGYuaHBhcmFtcy51dGlscy5ocGFyYW1OYW1lLF9tZXRyaWNOYW1lOnRmLmhwYXJhbXMudXRpbHMubWV0cmljTmFtZSxfcHJldHR5UHJpbnQ6dGYuaHBhcmFtcy51dGlscy5wcmV0dHlQcmludH0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL2lyb24tcGFnZXMvaXJvbi1wYWdlcy5odG1sLmpzClBvbHltZXIoe2lzOiJpcm9uLXBhZ2VzIixiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yLFBvbHltZXIuSXJvblNlbGVjdGFibGVCZWhhdmlvcl0scHJvcGVydGllczp7YWN0aXZhdGVFdmVudDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZWxlY3RlZFBhZ2VDaGFuZ2VkKHNlbGVjdGVkKSJdLF9zZWxlY3RlZFBhZ2VDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5hc3luYyh0aGlzLm5vdGlmeVJlc2l6ZSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vcGFwZXItaGVhZGVyLXBhbmVsL3BhcGVyLWhlYWRlci1wYW5lbC5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtzY3JvbGw6ITB9LGQ9e3N0YW5kYXJkOjIsd2F0ZXJmYWxsOjEsIndhdGVyZmFsbC10YWxsIjoxfSxmPXsid2F0ZXJmYWxsLXRhbGwiOiEwfTtQb2x5bWVyKHtpczoicGFwZXItaGVhZGVyLXBhbmVsIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToic3RhbmRhcmQiLG9ic2VydmVyOiJfbW9kZUNoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sc2hhZG93Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHRhbGxDbGFzczp7dHlwZTpTdHJpbmcsdmFsdWU6InRhbGwifSxhdFRvcDp7dHlwZTpCb29sZWFuLHZhbHVlOiEwLG5vdGlmeTohMCxyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxvYnNlcnZlcnM6WyJfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW4oYXRUb3AsIG1vZGUsIHNoYWRvdykiXSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2FkZExpc3RlbmVyKCk7dGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVtb3ZlTGlzdGVuZXIoKX0sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxIYW5kbGVyPXRoaXMuX3Njcm9sbC5iaW5kKHRoaXMpO2NvbnNvbGUud2Fybih0aGlzLmlzLCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEiKX0sZ2V0IGhlYWRlcigpe3JldHVybiBQb2x5bWVyLmRvbSh0aGlzLiQuaGVhZGVyU2xvdCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpWzBdfSxnZXQgc2Nyb2xsZXIoKXtyZXR1cm4gdGhpcy5fZ2V0U2Nyb2xsZXJGb3JNb2RlKHRoaXMubW9kZSl9LGdldCB2aXNpYmxlU2hhZG93KCl7cmV0dXJuIHRoaXMuJC5kcm9wU2hhZG93LmNsYXNzTGlzdC5jb250YWlucygiaGFzLXNoYWRvdyIpfSxfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW46ZnVuY3Rpb24oaCxrKXtrPWRba107dGhpcy5zaGFkb3c/dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsITAsdGhpcy4kLmRyb3BTaGFkb3cpOjI9PT1rP3RoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KToKMSE9PWt8fGg/dGhpcy50b2dnbGVDbGFzcygiaGFzLXNoYWRvdyIsITEsdGhpcy4kLmRyb3BTaGFkb3cpOnRoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEwLHRoaXMuJC5kcm9wU2hhZG93KX0sX2NvbXB1dGVNYWluQ29udGFpbmVyQ2xhc3M6ZnVuY3Rpb24oaCl7dmFyIGs9e307ay5mbGV4PSJjb3ZlciIhPT1oO3JldHVybiBPYmplY3Qua2V5cyhrKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIGtbdF19KS5qb2luKCIgIil9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLnNjcm9sbEhhbmRsZXIpfSxfcmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5zY3JvbGxIYW5kbGVyKX0sX21vZGVDaGFuZ2VkOmZ1bmN0aW9uKGgsayl7dmFyIHQ9dGhpcy5oZWFkZXI7dCYmKGZba10mJiFmW2hdPyh0LmNsYXNzTGlzdC5yZW1vdmUodGhpcy50YWxsQ2xhc3MpLAp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dC5jbGFzc0xpc3QucmVtb3ZlKCJhbmltYXRlIil9LDIwMCkpOnRoaXMudG9nZ2xlQ2xhc3MoImFuaW1hdGUiLGZbaF0sdCkpO3RoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpfSxfa2VlcFNjcm9sbGluZ1N0YXRlOmZ1bmN0aW9uKCl7dmFyIGg9dGhpcy5zY3JvbGxlcixrPXRoaXMuaGVhZGVyO3RoaXMuX3NldEF0VG9wKDA9PT1oLnNjcm9sbFRvcCk7ayYmdGhpcy50YWxsQ2xhc3MmJmZbdGhpcy5tb2RlXSYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnRhbGxDbGFzcyx0aGlzLmF0VG9wfHxrLmNsYXNzTGlzdC5jb250YWlucyh0aGlzLnRhbGxDbGFzcykmJmguc2Nyb2xsSGVpZ2h0PHRoaXMub2Zmc2V0SGVpZ2h0LGspfSxfc2Nyb2xsOmZ1bmN0aW9uKCl7dGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCk7dGhpcy5maXJlKCJjb250ZW50LXNjcm9sbCIse3RhcmdldDp0aGlzLnNjcm9sbGVyfSx7YnViYmxlczohMX0pfSxfZ2V0U2Nyb2xsZXJGb3JNb2RlOmZ1bmN0aW9uKGgpe3JldHVybiBiW2hdPwp0aGlzOnRoaXMuJC5tYWluQ29udGFpbmVyfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10YWJzL3BhcGVyLXRhYi5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10YWIiLGJlaGF2aW9yczpbUG9seW1lci5Jcm9uQ29udHJvbFN0YXRlLFBvbHltZXIuSXJvbkJ1dHRvblN0YXRlLFBvbHltZXIuUGFwZXJSaXBwbGVCZWhhdmlvcl0scHJvcGVydGllczp7bGluazp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJ0YWIifSxsaXN0ZW5lcnM6e2Rvd246Il91cGRhdGVOb2luayIsdGFwOiJfb25UYXAifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZU5vaW5rKCl9LGdldCBfcGFyZW50Tm9pbmsoKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO3JldHVybiEhYiYmISFiLm5vaW5rfSxfdXBkYXRlTm9pbms6ZnVuY3Rpb24oKXt0aGlzLm5vaW5rPSEhdGhpcy5ub2lua3x8ISF0aGlzLl9wYXJlbnROb2lua30sX29uVGFwOmZ1bmN0aW9uKGIpe2lmKHRoaXMubGluayl7dmFyIGQ9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCJhIik7CmQmJmIudGFyZ2V0IT09ZCYmZC5jbGljaygpfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly9wYXBlci10YWJzL3BhcGVyLXRhYnMuaHRtbC5qcwpQb2x5bWVyKHtpczoicGFwZXItdGFicyIsYmVoYXZpb3JzOltQb2x5bWVyLklyb25SZXNpemFibGVCZWhhdmlvcixQb2x5bWVyLklyb25NZW51YmFyQmVoYXZpb3JdLHByb3BlcnRpZXM6e25vaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ub2lua0NoYW5nZWQifSxub0Jhcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub1NsaWRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbGFibGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZml0Q29udGFpbmVyOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGRpc2FibGVEcmFnOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGhpZGVTY3JvbGxCdXR0b25zOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsaWduQm90dG9tOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGFibGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwYXBlci10YWIifSxhdXRvc2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9zZWxlY3REZWxheTp7dHlwZTpOdW1iZXIsCnZhbHVlOjB9LF9zdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxMH0sX2hvbGREZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sX2xlZnRIaWRkZW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3JpZ2h0SGlkZGVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9wcmV2aW91c1RhYjp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToidGFibGlzdCJ9LGxpc3RlbmVyczp7Imlyb24tcmVzaXplIjoiX29uVGFiU2l6aW5nQ2hhbmdlZCIsImlyb24taXRlbXMtY2hhbmdlZCI6Il9vblRhYlNpemluZ0NoYW5nZWQiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QiLCJpcm9uLWRlc2VsZWN0IjoiX29uSXJvbkRlc2VsZWN0In0sa2V5QmluZGluZ3M6eyJsZWZ0OmtleXVwIHJpZ2h0OmtleXVwIjoiX29uQXJyb3dLZXl1cCJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9ob2xkSm9iPW51bGw7dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT0Kdm9pZCAwO3RoaXMuX2JpbmREZWxheWVkQWN0aXZhdGlvbkhhbmRsZXI9dGhpcy5fZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLmJpbmQodGhpcyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9vbkJsdXJDYXB0dXJlLmJpbmQodGhpcyksITApfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2V0U2Nyb2xsRGlyZWN0aW9uKCJ5Iix0aGlzLiQudGFic0NvbnRhaW5lcil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fY2FuY2VsUGVuZGluZ0FjdGl2YXRpb24oKX0sX25vaW5rQ2hhbmdlZDpmdW5jdGlvbihiKXtQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJwYXBlci10YWIiKS5mb3JFYWNoKGI/dGhpcy5fc2V0Tm9pbmtBdHRyaWJ1dGU6dGhpcy5fcmVtb3ZlTm9pbmtBdHRyaWJ1dGUpfSxfc2V0Tm9pbmtBdHRyaWJ1dGU6ZnVuY3Rpb24oYil7Yi5zZXRBdHRyaWJ1dGUoIm5vaW5rIiwiIil9LF9yZW1vdmVOb2lua0F0dHJpYnV0ZTpmdW5jdGlvbihiKXtiLnJlbW92ZUF0dHJpYnV0ZSgibm9pbmsiKX0sCl9jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3M6ZnVuY3Rpb24oYixkLGYpe3JldHVybiFkfHxmPyJoaWRkZW4iOmI/Im5vdC12aXNpYmxlIjoiIn0sX2NvbXB1dGVUYWJzQ29udGVudENsYXNzOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIGI/InNjcm9sbGFibGUiKyhkPyIgZml0LWNvbnRhaW5lciI6IiIpOiIgZml0LWNvbnRhaW5lciJ9LF9jb21wdXRlU2VsZWN0aW9uQmFyQ2xhc3M6ZnVuY3Rpb24oYixkKXtyZXR1cm4gYj8iaGlkZGVuIjpkPyJhbGlnbi1ib3R0b20iOiIifSxfb25UYWJTaXppbmdDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiX29uVGFiU2l6aW5nQ2hhbmdlZCIsZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGwoKTt0aGlzLl90YWJDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRJdGVtKX0sMTApfSxfb25Jcm9uU2VsZWN0OmZ1bmN0aW9uKGIpe3RoaXMuX3RhYkNoYW5nZWQoYi5kZXRhaWwuaXRlbSx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9Yi5kZXRhaWwuaXRlbTsKdGhpcy5jYW5jZWxEZWJvdW5jZXIoInRhYi1jaGFuZ2VkIil9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbigpe3RoaXMuZGVib3VuY2UoInRhYi1jaGFuZ2VkIixmdW5jdGlvbigpe3RoaXMuX3RhYkNoYW5nZWQobnVsbCx0aGlzLl9wcmV2aW91c1RhYik7dGhpcy5fcHJldmlvdXNUYWI9bnVsbH0sMSl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpO1BvbHltZXIuSXJvbk1lbnVCZWhhdmlvckltcGwuX2FjdGl2YXRlSGFuZGxlci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9zY2hlZHVsZUFjdGl2YXRpb246ZnVuY3Rpb24oYixkKXt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW09Yjt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5hc3luYyh0aGlzLl9iaW5kRGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLGQpfSxfZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyOmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtOwp0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtPXZvaWQgMDtiLmZpcmUodGhpcy5hY3RpdmF0ZUV2ZW50LG51bGwse2J1YmJsZXM6ITAsY2FuY2VsYWJsZTohMH0pfSxfY2FuY2VsUGVuZGluZ0FjdGl2YXRpb246ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dCksdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT12b2lkIDApfSxfb25BcnJvd0tleXVwOmZ1bmN0aW9uKCl7dGhpcy5hdXRvc2VsZWN0JiZ0aGlzLl9zY2hlZHVsZUFjdGl2YXRpb24odGhpcy5mb2N1c2VkSXRlbSx0aGlzLmF1dG9zZWxlY3REZWxheSl9LF9vbkJsdXJDYXB0dXJlOmZ1bmN0aW9uKGIpe2IudGFyZ2V0PT09dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtJiZ0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpfSwKZ2V0IF90YWJDb250YWluZXJTY3JvbGxTaXplKCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsV2lkdGgtdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgpfSxfc2Nyb2xsOmZ1bmN0aW9uKGIsZCl7dGhpcy5zY3JvbGxhYmxlJiZ0aGlzLl9hZmZlY3RTY3JvbGwoZCYmLWQuZGR4fHwwKX0sX2Rvd246ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKX0sMSl9LF9hZmZlY3RTY3JvbGw6ZnVuY3Rpb24oYil7dGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9YjtiPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7dGhpcy5fbGVmdEhpZGRlbj0wPT09Yjt0aGlzLl9yaWdodEhpZGRlbj1iPT09dGhpcy5fdGFiQ29udGFpbmVyU2Nyb2xsU2l6ZX0sCl9vbkxlZnRTY3JvbGxCdXR0b25Eb3duOmZ1bmN0aW9uKCl7dGhpcy5fc2Nyb2xsVG9MZWZ0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb0xlZnQuYmluZCh0aGlzKSx0aGlzLl9ob2xkRGVsYXkpfSxfb25SaWdodFNjcm9sbEJ1dHRvbkRvd246ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGxUb1JpZ2h0KCk7dGhpcy5faG9sZEpvYj1zZXRJbnRlcnZhbCh0aGlzLl9zY3JvbGxUb1JpZ2h0LmJpbmQodGhpcyksdGhpcy5faG9sZERlbGF5KX0sX29uU2Nyb2xsQnV0dG9uVXA6ZnVuY3Rpb24oKXtjbGVhckludGVydmFsKHRoaXMuX2hvbGRKb2IpO3RoaXMuX2hvbGRKb2I9bnVsbH0sX3Njcm9sbFRvTGVmdDpmdW5jdGlvbigpe3RoaXMuX2FmZmVjdFNjcm9sbCgtdGhpcy5fc3RlcCl9LF9zY3JvbGxUb1JpZ2h0OmZ1bmN0aW9uKCl7dGhpcy5fYWZmZWN0U2Nyb2xsKHRoaXMuX3N0ZXApfSxfdGFiQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2lmKGIpe3ZhciBmPXRoaXMuJC50YWJzQ29udGVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwKaD1mLndpZHRoLGs9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtmPWsubGVmdC1mLmxlZnQ7dGhpcy5fcG9zPXt3aWR0aDp0aGlzLl9jYWxjUGVyY2VudChrLndpZHRoLGgpLGxlZnQ6dGhpcy5fY2FsY1BlcmNlbnQoZixoKX07aWYodGhpcy5ub1NsaWRlfHxudWxsPT1kKXRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgiZXhwYW5kIiksdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCk7ZWxzZXt2YXIgdD1kLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Q9dGhpcy5pdGVtcy5pbmRleE9mKGQpO2I9dGhpcy5pdGVtcy5pbmRleE9mKGIpO3RoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LmFkZCgiZXhwYW5kIik7Yj1kPGI7dGhpcy5faXNSVEwmJihiPSFiKTtiP3RoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX2NhbGNQZXJjZW50KGsubGVmdCtrLndpZHRoLQp0LmxlZnQsaCktNSx0aGlzLl9sZWZ0KTp0aGlzLl9wb3NpdGlvbkJhcih0aGlzLl9jYWxjUGVyY2VudCh0LmxlZnQrdC53aWR0aC1rLmxlZnQsaCktNSx0aGlzLl9jYWxjUGVyY2VudChmLGgpKzUpO3RoaXMuc2Nyb2xsYWJsZSYmdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZElmTmVlZGVkKGsud2lkdGgsZil9fWVsc2UgdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJleHBhbmQiKSx0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5yZW1vdmUoImNvbnRyYWN0IiksdGhpcy5fcG9zaXRpb25CYXIoMCwwKX0sX3Njcm9sbFRvU2VsZWN0ZWRJZk5lZWRlZDpmdW5jdGlvbihiLGQpe2QtPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7MD5kP3RoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQrPWQ6KGQrPWItdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgsMDxkJiYodGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCs9ZCkpfSxfY2FsY1BlcmNlbnQ6ZnVuY3Rpb24oYiwKZCl7cmV0dXJuIDEwMCpiL2R9LF9wb3NpdGlvbkJhcjpmdW5jdGlvbihiLGQpe2I9Ynx8MDtkPWR8fDA7dGhpcy5fd2lkdGg9Yjt0aGlzLl9sZWZ0PWQ7dGhpcy50cmFuc2Zvcm0oInRyYW5zbGF0ZVgoIitkKyIlKSBzY2FsZVgoIitiLzEwMCsiKSIsdGhpcy4kLnNlbGVjdGlvbkJhcil9LF9vbkJhclRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdDtiLmNvbnRhaW5zKCJleHBhbmQiKT8oYi5yZW1vdmUoImV4cGFuZCIpLGIuYWRkKCJjb250cmFjdCIpLHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCkpOmIuY29udGFpbnMoImNvbnRyYWN0IikmJmIucmVtb3ZlKCJjb250cmFjdCIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3BhcGVyLXRvb2xiYXIvcGFwZXItdG9vbGJhci5odG1sLmpzClBvbHltZXIoe2lzOiJwYXBlci10b29sYmFyIixob3N0QXR0cmlidXRlczp7cm9sZToidG9vbGJhciJ9LHByb3BlcnRpZXM6e2JvdHRvbUp1c3RpZnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxqdXN0aWZ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sbWlkZGxlSnVzdGlmeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxyZWFkeTpmdW5jdGlvbigpe2NvbnNvbGUud2Fybih0aGlzLmlzLCJpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEiKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9vYnNlcnZlcj10aGlzLl9vYnNlcnZlKHRoaXMpO3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXImJnRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKX0sX29ic2VydmU6ZnVuY3Rpb24oYil7dmFyIGQ9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVBcmlhTGFiZWxsZWRCeSgpfS5iaW5kKHRoaXMpKTsKZC5vYnNlcnZlKGIse2NoaWxkTGlzdDohMCxzdWJ0cmVlOiEwfSk7cmV0dXJuIGR9LF91cGRhdGVBcmlhTGFiZWxsZWRCeTpmdW5jdGlvbigpe1BvbHltZXIuZG9tLmZsdXNoKCk7Zm9yKHZhciBiPVtdLGQ9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoUG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJzbG90IikpLmNvbmNhdChBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoImNvbnRlbnQiKSkpLGYsaD0wO2Y9ZFtoXTtoKyspe2Y9UG9seW1lci5kb20oZikuZ2V0RGlzdHJpYnV0ZWROb2RlcygpO2Zvcih2YXIgayx0PTA7az1mW3RdO3QrKylpZihrLmNsYXNzTGlzdCYmay5jbGFzc0xpc3QuY29udGFpbnMoInRpdGxlIikpaWYoay5pZCliLnB1c2goay5pZCk7ZWxzZXt2YXIgbD0icGFwZXItdG9vbGJhci1sYWJlbC0iK01hdGguZmxvb3IoMUU0Kk1hdGgucmFuZG9tKCkpO2suaWQ9bDtiLnB1c2gobCl9fTA8CmIubGVuZ3RoJiZ0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixiLmpvaW4oIiAiKSl9LF9jb21wdXRlQmFyRXh0cmFDbGFzc2VzOmZ1bmN0aW9uKGIpe3JldHVybiBiP2IrKCJqdXN0aWZpZWQiPT09Yj8iIjoiLWp1c3RpZmllZCIpOiIifX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzL3RmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIixwcm9wZXJ0aWVzOntjb25maWd1cmF0aW9uOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5LG9wdGlvbnM6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpudWxsfX0sb2JzZXJ2ZXJzOlsiX2NvbmZpZ3VyYXRpb25DaGFuZ2VkKGNvbmZpZ3VyYXRpb24uKikiLCJfdW5zZWxlY3REaXNhYmxlZExvZ1NjYWxlcyhzZXNzaW9uR3JvdXBzLiopIl0sX2NvbmZpZ3VyYXRpb25DaGFuZ2VkKCl7Y29uc3QgYj10aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYSxkPXRoaXMuY29uZmlndXJhdGlvbi5zY2hlbWEsZj17Y29sdW1uczpiLmhwYXJhbUluZm9zLm1hcCgoaCxrKT0+KHtuYW1lOnRmLmhwYXJhbXMudXRpbHMuaHBhcmFtTmFtZShoKSxpbmRleDprLGFic29sdXRlSW5kZXg6dGYuaHBhcmFtcy51dGlscy5nZXRBYnNvbHV0ZUNvbHVtbkluZGV4KGQsYixrKSxzY2FsZTp0aGlzLl9pc051bWVyaWNDb2x1bW4oayk/CiJMSU5FQVIiOiJOT05fTlVNRVJJQyJ9KSkuY29uY2F0KGIubWV0cmljSW5mb3MubWFwKChoLGspPT57ays9Yi5ocGFyYW1JbmZvcy5sZW5ndGg7cmV0dXJue3NjYWxlOiJMSU5FQVIiLG5hbWU6dGYuaHBhcmFtcy51dGlscy5tZXRyaWNOYW1lKGgpLGluZGV4OmssYWJzb2x1dGVJbmRleDp0Zi5ocGFyYW1zLnV0aWxzLmdldEFic29sdXRlQ29sdW1uSW5kZXgoZCxiLGspfX0pKSxtaW5Db2xvcjoiIzAwMDBGRiIsbWF4Q29sb3I6IiNGRjAwMDAiLGNvbmZpZ3VyYXRpb246dGhpcy5jb25maWd1cmF0aW9ufTt0aGlzLnNldCgib3B0aW9ucyIsZik7UG9seW1lci5kb20uZmx1c2goKTt0aGlzLnNldCgib3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgiLHRoaXMuX2RlZmF1bHRDb2xvckJ5Q29sdW1uSW5kZXgoKSl9LF91bnNlbGVjdERpc2FibGVkTG9nU2NhbGVzKCl7bnVsbCE9PXRoaXMub3B0aW9ucyYmdGhpcy5vcHRpb25zLmNvbHVtbnMuZm9yRWFjaChiPT57Y29uc3QgZD0ib3B0aW9ucy5jb2x1bW5zLiIrCmIuaW5kZXg7dGhpcy5fYWxsb3dMb2dTY2FsZShiKXx8IkxPRyIhPT1iLnNjYWxlfHx0aGlzLnNldChkKyIuc2NhbGUiLCJMSU5FQVIiKX0pfSxfYWxsb3dMb2dTY2FsZShiKXtpZighdGhpcy5faXNOdW1lcmljQ29sdW1uKGIuaW5kZXgpfHwhdGhpcy5zZXNzaW9uR3JvdXBzKXJldHVybiExO2NvbnN0IFtkLGZdPXRmLmhwYXJhbXMudXRpbHMudmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQodGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLGIuaW5kZXgpO3JldHVybiAwPGR8fDA+Zn0sX2lzTnVtZXJpY0NvbHVtbihiKXtyZXR1cm4gYj49dGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3MubGVuZ3RofHwiREFUQV9UWVBFX0ZMT0FUNjQiPT09dGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3NbYl0udHlwZX0sX2RlZmF1bHRDb2xvckJ5Q29sdW1uSW5kZXgoKXtpZigwPHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aClyZXR1cm4gdGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3MubGVuZ3RoOwpjb25zdCBiPXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmZpbmRJbmRleChkPT4iREFUQV9UWVBFX0ZMT0FUNjQiPT09ZC50eXBlKTtpZigtMSE9PWIpcmV0dXJuIGJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtYWN0aXZlLWl0ZW0tYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuQWN0aXZlSXRlbUJlaGF2aW9yPXtwcm9wZXJ0aWVzOnthY3RpdmVJdGVtOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6bnVsbH19LGxpc3RlbmVyczp7ImNlbGwtYWN0aXZhdGUiOiJfYWN0aXZhdGVJdGVtIn0sb2JzZXJ2ZXJzOlsiX2FjdGl2ZUl0ZW1DaGFuZ2VkKGFjdGl2ZUl0ZW0pIl0sX2FjdGl2YXRlSXRlbTpmdW5jdGlvbihiKXt2YXIgZD1iLmRldGFpbC5tb2RlbC5pdGVtO3RoaXMuYWN0aXZlSXRlbT10aGlzLmFjdGl2ZUl0ZW0hPT1kP2Q6bnVsbDtiLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfSxfYWN0aXZlSXRlbUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMmJnRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe3RoaXMuX3VwZGF0ZUl0ZW0oYixiLml0ZW0pfS5iaW5kKHRoaXMpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLXNjcm9sbC1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9ySW1wbD17cHJvcGVydGllczp7X3ZpZHhPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGlvczp7dHlwZTpCb29sZWFuLHZhbHVlOm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86aG9uZXxhZDsoPzogVTspPyBDUFUpIE9TIChcZCspLykscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxmaXhlZFNlY3Rpb25zOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLGNvbXB1dGVkOiJfaGFzRml4ZWRTZWN0aW9ucyhzY3JvbGxiYXJXaWR0aCkifSxfZnJvemVuQ2VsbHM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LHNjcm9sbGluZzp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxUYXJnZXQ9dGhpcy4kLnRhYmxlfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMubGlzdGVuKHRoaXMuc2Nyb2xsVGFyZ2V0LCJ3aGVlbCIsCiJfb25XaGVlbCIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5zY3JvbGxUYXJnZXQsIndoZWVsIiwiX29uV2hlZWwiKX0sc2Nyb2xsVG9TY2FsZWRJbmRleDpmdW5jdGlvbihiKXt0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleD1udWxsO3RoaXMuJC5pdGVtcy5zdHlsZS5ib3JkZXJUb3BXaWR0aHx8KHRoaXMuX3BlbmRpbmdTY3JvbGxUb1NjYWxlZEluZGV4PWIpO2I9TWF0aC5taW4oTWF0aC5tYXgoYiwwKSx0aGlzLnNpemUtMSk7dGhpcy4kLnRhYmxlLnNjcm9sbFRvcD1iL3RoaXMuc2l6ZSp0aGlzLiQudGFibGUuc2Nyb2xsSGVpZ2h0O3RoaXMuX3Njcm9sbEhhbmRsZXIoKTt0aGlzLnNjcm9sbFRvSW5kZXgoYi10aGlzLl92aWR4T2Zmc2V0KTt0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKHRoaXMuX3Njcm9sbFBvc2l0aW9uKTt0aGlzLl9zY3JvbGxIYW5kbGVyKCk7dGhpcy5fdmlkeE9mZnNldCt0aGlzLmxhc3RWaXNpYmxlSW5kZXg9PT10aGlzLnNpemUtCjEmJih0aGlzLiQudGFibGUuc2Nyb2xsVG9wPXRoaXMuJC50YWJsZS5zY3JvbGxIZWlnaHQtdGhpcy4kLnRhYmxlLm9mZnNldEhlaWdodCx0aGlzLl9zY3JvbGxIYW5kbGVyKCkpfSxfaGFzRml4ZWRTZWN0aW9uczpmdW5jdGlvbihiKXtyZXR1cm4gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRWRnZS8pJiYwPT09Yn0sX29uV2hlZWw6ZnVuY3Rpb24oYil7aWYoIWIuY3RybEtleSYmIXRoaXMuX2hhc1Njcm9sbGVkQW5jZXN0b3IoYi50YXJnZXQsYi5kZWx0YVgsYi5kZWx0YVkpKXt2YXIgZD10aGlzLiQudGFibGUsZj1iLmRlbHRhWTsxPT09Yi5kZWx0YU1vZGUmJihmKj1ncmlkLiQuc2Nyb2xsZXIuX3BoeXNpY2FsQXZlcmFnZSk7dmFyIGg9TWF0aC5hYnMoYi5kZWx0YVgpK01hdGguYWJzKGYpO3RoaXMuX2NhblNjcm9sbChkLGIuZGVsdGFYLGYpPyhiLnByZXZlbnREZWZhdWx0KCksZC5zY3JvbGxUb3ArPWYsZC5zY3JvbGxMZWZ0Kz1iLmRlbHRhWCx0aGlzLl9zY3JvbGxIYW5kbGVyKCksCnRoaXMuX2hhc1Jlc2lkdWFsTW9tZW50dW09ITAsdGhpcy5faWdub3JlTmV3V2hlZWw9dGhpcy5kZWJvdW5jZSgiaWdub3JlLW5ldy13aGVlbCIsZnVuY3Rpb24oKXt0aGlzLl9pZ25vcmVOZXdXaGVlbD1udWxsfSw1MDApKTp0aGlzLl9oYXNSZXNpZHVhbE1vbWVudHVtJiZoPD10aGlzLl9wcmV2aW91c01vbWVudHVtfHx0aGlzLl9pZ25vcmVOZXdXaGVlbD9iLnByZXZlbnREZWZhdWx0KCk6aD50aGlzLl9wcmV2aW91c01vbWVudHVtJiYodGhpcy5faGFzUmVzaWR1YWxNb21lbnR1bT0hMSk7dGhpcy5fcHJldmlvdXNNb21lbnR1bT1ofX0sX2hhc1Njcm9sbGVkQW5jZXN0b3I6ZnVuY3Rpb24oYixkLGYpe2lmKHRoaXMuX2NhblNjcm9sbChiLGQsZikpcmV0dXJuITA7aWYoInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCIhPT1iLmxvY2FsTmFtZSYmYiE9PXRoaXMmJmIucGFyZW50RWxlbWVudClyZXR1cm4gdGhpcy5faGFzU2Nyb2xsZWRBbmNlc3RvcihiLnBhcmVudEVsZW1lbnQsZCxmKX0sCl9jYW5TY3JvbGw6ZnVuY3Rpb24oYixkLGYpe3JldHVybiAwPGYmJmIuc2Nyb2xsVG9wPGIuc2Nyb2xsSGVpZ2h0LWIub2Zmc2V0SGVpZ2h0fHwwPmYmJjA8Yi5zY3JvbGxUb3B8fDA8ZCYmYi5zY3JvbGxMZWZ0PGIuc2Nyb2xsV2lkdGgtYi5vZmZzZXRXaWR0aHx8MD5kJiYwPGIuc2Nyb2xsTGVmdH0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgYj1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuX21heFNjcm9sbFRvcCx0aGlzLl9zY3JvbGxUb3ApKSxkPWItdGhpcy5fc2Nyb2xsUG9zaXRpb24sZj10aGlzLl9yYXRpbyxoPTAsaz10aGlzLl9oaWRkZW5Db250ZW50U2l6ZSx0PWYsbD1bXTt0aGlzLl9zY3JvbGxQb3NpdGlvbj1iO3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt2YXIgcD10aGlzLl9zY3JvbGxCb3R0b207dmFyIG09dGhpcy5fcGh5c2ljYWxCb3R0b207aWYoTWF0aC5hYnMoZCk+dGhpcy5fcGh5c2ljYWxTaXplKXRoaXMuX3BoeXNpY2FsVG9wKz0KZCxoPU1hdGgucm91bmQoZC90aGlzLl9waHlzaWNhbEF2ZXJhZ2UpO2Vsc2UgaWYoMD5kKXt2YXIgbj1iLXRoaXMuX3BoeXNpY2FsVG9wO2w9dGhpcy5fdmlydHVhbFN0YXJ0O3ZhciBxPVtdO3ZhciB1PXRoaXMuX3BoeXNpY2FsRW5kO2Zvcih0PW4vazt0PGYmJmg8dGhpcy5fcGh5c2ljYWxDb3VudCYmMDxsLWgmJm0tdGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHUpPnA7KW49dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHUpLHQrPW4vayxtLT1uLHEucHVzaCh1KSxoKyssdT0wPT09dT90aGlzLl9waHlzaWNhbENvdW50LTE6dS0xO2w9cTtoPS1ofWVsc2UgaWYoMDxkKXt2YXIgeD10aGlzLl92aXJ0dWFsRW5kLEE9dGhpcy5fdmlydHVhbENvdW50LTE7cT1bXTt1PXRoaXMuX3BoeXNpY2FsU3RhcnQ7Zm9yKHQ9KG0tcCkvazt0PGYmJmg8dGhpcy5fcGh5c2ljYWxDb3VudCYmeCtoPEEmJnRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudCh1KTwKYjspbj10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQodSksdCs9bi9rLHRoaXMuX3BoeXNpY2FsVG9wKz1uLHEucHVzaCh1KSxoKyssdT0odSsxKSV0aGlzLl9waHlzaWNhbENvdW50fXRoaXMuX3ZpcnR1YWxDb3VudDx0aGlzLnNpemUmJnRoaXMuX2FkanVzdFZpcnR1YWxJbmRleE9mZnNldChkKTswPT09aD8obTxwfHx0aGlzLl9waHlzaWNhbFRvcD5iKSYmdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoKToodGhpcy5fdmlydHVhbFN0YXJ0Kz1oLHRoaXMuX3BoeXNpY2FsU3RhcnQrPWgsdGhpcy5fdXBkYXRlKHEsbCkpO3RoaXMuX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50cygpO3RoaXMuaGFzQXR0cmlidXRlKCJyZW9yZGVyaW5nIil8fCh0aGlzLnNjcm9sbGluZz0hMCk7dGhpcy5kZWJvdW5jZSgidmFhZGluLWdyaWQtc2Nyb2xsaW5nIixmdW5jdGlvbigpe3RoaXMuc2Nyb2xsaW5nPSExO3RoaXMuX3Jlb3JkZXJSb3dzKCl9LDEwMCl9LF9hZGp1c3RWaXJ0dWFsSW5kZXhPZmZzZXQ6ZnVuY3Rpb24oYil7aWYoMUU0PApNYXRoLmFicyhiKSl0aGlzLl9ub1NjYWxlP3RoaXMuX25vU2NhbGU9ITE6KGI9TWF0aC5yb3VuZCh0aGlzLl9zY3JvbGxQb3NpdGlvbi90aGlzLl9zY3JvbGxIZWlnaHQqMUUzKS8xRTMsdGhpcy5fdmlkeE9mZnNldD1NYXRoLnJvdW5kKGIqdGhpcy5zaXplLWIqdGhpcy5fdmlydHVhbENvdW50KSwwPT09dGhpcy5fc2Nyb2xsVG9wJiZ0aGlzLnNjcm9sbFRvSW5kZXgoMCkpO2Vsc2V7Yj10aGlzLl92aWR4T2Zmc2V0fHwwOzA9PT10aGlzLl9zY3JvbGxUb3A/KHRoaXMuX3ZpZHhPZmZzZXQ9MCxiIT09dGhpcy5fdmlkeE9mZnNldCYmdGhpcy5zY3JvbGxUb0luZGV4KDApKToxRTM+dGhpcy5maXJzdFZpc2libGVJbmRleCYmMDx0aGlzLl92aWR4T2Zmc2V0JiYodGhpcy5fdmlkeE9mZnNldC09TWF0aC5taW4odGhpcy5fdmlkeE9mZnNldCwxMDApLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4KyhiLXRoaXMuX3ZpZHhPZmZzZXQpKzEpLHRoaXMuX25vU2NhbGU9CiEwKTt2YXIgZD10aGlzLnNpemUtdGhpcy5fdmlydHVhbENvdW50O3RoaXMuX3Njcm9sbFRvcD49dGhpcy5fbWF4U2Nyb2xsVG9wPyh0aGlzLl92aWR4T2Zmc2V0PWQsYiE9PXRoaXMuX3ZpZHhPZmZzZXQmJnRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLl92aXJ0dWFsQ291bnQpKTp0aGlzLmZpcnN0VmlzaWJsZUluZGV4PnRoaXMuX3ZpcnR1YWxDb3VudC0xRTMmJnRoaXMuX3ZpZHhPZmZzZXQ8ZCYmKHRoaXMuX3ZpZHhPZmZzZXQrPU1hdGgubWluKGQtdGhpcy5fdmlkeE9mZnNldCwxMDApLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4LSh0aGlzLl92aWR4T2Zmc2V0LWIpKSx0aGlzLl9ub1NjYWxlPSEwKX19LF9yZW9yZGVyUm93czpmdW5jdGlvbigpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMuJC5pdGVtcyksZD1iLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1yb3ciKSxmPWQubGVuZ3RoLShkWzBdLmluZGV4LSh0aGlzLl92aXJ0dWFsU3RhcnQrdGhpcy5fdmlkeE9mZnNldCkpOwppZihmPGQubGVuZ3RoLzIpZm9yKHZhciBoPTA7aDxmO2grKyliLmFwcGVuZENoaWxkKGRbaF0pO2Vsc2UgZm9yKDtmPGQubGVuZ3RoO2YrKyliLmluc2VydEJlZm9yZShkW2ZdLGRbMF0pfSxfZnJvemVuQ2VsbHNDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kZWJvdW5jZSgiY2FjaGUtZWxlbWVudHMiLGZ1bmN0aW9uKCl7UG9seW1lci5kb20odGhpcy5kb21Ib3N0LnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1jZWxsIikuZm9yRWFjaChmdW5jdGlvbihiKXtiLnN0eWxlLnRyYW5zZm9ybT0iIn0pO3RoaXMuX2Zyb3plbkNlbGxzPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKFBvbHltZXIuZG9tKHRoaXMuZG9tSG9zdC5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJbZnJvemVuXSIpKTt0aGlzLl90cmFuc2xhdGVTdGF0aW9uYXJ5RWxlbWVudHMoKX0pO3RoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKX0sX3VwZGF0ZUxhc3RGcm96ZW46ZnVuY3Rpb24oKXtpZih0aGlzLmNvbHVtblRyZWUpe3ZhciBiPQp0aGlzLmNvbHVtblRyZWVbdGhpcy5jb2x1bW5UcmVlLmxlbmd0aC0xXS5zbGljZSgwKTtiLnNvcnQoZnVuY3Rpb24oZixoKXtyZXR1cm4gZi5fb3JkZXItaC5fb3JkZXJ9KTt2YXIgZD1iLnJlZHVjZShmdW5jdGlvbihmLGgsayl7aC5fbGFzdEZyb3plbj0hMTtyZXR1cm4gaC5mcm96ZW4mJiFoLmhpZGRlbj9rOmZ9LHZvaWQgMCk7dm9pZCAwIT09ZCYmKGJbZF0uX2xhc3RGcm96ZW49ITApfX0sX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50czpmdW5jdGlvbigpe3RoaXMuZml4ZWRTZWN0aW9ucz8odGhpcy4kLml0ZW1zLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoLXRoaXMuX3Njcm9sbExlZnR8fDAsLXRoaXMuX3Njcm9sbFRvcHx8MCksdGhpcy4kLmZvb3Rlci5zdHlsZS50cmFuc2Zvcm09dGhpcy4kLmhlYWRlci5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKC10aGlzLl9zY3JvbGxMZWZ0fHwwLDApKTp0aGlzLiQuZm9vdGVyLnN0eWxlLnRyYW5zZm9ybT0KdGhpcy4kLmhlYWRlci5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKDAsdGhpcy5fc2Nyb2xsVG9wKTtmb3IodmFyIGI9dGhpcy5fZ2V0VHJhbnNsYXRlKHRoaXMuX3Njcm9sbExlZnQsMCksZD0wO2Q8dGhpcy5fZnJvemVuQ2VsbHMubGVuZ3RoO2QrKyl0aGlzLl9mcm96ZW5DZWxsc1tkXS5zdHlsZS50cmFuc2Zvcm09Yn0sX2dldFRyYW5zbGF0ZTpmdW5jdGlvbihiLGQpe3JldHVybiJ0cmFuc2xhdGUoIitiKyJweCwiK2QrInB4KSJ9fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9yPVtQb2x5bWVyLklyb25TY3JvbGxUYXJnZXRCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZVNjcm9sbEJlaGF2aW9ySW1wbF07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtY2VsbC1jbGljay1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5DZWxsQ2xpY2tCZWhhdmlvcj17bGlzdGVuZXJzOntjbGljazoiX29uQ2xpY2sifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2NlbGxDb250ZW50Rm9jdXNIYW5kbGVyPWZ1bmN0aW9uKGIpe2IudGFyZ2V0IT09dGhpcy5fY2VsbENvbnRlbnQmJnRoaXMuZmlyZSgiY2VsbC1jb250ZW50LWZvY3VzIix7Y2VsbDp0aGlzfSl9LmJpbmQodGhpcyk7dGhpcy5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fY2VsbENvbnRlbnRGb2N1c0hhbmRsZXIsITApfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2NlbGxDb250ZW50Rm9jdXNIYW5kbGVyLCEwKX0sX29uQ2xpY2s6ZnVuY3Rpb24oYil7InZhYWRpbi1ncmlkLXNvcnRlciIhPT10aGlzLmxvY2FsTmFtZSYmdGhpcy5maXJlKCJjZWxsLWZvY3VzIix7Y2VsbDp0aGlzfSk7aWYodGhpcy5fY2VsbENsaWNrKXt2YXIgZD1Qb2x5bWVyLmRvbShiKS5sb2NhbFRhcmdldDsKZC5nZXREaXN0cmlidXRlZE5vZGVzJiYoZD1Qb2x5bWVyLmRvbShkKS5nZXREaXN0cmlidXRlZE5vZGVzKClbMF0pO3ZhciBmPVBvbHltZXIuZG9tKGIpLnBhdGg7Zj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmLDAsZi5pbmRleE9mKGQpKzEpO2QuY29udGFpbnModGhpcy50YXJnZXQmJnRoaXMudGFyZ2V0LnJvb3QuYWN0aXZlRWxlbWVudHx8ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCl8fGYuc29tZSh0aGlzLl9pc0ZvY3VzYWJsZSl8fHRoaXMuX2NlbGxDbGljayhiKX19LF9pc0ZvY3VzYWJsZTpmdW5jdGlvbihiKXt2YXIgZD1Qb2x5bWVyLmRvbShiKS5wYXJlbnROb2RlO2Q9LTEhPT1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGQpLnF1ZXJ5U2VsZWN0b3JBbGwoIlt0YWJpbmRleF0sIGJ1dHRvbiwgaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIG9iamVjdCwgaWZyYW1lLCBsYWJlbCwgYVtocmVmXSwgYXJlYVtocmVmXSIpLGIpO3JldHVybiFiLmRpc2FibGVkJiYKZH19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLWNlbGwuaHRtbC5qcwooZnVuY3Rpb24oKXt2YXIgYj17cHJvcGVydGllczp7Y29sdW1uOk9iamVjdCxleHBhbmRlZDpCb29sZWFuLGZsZXhHcm93Ok51bWJlcixjb2xTcGFuOk51bWJlcixmb2N1c2VkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSxmcm96ZW46e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGxhc3RGcm96ZW46e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGhpZGRlbjp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0saW5zdGFuY2U6T2JqZWN0LGluZGV4Ok51bWJlcixpdGVtOk9iamVjdCxzZWxlY3RlZDpCb29sZWFuLHRlbXBsYXRlOk9iamVjdCx0YXJnZXQ6T2JqZWN0LHdpZHRoOlN0cmluZyxvcmRlcjpOdW1iZXIscmVvcmRlclN0YXR1czp7dHlwZTpTdHJpbmcscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfY2hpbGRDb2x1bW5zOkFycmF5LF9jZWxsQ29udGVudDpPYmplY3QsX2luc2VydGlvblBvaW50Ok9iamVjdCwKX3RlbXBsYXRpemVyOk9iamVjdH0sb2JzZXJ2ZXJzOiJfY29sdW1uQ2hhbmdlZChjb2x1bW4pO19jZWxsQXR0YWNoZWQoY29sdW1uLCBpc0F0dGFjaGVkKTtfZXhwYW5kZWRDaGFuZ2VkKGV4cGFuZGVkLCBpbnN0YW5jZSk7X2ZsZXhHcm93Q2hhbmdlZChmbGV4R3Jvdyk7X2luZGV4Q2hhbmdlZChpbmRleCwgaW5zdGFuY2UpO19pdGVtQ2hhbmdlZChpdGVtLCBpbnN0YW5jZSk7X2luc3RhbmNlQ2hhbmdlZChpbnN0YW5jZSwgdGFyZ2V0KTtfc2VsZWN0ZWRDaGFuZ2VkKHNlbGVjdGVkLCBpbnN0YW5jZSk7X3RvZ2dsZUNvbnRlbnQoaXNBdHRhY2hlZCwgX2NlbGxDb250ZW50LCBfaW5zZXJ0aW9uUG9pbnQpO190b2dnbGVJbnN0YW5jZShpc0F0dGFjaGVkLCBfdGVtcGxhdGl6ZXIsIGluc3RhbmNlKTtfd2lkdGhDaGFuZ2VkKHdpZHRoKTtfb3JkZXJDaGFuZ2VkKG9yZGVyKTtfdmlzaWJsZUNoaWxkQ29sdW1uc0NoYW5nZWQoX3Zpc2libGVDaGlsZENvbHVtbnMpO19jaGlsZENvbHVtbnNDaGFuZ2VkKF9jaGlsZENvbHVtbnMpIi5zcGxpdCgiOyIpLApyZWFkeTpmdW5jdGlvbigpe3RoaXMuY2xhc3NMaXN0LmFkZCgidmFhZGluLWdyaWQtY2VsbCIpOyExPT09UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cmJih0aGlzLmNsYXNzTGlzdC5hZGQoInN0eWxlLXNjb3BlIiksdGhpcy5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZCIpKX0sX2NvbHVtbkNoYW5nZWQ6ZnVuY3Rpb24oZCl7dGhpcy5mbGV4R3Jvdz1kLmZsZXhHcm93O3RoaXMuZnJvemVuPWQuZnJvemVuO3RoaXMubGFzdEZyb3plbj1kLl9sYXN0RnJvemVuO3RoaXMuaGVhZGVyVGVtcGxhdGU9ZC5oZWFkZXJUZW1wbGF0ZTt0aGlzLmZvb3RlclRlbXBsYXRlPWQuZm9vdGVyVGVtcGxhdGU7dGhpcy50ZW1wbGF0ZT1kLnRlbXBsYXRlO3RoaXMud2lkdGg9ZC53aWR0aDt0aGlzLmhpZGRlbj1kLmhpZGRlbjt0aGlzLnJlc2l6YWJsZT1kLnJlc2l6YWJsZTt0aGlzLl9jaGlsZENvbHVtbnM9ZC5fY2hpbGRDb2x1bW5zO3RoaXMub3JkZXI9ZC5fb3JkZXI7ZC5jb2xTcGFuJiYodGhpcy5jb2xTcGFuPQpkLmNvbFNwYW4pO3RoaXMubGlzdGVuKGQsInByb3BlcnR5LWNoYW5nZWQiLCJfY29sdW1uUHJvcENoYW5nZWQiKX0sX2NlbGxBdHRhY2hlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJihmP3RoaXMubGlzdGVuKGQsInByb3BlcnR5LWNoYW5nZWQiLCJfY29sdW1uUHJvcENoYW5nZWQiKTp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5pc0F0dGFjaGVkfHx0aGlzLnVubGlzdGVuKGQsInByb3BlcnR5LWNoYW5nZWQiLCJfY29sdW1uUHJvcENoYW5nZWQiKX0pKX0sX2NvbHVtblByb3BDaGFuZ2VkOmZ1bmN0aW9uKGQpe2QudGFyZ2V0PT10aGlzLmNvbHVtbiYmKHRoaXNbZC5kZXRhaWwucGF0aF09ZC5kZXRhaWwudmFsdWUpfSxfZXhwYW5kZWRDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGYuX19leHBhbmRlZF9fPWQsZi5leHBhbmRlZD1kKX0sX2ZsZXhHcm93Q2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLnN0eWxlLmZsZXhHcm93PQpkfSxfaW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGYuaW5kZXg9ZCl9LF9pdGVtQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJihmLml0ZW09ZCl9LF9zZWxlY3RlZENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiYoZi5fX3NlbGVjdGVkX189ZCxmLnNlbGVjdGVkPWQpfSxfY2hpbGRDb2x1bW5zQ2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLmNvbFNwYW49ZC5sZW5ndGh9LF90b2dnbGVDb250ZW50OmZ1bmN0aW9uKGQsZixoKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZ2b2lkIDAhPT1oJiYoZD8oUG9seW1lci5kb20oZikucGFyZW50Tm9kZSE9PXRoaXMudGFyZ2V0JiZQb2x5bWVyLmRvbSh0aGlzLnRhcmdldCkuYXBwZW5kQ2hpbGQoZiksUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQoaCkpOnRoaXMuYXN5bmMoZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWR8fFBvbHltZXIuZG9tKGYpLnBhcmVudE5vZGUhPT0KdGhpcy50YXJnZXR8fFBvbHltZXIuZG9tKHRoaXMudGFyZ2V0KS5yZW1vdmVDaGlsZChmKX0pKX0sX3RvZ2dsZUluc3RhbmNlOmZ1bmN0aW9uKGQsZixoKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZ2b2lkIDAhPT1oJiYoZD9mLmFkZEluc3RhbmNlKGgpOmYucmVtb3ZlSW5zdGFuY2UoaCkpfSxfd2lkdGhDaGFuZ2VkOmZ1bmN0aW9uKGQpe3RoaXMuc3R5bGUud2lkdGg9ZH0sX29yZGVyQ2hhbmdlZDpmdW5jdGlvbihkKXt0aGlzLnN0eWxlLm9yZGVyPWR9LF90ZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oZCl7dGhpcy5pbnN0YW5jZT1kLnRlbXBsYXRpemVyLmNyZWF0ZUluc3RhbmNlKCk7dGhpcy5fdGVtcGxhdGl6ZXI9ZC50ZW1wbGF0aXplcn0sX2luc3RhbmNlQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJih0aGlzLnN0eWxlLmhlaWdodD0iIix0aGlzLl9jZWxsQ29udGVudD10aGlzLl9jZWxsQ29udGVudHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtY2VsbC1jb250ZW50IiksCmQ9InZhYWRpbi1ncmlkLWNlbGwtY29udGVudC0iKyh2YWFkaW4uZWxlbWVudHMuZ3JpZC5fY29udGVudEluZGV4PXZhYWRpbi5lbGVtZW50cy5ncmlkLl9jb250ZW50SW5kZXgrMXx8MCksdGhpcy5fY2VsbENvbnRlbnQuaW5uZXJIVE1MPSIiLFBvbHltZXIuZG9tKHRoaXMuX2NlbGxDb250ZW50KS5hcHBlbmRDaGlsZCh0aGlzLmluc3RhbmNlLnJvb3QpLHRoaXMuX2NlbGxDb250ZW50LnNldEF0dHJpYnV0ZSgiaWQiLGQpLFBvbHltZXIuRWxlbWVudD8odGhpcy5fY2VsbENvbnRlbnQuc2V0QXR0cmlidXRlKCJzbG90IixkKSx0aGlzLl9pbnNlcnRpb25Qb2ludD10aGlzLl9pbnNlcnRpb25Qb2ludHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2xvdCIpLHRoaXMuX2luc2VydGlvblBvaW50LnNldEF0dHJpYnV0ZSgibmFtZSIsZCkpOih0aGlzLl9pbnNlcnRpb25Qb2ludD10aGlzLl9pbnNlcnRpb25Qb2ludHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY29udGVudCIpLHRoaXMuX2luc2VydGlvblBvaW50LnNldEF0dHJpYnV0ZSgic2VsZWN0IiwKIiMiK2QpKSl9fTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtY2VsbCIsYmVoYXZpb3JzOltiLHZhYWRpbi5lbGVtZW50cy5ncmlkLkNlbGxDbGlja0JlaGF2aW9yXSxvYnNlcnZlcnM6WyJfdGVtcGxhdGVDaGFuZ2VkKHRlbXBsYXRlKSJdLF9jZWxsQ2xpY2s6ZnVuY3Rpb24oZCl7ZC5kZWZhdWx0UHJldmVudGVkfHx0aGlzLmZpcmUoImNlbGwtYWN0aXZhdGUiLHttb2RlbDp0aGlzLmluc3RhbmNlfSl9fSk7UG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlci1jZWxsIixwcm9wZXJ0aWVzOntoZWFkZXJUZW1wbGF0ZTpPYmplY3QscmVzaXphYmxlOkJvb2xlYW4sY29sdW1uUmVzaXppbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fSxiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ2VsbENsaWNrQmVoYXZpb3JdLG9ic2VydmVyczpbIl9oZWFkZXJUZW1wbGF0ZUNoYW5nZWQoaGVhZGVyVGVtcGxhdGUpIiwiX2lzRW1wdHlDaGFuZ2VkKF9pc0VtcHR5LCBpc0F0dGFjaGVkKSIsCiJfcmVzaXphYmxlQ2hhbmdlZChyZXNpemFibGUpIl0sbGlzdGVuZXJzOnttb3VzZWRvd246Il9jYW5jZWxNb3VzZURvd25PblJlc2l6ZSIsbW91c2Vtb3ZlOiJfZW5hYmxlRHJhZyIsbW91c2VvdXQ6Il9kaXNhYmxlRHJhZyIsdG91Y2hzdGFydDoiX29uVG91Y2hTdGFydCIsdG91Y2htb3ZlOiJfb25Ub3VjaE1vdmUiLHRvdWNoZW5kOiJfb25Ub3VjaEVuZCIsY29udGV4dG1lbnU6Il9vbkNvbnRleHRNZW51In0sX29uQ29udGV4dE1lbnU6ZnVuY3Rpb24oZCl7dGhpcy5fcmVvcmRlckdob3N0JiZkLnByZXZlbnREZWZhdWx0KCl9LF9vblRvdWNoU3RhcnQ6ZnVuY3Rpb24oZCl7ZC50YXJnZXQhPT10aGlzLl9yZXNpemVIYW5kbGUmJnRoaXMudGFyZ2V0LmNvbHVtblJlb3JkZXJpbmdBbGxvd2VkJiYodGhpcy5fc3RhcnRSZW9yZGVyVGltZW91dD1zZXRUaW1lb3V0KHRoaXMuX3N0YXJ0UmVvcmRlci5iaW5kKHRoaXMsZCksMTAwKSl9LF9zdGFydFJlb3JkZXI6ZnVuY3Rpb24oZCl7dGhpcy5fcmVvcmRlckdob3N0PQp0aGlzLl9nZXRHaG9zdCgpO3RoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIjt2YXIgZj1uZXcgQ3VzdG9tRXZlbnQoImRyYWdzdGFydCIse2J1YmJsZXM6ITB9KTt0aGlzLl9jZWxsQ29udGVudC5kaXNwYXRjaEV2ZW50KGYpO3RoaXMuX3Jlb3JkZXJYWT17eDpkLnRvdWNoZXNbMF0uY2xpZW50WC10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQseTpkLnRvdWNoZXNbMF0uY2xpZW50WS10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcH07dGhpcy5fdXBkYXRlR2hvc3RQb3NpdGlvbihkLnRvdWNoZXNbMF0uY2xpZW50WCxkLnRvdWNoZXNbMF0uY2xpZW50WSl9LF9vblRvdWNoTW92ZTpmdW5jdGlvbihkKXtpZih0aGlzLl9yZW9yZGVyR2hvc3Qpe2QucHJldmVudERlZmF1bHQoKTt2YXIgZj1uZXcgQ3VzdG9tRXZlbnQoImRyYWdvdmVyIix7YnViYmxlczohMH0pO2YuY2xpZW50WD1kLnRvdWNoZXNbMF0uY2xpZW50WDtmLmNsaWVudFk9CmQudG91Y2hlc1swXS5jbGllbnRZO3ZhciBoPXRoaXMuX2NvbnRlbnRGcm9tUG9pbnQoZi5jbGllbnRYLGYuY2xpZW50WSk7aCYmaC5kaXNwYXRjaEV2ZW50KGYpO3RoaXMuX3VwZGF0ZUdob3N0UG9zaXRpb24oZC50b3VjaGVzWzBdLmNsaWVudFgsZC50b3VjaGVzWzBdLmNsaWVudFkpfWVsc2UgY2xlYXJUaW1lb3V0KHRoaXMuX3N0YXJ0UmVvcmRlclRpbWVvdXQpfSxfdXBkYXRlR2hvc3RQb3NpdGlvbjpmdW5jdGlvbihkLGYpe2QtPXRoaXMuX3Jlb3JkZXJYWS54O2Y9Zi10aGlzLl9yZW9yZGVyWFkueS01MDt2YXIgaD1wYXJzZUludCh0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUubGVmdHx8MCksaz1wYXJzZUludCh0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudG9wfHwwKSx0PXRoaXMuX3Jlb3JkZXJHaG9zdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUubGVmdD1oLSh0LmxlZnQtZCkrInB4Ijt0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudG9wPQprLSh0LnRvcC1mKSsicHgifSxfb25Ub3VjaEVuZDpmdW5jdGlvbihkKXtjbGVhclRpbWVvdXQodGhpcy5fc3RhcnRSZW9yZGVyVGltZW91dCk7dGhpcy5fcmVvcmRlckdob3N0JiYoZC5wcmV2ZW50RGVmYXVsdCgpLGQ9bmV3IEN1c3RvbUV2ZW50KCJkcmFnZW5kIix7YnViYmxlczohMH0pLHRoaXMuZGlzcGF0Y2hFdmVudChkKSx0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIix0aGlzLl9yZW9yZGVyR2hvc3Q9bnVsbCl9LF9jb250ZW50RnJvbVBvaW50OmZ1bmN0aW9uKGQsZil7aWYoUG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpe3ZhciBoPXRoaXMudGFyZ2V0LiQuc2Nyb2xsZXI7aC50b2dnbGVBdHRyaWJ1dGUoIm5vLWNvbnRlbnQtcG9pbnRlci1ldmVudHMiLCEwKTtkPXRoaXMuZG9tSG9zdC5yb290LmVsZW1lbnRGcm9tUG9pbnQoZCxmKTtoLnRvZ2dsZUF0dHJpYnV0ZSgibm8tY29udGVudC1wb2ludGVyLWV2ZW50cyIsITEpO2lmKGQmJmQuZ2V0Q29udGVudENoaWxkcmVuKXJldHVybiBkLmdldENvbnRlbnRDaGlsZHJlbihQb2x5bWVyLkVsZW1lbnQ/CiJzbG90IjoiY29udGVudCIpWzBdfWVsc2UgcmV0dXJuIGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoZCxmKX0sX2dldEdob3N0OmZ1bmN0aW9uKCl7dmFyIGQ9dGhpcy50YXJnZXQuJC5zY3JvbGxlci4kLnJlb3JkZXJnaG9zdDtkLmlubmVyVGV4dD10aGlzLl9jZWxsQ29udGVudC5pbm5lclRleHQ7dmFyIGY9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5fY2VsbENvbnRlbnQpOyJib3hTaXppbmcgZGlzcGxheSB3aWR0aCBoZWlnaHQgYmFja2dyb3VuZCBhbGlnbkl0ZW1zIHBhZGRpbmcgYm9yZGVyIGZsZXgtZGlyZWN0aW9uIG92ZXJmbG93Ii5zcGxpdCgiICIpLmZvckVhY2goZnVuY3Rpb24oaCl7ZC5zdHlsZVtoXT1mW2hdfSx0aGlzKTtyZXR1cm4gZH0sX2VuYWJsZURyYWc6ZnVuY3Rpb24oKXt0aGlzLl9jZWxsQ29udGVudC5kcmFnZ2FibGU9dGhpcy50YXJnZXQuY29sdW1uUmVvcmRlcmluZ0FsbG93ZWQmJiF3aW5kb3cuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKX0sX2Rpc2FibGVEcmFnOmZ1bmN0aW9uKCl7dGhpcy5fY2VsbENvbnRlbnQuZHJhZ2dhYmxlPQohMX0sX2NhbmNlbE1vdXNlRG93bk9uUmVzaXplOmZ1bmN0aW9uKGQpe2QudGFyZ2V0PT09dGhpcy5fcmVzaXplSGFuZGxlJiZkLnByZXZlbnREZWZhdWx0KCl9LF9yZXNpemFibGVDaGFuZ2VkOmZ1bmN0aW9uKGQpe2Q/KHRoaXMuX3Jlc2l6ZUhhbmRsZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLl9yZXNpemVIYW5kbGUuY2xhc3NMaXN0LmFkZCgidmFhZGluLWdyaWQtY29sdW1uLXJlc2l6ZS1oYW5kbGUiKSx0aGlzLmxpc3Rlbih0aGlzLl9yZXNpemVIYW5kbGUsInRyYWNrIiwiX29uVHJhY2siKSxQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZCh0aGlzLl9yZXNpemVIYW5kbGUpKTp0aGlzLl9yZXNpemVIYW5kbGUmJih0aGlzLnVubGlzdGVuKHRoaXMuX3Jlc2l6ZUhhbmRsZSwidHJhY2siLCJfb25UcmFjayIpLFBvbHltZXIuZG9tKHRoaXMpLnJlbW92ZUNoaWxkKHRoaXMuX3Jlc2l6ZUhhbmRsZSkpfSxfb25UcmFjazpmdW5jdGlvbihkKXt0aGlzLmNvbHVtblJlc2l6aW5nPQohMDt2YXIgZj10aGlzLmNvbHVtbjsidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWYubG9jYWxOYW1lJiYoZj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmLl9jaGlsZENvbHVtbnMsMCkuc29ydChmdW5jdGlvbih0LGwpe3JldHVybiB0Ll9vcmRlci1sLl9vcmRlcn0pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4hdC5oaWRkZW59KS5wb3AoKSk7dmFyIGg9dGhpcy5fZ2V0SGVhZGVyQ2VsbEJ5Q29sdW1uKGYpO2lmKGgub2Zmc2V0V2lkdGgpe3ZhciBrPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGguX2NlbGxDb250ZW50KTtmLndpZHRoPU1hdGgubWF4KDEwK3BhcnNlSW50KGsucGFkZGluZ0xlZnQpK3BhcnNlSW50KGsucGFkZGluZ1JpZ2h0KSxoLm9mZnNldFdpZHRoK2QuZGV0YWlsLngtaC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCkrInB4IjtmLmZsZXhHcm93PTB9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoUG9seW1lci5kb20odGhpcy5wYXJlbnRFbGVtZW50LnBhcmVudEVsZW1lbnQpLnF1ZXJ5U2VsZWN0b3JBbGwoIi52YWFkaW4tZ3JpZC1yb3c6bGFzdC1jaGlsZCAudmFhZGluLWdyaWQtY2VsbCIpKS5zb3J0KGZ1bmN0aW9uKHQsCmwpe3JldHVybiB0LmNvbHVtbi5fb3JkZXItbC5jb2x1bW4uX29yZGVyfSkuZm9yRWFjaChmdW5jdGlvbih0LGwscCl7bDxwLmluZGV4T2YoaCkmJih0LmNvbHVtbi53aWR0aD10Lm9mZnNldFdpZHRoKyJweCIsdC5jb2x1bW4uZmxleEdyb3c9MCl9KTt0aGlzLmNvbHVtblJlc2l6aW5nJiYiZW5kIj09PWQuZGV0YWlsLnN0YXRlJiYodGhpcy5jb2x1bW5SZXNpemluZz0hMSk7dGhpcy5maXJlKCJjb2x1bW4tcmVzaXppbmciKX0sX2dldEhlYWRlckNlbGxCeUNvbHVtbjpmdW5jdGlvbihkKXtyZXR1cm4gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKFBvbHltZXIuZG9tKHRoaXMucGFyZW50RWxlbWVudC5wYXJlbnRFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtcm93Omxhc3QtY2hpbGQgLnZhYWRpbi1ncmlkLWNlbGwiKSxmdW5jdGlvbihmKXtyZXR1cm4gZi5jb2x1bW49PT1kfSlbMF19LF9oZWFkZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oZCl7dm9pZCAwIT09CmQmJihudWxsPT09ZHx8IXRoaXMuX2lzQ29sdW1uUm93JiYidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiE9PXRoaXMuY29sdW1uLmxvY2FsTmFtZT8odGhpcy5pbnN0YW5jZT17cm9vdDpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX0sdGhpcy5faXNFbXB0eT0hMCk6KHRoaXMuaW5zdGFuY2U9ZC50ZW1wbGF0aXplci5jcmVhdGVJbnN0YW5jZSgpLHRoaXMuX3RlbXBsYXRpemVyPWQudGVtcGxhdGl6ZXIsdGhpcy5faXNFbXB0eT0hMSkpfSxfaXNFbXB0eUNoYW5nZWQ6ZnVuY3Rpb24oZCxmKXtmJiZ0aGlzLmZpcmUoImNlbGwtZW1wdHktY2hhbmdlZCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItY2VsbCIscHJvcGVydGllczp7Zm9vdGVyVGVtcGxhdGU6T2JqZWN0fSxiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQ2VsbENsaWNrQmVoYXZpb3JdLG9ic2VydmVyczpbIl9mb290ZXJUZW1wbGF0ZUNoYW5nZWQoZm9vdGVyVGVtcGxhdGUpIiwKIl9pc0VtcHR5Q2hhbmdlZChfaXNFbXB0eSwgaXNBdHRhY2hlZCkiXSxfZm9vdGVyVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGQpe3ZvaWQgMCE9PWQmJihudWxsPT09ZHx8IXRoaXMuX2lzQ29sdW1uUm93JiYidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiE9PXRoaXMuY29sdW1uLmxvY2FsTmFtZT8odGhpcy5pbnN0YW5jZT17cm9vdDpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX0sdGhpcy5faXNFbXB0eT0hMCk6KHRoaXMuaW5zdGFuY2U9ZC50ZW1wbGF0aXplci5jcmVhdGVJbnN0YW5jZSgpLHRoaXMuX3RlbXBsYXRpemVyPWQudGVtcGxhdGl6ZXIsdGhpcy5faXNFbXB0eT0hMSkpfSxfaXNFbXB0eUNoYW5nZWQ6ZnVuY3Rpb24oZCxmKXtmJiZ0aGlzLmZpcmUoImNlbGwtZW1wdHktY2hhbmdlZCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC1zaXplci1jZWxsIixiZWhhdmlvcnM6W2JdfSl9KSgpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXNpemVyLmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXNpemVyIixwcm9wZXJ0aWVzOntjb2x1bW5UcmVlOkFycmF5LHRvcDpOdW1iZXIsX2NvbHVtbnM6QXJyYXl9LG9ic2VydmVyczpbIl9jb2x1bW5UcmVlQ2hhbmdlZChjb2x1bW5UcmVlKSIsIl90b3BDaGFuZ2VkKHRvcCkiXSxfY29sdW1uVHJlZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5fY29sdW1ucz1iW2IubGVuZ3RoLTFdfSxfdG9wQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLnN0eWxlLnRvcD1iKyJweCJ9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIuaHRtbC5qcwpQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtb3V0ZXItc2Nyb2xsZXIiLHByb3BlcnRpZXM6e3Njcm9sbFRhcmdldDp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9zY3JvbGxUYXJnZXRDaGFuZ2VkIn0scGFzc3Rocm91Z2g6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITB9fSxsaXN0ZW5lcnM6e3Njcm9sbDoiX3N5bmNTY3JvbGxUYXJnZXQifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMubGlzdGVuKHRoaXMuZG9tSG9zdCwibW91c2Vtb3ZlIiwiX29uTW91c2VNb3ZlIik7dGhpcy5zdHlsZS53ZWJraXRPdmVyZmxvd1Njcm9sbGluZz0idG91Y2gifSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcy5kb21Ib3N0LCJtb3VzZW1vdmUiLCJfb25Nb3VzZU1vdmUiKX0sX3Njcm9sbFRhcmdldENoYW5nZWQ6ZnVuY3Rpb24oYixkKXtkJiZ0aGlzLnVubGlzdGVuKGQsInNjcm9sbCIsIl9zeW5jT3V0ZXJTY3JvbGxlciIpO3RoaXMubGlzdGVuKGIsCiJzY3JvbGwiLCJfc3luY091dGVyU2Nyb2xsZXIiKX0sX29uTW91c2VNb3ZlOmZ1bmN0aW9uKGIpe3RoaXMucGFzc3Rocm91Z2g9Yi5vZmZzZXRZPD10aGlzLmNsaWVudEhlaWdodCYmYi5vZmZzZXRYPD10aGlzLmNsaWVudFdpZHRofSxfc3luY091dGVyU2Nyb2xsZXI6ZnVuY3Rpb24oKXt0aGlzLl9zeW5jaW5nU2Nyb2xsVGFyZ2V0fHwodGhpcy5fc3luY2luZ091dGVyU2Nyb2xsZXI9ITAsdGhpcy5zY3JvbGxUb3A9dGhpcy5kb21Ib3N0Ll9zY3JvbGxUb3AsdGhpcy5zY3JvbGxMZWZ0PXRoaXMuZG9tSG9zdC5fc2Nyb2xsTGVmdCk7dGhpcy5fc3luY2luZ1Njcm9sbFRhcmdldD0hMX0sX3N5bmNTY3JvbGxUYXJnZXQ6ZnVuY3Rpb24oKXt0aGlzLl9zeW5jaW5nT3V0ZXJTY3JvbGxlcnx8KHRoaXMuX3N5bmNpbmdTY3JvbGxUYXJnZXQ9ITAsdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9dGhpcy5zY3JvbGxMZWZ0LAp0aGlzLmRvbUhvc3QuX3Njcm9sbEhhbmRsZXIoKSk7dGhpcy5fc3luY2luZ091dGVyU2Nyb2xsZXI9ITF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZm9jdXNhYmxlLWNlbGwtY29udGFpbmVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkZvY3VzYWJsZUNlbGxDb250YWluZXJCZWhhdmlvcj17cHJvcGVydGllczp7Zm9jdXNlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2ZvY3VzZWRSb3c6T2JqZWN0LF9mb2N1c2VkUm93SW5kZXg6TnVtYmVyLF9mb2N1c2VkQ2VsbDpPYmplY3QsX2ZvY3VzZWRDZWxsSW5kZXg6TnVtYmVyLF9sYXN0Rm9jdXNlZENlbGw6T2JqZWN0fSxvYnNlcnZlcnM6WyJfYW5ub3VuY2VGb2N1c2VkQ2VsbChfZm9jdXNlZENlbGwsIGZvY3VzZWQpIiwiX2Rpc3BhdGNoRXZlbnRzKF9mb2N1c2VkQ2VsbCwgZm9jdXNlZCkiLCJfZm9jdXNlZENlbGxDaGFuZ2VkKF9mb2N1c2VkUm93SW5kZXgsIF9mb2N1c2VkQ2VsbEluZGV4KSJdLF9hbm5vdW5jZUZvY3VzZWRDZWxsOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmdGhpcy5kb21Ib3N0Lm5hdmlnYXRpbmcmJmQmJihkPVBvbHltZXIuRWxlbWVudD9iLl9jZWxsQ29udGVudC5nZXRBdHRyaWJ1dGUoInNsb3QiKToKYi5fY2VsbENvbnRlbnQuaWQsInZhYWRpbi1ncmlkLXRhYmxlLWJvZHkiIT09dGhpcy5pc3x8Yi5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIil8fChiPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoUG9seW1lci5kb20oYi5wYXJlbnRFbGVtZW50KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtY2VsbCIpLGIpLGQ9dGhpcy5kb21Ib3N0LiQuaGVhZGVyLmxhc3RFbGVtZW50Q2hpbGQuY2hpbGRyZW5bYl0uX2NlbGxDb250ZW50LmlkKyIgIitkKSx0aGlzLmRvbUhvc3QuJC5mb290ZXJGb2N1c1RyYXAuYWN0aXZlVGFyZ2V0PWQpfSxfZGlzcGF0Y2hFdmVudHM6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodGhpcy5fbGFzdEZvY3VzZWRDZWxsJiYodGhpcy5fbGFzdEZvY3VzZWRDZWxsLl9jZWxsQ29udGVudC5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2VsbC1mb2N1c291dCIpKSx0aGlzLl9sYXN0Rm9jdXNlZENlbGw9dm9pZCAwKSwKZCYmKGIuX2NlbGxDb250ZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjZWxsLWZvY3VzaW4iKSksdGhpcy5fbGFzdEZvY3VzZWRDZWxsPWIpKX0sX2ZvY3VzZWRDZWxsQ2hhbmdlZDpmdW5jdGlvbihiLGQpe3ZvaWQgMCE9PWImJnZvaWQgMCE9PWQmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoUG9seW1lci5kb20odGhpcykuY2hpbGRyZW4sZnVuY3Rpb24oZixoKXtmLmZvY3VzZWQ9aD09PWI7Zi5mb2N1c2VkJiYodGhpcy5fZm9jdXNlZFJvdz1mLHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9TWF0aC5taW4oZCxmLmNoaWxkcmVuLmxlbmd0aC0xKSx0aGlzLl9mb2N1c2VkQ2VsbD1mLmNoaWxkcmVuW3RoaXMuX2ZvY3VzZWRDZWxsSW5kZXhdKTtmLmNlbGxzLmZvckVhY2goZnVuY3Rpb24oayx0KXtrLmZvY3VzZWQ9dD09PXRoaXMuX2ZvY3VzZWRDZWxsSW5kZXh9LmJpbmQodGhpcykpfS5iaW5kKHRoaXMpKX0sZm9jdXNMZWZ0OmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZvY3VzZWRDZWxsLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7dmFyIGI9CnRoaXMuX3Zpc2libGVDZWxsSW5kZXhlcygpOzA8Yi5sZW5ndGgmJih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PWJbTWF0aC5tYXgoMCxiLmluZGV4T2YodGhpcy5fZm9jdXNlZENlbGxJbmRleCktMSldKX19LGZvY3VzRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD1NYXRoLm1pbih0aGlzLl9mb2N1c2VkUm93SW5kZXgrMSx0aGlzLmNoaWxkcmVuLmxlbmd0aC0xKX0sX3Zpc2libGVDZWxsSW5kZXhlczpmdW5jdGlvbigpe3ZhciBiPVtdO2lmKHRoaXMuX2ZvY3VzZWRSb3cmJnRoaXMuX2ZvY3VzZWRSb3cuY2hpbGRyZW4pe2Zvcih2YXIgZD10aGlzLl9mb2N1c2VkUm93LmNoaWxkcmVuLGY9MDtmPGQubGVuZ3RoO2YrKylkW2ZdLmhpZGRlbnx8ZFtmXT09PXRoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsfHxiLnB1c2goZik7Yi5zb3J0KGZ1bmN0aW9uKGgsayl7cmV0dXJuIGRbaF0uY29sdW1uLl9vcmRlcjxkW2tdLmNvbHVtbi5fb3JkZXI/LTE6MX0pfXJldHVybiBifSwKZm9jdXNQYWdlRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD1NYXRoLm1pbih0aGlzLl9mb2N1c2VkUm93SW5kZXgrMTAsdGhpcy5jaGlsZHJlbi5sZW5ndGgtMSl9LGZvY3VzUGFnZVVwOmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PU1hdGgubWF4KDAsdGhpcy5fZm9jdXNlZFJvd0luZGV4LTEwKX0sZm9jdXNSaWdodDpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBiPXRoaXMuX3Zpc2libGVDZWxsSW5kZXhlcygpOzA8Yi5sZW5ndGgmJih0aGlzLl9mb2N1c2VkQ2VsbEluZGV4PWJbTWF0aC5taW4oYi5pbmRleE9mKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXgpKzEsYi5sZW5ndGgtMSldKX19LGZvY3VzVXA6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5tYXgoMCx0aGlzLl9mb2N1c2VkUm93SW5kZXgtMSl9LGZvY3VzSG9tZTpmdW5jdGlvbigpe2lmKCF0aGlzLl9mb2N1c2VkQ2VsbC5oYXNBdHRyaWJ1dGUoImRldGFpbHNjZWxsIikpe3ZhciBiPQp0aGlzLl92aXNpYmxlQ2VsbEluZGV4ZXMoKTswPGIubGVuZ3RoJiYodGhpcy5fZm9jdXNlZENlbGxJbmRleD1iWzBdKX19LGZvY3VzRW5kOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX2ZvY3VzZWRDZWxsLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7dmFyIGI9dGhpcy5fdmlzaWJsZUNlbGxJbmRleGVzKCk7MDxiLmxlbmd0aCYmKHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXg9YltiLmxlbmd0aC0xXSl9fSxmb2N1c0ZpcnN0OmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PTA7dGhpcy5mb2N1c0hvbWUoKX0sZm9jdXNMYXN0OmZ1bmN0aW9uKCl7dGhpcy5fZm9jdXNlZFJvd0luZGV4PXRoaXMuY2hpbGRyZW4ubGVuZ3RoLTE7dGhpcy5mb2N1c0VuZCgpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLWZvb3Rlci5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtwcm9wZXJ0aWVzOntjb2x1bW5UcmVlOkFycmF5LHRhcmdldDpPYmplY3QsX3Jvd3M6QXJyYXl9LG9ic2VydmVyczpbIl9jb2x1bW5UcmVlQ2hhbmdlZChjb2x1bW5UcmVlLCB0YXJnZXQpIiwiX3Jvd3NDaGFuZ2VkKF9yb3dzKSJdLF9jb2x1bW5UcmVlQ2hhbmdlZDpmdW5jdGlvbihkLGYpe2lmKHZvaWQgMCE9PWQmJnZvaWQgMCE9PWYpe3RoaXMuX3Jvd3MmJnRoaXMuX3Jvd3MuZm9yRWFjaChmdW5jdGlvbihsKXtQb2x5bWVyLmRvbShsKS5pbm5lckhUTUw9IiJ9KTtmb3IodmFyIGg9W10saz0wO2s8ZC5sZW5ndGg7aysrKXt2YXIgdD10aGlzLl9jcmVhdGVSb3coKTt0LnRhcmdldD1mO3QuX2lzQ29sdW1uUm93PWs9PWQubGVuZ3RoLTE7dC5jb2x1bW5zPWRba107aC5wdXNoKHQpfXRoaXMuX3Jvd3M9InZhYWRpbi1ncmlkLXRhYmxlLWhlYWRlciI9PT10aGlzLmxvY2FsTmFtZT9oOmgucmV2ZXJzZSgpfX0sX3Jvd3NDaGFuZ2VkOmZ1bmN0aW9uKGQpe1BvbHltZXIuZG9tKHRoaXMpLmlubmVySFRNTD0KIiI7ZC5mb3JFYWNoKGZ1bmN0aW9uKGYpe1BvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGYpfS5iaW5kKHRoaXMpKX19O1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXIiLGJlaGF2aW9yczpbYix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Gb2N1c2FibGVDZWxsQ29udGFpbmVyQmVoYXZpb3JdLF9jcmVhdGVSb3c6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtaGVhZGVyLXJvdyIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1ib2R5IixiZWhhdmlvcnM6W3ZhYWRpbi5lbGVtZW50cy5ncmlkLkZvY3VzYWJsZUNlbGxDb250YWluZXJCZWhhdmlvcl0sb2JzZXJ2ZXJzOlsiX2Fubm91bmNlRm9jdXNlZFJvdyhfZm9jdXNlZFJvdykiXSxfYW5ub3VuY2VGb2N1c2VkUm93OmZ1bmN0aW9uKGQpe3RoaXMuZmlyZSgiaXJvbi1hbm5vdW5jZSIse3RleHQ6IlJvdyAiKyhkLmluZGV4KzEpKyIgb2YgIisKdGhpcy5kb21Ib3N0LnNpemV9KX0sX21vdmVGb2N1c1RvRGV0YWlsc0NlbGw6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkQ2VsbC5mb2N1c2VkPSExO3RoaXMuX2ZvY3VzZWRSb3cuX3Jvd0RldGFpbHNDZWxsLmZvY3VzZWQ9ITA7dGhpcy5fZm9jdXNlZENlbGw9dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGx9LF9mb2N1c2VkUm93SGFzRGV0YWlsc0NlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZm9jdXNlZFJvdyYmdGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGwmJnRoaXMuX2ZvY3VzZWRDZWxsIT09dGhpcy5fZm9jdXNlZFJvdy5fcm93RGV0YWlsc0NlbGx9LGZvY3VzRG93bjpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dIYXNEZXRhaWxzQ2VsbCgpP3RoaXMuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKTp0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5taW4odGhpcy5fZm9jdXNlZFJvd0luZGV4KzEsdGhpcy5kb21Ib3N0LnNpemUtMSl9LGZvY3VzVXA6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkUm93JiYKdGhpcy5fZm9jdXNlZENlbGw9PT10aGlzLl9mb2N1c2VkUm93Ll9yb3dEZXRhaWxzQ2VsbD90aGlzLl9mb2N1c2VkQ2VsbENoYW5nZWQodGhpcy5fZm9jdXNlZFJvd0luZGV4LHRoaXMuX2ZvY3VzZWRDZWxsSW5kZXgpOih0aGlzLl9mb2N1c2VkUm93SW5kZXg9TWF0aC5tYXgoMCx0aGlzLl9mb2N1c2VkUm93SW5kZXgtMSksdGhpcy5fZm9jdXNlZFJvd0hhc0RldGFpbHNDZWxsKCkmJnRoaXMuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKSl9LGZvY3VzTGFzdDpmdW5jdGlvbigpe3RoaXMuX2ZvY3VzZWRSb3dJbmRleD10aGlzLmRvbUhvc3Quc2l6ZS0xO3RoaXMuZm9jdXNFbmQoKX0sX2ZvY3VzZWRDZWxsQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJkFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoUG9seW1lci5kb20odGhpcykuY2hpbGRyZW4sZnVuY3Rpb24oaCl7aC5mb2N1c2VkPWguaW5kZXg9PT1kO2guaW5kZXg9PT1kJiYodGhpcy5fZm9jdXNlZFJvdz0KaCx0aGlzLl9mb2N1c2VkQ2VsbD1oLmNoaWxkcmVuW2ZdKTtoLml0ZXJhdGVDZWxscyhmdW5jdGlvbihrLHQpe2suZm9jdXNlZD10PT09Zn0pfS5iaW5kKHRoaXMpKX19KTtQb2x5bWVyKHtpczoidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyIixiZWhhdmlvcnM6W2IsdmFhZGluLmVsZW1lbnRzLmdyaWQuRm9jdXNhYmxlQ2VsbENvbnRhaW5lckJlaGF2aW9yXSxfY3JlYXRlUm93OmZ1bmN0aW9uKCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLXRhYmxlLWZvb3Rlci1yb3ciKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGFibGUtZm9jdXMtdHJhcC5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1mb2N1cy10cmFwIixob3N0QXR0cmlidXRlczp7cm9sZToiZ3JpZGNlbGwifSxwcm9wZXJ0aWVzOnthY3RpdmVUYXJnZXQ6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfYWN0aXZlVGFyZ2V0Q2hhbmdlZCJ9fSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX3ByaW1hcnk9UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yKCIucHJpbWFyeSIpO3RoaXMuX3NlY29uZGFyeT1Qb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3IoIi5zZWNvbmRhcnkiKTtpZihQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZVNoYWRvd3x8UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cpUG9seW1lci5kb20odGhpcykuYXBwZW5kQ2hpbGQodGhpcy5fc2Vjb25kYXJ5KSxQb2x5bWVyLmRvbSh0aGlzKS5hcHBlbmRDaGlsZCh0aGlzLl9wcmltYXJ5KX0sZm9jdXM6ZnVuY3Rpb24oKXt0aGlzLl9mb2N1c2VkIT09dGhpcy5fcHJpbWFyeT90aGlzLl9wcmltYXJ5LmZvY3VzKCk6CnRoaXMuX3NlY29uZGFyeS5mb2N1cygpfSxfb25CYWl0Rm9jdXM6ZnVuY3Rpb24oYil7dGhpcy5fZm9jdXNlZD1iLnRhcmdldDt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHl8fCh0aGlzLmZpcmUoImZvY3VzLWdhaW5lZCIpLHRoaXMuX3ByaW1hcnkudGFiSW5kZXg9LTEpfSxfb25CYWl0Qmx1cjpmdW5jdGlvbigpe3RoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseXx8KHRoaXMuZmlyZSgiZm9jdXMtbG9zdCIpLHRoaXMuX3ByaW1hcnkudGFiSW5kZXg9MCl9LF9hY3RpdmVUYXJnZXRDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseT0hMDt0aGlzLl9mb2N1c2VkPT09dGhpcy5fcHJpbWFyeT8odGhpcy5fc2Vjb25kYXJ5LnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixiKSx0aGlzLl9zZWNvbmRhcnkuZm9jdXMoKSk6KHRoaXMuX3ByaW1hcnkuc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsbGVkYnkiLGIpLHRoaXMuX3ByaW1hcnkuZm9jdXMoKSk7CnRoaXMuX21vdmluZ0ZvY3VzSW50ZXJuYWxseT0hMX0sX3JlYW5ub3VuY2U6ZnVuY3Rpb24oKXt0aGlzLl9tb3ZpbmdGb2N1c0ludGVybmFsbHk9ITA7dGhpcy5fZm9jdXNlZD09PXRoaXMuX3ByaW1hcnk/KHRoaXMuX3NlY29uZGFyeS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsdGhpcy5hY3RpdmVUYXJnZXQpLHRoaXMuX3NlY29uZGFyeS5mb2N1cygpKToodGhpcy5fcHJpbWFyeS5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsdGhpcy5hY3RpdmVUYXJnZXQpLHRoaXMuX3ByaW1hcnkuZm9jdXMoKSk7dGhpcy5fbW92aW5nRm9jdXNJbnRlcm5hbGx5PSExfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLXJvdy5odG1sLmpzCihmdW5jdGlvbigpe3ZhciBiPXtwcm9wZXJ0aWVzOnthY3RpdmU6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LGNvbHVtbnM6QXJyYXksaW5kZXg6TnVtYmVyLGNlbGxzOnt2YWx1ZTpbXX0sdGFyZ2V0Ok9iamVjdCxleHBhbmRlZDp7dmFsdWU6ITF9LGZvY3VzZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGl0ZW06T2JqZWN0LHNlbGVjdGVkOntyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LF9yb3dEZXRhaWxzQ2VsbDpPYmplY3Qscm93RGV0YWlsc1RlbXBsYXRlOk9iamVjdH0sb2JzZXJ2ZXJzOiJfY29sdW1uc0NoYW5nZWQoY29sdW1ucywgdGFyZ2V0KTtfaW5kZXhDaGFuZ2VkKGluZGV4LCBjZWxscyk7X2l0ZW1DaGFuZ2VkKGl0ZW0sIGNlbGxzKTtfaXRlbUNoYW5nZWRGb3JEZXRhaWxzKGl0ZW0sIF9yb3dEZXRhaWxzQ2VsbCk7X3Jvd0RldGFpbHNDaGFuZ2VkKGV4cGFuZGVkLCByb3dEZXRhaWxzVGVtcGxhdGUsIHRhcmdldCk7X3Jvd0RldGFpbHNDZWxsSW5kZXhDaGFuZ2VkKF9yb3dEZXRhaWxzQ2VsbCwgaW5kZXgpO19yb3dEZXRhaWxzQ2VsbENoYW5nZWQoX3Jvd0RldGFpbHNDZWxsLCB0YXJnZXQpO19zZWxlY3RlZENoYW5nZWQoc2VsZWN0ZWQsIGNlbGxzKTtfc2VsZWN0ZWRDaGFuZ2VkRm9yRGV0YWlscyhzZWxlY3RlZCwgX3Jvd0RldGFpbHNDZWxsKSIuc3BsaXQoIjsiKSwKcmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC5hZGQoInZhYWRpbi1ncmlkLXJvdyIpOyExPT09UG9seW1lci5TZXR0aW5ncy51c2VTaGFkb3cmJih0aGlzLmNsYXNzTGlzdC5hZGQoInN0eWxlLXNjb3BlIiksdGhpcy5jbGFzc0xpc3QuYWRkKCJ2YWFkaW4tZ3JpZCIpKX0saXRlcmF0ZUNlbGxzOmZ1bmN0aW9uKGQpe3RoaXMuY2VsbHMuZm9yRWFjaChkKTt0aGlzLl9yb3dEZXRhaWxzQ2VsbCYmZCh0aGlzLl9yb3dEZXRhaWxzQ2VsbCl9LF9yb3dEZXRhaWxzQ2hhbmdlZDpmdW5jdGlvbihkLGYsaCl7aWYodm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmdm9pZCAwIT09aCl7aWYoZCl7dmFyIGs9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtY2VsbCIpO2suc2V0QXR0cmlidXRlKCJkZXRhaWxzY2VsbCIsITApO2suZnJvemVuPSEwO2sudGFyZ2V0PWg7ay50ZW1wbGF0ZT1mO2sudG9nZ2xlQXR0cmlidXRlKCJsYXN0Y29sdW1uIiwhMCk7UG9seW1lci5kb20odGhpcy5yb290KS5hcHBlbmRDaGlsZChrKTsKUG9seW1lci5kb20uZmx1c2goKTt0aGlzLl9yb3dEZXRhaWxzQ2VsbD1rfWVsc2UgdGhpcy5fcm93RGV0YWlsc0NlbGwmJihQb2x5bWVyLmRvbSh0aGlzLnJvb3QpLnJlbW92ZUNoaWxkKHRoaXMuX3Jvd0RldGFpbHNDZWxsKSx0aGlzLl9yb3dEZXRhaWxzQ2VsbD1udWxsKTt0aGlzLml0ZXJhdGVDZWxscyhmdW5jdGlvbih0KXt0LmV4cGFuZGVkPWR9KTt0aGlzLnRhcmdldC4kLnNjcm9sbGVyLl9mcm96ZW5DZWxsc0NoYW5nZWQoKX19LF91cGRhdGVSb3dWaXNpYmlsaXR5OmZ1bmN0aW9uKCl7dGhpcy5oaWRkZW49dGhpcy5jZWxscy5ldmVyeShmdW5jdGlvbihkKXtyZXR1cm4gZC5faXNFbXB0eX0pfSxfcm93RGV0YWlsc0NlbGxDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmZi4kLnNjcm9sbGVyLl91cGRhdGUoKX0sX3Jvd0RldGFpbHNDZWxsSW5kZXhDaGFuZ2VkOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmKGQ/KGQuaW5kZXg9CmYsUG9seW1lci5kb20uZmx1c2goKSx0aGlzLnVwZGF0ZVJvd0RldGFpbHNDZWxsTWV0cmljcygpKTp0aGlzLnN0eWxlLnBhZGRpbmdCb3R0b209IiIpfSx1cGRhdGVSb3dEZXRhaWxzQ2VsbE1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9yb3dEZXRhaWxzQ2VsbCYmKHRoaXMudGFyZ2V0JiZ0aGlzLnRhcmdldC5fb2JzZXJ2ZXImJnRoaXMudGFyZ2V0Ll9vYnNlcnZlci5mbHVzaCYmdGhpcy50YXJnZXQuX29ic2VydmVyLmZsdXNoKCksdGhpcy5fcm93RGV0YWlsc0NlbGwuc3R5bGUuaGVpZ2h0PSIiLHRoaXMuc3R5bGUucGFkZGluZ0JvdHRvbT10aGlzLl9yb3dEZXRhaWxzQ2VsbC5zdHlsZS5oZWlnaHQ9dGhpcy5fcm93RGV0YWlsc0NlbGwuY2xpZW50SGVpZ2h0KyJweCIpfSxfY29sdW1uc0NoYW5nZWQ6ZnVuY3Rpb24oZCxmKXtpZih2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mKXtQb2x5bWVyLmRvbSh0aGlzKS5pbm5lckhUTUw9IiI7dmFyIGg9W107ZC5mb3JFYWNoKGZ1bmN0aW9uKGspe3ZhciB0PQoiXyIrdGhpcy5pcy5yZXBsYWNlKC8tL2csIl8iKSsiX2NlbGxzIjt0PWtbdF09a1t0XXx8W107dmFyIGw9dC5maWx0ZXIoZnVuY3Rpb24obSl7cmV0dXJuIVBvbHltZXIuZG9tKG0pLnBhcmVudE5vZGV9KVswXTtpZighbCl7bD10aGlzLl9jcmVhdGVDZWxsKCk7dmFyIHA9QXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbCh0aGlzLnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCJkb20tcmVwZWF0IiksZnVuY3Rpb24obSl7cmV0dXJuIW0ucmVzdGFtcH0pOyhwPXB8fCJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItcm93Ij09PXRoaXMuaXN8fCJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItcm93Ij09PXRoaXMuaXMpfHx0LnB1c2gobCl9bC5pbmRleD10aGlzLmluZGV4O2wudGFyZ2V0PXRoaXMudGFyZ2V0O2wuX2lzQ29sdW1uUm93PXRoaXMuX2lzQ29sdW1uUm93O2wuY29sdW1uPWs7bC5leHBhbmRlZD10aGlzLmV4cGFuZGVkO1BvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKGwpO2gucHVzaChsKX0uYmluZCh0aGlzKSk7CnRoaXMuY2VsbHM9aH19LF9pbmRleENoYW5nZWQ6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZmLmZvckVhY2goZnVuY3Rpb24oaCl7aC5pbmRleD1kfSl9LF9pdGVtQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJmYuZm9yRWFjaChmdW5jdGlvbihoKXtoLml0ZW09ZH0pfSxfaXRlbUNoYW5nZWRGb3JEZXRhaWxzOmZ1bmN0aW9uKGQsZil7dm9pZCAwIT09ZCYmdm9pZCAwIT09ZiYmZiYmKGYuaXRlbT1kKX0sX3NlbGVjdGVkQ2hhbmdlZDpmdW5jdGlvbihkLGYpe3ZvaWQgMCE9PWQmJnZvaWQgMCE9PWYmJmYuZm9yRWFjaChmdW5jdGlvbihoKXtoLnNlbGVjdGVkPWR9KX0sX3NlbGVjdGVkQ2hhbmdlZEZvckRldGFpbHM6ZnVuY3Rpb24oZCxmKXt2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mJiZmJiYoZi5zZWxlY3RlZD1kKX0sdXBkYXRlTGFzdENvbHVtbjpmdW5jdGlvbigpe3RoaXMuY2VsbHMuc2xpY2UoMCkuc29ydChmdW5jdGlvbihkLApmKXtyZXR1cm4gZC5jb2x1bW4uX29yZGVyLWYuY29sdW1uLl9vcmRlcn0pLmZvckVhY2goZnVuY3Rpb24oZCxmLGgpe2QudG9nZ2xlQXR0cmlidXRlKCJsYXN0Y29sdW1uIixmPT09aC5sZW5ndGgtMSl9KX19O1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1yb3ciLGJlaGF2aW9yczpbYl0sX2NyZWF0ZUNlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtY2VsbCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItcm93IixiZWhhdmlvcnM6W2JdLG9ic2VydmVyczpbIl91cGRhdGVSb3dWaXNpYmlsaXR5KGNvbHVtbnMpIl0sbGlzdGVuZXJzOnsiY2VsbC1lbXB0eS1jaGFuZ2VkIjoiX3VwZGF0ZVJvd1Zpc2liaWxpdHkifSxfY3JlYXRlQ2VsbDpmdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1oZWFkZXItY2VsbCIpfX0pO1BvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10YWJsZS1mb290ZXItcm93IiwKYmVoYXZpb3JzOltiXSxvYnNlcnZlcnM6WyJfdXBkYXRlUm93VmlzaWJpbGl0eShjb2x1bW5zKSJdLGxpc3RlbmVyczp7ImNlbGwtZW1wdHktY2hhbmdlZCI6Il91cGRhdGVSb3dWaXNpYmlsaXR5In0sX2NyZWF0ZUNlbGw6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidmFhZGluLWdyaWQtdGFibGUtZm9vdGVyLWNlbGwiKX19KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtdGVtcGxhdGl6ZXIuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UZW1wbGF0aXplcj1mdW5jdGlvbigpe307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlRlbXBsYXRpemVyPVBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZC10ZW1wbGF0aXplciIsYmVoYXZpb3JzOltQb2x5bWVyLlRlbXBsYXRpemVyXSxwcm9wZXJ0aWVzOntkYXRhSG9zdDpPYmplY3QsdGVtcGxhdGU6T2JqZWN0LF90ZW1wbGF0ZUluc3RhbmNlczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3BhcmVudFBhdGhWYWx1ZXM6e3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sb2JzZXJ2ZXJzOlsiX3RlbXBsYXRlSW5zdGFuY2VzQ2hhbmdlZChfdGVtcGxhdGVJbnN0YW5jZXMuKiwgX3BhcmVudFBhdGhWYWx1ZXMuKikiXSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fcGFyZW50TW9kZWw9ITA7dGhpcy5faW5zdGFuY2VQcm9wcz17ZXhwYW5kZWQ6ITAsaW5kZXg6ITAsaXRlbTohMCxzZWxlY3RlZDohMH19LGNyZWF0ZUluc3RhbmNlOmZ1bmN0aW9uKCl7dGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKTt2YXIgYj10aGlzLnN0YW1wKHt9KTsKdGhpcy5hZGRJbnN0YW5jZShiKTtyZXR1cm4gYn0sYWRkSW5zdGFuY2U6ZnVuY3Rpb24oYil7LTE9PT10aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5pbmRleE9mKGIpJiZ0aGlzLnB1c2goIl90ZW1wbGF0ZUluc3RhbmNlcyIsYil9LHJlbW92ZUluc3RhbmNlOmZ1bmN0aW9uKGIpe3RoaXMuc3BsaWNlKCJfdGVtcGxhdGVJbnN0YW5jZXMiLHRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmluZGV4T2YoYiksMSl9LF9lbnN1cmVUZW1wbGF0aXplZDpmdW5jdGlvbigpe3RoaXMudGVtcGxhdGUuX3RlbXBsYXRpemVkfHwodGhpcy50ZW1wbGF0ZS5fdGVtcGxhdGl6ZWQ9ITAsdGhpcy50ZW1wbGF0aXplKHRoaXMudGVtcGxhdGUpLHRoaXMuX3BhcmVudFByb3BzPXRoaXMuX3BhcmVudFByb3BzfHx7fSxQb2x5bWVyLkVsZW1lbnR8fE9iamVjdC5rZXlzKHRoaXMuX3BhcmVudFByb3BzKS5mb3JFYWNoKGZ1bmN0aW9uKCl7fSx0aGlzKSl9LF9mb3J3YXJkSW5zdGFuY2VQcm9wOmZ1bmN0aW9uKGIsZCxmKXt2b2lkIDAhPT0KYlsiX18iK2QrIl9fIl0mJmJbIl9fIitkKyJfXyJdIT09ZiYmdGhpcy5maXJlKCJ0ZW1wbGF0ZS1pbnN0YW5jZS1jaGFuZ2VkIix7cHJvcDpkLHZhbHVlOmYsaW5zdDpifSl9LF9mb3J3YXJkSW5zdGFuY2VQYXRoOmZ1bmN0aW9uKGIsZCxmKXswIT09ZC5pbmRleE9mKCJpdGVtLiIpfHx0aGlzLl9zdXBwcmVzc0l0ZW1DaGFuZ2VFdmVudHx8dGhpcy5maXJlKCJpdGVtLWNoYW5nZWQiLHtpdGVtOmIuaXRlbSxwYXRoOmQuc3Vic3RyaW5nKDUpLHZhbHVlOmZ9KX0sX25vdGlmeUluc3RhbmNlUHJvcFYyOmZ1bmN0aW9uKGIsZCxmKXt0aGlzLl9mb3J3YXJkSW5zdGFuY2VQcm9wKGIsZCxmKTt0aGlzLl9mb3J3YXJkSW5zdGFuY2VQYXRoKGIsZCxmKX0sX2ZvcndhcmRQYXJlbnRQcm9wOmZ1bmN0aW9uKGIsZCl7dGhpcy5fcGFyZW50UGF0aFZhbHVlc1tiXT1kO3RoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmZvckVhY2goZnVuY3Rpb24oZil7Zi5zZXQoYixkKX0sdGhpcyl9LF9mb3J3YXJkUGFyZW50UGF0aDpmdW5jdGlvbihiLApkKXt0aGlzLnNldChbIl9wYXJlbnRQYXRoVmFsdWVzIixiXSxkKTt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2Yubm90aWZ5UGF0aChiLGQpfSx0aGlzKX0sX2ZvcndhcmRIb3N0UHJvcFYyOmZ1bmN0aW9uKGIsZCl7dGhpcy5fZm9yd2FyZFBhcmVudFByb3AoYixkKTt0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcyYmdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbihmKXtmLm5vdGlmeVBhdGgoYixkKX0sdGhpcyl9LF90ZW1wbGF0ZUluc3RhbmNlc0NoYW5nZWQ6ZnVuY3Rpb24oYil7aWYoIl90ZW1wbGF0ZUluc3RhbmNlcyI9PT1iLnBhdGgpe3ZhciBkPTA7dmFyIGY9dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMubGVuZ3RofWVsc2UgaWYoIl90ZW1wbGF0ZUluc3RhbmNlcy5zcGxpY2VzIj09PWIucGF0aClkPWIudmFsdWUuaW5kZXgsZj1iLnZhbHVlLmFkZGVkQ291bnQ7ZWxzZSByZXR1cm47T2JqZWN0LmtleXModGhpcy5fcGFyZW50UGF0aFZhbHVlc3x8Cnt9KS5mb3JFYWNoKGZ1bmN0aW9uKGgpe2Zvcih2YXIgaz1kO2s8ZCtmO2srKyl0aGlzLl90ZW1wbGF0ZUluc3RhbmNlc1trXS5zZXQoaCx0aGlzLl9wYXJlbnRQYXRoVmFsdWVzW2hdKX0sdGhpcyl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtcm93LWRldGFpbHMtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuUm93RGV0YWlsc0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntleHBhbmRlZEl0ZW1zOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsidGVtcGxhdGUtaW5zdGFuY2UtY2hhbmdlZCI6Il90ZW1wbGF0ZUluc3RhbmNlQ2hhbmdlZEV4cGFuZGVkIn0sb2JzZXJ2ZXJzOlsiX2V4cGFuZGVkSXRlbXNDaGFuZ2VkKGV4cGFuZGVkSXRlbXMuKiwgZGF0YVByb3ZpZGVyKSIsIl9yb3dEZXRhaWxzVGVtcGxhdGVDaGFuZ2VkKF9yb3dEZXRhaWxzVGVtcGxhdGUpIl0sX2V4cGFuZGVkSXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09YiYmdm9pZCAwIT09ZCYmKHRoaXMuX2ZsdXNoSXRlbXNEZWJvdW5jZXIoKSx0aGlzLiQuc2Nyb2xsZXIuX3BoeXNpY2FsSXRlbXMmJnRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuZXhwYW5kZWQ9dGhpcy5faXNFeHBhbmRlZChmLml0ZW0pfS5iaW5kKHRoaXMpKSl9LApfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihiKXt2YXIgZD1uZXcgdmFhZGluLmVsZW1lbnRzLmdyaWQuVGVtcGxhdGl6ZXI7ZC5kYXRhSG9zdD10aGlzLmRhdGFIb3N0O2QuX2luc3RhbmNlUHJvcHM9e2V4cGFuZGVkOiEwLGluZGV4OiEwLGl0ZW06ITAsc2VsZWN0ZWQ6ITB9O1BvbHltZXIuZG9tKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQoZCk7ZC50ZW1wbGF0ZT1iO2IudGVtcGxhdGl6ZXI9ZH0sX2lzRXhwYW5kZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuZXhwYW5kZWRJdGVtcyYmLTEhPT10aGlzLmV4cGFuZGVkSXRlbXMuaW5kZXhPZihiKX0sZXhwYW5kSXRlbTpmdW5jdGlvbihiKXt0aGlzLl9pc0V4cGFuZGVkKGIpfHx0aGlzLnB1c2goImV4cGFuZGVkSXRlbXMiLGIpfSxjb2xsYXBzZUl0ZW06ZnVuY3Rpb24oYil7dGhpcy5faXNFeHBhbmRlZChiKSYmdGhpcy5zcGxpY2UoImV4cGFuZGVkSXRlbXMiLHRoaXMuZXhwYW5kZWRJdGVtcy5pbmRleE9mKGIpLDEpfSwKX3RlbXBsYXRlSW5zdGFuY2VDaGFuZ2VkRXhwYW5kZWQ6ZnVuY3Rpb24oYil7ImV4cGFuZGVkIj09PWIuZGV0YWlsLnByb3AmJihiLmRldGFpbC52YWx1ZT90aGlzLmV4cGFuZEl0ZW0oYi5kZXRhaWwuaW5zdC5pdGVtKTp0aGlzLmNvbGxhcHNlSXRlbShiLmRldGFpbC5pbnN0Lml0ZW0pLGIuc3RvcFByb3BhZ2F0aW9uKCkpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZGF0YS1wcm92aWRlci1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5EYXRhUHJvdmlkZXJCZWhhdmlvcj17bGlzdGVuZXJzOnsiaXRlbS1jaGFuZ2VkIjoiX3RlbXBsYXRlSXRlbUNoYW5nZWQifSxwcm9wZXJ0aWVzOntwYWdlU2l6ZTp7dHlwZTpOdW1iZXIsdmFsdWU6NTAsb2JzZXJ2ZXI6Il9wYWdlU2l6ZUNoYW5nZWQifSxkYXRhUHJvdmlkZXI6e3R5cGU6T2JqZWN0LG5vdGlmeTohMCxvYnNlcnZlcjoiX2RhdGFQcm92aWRlckNoYW5nZWQifSxfbG9hZGluZzpCb29sZWFuLF9jYWNoZTp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19LF9wZW5kaW5nUmVxdWVzdHM6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fX0sX3RlbXBsYXRlSXRlbUNoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5kZXRhaWwuaXRlbTtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMuJC5pdGVtcykuY2hpbGRyZW4sZnVuY3Rpb24oZil7Zi5pdGVtPT09ZCYmZi5pdGVyYXRlQ2VsbHMoZnVuY3Rpb24oaCl7aC5fdGVtcGxhdGl6ZXIuX3N1cHByZXNzSXRlbUNoYW5nZUV2ZW50PQohMDtoLmluc3RhbmNlLm5vdGlmeVBhdGgoIml0ZW0uIitiLmRldGFpbC5wYXRoLGIuZGV0YWlsLnZhbHVlKTtoLl90ZW1wbGF0aXplci5fc3VwcHJlc3NJdGVtQ2hhbmdlRXZlbnQ9ITF9KX0pfSxfZ2V0Q2FjaGVkSXRlbTpmdW5jdGlvbihiKXt2YXIgZD10aGlzLl9nZXRQYWdlRm9ySW5kZXgoYiksZj10aGlzLl9jYWNoZSYmdGhpcy5fY2FjaGVbZF07cmV0dXJuIGY/ZltiLWQqdGhpcy5wYWdlU2l6ZV06bnVsbH0sX2dldEl0ZW06ZnVuY3Rpb24oYixkKXt0aGlzLl91cGRhdGVJdGVtKGQsdGhpcy5fZ2V0Q2FjaGVkSXRlbShiKSk7dGhpcy5fZWFnZXJseUxvYWRQYWdlcygpO3ZhciBmPXRoaXMuX3VuY2FjaGVkUGFnZXNGb3JQaHlzaWNhbEl0ZW1zKCk7MDxmLmxlbmd0aCYmKHRoaXMuX2xvYWRpbmc9ITAsdGhpcy5kZWJvdW5jZSgibG9hZCIsZnVuY3Rpb24oKXtmLmZvckVhY2goZnVuY3Rpb24oaCl7dGhpcy5fbG9hZFBhZ2UoaCl9LmJpbmQodGhpcykpfSwxMDApKX0sX2NhY2hlZFBhZ2VzRm9yUGh5c2ljYWxJdGVtczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wYWdlc0ZvclBoeXNpY2FsSXRlbXMoKS5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIHZvaWQgMCE9PQp0aGlzLl9jYWNoZSYmdm9pZCAwIT09dGhpcy5fY2FjaGVbYl19LmJpbmQodGhpcykpfSxfdW5jYWNoZWRQYWdlc0ZvclBoeXNpY2FsSXRlbXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcGFnZXNGb3JQaHlzaWNhbEl0ZW1zKCkuZmlsdGVyKGZ1bmN0aW9uKGIpe3JldHVybiB2b2lkIDAhPT10aGlzLl9jYWNoZSYmdm9pZCAwPT09dGhpcy5fY2FjaGVbYl19LmJpbmQodGhpcykpfSxfZWFnZXJseUxvYWRQYWdlczpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2NhY2hlZFBhZ2VzRm9yUGh5c2ljYWxJdGVtcygpLnNsaWNlKDApO2lmKDA8Yi5sZW5ndGgpe2Iuc29ydChmdW5jdGlvbihmLGgpe3JldHVybiBmPmh9KTt2YXIgZD1NYXRoLm1pbihiW2IubGVuZ3RoLTFdKzEsTWF0aC5tYXgoMCxNYXRoLmZsb29yKHRoaXMuc2l6ZS90aGlzLnBhZ2VTaXplKS0xKSk7dGhpcy5fbG9hZFBhZ2UoTWF0aC5tYXgoMCxiWzBdLTEpKTt0aGlzLl9sb2FkUGFnZShkKX19LF9wYWdlc0ZvclBoeXNpY2FsSXRlbXM6ZnVuY3Rpb24oKXtyZXR1cm5bdGhpcy5fZ2V0UGFnZUZvckluZGV4KHRoaXMuJC5zY3JvbGxlci5maXJzdFZpc2libGVJbmRleCsKdGhpcy4kLnNjcm9sbGVyLl92aWR4T2Zmc2V0KV0uY29uY2F0KHRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtcy5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIGIuaW5kZXh9KS5tYXAoZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuX2dldFBhZ2VGb3JJbmRleChiLmluZGV4KX0uYmluZCh0aGlzKSkpLnJlZHVjZShmdW5jdGlvbihiLGQpey0xPT09Yi5pbmRleE9mKGQpJiZiLnB1c2goZCk7cmV0dXJuIGJ9LFtdKX0sX3VwZGF0ZUl0ZW1zOmZ1bmN0aW9uKGIsZCl7Zm9yKHZhciBmPTA7Zjx0aGlzLnBhZ2VTaXplO2YrKyl7dmFyIGg9dGhpcy4kLnNjcm9sbGVyLl92aXJ0dWFsSW5kZXhUb0l0ZW1bYip0aGlzLnBhZ2VTaXplK2ZdO2gmJih0aGlzLl91cGRhdGVJdGVtKGgsZFtmXSksdGhpcy5kZWJvdW5jZSgidXBkYXRlLWhlaWdodHMiLGZ1bmN0aW9uKCl7dGhpcy4kLnNjcm9sbGVyLl91cGRhdGVNZXRyaWNzKCk7dGhpcy4kLnNjcm9sbGVyLl9wb3NpdGlvbkl0ZW1zKCk7dGhpcy4kLnNjcm9sbGVyLl91cGRhdGVTY3JvbGxlclNpemUoKX0sCjEpKX19LF9sb2FkUGFnZTpmdW5jdGlvbihiLGQpe2Q9ZHx8dGhpcy5fdXBkYXRlSXRlbXMuYmluZCh0aGlzKTtpZighdGhpcy5fY2FjaGVbYl0mJiF0aGlzLl9wZW5kaW5nUmVxdWVzdHNbYl0mJnRoaXMuZGF0YVByb3ZpZGVyKXt0aGlzLl9wZW5kaW5nUmVxdWVzdHNbYl09ITA7dmFyIGY9e3BhZ2U6YixwYWdlU2l6ZTp0aGlzLnBhZ2VTaXplLHNvcnRPcmRlcnM6dGhpcy5fbWFwU29ydGVycygpLGZpbHRlcnM6dGhpcy5fbWFwRmlsdGVycygpfTt0aGlzLmRhdGFQcm92aWRlcihmLGZ1bmN0aW9uKGgpe3RoaXMuX2NhY2hlW2JdPWg7ZGVsZXRlIHRoaXMuX3BlbmRpbmdSZXF1ZXN0c1tiXTtkKGIsaCk7dGhpcy5fbG9hZGluZz0wPHRoaXMuX3BlbmRpbmdSZXF1ZXN0cy5sZW5ndGg7dGhpcy5kZWJvdW5jZSgiY2hlY2stc2l6ZSIsdGhpcy5fY2hlY2tTaXplLDJFMyl9LmJpbmQodGhpcykpfX0sX2dldFBhZ2VGb3JJbmRleDpmdW5jdGlvbihiKXtyZXR1cm4gTWF0aC5mbG9vcihiL3RoaXMucGFnZVNpemUpfSwKY2xlYXJDYWNoZTpmdW5jdGlvbigpe3RoaXMuX2NhY2hlPXt9O3RoaXMuX3BlbmRpbmdSZXF1ZXN0cz17fTt0aGlzLiQuc2Nyb2xsZXIuaGFzRGF0YSYmdGhpcy4kLnNjcm9sbGVyLl91cGRhdGUoKTt0aGlzLl9mbHVzaEl0ZW1zRGVib3VuY2VyKCl9LF9mbHVzaEl0ZW1zRGVib3VuY2VyOmZ1bmN0aW9uKCl7dGhpcy5mbHVzaERlYm91bmNlcigibG9hZCIpfSxfcGFnZVNpemVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09ZCYmYiE9PWQmJnRoaXMuY2xlYXJDYWNoZSgpfSxfY2hlY2tTaXplOmZ1bmN0aW9uKCl7dm9pZCAwPT09dGhpcy5zaXplJiZjb25zb2xlLndhcm4oJ1RoZSBceDNjdmFhZGluLWdyaWRceDNlIG5lZWRzIGEgdmFsdWUgZm9yICJzaXplIiBwcm9wZXJ0eSBpbiBvcmRlciB0byBkaXNwbGF5IHJvd3MuJyl9LF9kYXRhUHJvdmlkZXJDaGFuZ2VkOmZ1bmN0aW9uKGIsZCl7dm9pZCAwIT09ZCYmdGhpcy5jbGVhckNhY2hlKCk7dGhpcy4kLnNjcm9sbGVyLmhhc0RhdGF8fAoodGhpcy5fbG9hZGluZz0hMCx0aGlzLl9sb2FkUGFnZSgwLGZ1bmN0aW9uKCl7dGhpcy4kLnNjcm9sbGVyLmhhc0RhdGE9ITB9LmJpbmQodGhpcykpKX19OwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXNlbGVjdGlvbi1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5TZWxlY3Rpb25CZWhhdmlvcj17cHJvcGVydGllczp7c2VsZWN0ZWRJdGVtczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sb2JzZXJ2ZXJzOlsiX3NlbGVjdGVkSXRlbXNDaGFuZ2VkKHNlbGVjdGVkSXRlbXMuKikiXSxsaXN0ZW5lcnM6eyJ0ZW1wbGF0ZS1pbnN0YW5jZS1jaGFuZ2VkIjoiX3RlbXBsYXRlSW5zdGFuY2VDaGFuZ2VkU2VsZWN0aW9uIn0sX3RlbXBsYXRlSW5zdGFuY2VDaGFuZ2VkU2VsZWN0aW9uOmZ1bmN0aW9uKGIpe2lmKCJzZWxlY3RlZCI9PT1iLmRldGFpbC5wcm9wKXt2YXIgZD1iLmRldGFpbC5pbnN0Lml0ZW07KHRoaXMuX2lzU2VsZWN0ZWQoZCk/dGhpcy5kZXNlbGVjdEl0ZW06dGhpcy5zZWxlY3RJdGVtKS5iaW5kKHRoaXMpKGQpO3RoaXMuZmlyZSgiaXJvbi1hbm5vdW5jZSIse3RleHQ6KHRoaXMuX2lzU2VsZWN0ZWQoZCk/IlNlbGVjdGVkIjoiRGVzZWxlY3RlZCIpKyIgUm93ICIrCihiLmRldGFpbC5pbnN0LmluZGV4KzEpKyIgb2YgIit0aGlzLnNpemV9KTtiLnN0b3BQcm9wYWdhdGlvbigpfX0sX2lzU2VsZWN0ZWQ6ZnVuY3Rpb24oYil7cmV0dXJuIHRoaXMuc2VsZWN0ZWRJdGVtcyYmLTE8dGhpcy5zZWxlY3RlZEl0ZW1zLmluZGV4T2YoYil9LHNlbGVjdEl0ZW06ZnVuY3Rpb24oYil7Yj10aGlzLl90YWtlSXRlbShiKTt0aGlzLl9pc1NlbGVjdGVkKGIpfHx0aGlzLnB1c2goInNlbGVjdGVkSXRlbXMiLGIpfSxkZXNlbGVjdEl0ZW06ZnVuY3Rpb24oYil7Yj10aGlzLl90YWtlSXRlbShiKTtiPXRoaXMuc2VsZWN0ZWRJdGVtcy5pbmRleE9mKGIpOy0xPGImJnRoaXMuc3BsaWNlKCJzZWxlY3RlZEl0ZW1zIixiLDEpfSxfdG9nZ2xlSXRlbTpmdW5jdGlvbihiKXtiPXRoaXMuX3Rha2VJdGVtKGIpOy0xPT09dGhpcy5zZWxlY3RlZEl0ZW1zLmluZGV4T2YoYik/dGhpcy5zZWxlY3RJdGVtKGIpOnRoaXMuZGVzZWxlY3RJdGVtKGIpfSxfdGFrZUl0ZW06ZnVuY3Rpb24oYil7cmV0dXJuIm51bWJlciI9PT0KdHlwZW9mIGImJjA8PWImJnRoaXMuaXRlbXMmJnRoaXMuaXRlbXMubGVuZ3RoPmI/dGhpcy5pdGVtc1tiXTpifSxfc2VsZWN0ZWRJdGVtc0NoYW5nZWQ6ZnVuY3Rpb24oYil7IXRoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxJdGVtc3x8InNlbGVjdGVkSXRlbXMiIT09Yi5wYXRoJiYic2VsZWN0ZWRJdGVtcy5zcGxpY2VzIiE9PWIucGF0aHx8dGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEl0ZW1zLmZvckVhY2goZnVuY3Rpb24oZCl7ZC5zZWxlY3RlZD10aGlzLl9pc1NlbGVjdGVkKGQuaXRlbSl9LmJpbmQodGhpcykpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQta2V5Ym9hcmQtbmF2aWdhdGlvbi1iZWhhdmlvci5odG1sLmpzCndpbmRvdy52YWFkaW49d2luZG93LnZhYWRpbnx8e307dmFhZGluLmVsZW1lbnRzPXZhYWRpbi5lbGVtZW50c3x8e307dmFhZGluLmVsZW1lbnRzLmdyaWQ9dmFhZGluLmVsZW1lbnRzLmdyaWR8fHt9Owp2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUtleWJvYXJkQmVoYXZpb3JJbXBsPXtob3N0QXR0cmlidXRlczp7cm9sZToiYXBwbGljYXRpb24iLHRhYmluZGV4OjB9LGtleUJpbmRpbmdzOnsiY3RybCtob21lIjoiX29uQ3RybEhvbWUiLCJjdHJsK2VuZCI6Il9vbkN0cmxFbmQiLGRvd246Il9vbkFycm93RG93biIsZW5kOiJfb25FbmQiLGVudGVyOiJfb25FbnRlciIsZXNjOiJfb25Fc2NhcGUiLGYyOiJfb25GMiIsaG9tZToiX29uSG9tZSIsbGVmdDoiX29uQXJyb3dMZWZ0IixwYWdlZG93bjoiX29uUGFnZURvd24iLHBhZ2V1cDoiX29uUGFnZVVwIixyaWdodDoiX29uQXJyb3dSaWdodCIsc3BhY2U6Il9vblNwYWNlIix0YWI6Il9vblRhYiIsdXA6Il9vbkFycm93VXAifSxhdHRhY2hlZDpmdW5jdGlvbigpe1BvbHltZXIuSXJvbkExMXlBbm5vdW5jZXIucmVxdWVzdEF2YWlsYWJpbGl0eSgpfSxwcm9wZXJ0aWVzOntfdmlydHVhbEZvY3VzOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3ZpcnR1YWxGb2N1c0NoYW5nZWQifSwKaW50ZXJhY3Rpbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LG5hdmlnYXRpbmc6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9fSxsaXN0ZW5lcnM6e2ZvY3VzOiJfb25Gb2N1cyIsImNlbGwtZm9jdXMiOiJfb25DZWxsRm9jdXMiLCJjZWxsLWNvbnRlbnQtZm9jdXMiOiJfb25DZWxsQ29udGVudEZvY3VzIn0scmVhZHk6ZnVuY3Rpb24oKXtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIixmdW5jdGlvbihiKXs5PT09Yi5rZXlDb2RlJiYodGhpcy5fdGFiYmVkPSEwKTs5PT09Yi5rZXlDb2RlJiZiLnNoaWZ0S2V5JiYodGhpcy5fc2hpZnRUYWJiZWQ9ITApfS5iaW5kKHRoaXMpLCEwKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXl1cCIsZnVuY3Rpb24oYil7OT09PWIua2V5Q29kZSYmKHRoaXMuX3RhYmJlZD0hMSk7OT09PWIua2V5Q29kZSYmYi5zaGlmdEtleSYmKHRoaXMuX3NoaWZ0VGFiYmVkPQohMSl9LmJpbmQodGhpcyksITApfSxfaXNGb290ZXJWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIDA8dGhpcy4kLmZvb3Rlci5fcm93cy5maWx0ZXIoZnVuY3Rpb24oYil7cmV0dXJuIWIuaGlkZGVufSkubGVuZ3RofSxfb25Gb2N1czpmdW5jdGlvbigpe3RoaXMuX3RhYmJlZCYmIXRoaXMuX3NoaWZ0VGFiYmVkJiZ0aGlzLl9hY3RpdmF0ZU5hdmlnYXRpb24oKX0sX2FjdGl2YXRlTmF2aWdhdGlvbjpmdW5jdGlvbigpe3RoaXMuJC5mb290ZXJGb2N1c1RyYXAuZm9jdXMoKX0sX29uRm9jdXNvdXQ6ZnVuY3Rpb24oKXt0aGlzLmludGVyYWN0aW5nPXRoaXMubmF2aWdhdGluZz0hMX0sX29uRm9vdGVyRm9jdXM6ZnVuY3Rpb24oKXt0aGlzLm5hdmlnYXRpbmc9ITA7dGhpcy5pbnRlcmFjdGluZz0hMTt0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy5fdmlydHVhbEZvY3VzfHwodGhpcy5fc2hpZnRUYWJiZWQ/dGhpcy5faXNGb290ZXJWaXNpYmxlKCk/dGhpcy4kLmZvb3Rlcjp0aGlzLiQuaXRlbXM6CnRoaXMuJC5oZWFkZXIpfSxfdmlydHVhbEZvY3VzQ2hhbmdlZDpmdW5jdGlvbihiLGQpe2QmJihkLmZvY3VzZWQ9ITEpO2ImJihiLl9mb2N1c2VkQ2VsbEluZGV4PWIuX2ZvY3VzZWRDZWxsSW5kZXh8fDAsYi5fZm9jdXNlZFJvd0luZGV4PWIuX2ZvY3VzZWRSb3dJbmRleHx8MCxiLmZvY3VzZWQ9ITAsYj09PXRoaXMuJC5pdGVtcyYmdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uVGFiOmZ1bmN0aW9uKGIpe2lmKCF0aGlzLmludGVyYWN0aW5nJiZ0aGlzLl92aXJ0dWFsRm9jdXMpaWYodGhpcy5uYXZpZ2F0aW5nKWlmKGIuZGV0YWlsLmtleWJvYXJkRXZlbnQuc2hpZnRLZXkpc3dpdGNoKHRoaXMuX3ZpcnR1YWxGb2N1cyl7Y2FzZSB0aGlzLiQuZm9vdGVyOnRoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLiQuaXRlbXM7Yi5wcmV2ZW50RGVmYXVsdCgpO2JyZWFrO2Nhc2UgdGhpcy4kLml0ZW1zOnRoaXMuX3ZpcnR1YWxGb2N1cz10aGlzLiQuaGVhZGVyO2IucHJldmVudERlZmF1bHQoKTsKYnJlYWs7Y2FzZSB0aGlzLiQuaGVhZGVyOnRoaXMuZm9jdXMoKSx0aGlzLl92aXJ0dWFsRm9jdXM9bnVsbH1lbHNlIHN3aXRjaCh0aGlzLl92aXJ0dWFsRm9jdXMpe2Nhc2UgdGhpcy4kLmhlYWRlcjp0aGlzLl92aXJ0dWFsRm9jdXM9dGhpcy4kLml0ZW1zO2IucHJldmVudERlZmF1bHQoKTticmVhaztjYXNlIHRoaXMuJC5pdGVtczp0aGlzLl9pc0Zvb3RlclZpc2libGUoKT8odGhpcy5fdmlydHVhbEZvY3VzPXRoaXMuJC5mb290ZXIsYi5wcmV2ZW50RGVmYXVsdCgpKTp0aGlzLmFzeW5jKGZ1bmN0aW9uKCl7dGhpcy5fdmlydHVhbEZvY3VzPW51bGx9LDEpO2JyZWFrO2Nhc2UgdGhpcy4kLmZvb3Rlcjp0aGlzLl92aXJ0dWFsRm9jdXM9bnVsbH1lbHNlIHRoaXMuX2FjdGl2YXRlTmF2aWdhdGlvbigpLGIucHJldmVudERlZmF1bHQoKX0sX2lzQWJvdmVWaWV3cG9ydDpmdW5jdGlvbihiKXtyZXR1cm4gdGhpcy5maXJzdFZpc2libGVJbmRleD5ifSxfb25BcnJvd0Rvd246ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8CihiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0Rvd24oKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfc2Nyb2xsUGFnZURvd246ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy4kLmZvb3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3ArPWQudG9wLWIuYm90dG9tO3RoaXMuJC5zY3JvbGxlci5fc2Nyb2xsSGFuZGxlcigpfSxfb25QYWdlRG93bjpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXM9PT10aGlzLiQuaXRlbXM/KGI9dGhpcy4kLnNjcm9sbGVyLmxhc3RWaXNpYmxlSW5kZXgsdGhpcy5fc2Nyb2xsUGFnZURvd24oKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleCs9CnRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LWJ8fHRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4LHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSk6dGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzUGFnZURvd24oKSl9LF9zY3JvbGxQYWdlVXA6ZnVuY3Rpb24oKXt2YXIgYj10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGQ9dGhpcy4kLmZvb3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3AtPWQudG9wLWIuYm90dG9tO3RoaXMuJC5zY3JvbGxlci5fc2Nyb2xsSGFuZGxlcigpfSxfb25QYWdlVXA6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzPT09dGhpcy4kLml0ZW1zPyhiPXRoaXMuJC5zY3JvbGxlci5sYXN0VmlzaWJsZUluZGV4LAp0aGlzLl9zY3JvbGxQYWdlVXAoKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3dJbmRleC09Yi10aGlzLiQuc2Nyb2xsZXIubGFzdFZpc2libGVJbmRleHx8dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkUm93SW5kZXgsdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKTp0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNQYWdlVXAoKSl9LF9vbkFycm93VXA6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzVXAoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25BcnJvd1JpZ2h0OmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c1JpZ2h0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sCl9vbkFycm93TGVmdDpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNMZWZ0KCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uSG9tZTpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nfHwoYi5wcmV2ZW50RGVmYXVsdCgpLHRoaXMubmF2aWdhdGluZz0hMCx0aGlzLl92aXJ0dWFsRm9jdXMuZm9jdXNIb21lKCksdGhpcy5fZW5zdXJlVmlydHVhbEZvY3VzSW5WaWV3cG9ydCgpKX0sX29uRW5kOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0VuZCgpLHRoaXMuX2Vuc3VyZVZpcnR1YWxGb2N1c0luVmlld3BvcnQoKSl9LF9tb3ZlRm9jdXNUb0ZvY3VzVGFyZ2V0OmZ1bmN0aW9uKCl7dmFyIGI9dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbC5fY2VsbENvbnRlbnQ7CihiPWIucXVlcnlTZWxlY3RvcigiW2ZvY3VzLXRhcmdldF0iKXx8Yi5maXJzdEVsZW1lbnRDaGlsZCkmJmIuZm9jdXMoKX0sX29uRW50ZXI6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZz8iaW5wdXQiPT09Yi5kZXRhaWwua2V5Ym9hcmRFdmVudC50YXJnZXQubG9jYWxOYW1lJiYidGV4dCI9PT1iLmRldGFpbC5rZXlib2FyZEV2ZW50LnRhcmdldC50eXBlJiZ0aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCk6KGIucHJldmVudERlZmF1bHQoKSx0aGlzLl9tb3ZlRm9jdXNUb0ZvY3VzVGFyZ2V0KCkpfSxfb25Fc2NhcGU6ZnVuY3Rpb24oKXt0aGlzLmludGVyYWN0aW5nP3RoaXMuJC5mb290ZXJGb2N1c1RyYXAuZm9jdXMoKTp0aGlzLm5hdmlnYXRpbmcmJih0aGlzLm5hdmlnYXRpbmc9ITEpfSxfb25GMjpmdW5jdGlvbihiKXtiLnByZXZlbnREZWZhdWx0KCk7dGhpcy5pbnRlcmFjdGluZz90aGlzLiQuZm9vdGVyRm9jdXNUcmFwLmZvY3VzKCk6dGhpcy5fbW92ZUZvY3VzVG9Gb2N1c1RhcmdldCgpfSwKX29uQ3RybEhvbWU6ZnVuY3Rpb24oYil7dGhpcy5pbnRlcmFjdGluZ3x8KGIucHJldmVudERlZmF1bHQoKSx0aGlzLm5hdmlnYXRpbmc9ITAsdGhpcy5fdmlydHVhbEZvY3VzLmZvY3VzRmlyc3QoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25DdHJsRW5kOmZ1bmN0aW9uKGIpe3RoaXMuaW50ZXJhY3Rpbmd8fChiLnByZXZlbnREZWZhdWx0KCksdGhpcy5uYXZpZ2F0aW5nPSEwLHRoaXMuX3ZpcnR1YWxGb2N1cy5mb2N1c0xhc3QoKSx0aGlzLl9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0KCkpfSxfb25TcGFjZTpmdW5jdGlvbihiKXtpZighdGhpcy5pbnRlcmFjdGluZyl7Yi5wcmV2ZW50RGVmYXVsdCgpO2I9dGhpcy5fdmlydHVhbEZvY3VzLl9mb2N1c2VkQ2VsbDt2YXIgZD1iLmdldENvbnRlbnRDaGlsZHJlbihQb2x5bWVyLkVsZW1lbnQ/InNsb3QiOiJjb250ZW50IilbMF0uZmlyc3RFbGVtZW50Q2hpbGQ7ZD9kLmNsaWNrKCk6dGhpcy5uYXZpZ2F0aW5nJiYKdGhpcy5maXJlKCJjZWxsLWFjdGl2YXRlIix7bW9kZWw6Yi5pbnN0YW5jZX0pfX0sX29uQ2VsbENvbnRlbnRGb2N1czpmdW5jdGlvbihiKXt0aGlzLmludGVyYWN0aW5nPSEwO3RoaXMuX29uQ2VsbEZvY3VzKGIpfSxfb25DZWxsRm9jdXM6ZnVuY3Rpb24oYil7Yj1iLmRldGFpbC5jZWxsO3ZhciBkPWIucGFyZW50RWxlbWVudCxmPWQucGFyZW50RWxlbWVudCxoPUFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoUG9seW1lci5kb20oZikuY2hpbGRyZW4sZCk7Zj09PXRoaXMuJC5pdGVtcyYmKGg9ZC5pbmRleCk7Zi5fZm9jdXNlZFJvd0luZGV4PWg7Zi5fZm9jdXNlZENlbGxJbmRleD1BcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKFBvbHltZXIuZG9tKGQpLmNoaWxkcmVuLGIpO3RoaXMuX3ZpcnR1YWxGb2N1cz1mO2IuaGFzQXR0cmlidXRlKCJkZXRhaWxzY2VsbCIpJiYoZi5fZm9jdXNlZENlbGxJbmRleD0wLGYuX21vdmVGb2N1c1RvRGV0YWlsc0NlbGwoKSl9LF9lbnN1cmVWaXJ0dWFsRm9jdXNJblZpZXdwb3J0OmZ1bmN0aW9uKCl7dmFyIGI9CnRoaXMuJC5zY3JvbGxlci5fdmlkeE9mZnNldCt0aGlzLiQuc2Nyb2xsZXIuX3ZpcnR1YWxTdGFydCxkPXRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZFJvd0luZGV4O3RoaXMuX3ZpcnR1YWxGb2N1cz09PXRoaXMuJC5pdGVtcyYmKGQ8Ynx8ZD5iK3RoaXMuJC5zY3JvbGxlci5fcGh5c2ljYWxDb3VudCkmJih0aGlzLiQuc2Nyb2xsZXIuc2Nyb2xsVG9TY2FsZWRJbmRleChkKSx0aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRDZWxsQ2hhbmdlZChkLHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGxJbmRleCkpO3RoaXMuX2Vuc3VyZUVsZW1lbnRJblZpZXdwb3J0KHRoaXMuX3ZpcnR1YWxGb2N1cy5fZm9jdXNlZENlbGwpfSxfZW5zdXJlRWxlbWVudEluVmlld3BvcnQ6ZnVuY3Rpb24oYil7dmFyIGQ9Yi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZih0aGlzLl92aXJ0dWFsRm9jdXM9PT10aGlzLiQuaXRlbXMpe3ZhciBmPXRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLApoPXRoaXMuJC5oZWFkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO2QuYm90dG9tPmY/dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsVG9wKz1kLmJvdHRvbS1mOmQudG9wPGgmJih0aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5zY3JvbGxUb3ArPWQudG9wLWgpfWlmKCFiLmhhc0F0dHJpYnV0ZSgiZGV0YWlsc2NlbGwiKSl7Yj10aGlzLiQuc2Nyb2xsZXIuJC50YWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDtmPXRoaXMuJC5zY3JvbGxlci4kLnRhYmxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7aWYoaD10aGlzLl92aXJ0dWFsRm9jdXMuX2ZvY3VzZWRSb3cucXVlcnlTZWxlY3RvcigiW2xhc3QtZnJvemVuXSIpKWY9aC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodDtkLnJpZ2h0PmI/dGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsTGVmdCs9ZC5yaWdodC1iOmQubGVmdDxmJiYodGhpcy4kLnNjcm9sbGVyLiQudGFibGUuc2Nyb2xsTGVmdCs9CmQubGVmdC1mKX19fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUtleWJvYXJkQmVoYXZpb3I9W3ZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlS2V5Ym9hcmRCZWhhdmlvckltcGwsUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcl07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtY29sdW1uLXJlb3JkZXJpbmctYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5SZW9yZGVyaW5nQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2NvbHVtblJlb3JkZXJpbmdBbGxvd2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fX07CnZhYWRpbi5lbGVtZW50cy5ncmlkLlRhYmxlQ29sdW1uUmVvcmRlcmluZ0JlaGF2aW9yPXtwcm9wZXJ0aWVzOntfb3JkZXJCYXNlU2NvcGU6e3R5cGU6TnVtYmVyLHZhbHVlOjFFN319LGxpc3RlbmVyczp7ZHJhZ3N0YXJ0OiJfb25EcmFnU3RhcnQiLGRyYWdvdmVyOiJfb25EcmFnT3ZlciIsZHJhZ2VuZDoiX29uRHJhZ0VuZCJ9LG9ic2VydmVyczpbIl91cGRhdGVPcmRlcnMoY29sdW1uVHJlZSwgY29sdW1uVHJlZS4qKSJdLF91cGRhdGVPcmRlcnM6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiZiWzBdLmZvckVhY2goZnVuY3Rpb24oZixoKXtmLl9vcmRlcj0oaCsxKSp0aGlzLl9vcmRlckJhc2VTY29wZX0sdGhpcyl9LF9vbkRyYWdTdGFydDpmdW5jdGlvbihiKXtpZigidmFhZGluLWdyaWQtY2VsbC1jb250ZW50Ij09PWIudGFyZ2V0LmxvY2FsTmFtZSl7dmFyIGQ9dGhpcy5fZ2V0Q2VsbEJ5Q2VsbENvbnRlbnQoYi50YXJnZXQpO2QmJih0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgicmVvcmRlcmluZyIsCiEwKSx0aGlzLl9kcmFnZ2VkQ29sdW1uPWQuY29sdW1uLHRoaXMuX3NldFNpYmxpbmdzUmVvcmRlclN0YXR1cyh0aGlzLl9kcmFnZ2VkQ29sdW1uLCJhbGxvd2VkIiksdGhpcy5fZHJhZ2dlZENvbHVtbi5fcmVvcmRlclN0YXR1cz0iZHJhZ2dpbmciLGIuZGF0YVRyYW5zZmVyJiYoYi5kYXRhVHJhbnNmZXIuc2V0RGF0YSgidGV4dCIsIiIpLGIuZGF0YVRyYW5zZmVyLmVmZmVjdEFsbG93ZWQ9Im1vdmUiKSx0aGlzLl9hdXRvU2Nyb2xsZXIoKSl9fSxfc2V0U2libGluZ3NSZW9yZGVyU3RhdHVzOmZ1bmN0aW9uKGIsZCl7QXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKFBvbHltZXIuZG9tKFBvbHltZXIuZG9tKGIpLnBhcmVudE5vZGUpLmNoaWxkcmVuLGZ1bmN0aW9uKGYpe3JldHVybi9jb2x1bW4vLnRlc3QoZi5sb2NhbE5hbWUpJiZ0aGlzLl9pc1N3YXBBbGxvd2VkKGYsYil9LHRoaXMpLmZvckVhY2goZnVuY3Rpb24oZil7Zi5fcmVvcmRlclN0YXR1cz1kfSl9LF9vbkRyYWdPdmVyOmZ1bmN0aW9uKGIpe2lmKHRoaXMuX2RyYWdnZWRDb2x1bW4pe3ZhciBkPQooUG9seW1lci5FbGVtZW50P2IuY29tcG9zZWRQYXRoKCk6UG9seW1lci5kb20oYikucGF0aCkuZmlsdGVyKGZ1bmN0aW9uKGYpe3JldHVybiJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiPT09Zi5sb2NhbE5hbWV9KVswXTtkJiYoYi5wcmV2ZW50RGVmYXVsdCgpLGQ9dGhpcy5fZ2V0Q2VsbEJ5Q2VsbENvbnRlbnQoZCksKGQ9dGhpcy5fZ2V0VGFyZ2V0Q29sdW1uKGQsdGhpcy5fZHJhZ2dlZENvbHVtbikpJiZ0aGlzLl9pc1N3YXBBbGxvd2VkKHRoaXMuX2RyYWdnZWRDb2x1bW4sZCkmJnRoaXMuX2lzU3dhcHBhYmxlQnlQb3NpdGlvbihkLGIuY2xpZW50WCkmJnRoaXMuX3N3YXBDb2x1bW5PcmRlcnModGhpcy5fZHJhZ2dlZENvbHVtbixkKSx0aGlzLl9sYXN0RHJhZ0NsaWVudFg9Yi5jbGllbnRYKX19LF9hdXRvU2Nyb2xsZXI6ZnVuY3Rpb24oKXtpZih0aGlzLl9sYXN0RHJhZ0NsaWVudFgpe3ZhciBiPXRoaXMuX2xhc3REcmFnQ2xpZW50WC10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0Kwo1MCxkPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdC10aGlzLl9sYXN0RHJhZ0NsaWVudFgrNTA7MDxiP3RoaXMuJC50YWJsZS5zY3JvbGxMZWZ0Kz1iLzEwOjA8ZCYmKHRoaXMuJC50YWJsZS5zY3JvbGxMZWZ0LT1kLzEwKTt0aGlzLl9zY3JvbGxIYW5kbGVyKCl9dGhpcy5fZHJhZ2dlZENvbHVtbiYmdGhpcy5hc3luYyh0aGlzLl9hdXRvU2Nyb2xsZXIsMTApfSxfb25EcmFnRW5kOmZ1bmN0aW9uKCl7dGhpcy5fZHJhZ2dlZENvbHVtbiYmKHRoaXMudG9nZ2xlQXR0cmlidXRlKCJyZW9yZGVyaW5nIiwhMSksdGhpcy5fZHJhZ2dlZENvbHVtbi5fcmVvcmRlclN0YXR1cz0iIix0aGlzLl9zZXRTaWJsaW5nc1Jlb3JkZXJTdGF0dXModGhpcy5fZHJhZ2dlZENvbHVtbiwiIiksdGhpcy5fbGFzdERyYWdDbGllbnRYPXRoaXMuX2RyYWdnZWRDb2x1bW49bnVsbCl9LF9pc1N3YXBBbGxvd2VkOmZ1bmN0aW9uKGIsZCl7aWYoYiYmZCl7dmFyIGY9Yi5wYXJlbnRFbGVtZW50PT09ZC5wYXJlbnRFbGVtZW50LApoPWIuZnJvemVuPT09ZC5mcm96ZW47cmV0dXJuIGIhPT1kJiZmJiZofX0sX2lzU3dhcHBhYmxlQnlQb3NpdGlvbjpmdW5jdGlvbihiLGQpe3ZhciBmPUFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbSh0aGlzLiQuaGVhZGVyKS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtY2VsbCIpLGZ1bmN0aW9uKGspe3JldHVybiBrLmNvbHVtbj09PWJ9KVswXSxoPXRoaXMuJC5oZWFkZXIucXVlcnlTZWxlY3RvcigiW3Jlb3JkZXItc3RhdHVzXHgzZGRyYWdnaW5nXSIpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiBmLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ+aC5sZWZ0P2Q+Zi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodC1oLndpZHRoOmQ8Zi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0K2gud2lkdGh9LF9nZXRDZWxsQnlDZWxsQ29udGVudDpmdW5jdGlvbihiKXtpZihQb2x5bWVyLkVsZW1lbnQpcmV0dXJuIGIuYXNzaWduZWRTbG90LnBhcmVudE5vZGU7CmI9UG9seW1lci5kb20oYikuZ2V0RGVzdGluYXRpb25JbnNlcnRpb25Qb2ludHMoKVswXTtyZXR1cm4gUG9seW1lci5kb20oYikucGFyZW50Tm9kZX0sX3N3YXBDb2x1bW5PcmRlcnM6ZnVuY3Rpb24oYixkKXt2YXIgZj1iLl9vcmRlcjtiLl9vcmRlcj1kLl9vcmRlcjtkLl9vcmRlcj1mO3RoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKTt0aGlzLl91cGRhdGVMYXN0Q29sdW1uKCl9LF9nZXRUYXJnZXRDb2x1bW46ZnVuY3Rpb24oYixkKXtpZihiJiZkKXtmb3IodmFyIGY9Yi5jb2x1bW47Zi5wYXJlbnRFbGVtZW50IT09ZC5wYXJlbnRFbGVtZW50JiZmIT09dGhpcy50YXJnZXQ7KWY9Zi5wYXJlbnRFbGVtZW50O3JldHVybiBmLnBhcmVudEVsZW1lbnQ9PT1kLnBhcmVudEVsZW1lbnQ/ZjpiLmNvbHVtbn19fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC9pcm9uLWxpc3QtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuSXJvbkxpc3RCZWhhdmlvckltcGw9ZnVuY3Rpb24oKXt2YXIgYj1uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pLGQ9YiYmODw9YlsxXTtyZXR1cm57aXM6Imlyb24tbGlzdCIscHJvcGVydGllczp7bWF4UGh5c2ljYWxDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6NTAwfSxhczp7dHlwZTpTdHJpbmcsdmFsdWU6Iml0ZW0ifSxpbmRleEFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaW5kZXgifX0sX3JhdGlvOi41LF9zY3JvbGxlclBhZGRpbmdUb3A6MCxfc2Nyb2xsUG9zaXRpb246MCxfcGh5c2ljYWxTaXplOjAsX3BoeXNpY2FsQXZlcmFnZTowLF9waHlzaWNhbEF2ZXJhZ2VDb3VudDowLF9waHlzaWNhbFRvcDowLF92aXJ0dWFsQ291bnQ6MCxfcGh5c2ljYWxJbmRleEZvcktleTpudWxsLF9lc3RTY3JvbGxIZWlnaHQ6MCxfc2Nyb2xsSGVpZ2h0OjAsX3ZpZXdwb3J0SGVpZ2h0OjAsX3ZpZXdwb3J0V2lkdGg6MCwKX3BoeXNpY2FsSXRlbXM6bnVsbCxfcGh5c2ljYWxTaXplczpudWxsLF9maXJzdFZpc2libGVJbmRleFZhbDpudWxsLF9sYXN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2NvbGxlY3Rpb246bnVsbCxfaXRlbXNSZW5kZXJlZDohMSxfbGFzdFBhZ2U6bnVsbCxfbWF4UGFnZXM6MyxfaXRlbXNQZXJSb3c6MSxfaXRlbVdpZHRoOjAsX3Jvd0hlaWdodDowLGdldCBfcGh5c2ljYWxCb3R0b20oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fcGh5c2ljYWxTaXplfSxnZXQgX3Njcm9sbEJvdHRvbSgpe3JldHVybiB0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF92aXJ0dWFsRW5kKCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTF9LGdldCBfaGlkZGVuQ29udGVudFNpemUoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTaXplLXRoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX21heFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLl9lc3RTY3JvbGxIZWlnaHQtCnRoaXMuX3ZpZXdwb3J0SGVpZ2h0K3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcH0sX21pblZpcnR1YWxTdGFydDowLGdldCBfbWF4VmlydHVhbFN0YXJ0KCl7cmV0dXJuIE1hdGgubWF4KDAsdGhpcy5fdmlydHVhbENvdW50LXRoaXMuX3BoeXNpY2FsQ291bnQpfSxfdmlydHVhbFN0YXJ0VmFsOjAsc2V0IF92aXJ0dWFsU3RhcnQoZil7dGhpcy5fdmlydHVhbFN0YXJ0VmFsPU1hdGgubWluKHRoaXMuX21heFZpcnR1YWxTdGFydCxNYXRoLm1heCh0aGlzLl9taW5WaXJ0dWFsU3RhcnQsZikpfSxnZXQgX3ZpcnR1YWxTdGFydCgpe3JldHVybiB0aGlzLl92aXJ0dWFsU3RhcnRWYWx8fDB9LF9waHlzaWNhbFN0YXJ0VmFsOjAsc2V0IF9waHlzaWNhbFN0YXJ0KGYpe3RoaXMuX3BoeXNpY2FsU3RhcnRWYWw9ZiV0aGlzLl9waHlzaWNhbENvdW50OzA+dGhpcy5fcGh5c2ljYWxTdGFydFZhbCYmKHRoaXMuX3BoeXNpY2FsU3RhcnRWYWw9dGhpcy5fcGh5c2ljYWxDb3VudCt0aGlzLl9waHlzaWNhbFN0YXJ0VmFsKTsKdGhpcy5fcGh5c2ljYWxFbmQ9KHRoaXMuX3BoeXNpY2FsU3RhcnQrdGhpcy5fcGh5c2ljYWxDb3VudC0xKSV0aGlzLl9waHlzaWNhbENvdW50fSxnZXQgX3BoeXNpY2FsU3RhcnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTdGFydFZhbHx8MH0sX3BoeXNpY2FsQ291bnRWYWw6MCxzZXQgX3BoeXNpY2FsQ291bnQoZil7dGhpcy5fcGh5c2ljYWxDb3VudFZhbD1mO3RoaXMuX3BoeXNpY2FsRW5kPSh0aGlzLl9waHlzaWNhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMSkldGhpcy5fcGh5c2ljYWxDb3VudH0sZ2V0IF9waHlzaWNhbENvdW50KCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsQ291bnRWYWx9LF9waHlzaWNhbEVuZDowLGdldCBfb3B0UGh5c2ljYWxTaXplKCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0SGVpZ2h0KnRoaXMuX21heFBhZ2VzfSxnZXQgX29wdFBoeXNpY2FsQ291bnQoKXtyZXR1cm4gdGhpcy5fZXN0Um93c0luVmlldyp0aGlzLl9pdGVtc1BlclJvdyp0aGlzLl9tYXhQYWdlc30sCmdldCBfaXNWaXNpYmxlKCl7cmV0dXJuIHRoaXMuc2Nyb2xsVGFyZ2V0JiYhKCF0aGlzLnNjcm9sbFRhcmdldC5vZmZzZXRXaWR0aCYmIXRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodCl9LGdldCBmaXJzdFZpc2libGVJbmRleCgpe2lmKG51bGw9PT10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbCl7dmFyIGY9TWF0aC5mbG9vcih0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3ApO3RoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPXRoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihoLGspe2YrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChoKTtpZihmPnRoaXMuX3Njcm9sbFBvc2l0aW9uKXJldHVybiBrfSl8fDB9cmV0dXJuIHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsfSxnZXQgbGFzdFZpc2libGVJbmRleCgpe2lmKG51bGw9PT10aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsKXt2YXIgZj10aGlzLl9waHlzaWNhbFRvcDt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oaCwKayl7aWYoZjx0aGlzLl9zY3JvbGxCb3R0b20pdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1rO2Vsc2UgcmV0dXJuITA7Zis9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGgpfSl9cmV0dXJuIHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWx9LGdldCBfZGVmYXVsdFNjcm9sbFRhcmdldCgpe3JldHVybiB0aGlzfSxnZXQgX3ZpcnR1YWxSb3dDb3VudCgpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fdmlydHVhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9lc3RSb3dzSW5WaWV3KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aWV3cG9ydEhlaWdodC90aGlzLl9yb3dIZWlnaHQpfSxnZXQgX3BoeXNpY2FsUm93cygpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fcGh5c2ljYWxDb3VudC90aGlzLl9pdGVtc1BlclJvdyl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKTt0aGlzLl9yZW5kZXIoKTt0aGlzLmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsCiJfcmVzaXplSGFuZGxlciIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2l0ZW1zUmVuZGVyZWQ9ITE7dGhpcy51bmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsIl9yZXNpemVIYW5kbGVyIil9LHVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllczpmdW5jdGlvbigpe3RoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcD10aGlzLnNjcm9sbFRhcmdldD09PXRoaXM/MDpwYXJzZUludCh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKVsicGFkZGluZy10b3AiXXx8MCwxMCk7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0fSxfdXBkYXRlOmZ1bmN0aW9uKGYsaCl7dGhpcy5fYXNzaWduTW9kZWxzKGYpO3RoaXMuX3VwZGF0ZU1ldHJpY3MoZik7aWYoaClmb3IoO2gubGVuZ3RoOylmPWgucG9wKCksdGhpcy5fcGh5c2ljYWxUb3AtPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChmKTt0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7dGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCk7CnRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKCl9LF9pbmNyZWFzZVBvb2xJZk5lZWRlZDpmdW5jdGlvbigpe2lmKDA9PT10aGlzLl92aWV3cG9ydEhlaWdodClyZXR1cm4hMTt2YXIgZj10aGlzLl9waHlzaWNhbFNpemVzLnJlZHVjZShmdW5jdGlvbihrLHQpe3JldHVybiBrKyh0fHwxMDApfSwwKSxoPWY+dGhpcy5fdmlld3BvcnRIZWlnaHQ7aWYoZj49dGhpcy5fb3B0UGh5c2ljYWxTaXplJiZoKXJldHVybiExO2Y9TWF0aC5mbG9vcih0aGlzLl9waHlzaWNhbFNpemUvdGhpcy5fdmlld3BvcnRIZWlnaHQpOzA9PT1mP3RoaXMuX2RlYm91bmNlVGVtcGxhdGUodGhpcy5faW5jcmVhc2VQb29sLmJpbmQodGhpcyxNYXRoLnJvdW5kKC41KnRoaXMuX3BoeXNpY2FsQ291bnQpKSk6dGhpcy5fbGFzdFBhZ2UhPT1mJiZoP1BvbHltZXIuZG9tLmFkZERlYm91bmNlcih0aGlzLmRlYm91bmNlKCJfZGVib3VuY2VUZW1wbGF0ZSIsdGhpcy5faW5jcmVhc2VQb29sLmJpbmQodGhpcyx0aGlzLl9pdGVtc1BlclJvdyksCjE2KSk6dGhpcy5fZGVib3VuY2VUZW1wbGF0ZSh0aGlzLl9pbmNyZWFzZVBvb2wuYmluZCh0aGlzLE1hdGguY2VpbCh0aGlzLl92aWV3cG9ydEhlaWdodC8odGhpcy5fcGh5c2ljYWxTaXplL3RoaXMuX3BoeXNpY2FsQ291bnQpKnRoaXMuX21heFBhZ2VzLXRoaXMuX3BoeXNpY2FsQ291bnQpfHwxKSk7dGhpcy5fbGFzdFBhZ2U9ZjtyZXR1cm4hMH0sX2RlYm91bmNlVGVtcGxhdGU6ZnVuY3Rpb24oZil7UG9seW1lci5kb20uYWRkRGVib3VuY2VyKHRoaXMuZGVib3VuY2UoIl9kZWJvdW5jZVRlbXBsYXRlIixmKSl9LF9pbmNyZWFzZVBvb2w6ZnVuY3Rpb24oZil7dmFyIGg9dGhpcy5fcGh5c2ljYWxDb3VudDtmPU1hdGgubWluKHRoaXMuX3BoeXNpY2FsQ291bnQrZix0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fdmlydHVhbFN0YXJ0LE1hdGgubWF4KHRoaXMubWF4UGh5c2ljYWxDb3VudCwyNSkpLWg7MD49Znx8KFtdLnB1c2guYXBwbHkodGhpcy5fcGh5c2ljYWxJdGVtcyx0aGlzLl9jcmVhdGVQb29sKGYpKSwKW10ucHVzaC5hcHBseSh0aGlzLl9waHlzaWNhbFNpemVzLEFycmF5KGYpKSx0aGlzLl9waHlzaWNhbENvdW50PWgrZix0aGlzLl91cGRhdGUoKSl9LF9yZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZj0wPHRoaXMuX3ZpcnR1YWxDb3VudHx8MDx0aGlzLl9waHlzaWNhbENvdW50O3RoaXMuaXNBdHRhY2hlZCYmIXRoaXMuX2l0ZW1zUmVuZGVyZWQmJnRoaXMuX2lzVmlzaWJsZSYmZiYmKHRoaXMuX2xhc3RQYWdlPTAsdGhpcy5fdXBkYXRlKCksdGhpcy5faXRlbXNSZW5kZXJlZD0hMCl9LF9pdGVyYXRlSXRlbXM6ZnVuY3Rpb24oZixoKXt2YXIgayx0O2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiZoKWZvcih0PTA7dDxoLmxlbmd0aDt0Kyspe3ZhciBsPWhbdF07dmFyIHA9dGhpcy5fY29tcHV0ZVZpZHgobCk7aWYobnVsbCE9KGs9Zi5jYWxsKHRoaXMsbCxwKSkpcmV0dXJuIGt9ZWxzZXtsPXRoaXMuX3BoeXNpY2FsU3RhcnQ7Zm9yKHA9dGhpcy5fdmlydHVhbFN0YXJ0O2w8dGhpcy5fcGh5c2ljYWxDb3VudDtsKyssCnArKylpZihudWxsIT0oaz1mLmNhbGwodGhpcyxsLHApKSlyZXR1cm4gaztmb3IobD0wO2w8dGhpcy5fcGh5c2ljYWxTdGFydDtsKysscCsrKWlmKG51bGwhPShrPWYuY2FsbCh0aGlzLGwscCkpKXJldHVybiBrfX0sX2NvbXB1dGVWaWR4OmZ1bmN0aW9uKGYpe3JldHVybiBmPj10aGlzLl9waHlzaWNhbFN0YXJ0P3RoaXMuX3ZpcnR1YWxTdGFydCsoZi10aGlzLl9waHlzaWNhbFN0YXJ0KTp0aGlzLl92aXJ0dWFsU3RhcnQrKHRoaXMuX3BoeXNpY2FsQ291bnQtdGhpcy5fcGh5c2ljYWxTdGFydCkrZn0sX3VwZGF0ZU1ldHJpY3M6ZnVuY3Rpb24oZil7dGhpcy5zY3JvbGxpbmcmJlBvbHltZXIuZG9tLmZsdXNoKCk7dmFyIGg9MCxrPTAsdD10aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCxsPXRoaXMuX3BoeXNpY2FsQXZlcmFnZTt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24ocCl7ays9dGhpcy5fcGh5c2ljYWxTaXplc1twXXx8MDt0aGlzLl9waHlzaWNhbFNpemVzW3BdPXRoaXMuX3BoeXNpY2FsSXRlbXNbcF0ub2Zmc2V0SGVpZ2h0OwpoKz10aGlzLl9waHlzaWNhbFNpemVzW3BdO3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50Kz10aGlzLl9waHlzaWNhbFNpemVzW3BdPzE6MH0sZik7dGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0O3RoaXMuX3BoeXNpY2FsU2l6ZT10aGlzLl9waHlzaWNhbFNpemUraC1rO3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50IT09dCYmKHRoaXMuX3BoeXNpY2FsQXZlcmFnZT1NYXRoLnJvdW5kKChsKnQraCkvdGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQpKX0sX3Bvc2l0aW9uSXRlbXM6ZnVuY3Rpb24oKXt0aGlzLl9hZGp1c3RTY3JvbGxQb3NpdGlvbigpO3ZhciBmPXRoaXMuX3BoeXNpY2FsVG9wO3RoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihoKXt0aGlzLl9waHlzaWNhbEl0ZW1zW2hdLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoMCxmKTtmKz10aGlzLl9waHlzaWNhbFNpemVzW2hdfSl9LF9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQ6ZnVuY3Rpb24oZil7cmV0dXJuIHRoaXMuX3BoeXNpY2FsU2l6ZXNbZl19LApfc2hvdWxkUmVuZGVyTmV4dFJvdzpmdW5jdGlvbihmKXtyZXR1cm4gZiV0aGlzLl9pdGVtc1BlclJvdz09PXRoaXMuX2l0ZW1zUGVyUm93LTF9LF9hZGp1c3RTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbigpe3ZhciBmPTA9PT10aGlzLl92aXJ0dWFsU3RhcnQ/dGhpcy5fcGh5c2ljYWxUb3A6TWF0aC5taW4odGhpcy5fc2Nyb2xsUG9zaXRpb24rdGhpcy5fcGh5c2ljYWxUb3AsMCk7ZiYmKHRoaXMuX3BoeXNpY2FsVG9wLT1mLGR8fDA9PT10aGlzLl9waHlzaWNhbFRvcHx8dGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbih0aGlzLl9zY3JvbGxUb3AtZikpfSxfcmVzZXRTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbihmKXt0aGlzLnNjcm9sbFRhcmdldCYmKHRoaXMuX3Njcm9sbFBvc2l0aW9uPXRoaXMuX3Njcm9sbFRvcD1mKX0sX3VwZGF0ZVNjcm9sbGVyU2l6ZTpmdW5jdGlvbihmKXt0aGlzLl9lc3RTY3JvbGxIZWlnaHQ9dGhpcy5fcGh5c2ljYWxCb3R0b20rTWF0aC5tYXgodGhpcy5fdmlydHVhbENvdW50LQp0aGlzLl9waHlzaWNhbENvdW50LXRoaXMuX3ZpcnR1YWxTdGFydCwwKSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2U7aWYoKGY9KGY9Znx8MD09PXRoaXMuX3Njcm9sbEhlaWdodCl8fHRoaXMuX3Njcm9sbFBvc2l0aW9uPj10aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fcGh5c2ljYWxTaXplKXx8TWF0aC5hYnModGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3Njcm9sbEhlaWdodCk+PXRoaXMuX29wdFBoeXNpY2FsU2l6ZSl0aGlzLiQuaXRlbXMuc3R5bGUuaGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodCsicHgiLHRoaXMuX3Njcm9sbEhlaWdodD10aGlzLl9lc3RTY3JvbGxIZWlnaHR9LHNjcm9sbFRvSW5kZXg6ZnVuY3Rpb24oZil7UG9seW1lci5kb20uZmx1c2goKTtmPU1hdGgubWluKE1hdGgubWF4KGYsMCksdGhpcy5fdmlydHVhbENvdW50LTEpO2lmKCF0aGlzLl9pc0luZGV4UmVuZGVyZWQoZil8fGY+PXRoaXMuX21heFZpcnR1YWxTdGFydCl0aGlzLl92aXJ0dWFsU3RhcnQ9CmYtMTt0aGlzLl9hc3NpZ25Nb2RlbHMoKTt0aGlzLl91cGRhdGVNZXRyaWNzKCk7dGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtmb3IodmFyIGg9dGhpcy5fcGh5c2ljYWxTdGFydCxrPXRoaXMuX3ZpcnR1YWxTdGFydCx0PTAsbD10aGlzLl9oaWRkZW5Db250ZW50U2l6ZTtrPGYmJnQ8PWw7KXQrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChoKSxoPShoKzEpJXRoaXMuX3BoeXNpY2FsQ291bnQsaysrO3RoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSghMCk7dGhpcy5fcG9zaXRpb25JdGVtcygpO3RoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24odGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wK3QpO3RoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKCk7dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD0KbnVsbH0sX3Jlc2V0QXZlcmFnZTpmdW5jdGlvbigpe3RoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50PXRoaXMuX3BoeXNpY2FsQXZlcmFnZT0wfSxfcmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe1BvbHltZXIuZG9tLmFkZERlYm91bmNlcih0aGlzLmRlYm91bmNlKCJfZGVib3VuY2VUZW1wbGF0ZSIsZnVuY3Rpb24oKXt0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpO3RoaXMuX3JlbmRlcigpO3RoaXMuX2l0ZW1zUmVuZGVyZWQmJnRoaXMuX3BoeXNpY2FsSXRlbXMmJnRoaXMuX2lzVmlzaWJsZSYmKHRoaXMuX3Jlc2V0QXZlcmFnZSgpLHRoaXMuc2Nyb2xsVG9JbmRleCh0aGlzLmZpcnN0VmlzaWJsZUluZGV4KSl9LmJpbmQodGhpcyksMSkpfSx1cGRhdGVTaXplRm9ySXRlbTpmdW5jdGlvbihmKXtmPXRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbZl07bnVsbCE9ZiYmKHRoaXMuX3VwZGF0ZU1ldHJpY3MoW2ZdKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCkpfSxfaXNJbmRleFJlbmRlcmVkOmZ1bmN0aW9uKGYpe3JldHVybiBmPj0KdGhpcy5fdmlydHVhbFN0YXJ0JiZmPD10aGlzLl92aXJ0dWFsRW5kfSxfaXNJbmRleFZpc2libGU6ZnVuY3Rpb24oZil7cmV0dXJuIGY+PXRoaXMuZmlyc3RWaXNpYmxlSW5kZXgmJmY8PXRoaXMubGFzdFZpc2libGVJbmRleH19fSgpO3ZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3I9W1BvbHltZXIuVGVtcGxhdGl6ZXIsUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuSXJvbkxpc3RCZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLXRhYmxlLmh0bWwuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLXRhYmxlIixiZWhhdmlvcnM6W3ZhYWRpbi5lbGVtZW50cy5ncmlkLklyb25MaXN0QmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVTY3JvbGxCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5UYWJsZUNvbHVtblJlb3JkZXJpbmdCZWhhdmlvcixQb2x5bWVyLlRlbXBsYXRpemVyXSxwcm9wZXJ0aWVzOntzaXplOk51bWJlcixjb2x1bW5UcmVlOkFycmF5LGJpbmREYXRhOkZ1bmN0aW9uLHJvd0RldGFpbHNUZW1wbGF0ZTpPYmplY3QsY29sdW1uUmVvcmRlcmluZ0FsbG93ZWQ6e3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHNhZmFyaTp7dHlwZTpCb29sZWFuLHZhbHVlOi9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCl9LHNjcm9sbGJhcldpZHRoOnt0eXBlOk51bWJlcix2YWx1ZTpmdW5jdGlvbigpe3ZhciBiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwpiLnN0eWxlLndpZHRoPSIxMDBweCI7Yi5zdHlsZS5oZWlnaHQ9IjEwMHB4IjtiLnN0eWxlLm92ZXJmbG93PSJzY3JvbGwiO2Iuc3R5bGUucG9zaXRpb249ImFic29sdXRlIjtiLnN0eWxlLnRvcD0iLTk5OTlweCI7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChiKTt2YXIgZD1iLm9mZnNldFdpZHRoLWIuY2xpZW50V2lkdGg7ZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChiKTtyZXR1cm4gZH19LHRhcmdldDpPYmplY3QsaGFzRGF0YTpCb29sZWFufSxvYnNlcnZlcnM6WyJfY29sdW1uVHJlZUNoYW5nZWQoY29sdW1uVHJlZSwgX3BoeXNpY2FsSXRlbXMsIF9waHlzaWNhbENvdW50VmFsKSIsIl9zaXplQ2hhbmdlZChzaXplLCBiaW5kRGF0YSwgaGFzRGF0YSkiLCJfcm93RGV0YWlsc1RlbXBsYXRlQ2hhbmdlZChyb3dEZXRhaWxzVGVtcGxhdGUsIF9waHlzaWNhbEl0ZW1zLCBfcGh5c2ljYWxDb3VudFZhbCkiXSxsaXN0ZW5lcnM6eyJwcm9wZXJ0eS1jaGFuZ2VkIjoiX2NvbHVtblByb3BDaGFuZ2VkIiwKYW5pbWF0aW9uZW5kOiJfb25BbmltYXRpb25FbmQiLCJjb2x1bW4tcmVzaXppbmciOiJfb25Db2x1bW5SZXNpemUifSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuJD10aGlzLiR8fHt9O3RoaXMuJC5oZWFkZXI9dGhpcy5kb21Ib3N0LiQuaGVhZGVyO3RoaXMuJC5pdGVtcz10aGlzLmRvbUhvc3QuJC5pdGVtczt0aGlzLiQuZm9vdGVyPXRoaXMuZG9tSG9zdC4kLmZvb3Rlcn0sX29uQ29sdW1uUmVzaXplOmZ1bmN0aW9uKCl7dGhpcy50b2dnbGVBdHRyaWJ1dGUoImNvbHVtbi1yZXNpemluZyIsdGhpcy4kLmhlYWRlci5xdWVyeVNlbGVjdG9yKCJbY29sdW1uLXJlc2l6aW5nXSIpKTt0aGlzLl9ncmlkUmVzaXplSGFuZGxlcigpfSxfb25BbmltYXRpb25FbmQ6ZnVuY3Rpb24oYil7L2FwcGVhci8udGVzdChiLmFuaW1hdGlvbk5hbWUpJiYodGhpcy5fcmVuZGVyKCksdGhpcy5fdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljcygpLGIuc3RvcFByb3BhZ2F0aW9uKCkpfSxfY29sdW1uUHJvcENoYW5nZWQ6ZnVuY3Rpb24oYil7ImhlYWRlclRlbXBsYXRlIj09PQpiLmRldGFpbC5wYXRoJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsITAsdGhpcy4kLmhlYWRlcik7ImZvb3RlclRlbXBsYXRlIj09PWIuZGV0YWlsLnBhdGgmJnRoaXMudG9nZ2xlQXR0cmlidXRlKCJoYXMtdGVtcGxhdGVzIiwhMCx0aGlzLiQuZm9vdGVyKTsvZnJvemVufGhpZGRlbi8udGVzdChiLmRldGFpbC5wYXRoKSYmdGhpcy5fZnJvemVuQ2VsbHNDaGFuZ2VkKCk7ImhpZGRlbiI9PT1iLmRldGFpbC5wYXRoJiZ0aGlzLl9ncmlkUmVzaXplSGFuZGxlcigpfSxfaGlkZU91dGVyU2Nyb2xsZXI6ZnVuY3Rpb24oYixkKXtyZXR1cm4gMD09PWImJiFkfSxfaGlkZVRhYmxlT3ZlcmZsb3c6ZnVuY3Rpb24oYixkKXtyZXR1cm4gMD09PWImJmR9LF9yb3dEZXRhaWxzVGVtcGxhdGVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCxmKXt2b2lkIDAhPT1iJiZkJiZ2b2lkIDAhPT1mJiZBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGQsZnVuY3Rpb24oaCl7aC5yb3dEZXRhaWxzVGVtcGxhdGU9CmJ9KX0sX2NvbHVtblRyZWVDaGFuZ2VkOmZ1bmN0aW9uKGIsZCxmKXt2b2lkIDAhPT1iJiZkJiZ2b2lkIDAhPT1mJiYoUG9seW1lci5SZW5kZXJTdGF0dXMuYWZ0ZXJOZXh0UmVuZGVyKHRoaXMsdGhpcy5fdXBkYXRlKSx0aGlzLl9mcm96ZW5DZWxsc0NoYW5nZWQoKSx0aGlzLl9oYXNUZW1wbGF0ZXNDaGFuZ2VkKGIpLEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZCxmdW5jdGlvbihoKXtoLmNvbHVtbnM9YltiLmxlbmd0aC0xXX0pLHRoaXMuX2dyaWRSZXNpemVIYW5kbGVyKCksUG9seW1lci5kb20uZmx1c2godGhpcyksdGhpcy5fdXBkYXRlTGFzdENvbHVtbigpKX0sX3VwZGF0ZUxhc3RDb2x1bW46ZnVuY3Rpb24oKXtBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKFBvbHltZXIuZG9tKHRoaXMuZG9tSG9zdC5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCIudmFhZGluLWdyaWQtcm93IiksZnVuY3Rpb24oYil7Yi51cGRhdGVMYXN0Q29sdW1uKCl9KX0sX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbFNpemVzJiYKUG9seW1lci5kb20uZmx1c2goKTt0aGlzLl91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzU3luYygpO1BvbHltZXIuUmVuZGVyU3RhdHVzLmFmdGVyTmV4dFJlbmRlcih0aGlzLiQuaGVhZGVyLGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljc1N5bmMoKTt0aGlzLl9wZW5kaW5nU2Nyb2xsVG9TY2FsZWRJbmRleCYmdGhpcy5zY3JvbGxUb1NjYWxlZEluZGV4KHRoaXMuX3BlbmRpbmdTY3JvbGxUb1NjYWxlZEluZGV4KX0uYmluZCh0aGlzKSl9LF91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzU3luYzpmdW5jdGlvbigpe3ZhciBiPXRoaXMuJC5oZWFkZXIuY2xpZW50SGVpZ2h0KyJweCIsZD10aGlzLiQuZm9vdGVyLmNsaWVudEhlaWdodCsicHgiO1t0aGlzLiQub3V0ZXJzaXplcix0aGlzLiQuZml4ZWRzaXplcix0aGlzLiQuaXRlbXNdLmZvckVhY2goZnVuY3Rpb24oZil7Zi5zdHlsZS5ib3JkZXJUb3BXaWR0aD1iO2Yuc3R5bGUuYm9yZGVyQm90dG9tV2lkdGg9CmR9KX0sX2hhc1RlbXBsYXRlc0NoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9ITEsZj0hMTtiLmZvckVhY2goZnVuY3Rpb24oaCl7cmV0dXJuIGguZm9yRWFjaChmdW5jdGlvbihrKXtkPWR8fGsuaGVhZGVyVGVtcGxhdGU7Zj1mfHxrLmZvb3RlclRlbXBsYXRlfSl9KTt0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsZCx0aGlzLiQuaGVhZGVyKTt0aGlzLnRvZ2dsZUF0dHJpYnV0ZSgiaGFzLXRlbXBsYXRlcyIsZix0aGlzLiQuZm9vdGVyKX0sX2NyZWF0ZVBvb2w6ZnVuY3Rpb24oYil7Zm9yKHZhciBkPUFycmF5KGIpLGY9MDtmPGI7ZisrKXt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ2YWFkaW4tZ3JpZC10YWJsZS1yb3ciKTtoLnRhcmdldD10aGlzLmRvbUhvc3Q7ZFtmXT1oO2guc2V0QXR0cmlidXRlKCJoaWRkZW4iLCIiKTtQb2x5bWVyLmRvbSh0aGlzLiQuaXRlbXMpLmFwcGVuZENoaWxkKGgpfXJldHVybiBkfSxfc2l6ZUNoYW5nZWQ6ZnVuY3Rpb24oYiwKZCxmKXtpZih2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiZ2b2lkIDAhPT1mKXt2YXIgaD10aGlzLl9zY3JvbGxUb3Asaz10aGlzLmZpcnN0VmlzaWJsZUluZGV4K3RoaXMuX3ZpZHhPZmZzZXQ7dGhpcy5fdmlydHVhbENvdW50PU1hdGgubWluKGIsMUU1KTt0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5PXt9O3RoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbDt0aGlzLl92aWR4T2Zmc2V0PTA7dGhpcy5fcGh5c2ljYWxJdGVtc3x8KHRoaXMuX3BoeXNpY2FsQ291bnQ9TWF0aC5tYXgoMSxNYXRoLm1pbigyNSx0aGlzLl92aXJ0dWFsQ291bnQpKSx0aGlzLl9waHlzaWNhbEl0ZW1zPXRoaXMuX2NyZWF0ZVBvb2wodGhpcy5fcGh5c2ljYWxDb3VudCksdGhpcy5fcGh5c2ljYWxTaXplcz1BcnJheSh0aGlzLl9waHlzaWNhbENvdW50KSk7dGhpcy5faXRlbXNSZW5kZXJlZD0hMTt0aGlzLl9kZWJvdW5jZVRlbXBsYXRlKGZ1bmN0aW9uKCl7dGhpcy5fcmVuZGVyKCk7CnRoaXMuX3ZpZXdwb3J0SGVpZ2h0JiYodGhpcy5zY3JvbGxUb1NjYWxlZEluZGV4KE1hdGgubWluKGssdGhpcy5zaXplKSksdGhpcy5fc2Nyb2xsVG9wPWgsdGhpcy5fc2Nyb2xsSGFuZGxlcigpLHRoaXMuZmx1c2hEZWJvdW5jZXIoInZhYWRpbi1ncmlkLXNjcm9sbGluZyIpKX0pfX0sX2Fzc2lnbk1vZGVsczpmdW5jdGlvbihiKXt0aGlzLl92aXJ0dWFsSW5kZXhUb0l0ZW09dGhpcy5fdmlydHVhbEluZGV4VG9JdGVtfHx7fTt0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24oZCxmKXtkPXRoaXMuX3BoeXNpY2FsSXRlbXNbZF07ZC5pbmRleCYmZGVsZXRlIHRoaXMuX3ZpcnR1YWxJbmRleFRvSXRlbVtkLmluZGV4XTtkLmluZGV4PWYrdGhpcy5fdmlkeE9mZnNldDt0aGlzLl92aXJ0dWFsSW5kZXhUb0l0ZW1bZC5pbmRleF09ZDtkLnRvZ2dsZUF0dHJpYnV0ZSgib2RkIixkLmluZGV4JTIpO2QudG9nZ2xlQXR0cmlidXRlKCJsYXN0cm93IixkLmluZGV4PT09dGhpcy5zaXplLTEpO2QudG9nZ2xlQXR0cmlidXRlKCJoaWRkZW4iLApkLmluZGV4Pj10aGlzLnNpemUpO3RoaXMuYmluZERhdGEoZC5pbmRleCxkKX0sYil9LF9ncmlkUmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUhlYWRlckZvb3Rlck1ldHJpY3MoKTt0aGlzLl9waHlzaWNhbFNpemVzJiYodGhpcy5fcGh5c2ljYWxJdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IudXBkYXRlUm93RGV0YWlsc0NlbGxNZXRyaWNzKCl9KSx0aGlzLmRlYm91bmNlKCJ2YWFkaW4tZ3JpZC1yZXNpemluZyIsZnVuY3Rpb24oKXt0aGlzLl91cGRhdGUoKX0uYmluZCh0aGlzKSwxKSl9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtY29sdW1uLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJhc2VCZWhhdmlvcj17cHJvcGVydGllczp7cmVzaXphYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ZnVuY3Rpb24oKXtpZigidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiE9PXRoaXMubG9jYWxOYW1lKXt2YXIgYj1Qb2x5bWVyLmRvbSh0aGlzKS5wYXJlbnROb2RlO3JldHVybiBiJiYidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWIubG9jYWxOYW1lP2IucmVzaXphYmxlfHwhMTohMX19fSxoZWFkZXJUZW1wbGF0ZTp7dHlwZTpPYmplY3R9LGZvb3RlclRlbXBsYXRlOnt0eXBlOk9iamVjdH0sZnJvemVuOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxoaWRkZW46e3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9LF9sYXN0RnJvemVuOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExfSxfb3JkZXI6TnVtYmVyLF9yZW9yZGVyU3RhdHVzOkJvb2xlYW59LG9ic2VydmVyczpbIl9mb290ZXJUZW1wbGF0ZUNoYW5nZWQoZm9vdGVyVGVtcGxhdGUpIiwKIl9oZWFkZXJUZW1wbGF0ZUNoYW5nZWQoaGVhZGVyVGVtcGxhdGUpIiwiX2xhc3RGcm96ZW5DaGFuZ2VkKF9sYXN0RnJvemVuKSJdLGNyZWF0ZWQ6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKGQpezA8PWQuYWRkZWROb2Rlcy5sZW5ndGgmJih0aGlzLmhlYWRlclRlbXBsYXRlPXRoaXMuX3ByZXBhcmVIZWFkZXJUZW1wbGF0ZSgpLHRoaXMuZm9vdGVyVGVtcGxhdGU9dGhpcy5fcHJlcGFyZUZvb3RlclRlbXBsYXRlKCksdGhpcy50ZW1wbGF0ZT10aGlzLl9wcmVwYXJlQm9keVRlbXBsYXRlKCkpfXRoaXMuX3RlbXBsYXRlT2JzZXJ2ZXI9UG9seW1lci5FbGVtZW50P25ldyBQb2x5bWVyLkZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcyxiKTpQb2x5bWVyLmRvbSh0aGlzKS5vYnNlcnZlTm9kZXMoYil9LF9wcmVwYXJlSGVhZGVyVGVtcGxhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJlcGFyZVRlbXBsYXRpemVyKHRoaXMuX2ZpbmRUZW1wbGF0ZSgidGVtcGxhdGUuaGVhZGVyIil8fG51bGwsCnt9KX0sX3ByZXBhcmVGb290ZXJUZW1wbGF0ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcmVwYXJlVGVtcGxhdGl6ZXIodGhpcy5fZmluZFRlbXBsYXRlKCJ0ZW1wbGF0ZS5mb290ZXIiKXx8bnVsbCx7fSl9LF9wcmVwYXJlQm9keVRlbXBsYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ByZXBhcmVUZW1wbGF0aXplcih0aGlzLl9maW5kVGVtcGxhdGUoInRlbXBsYXRlOm5vdCguaGVhZGVyKTpub3QoLmZvb3RlcikiLHt9KSl9LF9wcmVwYXJlVGVtcGxhdGl6ZXI6ZnVuY3Rpb24oYixkKXtpZihiJiYhYi50ZW1wbGF0aXplcil7dmFyIGY9bmV3IHZhYWRpbi5lbGVtZW50cy5ncmlkLlRlbXBsYXRpemVyO2YuZGF0YUhvc3Q9dGhpcy5kYXRhSG9zdDtmLl9pbnN0YW5jZVByb3BzPWR8fGYuX2luc3RhbmNlUHJvcHM7Zi50ZW1wbGF0ZT1iO2IudGVtcGxhdGl6ZXI9Zn1yZXR1cm4gYn0sX3NlbGVjdEZpcnN0VGVtcGxhdGU6ZnVuY3Rpb24oYil7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5maWx0ZXIuY2FsbChQb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKGIpLApmdW5jdGlvbihkKXtyZXR1cm4gUG9seW1lci5kb20oZCkucGFyZW50Tm9kZT09PXRoaXN9LmJpbmQodGhpcykpWzBdfSxfZmluZFRlbXBsYXRlOmZ1bmN0aW9uKGIpeyhiPXRoaXMuX3NlbGVjdEZpcnN0VGVtcGxhdGUoYikpJiZ0aGlzLmRhdGFIb3N0JiYoYi5fcm9vdERhdGFIb3N0PXRoaXMuZGF0YUhvc3QuX3Jvb3REYXRhSG9zdHx8dGhpcy5kYXRhSG9zdCk7cmV0dXJuIGJ9LF9oZWFkZXJUZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoiaGVhZGVyVGVtcGxhdGUiLHZhbHVlOmJ9KX0sX2Zvb3RlclRlbXBsYXRlQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJmb290ZXJUZW1wbGF0ZSIsdmFsdWU6Yn0pfSxfZmxleEdyb3dDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6ImZsZXhHcm93Iix2YWx1ZTpifSl9LF93aWR0aENoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIiwKe3BhdGg6IndpZHRoIix2YWx1ZTpifSl9LF9sYXN0RnJvemVuQ2hhbmdlZDpmdW5jdGlvbihiKXt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJsYXN0RnJvemVuIix2YWx1ZTpifSl9fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3JJbXBsPXtwcm9wZXJ0aWVzOnt3aWR0aDp7dHlwZTpTdHJpbmcsdmFsdWU6IjEwMHB4In0sZmxleEdyb3c6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LHRlbXBsYXRlOnt0eXBlOk9iamVjdH19LG9ic2VydmVyczoiX2ZsZXhHcm93Q2hhbmdlZChmbGV4R3Jvdyk7X3dpZHRoQ2hhbmdlZCh3aWR0aCk7X3RlbXBsYXRlQ2hhbmdlZCh0ZW1wbGF0ZSk7X2Zyb3plbkNoYW5nZWQoZnJvemVuLCBpc0F0dGFjaGVkKTtfaGlkZGVuQ2hhbmdlZChoaWRkZW4pO19vcmRlckNoYW5nZWQoX29yZGVyKTtfcmVvcmRlclN0YXR1c0NoYW5nZWQoX3Jlb3JkZXJTdGF0dXMpO19yZXNpemFibGVDaGFuZ2VkKHJlc2l6YWJsZSkiLnNwbGl0KCI7IiksX2Zyb3plbkNoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodm9pZCAwPT09dGhpcy5fb2xkRnJvemVuJiYhMT09PWJ8fHRoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIsCntwYXRoOiJmcm96ZW4iLHZhbHVlOmJ9KSx0aGlzLl9vbGRGcm96ZW49Yil9LF90ZW1wbGF0ZUNoYW5nZWQ6ZnVuY3Rpb24oYil7YiYmYi50ZW1wbGF0aXplciYmUG9seW1lci5kb20odGhpcy5yb290KS5hcHBlbmRDaGlsZChiLnRlbXBsYXRpemVyKTt0aGlzLmZpcmUoInByb3BlcnR5LWNoYW5nZWQiLHtwYXRoOiJ0ZW1wbGF0ZSIsdmFsdWU6Yn0se2J1YmJsZXM6ITF9KX0sX2hpZGRlbkNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoiaGlkZGVuIix2YWx1ZTpifSl9LF9vcmRlckNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIix7cGF0aDoib3JkZXIiLHZhbHVlOmJ9KX0sX3Jlb3JkZXJTdGF0dXNDaGFuZ2VkOmZ1bmN0aW9uKGIpe3RoaXMuZmlyZSgicHJvcGVydHktY2hhbmdlZCIse3BhdGg6InJlb3JkZXJTdGF0dXMiLHZhbHVlOmJ9KX0sX3Jlc2l6YWJsZUNoYW5nZWQ6ZnVuY3Rpb24oYil7dGhpcy5maXJlKCJwcm9wZXJ0eS1jaGFuZ2VkIiwKe3BhdGg6InJlc2l6YWJsZSIsdmFsdWU6Yn0pfX07dmFhZGluLmVsZW1lbnRzLmdyaWQuQ29sdW1uQmVoYXZpb3I9W3ZhYWRpbi5lbGVtZW50cy5ncmlkLkNvbHVtbkJhc2VCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CZWhhdmlvckltcGxdOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3ZhYWRpbi1ncmlkL3ZhYWRpbi1ncmlkLWNvbHVtbi5odG1sLTIuanMKUG9seW1lcih7aXM6InZhYWRpbi1ncmlkLWNvbHVtbiIsYmVoYXZpb3JzOlt2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5CZWhhdmlvcl19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1hcnJheS1kYXRhLXByb3ZpZGVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLkFycmF5RGF0YVByb3ZpZGVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e2l0ZW1zOkFycmF5fSxvYnNlcnZlcnM6WyJfaXRlbXNDaGFuZ2VkKGl0ZW1zLCBpdGVtcy4qKSJdLF9pdGVtc0NoYW5nZWQ6ZnVuY3Rpb24oYixkKXt2b2lkIDAhPT1iJiZ2b2lkIDAhPT1kJiYodGhpcy5zaXplPShifHxbXSkubGVuZ3RoLHRoaXMuZGF0YVByb3ZpZGVyPXRoaXMuZGF0YVByb3ZpZGVyfHx0aGlzLl9hcnJheURhdGFQcm92aWRlcix0aGlzLmNsZWFyQ2FjaGUoKSl9LF9hcnJheURhdGFQcm92aWRlcjpmdW5jdGlvbihiLGQpe3ZhciBmPSh0aGlzLml0ZW1zfHxbXSkuc2xpY2UoMCk7dGhpcy5fY2hlY2tQYXRocyh0aGlzLl9maWx0ZXJzLCJmaWx0ZXJpbmciLGYpJiYoZj10aGlzLl9maWx0ZXIoZikpO3RoaXMuc2l6ZT1mLmxlbmd0aDtiLnNvcnRPcmRlcnMubGVuZ3RoJiZ0aGlzLl9jaGVja1BhdGhzKHRoaXMuX3NvcnRlcnMsInNvcnRpbmciLGYpJiYoZj1mLnNvcnQodGhpcy5fbXVsdGlTb3J0LmJpbmQodGhpcykpKTsKdmFyIGg9Yi5wYWdlKmIucGFnZVNpemU7ZChmLnNsaWNlKGgsaCtiLnBhZ2VTaXplKSxmLmxlbmd0aCl9LF9jaGVja1BhdGhzOmZ1bmN0aW9uKGIsZCxmKXtpZighZi5sZW5ndGgpcmV0dXJuITE7dmFyIGg9ITAsaztmb3IoayBpbiBiKXt2YXIgdD1iW2tdLnBhdGg7aWYodCYmLTEhPT10LmluZGV4T2YoIi4iKSl7dmFyIGw9dC5yZXBsYWNlKC9cLlteXC5dKiQvLCIiKTt2b2lkIDA9PT1Qb2x5bWVyLkJhc2UuZ2V0KGwsZlswXSkmJihjb25zb2xlLndhcm4oJ1BhdGggIicrdCsnIiB1c2VkIGZvciAnK2QrIiBkb2VzIG5vdCBleGlzdCBpbiBhbGwgb2YgdGhlIGl0ZW1zLCAiK2QrIiBpcyBkaXNhYmxlZC4iKSxoPSExKX19cmV0dXJuIGh9LF9tdWx0aVNvcnQ6ZnVuY3Rpb24oYixkKXtyZXR1cm4gdGhpcy5fc29ydGVycy5tYXAoZnVuY3Rpb24oZil7cmV0dXJuImFzYyI9PT1mLmRpcmVjdGlvbj90aGlzLl9jb21wYXJlKFBvbHltZXIuQmFzZS5nZXQoZi5wYXRoLGIpLFBvbHltZXIuQmFzZS5nZXQoZi5wYXRoLApkKSk6ImRlc2MiPT09Zi5kaXJlY3Rpb24/dGhpcy5fY29tcGFyZShQb2x5bWVyLkJhc2UuZ2V0KGYucGF0aCxkKSxQb2x5bWVyLkJhc2UuZ2V0KGYucGF0aCxiKSk6MH0sdGhpcykucmVkdWNlKGZ1bmN0aW9uKGYsaCl7cmV0dXJuIGY/ZjpofSwwKX0sX25vcm1hbGl6ZUVtcHR5VmFsdWU6ZnVuY3Rpb24oYil7cmV0dXJuIDA8PVt2b2lkIDAsbnVsbF0uaW5kZXhPZihiKT8iIjppc05hTihiKT9iLnRvU3RyaW5nKCk6Yn0sX2NvbXBhcmU6ZnVuY3Rpb24oYixkKXtiPXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoYik7ZD10aGlzLl9ub3JtYWxpemVFbXB0eVZhbHVlKGQpO3JldHVybiBiPGQ/LTE6Yj5kPzE6MH0sX2ZpbHRlcjpmdW5jdGlvbihiKXtyZXR1cm4gYi5maWx0ZXIoZnVuY3Rpb24oZCl7cmV0dXJuIDA9PT10aGlzLl9maWx0ZXJzLmZpbHRlcihmdW5jdGlvbihmKXtyZXR1cm4tMT09PXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoUG9seW1lci5CYXNlLmdldChmLnBhdGgsZCkpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKS5pbmRleE9mKGYudmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKX0uYmluZCh0aGlzKSkubGVuZ3RofSwKdGhpcyl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1keW5hbWljLWNvbHVtbnMtYmVoYXZpb3IuaHRtbC5qcwp3aW5kb3cudmFhZGluPXdpbmRvdy52YWFkaW58fHt9O3ZhYWRpbi5lbGVtZW50cz12YWFkaW4uZWxlbWVudHN8fHt9O3ZhYWRpbi5lbGVtZW50cy5ncmlkPXZhYWRpbi5lbGVtZW50cy5ncmlkfHx7fTsKdmFhZGluLmVsZW1lbnRzLmdyaWQuRHluYW1pY0NvbHVtbnNCZWhhdmlvcj17cmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9hZGROb2RlT2JzZXJ2ZXIoKX0sX2hhc0NvbHVtbkdyb3VwczpmdW5jdGlvbihiKXtmb3IodmFyIGQ9MDtkPGIubGVuZ3RoO2QrKylpZigidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWJbZF0ubG9jYWxOYW1lKXJldHVybiEwO3JldHVybiExfSxfZ2V0Q2hpbGRDb2x1bW5zOmZ1bmN0aW9uKGIpe3JldHVybiBQb2x5bWVyLmRvbShiKS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoInZhYWRpbi1ncmlkLWNvbHVtbiwgdmFhZGluLWdyaWQtY29sdW1uLWdyb3VwLCB2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIil9LF9mbGF0dGVuQ29sdW1uR3JvdXBzOmZ1bmN0aW9uKGIpe3JldHVybiBiLm1hcChmdW5jdGlvbihkKXtyZXR1cm4idmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PWQubG9jYWxOYW1lP3RoaXMuX2dldENoaWxkQ29sdW1ucyhkKTpbZF19LHRoaXMpLnJlZHVjZShmdW5jdGlvbihkLApmKXtyZXR1cm4gZC5jb25jYXQoZil9LFtdKX0sX2dldENvbHVtblRyZWU6ZnVuY3Rpb24oKXtmb3IodmFyIGI9W10sZD10aGlzLnF1ZXJ5QWxsRWZmZWN0aXZlQ2hpbGRyZW4oInZhYWRpbi1ncmlkLWNvbHVtbiwgdmFhZGluLWdyaWQtY29sdW1uLWdyb3VwLCB2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIik7Oyl7Yi5wdXNoKGQpO2lmKCF0aGlzLl9oYXNDb2x1bW5Hcm91cHMoZCkpYnJlYWs7ZD10aGlzLl9mbGF0dGVuQ29sdW1uR3JvdXBzKGQpfXJldHVybiBifSxfdXBkYXRlQ29sdW1uVHJlZTpmdW5jdGlvbigpe3ZhciBiPXRoaXMuX2dldENvbHVtblRyZWUoKTt0aGlzLl9hcnJheUVxdWFscyhiLHRoaXMuX2NvbHVtblRyZWUpfHwodGhpcy5fY29sdW1uVHJlZT1iKX0sX2FkZE5vZGVPYnNlcnZlcjpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPVBvbHltZXIuZG9tKHRoaXMpLm9ic2VydmVOb2RlcyhmdW5jdGlvbihiKXtmdW5jdGlvbiBkKGYpe3JldHVybiBmLm5vZGVUeXBlPT09Ck5vZGUuRUxFTUVOVF9OT0RFJiYvXnZhYWRpbi1ncmlkLShjb2x1bW58c2VsZWN0aW9uKS9pLnRlc3QoZi5sb2NhbE5hbWUpfSgwPGIuYWRkZWROb2Rlcy5maWx0ZXIoZCkubGVuZ3RofHwwPGIucmVtb3ZlZE5vZGVzLmZpbHRlcihkKS5sZW5ndGgpJiZ0aGlzLl91cGRhdGVDb2x1bW5UcmVlKCk7KFBvbHltZXIuU2V0dGluZ3MudXNlTmF0aXZlU2hhZG93fHxQb2x5bWVyLlNldHRpbmdzLnVzZVNoYWRvdykmJlBvbHltZXIuZG9tKHRoaXMpLmFwcGVuZENoaWxkKHRoaXMuJC5mb290ZXJGb2N1c1RyYXApO3RoaXMuZGVib3VuY2UoImNoZWNrLWltcG9ydHMiLHRoaXMuX2NoZWNrSW1wb3J0cywyRTMpfS5iaW5kKHRoaXMpKX0sX2FycmF5RXF1YWxzOmZ1bmN0aW9uKGIsZCl7aWYoIWJ8fCFkfHxiLmxlbmd0aCE9ZC5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBmPTAsaD1iLmxlbmd0aDtmPGg7ZisrKWlmKGJbZl1pbnN0YW5jZW9mIEFycmF5JiZkW2ZdaW5zdGFuY2VvZiBBcnJheSl7aWYoIXRoaXMuX2FycmF5RXF1YWxzKGJbZl0sCmRbZl0pKXJldHVybiExfWVsc2UgaWYoYltmXSE9ZFtmXSlyZXR1cm4hMTtyZXR1cm4hMH0sX2NoZWNrSW1wb3J0czpmdW5jdGlvbigpe1sidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIiwidmFhZGluLWdyaWQtc29ydGVyIiwidmFhZGluLWdyaWQtZmlsdGVyIiwidmFhZGluLWdyaWQtc2VsZWN0aW9uLWNvbHVtbiJdLmZvckVhY2goZnVuY3Rpb24oYil7dmFyIGQ9UG9seW1lci5kb20odGhpcykucXVlcnlTZWxlY3RvcihiKTshZHx8KFBvbHltZXIuaXNJbnN0YW5jZT9Qb2x5bWVyLmlzSW5zdGFuY2UoZCk6ZCBpbnN0YW5jZW9mIFBvbHltZXIuRWxlbWVudCl8fGNvbnNvbGUud2FybigiTWFrZSBzdXJlIHlvdSBoYXZlIGltcG9ydGVkIHRoZSByZXF1aXJlZCBtb2R1bGUgZm9yIFx4M2MiK2IrIlx4M2UgZWxlbWVudC4iKX0sdGhpcyl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC1zb3J0LWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307CnZhYWRpbi5lbGVtZW50cy5ncmlkLlNvcnRCZWhhdmlvcj17cHJvcGVydGllczp7bXVsdGlTb3J0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9zb3J0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfcHJldmlvdXNTb3J0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsic29ydGVyLWNoYW5nZWQiOiJfb25Tb3J0ZXJDaGFuZ2VkIn0scmVhZHk6ZnVuY3Rpb24oKXtQb2x5bWVyLkVsZW1lbnQmJiFQb2x5bWVyLlNldHRpbmdzLnVzZU5hdGl2ZVNoYWRvdyYmdGhpcy5hc3luYyhmdW5jdGlvbigpe3ZhciBiPVBvbHltZXIuZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3JBbGwoInZhYWRpbi1ncmlkLXNvcnRlciIpO0FycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoYixmdW5jdGlvbihkKXtkLmZpcmUmJmQuZmlyZSgic29ydGVyLWNoYW5nZWQiKX0pfSl9LF9vblNvcnRlckNoYW5nZWQ6ZnVuY3Rpb24oYil7dmFyIGQ9CmIudGFyZ2V0O3RoaXMuX3JlbW92ZUFycmF5SXRlbSh0aGlzLl9zb3J0ZXJzLGQpO2QuX29yZGVyPW51bGw7dGhpcy5tdWx0aVNvcnQ/KGQuZGlyZWN0aW9uJiZ0aGlzLl9zb3J0ZXJzLnVuc2hpZnQoZCksdGhpcy5fc29ydGVycy5mb3JFYWNoKGZ1bmN0aW9uKGYsaCl7Zi5fb3JkZXI9MTx0aGlzLl9zb3J0ZXJzLmxlbmd0aD9oOm51bGx9LHRoaXMpKToodGhpcy5fc29ydGVycy5mb3JFYWNoKGZ1bmN0aW9uKGYpe2YuX29yZGVyPW51bGw7Zi5kaXJlY3Rpb249bnVsbH0pLGQuZGlyZWN0aW9uJiYodGhpcy5fc29ydGVycz1bZF0pKTtiLnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuZGF0YVByb3ZpZGVyJiZKU09OLnN0cmluZ2lmeSh0aGlzLl9wcmV2aW91c1NvcnRlcnMpIT09SlNPTi5zdHJpbmdpZnkodGhpcy5fbWFwU29ydGVycygpKSYmdGhpcy5jbGVhckNhY2hlKCk7dGhpcy5fcHJldmlvdXNTb3J0ZXJzPXRoaXMuX21hcFNvcnRlcnMoKX0sX21hcFNvcnRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc29ydGVycy5tYXAoZnVuY3Rpb24oYil7cmV0dXJue3BhdGg6Yi5wYXRoLApkaXJlY3Rpb246Yi5kaXJlY3Rpb259fSl9LF9yZW1vdmVBcnJheUl0ZW06ZnVuY3Rpb24oYixkKXtkPWIuaW5kZXhPZihkKTstMTxkJiZiLnNwbGljZShkLDEpfX07CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdmFhZGluLWdyaWQvdmFhZGluLWdyaWQtZmlsdGVyLWJlaGF2aW9yLmh0bWwuanMKd2luZG93LnZhYWRpbj13aW5kb3cudmFhZGlufHx7fTt2YWFkaW4uZWxlbWVudHM9dmFhZGluLmVsZW1lbnRzfHx7fTt2YWFkaW4uZWxlbWVudHMuZ3JpZD12YWFkaW4uZWxlbWVudHMuZ3JpZHx8e307dmFhZGluLmVsZW1lbnRzLmdyaWQuRmlsdGVyQmVoYXZpb3I9e3Byb3BlcnRpZXM6e19maWx0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX0sbGlzdGVuZXJzOnsiZmlsdGVyLWNoYW5nZWQiOiJfZmlsdGVyQ2hhbmdlZCJ9LF9maWx0ZXJDaGFuZ2VkOmZ1bmN0aW9uKGIpey0xPT09dGhpcy5fZmlsdGVycy5pbmRleE9mKGIudGFyZ2V0KSYmdGhpcy5fZmlsdGVycy5wdXNoKGIudGFyZ2V0KTtiLnN0b3BQcm9wYWdhdGlvbigpO3RoaXMuZGF0YVByb3ZpZGVyJiZ0aGlzLmNsZWFyQ2FjaGUoKX0sX21hcEZpbHRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZmlsdGVycy5tYXAoZnVuY3Rpb24oYil7cmV0dXJue3BhdGg6Yi5wYXRoLHZhbHVlOmIudmFsdWV9fSl9fTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly92YWFkaW4tZ3JpZC92YWFkaW4tZ3JpZC5odG1sLmpzClBvbHltZXIoe2lzOiJ2YWFkaW4tZ3JpZCIscHJvcGVydGllczp7X2NvbHVtblRyZWU6e3R5cGU6QXJyYXksbm90aWZ5OiEwfSxzaXplOk51bWJlcixfcm93RGV0YWlsc1RlbXBsYXRlOk9iamVjdCxfYmluZERhdGE6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldEl0ZW0uYmluZCh0aGlzKX19fSxiZWhhdmlvcnM6W1BvbHltZXIuSXJvbkExMXlLZXlzQmVoYXZpb3IsUG9seW1lci5Jcm9uUmVzaXphYmxlQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuQWN0aXZlSXRlbUJlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLlJvd0RldGFpbHNCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5EYXRhUHJvdmlkZXJCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5EeW5hbWljQ29sdW1uc0JlaGF2aW9yLHZhYWRpbi5lbGVtZW50cy5ncmlkLkFycmF5RGF0YVByb3ZpZGVyQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuU2VsZWN0aW9uQmVoYXZpb3IsCnZhYWRpbi5lbGVtZW50cy5ncmlkLlNvcnRCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5GaWx0ZXJCZWhhdmlvcix2YWFkaW4uZWxlbWVudHMuZ3JpZC5Db2x1bW5SZW9yZGVyaW5nQmVoYXZpb3IsdmFhZGluLmVsZW1lbnRzLmdyaWQuVGFibGVLZXlib2FyZEJlaGF2aW9yXSxsaXN0ZW5lcnM6eyJwcm9wZXJ0eS1jaGFuZ2VkIjoiX2NvbHVtblByb3BDaGFuZ2VkIiwiaXJvbi1yZXNpemUiOiJfZ3JpZFJlc2l6ZUhhbmRsZXIifSxfdXBkYXRlSXRlbTpmdW5jdGlvbihiLGQpe2Iuc3R5bGUubWluSGVpZ2h0PWQ/IiI6dGhpcy4kLnNjcm9sbGVyLl9waHlzaWNhbEF2ZXJhZ2UrInB4IjtiLml0ZW09ZDtiLnNlbGVjdGVkPXRoaXMuX2lzU2VsZWN0ZWQoZCk7Yi5leHBhbmRlZD10aGlzLl9pc0V4cGFuZGVkKGQpO2IuYWN0aXZlPW51bGwhPT1kJiZkPT10aGlzLmFjdGl2ZUl0ZW07Yi5mb2N1c2VkPWIuaW5kZXg9PT10aGlzLiQuaXRlbXMuX2ZvY3VzZWRSb3dJbmRleH0sX2dldENvbnRlbnRUYXJnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sCnJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQ29sdW1uVHJlZSgpO3RoaXMuX3Jvd0RldGFpbHNUZW1wbGF0ZT1Qb2x5bWVyLmRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yKCJ0ZW1wbGF0ZS5yb3ctZGV0YWlscyIpfHx2b2lkIDA7dGhpcy4kLnNjcm9sbGVyLnRhcmdldD10aGlzO251bGw9PT1kb2N1bWVudC5kb2N0eXBlJiZjb25zb2xlLndhcm4oJ1x4M2N2YWFkaW4tZ3JpZFx4M2UgcmVxdWlyZXMgdGhlICJzdGFuZGFyZHMgbW9kZSIgZGVjbGFyYXRpb24uIFBsZWFzZSBhZGQgXHgzYyFET0NUWVBFIGh0bWxceDNlIHRvIHRoZSBIVE1MIGRvY3VtZW50LicpfSxfY29sdW1uUHJvcENoYW5nZWQ6ZnVuY3Rpb24oYil7Il9jaGlsZENvbHVtbnMiPT09Yi5kZXRhaWwucGF0aCYmdGhpcy5fdXBkYXRlQ29sdW1uVHJlZSgpO2Iuc3RvcFByb3BhZ2F0aW9uKCl9LF9ncmlkUmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuJC5zY3JvbGxlci5fZ3JpZFJlc2l6ZUhhbmRsZXIoKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscy90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscy5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscyIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLHZpc2libGVTY2hlbWE6T2JqZWN0LHNlc3Npb25Hcm91cDpPYmplY3QsX3hUeXBlOnt0eXBlOlN0cmluZyx2YWx1ZTpyZy5YVHlwZS5TVEVQfSxfbm9NdWx0aUV4cGVyaW1lbnRzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9pbmRleE9mU2Vzc2lvbjpPYmplY3QsX3Nlc3Npb25Hcm91cE5hbWVIYXNoOk51bWJlcixfcmVxdWVzdERhdGE6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4oe3RhZzpiLHJ1bjpkfSk9PnRoaXMuYmFja2VuZC5saXN0TWV0cmljRXZhbHMoe2V4cGVyaW1lbnROYW1lOnRoaXMuZXhwZXJpbWVudE5hbWUsc2Vzc2lvbk5hbWU6ZCxtZXRyaWNOYW1lOmJ9KX19LF9jb2xvclNjYWxlOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybntzY2FsZTpiPT57Yj1KU09OLnBhcnNlKGIpWzFdOwpiPXRoaXMuX2luZGV4T2ZTZXNzaW9uLmdldChiKTtjb25zdCBkPXBmLnN0YW5kYXJkO3JldHVybiBkWyh0aGlzLl9zZXNzaW9uR3JvdXBOYW1lSGFzaCtiKSVkLmxlbmd0aF19fX19fSxiZWhhdmlvcnM6W1BvbHltZXIuSXJvblJlc2l6YWJsZUJlaGF2aW9yXSxsaXN0ZW5lcnM6eyJpcm9uLXJlc2l6ZSI6InJlZHJhdyJ9LG9ic2VydmVyczpbIl9zZXNzaW9uR3JvdXBDaGFuZ2VkKHNlc3Npb25Hcm91cC4qKSJdLHJlZHJhdygpe1BvbHltZXIuZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgidGYtc2NhbGFyLWNhcmQiKS5mb3JFYWNoKGI9PmIucmVkcmF3KCkpfSxfc2Vzc2lvbkdyb3VwQ2hhbmdlZCgpe3RoaXMuc2Vzc2lvbkdyb3VwPyh0aGlzLl9pbmRleE9mU2Vzc2lvbj1uZXcgTWFwKHRoaXMuc2Vzc2lvbkdyb3VwLnNlc3Npb25zLm1hcCgoYixkKT0+W2IubmFtZSxkXSkpLHRoaXMuX3Nlc3Npb25Hcm91cE5hbWVIYXNoPXRmLmhwYXJhbXMudXRpbHMuaGFzaE9mU3RyaW5nKHRoaXMuc2Vzc2lvbkdyb3VwLm5hbWUpKToKKHRoaXMuX2luZGV4T2ZTZXNzaW9uPW5ldyBNYXAsdGhpcy5fc2Vzc2lvbkdyb3VwTmFtZUhhc2g9MCk7UG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1zY2FsYXItY2FyZCIpLmZvckVhY2goYj0+e2NvbnN0IGQ9Yi5nZXQoInRhZyIpO2Iuc2V0KCJ0YWciLCIiKTtiLnNldCgidGFnIixkKX0pfSxfaGF2ZU1ldHJpY3MoKXtyZXR1cm4gdGhpcy52aXNpYmxlU2NoZW1hJiZBcnJheS5pc0FycmF5KHRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcykmJjA8dGhpcy52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aH0sX2hhdmVNZXRyaWNzQW5kU2Vzc2lvbkdyb3VwKCl7cmV0dXJuIHRoaXMuc2Vzc2lvbkdyb3VwJiZ0aGlzLl9oYXZlTWV0cmljcygpfSxfY29tcHV0ZVNlcmllc0ZvclNlc3Npb25Hcm91cE1ldHJpYyhiLGQpe3JldHVybiBudWxsPT09Ynx8bnVsbD09PWQ/W106Yi5zZXNzaW9ucy5maWx0ZXIoZj0+dm9pZCAwIT09dGYuaHBhcmFtcy51dGlscy5tZXRyaWNWYWx1ZUJ5TmFtZShmLm1ldHJpY1ZhbHVlcywKZC5uYW1lKSkubWFwKGY9Pih7dGFnOmQubmFtZSxydW46Zi5uYW1lfSkpfSxfY29tcHV0ZVRhZ01ldGFkYXRhKGIpe3JldHVybntkaXNwbGF5TmFtZTp0Zi5ocGFyYW1zLnV0aWxzLm1ldHJpY05hbWUoYiksZGVzY3JpcHRpb246Yi5kZXNjcmlwdGlvbnx8IiJ9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtdGFibGUtdmlldy90Zi1ocGFyYW1zLXRhYmxlLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy10YWJsZS12aWV3Iixwcm9wZXJ0aWVzOnt2aXNpYmxlU2NoZW1hOk9iamVjdCxzZXNzaW9uR3JvdXBzOkFycmF5LGVuYWJsZVNob3dNZXRyaWNzOkJvb2xlYW4sYmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nfSxvYnNlcnZlcnM6WyJfdmlzaWJsZVNjaGVtYU9yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQodmlzaWJsZVNjaGVtYS4qLCBzZXNzaW9uR3JvdXBzLiopIl0sX3Zpc2libGVTY2hlbWFPclNlc3Npb25Hcm91cHNDaGFuZ2VkKCl7Y29uc3QgYj10aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLmdldCgiZXhwYW5kZWRJdGVtcyIpO3RoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuc2V0KCJleHBhbmRlZEl0ZW1zIixbXSk7UG9seW1lci5kb20uZmx1c2goKTtjb25zdCBkPW5ldyBNYXA7dGhpcy5zZXNzaW9uR3JvdXBzLmZvckVhY2goZj0+e2Quc2V0KGYubmFtZSxmKX0pO3RoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuc2V0KCJleHBhbmRlZEl0ZW1zIiwKYi5tYXAoZj0+ZC5nZXQoZi5uYW1lKSkuZmlsdGVyKEJvb2xlYW4pKX0sX2hwYXJhbU5hbWU6dGYuaHBhcmFtcy51dGlscy5ocGFyYW1OYW1lLF9tZXRyaWNOYW1lOnRmLmhwYXJhbXMudXRpbHMubWV0cmljTmFtZSxfc2Vzc2lvbkdyb3VwSFBhcmFtKGIsZCl7cmV0dXJuIG51bGwhPWImJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChiLmhwYXJhbXMsZCk/dGYuaHBhcmFtcy51dGlscy5wcmV0dHlQcmludChiLmhwYXJhbXNbZF0pOiIifSxfc2Vzc2lvbkdyb3VwTWV0cmljKGIsZCl7aWYobnVsbD09YilyZXR1cm4gbnVsbDtmb3IobGV0IGY9MDtmPGIubWV0cmljVmFsdWVzLmxlbmd0aDsrK2Ype2xldCBoPWIubWV0cmljVmFsdWVzW2ZdO2lmKGgubmFtZS5ncm91cD09PWQuZ3JvdXAmJmgubmFtZS50YWc9PWQudGFnKXJldHVybiB0Zi5ocGFyYW1zLnV0aWxzLnByZXR0eVByaW50KGgudmFsdWUpfXJldHVybiIifSxfcm93TnVtYmVyKGIpe3JldHVybiBiKzF9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcy90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMiLHByb3BlcnRpZXM6e3Nlc3Npb25Hcm91cDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sdmlzaWJsZVNjaGVtYTp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH19LF9wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIHZvaWQgMCE9PWImJm51bGwhPT1iJiZ2b2lkIDAhPT1kJiZudWxsIT09ZH0sX3NpbmdsZXRvblNlc3Npb25Hcm91cHM6ZnVuY3Rpb24oYil7cmV0dXJuIG51bGw9PT1ifHx2b2lkIDA9PT1iP1tdOltiXX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L3V0aWxzLmh0bWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7ZnVuY3Rpb24gaChrLHQsbCl7ZnVuY3Rpb24gcCgpe2lmKDA9PT1rLmxlbmd0aClyZXR1cm5bMSwyXTtjb25zdCBbbSxuXT1kMy5leHRlbnQoayk7cmV0dXJuIG0hPT1uP1ttLG5dOjA8bT9bLjUqbSwxLjUqbV06MD5tP1sxLjUqbSwuNSptXTpbLTEsMV19aWYoIkxJTkVBUiI9PT1sKXJldHVybiBkMy5zY2FsZUxpbmVhcigpLmRvbWFpbihwKCkpLnJhbmdlKFt0LDBdKTtpZigiTE9HIj09PWwpcmV0dXJuIGw9cCgpLDA+PWxbMF0mJjA8PWxbMV0/aChrLHQsIkxJTkVBUiIpOmQzLnNjYWxlTG9nKCkuZG9tYWluKGwpLnJhbmdlKFt0LDBdKTtpZigiUVVBTlRJTEUiPT09bClyZXR1cm4gbD1kMy5yYW5nZSgyMCkubWFwKG09PnQtbSp0LzE5KSwwPT09ay5sZW5ndGgmJihrPVsxXSksZDMuc2NhbGVRdWFudGlsZSgpLmRvbWFpbihfLnVuaXEoaykpLnJhbmdlKGwpO2lmKCJOT05fTlVNRVJJQyI9PT1sKXJldHVybiBkMy5zY2FsZVBvaW50KCkuZG9tYWluKF8udW5pcShrLnNvcnQoKSkpLnJhbmdlKFt0LAowXSkucGFkZGluZyguMSk7dGhyb3cgUmFuZ2VFcnJvcigiVW5rbm93biBzY2FsZTogIitsKTt9Zi5maW5kQ2xvc2VzdFBhdGg9ZnVuY3Rpb24oayx0LGwpe2Z1bmN0aW9uIHAoeSx3LEMsRyl7Y29uc3QgRD15LUMsQj13LUc7Qz1tLUM7Rz1uLUc7Y29uc3QgST0oRCpDK0IqRykvKEQqRCtCKkIpO3JldHVybiAwPj1JP2IuaHBhcmFtcy51dGlscy5sMk5vcm1TcXVhcmVkKEMsRyk6MTw9ST9iLmhwYXJhbXMudXRpbHMubDJOb3JtU3F1YXJlZCh5LW0sdy1uKTpiLmhwYXJhbXMudXRpbHMubDJOb3JtU3F1YXJlZChDLUkqRCxHLUkqQil9aWYoMj50Lmxlbmd0aClyZXR1cm4gY29uc29sZS5lcnJvcigiTGVzcyB0aGFuIHR3byBheGVzIGluIHBhcmFsbGVsIGNvb3JkaW5hdGVzIHBsb3QuIiksbnVsbDtjb25zdCBtPWxbMF0sbj1sWzFdO2lmKG08PXRbMF18fG0+PXRbdC5sZW5ndGgtMV0pcmV0dXJuIG51bGw7Y29uc3QgcT1fLnNvcnRlZEluZGV4KHQsbSk7Y29uc29sZS5hc3NlcnQoMDxxKTsKY29uc29sZS5hc3NlcnQocTx0Lmxlbmd0aCk7Y29uc3QgdT1xLTE7bGV0IHg9bnVsbCxBPW51bGw7ay5mb3JFYWNoKHk9Pntjb25zdCB3PXAoeS5jb250cm9sUG9pbnRzW3VdWzBdLHkuY29udHJvbFBvaW50c1t1XVsxXSx5LmNvbnRyb2xQb2ludHNbcV1bMF0seS5jb250cm9sUG9pbnRzW3FdWzFdKTsxMDA8d3x8IShudWxsPT09eHx8dzx4KXx8KHg9dyxBPXkpfSk7cmV0dXJuIEF9O2YucG9pbnRTY2FsZUludmVyc2VJbWFnZT1mdW5jdGlvbihrLHQsbCl7cmV0dXJuIGsuZG9tYWluKCkuZmlsdGVyKHA9PntwPWsocCk7cmV0dXJuIHQ8PXAmJnA8PWx9KX07Zi5xdWFudGlsZVNjYWxlSW52ZXJzZUltYWdlPWZ1bmN0aW9uKGssdCxsKXtjb25zdCBwPWsucmFuZ2UoKSxtPXAuZmlsdGVyKG49PnQ8PW4mJm48PWwpLm1hcChuPT57Y29uc3QgcT1rLmludmVydEV4dGVudChuKTtyZXR1cm4gbj09PXBbcC5sZW5ndGgtMV0/W3FbMF0scVsxXSsxXTpxfSk7cmV0dXJuIDA9PW0ubGVuZ3RoP1swLAowXTpkMy5leHRlbnQoZDMubWVyZ2UobSkpfTtmLmNvbnRpbnVvdXNTY2FsZUludmVyc2VJbWFnZT1mdW5jdGlvbihrLHQsbCl7cmV0dXJuW2suaW52ZXJ0KHQpLGsuaW52ZXJ0KGwpXS5zb3J0KChwLG0pPT5wLW0pfTtmLmNyZWF0ZUF4aXNTY2FsZT1ofSkoZC5wYXJhbGxlbF9jb29yZHNfcGxvdHx8KGQucGFyYWxsZWxfY29vcmRzX3Bsb3Q9e30pKX0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QvYXhlcy5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtmdW5jdGlvbiBoKHEpe3JldHVybiBudWxsIT09cS5zb3VyY2VFdmVudH1sZXQgazsoZnVuY3Rpb24ocSl7cS5MSU5FQVI9IkxJTkVBUiI7cS5MT0c9IkxPRyI7cS5RVUFOVElMRT0iUVVBTlRJTEUiO3EuTk9OX05VTUVSSUM9Ik5PTl9OVU1FUklDIn0pKGs9Zi5TY2FsZVR5cGV8fChmLlNjYWxlVHlwZT17fSkpO2NsYXNzIHR7aXNQYXNzaW5nKCl7cmV0dXJuITB9fWNsYXNzIGx7Y29uc3RydWN0b3IocSx1LHgsQSl7dGhpcy5fbG93ZXI9cTt0aGlzLl91cHBlcj11O3RoaXMuX2xvd2VyT3Blbj14O3RoaXMuX3VwcGVyT3Blbj1BfWlzUGFzc2luZyhxKXtyZXR1cm4gdGhpcy5fYmVmb3JlKHRoaXMuX2xvd2VyLHEsIXRoaXMuX2xvd2VyT3BlbikmJnRoaXMuX2JlZm9yZShxLHRoaXMuX3VwcGVyLCF0aGlzLl91cHBlck9wZW4pfV9iZWZvcmUocSx1LHgpe3JldHVybiB4P3E8PXU6cTx1fX1jbGFzcyBwe2NvbnN0cnVjdG9yKHEpe3RoaXMuX2RvbWFpblNldD0KcX1pc1Bhc3NpbmcocSl7cmV0dXJuLTEhPT10aGlzLl9kb21haW5TZXQuZmluZEluZGV4KHU9PnU9PT1xKX19Y2xhc3MgbXtjb25zdHJ1Y3RvcihxLHUseCxBKXt0aGlzLl9zdmdQcm9wcz1xO3RoaXMuX3NjaGVtYT11O3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlcj14O3RoaXMuX2NvbEluZGV4PUE7dGhpcy5faXNEaXNwbGF5ZWQ9ITE7dGhpcy5fc2NhbGVUeXBlPXRoaXMuX3lTY2FsZT1udWxsO3RoaXMuc2V0QnJ1c2hTZWxlY3Rpb24obnVsbCl9Y29sSW5kZXgoKXtyZXR1cm4gdGhpcy5fY29sSW5kZXh9eVNjYWxlKCl7cmV0dXJuIHRoaXMuX3lTY2FsZX1zY2FsZVR5cGUoKXtyZXR1cm4gdGhpcy5fc2NhbGVUeXBlfWJydXNoU2VsZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2JydXNoU2VsZWN0aW9ufWlzRGlzcGxheWVkKCl7cmV0dXJuIHRoaXMuX2lzRGlzcGxheWVkfXNldEJydXNoU2VsZWN0aW9uKHEpe3RoaXMuX2JydXNoU2VsZWN0aW9uPXE7dGhpcy5fYnJ1c2hGaWx0ZXI9dGhpcy5fYnVpbGRCcnVzaEZpbHRlcih0aGlzLmJydXNoU2VsZWN0aW9uKCksCnRoaXMuc2NhbGVUeXBlKCksdGhpcy55U2NhbGUoKSl9c2V0RG9tYWluQW5kU2NhbGUocSx1KXt0aGlzLl9zY2FsZVR5cGU9dTt0aGlzLl95U2NhbGU9Yi5ocGFyYW1zLnBhcmFsbGVsX2Nvb3Jkc19wbG90LmNyZWF0ZUF4aXNTY2FsZShxLnNsaWNlKCksdGhpcy5fc3ZnUHJvcHMuaGVpZ2h0LHRoaXMuc2NhbGVUeXBlKCkpO3RoaXMuX2JydXNoRmlsdGVyPXRoaXMuX2J1aWxkQnJ1c2hGaWx0ZXIodGhpcy5icnVzaFNlbGVjdGlvbigpLHRoaXMuc2NhbGVUeXBlKCksdGhpcy55U2NhbGUoKSl9YnJ1c2hGaWx0ZXIoKXtyZXR1cm4gdGhpcy5fYnJ1c2hGaWx0ZXJ9dXBkYXRlRE9NKHEpe3ZhciB1PWQzLmF4aXNMZWZ0KHRoaXMueVNjYWxlKCkpO3RoaXMuc2NhbGVUeXBlKCk9PT1rLlFVQU5USUxFJiYodT11LnRpY2tWYWx1ZXModGhpcy55U2NhbGUoKS5xdWFudGlsZXMoKSkudGlja0Zvcm1hdChkMy5mb3JtYXQoIi0uNmciKSkpO3ZhciB4PWQzLnNlbGVjdChxKTt4LnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpOwp4LmFwcGVuZCgiZyIpLmNsYXNzZWQoImF4aXMiLCEwKS5jYWxsKHUpLmFwcGVuZCgidGV4dCIpLmNsYXNzZWQoImF4aXMtdGl0bGUiLCEwKS5zdHlsZSgiY3Vyc29yIiwibW92ZSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoInkiLC05KS50ZXh0KEE9PmIuaHBhcmFtcy51dGlscy5zY2hlbWFDb2x1bW5OYW1lKHRoaXMuX3NjaGVtYSxBKSk7eC5jYWxsKGQzLmRyYWcoKS5vbigic3RhcnQiLCgpPT57cS5zZXRBdHRyaWJ1dGUoImlzLWRyYWdnaW5nIiwiIik7dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uRHJhZ1N0YXJ0KHRoaXMuY29sSW5kZXgoKSl9KS5vbigiZHJhZyIsKCk9PnRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkRyYWcoZDMuZXZlbnQueCkpLm9uKCJlbmQiLCgpPT57dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uRHJhZ0VuZCgpO3EucmVtb3ZlQXR0cmlidXRlKCJpcy1kcmFnZ2luZyIpfSkpO3U9ZDMuYnJ1c2hZKCkuZXh0ZW50KFtbLTgsMF0sCls4LHRoaXMuX3N2Z1Byb3BzLmhlaWdodCsxXV0pLm9uKCJzdGFydCIsKCk9PntoKGQzLmV2ZW50KSYmKHEuc2V0QXR0cmlidXRlKCJpcy1icnVzaGluZyIsIiIpLHRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkJydXNoQ2hhbmdlZCh0aGlzLmNvbEluZGV4KCkpKX0pLm9uKCJicnVzaCIsKCk9PntpZihoKGQzLmV2ZW50KSl0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25CcnVzaENoYW5nZWQodGhpcy5jb2xJbmRleCgpKX0pLm9uKCJlbmQiLCgpPT57aChkMy5ldmVudCkmJih0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25CcnVzaENoYW5nZWQodGhpcy5jb2xJbmRleCgpKSxxLnJlbW92ZUF0dHJpYnV0ZSgiaXMtYnJ1c2hpbmciKSl9KTt4PWQzLnNlbGVjdChxKS5hcHBlbmQoImciKS5jbGFzc2VkKCJicnVzaCIsITApO3guY2FsbCh1KTt1Lm1vdmUoeCx0aGlzLmJydXNoU2VsZWN0aW9uKCkpfXNldERpc3BsYXllZChxKXt0aGlzLl9pc0Rpc3BsYXllZD1xfV9idWlsZEJydXNoRmlsdGVyKHEsCnUseCl7aWYobnVsbD09PXEpcmV0dXJuIG5ldyB0O2lmKG51bGw9PT11KXJldHVybiBjb25zb2xlLmVycm9yKCJTY2FsZSB0eXBlIGlzIG51bGwsIGJ1dCBicnVzaFNlbGVjdGlvbiBpc24ndDogIixxKSxuZXcgdDtzd2l0Y2godSl7Y2FzZSBrLkxJTkVBUjpjYXNlIGsuTE9HOntjb25zdCBbQSx5XT1iLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuY29udGludW91c1NjYWxlSW52ZXJzZUltYWdlKHgscVswXSxxWzFdKTtyZXR1cm4gbmV3IGwoQSx5LCExLCExKX1jYXNlIGsuUVVBTlRJTEU6e2NvbnN0IFtBLHldPWIuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5xdWFudGlsZVNjYWxlSW52ZXJzZUltYWdlKHgscVswXSxxWzFdKTtyZXR1cm4gbmV3IGwoQSx5LCExLCEwKX1jYXNlIGsuTk9OX05VTUVSSUM6cmV0dXJuIG5ldyBwKGIuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5wb2ludFNjYWxlSW52ZXJzZUltYWdlKHgscVswXSxxWzFdKSl9Y29uc29sZS5lcnJvcigiVW5rbm93biBzY2FsZSB0eXBlOiAiLAp1KTtyZXR1cm4gbmV3IHR9fWYuQXhpcz1tO2NsYXNzIG57Y29uc3RydWN0b3IocSx1LHgpe3RoaXMuX3N2Z1Byb3BzPXE7dGhpcy5fc2NoZW1hPXU7dGhpcy5fYXhlcz10aGlzLl9jcmVhdGVBeGVzKHgpO3RoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zPWQzLnNjYWxlUG9pbnQoKS5yYW5nZShbMSx0aGlzLl9zdmdQcm9wcy53aWR0aC0xXSkucGFkZGluZyguNSk7dGhpcy5fZHJhZ2dlZEF4aXM9bnVsbDt0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5heGlzLXBhcmVudCIpLnJlbW92ZSgpO3RoaXMuX3BhcmVudHNTZWw9dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoIi5heGlzLXBhcmVudCIpfXVwZGF0ZUF4ZXMocSx1KXtjb25zb2xlLmFzc2VydCghdGhpcy5pc0F4aXNEcmFnZ2luZygpKTtjb25zdCB4PW5ldyBTZXQ7cS5jb2x1bW5zLmZvckVhY2goeT0+e2NvbnN0IHc9eS5hYnNvbHV0ZUluZGV4O2xldCBDPXRoaXMuX2F4ZXNbd107Qy5zZXREaXNwbGF5ZWQoITApOwpjb25zdCBHPXUubWFwKEQ9PmIuaHBhcmFtcy51dGlscy5jb2x1bW5WYWx1ZUJ5SW5kZXgodGhpcy5fc2NoZW1hLEQsdykpO0Muc2V0RG9tYWluQW5kU2NhbGUoRyx5LnNjYWxlKTt4LmFkZCh3KX0pO3RoaXMuX2F4ZXMuZm9yRWFjaCh5PT57eC5oYXMoeS5jb2xJbmRleCgpKXx8eS5zZXREaXNwbGF5ZWQoITEpfSk7dGhpcy5fdXBkYXRlU3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMoeCk7dGhpcy5fcGFyZW50c1NlbD10aGlzLl9wYXJlbnRzU2VsLmRhdGEoQXJyYXkuZnJvbSh4KSx5PT55KTt0aGlzLl9wYXJlbnRzU2VsLmV4aXQoKS5yZW1vdmUoKTt0aGlzLl9wYXJlbnRzU2VsPXRoaXMuX3BhcmVudHNTZWwuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJheGlzLXBhcmVudCIsITApLm1lcmdlKHRoaXMuX3BhcmVudHNTZWwpO2NvbnN0IEE9dGhpczt0aGlzLl9wYXJlbnRzU2VsLmNhbGwoeT0+dGhpcy5fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHkpKS5lYWNoKGZ1bmN0aW9uKHkpe0EuX2F4ZXNbeV0udXBkYXRlRE9NKHRoaXMpfSl9bWFwVmlzaWJsZUF4ZXMocSl7cmV0dXJuIHRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpLm1hcCh1PT4KcSh0aGlzLmdldEF4aXNQb3NpdGlvbih1KSx0aGlzLl9heGVzW3VdKSl9YWxsVmlzaWJsZUF4ZXNTYXRpc2Z5KHEpe3JldHVybiB0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKS5ldmVyeSh1PT5xKHRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHUpLHRoaXMuX2F4ZXNbdV0pKX1nZXRBeGlzRm9yQ29sSW5kZXgocSl7cmV0dXJuIHRoaXMuX2F4ZXNbcV19ZHJhZ1N0YXJ0KHEpe2NvbnNvbGUuYXNzZXJ0KCF0aGlzLmlzQXhpc0RyYWdnaW5nKCkpO2NvbnNvbGUuYXNzZXJ0KHRoaXMuX2F4ZXNbcV0uaXNEaXNwbGF5ZWQoKSk7dGhpcy5fZHJhZ2dlZEF4aXM9dGhpcy5fYXhlc1txXTt0aGlzLl9kcmFnZ2VkQXhpc1Bvc2l0aW9uPXRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zKHEpfWRyYWcocSl7dGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj1xPU1hdGgubWluKE1hdGgubWF4KHEsMCksdGhpcy5fc3ZnUHJvcHMud2lkdGgpO3E9dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCk7CnEuc29ydCgodSx4KT0+dGhpcy5nZXRBeGlzUG9zaXRpb24odSktdGhpcy5nZXRBeGlzUG9zaXRpb24oeCkpO3RoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbihxKTt0aGlzLl91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00odGhpcy5fcGFyZW50c1NlbCl9ZHJhZ0VuZCgpe2NvbnNvbGUuYXNzZXJ0KHRoaXMuaXNBeGlzRHJhZ2dpbmcoKSk7dGhpcy5fZHJhZ2dlZEF4aXM9dGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj1udWxsO3RoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh0aGlzLl9wYXJlbnRzU2VsLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApKX1pc0F4aXNEcmFnZ2luZygpe3JldHVybiBudWxsIT09dGhpcy5fZHJhZ2dlZEF4aXN9Z2V0QXhpc1Bvc2l0aW9uKHEpe3JldHVybiBudWxsIT09dGhpcy5fZHJhZ2dlZEF4aXMmJnRoaXMuX2RyYWdnZWRBeGlzLmNvbEluZGV4KCk9PT1xP3RoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb246dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMocSl9X3VwZGF0ZVN0YXRpb25hcnlBeGVzUG9zaXRpb25zKHEpe3ZhciB1PQp0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKS5maWx0ZXIoeD0+cS5oYXMoeCkpO3U9QXJyYXkuZnJvbShuZXcgU2V0KFsuLi51LC4uLkFycmF5LmZyb20ocSldKSk7dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKHUpfV91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00ocSl7cS5hdHRyKCJ0cmFuc2Zvcm0iLHU9PmIuaHBhcmFtcy51dGlscy50cmFuc2xhdGVTdHIodGhpcy5nZXRBeGlzUG9zaXRpb24odSkpKX1fY3JlYXRlQXhlcyhxKXtyZXR1cm4gZDMucmFuZ2UoYi5ocGFyYW1zLnV0aWxzLm51bUNvbHVtbnModGhpcy5fc2NoZW1hKSkubWFwKHU9Pm5ldyBtKHRoaXMuX3N2Z1Byb3BzLHRoaXMuX3NjaGVtYSxxLHUpKX19Zi5BeGVzQ29sbGVjdGlvbj1ufSkoZC5wYXJhbGxlbF9jb29yZHNfcGxvdHx8KGQucGFyYWxsZWxfY29vcmRzX3Bsb3Q9e30pKX0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QvbGluZXMuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXsoZnVuY3Rpb24oZil7bGV0IGg7KGZ1bmN0aW9uKGwpe2xbbC5GT1JFR1JPVU5EPTBdPSJGT1JFR1JPVU5EIjtsW2wuQkFDS0dST1VORD0xXT0iQkFDS0dST1VORCJ9KShoPWYuTGluZVR5cGV8fChmLkxpbmVUeXBlPXt9KSk7Y2xhc3Mga3tjb25zdHJ1Y3RvcihsKXt2b2lkIDA9PT1sJiYobD1kMy5zZWxlY3RBbGwobnVsbCkpO2NvbnNvbGUuYXNzZXJ0KDE+PWwuc2l6ZSgpKTt0aGlzLl9zZXNzaW9uR3JvdXBTZWw9bH1zZXNzaW9uR3JvdXAoKXtyZXR1cm4gMT09PXRoaXMuX3Nlc3Npb25Hcm91cFNlbC5zaXplKCk/dGhpcy5fc2Vzc2lvbkdyb3VwU2VsLmRhdHVtKCk6bnVsbH1pc051bGwoKXtyZXR1cm4gbnVsbD09PXRoaXMuc2Vzc2lvbkdyb3VwKCl9c2VsZWN0aW9uKCl7cmV0dXJuIHRoaXMuX3Nlc3Npb25Hcm91cFNlbH1lcXVhbHNUbyhsKXtyZXR1cm4gdGhpcy5pc051bGwoKT9sLmlzTnVsbCgpOmwuaXNOdWxsKCk/ITE6bC5zZXNzaW9uR3JvdXAoKS5uYW1lPT0KdGhpcy5zZXNzaW9uR3JvdXAoKS5uYW1lfX1mLlNlc3Npb25Hcm91cEhhbmRsZT1rO2NsYXNzIHR7Y29uc3RydWN0b3IobCxwLG0pe3RoaXMuX3N2Z1Byb3BzPWw7dGhpcy5fc2NoZW1hPXA7dGhpcy5fYXhlc0NvbGxlY3Rpb249bTt0aGlzLl9zZXNzaW9uR3JvdXBzPVtdO3RoaXMuX3N2Z1Byb3BzLnN2Z0cuc2VsZWN0QWxsKCJnLmJhY2tncm91bmQiKS5yZW1vdmUoKTt0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5mb3JlZ3JvdW5kIikucmVtb3ZlKCk7dGhpcy5fYmdQYXRoc1NlbD10aGlzLl9zdmdQcm9wcy5zdmdHLmFwcGVuZCgiZyIpLmNsYXNzZWQoImJhY2tncm91bmQiLCEwKS5zZWxlY3RBbGwoInBhdGgiKTt0aGlzLl9mZ1BhdGhzU2VsPXRoaXMuX3N2Z1Byb3BzLnN2Z0cuYXBwZW5kKCJnIikuY2xhc3NlZCgiZm9yZWdyb3VuZCIsITApLnNlbGVjdEFsbCgicGF0aCIpO3RoaXMuX3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlPQpuZXcgazt0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZT1uZXcgazt0aGlzLl9kM2xpbmU9ZDMubGluZSgpLmN1cnZlKGQzLmN1cnZlTGluZWFyKX1nZXRTZXNzaW9uR3JvdXBIYW5kbGUobCl7cmV0dXJuIG51bGw9PT1sfHx2b2lkIDA9PT1sP25ldyBrOm5ldyBrKHRoaXMuX2ZnUGF0aHNTZWwuZmlsdGVyKHA9PnAubmFtZT09PWwubmFtZSkpfWhpZGVCYWNrZ3JvdW5kTGluZXMoKXt0aGlzLl9iZ1BhdGhzU2VsLmF0dHIoInZpc2liaWxpdHkiLCJoaWRkZW4iKX1zaG93QmFja2dyb3VuZExpbmVzKCl7dGhpcy5fYmdQYXRoc1NlbC5hdHRyKCJ2aXNpYmlsaXR5IixudWxsKX1wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKXtyZXR1cm4gdGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlfXNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCl7cmV0dXJuIHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlfXJlY29tcHV0ZUNvbnRyb2xQb2ludHMobCxwPTApeyhsPT09aC5GT1JFR1JPVU5EPwp0aGlzLl9mZ1BhdGhzU2VsOnRoaXMuX2JnUGF0aHNTZWwpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihwKS5hdHRyKCJkIixtPT50aGlzLl9wYXRoREF0dHJpYnV0ZShtKSk7bD09PWguRk9SRUdST1VORCYmd2luZG93LnNldFRpbWVvdXQoKCk9Pntjb25zdCBtPXRoaXM7dGhpcy5fZmdQYXRoc1NlbC5lYWNoKGZ1bmN0aW9uKG4pe20uX3NldENvbnRyb2xQb2ludHNQcm9wZXJ0eSh0aGlzLG4pfSl9KX1yZWNvbXB1dGVGb3JlZ3JvdW5kTGluZXNWaXNpYmlsaXR5KCl7dGhpcy5fZmdQYXRoc1NlbC5jbGFzc2VkKCJpbnZpc2libGUtcGF0aCIsbD0+IXRoaXMuX2F4ZXNDb2xsZWN0aW9uLmFsbFZpc2libGVBeGVzU2F0aXNmeSgocCxtKT0+bS5icnVzaEZpbHRlcigpLmlzUGFzc2luZyhiLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeUluZGV4KHRoaXMuX3NjaGVtYSxsLG0uY29sSW5kZXgoKSkpKSk7dGhpcy5fdXBkYXRlVmlzaWJsZUZnUGF0aHNTZWwoKX1zZXRGb3JlZ3JvdW5kTGluZXNDb2xvcihsLApwLG0pe2w9dGhpcy5fY3JlYXRlTGluZUNvbG9yRnVuY3Rpb24obCxwLG0pO3RoaXMuX2ZnUGF0aHNTZWwuYXR0cigic3Ryb2tlIixsKX1yZWRyYXcobCxwLG0sbil7Y29uc3QgcT10aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2Vzc2lvbkdyb3VwKCksdT10aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZS5zZXNzaW9uR3JvdXAoKTt0aGlzLl9zZXNzaW9uR3JvdXBzPWw7dGhpcy5fZmdQYXRoc1NlbD10aGlzLl9yZWNvbXB1dGVQYXRoU2VsZWN0aW9uKHRoaXMuX2ZnUGF0aHNTZWwpO3RoaXMuX2JnUGF0aHNTZWw9dGhpcy5fcmVjb21wdXRlUGF0aFNlbGVjdGlvbih0aGlzLl9iZ1BhdGhzU2VsKTt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGU9dGhpcy5nZXRTZXNzaW9uR3JvdXBIYW5kbGUocSk7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9dGhpcy5nZXRTZXNzaW9uR3JvdXBIYW5kbGUodSk7dGhpcy5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGguRk9SRUdST1VORCk7CnRoaXMucmVjb21wdXRlQ29udHJvbFBvaW50cyhoLkJBQ0tHUk9VTkQpO3RoaXMucmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpO3RoaXMuc2V0Rm9yZWdyb3VuZExpbmVzQ29sb3IocCxtLG4pfXVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cChsKXt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgicGVha2VkLXBhdGgiLCExKTt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGU9bDt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgicGVha2VkLXBhdGgiLCEwKX1jbGVhclBlYWtlZFNlc3Npb25Hcm91cCgpe3RoaXMudXBkYXRlUGVha2VkU2Vzc2lvbkdyb3VwKG5ldyBrKX11cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cChsKXt0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZS5zZWxlY3Rpb24oKS5jbGFzc2VkKCJzZWxlY3RlZC1wYXRoIiwhMSk7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9Cmw7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgic2VsZWN0ZWQtcGF0aCIsITApfWZpbmRDbG9zZXN0U2Vzc2lvbkdyb3VwKGwscCl7Y29uc3QgbT10aGlzLl9heGVzQ29sbGVjdGlvbi5tYXBWaXNpYmxlQXhlcyhuPT5uKTtsPWIuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5maW5kQ2xvc2VzdFBhdGgodGhpcy5fdmlzaWJsZUZnUGF0aHNTZWwubm9kZXMoKSxtLFtsLHBdKTtyZXR1cm4gbnVsbD09PWw/bmV3IGs6bmV3IGsoZDMuc2VsZWN0KGwpKX1fY3JlYXRlTGluZUNvbG9yRnVuY3Rpb24obCxwLG0pe2lmKG51bGw9PT1sKXJldHVybigpPT4icmVkIjtjb25zdCBuPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKGIuaHBhcmFtcy51dGlscy5udW1lcmljQ29sdW1uRXh0ZW50KHRoaXMuX3NjaGVtYSx0aGlzLl9zZXNzaW9uR3JvdXBzLGwpKS5yYW5nZShbcCxtXSkuaW50ZXJwb2xhdGUoZDMuaW50ZXJwb2xhdGVMYWIpO3JldHVybiBxPT4KbihiLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeUluZGV4KHRoaXMuX3NjaGVtYSxxLGwpKX1fcmVjb21wdXRlUGF0aFNlbGVjdGlvbihsKXtsPWwuZGF0YSh0aGlzLl9zZXNzaW9uR3JvdXBzLHA9PnAubmFtZSk7bC5leGl0KCkucmVtb3ZlKCk7cmV0dXJuIGwuZW50ZXIoKS5hcHBlbmQoInBhdGgiKS5tZXJnZShsKX1fc2V0Q29udHJvbFBvaW50c1Byb3BlcnR5KGwscCl7bC5jb250cm9sUG9pbnRzPXRoaXMuX2NvbXB1dGVDb250cm9sUG9pbnRzKHApfV9jb21wdXRlQ29udHJvbFBvaW50cyhsKXtyZXR1cm4gdGhpcy5fYXhlc0NvbGxlY3Rpb24ubWFwVmlzaWJsZUF4ZXMoKHAsbSk9PltwLG0ueVNjYWxlKCkoYi5ocGFyYW1zLnV0aWxzLmNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEsbCxtLmNvbEluZGV4KCkpKV0pfV9wYXRoREF0dHJpYnV0ZShsKXtyZXR1cm4gdGhpcy5fZDNsaW5lKHRoaXMuX2NvbXB1dGVDb250cm9sUG9pbnRzKGwpKX1fdXBkYXRlVmlzaWJsZUZnUGF0aHNTZWwoKXt0aGlzLl92aXNpYmxlRmdQYXRoc1NlbD0KdGhpcy5fZmdQYXRoc1NlbC5maWx0ZXIoIjpub3QoLmludmlzaWJsZS1wYXRoKSIpfX1mLkxpbmVzQ29sbGVjdGlvbj10fSkoZC5wYXJhbGxlbF9jb29yZHNfcGxvdHx8KGQucGFyYWxsZWxfY29vcmRzX3Bsb3Q9e30pKX0pKGIuaHBhcmFtc3x8KGIuaHBhcmFtcz17fSkpfSkodGZ8fCh0Zj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QvaW50ZXJhY3Rpb25fbWFuYWdlci5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtjbGFzcyBoe2NvbnN0cnVjdG9yKHQsbCl7dGhpcy5zdmc9ZDMuc2VsZWN0KHQpO3Q9MTAwKmwrMjA7dGhpcy5zdmcuYXR0cigidmlld0JveCIsYDAgMCAke3R9ICR7MjQwfWApO3RoaXMuc3ZnLmF0dHIoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCIpO3RoaXMuc3ZnLnN0eWxlKCJtaW4td2lkdGgiLHQrInB4Iik7dGhpcy5zdmcuc3R5bGUoIm1pbi1oZWlnaHQiLCIyNDBweCIpO3RoaXMud2lkdGg9dC0xMC0xMDt0aGlzLmhlaWdodD0yMDA7dGhpcy5zdmdHPXRoaXMuc3ZnLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsYi5ocGFyYW1zLnV0aWxzLnRyYW5zbGF0ZVN0cigxMCwzMCkpfX1mLlNWR1Byb3BlcnRpZXM9aDtjbGFzcyBre2NvbnN0cnVjdG9yKHQsbCxwLG0pe3RoaXMuX3N2Z1Byb3BzPXQ7dGhpcy5fc2NoZW1hPWw7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCPXA7dGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0I9Cm07dGhpcy5fYXhlc0NvbGxlY3Rpb249bmV3IGYuQXhlc0NvbGxlY3Rpb24odCxsLHRoaXMpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbj1uZXcgZi5MaW5lc0NvbGxlY3Rpb24odCxsLHRoaXMuX2F4ZXNDb2xsZWN0aW9uKTt0aGlzLl9zdmdQcm9wcy5zdmcub24oImNsaWNrIiwoKT0+dGhpcy5vbkNsaWNrKCkpLm9uKCJtb3VzZW1vdmUgbW91c2VlbnRlciIsKCk9Pntjb25zdCBbbixxXT1kMy5tb3VzZSh0aGlzLl9zdmdQcm9wcy5zdmdHLm5vZGUoKSk7dGhpcy5vbk1vdXNlTW92ZWQobixxKX0pLm9uKCJtb3VzZWxlYXZlIiwoKT0+dGhpcy5vbk1vdXNlTGVhdmUoKSl9b25EcmFnU3RhcnQodCl7dGhpcy5fYXhlc0NvbGxlY3Rpb24uZHJhZ1N0YXJ0KHQpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5oaWRlQmFja2dyb3VuZExpbmVzKCl9b25EcmFnKHQpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmRyYWcodCk7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZi5MaW5lVHlwZS5GT1JFR1JPVU5EKX1vbkRyYWdFbmQoKXt0aGlzLl9heGVzQ29sbGVjdGlvbi5kcmFnRW5kKCk7CnRoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKGYuTGluZVR5cGUuRk9SRUdST1VORCw1MDApO3dpbmRvdy5zZXRUaW1lb3V0KCgpPT57dGhpcy5fbGluZXNDb2xsZWN0aW9uLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoZi5MaW5lVHlwZS5CQUNLR1JPVU5EKTt0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2hvd0JhY2tncm91bmRMaW5lcygpfSw1MDApfW9uQnJ1c2hDaGFuZ2VkKHQpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmdldEF4aXNGb3JDb2xJbmRleCh0KS5zZXRCcnVzaFNlbGVjdGlvbihkMy5ldmVudC5zZWxlY3Rpb24pO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVGb3JlZ3JvdW5kTGluZXNWaXNpYmlsaXR5KCl9b25Nb3VzZU1vdmVkKHQsbCl7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cCh0aGlzLl9saW5lc0NvbGxlY3Rpb24uZmluZENsb3Nlc3RTZXNzaW9uR3JvdXAodCxsKSk7dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9b25Nb3VzZUxlYXZlKCl7dGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpLmlzTnVsbCgpfHwKKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5jbGVhclBlYWtlZFNlc3Npb25Hcm91cCgpLHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQihudWxsKSl9b25DbGljaygpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKT09PXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpP3RoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cChuZXcgZi5TZXNzaW9uR3JvdXBIYW5kbGUpOnRoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cCh0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkpO3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpKX1vbk9wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKHQsCmwpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLnVwZGF0ZUF4ZXModCxsKTtjb25zdCBwPXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSxtPXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWRyYXcobCx2b2lkIDAhPT10LmNvbG9yQnlDb2x1bW5JbmRleD90LmNvbHVtbnNbdC5jb2xvckJ5Q29sdW1uSW5kZXhdLmFic29sdXRlSW5kZXg6bnVsbCx0Lm1pbkNvbG9yLHQubWF4Q29sb3IpO3AuZXF1YWxzVG8odGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpKXx8dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSk7bS5lcXVhbHNUbyh0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSl8fAp0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9c2NoZW1hKCl7cmV0dXJuIHRoaXMuX3NjaGVtYX19Zi5JbnRlcmFjdGlvbk1hbmFnZXI9a30pKGQucGFyYWxsZWxfY29vcmRzX3Bsb3R8fChkLnBhcmFsbGVsX2Nvb3Jkc19wbG90PXt9KSl9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdCIscHJvcGVydGllczp7c2Vzc2lvbkdyb3VwczpBcnJheSxvcHRpb25zOk9iamVjdCxzZWxlY3RlZFNlc3Npb25Hcm91cDp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbCxyZWFkT25seTohMCxub3RpZnk6ITB9LGNsb3Nlc3RTZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGwscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxyZWRyYXdDb3VudDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX3ZhbGlkU2Vzc2lvbkdyb3VwczpBcnJheSxfaW50ZXJhY3Rpb25NYW5hZ2VyOk9iamVjdH0sb2JzZXJ2ZXJzOlsiX29wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKG9wdGlvbnMuKiwgc2Vzc2lvbkdyb3Vwcy4qKSJdLF9vcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZCgpe2lmKG51bGwhPT10aGlzLm9wdGlvbnMpe3ZhciBiPXRoaXMub3B0aW9ucy5jb25maWd1cmF0aW9uO2lmKHZvaWQgMD09PXRoaXMuX2ludGVyYWN0aW9uTWFuYWdlcnx8CiFfLmlzRXF1YWwodGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLnNjaGVtYSgpLGIuc2NoZW1hKSl7ZDMuc2VsZWN0KHRoaXMuJC5zdmcpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpO2NvbnN0IGQ9bmV3IHRmLmhwYXJhbXMucGFyYWxsZWxfY29vcmRzX3Bsb3QuU1ZHUHJvcGVydGllcyh0aGlzLiQuc3ZnLHRmLmhwYXJhbXMudXRpbHMubnVtQ29sdW1ucyhiLnNjaGVtYSkpO3RoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5zdmcsITApO3RoaXMuX2ludGVyYWN0aW9uTWFuYWdlcj1uZXcgdGYuaHBhcmFtcy5wYXJhbGxlbF9jb29yZHNfcGxvdC5JbnRlcmFjdGlvbk1hbmFnZXIoZCxiLnNjaGVtYSxmPT50aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKGYpLGY9PnRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkKGYpKX10aGlzLl9jb21wdXRlVmFsaWRTZXNzaW9uR3JvdXBzKCk7dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uT3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQodGhpcy5vcHRpb25zLAp0aGlzLl92YWxpZFNlc3Npb25Hcm91cHMpO3RoaXMucmVkcmF3Q291bnQrK319LGNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKGIpe3RoaXMuX3NldENsb3Nlc3RTZXNzaW9uR3JvdXAoYil9LHNlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZChiKXt0aGlzLl9zZXRTZWxlY3RlZFNlc3Npb25Hcm91cChiKX0sX2NvbXB1dGVWYWxpZFNlc3Npb25Hcm91cHMoKXtjb25zdCBiPXRmLmhwYXJhbXMudXRpbHM7aWYodm9pZCAwPT09dGhpcy5zZXNzaW9uR3JvdXBzKXRoaXMuX3ZhbGlkU2Vzc2lvbkdyb3Vwcz12b2lkIDA7ZWxzZXt2YXIgZD10aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbi5zY2hlbWE7dGhpcy5fdmFsaWRTZXNzaW9uR3JvdXBzPXRoaXMuc2Vzc2lvbkdyb3Vwcy5maWx0ZXIoZj0+e2ZvcihsZXQgaD0wO2g8Yi5udW1Db2x1bW5zKGQpOysraClpZih0aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbi5jb2x1bW5zVmlzaWJpbGl0eVtoXSYmdm9pZCAwPT09Yi5jb2x1bW5WYWx1ZUJ5SW5kZXgoZCwKZixoKSlyZXR1cm4hMTtyZXR1cm4hMH0pfX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXcuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsZXhwZXJpbWVudE5hbWU6U3RyaW5nLGNvbmZpZ3VyYXRpb246T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXl9LF9jbG9zZXN0T3JTZWxlY3RlZDpmdW5jdGlvbihiLGQpe3JldHVybiBudWxsIT09Yj9iOmR9fSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QvdGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QuaHRtbC5qcwpQb2x5bWVyKHtpczoidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiLHByb3BlcnRpZXM6e3Zpc2libGVTY2hlbWE6T2JqZWN0LHNlc3Npb25Hcm91cHM6QXJyYXksb3B0aW9uczpPYmplY3Qsc2VsZWN0ZWRTZXNzaW9uR3JvdXA6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGwscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSxjbG9zZXN0U2Vzc2lvbkdyb3VwOnt0eXBlOk9iamVjdCx2YWx1ZTpudWxsLHJlYWRPbmx5OiEwLG5vdGlmeTohMH0sX2NvbnRhaW5lcjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sX3N2Zzp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH0sd2lkdGg6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LGhlaWdodDp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sX2JydXNoZWRDZWxsSW5kZXg6e3R5cGU6T2JqZWN0LHZhbHVlOm51bGx9LF9icnVzaFNlbGVjdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZXNzaW9uR3JvdXBzQ2hhbmdlZChzZXNzaW9uR3JvdXBzLiopIiwKIl92aXNpYmxlU2NoZW1hQ2hhbmdlZCh2aXNpYmxlU2NoZW1hLiopIiwiX3JlZHJhdyhvcHRpb25zLiopIl0scmVhZHkoKXt0aGlzLl9jb250YWluZXI9dGhpcy4kLmNvbnRhaW5lcjt0aGlzLl9zdmc9ZDMuc2VsZWN0KHRoaXMuJC5zdmcpO3RoaXMuX3JlZHJhdygpfSxfc2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtudWxsIT09dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cCYmdGhpcy5fc2V0U2VsZWN0ZWRTZXNzaW9uR3JvdXAodGYuaHBhcmFtcy51dGlscy5zZXNzaW9uR3JvdXBXaXRoTmFtZSh0aGlzLnNlc3Npb25Hcm91cHMsdGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cC5uYW1lKXx8bnVsbCk7dGhpcy5fcmVkcmF3KCl9LF92aXNpYmxlU2NoZW1hQ2hhbmdlZCgpe3RoaXMuX2JydXNoU2VsZWN0aW9uPXRoaXMuX2JydXNoZWRDZWxsSW5kZXg9bnVsbDt0aGlzLl9yZWRyYXcoKX0sX3JlZHJhdygpe3RoaXMuZGVib3VuY2UoIl9yZWRyYXciLCgpPT57Y29uc3QgYj10Zi5ocGFyYW1zLnV0aWxzOwp0aGlzLndpZHRoPU1hdGgubWF4KDE1MCpiLm51bVZpc2libGVDb2x1bW5zKHRoaXMudmlzaWJsZVNjaGVtYSksMTIwMCk7dGhpcy5oZWlnaHQ9TWF0aC5tYXgoMTEyLjUqYi5udW1WaXNpYmxlTWV0cmljcyh0aGlzLnZpc2libGVTY2hlbWEpLDQ4MCk7dGhpcy5fY29udGFpbmVyLnN0eWxlLndpZHRoPXRoaXMud2lkdGgrInB4Ijt0aGlzLl9jb250YWluZXIuc3R5bGUuaGVpZ2h0PXRoaXMuaGVpZ2h0KyJweCI7dGhpcy5fc3ZnLmF0dHIoIndpZHRoIix0aGlzLndpZHRoKS5hdHRyKCJoZWlnaHQiLHRoaXMuaGVpZ2h0KTt0aGlzLl9zdmcuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dGhpcy5fZHJhdygpfSwxMDApfSxfZHJhdygpe2Z1bmN0aW9uIGIoa2Epe3JldHVybiJ4LWF4aXMtY2xpcC1wYXRoLSIra2F9ZnVuY3Rpb24gZChrYSl7cmV0dXJuIngtbGFiZWwtY2xpcC1wYXRoLSIra2F9ZnVuY3Rpb24gZihrYSl7cmV0dXJuInktYXhpcy1jbGlwLXBhdGgtIitrYX1mdW5jdGlvbiBoKGthKXtyZXR1cm4ieS1sYWJlbC1jbGlwLXBhdGgtIisKa2F9ZnVuY3Rpb24gayhrYSxZLEVhLHZhLHhhKXtFYT1NYXRoLmZsb29yKEVhL3ZhKTt2YT1ZLnNjYWxlKCk7aWYoIlFVQU5USUxFIj09PXhhKXtsZXQgQWE9dmEucXVhbnRpbGVzKCk7QWE9ZDMucmFuZ2UoMCxBYS5sZW5ndGgsTWF0aC5jZWlsKEFhLmxlbmd0aC9FYSkpLm1hcChGYT0+QWFbRmFdKTtZLnRpY2tWYWx1ZXMoQWEpLnRpY2tGb3JtYXQoZDMuZm9ybWF0KCItLjJnIikpfSJMSU5FQVIiIT09eGEmJiJMT0ciIT09eGF8fFkudGlja3MoRWEpO2thLmNhbGwoWSk7a2Euc2VsZWN0QWxsKCIuZG9tYWluIikucmVtb3ZlKCk7a2Euc2VsZWN0QWxsKCIudGljayBsaW5lIikuYXR0cigic3Ryb2tlIiwiI2RkZCIpfWZ1bmN0aW9uIHQoa2EsWSl7cmV0dXJuIE9bWV0ody5fY29sVmFsdWUoa2EsWSkpfWZ1bmN0aW9uIGwoa2EsWSl7cmV0dXJuIEhbWV0ody5fbWV0cmljVmFsdWUoa2EsWSkpfWZ1bmN0aW9uIHAoa2EsWSl7Y29uc3QgRWE9W107VFtrYV1bWV0uZWFjaChmdW5jdGlvbigpe0VhLnB1c2godGhpcyl9KTsKcmV0dXJuIGQzLnF1YWR0cmVlKCkueCh2YT0+ZDMuc2VsZWN0KHZhKS5kYXR1bSgpLngpLnkodmE9PmQzLnNlbGVjdCh2YSkuZGF0dW0oKS55KS5hZGRBbGwoRWEpfWZ1bmN0aW9uIG0oKXtsZXQga2E9bmV3IFNldChRLm5vZGVzKCkpO3goKXx8KGthPW4ody5fYnJ1c2hlZENlbGxJbmRleCx3Ll9icnVzaFNlbGVjdGlvbikpO2QzLnNlbGVjdEFsbChBcnJheS5mcm9tKHkuZmlsdGVyU2V0KGthLFk9PiFaLmhhcyhZKSkpKS5hdHRyKCJmaWxsIixMKTtkMy5zZWxlY3RBbGwoQXJyYXkuZnJvbSh5LmZpbHRlclNldChaLFk9PiFrYS5oYXMoWSkpKSkuYXR0cigiZmlsbCIsIiNkZGQiKTtaPWthfWZ1bmN0aW9uIG4oa2EsWSl7Y29uc29sZS5hc3NlcnQobnVsbCE9PWthKTtjb25zb2xlLmFzc2VydChudWxsIT09WSk7Y29uc3QgW0VhLHZhXT1rYSx4YT1uZXcgU2V0O3kucXVhZFRyZWVWaXNpdFBvaW50c0luUmVjdChhYVtFYV1bdmFdLFlbMF1bMF0sWVswXVsxXSxZWzFdWzBdLFlbMV1bMV0sCkFhPT57ZDMuc2VsZWN0KEFhKS5kYXR1bSgpLnNlc3Npb25Hcm91cE1hcmtlcnMuZm9yRWFjaChGYT0+e3hhLmFkZChGYSl9KX0pO3JldHVybiB4YX1mdW5jdGlvbiBxKGthKXtjb25zdCBZPWQzLmJydXNoU2VsZWN0aW9uKGthKTshdSgpJiZudWxsPT09WXx8dSgpJiZrYT09PWxhLm5vZGUoKSYmXy5pc0VxdWFsKFksdy5fYnJ1c2hTZWxlY3Rpb24pfHwody5fYnJ1c2hTZWxlY3Rpb249WSxudWxsIT09WT8obGE9ZDMuc2VsZWN0KGthKSx3Ll9icnVzaGVkQ2VsbEluZGV4PWxhLmRhdHVtKCkpOihsYT1udWxsLHcuX2JydXNoZWRDZWxsSW5kZXg9bnVsbCksbSgpKX1mdW5jdGlvbiB1KCl7cmV0dXJuIG51bGwhPT13Ll9icnVzaGVkQ2VsbEluZGV4JiZudWxsIT09dy5fYnJ1c2hTZWxlY3Rpb259ZnVuY3Rpb24geCgpe3JldHVybiF1KCl8fHcuX2JydXNoU2VsZWN0aW9uWzBdWzBdPT09dy5fYnJ1c2hTZWxlY3Rpb25bMV1bMF18fHcuX2JydXNoU2VsZWN0aW9uWzBdWzFdPT09dy5fYnJ1c2hTZWxlY3Rpb25bMV1bMV19CmZ1bmN0aW9uIEEoa2EsWSxFYSx2YSx4YSl7bGV0IEFhPUluZmluaXR5LEZhPW51bGw7eS5xdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrKGFhW2thXVtZXSxFYSx2YSx4YSwoeWEsU2EpPT57Wi5oYXMoeWEpJiZTYTxBYSYmKHlhPWQzLnNlbGVjdCh5YSkuZGF0dW0oKSxBYT1TYSxGYT15YS5zZXNzaW9uR3JvdXApfSk7cmV0dXJuIG51bGw9PT1GYT9udWxsOmQzLnNlbGVjdEFsbChYLmdldChGYSkpfWNvbnN0IHk9dGYuaHBhcmFtcy51dGlscyx3PXRoaXM7aWYodGhpcy5zZXNzaW9uR3JvdXBzJiYwIT10aGlzLnNlc3Npb25Hcm91cHMubGVuZ3RoJiZ0aGlzLnZpc2libGVTY2hlbWEmJjAhPXRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcy5sZW5ndGgpe3ZhciBDPWQzLnJhbmdlKHkubnVtVmlzaWJsZUNvbHVtbnMody52aXNpYmxlU2NoZW1hKSksRz1kMy5yYW5nZSh5Lm51bVZpc2libGVNZXRyaWNzKHcudmlzaWJsZVNjaGVtYSkpLEQ9ZDMuc2NhbGVCYW5kKCkuZG9tYWluKEMpLnJhbmdlKFs4NSwKdGhpcy53aWR0aC0xLTVdKS5wYWRkaW5nSW5uZXIoLjEpLEI9ZDMuc2NhbGVCYW5kKCkuZG9tYWluKEcpLnJhbmdlKFt0aGlzLmhlaWdodC0xLTUtNTAsNV0pLnBhZGRpbmdJbm5lciguMSksST1ELmJhbmR3aWR0aCgpLE49Qi5iYW5kd2lkdGgoKSxPPUMubWFwKGthPT53Ll9jZWxsU2NhbGUoa2EsWzAsSS0xXSkpLEg9Ry5tYXAoa2E9PncuX2NlbGxTY2FsZShrYSt5Lm51bVZpc2libGVIUGFyYW1zKHcudmlzaWJsZVNjaGVtYSksW04tMSwwXSkpLEs9dGhpcy5fc3ZnLnNlbGVjdEFsbCgiLngtYXhpcyIpLmRhdGEoQykuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ4LWF4aXMiLCEwKS5hdHRyKCJ0cmFuc2Zvcm0iLGthPT55LnRyYW5zbGF0ZVN0cihEKGthKSwwKSk7Sy5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLGIpLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC01KS5hdHRyKCJ5IiwwKS5hdHRyKCJ3aWR0aCIsSSsxMCkuYXR0cigiaGVpZ2h0Iix3LmhlaWdodC0yNSk7CksuYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixkKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwwKS5hdHRyKCJ5Iix3LmhlaWdodC0yNSkuYXR0cigid2lkdGgiLEkpLmF0dHIoImhlaWdodCIsMjUpO0suYXBwZW5kKCJnIikuYXR0cigiY2xpcC1wYXRoIixrYT0+InVybCgjIitiKGthKSsiKSIpLmVhY2goZnVuY3Rpb24oa2Epe2QzLnNlbGVjdCh0aGlzKS5jYWxsKGssZDMuYXhpc0JvdHRvbShPW2thXSkudGlja1NpemUody5oZWlnaHQtNTApLEksNDAsdy5vcHRpb25zLmNvbHVtbnNba2FdLnNjYWxlKX0pO0suYXBwZW5kKCJnIikuY2xhc3NlZCgieC1heGlzLWxhYmVsIiwhMCkuYXR0cigiY2xpcC1wYXRoIixrYT0+InVybCgjIitkKGthKSsiKSIpLmFwcGVuZCgidGV4dCIpLmF0dHIoInRleHQtYW5jaG9yIiwibWlkZGxlIikuYXR0cigieCIsSS8yKS5hdHRyKCJ5Iix3LmhlaWdodC0xLTEyLjUpLnRleHQoa2E9Pnkuc2NoZW1hVmlzaWJsZUNvbHVtbk5hbWUody52aXNpYmxlU2NoZW1hLAprYSkpLmFwcGVuZCgidGl0bGUiKS50ZXh0KGthPT55LnNjaGVtYVZpc2libGVDb2x1bW5OYW1lKHcudmlzaWJsZVNjaGVtYSxrYSkpO0s9dGhpcy5fc3ZnLnNlbGVjdEFsbCgiLnktYXhpcyIpLmRhdGEoRykuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ5LWF4aXMiLCEwKS5hdHRyKCJ0cmFuc2Zvcm0iLGthPT55LnRyYW5zbGF0ZVN0cih3LndpZHRoLTEsQihrYSkpKTtLLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsZikuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLSh3LndpZHRoLTQwLTEpKS5hdHRyKCJ5IiwtNSkuYXR0cigid2lkdGgiLHcud2lkdGgtNDApLmF0dHIoImhlaWdodCIsTisxMCk7Sy5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLGgpLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC0ody53aWR0aC0xKSkuYXR0cigieSIsMCkuYXR0cigid2lkdGgiLDQwKS5hdHRyKCJoZWlnaHQiLE4pO0suYXBwZW5kKCJnIikuYXR0cigiY2xpcC1wYXRoIixrYT0+InVybCgjIisKZihrYSkrIikiKS5lYWNoKGZ1bmN0aW9uKGthKXtkMy5zZWxlY3QodGhpcykuY2FsbChrLGQzLmF4aXNMZWZ0KEhba2FdKS50aWNrU2l6ZSh3LndpZHRoLTgwKSxOLDIwLHcub3B0aW9ucy5jb2x1bW5zW2thK3kubnVtVmlzaWJsZUhQYXJhbXMody52aXNpYmxlU2NoZW1hKV0uc2NhbGUpfSk7Sy5hcHBlbmQoImciKS5jbGFzc2VkKCJ5LWF4aXMtbGFiZWwiLCEwKS5hdHRyKCJjbGlwLXBhdGgiLGthPT4idXJsKCMiK2goa2EpKyIpIikuYXBwZW5kKCJ0ZXh0IikuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ4IiwtKHcud2lkdGgtMjAtMSkpLmF0dHIoInkiLE4vMikuYXR0cigidHJhbnNmb3JtIix5LnJvdGF0ZVN0cigtKHcud2lkdGgtMjAtMSksTi8yKSkudGV4dChrYT0+eS5tZXRyaWNOYW1lKHcudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc1trYV0pKS5hcHBlbmQoInRpdGxlIikudGV4dChrYT0+eS5tZXRyaWNOYW1lKHcudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc1trYV0pKTsKSz10aGlzLl9zdmcuc2VsZWN0QWxsKCIuY2VsbCIpLmRhdGEoZDMuY3Jvc3MoQyxHKSkuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJjZWxsIiwhMCkuYXR0cigidHJhbnNmb3JtIiwoW2thLFldKT0+eS50cmFuc2xhdGVTdHIoRChrYSksQihZKSkpO0suYXBwZW5kKCJnIikuY2xhc3NlZCgiZnJhbWUiLCEwKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtNSkuYXR0cigieSIsLTUpLmF0dHIoIndpZHRoIixJKzEwKS5hdHRyKCJoZWlnaHQiLE4rMTApLmF0dHIoInN0cm9rZSIsIiMwMDAiKS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoInNoYXBlLXJlbmRlcmluZyIsImNyaXNwRWRnZXMiKTt2YXIgTT1udWxsO3ZvaWQgMCE9PXcub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgmJihNPWQzLnNjYWxlTGluZWFyKCkuZG9tYWluKHRoaXMuX2NvbEV4dGVudCh0aGlzLm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4KSkucmFuZ2UoW3RoaXMub3B0aW9ucy5taW5Db2xvcix0aGlzLm9wdGlvbnMubWF4Q29sb3JdKS5pbnRlcnBvbGF0ZShkMy5pbnRlcnBvbGF0ZUxhYikpOwp2YXIgTD12b2lkIDA9PT13Lm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4PygpPT4icmVkIjooe3Nlc3Npb25Hcm91cDprYX0pPT5NKHRoaXMuX2NvbFZhbHVlKGthLHcub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgpKSxbUSxULFhdPWZ1bmN0aW9uKGthLFkpe2NvbnN0IEVhPWthLnNlbGVjdEFsbCgiLmRhdGEtbWFya2VyIikuZGF0YSgoW3hhLEFhXSk9Pncuc2Vzc2lvbkdyb3Vwcy5maWx0ZXIoRmE9PnZvaWQgMCE9PXcuX2NvbFZhbHVlKEZhLHhhKSYmdm9pZCAwIT09dy5fbWV0cmljVmFsdWUoRmEsQWEpKS5tYXAoRmE9Pih7Y29sOnhhLG1ldHJpYzpBYSxzZXNzaW9uR3JvdXA6RmEseDp0KEZhLHhhKSx5OmwoRmEsQWEpLHNlc3Npb25Hcm91cE1hcmtlcnM6bnVsbH0pKSkuZW50ZXIoKS5hcHBlbmQoImNpcmNsZSIpLmNsYXNzZWQoImRhdGEtbWFya2VyIiwhMCkuYXR0cigiY3giLCh7eDp4YX0pPT54YSkuYXR0cigiY3kiLCh7eTp4YX0pPT54YSkuYXR0cigiciIsMikuYXR0cigiZmlsbCIsClkpLHZhPW5ldyBNYXA7dy5zZXNzaW9uR3JvdXBzLmZvckVhY2goeGE9Pnt2YS5zZXQoeGEsW10pfSk7RWEuZWFjaChmdW5jdGlvbih4YSl7dmEuZ2V0KHhhLnNlc3Npb25Hcm91cCkucHVzaCh0aGlzKX0pO0VhLmVhY2goeGE9Pntjb25zdCBBYT12YS5nZXQoeGEuc2Vzc2lvbkdyb3VwKTt4YS5zZXNzaW9uR3JvdXBNYXJrZXJzPW5ldyBTZXQoQWEpfSk7a2E9Qy5tYXAoeGE9PkcubWFwKEFhPT5FYS5maWx0ZXIoRmE9PkZhLmNvbD09eGEmJkZhLm1ldHJpYz09QWEpKSk7cmV0dXJuW0VhLGthLHZhXX0oSy5hcHBlbmQoImciKSxMKSxhYT1DLm1hcChrYT0+Ry5tYXAoWT0+cChrYSxZKSkpLGxhPW51bGw7dSgpJiYobGE9Sy5maWx0ZXIoa2E9Pl8uaXNFcXVhbChrYSx3Ll9icnVzaGVkQ2VsbEluZGV4KSksY29uc29sZS5hc3NlcnQoMT09bGEuc2l6ZSgpLGxhKSk7dmFyIFo9bmV3IFNldChRLm5vZGVzKCkpO20oKTt2YXIgYmE9ZDMuYnJ1c2goKS5leHRlbnQoW1stNCwtNF0sW0ktMSs1LQoxLE4tMSs1LTFdXSkub24oInN0YXJ0IixmdW5jdGlvbigpe3UoKSYmbGEubm9kZSgpIT10aGlzJiZiYS5tb3ZlKGxhLG51bGwpO3EodGhpcyl9KS5vbigiYnJ1c2giLGZ1bmN0aW9uKCl7cSh0aGlzKX0pLm9uKCJlbmQiLGZ1bmN0aW9uKCl7cSh0aGlzKX0pO0suY2FsbChiYSk7dSgpJiZiYS5tb3ZlKGxhLHcuX2JydXNoU2VsZWN0aW9uKTt2YXIgZWE9bnVsbCxjYT1udWxsO251bGwhPT10aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwJiYoY2E9ZDMuc2VsZWN0QWxsKFguZ2V0KHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXApKS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCEwKSk7Sy5vbigiY2xpY2siLGZ1bmN0aW9uKCl7dmFyIGthPWVhPT09Y2E/bnVsbDplYTtrYSE9PWNhJiYobnVsbCE9PWNhJiZjYS5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCExKSxjYT1rYSxudWxsIT09Y2EmJmNhLmNsYXNzZWQoInNlbGVjdGVkLW1hcmtlciIsITApLGthPW51bGw9PT1jYT9udWxsOmNhLmRhdHVtKCkuc2Vzc2lvbkdyb3VwLAp3Ll9zZXRTZWxlY3RlZFNlc3Npb25Hcm91cChrYSkpfSkub24oIm1vdXNlbW92ZSBtb3VzZWVudGVyIixmdW5jdGlvbihba2EsWV0pe2NvbnN0IFtFYSx2YV09ZDMubW91c2UodGhpcyk7a2E9QShrYSxZLEVhLHZhLDIwKTtlYSE9PWthJiYobnVsbCE9PWVhJiZlYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLGVhPWthLG51bGwhPT1lYT8oZWEuY2xhc3NlZCgiY2xvc2VzdC1tYXJrZXIiLCEwKSx3Ll9zZXRDbG9zZXN0U2Vzc2lvbkdyb3VwKGVhLmRhdHVtKCkuc2Vzc2lvbkdyb3VwKSk6dy5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChudWxsKSl9KS5vbigibW91c2VsZWF2ZSIsZnVuY3Rpb24oKXtudWxsIT09ZWEmJihlYS5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLGVhPW51bGwsdy5fc2V0Q2xvc2VzdFNlc3Npb25Hcm91cChudWxsKSl9KTt0aGlzLl9zdmcuc2VsZWN0QWxsKCIqIikuY2xhc3NlZCgidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiLCEwKX19LApfY2VsbFNjYWxlKGIsZCl7dmFyIGY9dGhpcy5fY29sRXh0ZW50KGIpO2NvbnN0IGg9ZDMuc2NhbGVMaW5lYXIoKS5kb21haW4oZikucmFuZ2UoZCk7aWYoIkxJTkVBUiI9PT10aGlzLm9wdGlvbnMuY29sdW1uc1tiXS5zY2FsZSlyZXR1cm4gaDtpZigiTE9HIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2JdLnNjYWxlKXJldHVybiAwPj1mWzBdJiYwPD1mWzFdP2g6ZDMuc2NhbGVMb2coKS5kb21haW4oZikucmFuZ2UoZCk7aWYoIlFVQU5USUxFIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW2JdLnNjYWxlKXtjb25zdCBrPShkWzFdLWRbMF0pLzE5O2Y9ZDMucmFuZ2UoMjApLm1hcCh0PT5kWzBdK2sqdCk7cmV0dXJuIGQzLnNjYWxlUXVhbnRpbGUoKS5kb21haW4oXy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAodD0+dGhpcy5fY29sVmFsdWUodCxiKSkpKS5yYW5nZShmKX1pZigiTk9OX05VTUVSSUMiPT09dGhpcy5vcHRpb25zLmNvbHVtbnNbYl0uc2NhbGUpcmV0dXJuIGQzLnNjYWxlUG9pbnQoKS5kb21haW4oXy51bmlxKHRoaXMuc2Vzc2lvbkdyb3Vwcy5tYXAoaz0+CnRoaXMuX2NvbFZhbHVlKGssYikpLnNvcnQoKSkpLnJhbmdlKGQpLnBhZGRpbmcoLjEpO3Rocm93IlVua25vd24gc2NhbGUgZm9yIGNvbHVtbjogIitiKyIuIG9wdGlvbnM6ICIrdGhpcy5vcHRpb25zO30sX2NvbFZhbHVlKGIsZCl7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMuY29sdW1uVmFsdWVCeVZpc2libGVJbmRleCh0aGlzLnZpc2libGVTY2hlbWEsYixkKX0sX21ldHJpY1ZhbHVlKGIsZCl7cmV0dXJuIHRmLmhwYXJhbXMudXRpbHMubWV0cmljVmFsdWVCeVZpc2libGVJbmRleCh0aGlzLnZpc2libGVTY2hlbWEsYixkKX0sX2NvbEV4dGVudChiKXtyZXR1cm4gdGYuaHBhcmFtcy51dGlscy52aXNpYmxlTnVtZXJpY0NvbHVtbkV4dGVudCh0aGlzLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLGIpfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Lmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3Iixwcm9wZXJ0aWVzOntiYWNrZW5kOk9iamVjdCxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheX0sX2Nsb3Nlc3RPclNlbGVjdGVkOmZ1bmN0aW9uKGIsZCl7cmV0dXJuIG51bGwhPT1iP2I6ZH19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLXNlc3Npb25zLXBhbmUvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lLmh0bWwuanMKUG9seW1lcih7aXM6InRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZSIscHJvcGVydGllczp7YmFja2VuZDpPYmplY3QsaGVscFVybDpTdHJpbmcsYnVnUmVwb3J0VXJsOlN0cmluZyxleHBlcmltZW50TmFtZTpTdHJpbmcsY29uZmlndXJhdGlvbjpPYmplY3Qsc2Vzc2lvbkdyb3VwczpBcnJheSxfc2VsZWN0ZWRUYWI6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyL3RmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6InRmLWhwYXJhbXMtZ29vZ2xlLWFuYWx5dGljcy10cmFja2VyIixoYW5kbGVFdmVudDpmdW5jdGlvbigpe319KX0pKCk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaHBhcmFtcy1tYWluL3RmLWhwYXJhbXMtbWFpbi5odG1sLmpzClBvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLW1haW4iLHByb3BlcnRpZXM6e2JhY2tlbmQ6T2JqZWN0LGV4cGVyaW1lbnROYW1lOlN0cmluZyx0cmFja2luZ0lkOlN0cmluZyxoZWxwVXJsOlN0cmluZyxidWdSZXBvcnRVcmw6U3RyaW5nLF9jb25maWd1cmF0aW9uOk9iamVjdCxfc2Vzc2lvbkdyb3VwczpBcnJheSxfdGhyb3R0bGVkU2VuZEV2ZW50VG9HQTp7dHlwZTpGdW5jdGlvbix2YWx1ZTooKT0+Xy50aHJvdHRsZShmdW5jdGlvbigpe3RoaXMuX2hhbmRsZUdBRXZlbnQoe2RldGFpbDp7aGl0VHlwZToiZXZlbnQiLGV2ZW50Q2F0ZWdvcnk6IlVzZXJJbnRlcmFjdGlvbiIsZXZlbnRMYWJlbDoiRXhwZXJpbWVudDogIit0aGlzLmV4cGVyaW1lbnROYW1lfX0pfSw2RTQse2xlYWRpbmc6ITB9KX19LGxpc3RlbmVyczp7bW91c2Vtb3ZlOiJfc2VuZEV2ZW50VG9HQSIsdGFwOiJfc2VuZEV2ZW50VG9HQSIsImdvb2dsZS1hbmFseXRpY3MtdHJhY2tpbmciOiJfaGFuZGxlR0FFdmVudCJ9LGF0dGFjaGVkKCl7dGhpcy5faGFuZGxlR0FFdmVudCh7ZGV0YWlsOntoaXRUeXBlOiJwYWdldmlldyJ9fSl9LApyZWxvYWQoKXt0aGlzLiRbInF1ZXJ5LXBhbmUiXS5yZWxvYWQoKX0sX3NlbmRFdmVudFRvR0EoKXt0aGlzLl90aHJvdHRsZWRTZW5kRXZlbnRUb0dBKHRoaXMpfSxfaGFuZGxlR0FFdmVudChiKXt0aGlzLiQudHJhY2tlci5oYW5kbGVFdmVudChiKX19KTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLWJhY2tlbmQvdGYtaHBhcmFtcy1iYWNrZW5kLmh0bWwuanMKKGZ1bmN0aW9uKGIpeyhmdW5jdGlvbihkKXtjbGFzcyBme2NvbnN0cnVjdG9yKGgsayx0PSEwKXt0aGlzLl9hcGlVcmw9aDt0aGlzLl9yZXF1ZXN0TWFuYWdlcj1rO3RoaXMuX3VzZUh0dHBHZXQ9dH1nZXRFeHBlcmltZW50KGgpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgiZXhwZXJpbWVudCIsaCl9Z2V0RG93bmxvYWRVcmwoaCxrLHQpe3JldHVybiB0aGlzLl9hcGlVcmwrIi9kb3dubG9hZF9kYXRhPyIrbmV3IFVSTFNlYXJjaFBhcmFtcyh7Zm9ybWF0OmgsY29sdW1uc1Zpc2liaWxpdHk6SlNPTi5zdHJpbmdpZnkodCkscmVxdWVzdDpKU09OLnN0cmluZ2lmeShrKX0pfWxpc3RTZXNzaW9uR3JvdXBzKGgpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgic2Vzc2lvbl9ncm91cHMiLGgpfWxpc3RNZXRyaWNFdmFscyhoKXtyZXR1cm4gdGhpcy5fc2VuZFJlcXVlc3QoIm1ldHJpY19ldmFscyIsaCl9X3NlbmRSZXF1ZXN0KGgsayl7aWYodGhpcy5fdXNlSHR0cEdldClyZXR1cm4gaz1lbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkoaykpLAp0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHRoaXMuX2FwaVVybCsiLyIraCsiP3JlcXVlc3RceDNkIitrKTtjb25zdCB0PW5ldyB2Yy5SZXF1ZXN0T3B0aW9uczt0LndpdGhDcmVkZW50aWFscz0hMDt0Lm1ldGhvZFR5cGU9IlBPU1QiO3QuY29udGVudFR5cGU9InRleHQvcGxhaW4iO3QuYm9keT1KU09OLnN0cmluZ2lmeShrKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdFdpdGhPcHRpb25zKHRoaXMuX2FwaVVybCsiLyIraCx0KX19ZC5CYWNrZW5kPWZ9KShiLmhwYXJhbXN8fChiLmhwYXJhbXM9e30pKX0pKHRmfHwodGY9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1ocGFyYW1zLWRhc2hib2FyZC90Zi1ocGFyYW1zLWRhc2hib2FyZC5odG1sLmpzCihmdW5jdGlvbigpe1BvbHltZXIoe2lzOiJ0Zi1ocGFyYW1zLWRhc2hib2FyZCIscHJvcGVydGllczp7X2JhY2tlbmQ6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdGYuaHBhcmFtcy5CYWNrZW5kKHZjLmdldFJvdXRlcigpLnBsdWdpblJvdXRlKCJocGFyYW1zIiwiIiksbmV3IHZjLlJlcXVlc3RNYW5hZ2VyLCEhKHdpbmRvdy5URU5TT1JCT0FSRF9FTlZ8fHt9KS5JTl9DT0xBQil9fSxyZWxvYWQoKXt0aGlzLiRbImhwYXJhbXMtbWFpbiJdLnJlbG9hZCgpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1pbXBvcnRzL3RocmVlLmpzCihmdW5jdGlvbihiLGQpeyJvYmplY3QiPT09dHlwZW9mIGV4cG9ydHMmJiJ1bmRlZmluZWQiIT09dHlwZW9mIG1vZHVsZT9kKGV4cG9ydHMpOiJmdW5jdGlvbiI9PT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbImV4cG9ydHMiXSxkKTooYj1ifHxzZWxmLGQoYi5USFJFRT17fSkpfSkodGhpcyxmdW5jdGlvbihiKXtmdW5jdGlvbiBkKCl7fWZ1bmN0aW9uIGYoYSxjKXt0aGlzLng9YXx8MDt0aGlzLnk9Y3x8MH1mdW5jdGlvbiBoKGEsYyxlLGcpe3RoaXMuX3g9YXx8MDt0aGlzLl95PWN8fDA7dGhpcy5fej1lfHwwO3RoaXMuX3c9dm9pZCAwIT09Zz9nOjF9ZnVuY3Rpb24gayhhLGMsZSl7dGhpcy54PWF8fDA7dGhpcy55PWN8fDA7dGhpcy56PWV8fDB9ZnVuY3Rpb24gdCgpe3RoaXMuZWxlbWVudHM9WzEsMCwwLDAsMSwwLDAsMCwxXTswPGFyZ3VtZW50cy5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuIil9CmZ1bmN0aW9uIGwoYSxjLGUsZyxyLHYseixFLEYsSil7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6TmsrK30pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy5pbWFnZT12b2lkIDAhPT1hP2E6bC5ERUZBVUxUX0lNQUdFO3RoaXMubWlwbWFwcz1bXTt0aGlzLm1hcHBpbmc9dm9pZCAwIT09Yz9jOmwuREVGQVVMVF9NQVBQSU5HO3RoaXMud3JhcFM9dm9pZCAwIT09ZT9lOjEwMDE7dGhpcy53cmFwVD12b2lkIDAhPT1nP2c6MTAwMTt0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT1yP3I6MTAwNjt0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT12P3Y6MTAwODt0aGlzLmFuaXNvdHJvcHk9dm9pZCAwIT09Rj9GOjE7dGhpcy5mb3JtYXQ9dm9pZCAwIT09ej96OjEwMjM7dGhpcy50eXBlPXZvaWQgMCE9PUU/RToxMDA5O3RoaXMub2Zmc2V0PW5ldyBmKDAsMCk7dGhpcy5yZXBlYXQ9bmV3IGYoMSwxKTt0aGlzLmNlbnRlcj1uZXcgZigwLDApOwp0aGlzLnJvdGF0aW9uPTA7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSEwO3RoaXMubWF0cml4PW5ldyB0O3RoaXMuZ2VuZXJhdGVNaXBtYXBzPSEwO3RoaXMucHJlbXVsdGlwbHlBbHBoYT0hMTt0aGlzLmZsaXBZPSEwO3RoaXMudW5wYWNrQWxpZ25tZW50PTQ7dGhpcy5lbmNvZGluZz12b2lkIDAhPT1KP0o6M0UzO3RoaXMudmVyc2lvbj0wO3RoaXMub25VcGRhdGU9bnVsbH1mdW5jdGlvbiBwKGEsYyxlLGcpe3RoaXMueD1hfHwwO3RoaXMueT1jfHwwO3RoaXMuej1lfHwwO3RoaXMudz12b2lkIDAhPT1nP2c6MX1mdW5jdGlvbiBtKGEsYyxlKXt0aGlzLndpZHRoPWE7dGhpcy5oZWlnaHQ9Yzt0aGlzLnNjaXNzb3I9bmV3IHAoMCwwLGEsYyk7dGhpcy5zY2lzc29yVGVzdD0hMTt0aGlzLnZpZXdwb3J0PW5ldyBwKDAsMCxhLGMpO2U9ZXx8e307dGhpcy50ZXh0dXJlPW5ldyBsKHZvaWQgMCx2b2lkIDAsZS53cmFwUyxlLndyYXBULGUubWFnRmlsdGVyLGUubWluRmlsdGVyLGUuZm9ybWF0LGUudHlwZSwKZS5hbmlzb3Ryb3B5LGUuZW5jb2RpbmcpO3RoaXMudGV4dHVyZS5pbWFnZT17fTt0aGlzLnRleHR1cmUuaW1hZ2Uud2lkdGg9YTt0aGlzLnRleHR1cmUuaW1hZ2UuaGVpZ2h0PWM7dGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz12b2lkIDAhPT1lLmdlbmVyYXRlTWlwbWFwcz9lLmdlbmVyYXRlTWlwbWFwczohMTt0aGlzLnRleHR1cmUubWluRmlsdGVyPXZvaWQgMCE9PWUubWluRmlsdGVyP2UubWluRmlsdGVyOjEwMDY7dGhpcy5kZXB0aEJ1ZmZlcj12b2lkIDAhPT1lLmRlcHRoQnVmZmVyP2UuZGVwdGhCdWZmZXI6ITA7dGhpcy5zdGVuY2lsQnVmZmVyPXZvaWQgMCE9PWUuc3RlbmNpbEJ1ZmZlcj9lLnN0ZW5jaWxCdWZmZXI6ITA7dGhpcy5kZXB0aFRleHR1cmU9dm9pZCAwIT09ZS5kZXB0aFRleHR1cmU/ZS5kZXB0aFRleHR1cmU6bnVsbH1mdW5jdGlvbiBuKGEsYyxlKXttLmNhbGwodGhpcyxhLGMsZSk7dGhpcy5zYW1wbGVzPTR9ZnVuY3Rpb24gcSgpe3RoaXMuZWxlbWVudHM9ClsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXTswPGFyZ3VtZW50cy5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuIil9ZnVuY3Rpb24gdShhLGMsZSxnKXt0aGlzLl94PWF8fDA7dGhpcy5feT1jfHwwO3RoaXMuX3o9ZXx8MDt0aGlzLl9vcmRlcj1nfHx1LkRlZmF1bHRPcmRlcn1mdW5jdGlvbiB4KCl7dGhpcy5tYXNrPTF9ZnVuY3Rpb24gQSgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOk9rKyt9KTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5uYW1lPSIiO3RoaXMudHlwZT0iT2JqZWN0M0QiO3RoaXMucGFyZW50PW51bGw7dGhpcy5jaGlsZHJlbj1bXTt0aGlzLnVwPUEuRGVmYXVsdFVwLmNsb25lKCk7dmFyIGE9bmV3IGssYz1uZXcgdSxlPW5ldyBoLGc9bmV3IGsoMSwxLDEpO2MuX29uQ2hhbmdlKGZ1bmN0aW9uKCl7ZS5zZXRGcm9tRXVsZXIoYywKITEpfSk7ZS5fb25DaGFuZ2UoZnVuY3Rpb24oKXtjLnNldEZyb21RdWF0ZXJuaW9uKGUsdm9pZCAwLCExKX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTphfSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6Y30scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZX0sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmd9LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3IHF9LG5vcm1hbE1hdHJpeDp7dmFsdWU6bmV3IHR9fSk7dGhpcy5tYXRyaXg9bmV3IHE7dGhpcy5tYXRyaXhXb3JsZD1uZXcgcTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9QS5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZTt0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITE7dGhpcy5sYXllcnM9bmV3IHg7dGhpcy52aXNpYmxlPSEwOwp0aGlzLnJlY2VpdmVTaGFkb3c9dGhpcy5jYXN0U2hhZG93PSExO3RoaXMuZnJ1c3R1bUN1bGxlZD0hMDt0aGlzLnJlbmRlck9yZGVyPTA7dGhpcy51c2VyRGF0YT17fX1mdW5jdGlvbiB5KCl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU2NlbmUiO3RoaXMub3ZlcnJpZGVNYXRlcmlhbD10aGlzLmZvZz10aGlzLmJhY2tncm91bmQ9bnVsbDt0aGlzLmF1dG9VcGRhdGU9ITA7InVuZGVmaW5lZCIhPT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1mdW5jdGlvbiB3KGEsYyl7dGhpcy5taW49dm9pZCAwIT09YT9hOm5ldyBrKEluZmluaXR5LEluZmluaXR5LEluZmluaXR5KTt0aGlzLm1heD12b2lkIDAhPT1jP2M6bmV3IGsoLUluZmluaXR5LC1JbmZpbml0eSwtSW5maW5pdHkpfWZ1bmN0aW9uIEMoYSxjLGUsZyxyKXt2YXIgdjt2YXIgej0wO2Zvcih2PWEubGVuZ3RoLQozO3o8PXY7eis9Myl7S2QuZnJvbUFycmF5KGEseik7dmFyIEU9Yy5kb3QoS2QpLEY9ZS5kb3QoS2QpLEo9Zy5kb3QoS2QpO2lmKE1hdGgubWF4KC1NYXRoLm1heChFLEYsSiksTWF0aC5taW4oRSxGLEopKT5yLngqTWF0aC5hYnMoS2QueCkrci55Kk1hdGguYWJzKEtkLnkpK3IueipNYXRoLmFicyhLZC56KSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBHKGEsYyl7dGhpcy5jZW50ZXI9dm9pZCAwIT09YT9hOm5ldyBrO3RoaXMucmFkaXVzPXZvaWQgMCE9PWM/YzowfWZ1bmN0aW9uIEQoYSxjKXt0aGlzLm9yaWdpbj12b2lkIDAhPT1hP2E6bmV3IGs7dGhpcy5kaXJlY3Rpb249dm9pZCAwIT09Yz9jOm5ldyBrfWZ1bmN0aW9uIEIoYSxjLGUpe3RoaXMuYT12b2lkIDAhPT1hP2E6bmV3IGs7dGhpcy5iPXZvaWQgMCE9PWM/YzpuZXcgazt0aGlzLmM9dm9pZCAwIT09ZT9lOm5ldyBrfWZ1bmN0aW9uIEkoYSxjLGUpe3JldHVybiB2b2lkIDA9PT1jJiZ2b2lkIDA9PT1lP3RoaXMuc2V0KGEpOgp0aGlzLnNldFJHQihhLGMsZSl9ZnVuY3Rpb24gTihhLGMsZSl7MD5lJiYoZSs9MSk7MTxlJiYtLWU7cmV0dXJuIGU8MS82P2ErNiooYy1hKSplOi41PmU/YzplPDIvMz9hKzYqKGMtYSkqKDIvMy1lKTphfWZ1bmN0aW9uIE8oYSl7cmV0dXJuLjA0MDQ1PmE/LjA3NzM5OTM4MDgqYTpNYXRoLnBvdyguOTQ3ODY3Mjk4NiphKy4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24gSChhKXtyZXR1cm4uMDAzMTMwOD5hPzEyLjkyKmE6MS4wNTUqTWF0aC5wb3coYSwuNDE2NjYpLS4wNTV9ZnVuY3Rpb24gSyhhLGMsZSxnLHIsdil7dGhpcy5hPWE7dGhpcy5iPWM7dGhpcy5jPWU7dGhpcy5ub3JtYWw9ZyYmZy5pc1ZlY3RvcjM/ZzpuZXcgazt0aGlzLnZlcnRleE5vcm1hbHM9QXJyYXkuaXNBcnJheShnKT9nOltdO3RoaXMuY29sb3I9ciYmci5pc0NvbG9yP3I6bmV3IEk7dGhpcy52ZXJ0ZXhDb2xvcnM9QXJyYXkuaXNBcnJheShyKT9yOltdO3RoaXMubWF0ZXJpYWxJbmRleD12b2lkIDAhPT12P3Y6MH0KZnVuY3Rpb24gTSgpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOlBrKyt9KTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5uYW1lPSIiO3RoaXMudHlwZT0iTWF0ZXJpYWwiO3RoaXMubGlnaHRzPXRoaXMuZm9nPSEwO3RoaXMuYmxlbmRpbmc9MTt0aGlzLnNpZGU9MDt0aGlzLnZlcnRleFRhbmdlbnRzPXRoaXMuZmxhdFNoYWRpbmc9ITE7dGhpcy52ZXJ0ZXhDb2xvcnM9MDt0aGlzLm9wYWNpdHk9MTt0aGlzLnRyYW5zcGFyZW50PSExO3RoaXMuYmxlbmRTcmM9MjA0O3RoaXMuYmxlbmREc3Q9MjA1O3RoaXMuYmxlbmRFcXVhdGlvbj0xMDA7dGhpcy5ibGVuZEVxdWF0aW9uQWxwaGE9dGhpcy5ibGVuZERzdEFscGhhPXRoaXMuYmxlbmRTcmNBbHBoYT1udWxsO3RoaXMuZGVwdGhGdW5jPTM7dGhpcy5kZXB0aFdyaXRlPXRoaXMuZGVwdGhUZXN0PSEwO3RoaXMuc3RlbmNpbEZ1bmM9NTE5O3RoaXMuc3RlbmNpbFJlZj0wO3RoaXMuc3RlbmNpbE1hc2s9CjI1NTt0aGlzLnN0ZW5jaWxaUGFzcz10aGlzLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxGYWlsPTc2ODA7dGhpcy5zdGVuY2lsV3JpdGU9ITE7dGhpcy5jbGlwcGluZ1BsYW5lcz1udWxsO3RoaXMuY2xpcFNoYWRvd3M9dGhpcy5jbGlwSW50ZXJzZWN0aW9uPSExO3RoaXMuc2hhZG93U2lkZT1udWxsO3RoaXMuY29sb3JXcml0ZT0hMDt0aGlzLnByZWNpc2lvbj1udWxsO3RoaXMucG9seWdvbk9mZnNldD0hMTt0aGlzLnBvbHlnb25PZmZzZXRVbml0cz10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9MDt0aGlzLmRpdGhlcmluZz0hMTt0aGlzLmFscGhhVGVzdD0wO3RoaXMucHJlbXVsdGlwbGllZEFscGhhPSExO3RoaXMudG9uZU1hcHBlZD10aGlzLnZpc2libGU9ITA7dGhpcy51c2VyRGF0YT17fTt0aGlzLm5lZWRzVXBkYXRlPSEwfWZ1bmN0aW9uIEwoYSl7TS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaEJhc2ljTWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEkoMTY3NzcyMTUpO3RoaXMubGlnaHRNYXA9CnRoaXMubWFwPW51bGw7dGhpcy5saWdodE1hcEludGVuc2l0eT0xO3RoaXMuYW9NYXA9bnVsbDt0aGlzLmFvTWFwSW50ZW5zaXR5PTE7dGhpcy5lbnZNYXA9dGhpcy5hbHBoYU1hcD10aGlzLnNwZWN1bGFyTWFwPW51bGw7dGhpcy5jb21iaW5lPTA7dGhpcy5yZWZsZWN0aXZpdHk9MTt0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTg7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWNhcD0icm91bmQiO3RoaXMubGlnaHRzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gUShhLGMsZSl7aWYoQXJyYXkuaXNBcnJheShhKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LiIpO3RoaXMubmFtZT0iIjt0aGlzLmFycmF5PWE7dGhpcy5pdGVtU2l6ZT0KYzt0aGlzLmNvdW50PXZvaWQgMCE9PWE/YS5sZW5ndGgvYzowO3RoaXMubm9ybWFsaXplZD0hMD09PWU7dGhpcy5keW5hbWljPSExO3RoaXMudXBkYXRlUmFuZ2U9e29mZnNldDowLGNvdW50Oi0xfTt0aGlzLnZlcnNpb249MH1mdW5jdGlvbiBUKGEsYyxlKXtRLmNhbGwodGhpcyxuZXcgSW50OEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gWChhLGMsZSl7US5jYWxsKHRoaXMsbmV3IFVpbnQ4QXJyYXkoYSksYyxlKX1mdW5jdGlvbiBhYShhLGMsZSl7US5jYWxsKHRoaXMsbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gbGEoYSxjLGUpe1EuY2FsbCh0aGlzLG5ldyBJbnQxNkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gWihhLGMsZSl7US5jYWxsKHRoaXMsbmV3IFVpbnQxNkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gYmEoYSxjLGUpe1EuY2FsbCh0aGlzLG5ldyBJbnQzMkFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gZWEoYSxjLGUpe1EuY2FsbCh0aGlzLG5ldyBVaW50MzJBcnJheShhKSwKYyxlKX1mdW5jdGlvbiBjYShhLGMsZSl7US5jYWxsKHRoaXMsbmV3IEZsb2F0MzJBcnJheShhKSxjLGUpfWZ1bmN0aW9uIGthKGEsYyxlKXtRLmNhbGwodGhpcyxuZXcgRmxvYXQ2NEFycmF5KGEpLGMsZSl9ZnVuY3Rpb24gWSgpe3RoaXMudmVydGljZXM9W107dGhpcy5ub3JtYWxzPVtdO3RoaXMuY29sb3JzPVtdO3RoaXMudXZzPVtdO3RoaXMudXZzMj1bXTt0aGlzLmdyb3Vwcz1bXTt0aGlzLm1vcnBoVGFyZ2V0cz17fTt0aGlzLnNraW5XZWlnaHRzPVtdO3RoaXMuc2tpbkluZGljZXM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5ncm91cHNOZWVkVXBkYXRlPXRoaXMudXZzTmVlZFVwZGF0ZT10aGlzLmNvbG9yc05lZWRVcGRhdGU9dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT10aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMX1mdW5jdGlvbiBFYShhKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuLUluZmluaXR5O2Zvcih2YXIgYz1hWzBdLGU9MSxnPQphLmxlbmd0aDtlPGc7KytlKWFbZV0+YyYmKGM9YVtlXSk7cmV0dXJuIGN9ZnVuY3Rpb24gdmEoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpRays9Mn0pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy50eXBlPSJCdWZmZXJHZW9tZXRyeSI7dGhpcy5pbmRleD1udWxsO3RoaXMuYXR0cmlidXRlcz17fTt0aGlzLm1vcnBoQXR0cmlidXRlcz17fTt0aGlzLmdyb3Vwcz1bXTt0aGlzLmJvdW5kaW5nU3BoZXJlPXRoaXMuYm91bmRpbmdCb3g9bnVsbDt0aGlzLmRyYXdSYW5nZT17c3RhcnQ6MCxjb3VudDpJbmZpbml0eX07dGhpcy51c2VyRGF0YT17fX1mdW5jdGlvbiB4YShhLGMpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2giO3RoaXMuZ2VvbWV0cnk9dm9pZCAwIT09YT9hOm5ldyB2YTt0aGlzLm1hdGVyaWFsPXZvaWQgMCE9PWM/YzpuZXcgTCh7Y29sb3I6MTY3NzcyMTUqTWF0aC5yYW5kb20oKX0pO3RoaXMuZHJhd01vZGU9CjA7dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX1mdW5jdGlvbiBBYShhLGMsZSxnLHIsdix6LEUpe2lmKG51bGw9PT0oMT09PWMuc2lkZT9nLmludGVyc2VjdFRyaWFuZ2xlKHosdixyLCEwLEUpOmcuaW50ZXJzZWN0VHJpYW5nbGUocix2LHosMiE9PWMuc2lkZSxFKSkpcmV0dXJuIG51bGw7c2cuY29weShFKTtzZy5hcHBseU1hdHJpeDQoYS5tYXRyaXhXb3JsZCk7Yz1lLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhzZyk7cmV0dXJuIGM8ZS5uZWFyfHxjPmUuZmFyP251bGw6e2Rpc3RhbmNlOmMscG9pbnQ6c2cuY2xvbmUoKSxvYmplY3Q6YX19ZnVuY3Rpb24gRmEoYSxjLGUsZyxyLHYseixFLEYsSixQKXtMZC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsRik7TWQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLEopO05kLmZyb21CdWZmZXJBdHRyaWJ1dGUocixQKTtyPWEubW9ycGhUYXJnZXRJbmZsdWVuY2VzO2lmKGMubW9ycGhUYXJnZXRzJiZ2JiZyKXtJaC5zZXQoMCwwLDApO0poLnNldCgwLDAsMCk7CktoLnNldCgwLDAsMCk7Zm9yKHZhciBSPTAsUz12Lmxlbmd0aDtSPFM7UisrKXt2YXIgVj1yW1JdLFc9dltSXTswIT09ViYmKCRpLmZyb21CdWZmZXJBdHRyaWJ1dGUoVyxGKSxhai5mcm9tQnVmZmVyQXR0cmlidXRlKFcsSiksYmouZnJvbUJ1ZmZlckF0dHJpYnV0ZShXLFApLEloLmFkZFNjYWxlZFZlY3RvcigkaS5zdWIoTGQpLFYpLEpoLmFkZFNjYWxlZFZlY3Rvcihhai5zdWIoTWQpLFYpLEtoLmFkZFNjYWxlZFZlY3Rvcihiai5zdWIoTmQpLFYpKX1MZC5hZGQoSWgpO01kLmFkZChKaCk7TmQuYWRkKEtoKX1pZihhPUFhKGEsYyxlLGcsTGQsTWQsTmQsc2YpKXomJihvZS5mcm9tQnVmZmVyQXR0cmlidXRlKHosRikscGUuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh6LEopLHFlLmZyb21CdWZmZXJBdHRyaWJ1dGUoeixQKSxhLnV2PUIuZ2V0VVYoc2YsTGQsTWQsTmQsb2UscGUscWUsbmV3IGYpKSxFJiYob2UuZnJvbUJ1ZmZlckF0dHJpYnV0ZShFLEYpLHBlLmZyb21CdWZmZXJBdHRyaWJ1dGUoRSwKSikscWUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShFLFApLGEudXYyPUIuZ2V0VVYoc2YsTGQsTWQsTmQsb2UscGUscWUsbmV3IGYpKSx6PW5ldyBLKEYsSixQKSxCLmdldE5vcm1hbChMZCxNZCxOZCx6Lm5vcm1hbCksYS5mYWNlPXo7cmV0dXJuIGF9ZnVuY3Rpb24geWEoKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpSays9Mn0pO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTt0aGlzLm5hbWU9IiI7dGhpcy50eXBlPSJHZW9tZXRyeSI7dGhpcy52ZXJ0aWNlcz1bXTt0aGlzLmNvbG9ycz1bXTt0aGlzLmZhY2VzPVtdO3RoaXMuZmFjZVZlcnRleFV2cz1bW11dO3RoaXMubW9ycGhUYXJnZXRzPVtdO3RoaXMubW9ycGhOb3JtYWxzPVtdO3RoaXMuc2tpbldlaWdodHM9W107dGhpcy5za2luSW5kaWNlcz1bXTt0aGlzLmxpbmVEaXN0YW5jZXM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5ncm91cHNOZWVkVXBkYXRlPXRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGU9CnRoaXMuY29sb3JzTmVlZFVwZGF0ZT10aGlzLm5vcm1hbHNOZWVkVXBkYXRlPXRoaXMudXZzTmVlZFVwZGF0ZT10aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZT10aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZT0hMX1mdW5jdGlvbiBTYShhLGMsZSxnLHIsdil7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkJveEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3dpZHRoOmEsaGVpZ2h0OmMsZGVwdGg6ZSx3aWR0aFNlZ21lbnRzOmcsaGVpZ2h0U2VnbWVudHM6cixkZXB0aFNlZ21lbnRzOnZ9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBYYShhLGMsZSxnLHIsdikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIFhhKGEsYyxlLGcscix2KXtmdW5jdGlvbiB6KFcsaGEsZmEscmEscGEscWEsdWEsb2EsdGEsQmEsVGEpe3ZhciBVYT1xYS90YSxDYT11YS9CYSxIYT1xYS8yLERhPXVhLzIsTWE9b2EvMjt1YT10YSsxO3ZhciBkYj1CYSsxLHRiPXFhPTAsS2EsYmIsamI9bmV3IGs7Zm9yKGJiPQowO2JiPGRiO2JiKyspe3ZhciBFYj1iYipDYS1EYTtmb3IoS2E9MDtLYTx1YTtLYSsrKWpiW1ddPShLYSpVYS1IYSkqcmEsamJbaGFdPUViKnBhLGpiW2ZhXT1NYSxKLnB1c2goamIueCxqYi55LGpiLnopLGpiW1ddPTAsamJbaGFdPTAsamJbZmFdPTA8b2E/MTotMSxQLnB1c2goamIueCxqYi55LGpiLnopLFIucHVzaChLYS90YSksUi5wdXNoKDEtYmIvQmEpLHFhKz0xfWZvcihiYj0wO2JiPEJhO2JiKyspZm9yKEthPTA7S2E8dGE7S2ErKylXPVMrS2ErdWEqKGJiKzEpLGhhPVMrKEthKzEpK3VhKihiYisxKSxmYT1TKyhLYSsxKSt1YSpiYixGLnB1c2goUytLYSt1YSpiYixXLGZhKSxGLnB1c2goVyxoYSxmYSksdGIrPTY7RS5hZGRHcm91cChWLHRiLFRhKTtWKz10YjtTKz1xYX12YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQm94QnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6YyxkZXB0aDplLHdpZHRoU2VnbWVudHM6ZyxoZWlnaHRTZWdtZW50czpyLApkZXB0aFNlZ21lbnRzOnZ9O3ZhciBFPXRoaXM7YT1hfHwxO2M9Y3x8MTtlPWV8fDE7Zz1NYXRoLmZsb29yKGcpfHwxO3I9TWF0aC5mbG9vcihyKXx8MTt2PU1hdGguZmxvb3Iodil8fDE7dmFyIEY9W10sSj1bXSxQPVtdLFI9W10sUz0wLFY9MDt6KCJ6IiwieSIsIngiLC0xLC0xLGUsYyxhLHYsciwwKTt6KCJ6IiwieSIsIngiLDEsLTEsZSxjLC1hLHYsciwxKTt6KCJ4IiwieiIsInkiLDEsMSxhLGUsYyxnLHYsMik7eigieCIsInoiLCJ5IiwxLC0xLGEsZSwtYyxnLHYsMyk7eigieCIsInkiLCJ6IiwxLC0xLGEsYyxlLGcsciw0KTt6KCJ4IiwieSIsInoiLC0xLC0xLGEsYywtZSxnLHIsNSk7dGhpcy5zZXRJbmRleChGKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShKLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoUCwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoUiwyKSl9ZnVuY3Rpb24gdWIoYSl7dmFyIGM9e30sZTtmb3IoZSBpbiBhKXtjW2VdPQp7fTtmb3IodmFyIGcgaW4gYVtlXSl7dmFyIHI9YVtlXVtnXTtjW2VdW2ddPXImJihyLmlzQ29sb3J8fHIuaXNNYXRyaXgzfHxyLmlzTWF0cml4NHx8ci5pc1ZlY3RvcjJ8fHIuaXNWZWN0b3IzfHxyLmlzVmVjdG9yNHx8ci5pc1RleHR1cmUpP3IuY2xvbmUoKTpBcnJheS5pc0FycmF5KHIpP3Iuc2xpY2UoKTpyfX1yZXR1cm4gY31mdW5jdGlvbiBCYihhKXtmb3IodmFyIGM9e30sZT0wO2U8YS5sZW5ndGg7ZSsrKXt2YXIgZz11YihhW2VdKSxyO2ZvcihyIGluIGcpY1tyXT1nW3JdfXJldHVybiBjfWZ1bmN0aW9uIHFiKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYWRlck1hdGVyaWFsIjt0aGlzLmRlZmluZXM9e307dGhpcy51bmlmb3Jtcz17fTt0aGlzLnZlcnRleFNoYWRlcj0idm9pZCBtYWluKCkge1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG59Ijt0aGlzLmZyYWdtZW50U2hhZGVyPQoidm9pZCBtYWluKCkge1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCAxLjAsIDAuMCwgMC4wLCAxLjAgKTtcbn0iO3RoaXMubGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPXRoaXMuY2xpcHBpbmc9dGhpcy5saWdodHM9dGhpcy5mb2c9ITE7dGhpcy5leHRlbnNpb25zPXtkZXJpdmF0aXZlczohMSxmcmFnRGVwdGg6ITEsZHJhd0J1ZmZlcnM6ITEsc2hhZGVyVGV4dHVyZUxPRDohMX07dGhpcy5kZWZhdWx0QXR0cmlidXRlVmFsdWVzPXtjb2xvcjpbMSwxLDFdLHV2OlswLDBdLHV2MjpbMCwwXX07dGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lPXZvaWQgMDt0aGlzLnVuaWZvcm1zTmVlZFVwZGF0ZT0hMTt2b2lkIDAhPT1hJiYodm9pZCAwIT09YS5hdHRyaWJ1dGVzJiZjb25zb2xlLmVycm9yKCJUSFJFRS5TaGFkZXJNYXRlcmlhbDogYXR0cmlidXRlcyBzaG91bGQgbm93IGJlIGRlZmluZWQgaW4gVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKSwKdGhpcy5zZXRWYWx1ZXMoYSkpfWZ1bmN0aW9uIHpiKCl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2FtZXJhIjt0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZT1uZXcgcTt0aGlzLnByb2plY3Rpb25NYXRyaXg9bmV3IHE7dGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZT1uZXcgcX1mdW5jdGlvbiB2YihhLGMsZSxnKXt6Yi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGVyc3BlY3RpdmVDYW1lcmEiO3RoaXMuZm92PXZvaWQgMCE9PWE/YTo1MDt0aGlzLnpvb209MTt0aGlzLm5lYXI9dm9pZCAwIT09ZT9lOi4xO3RoaXMuZmFyPXZvaWQgMCE9PWc/ZzoyRTM7dGhpcy5mb2N1cz0xMDt0aGlzLmFzcGVjdD12b2lkIDAhPT1jP2M6MTt0aGlzLnZpZXc9bnVsbDt0aGlzLmZpbG1HYXVnZT0zNTt0aGlzLmZpbG1PZmZzZXQ9MDt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1mdW5jdGlvbiBHYihhLGMsZSxnKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJDdWJlQ2FtZXJhIjt2YXIgcj1uZXcgdmIoOTAsCjEsYSxjKTtyLnVwLnNldCgwLC0xLDApO3IubG9va0F0KG5ldyBrKDEsMCwwKSk7dGhpcy5hZGQocik7dmFyIHY9bmV3IHZiKDkwLDEsYSxjKTt2LnVwLnNldCgwLC0xLDApO3YubG9va0F0KG5ldyBrKC0xLDAsMCkpO3RoaXMuYWRkKHYpO3ZhciB6PW5ldyB2Yig5MCwxLGEsYyk7ei51cC5zZXQoMCwwLDEpO3oubG9va0F0KG5ldyBrKDAsMSwwKSk7dGhpcy5hZGQoeik7dmFyIEU9bmV3IHZiKDkwLDEsYSxjKTtFLnVwLnNldCgwLDAsLTEpO0UubG9va0F0KG5ldyBrKDAsLTEsMCkpO3RoaXMuYWRkKEUpO3ZhciBGPW5ldyB2Yig5MCwxLGEsYyk7Ri51cC5zZXQoMCwtMSwwKTtGLmxvb2tBdChuZXcgaygwLDAsMSkpO3RoaXMuYWRkKEYpO3ZhciBKPW5ldyB2Yig5MCwxLGEsYyk7Si51cC5zZXQoMCwtMSwwKTtKLmxvb2tBdChuZXcgaygwLDAsLTEpKTt0aGlzLmFkZChKKTtnPWd8fHtmb3JtYXQ6MTAyMixtYWdGaWx0ZXI6MTAwNixtaW5GaWx0ZXI6MTAwNn07dGhpcy5yZW5kZXJUYXJnZXQ9Cm5ldyBOYihlLGUsZyk7dGhpcy5yZW5kZXJUYXJnZXQudGV4dHVyZS5uYW1lPSJDdWJlQ2FtZXJhIjt0aGlzLnVwZGF0ZT1mdW5jdGlvbihQLFIpe251bGw9PT10aGlzLnBhcmVudCYmdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO3ZhciBTPVAuZ2V0UmVuZGVyVGFyZ2V0KCksVj10aGlzLnJlbmRlclRhcmdldCxXPVYudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM7Vi50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz0hMTtQLnNldFJlbmRlclRhcmdldChWLDApO1AucmVuZGVyKFIscik7UC5zZXRSZW5kZXJUYXJnZXQoViwxKTtQLnJlbmRlcihSLHYpO1Auc2V0UmVuZGVyVGFyZ2V0KFYsMik7UC5yZW5kZXIoUix6KTtQLnNldFJlbmRlclRhcmdldChWLDMpO1AucmVuZGVyKFIsRSk7UC5zZXRSZW5kZXJUYXJnZXQoViw0KTtQLnJlbmRlcihSLEYpO1YudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9VztQLnNldFJlbmRlclRhcmdldChWLDUpO1AucmVuZGVyKFIsSik7UC5zZXRSZW5kZXJUYXJnZXQoUyl9Owp0aGlzLmNsZWFyPWZ1bmN0aW9uKFAsUixTLFYpe2Zvcih2YXIgVz1QLmdldFJlbmRlclRhcmdldCgpLGhhPXRoaXMucmVuZGVyVGFyZ2V0LGZhPTA7Nj5mYTtmYSsrKVAuc2V0UmVuZGVyVGFyZ2V0KGhhLGZhKSxQLmNsZWFyKFIsUyxWKTtQLnNldFJlbmRlclRhcmdldChXKX19ZnVuY3Rpb24gTmIoYSxjLGUpe20uY2FsbCh0aGlzLGEsYyxlKX1mdW5jdGlvbiBBYihhLGMsZSxnLHIsdix6LEUsRixKLFAsUil7bC5jYWxsKHRoaXMsbnVsbCx2LHosRSxGLEosZyxyLFAsUik7dGhpcy5pbWFnZT17ZGF0YTphLHdpZHRoOmMsaGVpZ2h0OmV9O3RoaXMubWFnRmlsdGVyPXZvaWQgMCE9PUY/RjoxMDAzO3RoaXMubWluRmlsdGVyPXZvaWQgMCE9PUo/SjoxMDAzO3RoaXMuZmxpcFk9dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITE7dGhpcy51bnBhY2tBbGlnbm1lbnQ9MX1mdW5jdGlvbiBIYihhLGMpe3RoaXMubm9ybWFsPXZvaWQgMCE9PWE/YTpuZXcgaygxLDAsMCk7dGhpcy5jb25zdGFudD12b2lkIDAhPT0KYz9jOjB9ZnVuY3Rpb24gaWMoYSxjLGUsZyxyLHYpe3RoaXMucGxhbmVzPVt2b2lkIDAhPT1hP2E6bmV3IEhiLHZvaWQgMCE9PWM/YzpuZXcgSGIsdm9pZCAwIT09ZT9lOm5ldyBIYix2b2lkIDAhPT1nP2c6bmV3IEhiLHZvaWQgMCE9PXI/cjpuZXcgSGIsdm9pZCAwIT09dj92Om5ldyBIYl19ZnVuY3Rpb24gYmMoKXtmdW5jdGlvbiBhKHIsdil7ITEhPT1lJiYoZyhyLHYpLGMucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGEpKX12YXIgYz1udWxsLGU9ITEsZz1udWxsO3JldHVybntzdGFydDpmdW5jdGlvbigpeyEwIT09ZSYmbnVsbCE9PWcmJihjLnJlcXVlc3RBbmltYXRpb25GcmFtZShhKSxlPSEwKX0sc3RvcDpmdW5jdGlvbigpe2U9ITF9LHNldEFuaW1hdGlvbkxvb3A6ZnVuY3Rpb24ocil7Zz1yfSxzZXRDb250ZXh0OmZ1bmN0aW9uKHIpe2M9cn19fWZ1bmN0aW9uIE9kKGEpe2Z1bmN0aW9uIGMocix2KXt2YXIgej1yLmFycmF5LEU9ci5keW5hbWljPzM1MDQ4OjM1MDQ0LEY9YS5jcmVhdGVCdWZmZXIoKTsKYS5iaW5kQnVmZmVyKHYsRik7YS5idWZmZXJEYXRhKHYseixFKTtyLm9uVXBsb2FkQ2FsbGJhY2soKTt2PTUxMjY7eiBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheT92PTUxMjY6eiBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMQXR0cmlidXRlczogVW5zdXBwb3J0ZWQgZGF0YSBidWZmZXIgZm9ybWF0OiBGbG9hdDY0QXJyYXkuIik6eiBpbnN0YW5jZW9mIFVpbnQxNkFycmF5P3Y9NTEyMzp6IGluc3RhbmNlb2YgSW50MTZBcnJheT92PTUxMjI6eiBpbnN0YW5jZW9mIFVpbnQzMkFycmF5P3Y9NTEyNTp6IGluc3RhbmNlb2YgSW50MzJBcnJheT92PTUxMjQ6eiBpbnN0YW5jZW9mIEludDhBcnJheT92PTUxMjA6eiBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkmJih2PTUxMjEpO3JldHVybntidWZmZXI6Rix0eXBlOnYsYnl0ZXNQZXJFbGVtZW50OnouQllURVNfUEVSX0VMRU1FTlQsdmVyc2lvbjpyLnZlcnNpb259fWZ1bmN0aW9uIGUocix2LHope3ZhciBFPQp2LmFycmF5LEY9di51cGRhdGVSYW5nZTthLmJpbmRCdWZmZXIoeixyKTshMT09PXYuZHluYW1pYz9hLmJ1ZmZlckRhdGEoeixFLDM1MDQ0KTotMT09PUYuY291bnQ/YS5idWZmZXJTdWJEYXRhKHosMCxFKTowPT09Ri5jb3VudD9jb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTE9iamVjdHMudXBkYXRlQnVmZmVyOiBkeW5hbWljIFRIUkVFLkJ1ZmZlckF0dHJpYnV0ZSBtYXJrZWQgYXMgbmVlZHNVcGRhdGUgYnV0IHVwZGF0ZVJhbmdlLmNvdW50IGlzIDAsIGVuc3VyZSB5b3UgYXJlIHVzaW5nIHNldCBtZXRob2RzIG9yIHVwZGF0aW5nIG1hbnVhbGx5LiIpOihhLmJ1ZmZlclN1YkRhdGEoeixGLm9mZnNldCpFLkJZVEVTX1BFUl9FTEVNRU5ULEUuc3ViYXJyYXkoRi5vZmZzZXQsRi5vZmZzZXQrRi5jb3VudCkpLEYuY291bnQ9LTEpfXZhciBnPW5ldyBXZWFrTWFwO3JldHVybntnZXQ6ZnVuY3Rpb24ocil7ci5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlJiYocj1yLmRhdGEpO3JldHVybiBnLmdldChyKX0sCnJlbW92ZTpmdW5jdGlvbihyKXtyLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUmJihyPXIuZGF0YSk7dmFyIHY9Zy5nZXQocik7diYmKGEuZGVsZXRlQnVmZmVyKHYuYnVmZmVyKSxnLmRlbGV0ZShyKSl9LHVwZGF0ZTpmdW5jdGlvbihyLHYpe3IuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSYmKHI9ci5kYXRhKTt2YXIgej1nLmdldChyKTt2b2lkIDA9PT16P2cuc2V0KHIsYyhyLHYpKTp6LnZlcnNpb248ci52ZXJzaW9uJiYoZSh6LmJ1ZmZlcixyLHYpLHoudmVyc2lvbj1yLnZlcnNpb24pfX19ZnVuY3Rpb24gcmQoYSxjLGUsZyl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBsYW5lR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6Yyx3aWR0aFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6Z307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IExjKGEsYyxlLGcpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBMYyhhLGMsZSxnKXt2YS5jYWxsKHRoaXMpOwp0aGlzLnR5cGU9IlBsYW5lQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17d2lkdGg6YSxoZWlnaHQ6Yyx3aWR0aFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6Z307YT1hfHwxO2M9Y3x8MTt2YXIgcj1hLzIsdj1jLzI7ZT1NYXRoLmZsb29yKGUpfHwxO2c9TWF0aC5mbG9vcihnKXx8MTt2YXIgej1lKzEsRT1nKzEsRj1hL2UsSj1jL2csUD1bXSxSPVtdLFM9W10sVj1bXTtmb3IoYT0wO2E8RTthKyspe3ZhciBXPWEqSi12O2ZvcihjPTA7Yzx6O2MrKylSLnB1c2goYypGLXIsLVcsMCksUy5wdXNoKDAsMCwxKSxWLnB1c2goYy9lKSxWLnB1c2goMS1hL2cpfWZvcihhPTA7YTxnO2ErKylmb3IoYz0wO2M8ZTtjKyspcj1jK3oqKGErMSksdj1jKzEreiooYSsxKSxFPWMrMSt6KmEsUC5wdXNoKGMreiphLHIsRSksUC5wdXNoKHIsdixFKTt0aGlzLnNldEluZGV4KFApO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKFIsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLApuZXcgY2EoUywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoViwyKSl9ZnVuY3Rpb24gc2QoYSxjLGUsZyl7ZnVuY3Rpb24gcihSLFMpe2MuYnVmZmVycy5jb2xvci5zZXRDbGVhcihSLnIsUi5nLFIuYixTLGcpfXZhciB2PW5ldyBJKDApLHo9MCxFLEYsSj1udWxsLFA9MDtyZXR1cm57Z2V0Q2xlYXJDb2xvcjpmdW5jdGlvbigpe3JldHVybiB2fSxzZXRDbGVhckNvbG9yOmZ1bmN0aW9uKFIsUyl7di5zZXQoUik7ej12b2lkIDAhPT1TP1M6MTtyKHYseil9LGdldENsZWFyQWxwaGE6ZnVuY3Rpb24oKXtyZXR1cm4gen0sc2V0Q2xlYXJBbHBoYTpmdW5jdGlvbihSKXt6PVI7cih2LHopfSxyZW5kZXI6ZnVuY3Rpb24oUixTLFYsVyl7Uz1TLmJhY2tncm91bmQ7Vj1hLnZyOyhWPVYuZ2V0U2Vzc2lvbiYmVi5nZXRTZXNzaW9uKCkpJiYiYWRkaXRpdmUiPT09Vi5lbnZpcm9ubWVudEJsZW5kTW9kZSYmKFM9bnVsbCk7bnVsbD09PVM/KHIodix6KSxKPW51bGwsUD0wKTpTJiZTLmlzQ29sb3ImJgoocihTLDEpLFc9ITAsSj1udWxsLFA9MCk7KGEuYXV0b0NsZWFyfHxXKSYmYS5jbGVhcihhLmF1dG9DbGVhckNvbG9yLGEuYXV0b0NsZWFyRGVwdGgsYS5hdXRvQ2xlYXJTdGVuY2lsKTtpZihTJiYoUy5pc0N1YmVUZXh0dXJlfHxTLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKSl7dm9pZCAwPT09RiYmKEY9bmV3IHhhKG5ldyBYYSgxLDEsMSksbmV3IHFiKHt0eXBlOiJCYWNrZ3JvdW5kQ3ViZU1hdGVyaWFsIix1bmlmb3Jtczp1YihNYy5jdWJlLnVuaWZvcm1zKSx2ZXJ0ZXhTaGFkZXI6TWMuY3ViZS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6TWMuY3ViZS5mcmFnbWVudFNoYWRlcixzaWRlOjEsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLEYuZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCJub3JtYWwiKSxGLmdlb21ldHJ5LnJlbW92ZUF0dHJpYnV0ZSgidXYiKSxGLm9uQmVmb3JlUmVuZGVyPWZ1bmN0aW9uKGhhLGZhLHJhKXt0aGlzLm1hdHJpeFdvcmxkLmNvcHlQb3NpdGlvbihyYS5tYXRyaXhXb3JsZCl9LApPYmplY3QuZGVmaW5lUHJvcGVydHkoRi5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudEN1YmUudmFsdWV9fSksZS51cGRhdGUoRikpO1c9Uy5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZT9TLnRleHR1cmU6UztGLm1hdGVyaWFsLnVuaWZvcm1zLnRDdWJlLnZhbHVlPVc7Ri5tYXRlcmlhbC51bmlmb3Jtcy50RmxpcC52YWx1ZT1TLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPzE6LTE7aWYoSiE9PVN8fFAhPT1XLnZlcnNpb24pRi5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxKPVMsUD1XLnZlcnNpb247Ui51bnNoaWZ0KEYsRi5nZW9tZXRyeSxGLm1hdGVyaWFsLDAsMCxudWxsKX1lbHNlIGlmKFMmJlMuaXNUZXh0dXJlKXt2b2lkIDA9PT1FJiYoRT1uZXcgeGEobmV3IExjKDIsMiksbmV3IHFiKHt0eXBlOiJCYWNrZ3JvdW5kTWF0ZXJpYWwiLHVuaWZvcm1zOnViKE1jLmJhY2tncm91bmQudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpNYy5iYWNrZ3JvdW5kLnZlcnRleFNoYWRlciwKZnJhZ21lbnRTaGFkZXI6TWMuYmFja2dyb3VuZC5mcmFnbWVudFNoYWRlcixzaWRlOjAsZGVwdGhUZXN0OiExLGRlcHRoV3JpdGU6ITEsZm9nOiExfSkpLEUuZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCJub3JtYWwiKSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRS5tYXRlcmlhbCwibWFwIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudW5pZm9ybXMudDJELnZhbHVlfX0pLGUudXBkYXRlKEUpKTtFLm1hdGVyaWFsLnVuaWZvcm1zLnQyRC52YWx1ZT1TOyEwPT09Uy5tYXRyaXhBdXRvVXBkYXRlJiZTLnVwZGF0ZU1hdHJpeCgpO0UubWF0ZXJpYWwudW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weShTLm1hdHJpeCk7aWYoSiE9PVN8fFAhPT1TLnZlcnNpb24pRS5tYXRlcmlhbC5uZWVkc1VwZGF0ZT0hMCxKPVMsUD1TLnZlcnNpb247Ui51bnNoaWZ0KEUsRS5nZW9tZXRyeSxFLm1hdGVyaWFsLDAsMCxudWxsKX19fX1mdW5jdGlvbiBzYShhLGMsZSxnKXt2YXIgcjt0aGlzLnNldE1vZGU9CmZ1bmN0aW9uKHYpe3I9dn07dGhpcy5yZW5kZXI9ZnVuY3Rpb24odix6KXthLmRyYXdBcnJheXMocix2LHopO2UudXBkYXRlKHoscil9O3RoaXMucmVuZGVySW5zdGFuY2VzPWZ1bmN0aW9uKHYseixFKXtpZihnLmlzV2ViR0wyKXt2YXIgRj1hO3ZhciBKPSJkcmF3QXJyYXlzSW5zdGFuY2VkIn1lbHNlIGlmKEY9Yy5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSxKPSJkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1GKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEJ1ZmZlclJlbmRlcmVyOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4iKTtyZXR1cm59RltKXShyLHosRSx2Lm1heEluc3RhbmNlZENvdW50KTtlLnVwZGF0ZShFLHIsdi5tYXhJbnN0YW5jZWRDb3VudCl9fWZ1bmN0aW9uIE1iKGEsYyxlKXtmdW5jdGlvbiBnKHFhKXtpZigiaGlnaHAiPT09CnFhKXtpZigwPGEuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMzLDM2MzM4KS5wcmVjaXNpb24mJjA8YS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoMzU2MzIsMzYzMzgpLnByZWNpc2lvbilyZXR1cm4iaGlnaHAiO3FhPSJtZWRpdW1wIn1yZXR1cm4ibWVkaXVtcCI9PT1xYSYmMDxhLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCgzNTYzMywzNjMzNykucHJlY2lzaW9uJiYwPGEuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KDM1NjMyLDM2MzM3KS5wcmVjaXNpb24/Im1lZGl1bXAiOiJsb3dwIn12YXIgcix2PSJ1bmRlZmluZWQiIT09dHlwZW9mIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQmJmEgaW5zdGFuY2VvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0LHo9dm9pZCAwIT09ZS5wcmVjaXNpb24/ZS5wcmVjaXNpb246ImhpZ2hwIixFPWcoeik7RSE9PXomJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6Iix6LCJub3Qgc3VwcG9ydGVkLCB1c2luZyIsRSwiaW5zdGVhZC4iKSwKej1FKTtlPSEwPT09ZS5sb2dhcml0aG1pY0RlcHRoQnVmZmVyO0U9YS5nZXRQYXJhbWV0ZXIoMzQ5MzApO3ZhciBGPWEuZ2V0UGFyYW1ldGVyKDM1NjYwKSxKPWEuZ2V0UGFyYW1ldGVyKDMzNzkpLFA9YS5nZXRQYXJhbWV0ZXIoMzQwNzYpLFI9YS5nZXRQYXJhbWV0ZXIoMzQ5MjEpLFM9YS5nZXRQYXJhbWV0ZXIoMzYzNDcpLFY9YS5nZXRQYXJhbWV0ZXIoMzYzNDgpLFc9YS5nZXRQYXJhbWV0ZXIoMzYzNDkpLGhhPTA8RixmYT12fHwhIWMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdCIpLHJhPWhhJiZmYSxwYT12P2EuZ2V0UGFyYW1ldGVyKDM2MTgzKTowO3JldHVybntpc1dlYkdMMjp2LGdldE1heEFuaXNvdHJvcHk6ZnVuY3Rpb24oKXtpZih2b2lkIDAhPT1yKXJldHVybiByO3ZhciBxYT1jLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7cmV0dXJuIHI9bnVsbCE9PXFhP2EuZ2V0UGFyYW1ldGVyKHFhLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCk6MH0sCmdldE1heFByZWNpc2lvbjpnLHByZWNpc2lvbjp6LGxvZ2FyaXRobWljRGVwdGhCdWZmZXI6ZSxtYXhUZXh0dXJlczpFLG1heFZlcnRleFRleHR1cmVzOkYsbWF4VGV4dHVyZVNpemU6SixtYXhDdWJlbWFwU2l6ZTpQLG1heEF0dHJpYnV0ZXM6UixtYXhWZXJ0ZXhVbmlmb3JtczpTLG1heFZhcnlpbmdzOlYsbWF4RnJhZ21lbnRVbmlmb3JtczpXLHZlcnRleFRleHR1cmVzOmhhLGZsb2F0RnJhZ21lbnRUZXh0dXJlczpmYSxmbG9hdFZlcnRleFRleHR1cmVzOnJhLG1heFNhbXBsZXM6cGF9fWZ1bmN0aW9uIHdjKCl7ZnVuY3Rpb24gYSgpe0oudmFsdWUhPT1nJiYoSi52YWx1ZT1nLEoubmVlZHNVcGRhdGU9MDxyKTtlLm51bVBsYW5lcz1yO2UubnVtSW50ZXJzZWN0aW9uPTB9ZnVuY3Rpb24gYyhQLFIsUyxWKXt2YXIgVz1udWxsIT09UD9QLmxlbmd0aDowLGhhPW51bGw7aWYoMCE9PVcpe2hhPUoudmFsdWU7aWYoITAhPT1WfHxudWxsPT09aGEpe1Y9Uys0Klc7Uj1SLm1hdHJpeFdvcmxkSW52ZXJzZTsKRi5nZXROb3JtYWxNYXRyaXgoUik7aWYobnVsbD09PWhhfHxoYS5sZW5ndGg8ViloYT1uZXcgRmxvYXQzMkFycmF5KFYpO2ZvcihWPTA7ViE9PVc7KytWLFMrPTQpRS5jb3B5KFBbVl0pLmFwcGx5TWF0cml4NChSLEYpLEUubm9ybWFsLnRvQXJyYXkoaGEsUyksaGFbUyszXT1FLmNvbnN0YW50fUoudmFsdWU9aGE7Si5uZWVkc1VwZGF0ZT0hMH1lLm51bVBsYW5lcz1XO3JldHVybiBoYX12YXIgZT10aGlzLGc9bnVsbCxyPTAsdj0hMSx6PSExLEU9bmV3IEhiLEY9bmV3IHQsSj17dmFsdWU6bnVsbCxuZWVkc1VwZGF0ZTohMX07dGhpcy51bmlmb3JtPUo7dGhpcy5udW1JbnRlcnNlY3Rpb249dGhpcy5udW1QbGFuZXM9MDt0aGlzLmluaXQ9ZnVuY3Rpb24oUCxSLFMpe3ZhciBWPTAhPT1QLmxlbmd0aHx8Unx8MCE9PXJ8fHY7dj1SO2c9YyhQLFMsMCk7cj1QLmxlbmd0aDtyZXR1cm4gVn07dGhpcy5iZWdpblNoYWRvd3M9ZnVuY3Rpb24oKXt6PSEwO2MobnVsbCl9O3RoaXMuZW5kU2hhZG93cz0KZnVuY3Rpb24oKXt6PSExO2EoKX07dGhpcy5zZXRTdGF0ZT1mdW5jdGlvbihQLFIsUyxWLFcsaGEpe2lmKCF2fHxudWxsPT09UHx8MD09PVAubGVuZ3RofHx6JiYhUyl6P2MobnVsbCk6YSgpO2Vsc2V7Uz16PzA6cjt2YXIgZmE9NCpTLHJhPVcuY2xpcHBpbmdTdGF0ZXx8bnVsbDtKLnZhbHVlPXJhO3JhPWMoUCxWLGZhLGhhKTtmb3IoUD0wO1AhPT1mYTsrK1ApcmFbUF09Z1tQXTtXLmNsaXBwaW5nU3RhdGU9cmE7dGhpcy5udW1JbnRlcnNlY3Rpb249Uj90aGlzLm51bVBsYW5lczowO3RoaXMubnVtUGxhbmVzKz1TfX19ZnVuY3Rpb24gYmQoYSl7dmFyIGM9e307cmV0dXJue2dldDpmdW5jdGlvbihlKXtpZih2b2lkIDAhPT1jW2VdKXJldHVybiBjW2VdO3N3aXRjaChlKXtjYXNlICJXRUJHTF9kZXB0aF90ZXh0dXJlIjp2YXIgZz1hLmdldEV4dGVuc2lvbigiV0VCR0xfZGVwdGhfdGV4dHVyZSIpfHxhLmdldEV4dGVuc2lvbigiTU9aX1dFQkdMX2RlcHRoX3RleHR1cmUiKXx8YS5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlIik7CmJyZWFrO2Nhc2UgIkVYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYyI6Zz1hLmdldEV4dGVuc2lvbigiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIil8fGEuZ2V0RXh0ZW5zaW9uKCJNT1pfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIil8fGEuZ2V0RXh0ZW5zaW9uKCJXRUJLSVRfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIik7YnJlYWs7Y2FzZSAiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiOmc9YS5nZXRFeHRlbnNpb24oIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGEuZ2V0RXh0ZW5zaW9uKCJNT1pfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKXx8YS5nZXRFeHRlbnNpb24oIldFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YyIpO2JyZWFrO2Nhc2UgIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyI6Zz1hLmdldEV4dGVuc2lvbigiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil8fAphLmdldEV4dGVuc2lvbigiV0VCS0lUX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YyIpO2JyZWFrO2RlZmF1bHQ6Zz1hLmdldEV4dGVuc2lvbihlKX1udWxsPT09ZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAiK2UrIiBleHRlbnNpb24gbm90IHN1cHBvcnRlZC4iKTtyZXR1cm4gY1tlXT1nfX19ZnVuY3Rpb24gdGQoYSxjLGUpe2Z1bmN0aW9uIGcoRSl7dmFyIEY9RS50YXJnZXQ7RT12LmdldChGKTtudWxsIT09RS5pbmRleCYmYy5yZW1vdmUoRS5pbmRleCk7Zm9yKHZhciBKIGluIEUuYXR0cmlidXRlcyljLnJlbW92ZShFLmF0dHJpYnV0ZXNbSl0pO0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZyk7di5kZWxldGUoRik7aWYoSj16LmdldChFKSljLnJlbW92ZShKKSx6LmRlbGV0ZShFKTtlLm1lbW9yeS5nZW9tZXRyaWVzLS19ZnVuY3Rpb24gcihFKXt2YXIgRj1bXSxKPUUuaW5kZXgsUD1FLmF0dHJpYnV0ZXMucG9zaXRpb247aWYobnVsbCE9PQpKKXt2YXIgUj1KLmFycmF5O0o9Si52ZXJzaW9uO1A9MDtmb3IodmFyIFM9Ui5sZW5ndGg7UDxTO1ArPTMpe3ZhciBWPVJbUCswXSxXPVJbUCsxXSxoYT1SW1ArMl07Ri5wdXNoKFYsVyxXLGhhLGhhLFYpfX1lbHNlIGZvcihSPVAuYXJyYXksSj1QLnZlcnNpb24sUD0wLFM9Ui5sZW5ndGgvMy0xO1A8UztQKz0zKVY9UCswLFc9UCsxLGhhPVArMixGLnB1c2goVixXLFcsaGEsaGEsVik7Rj1uZXcgKDY1NTM1PEVhKEYpP2VhOlopKEYsMSk7Ri52ZXJzaW9uPUo7Yy51cGRhdGUoRiwzNDk2Myk7KFI9ei5nZXQoRSkpJiZjLnJlbW92ZShSKTt6LnNldChFLEYpfXZhciB2PW5ldyBXZWFrTWFwLHo9bmV3IFdlYWtNYXA7cmV0dXJue2dldDpmdW5jdGlvbihFLEYpe3ZhciBKPXYuZ2V0KEYpO2lmKEopcmV0dXJuIEo7Ri5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixnKTtGLmlzQnVmZmVyR2VvbWV0cnk/Sj1GOkYuaXNHZW9tZXRyeSYmKHZvaWQgMD09PUYuX2J1ZmZlckdlb21ldHJ5JiYoRi5fYnVmZmVyR2VvbWV0cnk9CihuZXcgdmEpLnNldEZyb21PYmplY3QoRSkpLEo9Ri5fYnVmZmVyR2VvbWV0cnkpO3Yuc2V0KEYsSik7ZS5tZW1vcnkuZ2VvbWV0cmllcysrO3JldHVybiBKfSx1cGRhdGU6ZnVuY3Rpb24oRSl7dmFyIEY9RS5pbmRleCxKPUUuYXR0cmlidXRlcztudWxsIT09RiYmYy51cGRhdGUoRiwzNDk2Myk7Zm9yKHZhciBQIGluIEopYy51cGRhdGUoSltQXSwzNDk2Mik7RT1FLm1vcnBoQXR0cmlidXRlcztmb3IoUCBpbiBFKXtGPUVbUF07Sj0wO2Zvcih2YXIgUj1GLmxlbmd0aDtKPFI7SisrKWMudXBkYXRlKEZbSl0sMzQ5NjIpfX0sZ2V0V2lyZWZyYW1lQXR0cmlidXRlOmZ1bmN0aW9uKEUpe3ZhciBGPXouZ2V0KEUpO2lmKEYpe3ZhciBKPUUuaW5kZXg7bnVsbCE9PUomJkYudmVyc2lvbjxKLnZlcnNpb24mJnIoRSl9ZWxzZSByKEUpO3JldHVybiB6LmdldChFKX19fWZ1bmN0aW9uIHRnKGEsYyxlLGcpe3ZhciByLHYsejt0aGlzLnNldE1vZGU9ZnVuY3Rpb24oRSl7cj1FfTt0aGlzLnNldEluZGV4PQpmdW5jdGlvbihFKXt2PUUudHlwZTt6PUUuYnl0ZXNQZXJFbGVtZW50fTt0aGlzLnJlbmRlcj1mdW5jdGlvbihFLEYpe2EuZHJhd0VsZW1lbnRzKHIsRix2LEUqeik7ZS51cGRhdGUoRixyKX07dGhpcy5yZW5kZXJJbnN0YW5jZXM9ZnVuY3Rpb24oRSxGLEope2lmKGcuaXNXZWJHTDIpe3ZhciBQPWE7dmFyIFI9ImRyYXdFbGVtZW50c0luc3RhbmNlZCJ9ZWxzZSBpZihQPWMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIiksUj0iZHJhd0VsZW1lbnRzSW5zdGFuY2VkQU5HTEUiLG51bGw9PT1QKXtjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7cmV0dXJufVBbUl0ocixKLHYsRip6LEUubWF4SW5zdGFuY2VkQ291bnQpO2UudXBkYXRlKEoscixFLm1heEluc3RhbmNlZENvdW50KX19CmZ1bmN0aW9uIFNrKCl7dmFyIGE9e2ZyYW1lOjAsY2FsbHM6MCx0cmlhbmdsZXM6MCxwb2ludHM6MCxsaW5lczowfTtyZXR1cm57bWVtb3J5OntnZW9tZXRyaWVzOjAsdGV4dHVyZXM6MH0scmVuZGVyOmEscHJvZ3JhbXM6bnVsbCxhdXRvUmVzZXQ6ITAscmVzZXQ6ZnVuY3Rpb24oKXthLmZyYW1lKys7YS5jYWxscz0wO2EudHJpYW5nbGVzPTA7YS5wb2ludHM9MDthLmxpbmVzPTB9LHVwZGF0ZTpmdW5jdGlvbihjLGUsZyl7Zz1nfHwxO2EuY2FsbHMrKztzd2l0Y2goZSl7Y2FzZSA0OmEudHJpYW5nbGVzKz1jLzMqZzticmVhaztjYXNlIDU6Y2FzZSA2OmEudHJpYW5nbGVzKz1nKihjLTIpO2JyZWFrO2Nhc2UgMTphLmxpbmVzKz1jLzIqZzticmVhaztjYXNlIDM6YS5saW5lcys9ZyooYy0xKTticmVhaztjYXNlIDI6YS5saW5lcys9ZypjO2JyZWFrO2Nhc2UgMDphLnBvaW50cys9ZypjO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZToiLAplKX19fX1mdW5jdGlvbiBUayhhLGMpe3JldHVybiBNYXRoLmFicyhjWzFdKS1NYXRoLmFicyhhWzFdKX1mdW5jdGlvbiBVayhhKXt2YXIgYz17fSxlPW5ldyBGbG9hdDMyQXJyYXkoOCk7cmV0dXJue3VwZGF0ZTpmdW5jdGlvbihnLHIsdix6KXt2YXIgRT1nLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyxGPUUubGVuZ3RoO2c9Y1tyLmlkXTtpZih2b2lkIDA9PT1nKXtnPVtdO2Zvcih2YXIgSj0wO0o8RjtKKyspZ1tKXT1bSiwwXTtjW3IuaWRdPWd9dmFyIFA9di5tb3JwaFRhcmdldHMmJnIubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uO3Y9di5tb3JwaE5vcm1hbHMmJnIubW9ycGhBdHRyaWJ1dGVzLm5vcm1hbDtmb3IoSj0wO0o8RjtKKyspe3ZhciBSPWdbSl07MCE9PVJbMV0mJihQJiZyLnJlbW92ZUF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0opLHYmJnIucmVtb3ZlQXR0cmlidXRlKCJtb3JwaE5vcm1hbCIrSikpfWZvcihKPTA7SjxGO0orKylSPWdbSl0sUlswXT1KLFJbMV09RVtKXTtnLnNvcnQoVGspOwpmb3IoSj0wOzg+SjtKKyspe2lmKFI9Z1tKXSlpZihFPVJbMF0sRj1SWzFdKXtQJiZyLmFkZEF0dHJpYnV0ZSgibW9ycGhUYXJnZXQiK0osUFtFXSk7diYmci5hZGRBdHRyaWJ1dGUoIm1vcnBoTm9ybWFsIitKLHZbRV0pO2VbSl09Rjtjb250aW51ZX1lW0pdPTB9ei5nZXRVbmlmb3JtcygpLnNldFZhbHVlKGEsIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIsZSl9fX1mdW5jdGlvbiBWayhhLGMpe3ZhciBlPXt9O3JldHVybnt1cGRhdGU6ZnVuY3Rpb24oZyl7dmFyIHI9Yy5yZW5kZXIuZnJhbWUsdj1nLmdlb21ldHJ5LHo9YS5nZXQoZyx2KTtlW3ouaWRdIT09ciYmKHYuaXNHZW9tZXRyeSYmei51cGRhdGVGcm9tT2JqZWN0KGcpLGEudXBkYXRlKHopLGVbei5pZF09cik7cmV0dXJuIHp9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtlPXt9fX19ZnVuY3Rpb24gY2QoYSxjLGUsZyxyLHYseixFLEYsSil7YT12b2lkIDAhPT1hP2E6W107bC5jYWxsKHRoaXMsYSx2b2lkIDAhPT1jP2M6MzAxLGUsZyxyLHYsCnZvaWQgMCE9PXo/ejoxMDIyLEUsRixKKTt0aGlzLmZsaXBZPSExfWZ1bmN0aW9uIHJlKGEsYyxlLGcpe2wuY2FsbCh0aGlzLG51bGwpO3RoaXMuaW1hZ2U9e2RhdGE6YSx3aWR0aDpjLGhlaWdodDplLGRlcHRoOmd9O3RoaXMubWluRmlsdGVyPXRoaXMubWFnRmlsdGVyPTEwMDM7dGhpcy53cmFwUj0xMDAxO3RoaXMuZmxpcFk9dGhpcy5nZW5lcmF0ZU1pcG1hcHM9ITF9ZnVuY3Rpb24gc2UoYSxjLGUsZyl7bC5jYWxsKHRoaXMsbnVsbCk7dGhpcy5pbWFnZT17ZGF0YTphLHdpZHRoOmMsaGVpZ2h0OmUsZGVwdGg6Z307dGhpcy5taW5GaWx0ZXI9dGhpcy5tYWdGaWx0ZXI9MTAwMzt0aGlzLndyYXBSPTEwMDE7dGhpcy5mbGlwWT10aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX1mdW5jdGlvbiB0ZShhLGMsZSl7dmFyIGc9YVswXTtpZigwPj1nfHwwPGcpcmV0dXJuIGE7dmFyIHI9YyplLHY9Y2pbcl07dm9pZCAwPT09diYmKHY9bmV3IEZsb2F0MzJBcnJheShyKSxjaltyXT12KTtpZigwIT09Yylmb3IoZy50b0FycmF5KHYsCjApLGc9MSxyPTA7ZyE9PWM7KytnKXIrPWUsYVtnXS50b0FycmF5KHYscik7cmV0dXJuIHZ9ZnVuY3Rpb24gc2MoYSxjKXtpZihhLmxlbmd0aCE9PWMubGVuZ3RoKXJldHVybiExO2Zvcih2YXIgZT0wLGc9YS5sZW5ndGg7ZTxnO2UrKylpZihhW2VdIT09Y1tlXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBtYyhhLGMpe2Zvcih2YXIgZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKylhW2VdPWNbZV19ZnVuY3Rpb24gZGooYSxjKXt2YXIgZT1laltjXTt2b2lkIDA9PT1lJiYoZT1uZXcgSW50MzJBcnJheShjKSxlaltjXT1lKTtmb3IodmFyIGc9MDtnIT09YzsrK2cpZVtnXT1hLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtyZXR1cm4gZX1mdW5jdGlvbiBXayhhLGMpe3ZhciBlPXRoaXMuY2FjaGU7ZVswXSE9PWMmJihhLnVuaWZvcm0xZih0aGlzLmFkZHIsYyksZVswXT1jKX1mdW5jdGlvbiBYayhhLGMpe3ZhciBlPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09Yy54KXtpZihlWzBdIT09Yy54fHxlWzFdIT09CmMueSlhLnVuaWZvcm0yZih0aGlzLmFkZHIsYy54LGMueSksZVswXT1jLngsZVsxXT1jLnl9ZWxzZSBzYyhlLGMpfHwoYS51bmlmb3JtMmZ2KHRoaXMuYWRkcixjKSxtYyhlLGMpKX1mdW5jdGlvbiBZayhhLGMpe3ZhciBlPXRoaXMuY2FjaGU7aWYodm9pZCAwIT09Yy54KXtpZihlWzBdIT09Yy54fHxlWzFdIT09Yy55fHxlWzJdIT09Yy56KWEudW5pZm9ybTNmKHRoaXMuYWRkcixjLngsYy55LGMueiksZVswXT1jLngsZVsxXT1jLnksZVsyXT1jLnp9ZWxzZSBpZih2b2lkIDAhPT1jLnIpe2lmKGVbMF0hPT1jLnJ8fGVbMV0hPT1jLmd8fGVbMl0hPT1jLmIpYS51bmlmb3JtM2YodGhpcy5hZGRyLGMucixjLmcsYy5iKSxlWzBdPWMucixlWzFdPWMuZyxlWzJdPWMuYn1lbHNlIHNjKGUsYyl8fChhLnVuaWZvcm0zZnYodGhpcy5hZGRyLGMpLG1jKGUsYykpfWZ1bmN0aW9uIFprKGEsYyl7dmFyIGU9dGhpcy5jYWNoZTtpZih2b2lkIDAhPT1jLngpe2lmKGVbMF0hPT1jLnh8fGVbMV0hPT1jLnl8fAplWzJdIT09Yy56fHxlWzNdIT09Yy53KWEudW5pZm9ybTRmKHRoaXMuYWRkcixjLngsYy55LGMueixjLncpLGVbMF09Yy54LGVbMV09Yy55LGVbMl09Yy56LGVbM109Yy53fWVsc2Ugc2MoZSxjKXx8KGEudW5pZm9ybTRmdih0aGlzLmFkZHIsYyksbWMoZSxjKSl9ZnVuY3Rpb24gJGsoYSxjKXt2YXIgZT10aGlzLmNhY2hlLGc9Yy5lbGVtZW50czt2b2lkIDA9PT1nP3NjKGUsYyl8fChhLnVuaWZvcm1NYXRyaXgyZnYodGhpcy5hZGRyLCExLGMpLG1jKGUsYykpOnNjKGUsZyl8fChmai5zZXQoZyksYS51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxmaiksbWMoZSxnKSl9ZnVuY3Rpb24gYWwoYSxjKXt2YXIgZT10aGlzLmNhY2hlLGc9Yy5lbGVtZW50czt2b2lkIDA9PT1nP3NjKGUsYyl8fChhLnVuaWZvcm1NYXRyaXgzZnYodGhpcy5hZGRyLCExLGMpLG1jKGUsYykpOnNjKGUsZyl8fChnai5zZXQoZyksYS51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxnaiksbWMoZSxnKSl9CmZ1bmN0aW9uIGJsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZSxnPWMuZWxlbWVudHM7dm9pZCAwPT09Zz9zYyhlLGMpfHwoYS51bmlmb3JtTWF0cml4NGZ2KHRoaXMuYWRkciwhMSxjKSxtYyhlLGMpKTpzYyhlLGcpfHwoaGouc2V0KGcpLGEudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsITEsaGopLG1jKGUsZykpfWZ1bmN0aW9uIGNsKGEsYyxlKXt2YXIgZz10aGlzLmNhY2hlLHI9ZS5hbGxvY2F0ZVRleHR1cmVVbml0KCk7Z1swXSE9PXImJihhLnVuaWZvcm0xaSh0aGlzLmFkZHIsciksZ1swXT1yKTtlLnNhZmVTZXRUZXh0dXJlMkQoY3x8aWoscil9ZnVuY3Rpb24gZGwoYSxjLGUpe3ZhciBnPXRoaXMuY2FjaGUscj1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTtnWzBdIT09ciYmKGEudW5pZm9ybTFpKHRoaXMuYWRkcixyKSxnWzBdPXIpO2Uuc2V0VGV4dHVyZTJEQXJyYXkoY3x8ZWwscil9ZnVuY3Rpb24gZmwoYSxjLGUpe3ZhciBnPXRoaXMuY2FjaGUscj1lLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKZ1swXSE9PXImJihhLnVuaWZvcm0xaSh0aGlzLmFkZHIsciksZ1swXT1yKTtlLnNldFRleHR1cmUzRChjfHxnbCxyKX1mdW5jdGlvbiBobChhLGMsZSl7dmFyIGc9dGhpcy5jYWNoZSxyPWUuYWxsb2NhdGVUZXh0dXJlVW5pdCgpO2dbMF0hPT1yJiYoYS51bmlmb3JtMWkodGhpcy5hZGRyLHIpLGdbMF09cik7ZS5zYWZlU2V0VGV4dHVyZUN1YmUoY3x8amoscil9ZnVuY3Rpb24gaWwoYSxjKXt2YXIgZT10aGlzLmNhY2hlO2VbMF0hPT1jJiYoYS51bmlmb3JtMWkodGhpcy5hZGRyLGMpLGVbMF09Yyl9ZnVuY3Rpb24gamwoYSxjKXt2YXIgZT10aGlzLmNhY2hlO3NjKGUsYyl8fChhLnVuaWZvcm0yaXYodGhpcy5hZGRyLGMpLG1jKGUsYykpfWZ1bmN0aW9uIGtsKGEsYyl7dmFyIGU9dGhpcy5jYWNoZTtzYyhlLGMpfHwoYS51bmlmb3JtM2l2KHRoaXMuYWRkcixjKSxtYyhlLGMpKX1mdW5jdGlvbiBsbChhLGMpe3ZhciBlPXRoaXMuY2FjaGU7c2MoZSxjKXx8KGEudW5pZm9ybTRpdih0aGlzLmFkZHIsCmMpLG1jKGUsYykpfWZ1bmN0aW9uIG1sKGEpe3N3aXRjaChhKXtjYXNlIDUxMjY6cmV0dXJuIFdrO2Nhc2UgMzU2NjQ6cmV0dXJuIFhrO2Nhc2UgMzU2NjU6cmV0dXJuIFlrO2Nhc2UgMzU2NjY6cmV0dXJuIFprO2Nhc2UgMzU2NzQ6cmV0dXJuICRrO2Nhc2UgMzU2NzU6cmV0dXJuIGFsO2Nhc2UgMzU2NzY6cmV0dXJuIGJsO2Nhc2UgMzU2Nzg6Y2FzZSAzNjE5ODpyZXR1cm4gY2w7Y2FzZSAzNTY3OTpyZXR1cm4gZmw7Y2FzZSAzNTY4MDpyZXR1cm4gaGw7Y2FzZSAzNjI4OTpyZXR1cm4gZGw7Y2FzZSA1MTI0OmNhc2UgMzU2NzA6cmV0dXJuIGlsO2Nhc2UgMzU2Njc6Y2FzZSAzNTY3MTpyZXR1cm4gamw7Y2FzZSAzNTY2ODpjYXNlIDM1NjcyOnJldHVybiBrbDtjYXNlIDM1NjY5OmNhc2UgMzU2NzM6cmV0dXJuIGxsfX1mdW5jdGlvbiBubChhLGMpe2EudW5pZm9ybTFmdih0aGlzLmFkZHIsYyl9ZnVuY3Rpb24gb2woYSxjKXthLnVuaWZvcm0xaXYodGhpcy5hZGRyLGMpfWZ1bmN0aW9uIHBsKGEsCmMpe2EudW5pZm9ybTJpdih0aGlzLmFkZHIsYyl9ZnVuY3Rpb24gcWwoYSxjKXthLnVuaWZvcm0zaXYodGhpcy5hZGRyLGMpfWZ1bmN0aW9uIHJsKGEsYyl7YS51bmlmb3JtNGl2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiBzbChhLGMpe2M9dGUoYyx0aGlzLnNpemUsMik7YS51bmlmb3JtMmZ2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiB0bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsMyk7YS51bmlmb3JtM2Z2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiB1bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsNCk7YS51bmlmb3JtNGZ2KHRoaXMuYWRkcixjKX1mdW5jdGlvbiB2bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsNCk7YS51bmlmb3JtTWF0cml4MmZ2KHRoaXMuYWRkciwhMSxjKX1mdW5jdGlvbiB3bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsOSk7YS51bmlmb3JtTWF0cml4M2Z2KHRoaXMuYWRkciwhMSxjKX1mdW5jdGlvbiB4bChhLGMpe2M9dGUoYyx0aGlzLnNpemUsMTYpO2EudW5pZm9ybU1hdHJpeDRmdih0aGlzLmFkZHIsCiExLGMpfWZ1bmN0aW9uIHlsKGEsYyxlKXt2YXIgZz1jLmxlbmd0aCxyPWRqKGUsZyk7YS51bmlmb3JtMWl2KHRoaXMuYWRkcixyKTtmb3IoYT0wO2EhPT1nOysrYSllLnNhZmVTZXRUZXh0dXJlMkQoY1thXXx8aWosclthXSl9ZnVuY3Rpb24gemwoYSxjLGUpe3ZhciBnPWMubGVuZ3RoLHI9ZGooZSxnKTthLnVuaWZvcm0xaXYodGhpcy5hZGRyLHIpO2ZvcihhPTA7YSE9PWc7KythKWUuc2FmZVNldFRleHR1cmVDdWJlKGNbYV18fGpqLHJbYV0pfWZ1bmN0aW9uIEFsKGEpe3N3aXRjaChhKXtjYXNlIDUxMjY6cmV0dXJuIG5sO2Nhc2UgMzU2NjQ6cmV0dXJuIHNsO2Nhc2UgMzU2NjU6cmV0dXJuIHRsO2Nhc2UgMzU2NjY6cmV0dXJuIHVsO2Nhc2UgMzU2NzQ6cmV0dXJuIHZsO2Nhc2UgMzU2NzU6cmV0dXJuIHdsO2Nhc2UgMzU2NzY6cmV0dXJuIHhsO2Nhc2UgMzU2Nzg6cmV0dXJuIHlsO2Nhc2UgMzU2ODA6cmV0dXJuIHpsO2Nhc2UgNTEyNDpjYXNlIDM1NjcwOnJldHVybiBvbDtjYXNlIDM1NjY3OmNhc2UgMzU2NzE6cmV0dXJuIHBsOwpjYXNlIDM1NjY4OmNhc2UgMzU2NzI6cmV0dXJuIHFsO2Nhc2UgMzU2Njk6Y2FzZSAzNTY3MzpyZXR1cm4gcmx9fWZ1bmN0aW9uIEJsKGEsYyxlKXt0aGlzLmlkPWE7dGhpcy5hZGRyPWU7dGhpcy5jYWNoZT1bXTt0aGlzLnNldFZhbHVlPW1sKGMudHlwZSl9ZnVuY3Rpb24ga2ooYSxjLGUpe3RoaXMuaWQ9YTt0aGlzLmFkZHI9ZTt0aGlzLmNhY2hlPVtdO3RoaXMuc2l6ZT1jLnNpemU7dGhpcy5zZXRWYWx1ZT1BbChjLnR5cGUpfWZ1bmN0aW9uIGxqKGEpe3RoaXMuaWQ9YTt0aGlzLnNlcT1bXTt0aGlzLm1hcD17fX1mdW5jdGlvbiBtaihhLGMpe2Euc2VxLnB1c2goYyk7YS5tYXBbYy5pZF09Y31mdW5jdGlvbiBDbChhLGMsZSl7dmFyIGc9YS5uYW1lLHI9Zy5sZW5ndGg7Zm9yKExoLmxhc3RJbmRleD0wOzspe3ZhciB2PUxoLmV4ZWMoZyksej1MaC5sYXN0SW5kZXgsRT12WzFdLEY9dlszXTsiXSI9PT12WzJdJiYoRXw9MCk7aWYodm9pZCAwPT09Rnx8IlsiPT09RiYmeisyPT09cil7bWooZSwKdm9pZCAwPT09Rj9uZXcgQmwoRSxhLGMpOm5ldyBraihFLGEsYykpO2JyZWFrfWVsc2Ugdj1lLm1hcFtFXSx2b2lkIDA9PT12JiYodj1uZXcgbGooRSksbWooZSx2KSksZT12fX1mdW5jdGlvbiB1ZChhLGMpe3RoaXMuc2VxPVtdO3RoaXMubWFwPXt9O2Zvcih2YXIgZT1hLmdldFByb2dyYW1QYXJhbWV0ZXIoYywzNTcxOCksZz0wO2c8ZTsrK2cpe3ZhciByPWEuZ2V0QWN0aXZlVW5pZm9ybShjLGcpO0NsKHIsYS5nZXRVbmlmb3JtTG9jYXRpb24oYyxyLm5hbWUpLHRoaXMpfX1mdW5jdGlvbiBuaihhLGMsZSl7Yz1hLmNyZWF0ZVNoYWRlcihjKTthLnNoYWRlclNvdXJjZShjLGUpO2EuY29tcGlsZVNoYWRlcihjKTtyZXR1cm4gY31mdW5jdGlvbiBEbChhKXthPWEuc3BsaXQoIlxuIik7Zm9yKHZhciBjPTA7YzxhLmxlbmd0aDtjKyspYVtjXT1jKzErIjogIithW2NdO3JldHVybiBhLmpvaW4oIlxuIil9ZnVuY3Rpb24gb2ooYSl7c3dpdGNoKGEpe2Nhc2UgM0UzOnJldHVyblsiTGluZWFyIiwKIiggdmFsdWUgKSJdO2Nhc2UgMzAwMTpyZXR1cm5bInNSR0IiLCIoIHZhbHVlICkiXTtjYXNlIDMwMDI6cmV0dXJuWyJSR0JFIiwiKCB2YWx1ZSApIl07Y2FzZSAzMDA0OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDcuMCApIl07Y2FzZSAzMDA1OnJldHVyblsiUkdCTSIsIiggdmFsdWUsIDE2LjAgKSJdO2Nhc2UgMzAwNjpyZXR1cm5bIlJHQkQiLCIoIHZhbHVlLCAyNTYuMCApIl07Y2FzZSAzMDA3OnJldHVyblsiR2FtbWEiLCIoIHZhbHVlLCBmbG9hdCggR0FNTUFfRkFDVE9SICkgKSJdO2Nhc2UgMzAwMzpyZXR1cm5bIkxvZ0x1diIsIiggdmFsdWUgKSJdO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIGVuY29kaW5nOiAiK2EpO319ZnVuY3Rpb24gcGooYSxjLGUpe3ZhciBnPWEuZ2V0U2hhZGVyUGFyYW1ldGVyKGMsMzU3MTMpLHI9YS5nZXRTaGFkZXJJbmZvTG9nKGMpLnRyaW0oKTtyZXR1cm4gZyYmIiI9PT1yPyIiOiJUSFJFRS5XZWJHTFNoYWRlcjogZ2wuZ2V0U2hhZGVySW5mb0xvZygpICIrCmUrIlxuIityK0RsKGEuZ2V0U2hhZGVyU291cmNlKGMpKX1mdW5jdGlvbiB1ZyhhLGMpe2M9b2ooYyk7cmV0dXJuInZlYzQgIithKyIoIHZlYzQgdmFsdWUgKSB7IHJldHVybiAiK2NbMF0rIlRvTGluZWFyIitjWzFdKyI7IH0ifWZ1bmN0aW9uIEVsKGEsYyl7Yz1vaihjKTtyZXR1cm4idmVjNCAiK2ErIiggdmVjNCB2YWx1ZSApIHsgcmV0dXJuIExpbmVhclRvIitjWzBdK2NbMV0rIjsgfSJ9ZnVuY3Rpb24gRmwoYSxjKXtzd2l0Y2goYyl7Y2FzZSAxOmM9IkxpbmVhciI7YnJlYWs7Y2FzZSAyOmM9IlJlaW5oYXJkIjticmVhaztjYXNlIDM6Yz0iVW5jaGFydGVkMiI7YnJlYWs7Y2FzZSA0OmM9Ik9wdGltaXplZENpbmVvbiI7YnJlYWs7Y2FzZSA1OmM9IkFDRVNGaWxtaWMiO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoInVuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiAiK2MpO31yZXR1cm4idmVjMyAiK2ErIiggdmVjMyBjb2xvciApIHsgcmV0dXJuICIrYysiVG9uZU1hcHBpbmcoIGNvbG9yICk7IH0ifQpmdW5jdGlvbiBHbChhLGMsZSl7YT1hfHx7fTtyZXR1cm5bYS5kZXJpdmF0aXZlc3x8Yy5lbnZNYXBDdWJlVVZ8fGMuYnVtcE1hcHx8Yy50YW5nZW50U3BhY2VOb3JtYWxNYXB8fGMuY2xlYXJjb2F0Tm9ybWFsTWFwfHxjLmZsYXRTaGFkaW5nPyIjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZSI6IiIsKGEuZnJhZ0RlcHRofHxjLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIpJiZlLmdldCgiRVhUX2ZyYWdfZGVwdGgiKT8iI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZSI6IiIsYS5kcmF3QnVmZmVycyYmZS5nZXQoIldFQkdMX2RyYXdfYnVmZmVycyIpPyIjZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlIjoiIiwoYS5zaGFkZXJUZXh0dXJlTE9EfHxjLmVudk1hcCkmJmUuZ2V0KCJFWFRfc2hhZGVyX3RleHR1cmVfbG9kIik/IiNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZSI6IiJdLmZpbHRlcih1Zikuam9pbigiXG4iKX0KZnVuY3Rpb24gSGwoYSl7dmFyIGM9W10sZTtmb3IoZSBpbiBhKXt2YXIgZz1hW2VdOyExIT09ZyYmYy5wdXNoKCIjZGVmaW5lICIrZSsiICIrZyl9cmV0dXJuIGMuam9pbigiXG4iKX1mdW5jdGlvbiBJbChhLGMpe2Zvcih2YXIgZT17fSxnPWEuZ2V0UHJvZ3JhbVBhcmFtZXRlcihjLDM1NzIxKSxyPTA7cjxnO3IrKyl7dmFyIHY9YS5nZXRBY3RpdmVBdHRyaWIoYyxyKS5uYW1lO2Vbdl09YS5nZXRBdHRyaWJMb2NhdGlvbihjLHYpfXJldHVybiBlfWZ1bmN0aW9uIHVmKGEpe3JldHVybiIiIT09YX1mdW5jdGlvbiBxaihhLGMpe3JldHVybiBhLnJlcGxhY2UoL05VTV9ESVJfTElHSFRTL2csYy5udW1EaXJMaWdodHMpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUUy9nLGMubnVtU3BvdExpZ2h0cykucmVwbGFjZSgvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZyxjLm51bVJlY3RBcmVhTGlnaHRzKS5yZXBsYWNlKC9OVU1fUE9JTlRfTElHSFRTL2csYy5udW1Qb2ludExpZ2h0cykucmVwbGFjZSgvTlVNX0hFTUlfTElHSFRTL2csCmMubnVtSGVtaUxpZ2h0cykucmVwbGFjZSgvTlVNX0RJUl9MSUdIVF9TSEFET1dTL2csYy5udW1EaXJMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9TUE9UX0xJR0hUX1NIQURPV1MvZyxjLm51bVNwb3RMaWdodFNoYWRvd3MpLnJlcGxhY2UoL05VTV9QT0lOVF9MSUdIVF9TSEFET1dTL2csYy5udW1Qb2ludExpZ2h0U2hhZG93cyl9ZnVuY3Rpb24gcmooYSxjKXtyZXR1cm4gYS5yZXBsYWNlKC9OVU1fQ0xJUFBJTkdfUExBTkVTL2csYy5udW1DbGlwcGluZ1BsYW5lcykucmVwbGFjZSgvVU5JT05fQ0xJUFBJTkdfUExBTkVTL2csYy5udW1DbGlwcGluZ1BsYW5lcy1jLm51bUNsaXBJbnRlcnNlY3Rpb24pfWZ1bmN0aW9uIE1oKGEpe3JldHVybiBhLnJlcGxhY2UoL15bIFx0XSojaW5jbHVkZSArPChbXHdcZC4vXSspPi9nbSxmdW5jdGlvbihjLGUpe2M9cmJbZV07aWYodm9pZCAwPT09Yyl0aHJvdyBFcnJvcigiQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIFx4M2MiK2UrIlx4M2UiKTtyZXR1cm4gTWgoYyl9KX0KZnVuY3Rpb24gc2ooYSl7cmV0dXJuIGEucmVwbGFjZSgvI3ByYWdtYSB1bnJvbGxfbG9vcFtcc10rP2ZvciBcKCBpbnQgaSA9IChcZCspOyBpIDwgKFxkKyk7IGkgXCtcKyBcKSBceyhbXHNcU10rPykoPz1cfSlcfS9nLGZ1bmN0aW9uKGMsZSxnLHIpe2M9IiI7Zm9yKGU9cGFyc2VJbnQoZSk7ZTxwYXJzZUludChnKTtlKyspYys9ci5yZXBsYWNlKC9cWyBpIFxdL2csIlsgIitlKyIgXSIpLnJlcGxhY2UoL1VOUk9MTEVEX0xPT1BfSU5ERVgvZyxlKTtyZXR1cm4gY30pfWZ1bmN0aW9uIEpsKGEsYyxlLGcscix2LHope3ZhciBFPWEuZ2V0Q29udGV4dCgpLEY9Zy5kZWZpbmVzLEo9ci52ZXJ0ZXhTaGFkZXIsUD1yLmZyYWdtZW50U2hhZGVyLFI9IlNIQURPV01BUF9UWVBFX0JBU0lDIjsxPT09di5zaGFkb3dNYXBUeXBlP1I9IlNIQURPV01BUF9UWVBFX1BDRiI6Mj09PXYuc2hhZG93TWFwVHlwZT9SPSJTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCI6Mz09PXYuc2hhZG93TWFwVHlwZSYmKFI9CiJTSEFET1dNQVBfVFlQRV9WU00iKTt2YXIgUz0iRU5WTUFQX1RZUEVfQ1VCRSIsVj0iRU5WTUFQX01PREVfUkVGTEVDVElPTiIsVz0iRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZIjtpZih2LmVudk1hcCl7c3dpdGNoKGcuZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAxOmNhc2UgMzAyOlM9IkVOVk1BUF9UWVBFX0NVQkUiO2JyZWFrO2Nhc2UgMzA2OmNhc2UgMzA3OlM9IkVOVk1BUF9UWVBFX0NVQkVfVVYiO2JyZWFrO2Nhc2UgMzAzOmNhc2UgMzA0OlM9IkVOVk1BUF9UWVBFX0VRVUlSRUMiO2JyZWFrO2Nhc2UgMzA1OlM9IkVOVk1BUF9UWVBFX1NQSEVSRSJ9c3dpdGNoKGcuZW52TWFwLm1hcHBpbmcpe2Nhc2UgMzAyOmNhc2UgMzA0OlY9IkVOVk1BUF9NT0RFX1JFRlJBQ1RJT04ifXN3aXRjaChnLmNvbWJpbmUpe2Nhc2UgMDpXPSJFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFkiO2JyZWFrO2Nhc2UgMTpXPSJFTlZNQVBfQkxFTkRJTkdfTUlYIjticmVhaztjYXNlIDI6Vz0iRU5WTUFQX0JMRU5ESU5HX0FERCJ9fXZhciBoYT0KMDxhLmdhbW1hRmFjdG9yP2EuZ2FtbWFGYWN0b3I6MSxmYT16LmlzV2ViR0wyPyIiOkdsKGcuZXh0ZW5zaW9ucyx2LGMpLHJhPUhsKEYpLHBhPUUuY3JlYXRlUHJvZ3JhbSgpO2cuaXNSYXdTaGFkZXJNYXRlcmlhbD8oRj1bcmFdLmZpbHRlcih1Zikuam9pbigiXG4iKSwwPEYubGVuZ3RoJiYoRis9IlxuIiksYz1bZmEscmFdLmZpbHRlcih1Zikuam9pbigiXG4iKSwwPGMubGVuZ3RoJiYoYys9IlxuIikpOihGPVsicHJlY2lzaW9uICIrdi5wcmVjaXNpb24rIiBmbG9hdDsiLCJwcmVjaXNpb24gIit2LnByZWNpc2lvbisiIGludDsiLCJoaWdocCI9PT12LnByZWNpc2lvbj8iI2RlZmluZSBISUdIX1BSRUNJU0lPTiI6IiIsIiNkZWZpbmUgU0hBREVSX05BTUUgIityLm5hbWUscmEsdi5zdXBwb3J0c1ZlcnRleFRleHR1cmVzPyIjZGVmaW5lIFZFUlRFWF9URVhUVVJFUyI6IiIsIiNkZWZpbmUgR0FNTUFfRkFDVE9SICIraGEsIiNkZWZpbmUgTUFYX0JPTkVTICIrdi5tYXhCb25lcyx2LnVzZUZvZyYmCnYuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHYudXNlRm9nJiZ2LmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLHYubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lICIrVjoiIix2LmxpZ2h0TWFwPyIjZGVmaW5lIFVTRV9MSUdIVE1BUCI6IiIsdi5hb01hcD8iI2RlZmluZSBVU0VfQU9NQVAiOiIiLHYuZW1pc3NpdmVNYXA/IiNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQIjoiIix2LmJ1bXBNYXA/IiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHYubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHYubm9ybWFsTWFwJiZ2Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdi5ub3JtYWxNYXAmJnYudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLHYuY2xlYXJjb2F0Tm9ybWFsTWFwPwoiI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCI6IiIsdi5kaXNwbGFjZW1lbnRNYXAmJnYuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcz8iI2RlZmluZSBVU0VfRElTUExBQ0VNRU5UTUFQIjoiIix2LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdi5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdi5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdi5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHYudmVydGV4VGFuZ2VudHM/IiNkZWZpbmUgVVNFX1RBTkdFTlQiOiIiLHYudmVydGV4Q29sb3JzPyIjZGVmaW5lIFVTRV9DT0xPUiI6IiIsdi52ZXJ0ZXhVdnM/IiNkZWZpbmUgVVNFX1VWIjoiIix2LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix2LnNraW5uaW5nPyIjZGVmaW5lIFVTRV9TS0lOTklORyI6IiIsdi51c2VWZXJ0ZXhUZXh0dXJlPyIjZGVmaW5lIEJPTkVfVEVYVFVSRSI6CiIiLHYubW9ycGhUYXJnZXRzPyIjZGVmaW5lIFVTRV9NT1JQSFRBUkdFVFMiOiIiLHYubW9ycGhOb3JtYWxzJiYhMT09PXYuZmxhdFNoYWRpbmc/IiNkZWZpbmUgVVNFX01PUlBITk9STUFMUyI6IiIsdi5kb3VibGVTaWRlZD8iI2RlZmluZSBET1VCTEVfU0lERUQiOiIiLHYuZmxpcFNpZGVkPyIjZGVmaW5lIEZMSVBfU0lERUQiOiIiLHYuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSBVU0VfU0hBRE9XTUFQIjoiIix2LnNoYWRvd01hcEVuYWJsZWQ/IiNkZWZpbmUgIitSOiIiLHYuc2l6ZUF0dGVudWF0aW9uPyIjZGVmaW5lIFVTRV9TSVpFQVRURU5VQVRJT04iOiIiLHYubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcj8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUYiOiIiLHYubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciYmKHouaXNXZWJHTDJ8fGMuZ2V0KCJFWFRfZnJhZ19kZXB0aCIpKT8iI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUIjoiIiwidW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4OyIsInVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7IiwKInVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4OyIsInVuaWZvcm0gbWF0NCB2aWV3TWF0cml4OyIsInVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7IiwidW5pZm9ybSB2ZWMzIGNhbWVyYVBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uOyIsImF0dHJpYnV0ZSB2ZWMzIG5vcm1hbDsiLCJhdHRyaWJ1dGUgdmVjMiB1djsiLCIjaWZkZWYgVVNFX1RBTkdFTlQiLCJcdGF0dHJpYnV0ZSB2ZWM0IHRhbmdlbnQ7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9DT0xPUiIsIlx0YXR0cmlidXRlIHZlYzMgY29sb3I7IiwiI2VuZGlmIiwiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFMiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MTsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MjsiLCJcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsiLCJcdCNpZmRlZiBVU0VfTU9SUEhOT1JNQUxTIiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMDsiLAoiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwyOyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDM7IiwiXHQjZWxzZSIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDQ7IiwiXHRcdGF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NTsiLCJcdFx0YXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ2OyIsIlx0XHRhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDc7IiwiXHQjZW5kaWYiLCIjZW5kaWYiLCIjaWZkZWYgVVNFX1NLSU5OSU5HIiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7IiwiXHRhdHRyaWJ1dGUgdmVjNCBza2luV2VpZ2h0OyIsIiNlbmRpZiIsIlxuIl0uZmlsdGVyKHVmKS5qb2luKCJcbiIpLGM9W2ZhLCJwcmVjaXNpb24gIit2LnByZWNpc2lvbisiIGZsb2F0OyIsInByZWNpc2lvbiAiK3YucHJlY2lzaW9uKyIgaW50OyIsImhpZ2hwIj09PXYucHJlY2lzaW9uPyIjZGVmaW5lIEhJR0hfUFJFQ0lTSU9OIjoKIiIsIiNkZWZpbmUgU0hBREVSX05BTUUgIityLm5hbWUscmEsdi5hbHBoYVRlc3Q/IiNkZWZpbmUgQUxQSEFURVNUICIrdi5hbHBoYVRlc3QrKHYuYWxwaGFUZXN0JTE/IiI6Ii4wIik6IiIsIiNkZWZpbmUgR0FNTUFfRkFDVE9SICIraGEsdi51c2VGb2cmJnYuZm9nPyIjZGVmaW5lIFVTRV9GT0ciOiIiLHYudXNlRm9nJiZ2LmZvZ0V4cDI/IiNkZWZpbmUgRk9HX0VYUDIiOiIiLHYubWFwPyIjZGVmaW5lIFVTRV9NQVAiOiIiLHYubWF0Y2FwPyIjZGVmaW5lIFVTRV9NQVRDQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lIFVTRV9FTlZNQVAiOiIiLHYuZW52TWFwPyIjZGVmaW5lICIrUzoiIix2LmVudk1hcD8iI2RlZmluZSAiK1Y6IiIsdi5lbnZNYXA/IiNkZWZpbmUgIitXOiIiLHYubGlnaHRNYXA/IiNkZWZpbmUgVVNFX0xJR0hUTUFQIjoiIix2LmFvTWFwPyIjZGVmaW5lIFVTRV9BT01BUCI6IiIsdi5lbWlzc2l2ZU1hcD8iI2RlZmluZSBVU0VfRU1JU1NJVkVNQVAiOiIiLHYuYnVtcE1hcD8KIiNkZWZpbmUgVVNFX0JVTVBNQVAiOiIiLHYubm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9OT1JNQUxNQVAiOiIiLHYubm9ybWFsTWFwJiZ2Lm9iamVjdFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCI6IiIsdi5ub3JtYWxNYXAmJnYudGFuZ2VudFNwYWNlTm9ybWFsTWFwPyIjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAiOiIiLHYuY2xlYXJjb2F0Tm9ybWFsTWFwPyIjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQIjoiIix2LnNwZWN1bGFyTWFwPyIjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCI6IiIsdi5yb3VnaG5lc3NNYXA/IiNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCI6IiIsdi5tZXRhbG5lc3NNYXA/IiNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCI6IiIsdi5hbHBoYU1hcD8iI2RlZmluZSBVU0VfQUxQSEFNQVAiOiIiLHYuc2hlZW4/IiNkZWZpbmUgVVNFX1NIRUVOIjoiIix2LnZlcnRleFRhbmdlbnRzPyIjZGVmaW5lIFVTRV9UQU5HRU5UIjoKIiIsdi52ZXJ0ZXhDb2xvcnM/IiNkZWZpbmUgVVNFX0NPTE9SIjoiIix2LnZlcnRleFV2cz8iI2RlZmluZSBVU0VfVVYiOiIiLHYuZ3JhZGllbnRNYXA/IiNkZWZpbmUgVVNFX0dSQURJRU5UTUFQIjoiIix2LmZsYXRTaGFkaW5nPyIjZGVmaW5lIEZMQVRfU0hBREVEIjoiIix2LmRvdWJsZVNpZGVkPyIjZGVmaW5lIERPVUJMRV9TSURFRCI6IiIsdi5mbGlwU2lkZWQ/IiNkZWZpbmUgRkxJUF9TSURFRCI6IiIsdi5zaGFkb3dNYXBFbmFibGVkPyIjZGVmaW5lIFVTRV9TSEFET1dNQVAiOiIiLHYuc2hhZG93TWFwRW5hYmxlZD8iI2RlZmluZSAiK1I6IiIsdi5wcmVtdWx0aXBsaWVkQWxwaGE/IiNkZWZpbmUgUFJFTVVMVElQTElFRF9BTFBIQSI6IiIsdi5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cz8iI2RlZmluZSBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTIjoiIix2LmxvZ2FyaXRobWljRGVwdGhCdWZmZXI/IiNkZWZpbmUgVVNFX0xPR0RFUFRIQlVGIjoiIix2LmxvZ2FyaXRobWljRGVwdGhCdWZmZXImJgooei5pc1dlYkdMMnx8Yy5nZXQoIkVYVF9mcmFnX2RlcHRoIikpPyIjZGVmaW5lIFVTRV9MT0dERVBUSEJVRl9FWFQiOiIiLChnLmV4dGVuc2lvbnMmJmcuZXh0ZW5zaW9ucy5zaGFkZXJUZXh0dXJlTE9EfHx2LmVudk1hcCkmJih6LmlzV2ViR0wyfHxjLmdldCgiRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCIpKT8iI2RlZmluZSBURVhUVVJFX0xPRF9FWFQiOiIiLCJ1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsiLCJ1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247IiwwIT09di50b25lTWFwcGluZz8iI2RlZmluZSBUT05FX01BUFBJTkciOiIiLDAhPT12LnRvbmVNYXBwaW5nP3JiLnRvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQ6IiIsMCE9PXYudG9uZU1hcHBpbmc/RmwoInRvbmVNYXBwaW5nIix2LnRvbmVNYXBwaW5nKToiIix2LmRpdGhlcmluZz8iI2RlZmluZSBESVRIRVJJTkciOiIiLHYub3V0cHV0RW5jb2Rpbmd8fHYubWFwRW5jb2Rpbmd8fHYubWF0Y2FwRW5jb2Rpbmd8fHYuZW52TWFwRW5jb2Rpbmd8fAp2LmVtaXNzaXZlTWFwRW5jb2Rpbmc/cmIuZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IiIsdi5tYXBFbmNvZGluZz91ZygibWFwVGV4ZWxUb0xpbmVhciIsdi5tYXBFbmNvZGluZyk6IiIsdi5tYXRjYXBFbmNvZGluZz91ZygibWF0Y2FwVGV4ZWxUb0xpbmVhciIsdi5tYXRjYXBFbmNvZGluZyk6IiIsdi5lbnZNYXBFbmNvZGluZz91ZygiZW52TWFwVGV4ZWxUb0xpbmVhciIsdi5lbnZNYXBFbmNvZGluZyk6IiIsdi5lbWlzc2l2ZU1hcEVuY29kaW5nP3VnKCJlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXIiLHYuZW1pc3NpdmVNYXBFbmNvZGluZyk6IiIsdi5vdXRwdXRFbmNvZGluZz9FbCgibGluZWFyVG9PdXRwdXRUZXhlbCIsdi5vdXRwdXRFbmNvZGluZyk6IiIsdi5kZXB0aFBhY2tpbmc/IiNkZWZpbmUgREVQVEhfUEFDS0lORyAiK2cuZGVwdGhQYWNraW5nOiIiLCJcbiJdLmZpbHRlcih1Zikuam9pbigiXG4iKSk7Sj1NaChKKTtKPXFqKEosdik7Sj1yaihKLHYpO1A9TWgoUCk7UD1xaihQLAp2KTtQPXJqKFAsdik7Sj1zaihKKTtQPXNqKFApO3ouaXNXZWJHTDImJiFnLmlzUmF3U2hhZGVyTWF0ZXJpYWwmJih6PSExLFI9L15ccyojdmVyc2lvblxzKzMwMFxzK2VzXHMqXG4vLGcuaXNTaGFkZXJNYXRlcmlhbCYmbnVsbCE9PUoubWF0Y2goUikmJm51bGwhPT1QLm1hdGNoKFIpJiYoej0hMCxKPUoucmVwbGFjZShSLCIiKSxQPVAucmVwbGFjZShSLCIiKSksRj0iI3ZlcnNpb24gMzAwIGVzXG5cbiNkZWZpbmUgYXR0cmlidXRlIGluXG4jZGVmaW5lIHZhcnlpbmcgb3V0XG4jZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlXG4iK0YsYz1bIiN2ZXJzaW9uIDMwMCBlc1xuXG4jZGVmaW5lIHZhcnlpbmcgaW4iLHo/IiI6Im91dCBoaWdocCB2ZWM0IHBjX2ZyYWdDb2xvcjsiLHo/IiI6IiNkZWZpbmUgZ2xfRnJhZ0NvbG9yIHBjX2ZyYWdDb2xvciIsIiNkZWZpbmUgZ2xfRnJhZ0RlcHRoRVhUIGdsX0ZyYWdEZXB0aFxuI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZVxuI2RlZmluZSB0ZXh0dXJlQ3ViZSB0ZXh0dXJlXG4jZGVmaW5lIHRleHR1cmUyRFByb2ogdGV4dHVyZVByb2pcbiNkZWZpbmUgdGV4dHVyZTJETG9kRVhUIHRleHR1cmVMb2RcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakxvZEVYVCB0ZXh0dXJlUHJvakxvZFxuI2RlZmluZSB0ZXh0dXJlQ3ViZUxvZEVYVCB0ZXh0dXJlTG9kXG4jZGVmaW5lIHRleHR1cmUyREdyYWRFWFQgdGV4dHVyZUdyYWRcbiNkZWZpbmUgdGV4dHVyZTJEUHJvakdyYWRFWFQgdGV4dHVyZVByb2pHcmFkXG4jZGVmaW5lIHRleHR1cmVDdWJlR3JhZEVYVCB0ZXh0dXJlR3JhZCJdLmpvaW4oIlxuIikrCiJcbiIrYyk7UD1jK1A7Sj1uaihFLDM1NjMzLEYrSik7UD1uaihFLDM1NjMyLFApO0UuYXR0YWNoU2hhZGVyKHBhLEopO0UuYXR0YWNoU2hhZGVyKHBhLFApO3ZvaWQgMCE9PWcuaW5kZXgwQXR0cmlidXRlTmFtZT9FLmJpbmRBdHRyaWJMb2NhdGlvbihwYSwwLGcuaW5kZXgwQXR0cmlidXRlTmFtZSk6ITA9PT12Lm1vcnBoVGFyZ2V0cyYmRS5iaW5kQXR0cmliTG9jYXRpb24ocGEsMCwicG9zaXRpb24iKTtFLmxpbmtQcm9ncmFtKHBhKTtpZihhLmRlYnVnLmNoZWNrU2hhZGVyRXJyb3JzKXthPUUuZ2V0UHJvZ3JhbUluZm9Mb2cocGEpLnRyaW0oKTt2PUUuZ2V0U2hhZGVySW5mb0xvZyhKKS50cmltKCk7ej1FLmdldFNoYWRlckluZm9Mb2coUCkudHJpbSgpO1M9Uj0hMDtpZighMT09PUUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwYSwzNTcxNCkpUj0hMSxWPXBqKEUsSiwidmVydGV4IiksVz1waihFLFAsImZyYWdtZW50IiksY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xQcm9ncmFtOiBzaGFkZXIgZXJyb3I6ICIsCkUuZ2V0RXJyb3IoKSwiMzU3MTUiLEUuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwYSwzNTcxNSksImdsLmdldFByb2dyYW1JbmZvTG9nIixhLFYsVyk7ZWxzZSBpZigiIiE9PWEpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW06IGdsLmdldFByb2dyYW1JbmZvTG9nKCkiLGEpO2Vsc2UgaWYoIiI9PT12fHwiIj09PXopUz0hMTtTJiYodGhpcy5kaWFnbm9zdGljcz17cnVubmFibGU6UixtYXRlcmlhbDpnLHByb2dyYW1Mb2c6YSx2ZXJ0ZXhTaGFkZXI6e2xvZzp2LHByZWZpeDpGfSxmcmFnbWVudFNoYWRlcjp7bG9nOnoscHJlZml4OmN9fSl9RS5kZWxldGVTaGFkZXIoSik7RS5kZWxldGVTaGFkZXIoUCk7dmFyIHFhO3RoaXMuZ2V0VW5pZm9ybXM9ZnVuY3Rpb24oKXt2b2lkIDA9PT1xYSYmKHFhPW5ldyB1ZChFLHBhKSk7cmV0dXJuIHFhfTt2YXIgdWE7dGhpcy5nZXRBdHRyaWJ1dGVzPWZ1bmN0aW9uKCl7dm9pZCAwPT09dWEmJih1YT1JbChFLHBhKSk7cmV0dXJuIHVhfTt0aGlzLmRlc3Ryb3k9CmZ1bmN0aW9uKCl7RS5kZWxldGVQcm9ncmFtKHBhKTt0aGlzLnByb2dyYW09dm9pZCAwfTt0aGlzLm5hbWU9ci5uYW1lO3RoaXMuaWQ9S2wrKzt0aGlzLmNvZGU9ZTt0aGlzLnVzZWRUaW1lcz0xO3RoaXMucHJvZ3JhbT1wYTt0aGlzLnZlcnRleFNoYWRlcj1KO3RoaXMuZnJhZ21lbnRTaGFkZXI9UDtyZXR1cm4gdGhpc31mdW5jdGlvbiBMbChhLGMsZSl7ZnVuY3Rpb24gZyhGKXtGPUYuc2tlbGV0b24uYm9uZXM7aWYoZS5mbG9hdFZlcnRleFRleHR1cmVzKXJldHVybiAxMDI0O3ZhciBKPU1hdGgubWluKE1hdGguZmxvb3IoKGUubWF4VmVydGV4VW5pZm9ybXMtMjApLzQpLEYubGVuZ3RoKTtyZXR1cm4gSjxGLmxlbmd0aD8oY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBTa2VsZXRvbiBoYXMgIitGLmxlbmd0aCsiIGJvbmVzLiBUaGlzIEdQVSBzdXBwb3J0cyAiK0orIi4iKSwwKTpKfWZ1bmN0aW9uIHIoRixKKXtpZihGKUYuaXNUZXh0dXJlP1A9Ri5lbmNvZGluZzpGLmlzV2ViR0xSZW5kZXJUYXJnZXQmJgooY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFByb2dyYW1zLmdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXA6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksUD1GLnRleHR1cmUuZW5jb2RpbmcpO2Vsc2UgdmFyIFA9M0UzOzNFMz09PVAmJkomJihQPTMwMDcpO3JldHVybiBQfXZhciB2PVtdLHo9e01lc2hEZXB0aE1hdGVyaWFsOiJkZXB0aCIsTWVzaERpc3RhbmNlTWF0ZXJpYWw6ImRpc3RhbmNlUkdCQSIsTWVzaE5vcm1hbE1hdGVyaWFsOiJub3JtYWwiLE1lc2hCYXNpY01hdGVyaWFsOiJiYXNpYyIsTWVzaExhbWJlcnRNYXRlcmlhbDoibGFtYmVydCIsTWVzaFBob25nTWF0ZXJpYWw6InBob25nIixNZXNoVG9vbk1hdGVyaWFsOiJwaG9uZyIsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6InBoeXNpY2FsIixNZXNoUGh5c2ljYWxNYXRlcmlhbDoicGh5c2ljYWwiLE1lc2hNYXRjYXBNYXRlcmlhbDoibWF0Y2FwIiwKTGluZUJhc2ljTWF0ZXJpYWw6ImJhc2ljIixMaW5lRGFzaGVkTWF0ZXJpYWw6ImRhc2hlZCIsUG9pbnRzTWF0ZXJpYWw6InBvaW50cyIsU2hhZG93TWF0ZXJpYWw6InNoYWRvdyIsU3ByaXRlTWF0ZXJpYWw6InNwcml0ZSJ9LEU9InByZWNpc2lvbiBzdXBwb3J0c1ZlcnRleFRleHR1cmVzIG1hcCBtYXBFbmNvZGluZyBtYXRjYXAgbWF0Y2FwRW5jb2RpbmcgZW52TWFwIGVudk1hcE1vZGUgZW52TWFwRW5jb2RpbmcgbGlnaHRNYXAgYW9NYXAgZW1pc3NpdmVNYXAgZW1pc3NpdmVNYXBFbmNvZGluZyBidW1wTWFwIG5vcm1hbE1hcCBvYmplY3RTcGFjZU5vcm1hbE1hcCB0YW5nZW50U3BhY2VOb3JtYWxNYXAgY2xlYXJjb2F0Tm9ybWFsTWFwIGRpc3BsYWNlbWVudE1hcCBzcGVjdWxhck1hcCByb3VnaG5lc3NNYXAgbWV0YWxuZXNzTWFwIGdyYWRpZW50TWFwIGFscGhhTWFwIGNvbWJpbmUgdmVydGV4Q29sb3JzIHZlcnRleFRhbmdlbnRzIGZvZyB1c2VGb2cgZm9nRXhwMiBmbGF0U2hhZGluZyBzaXplQXR0ZW51YXRpb24gbG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciBza2lubmluZyBtYXhCb25lcyB1c2VWZXJ0ZXhUZXh0dXJlIG1vcnBoVGFyZ2V0cyBtb3JwaE5vcm1hbHMgbWF4TW9ycGhUYXJnZXRzIG1heE1vcnBoTm9ybWFscyBwcmVtdWx0aXBsaWVkQWxwaGEgbnVtRGlyTGlnaHRzIG51bVBvaW50TGlnaHRzIG51bVNwb3RMaWdodHMgbnVtSGVtaUxpZ2h0cyBudW1SZWN0QXJlYUxpZ2h0cyBzaGFkb3dNYXBFbmFibGVkIHNoYWRvd01hcFR5cGUgdG9uZU1hcHBpbmcgcGh5c2ljYWxseUNvcnJlY3RMaWdodHMgYWxwaGFUZXN0IGRvdWJsZVNpZGVkIGZsaXBTaWRlZCBudW1DbGlwcGluZ1BsYW5lcyBudW1DbGlwSW50ZXJzZWN0aW9uIGRlcHRoUGFja2luZyBkaXRoZXJpbmcgc2hlZW4iLnNwbGl0KCIgIik7CnRoaXMuZ2V0UGFyYW1ldGVycz1mdW5jdGlvbihGLEosUCxSLFMsVixXKXt2YXIgaGE9eltGLnR5cGVdLGZhPVcuaXNTa2lubmVkTWVzaD9nKFcpOjAscmE9ZS5wcmVjaXNpb247bnVsbCE9PUYucHJlY2lzaW9uJiYocmE9ZS5nZXRNYXhQcmVjaXNpb24oRi5wcmVjaXNpb24pLHJhIT09Ri5wcmVjaXNpb24mJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xQcm9ncmFtLmdldFBhcmFtZXRlcnM6IixGLnByZWNpc2lvbiwibm90IHN1cHBvcnRlZCwgdXNpbmciLHJhLCJpbnN0ZWFkLiIpKTt2YXIgcGE9YS5nZXRSZW5kZXJUYXJnZXQoKTtyZXR1cm57c2hhZGVySUQ6aGEscHJlY2lzaW9uOnJhLHN1cHBvcnRzVmVydGV4VGV4dHVyZXM6ZS52ZXJ0ZXhUZXh0dXJlcyxvdXRwdXRFbmNvZGluZzpyKHBhP3BhLnRleHR1cmU6bnVsbCxhLmdhbW1hT3V0cHV0KSxtYXA6ISFGLm1hcCxtYXBFbmNvZGluZzpyKEYubWFwLGEuZ2FtbWFJbnB1dCksbWF0Y2FwOiEhRi5tYXRjYXAsbWF0Y2FwRW5jb2Rpbmc6cihGLm1hdGNhcCwKYS5nYW1tYUlucHV0KSxlbnZNYXA6ISFGLmVudk1hcCxlbnZNYXBNb2RlOkYuZW52TWFwJiZGLmVudk1hcC5tYXBwaW5nLGVudk1hcEVuY29kaW5nOnIoRi5lbnZNYXAsYS5nYW1tYUlucHV0KSxlbnZNYXBDdWJlVVY6ISFGLmVudk1hcCYmKDMwNj09PUYuZW52TWFwLm1hcHBpbmd8fDMwNz09PUYuZW52TWFwLm1hcHBpbmcpLGxpZ2h0TWFwOiEhRi5saWdodE1hcCxhb01hcDohIUYuYW9NYXAsZW1pc3NpdmVNYXA6ISFGLmVtaXNzaXZlTWFwLGVtaXNzaXZlTWFwRW5jb2Rpbmc6cihGLmVtaXNzaXZlTWFwLGEuZ2FtbWFJbnB1dCksYnVtcE1hcDohIUYuYnVtcE1hcCxub3JtYWxNYXA6ISFGLm5vcm1hbE1hcCxvYmplY3RTcGFjZU5vcm1hbE1hcDoxPT09Ri5ub3JtYWxNYXBUeXBlLHRhbmdlbnRTcGFjZU5vcm1hbE1hcDowPT09Ri5ub3JtYWxNYXBUeXBlLGNsZWFyY29hdE5vcm1hbE1hcDohIUYuY2xlYXJjb2F0Tm9ybWFsTWFwLGRpc3BsYWNlbWVudE1hcDohIUYuZGlzcGxhY2VtZW50TWFwLApyb3VnaG5lc3NNYXA6ISFGLnJvdWdobmVzc01hcCxtZXRhbG5lc3NNYXA6ISFGLm1ldGFsbmVzc01hcCxzcGVjdWxhck1hcDohIUYuc3BlY3VsYXJNYXAsYWxwaGFNYXA6ISFGLmFscGhhTWFwLGdyYWRpZW50TWFwOiEhRi5ncmFkaWVudE1hcCxzaGVlbjohIUYuc2hlZW4sY29tYmluZTpGLmNvbWJpbmUsdmVydGV4VGFuZ2VudHM6Ri5ub3JtYWxNYXAmJkYudmVydGV4VGFuZ2VudHMsdmVydGV4Q29sb3JzOkYudmVydGV4Q29sb3JzLHZlcnRleFV2czohIUYubWFwfHwhIUYuYnVtcE1hcHx8ISFGLm5vcm1hbE1hcHx8ISFGLnNwZWN1bGFyTWFwfHwhIUYuYWxwaGFNYXB8fCEhRi5lbWlzc2l2ZU1hcHx8ISFGLnJvdWdobmVzc01hcHx8ISFGLm1ldGFsbmVzc01hcHx8ISFGLmNsZWFyY29hdE5vcm1hbE1hcCxmb2c6ISFSLHVzZUZvZzpGLmZvZyxmb2dFeHAyOlImJlIuaXNGb2dFeHAyLGZsYXRTaGFkaW5nOkYuZmxhdFNoYWRpbmcsc2l6ZUF0dGVudWF0aW9uOkYuc2l6ZUF0dGVudWF0aW9uLApsb2dhcml0aG1pY0RlcHRoQnVmZmVyOmUubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlcixza2lubmluZzpGLnNraW5uaW5nJiYwPGZhLG1heEJvbmVzOmZhLHVzZVZlcnRleFRleHR1cmU6ZS5mbG9hdFZlcnRleFRleHR1cmVzLG1vcnBoVGFyZ2V0czpGLm1vcnBoVGFyZ2V0cyxtb3JwaE5vcm1hbHM6Ri5tb3JwaE5vcm1hbHMsbWF4TW9ycGhUYXJnZXRzOmEubWF4TW9ycGhUYXJnZXRzLG1heE1vcnBoTm9ybWFsczphLm1heE1vcnBoTm9ybWFscyxudW1EaXJMaWdodHM6Si5kaXJlY3Rpb25hbC5sZW5ndGgsbnVtUG9pbnRMaWdodHM6Si5wb2ludC5sZW5ndGgsbnVtU3BvdExpZ2h0czpKLnNwb3QubGVuZ3RoLG51bVJlY3RBcmVhTGlnaHRzOkoucmVjdEFyZWEubGVuZ3RoLG51bUhlbWlMaWdodHM6Si5oZW1pLmxlbmd0aCxudW1EaXJMaWdodFNoYWRvd3M6Si5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGgsbnVtUG9pbnRMaWdodFNoYWRvd3M6Si5wb2ludFNoYWRvd01hcC5sZW5ndGgsbnVtU3BvdExpZ2h0U2hhZG93czpKLnNwb3RTaGFkb3dNYXAubGVuZ3RoLApudW1DbGlwcGluZ1BsYW5lczpTLG51bUNsaXBJbnRlcnNlY3Rpb246VixkaXRoZXJpbmc6Ri5kaXRoZXJpbmcsc2hhZG93TWFwRW5hYmxlZDphLnNoYWRvd01hcC5lbmFibGVkJiZXLnJlY2VpdmVTaGFkb3cmJjA8UC5sZW5ndGgsc2hhZG93TWFwVHlwZTphLnNoYWRvd01hcC50eXBlLHRvbmVNYXBwaW5nOkYudG9uZU1hcHBlZD9hLnRvbmVNYXBwaW5nOjAscGh5c2ljYWxseUNvcnJlY3RMaWdodHM6YS5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cyxwcmVtdWx0aXBsaWVkQWxwaGE6Ri5wcmVtdWx0aXBsaWVkQWxwaGEsYWxwaGFUZXN0OkYuYWxwaGFUZXN0LGRvdWJsZVNpZGVkOjI9PT1GLnNpZGUsZmxpcFNpZGVkOjE9PT1GLnNpZGUsZGVwdGhQYWNraW5nOnZvaWQgMCE9PUYuZGVwdGhQYWNraW5nP0YuZGVwdGhQYWNraW5nOiExfX07dGhpcy5nZXRQcm9ncmFtQ29kZT1mdW5jdGlvbihGLEope3ZhciBQPVtdO0ouc2hhZGVySUQ/UC5wdXNoKEouc2hhZGVySUQpOihQLnB1c2goRi5mcmFnbWVudFNoYWRlciksClAucHVzaChGLnZlcnRleFNoYWRlcikpO2lmKHZvaWQgMCE9PUYuZGVmaW5lcylmb3IodmFyIFIgaW4gRi5kZWZpbmVzKVAucHVzaChSKSxQLnB1c2goRi5kZWZpbmVzW1JdKTtmb3IoUj0wO1I8RS5sZW5ndGg7UisrKVAucHVzaChKW0VbUl1dKTtQLnB1c2goRi5vbkJlZm9yZUNvbXBpbGUudG9TdHJpbmcoKSk7UC5wdXNoKGEuZ2FtbWFPdXRwdXQpO1AucHVzaChhLmdhbW1hRmFjdG9yKTtyZXR1cm4gUC5qb2luKCl9O3RoaXMuYWNxdWlyZVByb2dyYW09ZnVuY3Rpb24oRixKLFAsUil7Zm9yKHZhciBTLFY9MCxXPXYubGVuZ3RoO1Y8VztWKyspe3ZhciBoYT12W1ZdO2lmKGhhLmNvZGU9PT1SKXtTPWhhOysrUy51c2VkVGltZXM7YnJlYWt9fXZvaWQgMD09PVMmJihTPW5ldyBKbChhLGMsUixGLEosUCxlKSx2LnB1c2goUykpO3JldHVybiBTfTt0aGlzLnJlbGVhc2VQcm9ncmFtPWZ1bmN0aW9uKEYpezA9PT0tLUYudXNlZFRpbWVzJiYodlt2LmluZGV4T2YoRildPXZbdi5sZW5ndGgtMV0sCnYucG9wKCksRi5kZXN0cm95KCkpfTt0aGlzLnByb2dyYW1zPXZ9ZnVuY3Rpb24gTWwoKXt2YXIgYT1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGMpe3ZhciBlPWEuZ2V0KGMpO3ZvaWQgMD09PWUmJihlPXt9LGEuc2V0KGMsZSkpO3JldHVybiBlfSxyZW1vdmU6ZnVuY3Rpb24oYyl7YS5kZWxldGUoYyl9LHVwZGF0ZTpmdW5jdGlvbihjLGUsZyl7YS5nZXQoYylbZV09Z30sZGlzcG9zZTpmdW5jdGlvbigpe2E9bmV3IFdlYWtNYXB9fX1mdW5jdGlvbiBObChhLGMpe3JldHVybiBhLmdyb3VwT3JkZXIhPT1jLmdyb3VwT3JkZXI/YS5ncm91cE9yZGVyLWMuZ3JvdXBPcmRlcjphLnJlbmRlck9yZGVyIT09Yy5yZW5kZXJPcmRlcj9hLnJlbmRlck9yZGVyLWMucmVuZGVyT3JkZXI6YS5wcm9ncmFtIT09Yy5wcm9ncmFtP2EucHJvZ3JhbS5pZC1jLnByb2dyYW0uaWQ6YS5tYXRlcmlhbC5pZCE9PWMubWF0ZXJpYWwuaWQ/YS5tYXRlcmlhbC5pZC1jLm1hdGVyaWFsLmlkOmEueiE9PQpjLno/YS56LWMuejphLmlkLWMuaWR9ZnVuY3Rpb24gT2woYSxjKXtyZXR1cm4gYS5ncm91cE9yZGVyIT09Yy5ncm91cE9yZGVyP2EuZ3JvdXBPcmRlci1jLmdyb3VwT3JkZXI6YS5yZW5kZXJPcmRlciE9PWMucmVuZGVyT3JkZXI/YS5yZW5kZXJPcmRlci1jLnJlbmRlck9yZGVyOmEueiE9PWMuej9jLnotYS56OmEuaWQtYy5pZH1mdW5jdGlvbiB0aigpe2Z1bmN0aW9uIGEoeixFLEYsSixQLFIpe3ZhciBTPWNbZV07dm9pZCAwPT09Uz8oUz17aWQ6ei5pZCxvYmplY3Q6eixnZW9tZXRyeTpFLG1hdGVyaWFsOkYscHJvZ3JhbTpGLnByb2dyYW18fHYsZ3JvdXBPcmRlcjpKLHJlbmRlck9yZGVyOnoucmVuZGVyT3JkZXIsejpQLGdyb3VwOlJ9LGNbZV09Uyk6KFMuaWQ9ei5pZCxTLm9iamVjdD16LFMuZ2VvbWV0cnk9RSxTLm1hdGVyaWFsPUYsUy5wcm9ncmFtPUYucHJvZ3JhbXx8dixTLmdyb3VwT3JkZXI9SixTLnJlbmRlck9yZGVyPXoucmVuZGVyT3JkZXIsUy56PVAsUy5ncm91cD1SKTsKZSsrO3JldHVybiBTfXZhciBjPVtdLGU9MCxnPVtdLHI9W10sdj17aWQ6LTF9O3JldHVybntvcGFxdWU6Zyx0cmFuc3BhcmVudDpyLGluaXQ6ZnVuY3Rpb24oKXtlPTA7Zy5sZW5ndGg9MDtyLmxlbmd0aD0wfSxwdXNoOmZ1bmN0aW9uKHosRSxGLEosUCxSKXt6PWEoeixFLEYsSixQLFIpOyghMD09PUYudHJhbnNwYXJlbnQ/cjpnKS5wdXNoKHopfSx1bnNoaWZ0OmZ1bmN0aW9uKHosRSxGLEosUCxSKXt6PWEoeixFLEYsSixQLFIpOyghMD09PUYudHJhbnNwYXJlbnQ/cjpnKS51bnNoaWZ0KHopfSxzb3J0OmZ1bmN0aW9uKCl7MTxnLmxlbmd0aCYmZy5zb3J0KE5sKTsxPHIubGVuZ3RoJiZyLnNvcnQoT2wpfX19ZnVuY3Rpb24gUGwoKXtmdW5jdGlvbiBhKGUpe2U9ZS50YXJnZXQ7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixhKTtjLmRlbGV0ZShlKX12YXIgYz1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUsZyl7dmFyIHI9Yy5nZXQoZSk7aWYodm9pZCAwPT09CnIpe3ZhciB2PW5ldyB0ajtjLnNldChlLG5ldyBXZWFrTWFwKTtjLmdldChlKS5zZXQoZyx2KTtlLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGEpfWVsc2Ugdj1yLmdldChnKSx2b2lkIDA9PT12JiYodj1uZXcgdGosci5zZXQoZyx2KSk7cmV0dXJuIHZ9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtjPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gUWwoKXt2YXIgYT17fTtyZXR1cm57Z2V0OmZ1bmN0aW9uKGMpe2lmKHZvaWQgMCE9PWFbYy5pZF0pcmV0dXJuIGFbYy5pZF07c3dpdGNoKGMudHlwZSl7Y2FzZSAiRGlyZWN0aW9uYWxMaWdodCI6dmFyIGU9e2RpcmVjdGlvbjpuZXcgayxjb2xvcjpuZXcgSSxzaGFkb3c6ITEsc2hhZG93QmlhczowLHNoYWRvd1JhZGl1czoxLHNoYWRvd01hcFNpemU6bmV3IGZ9O2JyZWFrO2Nhc2UgIlNwb3RMaWdodCI6ZT17cG9zaXRpb246bmV3IGssZGlyZWN0aW9uOm5ldyBrLGNvbG9yOm5ldyBJLGRpc3RhbmNlOjAsY29uZUNvczowLHBlbnVtYnJhQ29zOjAsZGVjYXk6MCwKc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBmfTticmVhaztjYXNlICJQb2ludExpZ2h0IjplPXtwb3NpdGlvbjpuZXcgayxjb2xvcjpuZXcgSSxkaXN0YW5jZTowLGRlY2F5OjAsc2hhZG93OiExLHNoYWRvd0JpYXM6MCxzaGFkb3dSYWRpdXM6MSxzaGFkb3dNYXBTaXplOm5ldyBmLHNoYWRvd0NhbWVyYU5lYXI6MSxzaGFkb3dDYW1lcmFGYXI6MUUzfTticmVhaztjYXNlICJIZW1pc3BoZXJlTGlnaHQiOmU9e2RpcmVjdGlvbjpuZXcgayxza3lDb2xvcjpuZXcgSSxncm91bmRDb2xvcjpuZXcgSX07YnJlYWs7Y2FzZSAiUmVjdEFyZWFMaWdodCI6ZT17Y29sb3I6bmV3IEkscG9zaXRpb246bmV3IGssaGFsZldpZHRoOm5ldyBrLGhhbGZIZWlnaHQ6bmV3IGt9fXJldHVybiBhW2MuaWRdPWV9fX1mdW5jdGlvbiBSbChhLGMpe3JldHVybihjLmNhc3RTaGFkb3c/MTowKS0oYS5jYXN0U2hhZG93PzE6MCl9ZnVuY3Rpb24gU2woKXtmb3IodmFyIGE9Cm5ldyBRbCxjPXt2ZXJzaW9uOjAsaGFzaDp7ZGlyZWN0aW9uYWxMZW5ndGg6LTEscG9pbnRMZW5ndGg6LTEsc3BvdExlbmd0aDotMSxyZWN0QXJlYUxlbmd0aDotMSxoZW1pTGVuZ3RoOi0xLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGFtYmllbnQ6WzAsMCwwXSxwcm9iZTpbXSxkaXJlY3Rpb25hbDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hcDpbXSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDpbXSxzcG90OltdLHNwb3RTaGFkb3dNYXA6W10sc3BvdFNoYWRvd01hdHJpeDpbXSxyZWN0QXJlYTpbXSxwb2ludDpbXSxwb2ludFNoYWRvd01hcDpbXSxwb2ludFNoYWRvd01hdHJpeDpbXSxoZW1pOltdLG51bURpcmVjdGlvbmFsU2hhZG93czotMSxudW1Qb2ludFNoYWRvd3M6LTEsbnVtU3BvdFNoYWRvd3M6LTF9LGU9MDs5PmU7ZSsrKWMucHJvYmUucHVzaChuZXcgayk7dmFyIGc9bmV3IGsscj1uZXcgcSx2PW5ldyBxO3JldHVybntzZXR1cDpmdW5jdGlvbih6LApFLEYpe2Zvcih2YXIgSj0wLFA9MCxSPTAsUz0wOzk+UztTKyspYy5wcm9iZVtTXS5zZXQoMCwwLDApO3ZhciBWPUU9MCxXPTAsaGE9MCxmYT0wLHJhPTAscGE9MCxxYT0wO0Y9Ri5tYXRyaXhXb3JsZEludmVyc2U7ei5zb3J0KFJsKTtTPTA7Zm9yKHZhciB1YT16Lmxlbmd0aDtTPHVhO1MrKyl7dmFyIG9hPXpbU10sdGE9b2EuY29sb3IsQmE9b2EuaW50ZW5zaXR5LFRhPW9hLmRpc3RhbmNlLFVhPW9hLnNoYWRvdyYmb2Euc2hhZG93Lm1hcD9vYS5zaGFkb3cubWFwLnRleHR1cmU6bnVsbDtpZihvYS5pc0FtYmllbnRMaWdodClKKz10YS5yKkJhLFArPXRhLmcqQmEsUis9dGEuYipCYTtlbHNlIGlmKG9hLmlzTGlnaHRQcm9iZSlmb3IoVWE9MDs5PlVhO1VhKyspYy5wcm9iZVtVYV0uYWRkU2NhbGVkVmVjdG9yKG9hLnNoLmNvZWZmaWNpZW50c1tVYV0sQmEpO2Vsc2UgaWYob2EuaXNEaXJlY3Rpb25hbExpZ2h0KXt2YXIgQ2E9YS5nZXQob2EpO0NhLmNvbG9yLmNvcHkob2EuY29sb3IpLm11bHRpcGx5U2NhbGFyKG9hLmludGVuc2l0eSk7CkNhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EubWF0cml4V29ybGQpO2cuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG9hLnRhcmdldC5tYXRyaXhXb3JsZCk7Q2EuZGlyZWN0aW9uLnN1YihnKTtDYS5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKEYpO2lmKENhLnNoYWRvdz1vYS5jYXN0U2hhZG93KUJhPW9hLnNoYWRvdyxDYS5zaGFkb3dCaWFzPUJhLmJpYXMsQ2Euc2hhZG93UmFkaXVzPUJhLnJhZGl1cyxDYS5zaGFkb3dNYXBTaXplPUJhLm1hcFNpemUsYy5kaXJlY3Rpb25hbFNoYWRvd01hcFtFXT1VYSxjLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4W0VdPW9hLnNoYWRvdy5tYXRyaXgscmErKztjLmRpcmVjdGlvbmFsW0VdPUNhO0UrK31lbHNlIGlmKG9hLmlzU3BvdExpZ2h0KXtDYT1hLmdldChvYSk7Q2EucG9zaXRpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG9hLm1hdHJpeFdvcmxkKTtDYS5wb3NpdGlvbi5hcHBseU1hdHJpeDQoRik7Q2EuY29sb3IuY29weSh0YSkubXVsdGlwbHlTY2FsYXIoQmEpOwpDYS5kaXN0YW5jZT1UYTtDYS5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKG9hLm1hdHJpeFdvcmxkKTtnLnNldEZyb21NYXRyaXhQb3NpdGlvbihvYS50YXJnZXQubWF0cml4V29ybGQpO0NhLmRpcmVjdGlvbi5zdWIoZyk7Q2EuZGlyZWN0aW9uLnRyYW5zZm9ybURpcmVjdGlvbihGKTtDYS5jb25lQ29zPU1hdGguY29zKG9hLmFuZ2xlKTtDYS5wZW51bWJyYUNvcz1NYXRoLmNvcyhvYS5hbmdsZSooMS1vYS5wZW51bWJyYSkpO0NhLmRlY2F5PW9hLmRlY2F5O2lmKENhLnNoYWRvdz1vYS5jYXN0U2hhZG93KUJhPW9hLnNoYWRvdyxDYS5zaGFkb3dCaWFzPUJhLmJpYXMsQ2Euc2hhZG93UmFkaXVzPUJhLnJhZGl1cyxDYS5zaGFkb3dNYXBTaXplPUJhLm1hcFNpemUsYy5zcG90U2hhZG93TWFwW1ddPVVhLGMuc3BvdFNoYWRvd01hdHJpeFtXXT1vYS5zaGFkb3cubWF0cml4LHFhKys7Yy5zcG90W1ddPUNhO1crK31lbHNlIGlmKG9hLmlzUmVjdEFyZWFMaWdodClDYT1hLmdldChvYSksCkNhLmNvbG9yLmNvcHkodGEpLm11bHRpcGx5U2NhbGFyKEJhKSxDYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EubWF0cml4V29ybGQpLENhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChGKSx2LmlkZW50aXR5KCksci5jb3B5KG9hLm1hdHJpeFdvcmxkKSxyLnByZW11bHRpcGx5KEYpLHYuZXh0cmFjdFJvdGF0aW9uKHIpLENhLmhhbGZXaWR0aC5zZXQoLjUqb2Eud2lkdGgsMCwwKSxDYS5oYWxmSGVpZ2h0LnNldCgwLC41Km9hLmhlaWdodCwwKSxDYS5oYWxmV2lkdGguYXBwbHlNYXRyaXg0KHYpLENhLmhhbGZIZWlnaHQuYXBwbHlNYXRyaXg0KHYpLGMucmVjdEFyZWFbaGFdPUNhLGhhKys7ZWxzZSBpZihvYS5pc1BvaW50TGlnaHQpe0NhPWEuZ2V0KG9hKTtDYS5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EubWF0cml4V29ybGQpO0NhLnBvc2l0aW9uLmFwcGx5TWF0cml4NChGKTtDYS5jb2xvci5jb3B5KG9hLmNvbG9yKS5tdWx0aXBseVNjYWxhcihvYS5pbnRlbnNpdHkpOwpDYS5kaXN0YW5jZT1vYS5kaXN0YW5jZTtDYS5kZWNheT1vYS5kZWNheTtpZihDYS5zaGFkb3c9b2EuY2FzdFNoYWRvdylCYT1vYS5zaGFkb3csQ2Euc2hhZG93Qmlhcz1CYS5iaWFzLENhLnNoYWRvd1JhZGl1cz1CYS5yYWRpdXMsQ2Euc2hhZG93TWFwU2l6ZT1CYS5tYXBTaXplLENhLnNoYWRvd0NhbWVyYU5lYXI9QmEuY2FtZXJhLm5lYXIsQ2Euc2hhZG93Q2FtZXJhRmFyPUJhLmNhbWVyYS5mYXIsYy5wb2ludFNoYWRvd01hcFtWXT1VYSxjLnBvaW50U2hhZG93TWF0cml4W1ZdPW9hLnNoYWRvdy5tYXRyaXgscGErKztjLnBvaW50W1ZdPUNhO1YrK31lbHNlIG9hLmlzSGVtaXNwaGVyZUxpZ2h0JiYoQ2E9YS5nZXQob2EpLENhLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24ob2EubWF0cml4V29ybGQpLENhLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oRiksQ2EuZGlyZWN0aW9uLm5vcm1hbGl6ZSgpLENhLnNreUNvbG9yLmNvcHkob2EuY29sb3IpLm11bHRpcGx5U2NhbGFyKEJhKSwKQ2EuZ3JvdW5kQ29sb3IuY29weShvYS5ncm91bmRDb2xvcikubXVsdGlwbHlTY2FsYXIoQmEpLGMuaGVtaVtmYV09Q2EsZmErKyl9Yy5hbWJpZW50WzBdPUo7Yy5hbWJpZW50WzFdPVA7Yy5hbWJpZW50WzJdPVI7ej1jLmhhc2g7aWYoei5kaXJlY3Rpb25hbExlbmd0aCE9PUV8fHoucG9pbnRMZW5ndGghPT1WfHx6LnNwb3RMZW5ndGghPT1XfHx6LnJlY3RBcmVhTGVuZ3RoIT09aGF8fHouaGVtaUxlbmd0aCE9PWZhfHx6Lm51bURpcmVjdGlvbmFsU2hhZG93cyE9PXJhfHx6Lm51bVBvaW50U2hhZG93cyE9PXBhfHx6Lm51bVNwb3RTaGFkb3dzIT09cWEpYy5kaXJlY3Rpb25hbC5sZW5ndGg9RSxjLnNwb3QubGVuZ3RoPVcsYy5yZWN0QXJlYS5sZW5ndGg9aGEsYy5wb2ludC5sZW5ndGg9VixjLmhlbWkubGVuZ3RoPWZhLGMuZGlyZWN0aW9uYWxTaGFkb3dNYXAubGVuZ3RoPXJhLGMucG9pbnRTaGFkb3dNYXAubGVuZ3RoPXBhLGMuc3BvdFNoYWRvd01hcC5sZW5ndGg9cWEsYy5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGg9CnJhLGMucG9pbnRTaGFkb3dNYXRyaXgubGVuZ3RoPXBhLGMuc3BvdFNoYWRvd01hdHJpeC5sZW5ndGg9cWEsei5kaXJlY3Rpb25hbExlbmd0aD1FLHoucG9pbnRMZW5ndGg9Vix6LnNwb3RMZW5ndGg9Vyx6LnJlY3RBcmVhTGVuZ3RoPWhhLHouaGVtaUxlbmd0aD1mYSx6Lm51bURpcmVjdGlvbmFsU2hhZG93cz1yYSx6Lm51bVBvaW50U2hhZG93cz1wYSx6Lm51bVNwb3RTaGFkb3dzPXFhLGMudmVyc2lvbj1UbCsrfSxzdGF0ZTpjfX1mdW5jdGlvbiB1aigpe3ZhciBhPW5ldyBTbCxjPVtdLGU9W107cmV0dXJue2luaXQ6ZnVuY3Rpb24oKXtjLmxlbmd0aD0wO2UubGVuZ3RoPTB9LHN0YXRlOntsaWdodHNBcnJheTpjLHNoYWRvd3NBcnJheTplLGxpZ2h0czphfSxzZXR1cExpZ2h0czpmdW5jdGlvbihnKXthLnNldHVwKGMsZSxnKX0scHVzaExpZ2h0OmZ1bmN0aW9uKGcpe2MucHVzaChnKX0scHVzaFNoYWRvdzpmdW5jdGlvbihnKXtlLnB1c2goZyl9fX1mdW5jdGlvbiBVbCgpe2Z1bmN0aW9uIGEoZSl7ZT0KZS50YXJnZXQ7ZS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIixhKTtjLmRlbGV0ZShlKX12YXIgYz1uZXcgV2Vha01hcDtyZXR1cm57Z2V0OmZ1bmN0aW9uKGUsZyl7aWYoITE9PT1jLmhhcyhlKSl7dmFyIHI9bmV3IHVqO2Muc2V0KGUsbmV3IFdlYWtNYXApO2MuZ2V0KGUpLnNldChnLHIpO2UuYWRkRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsYSl9ZWxzZSExPT09Yy5nZXQoZSkuaGFzKGcpPyhyPW5ldyB1aixjLmdldChlKS5zZXQoZyxyKSk6cj1jLmdldChlKS5nZXQoZyk7cmV0dXJuIHJ9LGRpc3Bvc2U6ZnVuY3Rpb24oKXtjPW5ldyBXZWFrTWFwfX19ZnVuY3Rpb24gdmQoYSl7TS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTWVzaERlcHRoTWF0ZXJpYWwiO3RoaXMuZGVwdGhQYWNraW5nPTMyMDA7dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLmRpc3BsYWNlbWVudE1hcD10aGlzLmFscGhhTWFwPXRoaXMubWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0KMTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIHdkKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hEaXN0YW5jZU1hdGVyaWFsIjt0aGlzLnJlZmVyZW5jZVBvc2l0aW9uPW5ldyBrO3RoaXMubmVhckRpc3RhbmNlPTE7dGhpcy5mYXJEaXN0YW5jZT0xRTM7dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLmRpc3BsYWNlbWVudE1hcD10aGlzLmFscGhhTWFwPXRoaXMubWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz0wO3RoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIHZqKGEsYyxlKXtmdW5jdGlvbiBnKHRhLEJhKXt2YXIgVGE9Yy51cGRhdGUocmEpO1cudW5pZm9ybXMuc2hhZG93X3Bhc3MudmFsdWU9CnRhLm1hcC50ZXh0dXJlO1cudW5pZm9ybXMucmVzb2x1dGlvbi52YWx1ZT10YS5tYXBTaXplO1cudW5pZm9ybXMucmFkaXVzLnZhbHVlPXRhLnJhZGl1czthLnNldFJlbmRlclRhcmdldCh0YS5tYXBQYXNzKTthLmNsZWFyKCk7YS5yZW5kZXJCdWZmZXJEaXJlY3QoQmEsbnVsbCxUYSxXLHJhLG51bGwpO2hhLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlPXRhLm1hcFBhc3MudGV4dHVyZTtoYS51bmlmb3Jtcy5yZXNvbHV0aW9uLnZhbHVlPXRhLm1hcFNpemU7aGEudW5pZm9ybXMucmFkaXVzLnZhbHVlPXRhLnJhZGl1czthLnNldFJlbmRlclRhcmdldCh0YS5tYXApO2EuY2xlYXIoKTthLnJlbmRlckJ1ZmZlckRpcmVjdChCYSxudWxsLFRhLGhhLHJhLG51bGwpfWZ1bmN0aW9uIHIodGEsQmEsVGEsVWEsQ2EsSGEpe3ZhciBEYT10YS5nZW9tZXRyeTt2YXIgTWE9UDt2YXIgZGI9dGEuY3VzdG9tRGVwdGhNYXRlcmlhbDtUYS5pc1BvaW50TGlnaHQmJihNYT1SLGRiPXRhLmN1c3RvbURpc3RhbmNlTWF0ZXJpYWwpOwpkYj9NYT1kYjooZGI9ITEsQmEubW9ycGhUYXJnZXRzJiYoRGEmJkRhLmlzQnVmZmVyR2VvbWV0cnk/ZGI9RGEubW9ycGhBdHRyaWJ1dGVzJiZEYS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24mJjA8RGEubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDpEYSYmRGEuaXNHZW9tZXRyeSYmKGRiPURhLm1vcnBoVGFyZ2V0cyYmMDxEYS5tb3JwaFRhcmdldHMubGVuZ3RoKSksdGEuaXNTa2lubmVkTWVzaCYmITE9PT1CYS5za2lubmluZyYmY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5lZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Iix0YSksdGE9dGEuaXNTa2lubmVkTWVzaCYmQmEuc2tpbm5pbmcsRGE9MCxkYiYmKERhfD0xKSx0YSYmKERhfD0yKSxNYT1NYVtEYV0pO2EubG9jYWxDbGlwcGluZ0VuYWJsZWQmJiEwPT09QmEuY2xpcFNoYWRvd3MmJjAhPT1CYS5jbGlwcGluZ1BsYW5lcy5sZW5ndGgmJihEYT1NYS51dWlkLApkYj1CYS51dWlkLHRhPVNbRGFdLHZvaWQgMD09PXRhJiYodGE9e30sU1tEYV09dGEpLERhPXRhW2RiXSx2b2lkIDA9PT1EYSYmKERhPU1hLmNsb25lKCksdGFbZGJdPURhKSxNYT1EYSk7TWEudmlzaWJsZT1CYS52aXNpYmxlO01hLndpcmVmcmFtZT1CYS53aXJlZnJhbWU7TWEuc2lkZT0zPT09SGE/bnVsbCE9QmEuc2hhZG93U2lkZT9CYS5zaGFkb3dTaWRlOkJhLnNpZGU6bnVsbCE9QmEuc2hhZG93U2lkZT9CYS5zaGFkb3dTaWRlOlZbQmEuc2lkZV07TWEuY2xpcFNoYWRvd3M9QmEuY2xpcFNoYWRvd3M7TWEuY2xpcHBpbmdQbGFuZXM9QmEuY2xpcHBpbmdQbGFuZXM7TWEuY2xpcEludGVyc2VjdGlvbj1CYS5jbGlwSW50ZXJzZWN0aW9uO01hLndpcmVmcmFtZUxpbmV3aWR0aD1CYS53aXJlZnJhbWVMaW5ld2lkdGg7TWEubGluZXdpZHRoPUJhLmxpbmV3aWR0aDtUYS5pc1BvaW50TGlnaHQmJk1hLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwmJihNYS5yZWZlcmVuY2VQb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oVGEubWF0cml4V29ybGQpLApNYS5uZWFyRGlzdGFuY2U9VWEsTWEuZmFyRGlzdGFuY2U9Q2EpO3JldHVybiBNYX1mdW5jdGlvbiB2KHRhLEJhLFRhLFVhLENhKXtpZighMSE9PXRhLnZpc2libGUpe2lmKHRhLmxheWVycy50ZXN0KEJhLmxheWVycykmJih0YS5pc01lc2h8fHRhLmlzTGluZXx8dGEuaXNQb2ludHMpJiYodGEuY2FzdFNoYWRvd3x8dGEucmVjZWl2ZVNoYWRvdyYmMz09PUNhKSYmKCF0YS5mcnVzdHVtQ3VsbGVkfHx6LmludGVyc2VjdHNPYmplY3QodGEpKSl7dGEubW9kZWxWaWV3TWF0cml4Lm11bHRpcGx5TWF0cmljZXMoVGEubWF0cml4V29ybGRJbnZlcnNlLHRhLm1hdHJpeFdvcmxkKTt2YXIgSGE9Yy51cGRhdGUodGEpLERhPXRhLm1hdGVyaWFsO2lmKEFycmF5LmlzQXJyYXkoRGEpKWZvcih2YXIgTWE9SGEuZ3JvdXBzLGRiPTAsdGI9TWEubGVuZ3RoO2RiPHRiO2RiKyspe3ZhciBLYT1NYVtkYl0sYmI9RGFbS2EubWF0ZXJpYWxJbmRleF07YmImJmJiLnZpc2libGUmJihiYj1yKHRhLGJiLFVhLFRhLm5lYXIsClRhLmZhcixDYSksYS5yZW5kZXJCdWZmZXJEaXJlY3QoVGEsbnVsbCxIYSxiYix0YSxLYSkpfWVsc2UgRGEudmlzaWJsZSYmKGJiPXIodGEsRGEsVWEsVGEubmVhcixUYS5mYXIsQ2EpLGEucmVuZGVyQnVmZmVyRGlyZWN0KFRhLG51bGwsSGEsYmIsdGEsbnVsbCkpfXRhPXRhLmNoaWxkcmVuO0hhPTA7Zm9yKERhPXRhLmxlbmd0aDtIYTxEYTtIYSsrKXYodGFbSGFdLEJhLFRhLFVhLENhKX19dmFyIHo9bmV3IGljLEU9bmV3IGYsRj1uZXcgZixKPW5ldyBwLFA9QXJyYXkoNCksUj1BcnJheSg0KSxTPXt9LFY9ezA6MSwxOjAsMjoyfSxXPW5ldyBxYih7ZGVmaW5lczp7U0FNUExFX1JBVEU6LjI1LEhBTEZfU0FNUExFX1JBVEU6LjEyNX0sdW5pZm9ybXM6e3NoYWRvd19wYXNzOnt2YWx1ZTpudWxsfSxyZXNvbHV0aW9uOnt2YWx1ZTpuZXcgZn0scmFkaXVzOnt2YWx1ZTo0fX0sdmVydGV4U2hhZGVyOiJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uIFx4M2QgdmVjNCggcG9zaXRpb24sIDEuMCApO1xufSIsCmZyYWdtZW50U2hhZGVyOiJ1bmlmb3JtIHNhbXBsZXIyRCBzaGFkb3dfcGFzcztcbnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uO1xudW5pZm9ybSBmbG9hdCByYWRpdXM7XG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbnZvaWQgbWFpbigpIHtcbiAgZmxvYXQgbWVhbiBceDNkIDAuMDtcbiAgZmxvYXQgc3F1YXJlZF9tZWFuIFx4M2QgMC4wO1xuICBcblx0ZmxvYXQgZGVwdGggXHgzZCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgICkgLyByZXNvbHV0aW9uICkgKTtcbiAgZm9yICggZmxvYXQgaSBceDNkIC0xLjA7IGkgXHgzYyAxLjAgOyBpICtceDNkIFNBTVBMRV9SQVRFKSB7XG4gICAgI2lmZGVmIEhPUklaT05BTF9QQVNTXG4gICAgICB2ZWMyIGRpc3RyaWJ1dGlvbiBceDNkIGRlY29kZUhhbGZSR0JBICggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCBpLCAwLjAgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7XG4gICAgICBtZWFuICtceDNkIGRpc3RyaWJ1dGlvbi54O1xuICAgICAgc3F1YXJlZF9tZWFuICtceDNkIGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54O1xuICAgICNlbHNlXG4gICAgICBmbG9hdCBkZXB0aCBceDNkIHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDAuMCwgIGkgKSAgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApO1xuICAgICAgbWVhbiArXHgzZCBkZXB0aDtcbiAgICAgIHNxdWFyZWRfbWVhbiArXHgzZCBkZXB0aCAqIGRlcHRoO1xuICAgICNlbmRpZlxuICB9XG4gIG1lYW4gXHgzZCBtZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgc3F1YXJlZF9tZWFuIFx4M2Qgc3F1YXJlZF9tZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgZmxvYXQgc3RkX2RldiBceDNkIHBvdyggc3F1YXJlZF9tZWFuIC0gbWVhbiAqIG1lYW4sIDAuNSApO1xuICBnbF9GcmFnQ29sb3IgXHgzZCBlbmNvZGVIYWxmUkdCQSggdmVjMiggbWVhbiwgc3RkX2RldiApICk7XG59In0pLApoYT1XLmNsb25lKCk7aGEuZGVmaW5lcy5IT1JJWk9OQUxfUEFTUz0xO3ZhciBmYT1uZXcgdmE7ZmEuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFEobmV3IEZsb2F0MzJBcnJheShbLTEsLTEsLjUsMywtMSwuNSwtMSwzLC41XSksMykpO3ZhciByYT1uZXcgeGEoZmEsVyk7Zm9yKGZhPTA7NCE9PWZhOysrZmEpe3ZhciBwYT0wIT09KGZhJjEpLHFhPTAhPT0oZmEmMiksdWE9bmV3IHZkKHtkZXB0aFBhY2tpbmc6MzIwMSxtb3JwaFRhcmdldHM6cGEsc2tpbm5pbmc6cWF9KTtQW2ZhXT11YTtwYT1uZXcgd2Qoe21vcnBoVGFyZ2V0czpwYSxza2lubmluZzpxYX0pO1JbZmFdPXBhfXZhciBvYT10aGlzO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmF1dG9VcGRhdGU9ITA7dGhpcy5uZWVkc1VwZGF0ZT0hMTt0aGlzLnR5cGU9MTt0aGlzLnJlbmRlcj1mdW5jdGlvbih0YSxCYSxUYSl7aWYoITEhPT1vYS5lbmFibGVkJiYoITEhPT1vYS5hdXRvVXBkYXRlfHwhMSE9PW9hLm5lZWRzVXBkYXRlKSYmCjAhPT10YS5sZW5ndGgpe3ZhciBVYT1hLmdldFJlbmRlclRhcmdldCgpLENhPWEuZ2V0QWN0aXZlQ3ViZUZhY2UoKSxIYT1hLmdldEFjdGl2ZU1pcG1hcExldmVsKCksRGE9YS5zdGF0ZTtEYS5zZXRCbGVuZGluZygwKTtEYS5idWZmZXJzLmNvbG9yLnNldENsZWFyKDEsMSwxLDEpO0RhLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCghMCk7RGEuc2V0U2Npc3NvclRlc3QoITEpO2Zvcih2YXIgTWE9MCxkYj10YS5sZW5ndGg7TWE8ZGI7TWErKyl7dmFyIHRiPXRhW01hXSxLYT10Yi5zaGFkb3c7aWYodm9pZCAwPT09S2EpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFNoYWRvd01hcDoiLHRiLCJoYXMgbm8gc2hhZG93LiIpO2Vsc2V7RS5jb3B5KEthLm1hcFNpemUpO3ZhciBiYj1LYS5nZXRGcmFtZUV4dGVudHMoKTtFLm11bHRpcGx5KGJiKTtGLmNvcHkoS2EubWFwU2l6ZSk7aWYoRS54PmV8fEUueT5lKWNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xTaGFkb3dNYXA6Iix0YiwiaGFzIHNoYWRvdyBleGNlZWRpbmcgbWF4IHRleHR1cmUgc2l6ZSwgcmVkdWNpbmciKSwKRS54PmUmJihGLng9TWF0aC5mbG9vcihlL2JiLngpLEUueD1GLngqYmIueCxLYS5tYXBTaXplLng9Ri54KSxFLnk+ZSYmKEYueT1NYXRoLmZsb29yKGUvYmIueSksRS55PUYueSpiYi55LEthLm1hcFNpemUueT1GLnkpO251bGwhPT1LYS5tYXB8fEthLmlzUG9pbnRMaWdodFNoYWRvd3x8MyE9PXRoaXMudHlwZXx8KGJiPXttaW5GaWx0ZXI6MTAwNixtYWdGaWx0ZXI6MTAwNixmb3JtYXQ6MTAyM30sS2EubWFwPW5ldyBtKEUueCxFLnksYmIpLEthLm1hcC50ZXh0dXJlLm5hbWU9dGIubmFtZSsiLnNoYWRvd01hcCIsS2EubWFwUGFzcz1uZXcgbShFLngsRS55LGJiKSxLYS5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKTtudWxsPT09S2EubWFwJiYoYmI9e21pbkZpbHRlcjoxMDAzLG1hZ0ZpbHRlcjoxMDAzLGZvcm1hdDoxMDIzfSxLYS5tYXA9bmV3IG0oRS54LEUueSxiYiksS2EubWFwLnRleHR1cmUubmFtZT10Yi5uYW1lKyIuc2hhZG93TWFwIixLYS5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpKTsKYS5zZXRSZW5kZXJUYXJnZXQoS2EubWFwKTthLmNsZWFyKCk7YmI9S2EuZ2V0Vmlld3BvcnRDb3VudCgpO2Zvcih2YXIgamI9MDtqYjxiYjtqYisrKXt2YXIgRWI9S2EuZ2V0Vmlld3BvcnQoamIpO0ouc2V0KEYueCpFYi54LEYueSpFYi55LEYueCpFYi56LEYueSpFYi53KTtEYS52aWV3cG9ydChKKTtLYS51cGRhdGVNYXRyaWNlcyh0YixUYSxqYik7ej1LYS5nZXRGcnVzdHVtKCk7dihCYSxUYSxLYS5jYW1lcmEsdGIsdGhpcy50eXBlKX1LYS5pc1BvaW50TGlnaHRTaGFkb3d8fDMhPT10aGlzLnR5cGV8fGcoS2EsVGEpfX1vYS5uZWVkc1VwZGF0ZT0hMTthLnNldFJlbmRlclRhcmdldChVYSxDYSxIYSl9fX1mdW5jdGlvbiBWbChhLGMsZSxnKXtmdW5jdGlvbiByKGphLEdhLExhKXt2YXIgbmI9bmV3IFVpbnQ4QXJyYXkoNCksVmE9YS5jcmVhdGVUZXh0dXJlKCk7YS5iaW5kVGV4dHVyZShqYSxWYSk7YS50ZXhQYXJhbWV0ZXJpKGphLDEwMjQxLDk3MjgpO2EudGV4UGFyYW1ldGVyaShqYSwKMTAyNDAsOTcyOCk7Zm9yKGphPTA7amE8TGE7amErKylhLnRleEltYWdlMkQoR2EramEsMCw2NDA4LDEsMSwwLDY0MDgsNTEyMSxuYik7cmV0dXJuIFZhfWZ1bmN0aW9uIHYoamEsR2Epe3JhW2phXT0xOzA9PT1wYVtqYV0mJihhLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGphKSxwYVtqYV09MSk7cWFbamFdIT09R2EmJigoZy5pc1dlYkdMMj9hOmMuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpW2cuaXNXZWJHTDI/InZlcnRleEF0dHJpYkRpdmlzb3IiOiJ2ZXJ0ZXhBdHRyaWJEaXZpc29yQU5HTEUiXShqYSxHYSkscWFbamFdPUdhKX1mdW5jdGlvbiB6KGphKXshMCE9PXVhW2phXSYmKGEuZW5hYmxlKGphKSx1YVtqYV09ITApfWZ1bmN0aW9uIEUoamEpeyExIT09dWFbamFdJiYoYS5kaXNhYmxlKGphKSx1YVtqYV09ITEpfWZ1bmN0aW9uIEYoamEsR2EsTGEsbmIsVmEsaWIsa2IsUWEpe2lmKDA9PT1qYSlCYSYmKEUoMzA0MiksQmE9ITEpO2Vsc2UgaWYoQmF8fCh6KDMwNDIpLApCYT0hMCksNSE9PWphKXtpZihqYSE9PVRhfHxRYSE9PXRiKXtpZigxMDAhPT1VYXx8MTAwIT09RGEpYS5ibGVuZEVxdWF0aW9uKDMyNzc0KSxEYT1VYT0xMDA7aWYoUWEpc3dpdGNoKGphKXtjYXNlIDE6YS5ibGVuZEZ1bmNTZXBhcmF0ZSgxLDc3MSwxLDc3MSk7YnJlYWs7Y2FzZSAyOmEuYmxlbmRGdW5jKDEsMSk7YnJlYWs7Y2FzZSAzOmEuYmxlbmRGdW5jU2VwYXJhdGUoMCwwLDc2OSw3NzEpO2JyZWFrO2Nhc2UgNDphLmJsZW5kRnVuY1NlcGFyYXRlKDAsNzY4LDAsNzcwKTticmVhaztkZWZhdWx0OmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMU3RhdGU6IEludmFsaWQgYmxlbmRpbmc6ICIsamEpfWVsc2Ugc3dpdGNoKGphKXtjYXNlIDE6YS5ibGVuZEZ1bmNTZXBhcmF0ZSg3NzAsNzcxLDEsNzcxKTticmVhaztjYXNlIDI6YS5ibGVuZEZ1bmMoNzcwLDEpO2JyZWFrO2Nhc2UgMzphLmJsZW5kRnVuYygwLDc2OSk7YnJlYWs7Y2FzZSA0OmEuYmxlbmRGdW5jKDAsNzY4KTticmVhazsKZGVmYXVsdDpjb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAiLGphKX1kYj1NYT1IYT1DYT1udWxsO1RhPWphO3RiPVFhfX1lbHNle1ZhPVZhfHxHYTtpYj1pYnx8TGE7a2I9a2J8fG5iO2lmKEdhIT09VWF8fFZhIT09RGEpYS5ibGVuZEVxdWF0aW9uU2VwYXJhdGUoZS5jb252ZXJ0KEdhKSxlLmNvbnZlcnQoVmEpKSxVYT1HYSxEYT1WYTtpZihMYSE9PUNhfHxuYiE9PUhhfHxpYiE9PU1hfHxrYiE9PWRiKWEuYmxlbmRGdW5jU2VwYXJhdGUoZS5jb252ZXJ0KExhKSxlLmNvbnZlcnQobmIpLGUuY29udmVydChpYiksZS5jb252ZXJ0KGtiKSksQ2E9TGEsSGE9bmIsTWE9aWIsZGI9a2I7VGE9amE7dGI9bnVsbH19ZnVuY3Rpb24gSihqYSl7S2EhPT1qYSYmKGphP2EuZnJvbnRGYWNlKDIzMDQpOmEuZnJvbnRGYWNlKDIzMDUpLEthPWphKX1mdW5jdGlvbiBQKGphKXswIT09amE/KHooMjg4NCksamEhPT1iYiYmKDE9PT1qYT9hLmN1bGxGYWNlKDEwMjkpOgoyPT09amE/YS5jdWxsRmFjZSgxMDI4KTphLmN1bGxGYWNlKDEwMzIpKSk6RSgyODg0KTtiYj1qYX1mdW5jdGlvbiBSKGphLEdhLExhKXtpZihqYSl7aWYoeigzMjgyMyksRWIhPT1HYXx8eGIhPT1MYSlhLnBvbHlnb25PZmZzZXQoR2EsTGEpLEViPUdhLHhiPUxhfWVsc2UgRSgzMjgyMyl9ZnVuY3Rpb24gUyhqYSl7dm9pZCAwPT09amEmJihqYT0zMzk4NCtpYS0xKTt6YSE9PWphJiYoYS5hY3RpdmVUZXh0dXJlKGphKSx6YT1qYSl9dmFyIFY9bmV3IGZ1bmN0aW9uKCl7dmFyIGphPSExLEdhPW5ldyBwLExhPW51bGwsbmI9bmV3IHAoMCwwLDAsMCk7cmV0dXJue3NldE1hc2s6ZnVuY3Rpb24oVmEpe0xhPT09VmF8fGphfHwoYS5jb2xvck1hc2soVmEsVmEsVmEsVmEpLExhPVZhKX0sc2V0TG9ja2VkOmZ1bmN0aW9uKFZhKXtqYT1WYX0sc2V0Q2xlYXI6ZnVuY3Rpb24oVmEsaWIsa2IsUWEsZWIpeyEwPT09ZWImJihWYSo9UWEsaWIqPVFhLGtiKj1RYSk7R2Euc2V0KFZhLGliLGtiLFFhKTsKITE9PT1uYi5lcXVhbHMoR2EpJiYoYS5jbGVhckNvbG9yKFZhLGliLGtiLFFhKSxuYi5jb3B5KEdhKSl9LHJlc2V0OmZ1bmN0aW9uKCl7amE9ITE7TGE9bnVsbDtuYi5zZXQoLTEsMCwwLDApfX19LFc9bmV3IGZ1bmN0aW9uKCl7dmFyIGphPSExLEdhPW51bGwsTGE9bnVsbCxuYj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKFZhKXtWYT96KDI5MjkpOkUoMjkyOSl9LHNldE1hc2s6ZnVuY3Rpb24oVmEpe0dhPT09VmF8fGphfHwoYS5kZXB0aE1hc2soVmEpLEdhPVZhKX0sc2V0RnVuYzpmdW5jdGlvbihWYSl7aWYoTGEhPT1WYSl7aWYoVmEpc3dpdGNoKFZhKXtjYXNlIDA6YS5kZXB0aEZ1bmMoNTEyKTticmVhaztjYXNlIDE6YS5kZXB0aEZ1bmMoNTE5KTticmVhaztjYXNlIDI6YS5kZXB0aEZ1bmMoNTEzKTticmVhaztjYXNlIDM6YS5kZXB0aEZ1bmMoNTE1KTticmVhaztjYXNlIDQ6YS5kZXB0aEZ1bmMoNTE0KTticmVhaztjYXNlIDU6YS5kZXB0aEZ1bmMoNTE4KTticmVhaztjYXNlIDY6YS5kZXB0aEZ1bmMoNTE2KTsKYnJlYWs7Y2FzZSA3OmEuZGVwdGhGdW5jKDUxNyk7YnJlYWs7ZGVmYXVsdDphLmRlcHRoRnVuYyg1MTUpfWVsc2UgYS5kZXB0aEZ1bmMoNTE1KTtMYT1WYX19LHNldExvY2tlZDpmdW5jdGlvbihWYSl7amE9VmF9LHNldENsZWFyOmZ1bmN0aW9uKFZhKXtuYiE9PVZhJiYoYS5jbGVhckRlcHRoKFZhKSxuYj1WYSl9LHJlc2V0OmZ1bmN0aW9uKCl7amE9ITE7bmI9TGE9R2E9bnVsbH19fSxoYT1uZXcgZnVuY3Rpb24oKXt2YXIgamE9ITEsR2E9bnVsbCxMYT1udWxsLG5iPW51bGwsVmE9bnVsbCxpYj1udWxsLGtiPW51bGwsUWE9bnVsbCxlYj1udWxsO3JldHVybntzZXRUZXN0OmZ1bmN0aW9uKG1iKXtqYXx8KG1iP3ooMjk2MCk6RSgyOTYwKSl9LHNldE1hc2s6ZnVuY3Rpb24obWIpe0dhPT09bWJ8fGphfHwoYS5zdGVuY2lsTWFzayhtYiksR2E9bWIpfSxzZXRGdW5jOmZ1bmN0aW9uKG1iLHBiLHNiKXtpZihMYSE9PW1ifHxuYiE9PXBifHxWYSE9PXNiKWEuc3RlbmNpbEZ1bmMobWIscGIsCnNiKSxMYT1tYixuYj1wYixWYT1zYn0sc2V0T3A6ZnVuY3Rpb24obWIscGIsc2Ipe2lmKGliIT09bWJ8fGtiIT09cGJ8fFFhIT09c2IpYS5zdGVuY2lsT3AobWIscGIsc2IpLGliPW1iLGtiPXBiLFFhPXNifSxzZXRMb2NrZWQ6ZnVuY3Rpb24obWIpe2phPW1ifSxzZXRDbGVhcjpmdW5jdGlvbihtYil7ZWIhPT1tYiYmKGEuY2xlYXJTdGVuY2lsKG1iKSxlYj1tYil9LHJlc2V0OmZ1bmN0aW9uKCl7amE9ITE7ZWI9UWE9a2I9aWI9VmE9bmI9TGE9R2E9bnVsbH19fSxmYT1hLmdldFBhcmFtZXRlcigzNDkyMSkscmE9bmV3IFVpbnQ4QXJyYXkoZmEpLHBhPW5ldyBVaW50OEFycmF5KGZhKSxxYT1uZXcgVWludDhBcnJheShmYSksdWE9e30sb2E9bnVsbCx0YT1udWxsLEJhPW51bGwsVGE9bnVsbCxVYT1udWxsLENhPW51bGwsSGE9bnVsbCxEYT1udWxsLE1hPW51bGwsZGI9bnVsbCx0Yj0hMSxLYT1udWxsLGJiPW51bGwsamI9bnVsbCxFYj1udWxsLHhiPW51bGwsaWE9YS5nZXRQYXJhbWV0ZXIoMzU2NjEpLApuYT0hMTtmYT0wO2ZhPWEuZ2V0UGFyYW1ldGVyKDc5MzgpOy0xIT09ZmEuaW5kZXhPZigiV2ViR0wiKT8oZmE9cGFyc2VGbG9hdCgvXldlYkdMIChbMC05XSkvLmV4ZWMoZmEpWzFdKSxuYT0xPD1mYSk6LTEhPT1mYS5pbmRleE9mKCJPcGVuR0wgRVMiKSYmKGZhPXBhcnNlRmxvYXQoL15PcGVuR0wgRVMgKFswLTldKS8uZXhlYyhmYSlbMV0pLG5hPTI8PWZhKTt2YXIgemE9bnVsbCxKYT17fSxZYT1uZXcgcCxOYT1uZXcgcCxjYj17fTtjYlszNTUzXT1yKDM1NTMsMzU1MywxKTtjYlszNDA2N109cigzNDA2NywzNDA2OSw2KTtWLnNldENsZWFyKDAsMCwwLDEpO1cuc2V0Q2xlYXIoMSk7aGEuc2V0Q2xlYXIoMCk7eigyOTI5KTtXLnNldEZ1bmMoMyk7SighMSk7UCgxKTt6KDI4ODQpO0YoMCk7cmV0dXJue2J1ZmZlcnM6e2NvbG9yOlYsZGVwdGg6VyxzdGVuY2lsOmhhfSxpbml0QXR0cmlidXRlczpmdW5jdGlvbigpe2Zvcih2YXIgamE9MCxHYT1yYS5sZW5ndGg7amE8R2E7amErKylyYVtqYV09CjB9LGVuYWJsZUF0dHJpYnV0ZTpmdW5jdGlvbihqYSl7dihqYSwwKX0sZW5hYmxlQXR0cmlidXRlQW5kRGl2aXNvcjp2LGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzOmZ1bmN0aW9uKCl7Zm9yKHZhciBqYT0wLEdhPXBhLmxlbmd0aDtqYSE9PUdhOysramEpcGFbamFdIT09cmFbamFdJiYoYS5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoamEpLHBhW2phXT0wKX0sZW5hYmxlOnosZGlzYWJsZTpFLGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0czpmdW5jdGlvbigpe2lmKG51bGw9PT1vYSYmKG9hPVtdLGMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMiKXx8Yy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIil8fGMuZ2V0KCJXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMSIpfHxjLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSkpZm9yKHZhciBqYT1hLmdldFBhcmFtZXRlcigzNDQ2NyksR2E9MDtHYTxqYS5sZW5ndGg7R2ErKylvYS5wdXNoKGphW0dhXSk7CnJldHVybiBvYX0sdXNlUHJvZ3JhbTpmdW5jdGlvbihqYSl7cmV0dXJuIHRhIT09amE/KGEudXNlUHJvZ3JhbShqYSksdGE9amEsITApOiExfSxzZXRCbGVuZGluZzpGLHNldE1hdGVyaWFsOmZ1bmN0aW9uKGphLEdhKXsyPT09amEuc2lkZT9FKDI4ODQpOnooMjg4NCk7dmFyIExhPTE9PT1qYS5zaWRlO0dhJiYoTGE9IUxhKTtKKExhKTsxPT09amEuYmxlbmRpbmcmJiExPT09amEudHJhbnNwYXJlbnQ/RigwKTpGKGphLmJsZW5kaW5nLGphLmJsZW5kRXF1YXRpb24samEuYmxlbmRTcmMsamEuYmxlbmREc3QsamEuYmxlbmRFcXVhdGlvbkFscGhhLGphLmJsZW5kU3JjQWxwaGEsamEuYmxlbmREc3RBbHBoYSxqYS5wcmVtdWx0aXBsaWVkQWxwaGEpO1cuc2V0RnVuYyhqYS5kZXB0aEZ1bmMpO1cuc2V0VGVzdChqYS5kZXB0aFRlc3QpO1cuc2V0TWFzayhqYS5kZXB0aFdyaXRlKTtWLnNldE1hc2soamEuY29sb3JXcml0ZSk7R2E9amEuc3RlbmNpbFdyaXRlO2hhLnNldFRlc3QoR2EpO0dhJiYKKGhhLnNldEZ1bmMoamEuc3RlbmNpbEZ1bmMsamEuc3RlbmNpbFJlZixqYS5zdGVuY2lsTWFzayksaGEuc2V0T3AoamEuc3RlbmNpbEZhaWwsamEuc3RlbmNpbFpGYWlsLGphLnN0ZW5jaWxaUGFzcykpO1IoamEucG9seWdvbk9mZnNldCxqYS5wb2x5Z29uT2Zmc2V0RmFjdG9yLGphLnBvbHlnb25PZmZzZXRVbml0cyl9LHNldEZsaXBTaWRlZDpKLHNldEN1bGxGYWNlOlAsc2V0TGluZVdpZHRoOmZ1bmN0aW9uKGphKXtqYSE9PWpiJiYobmEmJmEubGluZVdpZHRoKGphKSxqYj1qYSl9LHNldFBvbHlnb25PZmZzZXQ6UixzZXRTY2lzc29yVGVzdDpmdW5jdGlvbihqYSl7amE/eigzMDg5KTpFKDMwODkpfSxhY3RpdmVUZXh0dXJlOlMsYmluZFRleHR1cmU6ZnVuY3Rpb24oamEsR2Epe251bGw9PT16YSYmUygpO3ZhciBMYT1KYVt6YV07dm9pZCAwPT09TGEmJihMYT17dHlwZTp2b2lkIDAsdGV4dHVyZTp2b2lkIDB9LEphW3phXT1MYSk7aWYoTGEudHlwZSE9PWphfHxMYS50ZXh0dXJlIT09CkdhKWEuYmluZFRleHR1cmUoamEsR2F8fGNiW2phXSksTGEudHlwZT1qYSxMYS50ZXh0dXJlPUdhfSxjb21wcmVzc2VkVGV4SW1hZ2UyRDpmdW5jdGlvbigpe3RyeXthLmNvbXByZXNzZWRUZXhJbWFnZTJELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChqYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGphKX19LHRleEltYWdlMkQ6ZnVuY3Rpb24oKXt0cnl7YS50ZXhJbWFnZTJELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChqYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGphKX19LHRleEltYWdlM0Q6ZnVuY3Rpb24oKXt0cnl7YS50ZXhJbWFnZTNELmFwcGx5KGEsYXJndW1lbnRzKX1jYXRjaChqYSl7Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xTdGF0ZToiLGphKX19LHNjaXNzb3I6ZnVuY3Rpb24oamEpeyExPT09WWEuZXF1YWxzKGphKSYmKGEuc2Npc3NvcihqYS54LGphLnksamEueixqYS53KSxZYS5jb3B5KGphKSl9LHZpZXdwb3J0OmZ1bmN0aW9uKGphKXshMT09PQpOYS5lcXVhbHMoamEpJiYoYS52aWV3cG9ydChqYS54LGphLnksamEueixqYS53KSxOYS5jb3B5KGphKSl9LHJlc2V0OmZ1bmN0aW9uKCl7Zm9yKHZhciBqYT0wO2phPHBhLmxlbmd0aDtqYSsrKTE9PT1wYVtqYV0mJihhLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShqYSkscGFbamFdPTApO3VhPXt9O3phPW9hPW51bGw7SmE9e307YmI9S2E9VGE9dGE9bnVsbDtWLnJlc2V0KCk7Vy5yZXNldCgpO2hhLnJlc2V0KCl9fX1mdW5jdGlvbiBXbChhLGMsZSxnLHIsdix6KXtmdW5jdGlvbiBFKGlhLG5hKXtyZXR1cm4gYmI/bmV3IE9mZnNjcmVlbkNhbnZhcyhpYSxuYSk6ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIil9ZnVuY3Rpb24gRihpYSxuYSx6YSxKYSl7dmFyIFlhPTE7aWYoaWEud2lkdGg+SmF8fGlhLmhlaWdodD5KYSlZYT1KYS9NYXRoLm1heChpYS53aWR0aCxpYS5oZWlnaHQpO2lmKDE+WWF8fCEwPT09bmEpe2lmKCJ1bmRlZmluZWQiIT09CnR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50JiZpYSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnR8fCJ1bmRlZmluZWQiIT09dHlwZW9mIEhUTUxDYW52YXNFbGVtZW50JiZpYSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHwidW5kZWZpbmVkIiE9PXR5cGVvZiBJbWFnZUJpdG1hcCYmaWEgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcClyZXR1cm4gSmE9bmE/aGIuZmxvb3JQb3dlck9mVHdvOk1hdGguZmxvb3IsbmE9SmEoWWEqaWEud2lkdGgpLFlhPUphKFlhKmlhLmhlaWdodCksdm9pZCAwPT09S2EmJihLYT1FKG5hLFlhKSksemE9emE/RShuYSxZYSk6S2EsemEud2lkdGg9bmEsemEuaGVpZ2h0PVlhLHphLmdldENvbnRleHQoIjJkIikuZHJhd0ltYWdlKGlhLDAsMCxuYSxZYSksY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGhhcyBiZWVuIHJlc2l6ZWQgZnJvbSAoIitpYS53aWR0aCsieCIraWEuaGVpZ2h0KyIpIHRvICgiK25hKyJ4IitZYSsiKS4iKSwKemE7ImRhdGEiaW4gaWEmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogSW1hZ2UgaW4gRGF0YVRleHR1cmUgaXMgdG9vIGJpZyAoIitpYS53aWR0aCsieCIraWEuaGVpZ2h0KyIpLiIpfXJldHVybiBpYX1mdW5jdGlvbiBKKGlhKXtyZXR1cm4gaGIuaXNQb3dlck9mVHdvKGlhLndpZHRoKSYmaGIuaXNQb3dlck9mVHdvKGlhLmhlaWdodCl9ZnVuY3Rpb24gUChpYSl7cmV0dXJuIHIuaXNXZWJHTDI/ITE6MTAwMSE9PWlhLndyYXBTfHwxMDAxIT09aWEud3JhcFR8fDEwMDMhPT1pYS5taW5GaWx0ZXImJjEwMDYhPT1pYS5taW5GaWx0ZXJ9ZnVuY3Rpb24gUihpYSxuYSl7cmV0dXJuIGlhLmdlbmVyYXRlTWlwbWFwcyYmbmEmJjEwMDMhPT1pYS5taW5GaWx0ZXImJjEwMDYhPT1pYS5taW5GaWx0ZXJ9ZnVuY3Rpb24gUyhpYSxuYSx6YSxKYSl7YS5nZW5lcmF0ZU1pcG1hcChpYSk7Zy5nZXQobmEpLl9fbWF4TWlwTGV2ZWw9TWF0aC5sb2coTWF0aC5tYXgoemEsSmEpKSpNYXRoLkxPRzJFfQpmdW5jdGlvbiBWKGlhLG5hKXtpZighci5pc1dlYkdMMilyZXR1cm4gaWE7dmFyIHphPWlhOzY0MDM9PT1pYSYmKDUxMjY9PT1uYSYmKHphPTMzMzI2KSw1MTMxPT09bmEmJih6YT0zMzMyNSksNTEyMT09PW5hJiYoemE9MzMzMjEpKTs2NDA3PT09aWEmJig1MTI2PT09bmEmJih6YT0zNDgzNyksNTEzMT09PW5hJiYoemE9MzQ4NDMpLDUxMjE9PT1uYSYmKHphPTMyODQ5KSk7NjQwOD09PWlhJiYoNTEyNj09PW5hJiYoemE9MzQ4MzYpLDUxMzE9PT1uYSYmKHphPTM0ODQyKSw1MTIxPT09bmEmJih6YT0zMjg1NikpOzMzMzI1PT09emF8fDMzMzI2PT09emF8fDM0ODQyPT09emF8fDM0ODM2PT09emE/Yy5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKTooMzQ4NDM9PT16YXx8MzQ4Mzc9PT16YSkmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogRmxvYXRpbmcgcG9pbnQgdGV4dHVyZXMgd2l0aCBSR0IgZm9ybWF0IG5vdCBzdXBwb3J0ZWQuIFBsZWFzZSB1c2UgUkdCQSBpbnN0ZWFkLiIpOwpyZXR1cm4gemF9ZnVuY3Rpb24gVyhpYSl7cmV0dXJuIDEwMDM9PT1pYXx8MTAwND09PWlhfHwxMDA1PT09aWE/OTcyODo5NzI5fWZ1bmN0aW9uIGhhKGlhKXtpYT1pYS50YXJnZXQ7aWEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsaGEpO3JhKGlhKTtpYS5pc1ZpZGVvVGV4dHVyZSYmdGIuZGVsZXRlKGlhKTt6Lm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIGZhKGlhKXtpYT1pYS50YXJnZXQ7aWEucmVtb3ZlRXZlbnRMaXN0ZW5lcigiZGlzcG9zZSIsZmEpO3BhKGlhKTt6Lm1lbW9yeS50ZXh0dXJlcy0tfWZ1bmN0aW9uIHJhKGlhKXt2YXIgbmE9Zy5nZXQoaWEpO3ZvaWQgMCE9PW5hLl9fd2ViZ2xJbml0JiYoYS5kZWxldGVUZXh0dXJlKG5hLl9fd2ViZ2xUZXh0dXJlKSxnLnJlbW92ZShpYSkpfWZ1bmN0aW9uIHBhKGlhKXt2YXIgbmE9Zy5nZXQoaWEpLHphPWcuZ2V0KGlhLnRleHR1cmUpO2lmKGlhKXt2b2lkIDAhPT16YS5fX3dlYmdsVGV4dHVyZSYmYS5kZWxldGVUZXh0dXJlKHphLl9fd2ViZ2xUZXh0dXJlKTsKaWEuZGVwdGhUZXh0dXJlJiZpYS5kZXB0aFRleHR1cmUuZGlzcG9zZSgpO2lmKGlhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKWZvcih6YT0wOzY+emE7emErKylhLmRlbGV0ZUZyYW1lYnVmZmVyKG5hLl9fd2ViZ2xGcmFtZWJ1ZmZlclt6YV0pLG5hLl9fd2ViZ2xEZXB0aGJ1ZmZlciYmYS5kZWxldGVSZW5kZXJidWZmZXIobmEuX193ZWJnbERlcHRoYnVmZmVyW3phXSk7ZWxzZSBhLmRlbGV0ZUZyYW1lYnVmZmVyKG5hLl9fd2ViZ2xGcmFtZWJ1ZmZlciksbmEuX193ZWJnbERlcHRoYnVmZmVyJiZhLmRlbGV0ZVJlbmRlcmJ1ZmZlcihuYS5fX3dlYmdsRGVwdGhidWZmZXIpO2cucmVtb3ZlKGlhLnRleHR1cmUpO2cucmVtb3ZlKGlhKX19ZnVuY3Rpb24gcWEoaWEsbmEpe3ZhciB6YT1nLmdldChpYSk7aWEuaXNWaWRlb1RleHR1cmUmJmRiKGlhKTtpZigwPGlhLnZlcnNpb24mJnphLl9fdmVyc2lvbiE9PWlhLnZlcnNpb24pe3ZhciBKYT1pYS5pbWFnZTtpZih2b2lkIDA9PT1KYSljb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFRleHR1cmUgbWFya2VkIGZvciB1cGRhdGUgYnV0IGltYWdlIGlzIHVuZGVmaW5lZCIpOwplbHNlIGlmKCExPT09SmEuY29tcGxldGUpY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIG1hcmtlZCBmb3IgdXBkYXRlIGJ1dCBpbWFnZSBpcyBpbmNvbXBsZXRlIik7ZWxzZXtUYSh6YSxpYSxuYSk7cmV0dXJufX1lLmFjdGl2ZVRleHR1cmUoMzM5ODQrbmEpO2UuYmluZFRleHR1cmUoMzU1Myx6YS5fX3dlYmdsVGV4dHVyZSl9ZnVuY3Rpb24gdWEoaWEsbmEpe2lmKDY9PT1pYS5pbWFnZS5sZW5ndGgpe3ZhciB6YT1nLmdldChpYSk7aWYoMDxpYS52ZXJzaW9uJiZ6YS5fX3ZlcnNpb24hPT1pYS52ZXJzaW9uKXtCYSh6YSxpYSk7ZS5hY3RpdmVUZXh0dXJlKDMzOTg0K25hKTtlLmJpbmRUZXh0dXJlKDM0MDY3LHphLl9fd2ViZ2xUZXh0dXJlKTthLnBpeGVsU3RvcmVpKDM3NDQwLGlhLmZsaXBZKTt2YXIgSmE9aWEmJmlhLmlzQ29tcHJlc3NlZFRleHR1cmU7bmE9aWEuaW1hZ2VbMF0mJmlhLmltYWdlWzBdLmlzRGF0YVRleHR1cmU7Zm9yKHZhciBZYT1bXSwKTmE9MDs2Pk5hO05hKyspWWFbTmFdPUphfHxuYT9uYT9pYS5pbWFnZVtOYV0uaW1hZ2U6aWEuaW1hZ2VbTmFdOkYoaWEuaW1hZ2VbTmFdLCExLCEwLHIubWF4Q3ViZW1hcFNpemUpO3ZhciBjYj1ZYVswXSxqYT1KKGNiKXx8ci5pc1dlYkdMMixHYT12LmNvbnZlcnQoaWEuZm9ybWF0KSxMYT12LmNvbnZlcnQoaWEudHlwZSksbmI9VihHYSxMYSk7dGEoMzQwNjcsaWEsamEpO2lmKEphKXtmb3IoTmE9MDs2Pk5hO05hKyspe3ZhciBWYT1ZYVtOYV0ubWlwbWFwcztmb3IoSmE9MDtKYTxWYS5sZW5ndGg7SmErKyl7dmFyIGliPVZhW0phXTsxMDIzIT09aWEuZm9ybWF0JiYxMDIyIT09aWEuZm9ybWF0Py0xPGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihHYSk/ZS5jb21wcmVzc2VkVGV4SW1hZ2UyRCgzNDA2OStOYSxKYSxuYixpYi53aWR0aCxpYi5oZWlnaHQsMCxpYi5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC5zZXRUZXh0dXJlQ3ViZSgpIik6CmUudGV4SW1hZ2UyRCgzNDA2OStOYSxKYSxuYixpYi53aWR0aCxpYi5oZWlnaHQsMCxHYSxMYSxpYi5kYXRhKX19emEuX19tYXhNaXBMZXZlbD1WYS5sZW5ndGgtMX1lbHNle1ZhPWlhLm1pcG1hcHM7Zm9yKE5hPTA7Nj5OYTtOYSsrKWlmKG5hKWZvcihlLnRleEltYWdlMkQoMzQwNjkrTmEsMCxuYixZYVtOYV0ud2lkdGgsWWFbTmFdLmhlaWdodCwwLEdhLExhLFlhW05hXS5kYXRhKSxKYT0wO0phPFZhLmxlbmd0aDtKYSsrKWliPVZhW0phXSxpYj1pYi5pbWFnZVtOYV0uaW1hZ2UsZS50ZXhJbWFnZTJEKDM0MDY5K05hLEphKzEsbmIsaWIud2lkdGgsaWIuaGVpZ2h0LDAsR2EsTGEsaWIuZGF0YSk7ZWxzZSBmb3IoZS50ZXhJbWFnZTJEKDM0MDY5K05hLDAsbmIsR2EsTGEsWWFbTmFdKSxKYT0wO0phPFZhLmxlbmd0aDtKYSsrKWliPVZhW0phXSxlLnRleEltYWdlMkQoMzQwNjkrTmEsSmErMSxuYixHYSxMYSxpYi5pbWFnZVtOYV0pO3phLl9fbWF4TWlwTGV2ZWw9VmEubGVuZ3RofVIoaWEsCmphKSYmUygzNDA2NyxpYSxjYi53aWR0aCxjYi5oZWlnaHQpO3phLl9fdmVyc2lvbj1pYS52ZXJzaW9uO2lmKGlhLm9uVXBkYXRlKWlhLm9uVXBkYXRlKGlhKX1lbHNlIGUuYWN0aXZlVGV4dHVyZSgzMzk4NCtuYSksZS5iaW5kVGV4dHVyZSgzNDA2Nyx6YS5fX3dlYmdsVGV4dHVyZSl9fWZ1bmN0aW9uIG9hKGlhLG5hKXtlLmFjdGl2ZVRleHR1cmUoMzM5ODQrbmEpO2UuYmluZFRleHR1cmUoMzQwNjcsZy5nZXQoaWEpLl9fd2ViZ2xUZXh0dXJlKX1mdW5jdGlvbiB0YShpYSxuYSx6YSl7emE/KGEudGV4UGFyYW1ldGVyaShpYSwxMDI0Mix2LmNvbnZlcnQobmEud3JhcFMpKSxhLnRleFBhcmFtZXRlcmkoaWEsMTAyNDMsdi5jb252ZXJ0KG5hLndyYXBUKSksMzI4NzkhPT1pYSYmMzU4NjYhPT1pYXx8YS50ZXhQYXJhbWV0ZXJpKGlhLDMyODgyLHYuY29udmVydChuYS53cmFwUikpLGEudGV4UGFyYW1ldGVyaShpYSwxMDI0MCx2LmNvbnZlcnQobmEubWFnRmlsdGVyKSksYS50ZXhQYXJhbWV0ZXJpKGlhLAoxMDI0MSx2LmNvbnZlcnQobmEubWluRmlsdGVyKSkpOihhLnRleFBhcmFtZXRlcmkoaWEsMTAyNDIsMzMwNzEpLGEudGV4UGFyYW1ldGVyaShpYSwxMDI0MywzMzA3MSksMzI4NzkhPT1pYSYmMzU4NjYhPT1pYXx8YS50ZXhQYXJhbWV0ZXJpKGlhLDMyODgyLDMzMDcxKSwxMDAxPT09bmEud3JhcFMmJjEwMDE9PT1uYS53cmFwVHx8Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGlzIG5vdCBwb3dlciBvZiB0d28uIFRleHR1cmUud3JhcFMgYW5kIFRleHR1cmUud3JhcFQgc2hvdWxkIGJlIHNldCB0byBUSFJFRS5DbGFtcFRvRWRnZVdyYXBwaW5nLiIpLGEudGV4UGFyYW1ldGVyaShpYSwxMDI0MCxXKG5hLm1hZ0ZpbHRlcikpLGEudGV4UGFyYW1ldGVyaShpYSwxMDI0MSxXKG5hLm1pbkZpbHRlcikpLDEwMDMhPT1uYS5taW5GaWx0ZXImJjEwMDYhPT1uYS5taW5GaWx0ZXImJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLm1pbkZpbHRlciBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLk5lYXJlc3RGaWx0ZXIgb3IgVEhSRUUuTGluZWFyRmlsdGVyLiIpKTsKISh6YT1jLmdldCgiRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIikpfHwxMDE1PT09bmEudHlwZSYmbnVsbD09PWMuZ2V0KCJPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXIiKXx8MTAxNj09PW5hLnR5cGUmJm51bGw9PT0oci5pc1dlYkdMMnx8Yy5nZXQoIk9FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyIikpfHwhKDE8bmEuYW5pc290cm9weXx8Zy5nZXQobmEpLl9fY3VycmVudEFuaXNvdHJvcHkpfHwoYS50ZXhQYXJhbWV0ZXJmKGlhLHphLlRFWFRVUkVfTUFYX0FOSVNPVFJPUFlfRVhULE1hdGgubWluKG5hLmFuaXNvdHJvcHksci5nZXRNYXhBbmlzb3Ryb3B5KCkpKSxnLmdldChuYSkuX19jdXJyZW50QW5pc290cm9weT1uYS5hbmlzb3Ryb3B5KX1mdW5jdGlvbiBCYShpYSxuYSl7dm9pZCAwPT09aWEuX193ZWJnbEluaXQmJihpYS5fX3dlYmdsSW5pdD0hMCxuYS5hZGRFdmVudExpc3RlbmVyKCJkaXNwb3NlIixoYSksaWEuX193ZWJnbFRleHR1cmU9YS5jcmVhdGVUZXh0dXJlKCksCnoubWVtb3J5LnRleHR1cmVzKyspfWZ1bmN0aW9uIFRhKGlhLG5hLHphKXt2YXIgSmE9MzU1MztuYS5pc0RhdGFUZXh0dXJlMkRBcnJheSYmKEphPTM1ODY2KTtuYS5pc0RhdGFUZXh0dXJlM0QmJihKYT0zMjg3OSk7QmEoaWEsbmEpO2UuYWN0aXZlVGV4dHVyZSgzMzk4NCt6YSk7ZS5iaW5kVGV4dHVyZShKYSxpYS5fX3dlYmdsVGV4dHVyZSk7YS5waXhlbFN0b3JlaSgzNzQ0MCxuYS5mbGlwWSk7YS5waXhlbFN0b3JlaSgzNzQ0MSxuYS5wcmVtdWx0aXBseUFscGhhKTthLnBpeGVsU3RvcmVpKDMzMTcsbmEudW5wYWNrQWxpZ25tZW50KTt6YT1QKG5hKSYmITE9PT1KKG5hLmltYWdlKTt6YT1GKG5hLmltYWdlLHphLCExLHIubWF4VGV4dHVyZVNpemUpO3ZhciBZYT1KKHphKXx8ci5pc1dlYkdMMixOYT12LmNvbnZlcnQobmEuZm9ybWF0KSxjYj12LmNvbnZlcnQobmEudHlwZSksamE9VihOYSxjYik7dGEoSmEsbmEsWWEpO3ZhciBHYT1uYS5taXBtYXBzO2lmKG5hLmlzRGVwdGhUZXh0dXJlKXtqYT0KNjQwMjtpZigxMDE1PT09bmEudHlwZSl7aWYoIXIuaXNXZWJHTDIpdGhyb3cgRXJyb3IoIkZsb2F0IERlcHRoIFRleHR1cmUgb25seSBzdXBwb3J0ZWQgaW4gV2ViR0wyLjAiKTtqYT0zNjAxMn1lbHNlIHIuaXNXZWJHTDImJihqYT0zMzE4OSk7MTAyNj09PW5hLmZvcm1hdCYmNjQwMj09PWphJiYxMDEyIT09bmEudHlwZSYmMTAxNCE9PW5hLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZFNob3J0VHlwZSBvciBVbnNpZ25lZEludFR5cGUgZm9yIERlcHRoRm9ybWF0IERlcHRoVGV4dHVyZS4iKSxuYS50eXBlPTEwMTIsY2I9di5jb252ZXJ0KG5hLnR5cGUpKTsxMDI3PT09bmEuZm9ybWF0JiYoamE9MzQwNDEsMTAyMCE9PW5hLnR5cGUmJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IFVzZSBVbnNpZ25lZEludDI0OFR5cGUgZm9yIERlcHRoU3RlbmNpbEZvcm1hdCBEZXB0aFRleHR1cmUuIiksbmEudHlwZT0xMDIwLGNiPQp2LmNvbnZlcnQobmEudHlwZSkpKTtlLnRleEltYWdlMkQoMzU1MywwLGphLHphLndpZHRoLHphLmhlaWdodCwwLE5hLGNiLG51bGwpfWVsc2UgaWYobmEuaXNEYXRhVGV4dHVyZSlpZigwPEdhLmxlbmd0aCYmWWEpe2Zvcih2YXIgTGE9MCxuYj1HYS5sZW5ndGg7TGE8bmI7TGErKylKYT1HYVtMYV0sZS50ZXhJbWFnZTJEKDM1NTMsTGEsamEsSmEud2lkdGgsSmEuaGVpZ2h0LDAsTmEsY2IsSmEuZGF0YSk7bmEuZ2VuZXJhdGVNaXBtYXBzPSExO2lhLl9fbWF4TWlwTGV2ZWw9R2EubGVuZ3RoLTF9ZWxzZSBlLnRleEltYWdlMkQoMzU1MywwLGphLHphLndpZHRoLHphLmhlaWdodCwwLE5hLGNiLHphLmRhdGEpLGlhLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKG5hLmlzQ29tcHJlc3NlZFRleHR1cmUpe0xhPTA7Zm9yKG5iPUdhLmxlbmd0aDtMYTxuYjtMYSsrKUphPUdhW0xhXSwxMDIzIT09bmEuZm9ybWF0JiYxMDIyIT09bmEuZm9ybWF0Py0xPGUuZ2V0Q29tcHJlc3NlZFRleHR1cmVGb3JtYXRzKCkuaW5kZXhPZihOYSk/CmUuY29tcHJlc3NlZFRleEltYWdlMkQoMzU1MyxMYSxqYSxKYS53aWR0aCxKYS5oZWlnaHQsMCxKYS5kYXRhKTpjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IEF0dGVtcHQgdG8gbG9hZCB1bnN1cHBvcnRlZCBjb21wcmVzc2VkIHRleHR1cmUgZm9ybWF0IGluIC51cGxvYWRUZXh0dXJlKCkiKTplLnRleEltYWdlMkQoMzU1MyxMYSxqYSxKYS53aWR0aCxKYS5oZWlnaHQsMCxOYSxjYixKYS5kYXRhKTtpYS5fX21heE1pcExldmVsPUdhLmxlbmd0aC0xfWVsc2UgaWYobmEuaXNEYXRhVGV4dHVyZTJEQXJyYXkpZS50ZXhJbWFnZTNEKDM1ODY2LDAsamEsemEud2lkdGgsemEuaGVpZ2h0LHphLmRlcHRoLDAsTmEsY2IsemEuZGF0YSksaWEuX19tYXhNaXBMZXZlbD0wO2Vsc2UgaWYobmEuaXNEYXRhVGV4dHVyZTNEKWUudGV4SW1hZ2UzRCgzMjg3OSwwLGphLHphLndpZHRoLHphLmhlaWdodCx6YS5kZXB0aCwwLE5hLGNiLHphLmRhdGEpLGlhLl9fbWF4TWlwTGV2ZWw9MDtlbHNlIGlmKDA8CkdhLmxlbmd0aCYmWWEpe0xhPTA7Zm9yKG5iPUdhLmxlbmd0aDtMYTxuYjtMYSsrKUphPUdhW0xhXSxlLnRleEltYWdlMkQoMzU1MyxMYSxqYSxOYSxjYixKYSk7bmEuZ2VuZXJhdGVNaXBtYXBzPSExO2lhLl9fbWF4TWlwTGV2ZWw9R2EubGVuZ3RoLTF9ZWxzZSBlLnRleEltYWdlMkQoMzU1MywwLGphLE5hLGNiLHphKSxpYS5fX21heE1pcExldmVsPTA7UihuYSxZYSkmJlMoMzU1MyxuYSx6YS53aWR0aCx6YS5oZWlnaHQpO2lhLl9fdmVyc2lvbj1uYS52ZXJzaW9uO2lmKG5hLm9uVXBkYXRlKW5hLm9uVXBkYXRlKG5hKX1mdW5jdGlvbiBVYShpYSxuYSx6YSxKYSl7dmFyIFlhPXYuY29udmVydChuYS50ZXh0dXJlLmZvcm1hdCksTmE9di5jb252ZXJ0KG5hLnRleHR1cmUudHlwZSksY2I9VihZYSxOYSk7ZS50ZXhJbWFnZTJEKEphLDAsY2IsbmEud2lkdGgsbmEuaGVpZ2h0LDAsWWEsTmEsbnVsbCk7YS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaWEpO2EuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsCnphLEphLGcuZ2V0KG5hLnRleHR1cmUpLl9fd2ViZ2xUZXh0dXJlLDApO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWZ1bmN0aW9uIENhKGlhLG5hLHphKXthLmJpbmRSZW5kZXJidWZmZXIoMzYxNjEsaWEpO2lmKG5hLmRlcHRoQnVmZmVyJiYhbmEuc3RlbmNpbEJ1ZmZlcil6YT8oemE9TWEobmEpLGEucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHphLDMzMTg5LG5hLndpZHRoLG5hLmhlaWdodCkpOmEucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSwzMzE4OSxuYS53aWR0aCxuYS5oZWlnaHQpLGEuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoMzYxNjAsMzYwOTYsMzYxNjEsaWEpO2Vsc2UgaWYobmEuZGVwdGhCdWZmZXImJm5hLnN0ZW5jaWxCdWZmZXIpemE/KHphPU1hKG5hKSxhLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSx6YSwzNTA1NixuYS53aWR0aCxuYS5oZWlnaHQpKTphLnJlbmRlcmJ1ZmZlclN0b3JhZ2UoMzYxNjEsMzQwNDEsCm5hLndpZHRoLG5hLmhlaWdodCksYS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzMzMwNiwzNjE2MSxpYSk7ZWxzZXtpYT12LmNvbnZlcnQobmEudGV4dHVyZS5mb3JtYXQpO3ZhciBKYT12LmNvbnZlcnQobmEudGV4dHVyZS50eXBlKTtpYT1WKGlhLEphKTt6YT8oemE9TWEobmEpLGEucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKDM2MTYxLHphLGlhLG5hLndpZHRoLG5hLmhlaWdodCkpOmEucmVuZGVyYnVmZmVyU3RvcmFnZSgzNjE2MSxpYSxuYS53aWR0aCxuYS5oZWlnaHQpfWEuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKX1mdW5jdGlvbiBIYShpYSxuYSl7aWYobmEmJm5hLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlKXRocm93IEVycm9yKCJEZXB0aCBUZXh0dXJlIHdpdGggY3ViZSByZW5kZXIgdGFyZ2V0cyBpcyBub3Qgc3VwcG9ydGVkIik7YS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsaWEpO2lmKCFuYS5kZXB0aFRleHR1cmV8fCFuYS5kZXB0aFRleHR1cmUuaXNEZXB0aFRleHR1cmUpdGhyb3cgRXJyb3IoInJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUiKTsKZy5nZXQobmEuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZSYmbmEuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoPT09bmEud2lkdGgmJm5hLmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQ9PT1uYS5oZWlnaHR8fChuYS5kZXB0aFRleHR1cmUuaW1hZ2Uud2lkdGg9bmEud2lkdGgsbmEuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodD1uYS5oZWlnaHQsbmEuZGVwdGhUZXh0dXJlLm5lZWRzVXBkYXRlPSEwKTtxYShuYS5kZXB0aFRleHR1cmUsMCk7aWE9Zy5nZXQobmEuZGVwdGhUZXh0dXJlKS5fX3dlYmdsVGV4dHVyZTtpZigxMDI2PT09bmEuZGVwdGhUZXh0dXJlLmZvcm1hdClhLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDM2MDk2LDM1NTMsaWEsMCk7ZWxzZSBpZigxMDI3PT09bmEuZGVwdGhUZXh0dXJlLmZvcm1hdClhLmZyYW1lYnVmZmVyVGV4dHVyZTJEKDM2MTYwLDMzMzA2LDM1NTMsaWEsMCk7ZWxzZSB0aHJvdyBFcnJvcigiVW5rbm93biBkZXB0aFRleHR1cmUgZm9ybWF0Iik7Cn1mdW5jdGlvbiBEYShpYSl7dmFyIG5hPWcuZ2V0KGlhKSx6YT0hMD09PWlhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlO2lmKGlhLmRlcHRoVGV4dHVyZSl7aWYoemEpdGhyb3cgRXJyb3IoInRhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzIik7SGEobmEuX193ZWJnbEZyYW1lYnVmZmVyLGlhKX1lbHNlIGlmKHphKWZvcihuYS5fX3dlYmdsRGVwdGhidWZmZXI9W10semE9MDs2PnphO3phKyspYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbmEuX193ZWJnbEZyYW1lYnVmZmVyW3phXSksbmEuX193ZWJnbERlcHRoYnVmZmVyW3phXT1hLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLENhKG5hLl9fd2ViZ2xEZXB0aGJ1ZmZlclt6YV0saWEpO2Vsc2UgYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsbmEuX193ZWJnbEZyYW1lYnVmZmVyKSxuYS5fX3dlYmdsRGVwdGhidWZmZXI9YS5jcmVhdGVSZW5kZXJidWZmZXIoKSxDYShuYS5fX3dlYmdsRGVwdGhidWZmZXIsCmlhKTthLmJpbmRGcmFtZWJ1ZmZlcigzNjE2MCxudWxsKX1mdW5jdGlvbiBNYShpYSl7cmV0dXJuIHIuaXNXZWJHTDImJmlhLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD9NYXRoLm1pbihyLm1heFNhbXBsZXMsaWEuc2FtcGxlcyk6MH1mdW5jdGlvbiBkYihpYSl7dmFyIG5hPXoucmVuZGVyLmZyYW1lO3RiLmdldChpYSkhPT1uYSYmKHRiLnNldChpYSxuYSksaWEudXBkYXRlKCkpfXZhciB0Yj1uZXcgV2Vha01hcCxLYSxiYj0idW5kZWZpbmVkIiE9PXR5cGVvZiBPZmZzY3JlZW5DYW52YXMsamI9MCxFYj0hMSx4Yj0hMTt0aGlzLmFsbG9jYXRlVGV4dHVyZVVuaXQ9ZnVuY3Rpb24oKXt2YXIgaWE9amI7aWE+PXIubWF4VGV4dHVyZXMmJmNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xUZXh0dXJlczogVHJ5aW5nIHRvIHVzZSAiK2lhKyIgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICIrci5tYXhUZXh0dXJlcyk7amIrPTE7cmV0dXJuIGlhfTt0aGlzLnJlc2V0VGV4dHVyZVVuaXRzPQpmdW5jdGlvbigpe2piPTB9O3RoaXMuc2V0VGV4dHVyZTJEPXFhO3RoaXMuc2V0VGV4dHVyZTJEQXJyYXk9ZnVuY3Rpb24oaWEsbmEpe3ZhciB6YT1nLmdldChpYSk7MDxpYS52ZXJzaW9uJiZ6YS5fX3ZlcnNpb24hPT1pYS52ZXJzaW9uP1RhKHphLGlhLG5hKTooZS5hY3RpdmVUZXh0dXJlKDMzOTg0K25hKSxlLmJpbmRUZXh0dXJlKDM1ODY2LHphLl9fd2ViZ2xUZXh0dXJlKSl9O3RoaXMuc2V0VGV4dHVyZTNEPWZ1bmN0aW9uKGlhLG5hKXt2YXIgemE9Zy5nZXQoaWEpOzA8aWEudmVyc2lvbiYmemEuX192ZXJzaW9uIT09aWEudmVyc2lvbj9UYSh6YSxpYSxuYSk6KGUuYWN0aXZlVGV4dHVyZSgzMzk4NCtuYSksZS5iaW5kVGV4dHVyZSgzMjg3OSx6YS5fX3dlYmdsVGV4dHVyZSkpfTt0aGlzLnNldFRleHR1cmVDdWJlPXVhO3RoaXMuc2V0VGV4dHVyZUN1YmVEeW5hbWljPW9hO3RoaXMuc2V0dXBSZW5kZXJUYXJnZXQ9ZnVuY3Rpb24oaWEpe3ZhciBuYT1nLmdldChpYSksemE9Zy5nZXQoaWEudGV4dHVyZSk7CmlhLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLGZhKTt6YS5fX3dlYmdsVGV4dHVyZT1hLmNyZWF0ZVRleHR1cmUoKTt6Lm1lbW9yeS50ZXh0dXJlcysrO3ZhciBKYT0hMD09PWlhLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlLFlhPSEwPT09aWEuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0LE5hPUooaWEpfHxyLmlzV2ViR0wyO2lmKEphKWZvcihuYS5fX3dlYmdsRnJhbWVidWZmZXI9W10sWWE9MDs2PllhO1lhKyspbmEuX193ZWJnbEZyYW1lYnVmZmVyW1lhXT1hLmNyZWF0ZUZyYW1lYnVmZmVyKCk7ZWxzZSBpZihuYS5fX3dlYmdsRnJhbWVidWZmZXI9YS5jcmVhdGVGcmFtZWJ1ZmZlcigpLFlhKWlmKHIuaXNXZWJHTDIpe25hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcj1hLmNyZWF0ZUZyYW1lYnVmZmVyKCk7bmEuX193ZWJnbENvbG9yUmVuZGVyYnVmZmVyPWEuY3JlYXRlUmVuZGVyYnVmZmVyKCk7YS5iaW5kUmVuZGVyYnVmZmVyKDM2MTYxLG5hLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlcik7CllhPXYuY29udmVydChpYS50ZXh0dXJlLmZvcm1hdCk7dmFyIGNiPXYuY29udmVydChpYS50ZXh0dXJlLnR5cGUpO1lhPVYoWWEsY2IpO2NiPU1hKGlhKTthLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSgzNjE2MSxjYixZYSxpYS53aWR0aCxpYS5oZWlnaHQpO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG5hLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlcik7YS5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlcigzNjE2MCwzNjA2NCwzNjE2MSxuYS5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIpO2EuYmluZFJlbmRlcmJ1ZmZlcigzNjE2MSxudWxsKTtpYS5kZXB0aEJ1ZmZlciYmKG5hLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcj1hLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpLENhKG5hLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlcixpYSwhMCkpO2EuYmluZEZyYW1lYnVmZmVyKDM2MTYwLG51bGwpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIik7CmlmKEphKXtlLmJpbmRUZXh0dXJlKDM0MDY3LHphLl9fd2ViZ2xUZXh0dXJlKTt0YSgzNDA2NyxpYS50ZXh0dXJlLE5hKTtmb3IoWWE9MDs2PllhO1lhKyspVWEobmEuX193ZWJnbEZyYW1lYnVmZmVyW1lhXSxpYSwzNjA2NCwzNDA2OStZYSk7UihpYS50ZXh0dXJlLE5hKSYmUygzNDA2NyxpYS50ZXh0dXJlLGlhLndpZHRoLGlhLmhlaWdodCk7ZS5iaW5kVGV4dHVyZSgzNDA2NyxudWxsKX1lbHNlIGUuYmluZFRleHR1cmUoMzU1Myx6YS5fX3dlYmdsVGV4dHVyZSksdGEoMzU1MyxpYS50ZXh0dXJlLE5hKSxVYShuYS5fX3dlYmdsRnJhbWVidWZmZXIsaWEsMzYwNjQsMzU1MyksUihpYS50ZXh0dXJlLE5hKSYmUygzNTUzLGlhLnRleHR1cmUsaWEud2lkdGgsaWEuaGVpZ2h0KSxlLmJpbmRUZXh0dXJlKDM1NTMsbnVsbCk7aWEuZGVwdGhCdWZmZXImJkRhKGlhKX07dGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA9ZnVuY3Rpb24oaWEpe3ZhciBuYT1pYS50ZXh0dXJlLHphPUooaWEpfHwKci5pc1dlYkdMMjtpZihSKG5hLHphKSl7emE9aWEuaXNXZWJHTFJlbmRlclRhcmdldEN1YmU/MzQwNjc6MzU1Mzt2YXIgSmE9Zy5nZXQobmEpLl9fd2ViZ2xUZXh0dXJlO2UuYmluZFRleHR1cmUoemEsSmEpO1MoemEsbmEsaWEud2lkdGgsaWEuaGVpZ2h0KTtlLmJpbmRUZXh0dXJlKHphLG51bGwpfX07dGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldD1mdW5jdGlvbihpYSl7aWYoaWEuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KWlmKHIuaXNXZWJHTDIpe3ZhciBuYT1nLmdldChpYSk7YS5iaW5kRnJhbWVidWZmZXIoMzYwMDgsbmEuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyKTthLmJpbmRGcmFtZWJ1ZmZlcigzNjAwOSxuYS5fX3dlYmdsRnJhbWVidWZmZXIpO25hPWlhLndpZHRoO3ZhciB6YT1pYS5oZWlnaHQsSmE9MTYzODQ7aWEuZGVwdGhCdWZmZXImJihKYXw9MjU2KTtpYS5zdGVuY2lsQnVmZmVyJiYoSmF8PTEwMjQpO2EuYmxpdEZyYW1lYnVmZmVyKDAsCjAsbmEsemEsMCwwLG5hLHphLEphLDk3MjgpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuIil9O3RoaXMuc2FmZVNldFRleHR1cmUyRD1mdW5jdGlvbihpYSxuYSl7aWEmJmlhLmlzV2ViR0xSZW5kZXJUYXJnZXQmJighMT09PUViJiYoY29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFRleHR1cmVzLnNhZmVTZXRUZXh0dXJlMkQ6IGRvbid0IHVzZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksRWI9ITApLGlhPWlhLnRleHR1cmUpO3FhKGlhLG5hKX07dGhpcy5zYWZlU2V0VGV4dHVyZUN1YmU9ZnVuY3Rpb24oaWEsbmEpe2lhJiZpYS5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSYmKCExPT09eGImJihjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMVGV4dHVyZXMuc2FmZVNldFRleHR1cmVDdWJlOiBkb24ndCB1c2UgY3ViZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiksCnhiPSEwKSxpYT1pYS50ZXh0dXJlKTtpYSYmaWEuaXNDdWJlVGV4dHVyZXx8QXJyYXkuaXNBcnJheShpYS5pbWFnZSkmJjY9PT1pYS5pbWFnZS5sZW5ndGg/dWEoaWEsbmEpOm9hKGlhLG5hKX19ZnVuY3Rpb24gd2ooYSxjLGUpe3JldHVybntjb252ZXJ0OmZ1bmN0aW9uKGcpe2lmKDFFMz09PWcpcmV0dXJuIDEwNDk3O2lmKDEwMDE9PT1nKXJldHVybiAzMzA3MTtpZigxMDAyPT09ZylyZXR1cm4gMzM2NDg7aWYoMTAwMz09PWcpcmV0dXJuIDk3Mjg7aWYoMTAwND09PWcpcmV0dXJuIDk5ODQ7aWYoMTAwNT09PWcpcmV0dXJuIDk5ODY7aWYoMTAwNj09PWcpcmV0dXJuIDk3Mjk7aWYoMTAwNz09PWcpcmV0dXJuIDk5ODU7aWYoMTAwOD09PWcpcmV0dXJuIDk5ODc7aWYoMTAwOT09PWcpcmV0dXJuIDUxMjE7aWYoMTAxNz09PWcpcmV0dXJuIDMyODE5O2lmKDEwMTg9PT1nKXJldHVybiAzMjgyMDtpZigxMDE5PT09ZylyZXR1cm4gMzM2MzU7aWYoMTAxMD09PWcpcmV0dXJuIDUxMjA7aWYoMTAxMT09PQpnKXJldHVybiA1MTIyO2lmKDEwMTI9PT1nKXJldHVybiA1MTIzO2lmKDEwMTM9PT1nKXJldHVybiA1MTI0O2lmKDEwMTQ9PT1nKXJldHVybiA1MTI1O2lmKDEwMTU9PT1nKXJldHVybiA1MTI2O2lmKDEwMTY9PT1nKXtpZihlLmlzV2ViR0wyKXJldHVybiA1MTMxO3ZhciByPWMuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0Iik7aWYobnVsbCE9PXIpcmV0dXJuIHIuSEFMRl9GTE9BVF9PRVN9aWYoMTAyMT09PWcpcmV0dXJuIDY0MDY7aWYoMTAyMj09PWcpcmV0dXJuIDY0MDc7aWYoMTAyMz09PWcpcmV0dXJuIDY0MDg7aWYoMTAyND09PWcpcmV0dXJuIDY0MDk7aWYoMTAyNT09PWcpcmV0dXJuIDY0MTA7aWYoMTAyNj09PWcpcmV0dXJuIDY0MDI7aWYoMTAyNz09PWcpcmV0dXJuIDM0MDQxO2lmKDEwMjg9PT1nKXJldHVybiA2NDAzO2lmKDEwMD09PWcpcmV0dXJuIDMyNzc0O2lmKDEwMT09PWcpcmV0dXJuIDMyNzc4O2lmKDEwMj09PWcpcmV0dXJuIDMyNzc5O2lmKDIwMD09PWcpcmV0dXJuIDA7CmlmKDIwMT09PWcpcmV0dXJuIDE7aWYoMjAyPT09ZylyZXR1cm4gNzY4O2lmKDIwMz09PWcpcmV0dXJuIDc2OTtpZigyMDQ9PT1nKXJldHVybiA3NzA7aWYoMjA1PT09ZylyZXR1cm4gNzcxO2lmKDIwNj09PWcpcmV0dXJuIDc3MjtpZigyMDc9PT1nKXJldHVybiA3NzM7aWYoMjA4PT09ZylyZXR1cm4gNzc0O2lmKDIwOT09PWcpcmV0dXJuIDc3NTtpZigyMTA9PT1nKXJldHVybiA3NzY7aWYoMzM3NzY9PT1nfHwzMzc3Nz09PWd8fDMzNzc4PT09Z3x8MzM3Nzk9PT1nKWlmKHI9Yy5nZXQoIldFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjIiksbnVsbCE9PXIpe2lmKDMzNzc2PT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQl9TM1RDX0RYVDFfRVhUO2lmKDMzNzc3PT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQxX0VYVDtpZigzMzc3OD09PWcpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUM19FWFQ7aWYoMzM3Nzk9PT1nKXJldHVybiByLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDVfRVhUfWlmKDM1ODQwPT09Cmd8fDM1ODQxPT09Z3x8MzU4NDI9PT1nfHwzNTg0Mz09PWcpaWYocj1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIiksbnVsbCE9PXIpe2lmKDM1ODQwPT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQl9QVlJUQ180QlBQVjFfSU1HO2lmKDM1ODQxPT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HO2lmKDM1ODQyPT09ZylyZXR1cm4gci5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRztpZigzNTg0Mz09PWcpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUd9aWYoMzYxOTY9PT1nJiYocj1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2V0YzEiKSxudWxsIT09cikpcmV0dXJuIHIuQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDtpZigzNzgwOD09PWd8fDM3ODA5PT09Z3x8Mzc4MTA9PT1nfHwzNzgxMT09PWd8fDM3ODEyPT09Z3x8Mzc4MTM9PT1nfHwzNzgxND09PWd8fDM3ODE1PT09Z3x8Mzc4MTY9PT0KZ3x8Mzc4MTc9PT1nfHwzNzgxOD09PWd8fDM3ODE5PT09Z3x8Mzc4MjA9PT1nfHwzNzgyMT09PWcpaWYocj1jLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMiKSxudWxsIT09cilyZXR1cm4gZztpZigxMDM9PT1nfHwxMDQ9PT1nKXtpZihlLmlzV2ViR0wyKXtpZigxMDM9PT1nKXJldHVybiAzMjc3NTtpZigxMDQ9PT1nKXJldHVybiAzMjc3Nn1yPWMuZ2V0KCJFWFRfYmxlbmRfbWlubWF4Iik7aWYobnVsbCE9PXIpe2lmKDEwMz09PWcpcmV0dXJuIHIuTUlOX0VYVDtpZigxMDQ9PT1nKXJldHVybiByLk1BWF9FWFR9fWlmKDEwMjA9PT1nKXtpZihlLmlzV2ViR0wyKXJldHVybiAzNDA0MjtyPWMuZ2V0KCJXRUJHTF9kZXB0aF90ZXh0dXJlIik7aWYobnVsbCE9PXIpcmV0dXJuIHIuVU5TSUdORURfSU5UXzI0XzhfV0VCR0x9cmV0dXJuIDB9fX1mdW5jdGlvbiB1ZSgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ikdyb3VwIn1mdW5jdGlvbiB2ZihhKXt2Yi5jYWxsKHRoaXMpOwp0aGlzLmNhbWVyYXM9YXx8W119ZnVuY3Rpb24geGooYSxjLGUpe3lqLnNldEZyb21NYXRyaXhQb3NpdGlvbihjLm1hdHJpeFdvcmxkKTt6ai5zZXRGcm9tTWF0cml4UG9zaXRpb24oZS5tYXRyaXhXb3JsZCk7dmFyIGc9eWouZGlzdGFuY2VUbyh6aikscj1jLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsdj1lLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHMsej1yWzE0XS8oclsxMF0tMSk7ZT1yWzE0XS8oclsxMF0rMSk7dmFyIEU9KHJbOV0rMSkvcls1XSxGPShyWzldLTEpL3JbNV0sSj0ocls4XS0xKS9yWzBdLFA9KHZbOF0rMSkvdlswXTtyPXoqSjt2PXoqUDtQPWcvKC1KK1ApO0o9UCotSjtjLm1hdHJpeFdvcmxkLmRlY29tcG9zZShhLnBvc2l0aW9uLGEucXVhdGVybmlvbixhLnNjYWxlKTthLnRyYW5zbGF0ZVgoSik7YS50cmFuc2xhdGVaKFApO2EubWF0cml4V29ybGQuY29tcG9zZShhLnBvc2l0aW9uLGEucXVhdGVybmlvbixhLnNjYWxlKTthLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKGEubWF0cml4V29ybGQpOwpjPXorUDt6PWUrUDthLnByb2plY3Rpb25NYXRyaXgubWFrZVBlcnNwZWN0aXZlKHItSix2KyhnLUopLEUqZS96KmMsRiplL3oqYyxjLHopfWZ1bmN0aW9uIE5oKGEpe2Z1bmN0aW9uIGMoKXtyZXR1cm4gbnVsbCE9PUomJiEwPT09Si5pc1ByZXNlbnRpbmd9ZnVuY3Rpb24gZSgpe2lmKGMoKSl7dmFyIEhhPUouZ2V0RXllUGFyYW1ldGVycygibGVmdCIpO3o9MipIYS5yZW5kZXJXaWR0aCpoYTtFPUhhLnJlbmRlckhlaWdodCpoYTtUYT1hLmdldFBpeGVsUmF0aW8oKTthLmdldFNpemUoQmEpO2Euc2V0RHJhd2luZ0J1ZmZlclNpemUoeixFLDEpO3VhLnZpZXdwb3J0LnNldCgwLDAsei8yLEUpO29hLnZpZXdwb3J0LnNldCh6LzIsMCx6LzIsRSk7Q2Euc3RhcnQoKTtGLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25zdGFydCJ9KX1lbHNlIEYuZW5hYmxlZCYmYS5zZXREcmF3aW5nQnVmZmVyU2l6ZShCYS53aWR0aCxCYS5oZWlnaHQsVGEpLENhLnN0b3AoKSxGLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9CmZ1bmN0aW9uIGcoSGEpe2Zvcih2YXIgRGE9bmF2aWdhdG9yLmdldEdhbWVwYWRzJiZuYXZpZ2F0b3IuZ2V0R2FtZXBhZHMoKSxNYT0wLGRiPTAsdGI9RGEubGVuZ3RoO01hPHRiO01hKyspe3ZhciBLYT1EYVtNYV07aWYoS2EmJigiRGF5ZHJlYW0gQ29udHJvbGxlciI9PT1LYS5pZHx8IkdlYXIgVlIgQ29udHJvbGxlciI9PT1LYS5pZHx8Ik9jdWx1cyBHbyBDb250cm9sbGVyIj09PUthLmlkfHwiT3BlblZSIEdhbWVwYWQiPT09S2EuaWR8fEthLmlkLnN0YXJ0c1dpdGgoIk9jdWx1cyBUb3VjaCIpfHxLYS5pZC5zdGFydHNXaXRoKCJIVEMgVml2ZSBGb2N1cyIpfHxLYS5pZC5zdGFydHNXaXRoKCJTcGF0aWFsIENvbnRyb2xsZXIiKSkpe2lmKGRiPT09SGEpcmV0dXJuIEthO2RiKyt9fX1mdW5jdGlvbiByKCl7Zm9yKHZhciBIYT0wO0hhPFMubGVuZ3RoO0hhKyspe3ZhciBEYT1TW0hhXSxNYT1nKEhhKTtpZih2b2lkIDAhPT1NYSYmdm9pZCAwIT09TWEucG9zZSl7aWYobnVsbD09PU1hLnBvc2UpYnJlYWs7CnZhciBkYj1NYS5wb3NlOyExPT09ZGIuaGFzUG9zaXRpb24mJkRhLnBvc2l0aW9uLnNldCguMiwtLjYsLS4wNSk7bnVsbCE9PWRiLnBvc2l0aW9uJiZEYS5wb3NpdGlvbi5mcm9tQXJyYXkoZGIucG9zaXRpb24pO251bGwhPT1kYi5vcmllbnRhdGlvbiYmRGEucXVhdGVybmlvbi5mcm9tQXJyYXkoZGIub3JpZW50YXRpb24pO0RhLm1hdHJpeC5jb21wb3NlKERhLnBvc2l0aW9uLERhLnF1YXRlcm5pb24sRGEuc2NhbGUpO0RhLm1hdHJpeC5wcmVtdWx0aXBseShWKTtEYS5tYXRyaXguZGVjb21wb3NlKERhLnBvc2l0aW9uLERhLnF1YXRlcm5pb24sRGEuc2NhbGUpO0RhLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGU9ITA7RGEudmlzaWJsZT0hMDtkYj0iRGF5ZHJlYW0gQ29udHJvbGxlciI9PT1NYS5pZD8wOjE7dm9pZCAwPT09VWFbSGFdJiYoVWFbSGFdPSExKTtVYVtIYV0hPT1NYS5idXR0b25zW2RiXS5wcmVzc2VkJiYoVWFbSGFdPU1hLmJ1dHRvbnNbZGJdLnByZXNzZWQsITA9PT1VYVtIYV0/CkRhLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlbGVjdHN0YXJ0In0pOihEYS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZWxlY3RlbmQifSksRGEuZGlzcGF0Y2hFdmVudCh7dHlwZToic2VsZWN0In0pKSl9ZWxzZSBEYS52aXNpYmxlPSExfX1mdW5jdGlvbiB2KEhhLERhKXtudWxsIT09RGEmJjQ9PT1EYS5sZW5ndGgmJkhhLnNldChEYVswXSp6LERhWzFdKkUsRGFbMl0qeixEYVszXSpFKX12YXIgeixFLEY9dGhpcyxKPW51bGwsUD1udWxsLFI9bnVsbCxTPVtdLFY9bmV3IHEsVz1uZXcgcSxoYT0xLGZhPSJsb2NhbC1mbG9vciI7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93JiYiVlJGcmFtZURhdGEiaW4gd2luZG93JiYoUD1uZXcgd2luZG93LlZSRnJhbWVEYXRhLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIixlLCExKSk7dmFyIHJhPW5ldyBxLHBhPW5ldyBoLHFhPW5ldyBrLHVhPW5ldyB2Yjt1YS52aWV3cG9ydD1uZXcgcDt1YS5sYXllcnMuZW5hYmxlKDEpOwp2YXIgb2E9bmV3IHZiO29hLnZpZXdwb3J0PW5ldyBwO29hLmxheWVycy5lbmFibGUoMik7dmFyIHRhPW5ldyB2ZihbdWEsb2FdKTt0YS5sYXllcnMuZW5hYmxlKDEpO3RhLmxheWVycy5lbmFibGUoMik7dmFyIEJhPW5ldyBmLFRhLFVhPVtdO3RoaXMuZW5hYmxlZD0hMTt0aGlzLmdldENvbnRyb2xsZXI9ZnVuY3Rpb24oSGEpe3ZhciBEYT1TW0hhXTt2b2lkIDA9PT1EYSYmKERhPW5ldyB1ZSxEYS5tYXRyaXhBdXRvVXBkYXRlPSExLERhLnZpc2libGU9ITEsU1tIYV09RGEpO3JldHVybiBEYX07dGhpcy5nZXREZXZpY2U9ZnVuY3Rpb24oKXtyZXR1cm4gSn07dGhpcy5zZXREZXZpY2U9ZnVuY3Rpb24oSGEpe3ZvaWQgMCE9PUhhJiYoSj1IYSk7Q2Euc2V0Q29udGV4dChIYSl9O3RoaXMuc2V0RnJhbWVidWZmZXJTY2FsZUZhY3Rvcj1mdW5jdGlvbihIYSl7aGE9SGF9O3RoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKEhhKXtmYT1IYX07dGhpcy5zZXRQb3NlVGFyZ2V0PWZ1bmN0aW9uKEhhKXt2b2lkIDAhPT0KSGEmJihSPUhhKX07dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24oSGEpe3ZhciBEYT0ibG9jYWwtZmxvb3IiPT09ZmE/MS42OjA7aWYoITE9PT1jKCkpcmV0dXJuIEhhLnBvc2l0aW9uLnNldCgwLERhLDApLEhhLnJvdGF0aW9uLnNldCgwLDAsMCksSGE7Si5kZXB0aE5lYXI9SGEubmVhcjtKLmRlcHRoRmFyPUhhLmZhcjtKLmdldEZyYW1lRGF0YShQKTtpZigibG9jYWwtZmxvb3IiPT09ZmEpe3ZhciBNYT1KLnN0YWdlUGFyYW1ldGVycztNYT9WLmZyb21BcnJheShNYS5zaXR0aW5nVG9TdGFuZGluZ1RyYW5zZm9ybSk6Vi5tYWtlVHJhbnNsYXRpb24oMCxEYSwwKX1EYT1QLnBvc2U7TWE9bnVsbCE9PVI/UjpIYTtNYS5tYXRyaXguY29weShWKTtNYS5tYXRyaXguZGVjb21wb3NlKE1hLnBvc2l0aW9uLE1hLnF1YXRlcm5pb24sTWEuc2NhbGUpO251bGwhPT1EYS5vcmllbnRhdGlvbiYmKHBhLmZyb21BcnJheShEYS5vcmllbnRhdGlvbiksTWEucXVhdGVybmlvbi5tdWx0aXBseShwYSkpO251bGwhPT0KRGEucG9zaXRpb24mJihwYS5zZXRGcm9tUm90YXRpb25NYXRyaXgoVikscWEuZnJvbUFycmF5KERhLnBvc2l0aW9uKSxxYS5hcHBseVF1YXRlcm5pb24ocGEpLE1hLnBvc2l0aW9uLmFkZChxYSkpO01hLnVwZGF0ZU1hdHJpeFdvcmxkKCk7dWEubmVhcj1IYS5uZWFyO29hLm5lYXI9SGEubmVhcjt1YS5mYXI9SGEuZmFyO29hLmZhcj1IYS5mYXI7dWEubWF0cml4V29ybGRJbnZlcnNlLmZyb21BcnJheShQLmxlZnRWaWV3TWF0cml4KTtvYS5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KFAucmlnaHRWaWV3TWF0cml4KTtXLmdldEludmVyc2UoVik7ImxvY2FsLWZsb29yIj09PWZhJiYodWEubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KFcpLG9hLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShXKSk7SGE9TWEucGFyZW50O251bGwhPT1IYSYmKHJhLmdldEludmVyc2UoSGEubWF0cml4V29ybGQpLHVhLm1hdHJpeFdvcmxkSW52ZXJzZS5tdWx0aXBseShyYSksb2EubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KHJhKSk7CnVhLm1hdHJpeFdvcmxkLmdldEludmVyc2UodWEubWF0cml4V29ybGRJbnZlcnNlKTtvYS5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKG9hLm1hdHJpeFdvcmxkSW52ZXJzZSk7dWEucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoUC5sZWZ0UHJvamVjdGlvbk1hdHJpeCk7b2EucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoUC5yaWdodFByb2plY3Rpb25NYXRyaXgpO3hqKHRhLHVhLG9hKTtIYT1KLmdldExheWVycygpO0hhLmxlbmd0aCYmKEhhPUhhWzBdLHYodWEudmlld3BvcnQsSGEubGVmdEJvdW5kcyksdihvYS52aWV3cG9ydCxIYS5yaWdodEJvdW5kcykpO3IoKTtyZXR1cm4gdGF9O3RoaXMuZ2V0U3RhbmRpbmdNYXRyaXg9ZnVuY3Rpb24oKXtyZXR1cm4gVn07dGhpcy5pc1ByZXNlbnRpbmc9Yzt2YXIgQ2E9bmV3IGJjO3RoaXMuc2V0QW5pbWF0aW9uTG9vcD1mdW5jdGlvbihIYSl7Q2Euc2V0QW5pbWF0aW9uTG9vcChIYSk7YygpJiZDYS5zdGFydCgpfTt0aGlzLnN1Ym1pdEZyYW1lPQpmdW5jdGlvbigpe2MoKSYmSi5zdWJtaXRGcmFtZSgpfTt0aGlzLmRpc3Bvc2U9ZnVuY3Rpb24oKXsidW5kZWZpbmVkIiE9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ2cmRpc3BsYXlwcmVzZW50Y2hhbmdlIixlKX07dGhpcy5zZXRGcmFtZU9mUmVmZXJlbmNlVHlwZT1mdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViVlJNYW5hZ2VyOiBzZXRGcmFtZU9mUmVmZXJlbmNlVHlwZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9fWZ1bmN0aW9uIEFqKGEsYyl7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsIT09RiYmbnVsbCE9PUp9ZnVuY3Rpb24gZyhxYSl7Zm9yKHZhciB1YT0wO3VhPFMubGVuZ3RoO3VhKyspVlt1YV09PT1xYS5pbnB1dFNvdXJjZSYmU1t1YV0uZGlzcGF0Y2hFdmVudCh7dHlwZTpxYS50eXBlfSl9ZnVuY3Rpb24gcigpe2Euc2V0RnJhbWVidWZmZXIobnVsbCk7YS5zZXRSZW5kZXJUYXJnZXQoYS5nZXRSZW5kZXJUYXJnZXQoKSk7CnBhLnN0b3AoKTtFLmRpc3BhdGNoRXZlbnQoe3R5cGU6InNlc3Npb25lbmQifSl9ZnVuY3Rpb24gdihxYSl7Sj1xYTtwYS5zZXRDb250ZXh0KEYpO3BhLnN0YXJ0KCk7RS5kaXNwYXRjaEV2ZW50KHt0eXBlOiJzZXNzaW9uc3RhcnQifSl9ZnVuY3Rpb24geihxYSx1YSl7bnVsbD09PXVhP3FhLm1hdHJpeFdvcmxkLmNvcHkocWEubWF0cml4KTpxYS5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHVhLm1hdHJpeFdvcmxkLHFhLm1hdHJpeCk7cWEubWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UocWEubWF0cml4V29ybGQpfXZhciBFPXRoaXMsRj1udWxsLEo9bnVsbCxQPSJsb2NhbC1mbG9vciIsUj1udWxsLFM9W10sVj1bXSxXPW5ldyB2YjtXLmxheWVycy5lbmFibGUoMSk7Vy52aWV3cG9ydD1uZXcgcDt2YXIgaGE9bmV3IHZiO2hhLmxheWVycy5lbmFibGUoMik7aGEudmlld3BvcnQ9bmV3IHA7dmFyIGZhPW5ldyB2ZihbVyxoYV0pO2ZhLmxheWVycy5lbmFibGUoMSk7ZmEubGF5ZXJzLmVuYWJsZSgyKTsKdGhpcy5lbmFibGVkPSExO3RoaXMuZ2V0Q29udHJvbGxlcj1mdW5jdGlvbihxYSl7dmFyIHVhPVNbcWFdO3ZvaWQgMD09PXVhJiYodWE9bmV3IHVlLHVhLm1hdHJpeEF1dG9VcGRhdGU9ITEsdWEudmlzaWJsZT0hMSxTW3FhXT11YSk7cmV0dXJuIHVhfTt0aGlzLnNldEZyYW1lYnVmZmVyU2NhbGVGYWN0b3I9ZnVuY3Rpb24oKXt9O3RoaXMuc2V0UmVmZXJlbmNlU3BhY2VUeXBlPWZ1bmN0aW9uKHFhKXtQPXFhfTt0aGlzLmdldFNlc3Npb249ZnVuY3Rpb24oKXtyZXR1cm4gRn07dGhpcy5zZXRTZXNzaW9uPWZ1bmN0aW9uKHFhKXtGPXFhO251bGwhPT1GJiYoRi5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3QiLGcpLEYuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0c3RhcnQiLGcpLEYuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0ZW5kIixnKSxGLmFkZEV2ZW50TGlzdGVuZXIoImVuZCIsciksRi51cGRhdGVSZW5kZXJTdGF0ZSh7YmFzZUxheWVyOm5ldyBYUldlYkdMTGF5ZXIoRixjKX0pLEYucmVxdWVzdFJlZmVyZW5jZVNwYWNlKFApLnRoZW4odiksClY9Ri5pbnB1dFNvdXJjZXMsRi5hZGRFdmVudExpc3RlbmVyKCJpbnB1dHNvdXJjZXNjaGFuZ2UiLGZ1bmN0aW9uKCl7Vj1GLmlucHV0U291cmNlcztjb25zb2xlLmxvZyhWKTtmb3IodmFyIHVhPTA7dWE8Uy5sZW5ndGg7dWErKylTW3VhXS51c2VyRGF0YS5pbnB1dFNvdXJjZT1WW3VhXX0pKX07dGhpcy5nZXRDYW1lcmE9ZnVuY3Rpb24ocWEpe2lmKGUoKSl7dmFyIHVhPXFhLnBhcmVudCxvYT1mYS5jYW1lcmFzO3ooZmEsdWEpO2Zvcih2YXIgdGE9MDt0YTxvYS5sZW5ndGg7dGErKyl6KG9hW3RhXSx1YSk7cWEubWF0cml4V29ybGQuY29weShmYS5tYXRyaXhXb3JsZCk7cWE9cWEuY2hpbGRyZW47dGE9MDtmb3IodWE9cWEubGVuZ3RoO3RhPHVhO3RhKyspcWFbdGFdLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt4aihmYSxXLGhhKTtyZXR1cm4gZmF9cmV0dXJuIHFhfTt0aGlzLmlzUHJlc2VudGluZz1lO3ZhciByYT1udWxsLHBhPW5ldyBiYztwYS5zZXRBbmltYXRpb25Mb29wKGZ1bmN0aW9uKHFhLAp1YSl7Uj11YS5nZXRWaWV3ZXJQb3NlKEopO2lmKG51bGwhPT1SKXt2YXIgb2E9Ui52aWV3cyx0YT1GLnJlbmRlclN0YXRlLmJhc2VMYXllcjthLnNldEZyYW1lYnVmZmVyKHRhLmZyYW1lYnVmZmVyKTtmb3IodmFyIEJhPTA7QmE8b2EubGVuZ3RoO0JhKyspe3ZhciBUYT1vYVtCYV0sVWE9dGEuZ2V0Vmlld3BvcnQoVGEpLENhPWZhLmNhbWVyYXNbQmFdO0NhLm1hdHJpeC5mcm9tQXJyYXkoVGEudHJhbnNmb3JtLmludmVyc2UubWF0cml4KS5nZXRJbnZlcnNlKENhLm1hdHJpeCk7Q2EucHJvamVjdGlvbk1hdHJpeC5mcm9tQXJyYXkoVGEucHJvamVjdGlvbk1hdHJpeCk7Q2Eudmlld3BvcnQuc2V0KFVhLngsVWEueSxVYS53aWR0aCxVYS5oZWlnaHQpOzA9PT1CYSYmZmEubWF0cml4LmNvcHkoQ2EubWF0cml4KX19Zm9yKEJhPTA7QmE8Uy5sZW5ndGg7QmErKyl7b2E9U1tCYV07aWYodGE9VltCYV0paWYodGE9dWEuZ2V0UG9zZSh0YS50YXJnZXRSYXlTcGFjZSxKKSxudWxsIT09dGEpe29hLm1hdHJpeC5mcm9tQXJyYXkodGEudHJhbnNmb3JtLm1hdHJpeCk7Cm9hLm1hdHJpeC5kZWNvbXBvc2Uob2EucG9zaXRpb24sb2Eucm90YXRpb24sb2Euc2NhbGUpO29hLnZpc2libGU9ITA7Y29udGludWV9b2EudmlzaWJsZT0hMX1yYSYmcmEocWEpfSk7dGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKHFhKXtyYT1xYX07dGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7fTt0aGlzLmdldFN0YW5kaW5nTWF0cml4PWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IGdldFN0YW5kaW5nTWF0cml4KCkgaXMgbm8gbG9uZ2VyIG5lZWRlZC4iKTtyZXR1cm4gbmV3IHF9O3RoaXMuZ2V0RGV2aWNlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IGdldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc2V0RGV2aWNlPWZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IHNldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIil9O3RoaXMuc2V0RnJhbWVPZlJlZmVyZW5jZVR5cGU9CmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJYUk1hbmFnZXI6IHNldEZyYW1lT2ZSZWZlcmVuY2VUeXBlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4iKX07dGhpcy5zdWJtaXRGcmFtZT1mdW5jdGlvbigpe319ZnVuY3Rpb24gT2goYSl7dmFyIGM7ZnVuY3Rpb24gZSgpe3JldHVybiBudWxsPT09aWI/Y2M6MX1mdW5jdGlvbiBnKCl7TGI9bmV3IGJkKFJhKTtkYz1uZXcgTWIoUmEsTGIsYSk7ZGMuaXNXZWJHTDJ8fChMYi5nZXQoIldFQkdMX2RlcHRoX3RleHR1cmUiKSxMYi5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0IiksTGIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0IiksTGIuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0X2xpbmVhciIpLExiLmdldCgiT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzIiksTGIuZ2V0KCJPRVNfZWxlbWVudF9pbmRleF91aW50IiksTGIuZ2V0KCJBTkdMRV9pbnN0YW5jZWRfYXJyYXlzIikpO0xiLmdldCgiT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyIik7Ck5jPW5ldyB3aihSYSxMYixkYyk7eWI9bmV3IFZsKFJhLExiLE5jLGRjKTt5Yi5zY2lzc29yKFNiLmNvcHkodmUpLm11bHRpcGx5U2NhbGFyKGNjKS5mbG9vcigpKTt5Yi52aWV3cG9ydChLYi5jb3B5KHdlKS5tdWx0aXBseVNjYWxhcihjYykuZmxvb3IoKSk7eGQ9bmV3IFNrKFJhKTtlYz1uZXcgTWw7T2M9bmV3IFdsKFJhLExiLHliLGVjLGRjLE5jLHhkKTt2Zz1uZXcgT2QoUmEpO1BoPW5ldyB0ZChSYSx2Zyx4ZCk7eGU9bmV3IFZrKFBoLHhkKTtCaj1uZXcgVWsoUmEpO1BkPW5ldyBMbChqYSxMYixkYyk7d2c9bmV3IFBsO3llPW5ldyBVbDt5ZD1uZXcgc2QoamEseWIseGUsbmEpO0NqPW5ldyBzYShSYSxMYix4ZCxkYyk7RGo9bmV3IHRnKFJhLExiLHhkLGRjKTt4ZC5wcm9ncmFtcz1QZC5wcm9ncmFtcztqYS5jYXBhYmlsaXRpZXM9ZGM7amEuZXh0ZW5zaW9ucz1MYjtqYS5wcm9wZXJ0aWVzPWVjO2phLnJlbmRlckxpc3RzPXdnO2phLnN0YXRlPXliO2phLmluZm89eGR9ZnVuY3Rpb24gcihVKXtVLnByZXZlbnREZWZhdWx0KCk7CmNvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IExvc3QuIik7R2E9ITB9ZnVuY3Rpb24gdigpe2NvbnNvbGUubG9nKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiBDb250ZXh0IFJlc3RvcmVkLiIpO0dhPSExO2coKX1mdW5jdGlvbiB6KFUpe1U9VS50YXJnZXQ7VS5yZW1vdmVFdmVudExpc3RlbmVyKCJkaXNwb3NlIix6KTtFKFUpfWZ1bmN0aW9uIEUoVSl7RihVKTtlYy5yZW1vdmUoVSl9ZnVuY3Rpb24gRihVKXt2YXIgZGE9ZWMuZ2V0KFUpLnByb2dyYW07VS5wcm9ncmFtPXZvaWQgMDt2b2lkIDAhPT1kYSYmUGQucmVsZWFzZVByb2dyYW0oZGEpfWZ1bmN0aW9uIEooVSxkYSl7VS5yZW5kZXIoZnVuY3Rpb24obWEpe2phLnJlbmRlckJ1ZmZlckltbWVkaWF0ZShtYSxkYSl9KX1mdW5jdGlvbiBQKFUsZGEsbWEpe2lmKG1hJiZtYS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JiYhZGMuaXNXZWJHTDImJm51bGw9PT1MYi5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKSljb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnNldHVwVmVydGV4QXR0cmlidXRlczogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuIik7CmVsc2V7eWIuaW5pdEF0dHJpYnV0ZXMoKTt2YXIgSWE9bWEuYXR0cmlidXRlcztkYT1kYS5nZXRBdHRyaWJ1dGVzKCk7VT1VLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7Zm9yKHZhciBPYSBpbiBkYSl7dmFyIGFiPWRhW09hXTtpZigwPD1hYil7dmFyIFBhPUlhW09hXTtpZih2b2lkIDAhPT1QYSl7dmFyIGZiPVBhLm5vcm1hbGl6ZWQsQ2I9UGEuaXRlbVNpemUsb2I9dmcuZ2V0KFBhKTtpZih2b2lkIDAhPT1vYil7dmFyICRhPW9iLmJ1ZmZlcixQYz1vYi50eXBlO29iPW9iLmJ5dGVzUGVyRWxlbWVudDtpZihQYS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKXt2YXIgeGM9UGEuZGF0YSx6ZT14Yy5zdHJpZGU7UGE9UGEub2Zmc2V0O3hjJiZ4Yy5pc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyPyh5Yi5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKGFiLHhjLm1lc2hQZXJBdHRyaWJ1dGUpLHZvaWQgMD09PW1hLm1heEluc3RhbmNlZENvdW50JiYobWEubWF4SW5zdGFuY2VkQ291bnQ9CnhjLm1lc2hQZXJBdHRyaWJ1dGUqeGMuY291bnQpKTp5Yi5lbmFibGVBdHRyaWJ1dGUoYWIpO1JhLmJpbmRCdWZmZXIoMzQ5NjIsJGEpO1JhLnZlcnRleEF0dHJpYlBvaW50ZXIoYWIsQ2IsUGMsZmIsemUqb2IsUGEqb2IpfWVsc2UgUGEuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU/KHliLmVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoYWIsUGEubWVzaFBlckF0dHJpYnV0ZSksdm9pZCAwPT09bWEubWF4SW5zdGFuY2VkQ291bnQmJihtYS5tYXhJbnN0YW5jZWRDb3VudD1QYS5tZXNoUGVyQXR0cmlidXRlKlBhLmNvdW50KSk6eWIuZW5hYmxlQXR0cmlidXRlKGFiKSxSYS5iaW5kQnVmZmVyKDM0OTYyLCRhKSxSYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGFiLENiLFBjLGZiLDAsMCl9fWVsc2UgaWYodm9pZCAwIT09VSYmKGZiPVVbT2FdLHZvaWQgMCE9PWZiKSlzd2l0Y2goZmIubGVuZ3RoKXtjYXNlIDI6UmEudmVydGV4QXR0cmliMmZ2KGFiLGZiKTticmVhaztjYXNlIDM6UmEudmVydGV4QXR0cmliM2Z2KGFiLApmYik7YnJlYWs7Y2FzZSA0OlJhLnZlcnRleEF0dHJpYjRmdihhYixmYik7YnJlYWs7ZGVmYXVsdDpSYS52ZXJ0ZXhBdHRyaWIxZnYoYWIsZmIpfX19eWIuZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMoKX19ZnVuY3Rpb24gUihVLGRhLG1hLElhKXtpZighMSE9PVUudmlzaWJsZSl7aWYoVS5sYXllcnMudGVzdChkYS5sYXllcnMpKWlmKFUuaXNHcm91cCltYT1VLnJlbmRlck9yZGVyO2Vsc2UgaWYoVS5pc0xPRCkhMD09PVUuYXV0b1VwZGF0ZSYmVS51cGRhdGUoZGEpO2Vsc2UgaWYoVS5pc0xpZ2h0KWNiLnB1c2hMaWdodChVKSxVLmNhc3RTaGFkb3cmJmNiLnB1c2hTaGFkb3coVSk7ZWxzZSBpZihVLmlzU3ByaXRlKXtpZighVS5mcnVzdHVtQ3VsbGVkfHxRaC5pbnRlcnNlY3RzU3ByaXRlKFUpKXtJYSYmemQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKFUubWF0cml4V29ybGQpLmFwcGx5TWF0cml4NCh3Zik7dmFyIE9hPXhlLnVwZGF0ZShVKSxhYj1VLm1hdGVyaWFsO2FiLnZpc2libGUmJk5hLnB1c2goVSwKT2EsYWIsbWEsemQueixudWxsKX19ZWxzZSBpZihVLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0KUlhJiZ6ZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oVS5tYXRyaXhXb3JsZCkuYXBwbHlNYXRyaXg0KHdmKSxOYS5wdXNoKFUsbnVsbCxVLm1hdGVyaWFsLG1hLHpkLnosbnVsbCk7ZWxzZSBpZihVLmlzTWVzaHx8VS5pc0xpbmV8fFUuaXNQb2ludHMpaWYoVS5pc1NraW5uZWRNZXNoJiZVLnNrZWxldG9uLnVwZGF0ZSgpLCFVLmZydXN0dW1DdWxsZWR8fFFoLmludGVyc2VjdHNPYmplY3QoVSkpaWYoSWEmJnpkLnNldEZyb21NYXRyaXhQb3NpdGlvbihVLm1hdHJpeFdvcmxkKS5hcHBseU1hdHJpeDQod2YpLE9hPXhlLnVwZGF0ZShVKSxhYj1VLm1hdGVyaWFsLEFycmF5LmlzQXJyYXkoYWIpKWZvcih2YXIgUGE9T2EuZ3JvdXBzLGZiPTAsQ2I9UGEubGVuZ3RoO2ZiPENiO2ZiKyspe3ZhciBvYj1QYVtmYl0sJGE9YWJbb2IubWF0ZXJpYWxJbmRleF07JGEmJiRhLnZpc2libGUmJk5hLnB1c2goVSwKT2EsJGEsbWEsemQueixvYil9ZWxzZSBhYi52aXNpYmxlJiZOYS5wdXNoKFUsT2EsYWIsbWEsemQueixudWxsKTtVPVUuY2hpbGRyZW47ZmI9MDtmb3IoQ2I9VS5sZW5ndGg7ZmI8Q2I7ZmIrKylSKFVbZmJdLGRhLG1hLElhKX19ZnVuY3Rpb24gUyhVLGRhLG1hLElhKXtmb3IodmFyIE9hPTAsYWI9VS5sZW5ndGg7T2E8YWI7T2ErKyl7dmFyIFBhPVVbT2FdLGZiPVBhLm9iamVjdCxDYj1QYS5nZW9tZXRyeSxvYj12b2lkIDA9PT1JYT9QYS5tYXRlcmlhbDpJYTtQYT1QYS5ncm91cDtpZihtYS5pc0FycmF5Q2FtZXJhKXtzYj1tYTtmb3IodmFyICRhPW1hLmNhbWVyYXMsUGM9MCx4Yz0kYS5sZW5ndGg7UGM8eGM7UGMrKyl7dmFyIHplPSRhW1BjXTtmYi5sYXllcnMudGVzdCh6ZS5sYXllcnMpJiYoeWIudmlld3BvcnQoS2IuY29weSh6ZS52aWV3cG9ydCkpLGNiLnNldHVwTGlnaHRzKHplKSxWKGZiLGRhLHplLENiLG9iLFBhKSl9fWVsc2Ugc2I9bnVsbCxWKGZiLGRhLG1hLENiLG9iLFBhKX19CmZ1bmN0aW9uIFYoVSxkYSxtYSxJYSxPYSxhYil7VS5vbkJlZm9yZVJlbmRlcihqYSxkYSxtYSxJYSxPYSxhYik7Y2I9eWUuZ2V0KGRhLHNifHxtYSk7VS5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhtYS5tYXRyaXhXb3JsZEludmVyc2UsVS5tYXRyaXhXb3JsZCk7VS5ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KFUubW9kZWxWaWV3TWF0cml4KTtVLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0Pyh5Yi5zZXRNYXRlcmlhbChPYSksSWE9aGEobWEsZGEuZm9nLE9hLFUpLGViPWM9bnVsbCxtYj0hMSxKKFUsSWEpKTpqYS5yZW5kZXJCdWZmZXJEaXJlY3QobWEsZGEuZm9nLElhLE9hLFUsYWIpO2NiPXllLmdldChkYSxzYnx8bWEpfWZ1bmN0aW9uIFcoVSxkYSxtYSl7dmFyIElhPWVjLmdldChVKSxPYT1jYi5zdGF0ZS5saWdodHMsYWI9T2Euc3RhdGUudmVyc2lvbjttYT1QZC5nZXRQYXJhbWV0ZXJzKFUsT2Euc3RhdGUsY2Iuc3RhdGUuc2hhZG93c0FycmF5LGRhLHljLm51bVBsYW5lcywKeWMubnVtSW50ZXJzZWN0aW9uLG1hKTt2YXIgUGE9UGQuZ2V0UHJvZ3JhbUNvZGUoVSxtYSksZmI9SWEucHJvZ3JhbSxDYj0hMDtpZih2b2lkIDA9PT1mYilVLmFkZEV2ZW50TGlzdGVuZXIoImRpc3Bvc2UiLHopO2Vsc2UgaWYoZmIuY29kZSE9PVBhKUYoVSk7ZWxzZXtpZihJYS5saWdodHNTdGF0ZVZlcnNpb24hPT1hYilJYS5saWdodHNTdGF0ZVZlcnNpb249YWI7ZWxzZSBpZih2b2lkIDAhPT1tYS5zaGFkZXJJRClyZXR1cm47Q2I9ITF9Q2ImJihtYS5zaGFkZXJJRD8oUGE9TWNbbWEuc2hhZGVySURdLElhLnNoYWRlcj17bmFtZTpVLnR5cGUsdW5pZm9ybXM6dWIoUGEudW5pZm9ybXMpLHZlcnRleFNoYWRlcjpQYS52ZXJ0ZXhTaGFkZXIsZnJhZ21lbnRTaGFkZXI6UGEuZnJhZ21lbnRTaGFkZXJ9KTpJYS5zaGFkZXI9e25hbWU6VS50eXBlLHVuaWZvcm1zOlUudW5pZm9ybXMsdmVydGV4U2hhZGVyOlUudmVydGV4U2hhZGVyLGZyYWdtZW50U2hhZGVyOlUuZnJhZ21lbnRTaGFkZXJ9LApQYT1QZC5nZXRQcm9ncmFtQ29kZShVLG1hKSxmYj1QZC5hY3F1aXJlUHJvZ3JhbShVLElhLnNoYWRlcixtYSxQYSksSWEucHJvZ3JhbT1mYixVLnByb2dyYW09ZmIpO21hPWZiLmdldEF0dHJpYnV0ZXMoKTtpZihVLm1vcnBoVGFyZ2V0cylmb3IoUGE9VS5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHM9MDtQYTxqYS5tYXhNb3JwaFRhcmdldHM7UGErKykwPD1tYVsibW9ycGhUYXJnZXQiK1BhXSYmVS5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMrKztpZihVLm1vcnBoTm9ybWFscylmb3IoUGE9VS5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHM9MDtQYTxqYS5tYXhNb3JwaE5vcm1hbHM7UGErKykwPD1tYVsibW9ycGhOb3JtYWwiK1BhXSYmVS5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMrKzttYT1JYS5zaGFkZXIudW5pZm9ybXM7aWYoIVUuaXNTaGFkZXJNYXRlcmlhbCYmIVUuaXNSYXdTaGFkZXJNYXRlcmlhbHx8ITA9PT1VLmNsaXBwaW5nKUlhLm51bUNsaXBwaW5nUGxhbmVzPXljLm51bVBsYW5lcywKSWEubnVtSW50ZXJzZWN0aW9uPXljLm51bUludGVyc2VjdGlvbixtYS5jbGlwcGluZ1BsYW5lcz15Yy51bmlmb3JtO0lhLmZvZz1kYTtJYS5saWdodHNTdGF0ZVZlcnNpb249YWI7VS5saWdodHMmJihtYS5hbWJpZW50TGlnaHRDb2xvci52YWx1ZT1PYS5zdGF0ZS5hbWJpZW50LG1hLmxpZ2h0UHJvYmUudmFsdWU9T2Euc3RhdGUucHJvYmUsbWEuZGlyZWN0aW9uYWxMaWdodHMudmFsdWU9T2Euc3RhdGUuZGlyZWN0aW9uYWwsbWEuc3BvdExpZ2h0cy52YWx1ZT1PYS5zdGF0ZS5zcG90LG1hLnJlY3RBcmVhTGlnaHRzLnZhbHVlPU9hLnN0YXRlLnJlY3RBcmVhLG1hLnBvaW50TGlnaHRzLnZhbHVlPU9hLnN0YXRlLnBvaW50LG1hLmhlbWlzcGhlcmVMaWdodHMudmFsdWU9T2Euc3RhdGUuaGVtaSxtYS5kaXJlY3Rpb25hbFNoYWRvd01hcC52YWx1ZT1PYS5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hcCxtYS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC52YWx1ZT1PYS5zdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeCwKbWEuc3BvdFNoYWRvd01hcC52YWx1ZT1PYS5zdGF0ZS5zcG90U2hhZG93TWFwLG1hLnNwb3RTaGFkb3dNYXRyaXgudmFsdWU9T2Euc3RhdGUuc3BvdFNoYWRvd01hdHJpeCxtYS5wb2ludFNoYWRvd01hcC52YWx1ZT1PYS5zdGF0ZS5wb2ludFNoYWRvd01hcCxtYS5wb2ludFNoYWRvd01hdHJpeC52YWx1ZT1PYS5zdGF0ZS5wb2ludFNoYWRvd01hdHJpeCk7VT1JYS5wcm9ncmFtLmdldFVuaWZvcm1zKCk7VT11ZC5zZXFXaXRoVmFsdWUoVS5zZXEsbWEpO0lhLnVuaWZvcm1zTGlzdD1VfWZ1bmN0aW9uIGhhKFUsZGEsbWEsSWEpe09jLnJlc2V0VGV4dHVyZVVuaXRzKCk7dmFyIE9hPWVjLmdldChtYSksYWI9Y2Iuc3RhdGUubGlnaHRzO3hnJiYoUmh8fFUhPT1wYikmJnljLnNldFN0YXRlKG1hLmNsaXBwaW5nUGxhbmVzLG1hLmNsaXBJbnRlcnNlY3Rpb24sbWEuY2xpcFNoYWRvd3MsVSxPYSxVPT09cGImJm1hLmlkPT09UWEpOyExPT09bWEubmVlZHNVcGRhdGUmJih2b2lkIDA9PT1PYS5wcm9ncmFtPwptYS5uZWVkc1VwZGF0ZT0hMDptYS5mb2cmJk9hLmZvZyE9PWRhP21hLm5lZWRzVXBkYXRlPSEwOm1hLmxpZ2h0cyYmT2EubGlnaHRzU3RhdGVWZXJzaW9uIT09YWIuc3RhdGUudmVyc2lvbj9tYS5uZWVkc1VwZGF0ZT0hMDp2b2lkIDA9PT1PYS5udW1DbGlwcGluZ1BsYW5lc3x8T2EubnVtQ2xpcHBpbmdQbGFuZXM9PT15Yy5udW1QbGFuZXMmJk9hLm51bUludGVyc2VjdGlvbj09PXljLm51bUludGVyc2VjdGlvbnx8KG1hLm5lZWRzVXBkYXRlPSEwKSk7bWEubmVlZHNVcGRhdGUmJihXKG1hLGRhLElhKSxtYS5uZWVkc1VwZGF0ZT0hMSk7dmFyIFBhPSExLGZiPWFiPSExLENiPU9hLnByb2dyYW0sb2I9Q2IuZ2V0VW5pZm9ybXMoKSwkYT1PYS5zaGFkZXIudW5pZm9ybXM7eWIudXNlUHJvZ3JhbShDYi5wcm9ncmFtKSYmKGZiPWFiPVBhPSEwKTttYS5pZCE9PVFhJiYoUWE9bWEuaWQsYWI9ITApO2lmKFBhfHxwYiE9PVUpe29iLnNldFZhbHVlKFJhLCJwcm9qZWN0aW9uTWF0cml4IixVLnByb2plY3Rpb25NYXRyaXgpOwpkYy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyJiZvYi5zZXRWYWx1ZShSYSwibG9nRGVwdGhCdWZGQyIsMi8oTWF0aC5sb2coVS5mYXIrMSkvTWF0aC5MTjIpKTtwYiE9PVUmJihwYj1VLGZiPWFiPSEwKTtpZihtYS5pc1NoYWRlck1hdGVyaWFsfHxtYS5pc01lc2hQaG9uZ01hdGVyaWFsfHxtYS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsfHxtYS5lbnZNYXApUGE9b2IubWFwLmNhbWVyYVBvc2l0aW9uLHZvaWQgMCE9PVBhJiZQYS5zZXRWYWx1ZShSYSx6ZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oVS5tYXRyaXhXb3JsZCkpOyhtYS5pc01lc2hQaG9uZ01hdGVyaWFsfHxtYS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWx8fG1hLmlzTWVzaEJhc2ljTWF0ZXJpYWx8fG1hLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWx8fG1hLmlzU2hhZGVyTWF0ZXJpYWx8fG1hLnNraW5uaW5nKSYmb2Iuc2V0VmFsdWUoUmEsInZpZXdNYXRyaXgiLFUubWF0cml4V29ybGRJbnZlcnNlKX1pZihtYS5za2lubmluZyYmKG9iLnNldE9wdGlvbmFsKFJhLApJYSwiYmluZE1hdHJpeCIpLG9iLnNldE9wdGlvbmFsKFJhLElhLCJiaW5kTWF0cml4SW52ZXJzZSIpLFU9SWEuc2tlbGV0b24pKWlmKFBhPVUuYm9uZXMsZGMuZmxvYXRWZXJ0ZXhUZXh0dXJlcyl7aWYodm9pZCAwPT09VS5ib25lVGV4dHVyZSl7UGE9TWF0aC5zcXJ0KDQqUGEubGVuZ3RoKTtQYT1oYi5jZWlsUG93ZXJPZlR3byhQYSk7UGE9TWF0aC5tYXgoUGEsNCk7dmFyIFBjPW5ldyBGbG9hdDMyQXJyYXkoUGEqUGEqNCk7UGMuc2V0KFUuYm9uZU1hdHJpY2VzKTt2YXIgeGM9bmV3IEFiKFBjLFBhLFBhLDEwMjMsMTAxNSk7eGMubmVlZHNVcGRhdGU9ITA7VS5ib25lTWF0cmljZXM9UGM7VS5ib25lVGV4dHVyZT14YztVLmJvbmVUZXh0dXJlU2l6ZT1QYX1vYi5zZXRWYWx1ZShSYSwiYm9uZVRleHR1cmUiLFUuYm9uZVRleHR1cmUsT2MpO29iLnNldFZhbHVlKFJhLCJib25lVGV4dHVyZVNpemUiLFUuYm9uZVRleHR1cmVTaXplKX1lbHNlIG9iLnNldE9wdGlvbmFsKFJhLFUsImJvbmVNYXRyaWNlcyIpOwphYiYmKG9iLnNldFZhbHVlKFJhLCJ0b25lTWFwcGluZ0V4cG9zdXJlIixqYS50b25lTWFwcGluZ0V4cG9zdXJlKSxvYi5zZXRWYWx1ZShSYSwidG9uZU1hcHBpbmdXaGl0ZVBvaW50IixqYS50b25lTWFwcGluZ1doaXRlUG9pbnQpLG1hLmxpZ2h0cyYmdGIoJGEsZmIpLGRhJiZtYS5mb2cmJm9hKCRhLGRhKSxtYS5pc01lc2hCYXNpY01hdGVyaWFsP2ZhKCRhLG1hKTptYS5pc01lc2hMYW1iZXJ0TWF0ZXJpYWw/KGZhKCRhLG1hKSx0YSgkYSxtYSkpOm1hLmlzTWVzaFBob25nTWF0ZXJpYWw/KGZhKCRhLG1hKSxtYS5pc01lc2hUb29uTWF0ZXJpYWw/VGEoJGEsbWEpOkJhKCRhLG1hKSk6bWEuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbD8oZmEoJGEsbWEpLG1hLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWw/Q2EoJGEsbWEpOlVhKCRhLG1hKSk6bWEuaXNNZXNoTWF0Y2FwTWF0ZXJpYWw/KGZhKCRhLG1hKSxIYSgkYSxtYSkpOm1hLmlzTWVzaERlcHRoTWF0ZXJpYWw/KGZhKCRhLG1hKSxEYSgkYSwKbWEpKTptYS5pc01lc2hEaXN0YW5jZU1hdGVyaWFsPyhmYSgkYSxtYSksTWEoJGEsbWEpKTptYS5pc01lc2hOb3JtYWxNYXRlcmlhbD8oZmEoJGEsbWEpLGRiKCRhLG1hKSk6bWEuaXNMaW5lQmFzaWNNYXRlcmlhbD8ocmEoJGEsbWEpLG1hLmlzTGluZURhc2hlZE1hdGVyaWFsJiZwYSgkYSxtYSkpOm1hLmlzUG9pbnRzTWF0ZXJpYWw/cWEoJGEsbWEpOm1hLmlzU3ByaXRlTWF0ZXJpYWw/dWEoJGEsbWEpOm1hLmlzU2hhZG93TWF0ZXJpYWwmJigkYS5jb2xvci52YWx1ZS5jb3B5KG1hLmNvbG9yKSwkYS5vcGFjaXR5LnZhbHVlPW1hLm9wYWNpdHkpLHZvaWQgMCE9PSRhLmx0Y18xJiYoJGEubHRjXzEudmFsdWU9V2EuTFRDXzEpLHZvaWQgMCE9PSRhLmx0Y18yJiYoJGEubHRjXzIudmFsdWU9V2EuTFRDXzIpLHVkLnVwbG9hZChSYSxPYS51bmlmb3Jtc0xpc3QsJGEsT2MpKTttYS5pc1NoYWRlck1hdGVyaWFsJiYhMD09PW1hLnVuaWZvcm1zTmVlZFVwZGF0ZSYmKHVkLnVwbG9hZChSYSxPYS51bmlmb3Jtc0xpc3QsCiRhLE9jKSxtYS51bmlmb3Jtc05lZWRVcGRhdGU9ITEpO21hLmlzU3ByaXRlTWF0ZXJpYWwmJm9iLnNldFZhbHVlKFJhLCJjZW50ZXIiLElhLmNlbnRlcik7b2Iuc2V0VmFsdWUoUmEsIm1vZGVsVmlld01hdHJpeCIsSWEubW9kZWxWaWV3TWF0cml4KTtvYi5zZXRWYWx1ZShSYSwibm9ybWFsTWF0cml4IixJYS5ub3JtYWxNYXRyaXgpO29iLnNldFZhbHVlKFJhLCJtb2RlbE1hdHJpeCIsSWEubWF0cml4V29ybGQpO3JldHVybiBDYn1mdW5jdGlvbiBmYShVLGRhKXtVLm9wYWNpdHkudmFsdWU9ZGEub3BhY2l0eTtkYS5jb2xvciYmVS5kaWZmdXNlLnZhbHVlLmNvcHkoZGEuY29sb3IpO2RhLmVtaXNzaXZlJiZVLmVtaXNzaXZlLnZhbHVlLmNvcHkoZGEuZW1pc3NpdmUpLm11bHRpcGx5U2NhbGFyKGRhLmVtaXNzaXZlSW50ZW5zaXR5KTtkYS5tYXAmJihVLm1hcC52YWx1ZT1kYS5tYXApO2RhLmFscGhhTWFwJiYoVS5hbHBoYU1hcC52YWx1ZT1kYS5hbHBoYU1hcCk7ZGEuc3BlY3VsYXJNYXAmJgooVS5zcGVjdWxhck1hcC52YWx1ZT1kYS5zcGVjdWxhck1hcCk7ZGEuZW52TWFwJiYoVS5lbnZNYXAudmFsdWU9ZGEuZW52TWFwLFUuZmxpcEVudk1hcC52YWx1ZT1kYS5lbnZNYXAuaXNDdWJlVGV4dHVyZT8tMToxLFUucmVmbGVjdGl2aXR5LnZhbHVlPWRhLnJlZmxlY3Rpdml0eSxVLnJlZnJhY3Rpb25SYXRpby52YWx1ZT1kYS5yZWZyYWN0aW9uUmF0aW8sVS5tYXhNaXBMZXZlbC52YWx1ZT1lYy5nZXQoZGEuZW52TWFwKS5fX21heE1pcExldmVsKTtkYS5saWdodE1hcCYmKFUubGlnaHRNYXAudmFsdWU9ZGEubGlnaHRNYXAsVS5saWdodE1hcEludGVuc2l0eS52YWx1ZT1kYS5saWdodE1hcEludGVuc2l0eSk7ZGEuYW9NYXAmJihVLmFvTWFwLnZhbHVlPWRhLmFvTWFwLFUuYW9NYXBJbnRlbnNpdHkudmFsdWU9ZGEuYW9NYXBJbnRlbnNpdHkpO2lmKGRhLm1hcCl2YXIgbWE9ZGEubWFwO2Vsc2UgZGEuc3BlY3VsYXJNYXA/bWE9ZGEuc3BlY3VsYXJNYXA6ZGEuZGlzcGxhY2VtZW50TWFwPwptYT1kYS5kaXNwbGFjZW1lbnRNYXA6ZGEubm9ybWFsTWFwP21hPWRhLm5vcm1hbE1hcDpkYS5idW1wTWFwP21hPWRhLmJ1bXBNYXA6ZGEucm91Z2huZXNzTWFwP21hPWRhLnJvdWdobmVzc01hcDpkYS5tZXRhbG5lc3NNYXA/bWE9ZGEubWV0YWxuZXNzTWFwOmRhLmFscGhhTWFwP21hPWRhLmFscGhhTWFwOmRhLmVtaXNzaXZlTWFwJiYobWE9ZGEuZW1pc3NpdmVNYXApO3ZvaWQgMCE9PW1hJiYobWEuaXNXZWJHTFJlbmRlclRhcmdldCYmKG1hPW1hLnRleHR1cmUpLCEwPT09bWEubWF0cml4QXV0b1VwZGF0ZSYmbWEudXBkYXRlTWF0cml4KCksVS51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KG1hLm1hdHJpeCkpfWZ1bmN0aW9uIHJhKFUsZGEpe1UuZGlmZnVzZS52YWx1ZS5jb3B5KGRhLmNvbG9yKTtVLm9wYWNpdHkudmFsdWU9ZGEub3BhY2l0eX1mdW5jdGlvbiBwYShVLGRhKXtVLmRhc2hTaXplLnZhbHVlPWRhLmRhc2hTaXplO1UudG90YWxTaXplLnZhbHVlPWRhLmRhc2hTaXplK2RhLmdhcFNpemU7ClUuc2NhbGUudmFsdWU9ZGEuc2NhbGV9ZnVuY3Rpb24gcWEoVSxkYSl7VS5kaWZmdXNlLnZhbHVlLmNvcHkoZGEuY29sb3IpO1Uub3BhY2l0eS52YWx1ZT1kYS5vcGFjaXR5O1Uuc2l6ZS52YWx1ZT1kYS5zaXplKmNjO1Uuc2NhbGUudmFsdWU9LjUqemM7VS5tYXAudmFsdWU9ZGEubWFwO251bGwhPT1kYS5tYXAmJighMD09PWRhLm1hcC5tYXRyaXhBdXRvVXBkYXRlJiZkYS5tYXAudXBkYXRlTWF0cml4KCksVS51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KGRhLm1hcC5tYXRyaXgpKX1mdW5jdGlvbiB1YShVLGRhKXtVLmRpZmZ1c2UudmFsdWUuY29weShkYS5jb2xvcik7VS5vcGFjaXR5LnZhbHVlPWRhLm9wYWNpdHk7VS5yb3RhdGlvbi52YWx1ZT1kYS5yb3RhdGlvbjtVLm1hcC52YWx1ZT1kYS5tYXA7bnVsbCE9PWRhLm1hcCYmKCEwPT09ZGEubWFwLm1hdHJpeEF1dG9VcGRhdGUmJmRhLm1hcC51cGRhdGVNYXRyaXgoKSxVLnV2VHJhbnNmb3JtLnZhbHVlLmNvcHkoZGEubWFwLm1hdHJpeCkpfQpmdW5jdGlvbiBvYShVLGRhKXtVLmZvZ0NvbG9yLnZhbHVlLmNvcHkoZGEuY29sb3IpO2RhLmlzRm9nPyhVLmZvZ05lYXIudmFsdWU9ZGEubmVhcixVLmZvZ0Zhci52YWx1ZT1kYS5mYXIpOmRhLmlzRm9nRXhwMiYmKFUuZm9nRGVuc2l0eS52YWx1ZT1kYS5kZW5zaXR5KX1mdW5jdGlvbiB0YShVLGRhKXtkYS5lbWlzc2l2ZU1hcCYmKFUuZW1pc3NpdmVNYXAudmFsdWU9ZGEuZW1pc3NpdmVNYXApfWZ1bmN0aW9uIEJhKFUsZGEpe1Uuc3BlY3VsYXIudmFsdWUuY29weShkYS5zcGVjdWxhcik7VS5zaGluaW5lc3MudmFsdWU9TWF0aC5tYXgoZGEuc2hpbmluZXNzLDFFLTQpO2RhLmVtaXNzaXZlTWFwJiYoVS5lbWlzc2l2ZU1hcC52YWx1ZT1kYS5lbWlzc2l2ZU1hcCk7ZGEuYnVtcE1hcCYmKFUuYnVtcE1hcC52YWx1ZT1kYS5idW1wTWFwLFUuYnVtcFNjYWxlLnZhbHVlPWRhLmJ1bXBTY2FsZSwxPT09ZGEuc2lkZSYmKFUuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO2RhLm5vcm1hbE1hcCYmKFUubm9ybWFsTWFwLnZhbHVlPQpkYS5ub3JtYWxNYXAsVS5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGRhLm5vcm1hbFNjYWxlKSwxPT09ZGEuc2lkZSYmVS5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKSk7ZGEuZGlzcGxhY2VtZW50TWFwJiYoVS5kaXNwbGFjZW1lbnRNYXAudmFsdWU9ZGEuZGlzcGxhY2VtZW50TWFwLFUuZGlzcGxhY2VtZW50U2NhbGUudmFsdWU9ZGEuZGlzcGxhY2VtZW50U2NhbGUsVS5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlPWRhLmRpc3BsYWNlbWVudEJpYXMpfWZ1bmN0aW9uIFRhKFUsZGEpe0JhKFUsZGEpO2RhLmdyYWRpZW50TWFwJiYoVS5ncmFkaWVudE1hcC52YWx1ZT1kYS5ncmFkaWVudE1hcCl9ZnVuY3Rpb24gVWEoVSxkYSl7VS5yb3VnaG5lc3MudmFsdWU9ZGEucm91Z2huZXNzO1UubWV0YWxuZXNzLnZhbHVlPWRhLm1ldGFsbmVzcztkYS5yb3VnaG5lc3NNYXAmJihVLnJvdWdobmVzc01hcC52YWx1ZT1kYS5yb3VnaG5lc3NNYXApO2RhLm1ldGFsbmVzc01hcCYmKFUubWV0YWxuZXNzTWFwLnZhbHVlPQpkYS5tZXRhbG5lc3NNYXApO2RhLmVtaXNzaXZlTWFwJiYoVS5lbWlzc2l2ZU1hcC52YWx1ZT1kYS5lbWlzc2l2ZU1hcCk7ZGEuYnVtcE1hcCYmKFUuYnVtcE1hcC52YWx1ZT1kYS5idW1wTWFwLFUuYnVtcFNjYWxlLnZhbHVlPWRhLmJ1bXBTY2FsZSwxPT09ZGEuc2lkZSYmKFUuYnVtcFNjYWxlLnZhbHVlKj0tMSkpO2RhLm5vcm1hbE1hcCYmKFUubm9ybWFsTWFwLnZhbHVlPWRhLm5vcm1hbE1hcCxVLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoZGEubm9ybWFsU2NhbGUpLDE9PT1kYS5zaWRlJiZVLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpKTtkYS5kaXNwbGFjZW1lbnRNYXAmJihVLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1kYS5kaXNwbGFjZW1lbnRNYXAsVS5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1kYS5kaXNwbGFjZW1lbnRTY2FsZSxVLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9ZGEuZGlzcGxhY2VtZW50Qmlhcyk7ZGEuZW52TWFwJiYoVS5lbnZNYXBJbnRlbnNpdHkudmFsdWU9CmRhLmVudk1hcEludGVuc2l0eSl9ZnVuY3Rpb24gQ2EoVSxkYSl7VWEoVSxkYSk7VS5yZWZsZWN0aXZpdHkudmFsdWU9ZGEucmVmbGVjdGl2aXR5O1UuY2xlYXJjb2F0LnZhbHVlPWRhLmNsZWFyY29hdDtVLmNsZWFyY29hdFJvdWdobmVzcy52YWx1ZT1kYS5jbGVhcmNvYXRSb3VnaG5lc3M7ZGEuc2hlZW4mJlUuc2hlZW4udmFsdWUuY29weShkYS5zaGVlbik7ZGEuY2xlYXJjb2F0Tm9ybWFsTWFwJiYoVS5jbGVhcmNvYXROb3JtYWxTY2FsZS52YWx1ZS5jb3B5KGRhLmNsZWFyY29hdE5vcm1hbFNjYWxlKSxVLmNsZWFyY29hdE5vcm1hbE1hcC52YWx1ZT1kYS5jbGVhcmNvYXROb3JtYWxNYXAsMT09PWRhLnNpZGUmJlUuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO1UudHJhbnNwYXJlbmN5LnZhbHVlPWRhLnRyYW5zcGFyZW5jeX1mdW5jdGlvbiBIYShVLGRhKXtkYS5tYXRjYXAmJihVLm1hdGNhcC52YWx1ZT1kYS5tYXRjYXApO2RhLmJ1bXBNYXAmJihVLmJ1bXBNYXAudmFsdWU9CmRhLmJ1bXBNYXAsVS5idW1wU2NhbGUudmFsdWU9ZGEuYnVtcFNjYWxlLDE9PT1kYS5zaWRlJiYoVS5idW1wU2NhbGUudmFsdWUqPS0xKSk7ZGEubm9ybWFsTWFwJiYoVS5ub3JtYWxNYXAudmFsdWU9ZGEubm9ybWFsTWFwLFUubm9ybWFsU2NhbGUudmFsdWUuY29weShkYS5ub3JtYWxTY2FsZSksMT09PWRhLnNpZGUmJlUubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO2RhLmRpc3BsYWNlbWVudE1hcCYmKFUuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWRhLmRpc3BsYWNlbWVudE1hcCxVLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWRhLmRpc3BsYWNlbWVudFNjYWxlLFUuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1kYS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiBEYShVLGRhKXtkYS5kaXNwbGFjZW1lbnRNYXAmJihVLmRpc3BsYWNlbWVudE1hcC52YWx1ZT1kYS5kaXNwbGFjZW1lbnRNYXAsVS5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZT1kYS5kaXNwbGFjZW1lbnRTY2FsZSxVLmRpc3BsYWNlbWVudEJpYXMudmFsdWU9CmRhLmRpc3BsYWNlbWVudEJpYXMpfWZ1bmN0aW9uIE1hKFUsZGEpe2RhLmRpc3BsYWNlbWVudE1hcCYmKFUuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWRhLmRpc3BsYWNlbWVudE1hcCxVLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWRhLmRpc3BsYWNlbWVudFNjYWxlLFUuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1kYS5kaXNwbGFjZW1lbnRCaWFzKTtVLnJlZmVyZW5jZVBvc2l0aW9uLnZhbHVlLmNvcHkoZGEucmVmZXJlbmNlUG9zaXRpb24pO1UubmVhckRpc3RhbmNlLnZhbHVlPWRhLm5lYXJEaXN0YW5jZTtVLmZhckRpc3RhbmNlLnZhbHVlPWRhLmZhckRpc3RhbmNlfWZ1bmN0aW9uIGRiKFUsZGEpe2RhLmJ1bXBNYXAmJihVLmJ1bXBNYXAudmFsdWU9ZGEuYnVtcE1hcCxVLmJ1bXBTY2FsZS52YWx1ZT1kYS5idW1wU2NhbGUsMT09PWRhLnNpZGUmJihVLmJ1bXBTY2FsZS52YWx1ZSo9LTEpKTtkYS5ub3JtYWxNYXAmJihVLm5vcm1hbE1hcC52YWx1ZT1kYS5ub3JtYWxNYXAsVS5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KGRhLm5vcm1hbFNjYWxlKSwKMT09PWRhLnNpZGUmJlUubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCkpO2RhLmRpc3BsYWNlbWVudE1hcCYmKFUuZGlzcGxhY2VtZW50TWFwLnZhbHVlPWRhLmRpc3BsYWNlbWVudE1hcCxVLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlPWRhLmRpc3BsYWNlbWVudFNjYWxlLFUuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZT1kYS5kaXNwbGFjZW1lbnRCaWFzKX1mdW5jdGlvbiB0YihVLGRhKXtVLmFtYmllbnRMaWdodENvbG9yLm5lZWRzVXBkYXRlPWRhO1UubGlnaHRQcm9iZS5uZWVkc1VwZGF0ZT1kYTtVLmRpcmVjdGlvbmFsTGlnaHRzLm5lZWRzVXBkYXRlPWRhO1UucG9pbnRMaWdodHMubmVlZHNVcGRhdGU9ZGE7VS5zcG90TGlnaHRzLm5lZWRzVXBkYXRlPWRhO1UucmVjdEFyZWFMaWdodHMubmVlZHNVcGRhdGU9ZGE7VS5oZW1pc3BoZXJlTGlnaHRzLm5lZWRzVXBkYXRlPWRhfWE9YXx8e307dmFyIEthPXZvaWQgMCE9PWEuY2FudmFzP2EuY2FudmFzOmRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsCiJjYW52YXMiKSxiYj12b2lkIDAhPT1hLmNvbnRleHQ/YS5jb250ZXh0Om51bGwsamI9dm9pZCAwIT09YS5hbHBoYT9hLmFscGhhOiExLEViPXZvaWQgMCE9PWEuZGVwdGg/YS5kZXB0aDohMCx4Yj12b2lkIDAhPT1hLnN0ZW5jaWw/YS5zdGVuY2lsOiEwLGlhPXZvaWQgMCE9PWEuYW50aWFsaWFzP2EuYW50aWFsaWFzOiExLG5hPXZvaWQgMCE9PWEucHJlbXVsdGlwbGllZEFscGhhP2EucHJlbXVsdGlwbGllZEFscGhhOiEwLHphPXZvaWQgMCE9PWEucHJlc2VydmVEcmF3aW5nQnVmZmVyP2EucHJlc2VydmVEcmF3aW5nQnVmZmVyOiExLEphPXZvaWQgMCE9PWEucG93ZXJQcmVmZXJlbmNlP2EucG93ZXJQcmVmZXJlbmNlOiJkZWZhdWx0IixZYT12b2lkIDAhPT1hLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQ/YS5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiExLE5hPW51bGwsY2I9bnVsbDt0aGlzLmRvbUVsZW1lbnQ9S2E7dGhpcy5kZWJ1Zz17Y2hlY2tTaGFkZXJFcnJvcnM6ITB9Owp0aGlzLnNvcnRPYmplY3RzPXRoaXMuYXV0b0NsZWFyU3RlbmNpbD10aGlzLmF1dG9DbGVhckRlcHRoPXRoaXMuYXV0b0NsZWFyQ29sb3I9dGhpcy5hdXRvQ2xlYXI9ITA7dGhpcy5jbGlwcGluZ1BsYW5lcz1bXTt0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkPSExO3RoaXMuZ2FtbWFGYWN0b3I9Mjt0aGlzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzPXRoaXMuZ2FtbWFPdXRwdXQ9dGhpcy5nYW1tYUlucHV0PSExO3RoaXMudG9uZU1hcHBpbmdXaGl0ZVBvaW50PXRoaXMudG9uZU1hcHBpbmdFeHBvc3VyZT10aGlzLnRvbmVNYXBwaW5nPTE7dGhpcy5tYXhNb3JwaFRhcmdldHM9ODt0aGlzLm1heE1vcnBoTm9ybWFscz00O3ZhciBqYT10aGlzLEdhPSExLExhPW51bGwsbmI9MCxWYT0wLGliPW51bGwsa2I9bnVsbCxRYT0tMTt2YXIgZWI9Yz1udWxsO3ZhciBtYj0hMTt2YXIgcGI9bnVsbCxzYj1udWxsLEtiPW5ldyBwLFNiPW5ldyBwLG5jPW51bGwsUWM9S2Eud2lkdGgsemM9S2EuaGVpZ2h0LApjYz0xLHdlPW5ldyBwKDAsMCxRYyx6YyksdmU9bmV3IHAoMCwwLFFjLHpjKSxTaD0hMSxRaD1uZXcgaWMseWM9bmV3IHdjLHhnPSExLFJoPSExLHdmPW5ldyBxLHpkPW5ldyBrO3RyeXtqYj17YWxwaGE6amIsZGVwdGg6RWIsc3RlbmNpbDp4YixhbnRpYWxpYXM6aWEscHJlbXVsdGlwbGllZEFscGhhOm5hLHByZXNlcnZlRHJhd2luZ0J1ZmZlcjp6YSxwb3dlclByZWZlcmVuY2U6SmEsZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDpZYSx4ckNvbXBhdGlibGU6ITB9O0thLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLHIsITEpO0thLmFkZEV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIix2LCExKTt2YXIgUmE9YmJ8fEthLmdldENvbnRleHQoIndlYmdsIixqYil8fEthLmdldENvbnRleHQoImV4cGVyaW1lbnRhbC13ZWJnbCIsamIpO2lmKG51bGw9PT1SYSl7aWYobnVsbCE9PUthLmdldENvbnRleHQoIndlYmdsIikpdGhyb3cgRXJyb3IoIkVycm9yIGNyZWF0aW5nIFdlYkdMIGNvbnRleHQgd2l0aCB5b3VyIHNlbGVjdGVkIGF0dHJpYnV0ZXMuIik7CnRocm93IEVycm9yKCJFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0LiIpO312b2lkIDA9PT1SYS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQmJihSYS5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQ9ZnVuY3Rpb24oKXtyZXR1cm57cmFuZ2VNaW46MSxyYW5nZU1heDoxLHByZWNpc2lvbjoxfX0pfWNhdGNoKFUpe3Rocm93IGNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXI6ICIrVS5tZXNzYWdlKSxVO312YXIgTGIsZGMseWIseGQsZWMsT2MsdmcsUGgseGUsUGQsd2cseWUseWQsQmosQ2osRGosTmM7ZygpO3ZhciBkZD0idW5kZWZpbmVkIiE9PXR5cGVvZiBuYXZpZ2F0b3ImJiJ4ciJpbiBuYXZpZ2F0b3ImJiJzdXBwb3J0c1Nlc3Npb24iaW4gbmF2aWdhdG9yLnhyP25ldyBBaihqYSxSYSk6bmV3IE5oKGphKTt0aGlzLnZyPWRkO3ZhciBFaj1uZXcgdmooamEseGUsZGMubWF4VGV4dHVyZVNpemUpO3RoaXMuc2hhZG93TWFwPUVqO3RoaXMuZ2V0Q29udGV4dD1mdW5jdGlvbigpe3JldHVybiBSYX07CnRoaXMuZ2V0Q29udGV4dEF0dHJpYnV0ZXM9ZnVuY3Rpb24oKXtyZXR1cm4gUmEuZ2V0Q29udGV4dEF0dHJpYnV0ZXMoKX07dGhpcy5mb3JjZUNvbnRleHRMb3NzPWZ1bmN0aW9uKCl7dmFyIFU9TGIuZ2V0KCJXRUJHTF9sb3NlX2NvbnRleHQiKTtVJiZVLmxvc2VDb250ZXh0KCl9O3RoaXMuZm9yY2VDb250ZXh0UmVzdG9yZT1mdW5jdGlvbigpe3ZhciBVPUxiLmdldCgiV0VCR0xfbG9zZV9jb250ZXh0Iik7VSYmVS5yZXN0b3JlQ29udGV4dCgpfTt0aGlzLmdldFBpeGVsUmF0aW89ZnVuY3Rpb24oKXtyZXR1cm4gY2N9O3RoaXMuc2V0UGl4ZWxSYXRpbz1mdW5jdGlvbigpe3ZhciBVPXdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvO3ZvaWQgMCE9PVUmJihjYz1VLHRoaXMuc2V0U2l6ZShRYyx6YywhMSkpfTt0aGlzLmdldFNpemU9ZnVuY3Rpb24oVSl7dm9pZCAwPT09VSYmKGNvbnNvbGUud2FybigiV2ViR0xSZW5kZXJlcjogLmdldHNpemUoKSBub3cgcmVxdWlyZXMgYSBWZWN0b3IyIGFzIGFuIGFyZ3VtZW50IiksClU9bmV3IGYpO3JldHVybiBVLnNldChRYyx6Yyl9O3RoaXMuc2V0U2l6ZT1mdW5jdGlvbihVLGRhLG1hKXtkZC5pc1ByZXNlbnRpbmcoKT9jb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IENhbid0IGNoYW5nZSBzaXplIHdoaWxlIFZSIGRldmljZSBpcyBwcmVzZW50aW5nLiIpOihRYz1VLHpjPWRhLEthLndpZHRoPU1hdGguZmxvb3IoVSpjYyksS2EuaGVpZ2h0PU1hdGguZmxvb3IoZGEqY2MpLCExIT09bWEmJihLYS5zdHlsZS53aWR0aD1VKyJweCIsS2Euc3R5bGUuaGVpZ2h0PWRhKyJweCIpLHRoaXMuc2V0Vmlld3BvcnQoVSxkYSkpfTt0aGlzLmdldERyYXdpbmdCdWZmZXJTaXplPWZ1bmN0aW9uKFUpe3ZvaWQgMD09PVUmJihjb25zb2xlLndhcm4oIldlYkdMUmVuZGVyZXI6IC5nZXRkcmF3aW5nQnVmZmVyU2l6ZSgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjIgYXMgYW4gYXJndW1lbnQiKSxVPW5ldyBmKTtyZXR1cm4gVS5zZXQoUWMqY2MsemMqY2MpLmZsb29yKCl9Owp0aGlzLnNldERyYXdpbmdCdWZmZXJTaXplPWZ1bmN0aW9uKFUsZGEsbWEpe1FjPVU7emM9ZGE7Y2M9bWE7S2Eud2lkdGg9TWF0aC5mbG9vcihVKm1hKTtLYS5oZWlnaHQ9TWF0aC5mbG9vcihkYSptYSk7dGhpcy5zZXRWaWV3cG9ydChVLGRhKX07dGhpcy5nZXRDdXJyZW50Vmlld3BvcnQ9ZnVuY3Rpb24oVSl7dm9pZCAwPT09VSYmKGNvbnNvbGUud2FybigiV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRWaWV3cG9ydCgpIG5vdyByZXF1aXJlcyBhIFZlY3RvcjQgYXMgYW4gYXJndW1lbnQiKSxVPW5ldyBwKTtyZXR1cm4gVS5jb3B5KEtiKX07dGhpcy5nZXRWaWV3cG9ydD1mdW5jdGlvbihVKXtyZXR1cm4gVS5jb3B5KHdlKX07dGhpcy5zZXRWaWV3cG9ydD1mdW5jdGlvbihVLGRhKXsoMCkuaXNWZWN0b3I0P3dlLnNldCgoMCkueCwoMCkueSwoMCkueiwoMCkudyk6d2Uuc2V0KDAsMCxVLGRhKTt5Yi52aWV3cG9ydChLYi5jb3B5KHdlKS5tdWx0aXBseVNjYWxhcihjYykuZmxvb3IoKSl9Owp0aGlzLmdldFNjaXNzb3I9ZnVuY3Rpb24oVSl7cmV0dXJuIFUuY29weSh2ZSl9O3RoaXMuc2V0U2Npc3Nvcj1mdW5jdGlvbihVLGRhLG1hLElhKXtVLmlzVmVjdG9yND92ZS5zZXQoVS54LFUueSxVLnosVS53KTp2ZS5zZXQoVSxkYSxtYSxJYSk7eWIuc2Npc3NvcihTYi5jb3B5KHZlKS5tdWx0aXBseVNjYWxhcihjYykuZmxvb3IoKSl9O3RoaXMuZ2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oKXtyZXR1cm4gU2h9O3RoaXMuc2V0U2Npc3NvclRlc3Q9ZnVuY3Rpb24oVSl7eWIuc2V0U2Npc3NvclRlc3QoU2g9VSl9O3RoaXMuZ2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe3JldHVybiB5ZC5nZXRDbGVhckNvbG9yKCl9O3RoaXMuc2V0Q2xlYXJDb2xvcj1mdW5jdGlvbigpe3lkLnNldENsZWFyQ29sb3IuYXBwbHkoeWQsYXJndW1lbnRzKX07dGhpcy5nZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7cmV0dXJuIHlkLmdldENsZWFyQWxwaGEoKX07dGhpcy5zZXRDbGVhckFscGhhPWZ1bmN0aW9uKCl7eWQuc2V0Q2xlYXJBbHBoYS5hcHBseSh5ZCwKYXJndW1lbnRzKX07dGhpcy5jbGVhcj1mdW5jdGlvbihVLGRhLG1hKXt2YXIgSWE9MDtpZih2b2lkIDA9PT1VfHxVKUlhfD0xNjM4NDtpZih2b2lkIDA9PT1kYXx8ZGEpSWF8PTI1NjtpZih2b2lkIDA9PT1tYXx8bWEpSWF8PTEwMjQ7UmEuY2xlYXIoSWEpfTt0aGlzLmNsZWFyQ29sb3I9ZnVuY3Rpb24oKXt0aGlzLmNsZWFyKCEwLCExLCExKX07dGhpcy5jbGVhckRlcHRoPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMCwhMSl9O3RoaXMuY2xlYXJTdGVuY2lsPWZ1bmN0aW9uKCl7dGhpcy5jbGVhcighMSwhMSwhMCl9O3RoaXMuZGlzcG9zZT1mdW5jdGlvbigpe0thLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dGxvc3QiLHIsITEpO0thLnJlbW92ZUV2ZW50TGlzdGVuZXIoIndlYmdsY29udGV4dHJlc3RvcmVkIix2LCExKTt3Zy5kaXNwb3NlKCk7eWUuZGlzcG9zZSgpO2VjLmRpc3Bvc2UoKTt4ZS5kaXNwb3NlKCk7ZGQuZGlzcG9zZSgpO3lnLnN0b3AoKX07dGhpcy5yZW5kZXJCdWZmZXJJbW1lZGlhdGU9CmZ1bmN0aW9uKFUsZGEpe3liLmluaXRBdHRyaWJ1dGVzKCk7dmFyIG1hPWVjLmdldChVKTtVLmhhc1Bvc2l0aW9ucyYmIW1hLnBvc2l0aW9uJiYobWEucG9zaXRpb249UmEuY3JlYXRlQnVmZmVyKCkpO1UuaGFzTm9ybWFscyYmIW1hLm5vcm1hbCYmKG1hLm5vcm1hbD1SYS5jcmVhdGVCdWZmZXIoKSk7VS5oYXNVdnMmJiFtYS51diYmKG1hLnV2PVJhLmNyZWF0ZUJ1ZmZlcigpKTtVLmhhc0NvbG9ycyYmIW1hLmNvbG9yJiYobWEuY29sb3I9UmEuY3JlYXRlQnVmZmVyKCkpO2RhPWRhLmdldEF0dHJpYnV0ZXMoKTtVLmhhc1Bvc2l0aW9ucyYmKFJhLmJpbmRCdWZmZXIoMzQ5NjIsbWEucG9zaXRpb24pLFJhLmJ1ZmZlckRhdGEoMzQ5NjIsVS5wb3NpdGlvbkFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoZGEucG9zaXRpb24pLFJhLnZlcnRleEF0dHJpYlBvaW50ZXIoZGEucG9zaXRpb24sMyw1MTI2LCExLDAsMCkpO1UuaGFzTm9ybWFscyYmKFJhLmJpbmRCdWZmZXIoMzQ5NjIsbWEubm9ybWFsKSwKUmEuYnVmZmVyRGF0YSgzNDk2MixVLm5vcm1hbEFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoZGEubm9ybWFsKSxSYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGRhLm5vcm1hbCwzLDUxMjYsITEsMCwwKSk7VS5oYXNVdnMmJihSYS5iaW5kQnVmZmVyKDM0OTYyLG1hLnV2KSxSYS5idWZmZXJEYXRhKDM0OTYyLFUudXZBcnJheSwzNTA0OCkseWIuZW5hYmxlQXR0cmlidXRlKGRhLnV2KSxSYS52ZXJ0ZXhBdHRyaWJQb2ludGVyKGRhLnV2LDIsNTEyNiwhMSwwLDApKTtVLmhhc0NvbG9ycyYmKFJhLmJpbmRCdWZmZXIoMzQ5NjIsbWEuY29sb3IpLFJhLmJ1ZmZlckRhdGEoMzQ5NjIsVS5jb2xvckFycmF5LDM1MDQ4KSx5Yi5lbmFibGVBdHRyaWJ1dGUoZGEuY29sb3IpLFJhLnZlcnRleEF0dHJpYlBvaW50ZXIoZGEuY29sb3IsMyw1MTI2LCExLDAsMCkpO3liLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCk7UmEuZHJhd0FycmF5cyg0LDAsVS5jb3VudCk7VS5jb3VudD0wfTt0aGlzLnJlbmRlckJ1ZmZlckRpcmVjdD0KZnVuY3Rpb24oVSxkYSxtYSxJYSxPYSxhYil7eWIuc2V0TWF0ZXJpYWwoSWEsT2EuaXNNZXNoJiYwPk9hLm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkpO3ZhciBQYT1oYShVLGRhLElhLE9hKSxmYj0hMTtpZihjIT09bWEuaWR8fGViIT09UGEuaWR8fG1iIT09KCEwPT09SWEud2lyZWZyYW1lKSljPW1hLmlkLGViPVBhLmlkLG1iPSEwPT09SWEud2lyZWZyYW1lLGZiPSEwO09hLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyYmKEJqLnVwZGF0ZShPYSxtYSxJYSxQYSksZmI9ITApO3ZhciBDYj1tYS5pbmRleCxvYj1tYS5hdHRyaWJ1dGVzLnBvc2l0aW9uO2RhPTE7ITA9PT1JYS53aXJlZnJhbWUmJihDYj1QaC5nZXRXaXJlZnJhbWVBdHRyaWJ1dGUobWEpLGRhPTIpO1U9Q2o7aWYobnVsbCE9PUNiKXt2YXIgJGE9dmcuZ2V0KENiKTtVPURqO1Uuc2V0SW5kZXgoJGEpfWZiJiYoUChJYSxQYSxtYSksbnVsbCE9PUNiJiZSYS5iaW5kQnVmZmVyKDM0OTYzLCRhLmJ1ZmZlcikpOyRhPUluZmluaXR5OwpudWxsIT09Q2I/JGE9Q2IuY291bnQ6dm9pZCAwIT09b2ImJigkYT1vYi5jb3VudCk7b2I9bWEuZHJhd1JhbmdlLnN0YXJ0KmRhO1BhPW51bGwhPT1hYj9hYi5zdGFydCpkYTowO0NiPU1hdGgubWF4KG9iLFBhKTthYj1NYXRoLm1heCgwLE1hdGgubWluKCRhLG9iK21hLmRyYXdSYW5nZS5jb3VudCpkYSxQYSsobnVsbCE9PWFiP2FiLmNvdW50KmRhOkluZmluaXR5KSktMS1DYisxKTtpZigwIT09YWIpe2lmKE9hLmlzTWVzaClpZighMD09PUlhLndpcmVmcmFtZSl5Yi5zZXRMaW5lV2lkdGgoSWEud2lyZWZyYW1lTGluZXdpZHRoKmUoKSksVS5zZXRNb2RlKDEpO2Vsc2Ugc3dpdGNoKE9hLmRyYXdNb2RlKXtjYXNlIDA6VS5zZXRNb2RlKDQpO2JyZWFrO2Nhc2UgMTpVLnNldE1vZGUoNSk7YnJlYWs7Y2FzZSAyOlUuc2V0TW9kZSg2KX1lbHNlIE9hLmlzTGluZT8oSWE9SWEubGluZXdpZHRoLHZvaWQgMD09PUlhJiYoSWE9MSkseWIuc2V0TGluZVdpZHRoKElhKmUoKSksT2EuaXNMaW5lU2VnbWVudHM/ClUuc2V0TW9kZSgxKTpPYS5pc0xpbmVMb29wP1Uuc2V0TW9kZSgyKTpVLnNldE1vZGUoMykpOk9hLmlzUG9pbnRzP1Uuc2V0TW9kZSgwKTpPYS5pc1Nwcml0ZSYmVS5zZXRNb2RlKDQpO21hJiZtYS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PzA8bWEubWF4SW5zdGFuY2VkQ291bnQmJlUucmVuZGVySW5zdGFuY2VzKG1hLENiLGFiKTpVLnJlbmRlcihDYixhYil9fTt0aGlzLmNvbXBpbGU9ZnVuY3Rpb24oVSxkYSl7Y2I9eWUuZ2V0KFUsZGEpO2NiLmluaXQoKTtVLnRyYXZlcnNlKGZ1bmN0aW9uKG1hKXttYS5pc0xpZ2h0JiYoY2IucHVzaExpZ2h0KG1hKSxtYS5jYXN0U2hhZG93JiZjYi5wdXNoU2hhZG93KG1hKSl9KTtjYi5zZXR1cExpZ2h0cyhkYSk7VS50cmF2ZXJzZShmdW5jdGlvbihtYSl7aWYobWEubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheShtYS5tYXRlcmlhbCkpZm9yKHZhciBJYT0wO0lhPG1hLm1hdGVyaWFsLmxlbmd0aDtJYSsrKVcobWEubWF0ZXJpYWxbSWFdLFUuZm9nLAptYSk7ZWxzZSBXKG1hLm1hdGVyaWFsLFUuZm9nLG1hKX0pfTt2YXIgVGg9bnVsbCx5Zz1uZXcgYmM7eWcuc2V0QW5pbWF0aW9uTG9vcChmdW5jdGlvbihVKXtkZC5pc1ByZXNlbnRpbmcoKXx8VGgmJlRoKFUpfSk7InVuZGVmaW5lZCIhPT10eXBlb2Ygd2luZG93JiZ5Zy5zZXRDb250ZXh0KHdpbmRvdyk7dGhpcy5zZXRBbmltYXRpb25Mb29wPWZ1bmN0aW9uKFUpe1RoPVU7ZGQuc2V0QW5pbWF0aW9uTG9vcChVKTt5Zy5zdGFydCgpfTt0aGlzLnJlbmRlcj1mdW5jdGlvbihVLGRhLG1hLElhKXtpZih2b2lkIDAhPT1tYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlbmRlcigpOiB0aGUgcmVuZGVyVGFyZ2V0IGFyZ3VtZW50IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuc2V0UmVuZGVyVGFyZ2V0KCkgaW5zdGVhZC4iKTt2YXIgT2E9bWF9aWYodm9pZCAwIT09SWEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXIoKTogdGhlIGZvcmNlQ2xlYXIgYXJndW1lbnQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5jbGVhcigpIGluc3RlYWQuIik7CnZhciBhYj1JYX1kYSYmZGEuaXNDYW1lcmE/R2F8fChlYj1jPW51bGwsbWI9ITEsUWE9LTEscGI9bnVsbCwhMD09PVUuYXV0b1VwZGF0ZSYmVS51cGRhdGVNYXRyaXhXb3JsZCgpLG51bGw9PT1kYS5wYXJlbnQmJmRhLnVwZGF0ZU1hdHJpeFdvcmxkKCksZGQuZW5hYmxlZCYmKGRhPWRkLmdldENhbWVyYShkYSkpLGNiPXllLmdldChVLGRhKSxjYi5pbml0KCksVS5vbkJlZm9yZVJlbmRlcihqYSxVLGRhLE9hfHxpYiksd2YubXVsdGlwbHlNYXRyaWNlcyhkYS5wcm9qZWN0aW9uTWF0cml4LGRhLm1hdHJpeFdvcmxkSW52ZXJzZSksUWguc2V0RnJvbU1hdHJpeCh3ZiksUmg9dGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZCx4Zz15Yy5pbml0KHRoaXMuY2xpcHBpbmdQbGFuZXMsUmgsZGEpLE5hPXdnLmdldChVLGRhKSxOYS5pbml0KCksUihVLGRhLDAsamEuc29ydE9iamVjdHMpLCEwPT09amEuc29ydE9iamVjdHMmJk5hLnNvcnQoKSx4ZyYmeWMuYmVnaW5TaGFkb3dzKCksRWoucmVuZGVyKGNiLnN0YXRlLnNoYWRvd3NBcnJheSwKVSxkYSksY2Iuc2V0dXBMaWdodHMoZGEpLHhnJiZ5Yy5lbmRTaGFkb3dzKCksdGhpcy5pbmZvLmF1dG9SZXNldCYmdGhpcy5pbmZvLnJlc2V0KCksdm9pZCAwIT09T2EmJnRoaXMuc2V0UmVuZGVyVGFyZ2V0KE9hKSx5ZC5yZW5kZXIoTmEsVSxkYSxhYiksbWE9TmEub3BhcXVlLElhPU5hLnRyYW5zcGFyZW50LFUub3ZlcnJpZGVNYXRlcmlhbD8oT2E9VS5vdmVycmlkZU1hdGVyaWFsLG1hLmxlbmd0aCYmUyhtYSxVLGRhLE9hKSxJYS5sZW5ndGgmJlMoSWEsVSxkYSxPYSkpOihtYS5sZW5ndGgmJlMobWEsVSxkYSksSWEubGVuZ3RoJiZTKElhLFUsZGEpKSxudWxsIT09aWImJihPYy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoaWIpLE9jLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KGliKSkseWIuYnVmZmVycy5kZXB0aC5zZXRUZXN0KCEwKSx5Yi5idWZmZXJzLmRlcHRoLnNldE1hc2soITApLHliLmJ1ZmZlcnMuY29sb3Iuc2V0TWFzayghMCkseWIuc2V0UG9seWdvbk9mZnNldCghMSksCmRkLmVuYWJsZWQmJmRkLnN1Ym1pdEZyYW1lKCksY2I9TmE9bnVsbCk6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLiIpfTt0aGlzLnNldEZyYW1lYnVmZmVyPWZ1bmN0aW9uKFUpe0xhIT09VSYmUmEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLFUpO0xhPVV9O3RoaXMuZ2V0QWN0aXZlQ3ViZUZhY2U9ZnVuY3Rpb24oKXtyZXR1cm4gbmJ9O3RoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWw9ZnVuY3Rpb24oKXtyZXR1cm4gVmF9O3RoaXMuZ2V0UmVuZGVyVGFyZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIGlifTt0aGlzLnNldFJlbmRlclRhcmdldD1mdW5jdGlvbihVLGRhLG1hKXtpYj1VO25iPWRhO1ZhPW1hO1UmJnZvaWQgMD09PWVjLmdldChVKS5fX3dlYmdsRnJhbWVidWZmZXImJk9jLnNldHVwUmVuZGVyVGFyZ2V0KFUpO3ZhciBJYT1MYSxPYT0hMTtVPyhJYT1lYy5nZXQoVSkuX193ZWJnbEZyYW1lYnVmZmVyLApVLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPyhJYT1JYVtkYXx8MF0sT2E9ITApOklhPVUuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0P2VjLmdldChVKS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI6SWEsS2IuY29weShVLnZpZXdwb3J0KSxTYi5jb3B5KFUuc2Npc3NvciksbmM9VS5zY2lzc29yVGVzdCk6KEtiLmNvcHkod2UpLm11bHRpcGx5U2NhbGFyKGNjKS5mbG9vcigpLFNiLmNvcHkodmUpLm11bHRpcGx5U2NhbGFyKGNjKS5mbG9vcigpLG5jPVNoKTtrYiE9PUlhJiYoUmEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLElhKSxrYj1JYSk7eWIudmlld3BvcnQoS2IpO3liLnNjaXNzb3IoU2IpO3liLnNldFNjaXNzb3JUZXN0KG5jKTtPYSYmKFU9ZWMuZ2V0KFUudGV4dHVyZSksUmEuZnJhbWVidWZmZXJUZXh0dXJlMkQoMzYxNjAsMzYwNjQsMzQwNjkrKGRhfHwwKSxVLl9fd2ViZ2xUZXh0dXJlLG1hfHwwKSl9O3RoaXMucmVhZFJlbmRlclRhcmdldFBpeGVscz1mdW5jdGlvbihVLApkYSxtYSxJYSxPYSxhYixQYSl7aWYoVSYmVS5pc1dlYkdMUmVuZGVyVGFyZ2V0KXt2YXIgZmI9ZWMuZ2V0KFUpLl9fd2ViZ2xGcmFtZWJ1ZmZlcjtVLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlJiZ2b2lkIDAhPT1QYSYmKGZiPWZiW1BhXSk7aWYoZmIpe1BhPSExO2ZiIT09a2ImJihSYS5iaW5kRnJhbWVidWZmZXIoMzYxNjAsZmIpLFBhPSEwKTt0cnl7dmFyIENiPVUudGV4dHVyZSxvYj1DYi5mb3JtYXQsJGE9Q2IudHlwZTsxMDIzIT09b2ImJk5jLmNvbnZlcnQob2IpIT09UmEuZ2V0UGFyYW1ldGVyKDM1NzM5KT9jb25zb2xlLmVycm9yKCJUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gUkdCQSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZvcm1hdC4iKToxMDA5PT09JGF8fE5jLmNvbnZlcnQoJGEpPT09UmEuZ2V0UGFyYW1ldGVyKDM1NzM4KXx8MTAxNT09PSRhJiYoZGMuaXNXZWJHTDJ8fExiLmdldCgiT0VTX3RleHR1cmVfZmxvYXQiKXx8CkxiLmdldCgiV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0IikpfHwxMDE2PT09JGEmJihkYy5pc1dlYkdMMj9MYi5nZXQoIkVYVF9jb2xvcl9idWZmZXJfZmxvYXQiKTpMYi5nZXQoIkVYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCIpKT8zNjA1Mz09PVJhLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoMzYxNjApPzA8PWRhJiZkYTw9VS53aWR0aC1JYSYmMDw9bWEmJm1hPD1VLmhlaWdodC1PYSYmUmEucmVhZFBpeGVscyhkYSxtYSxJYSxPYSxOYy5jb252ZXJ0KG9iKSxOYy5jb252ZXJ0KCRhKSxhYik6Y29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZWFkUGl4ZWxzIGZyb20gcmVuZGVyVGFyZ2V0IGZhaWxlZC4gRnJhbWVidWZmZXIgbm90IGNvbXBsZXRlLiIpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBVbnNpZ25lZEJ5dGVUeXBlIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgdHlwZS4iKX1maW5hbGx5e1BhJiYKUmEuYmluZEZyYW1lYnVmZmVyKDM2MTYwLGtiKX19fWVsc2UgY29uc29sZS5lcnJvcigiVEhSRUUuV2ViR0xSZW5kZXJlci5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzOiByZW5kZXJUYXJnZXQgaXMgbm90IFRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0LiIpfTt0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZT1mdW5jdGlvbihVLGRhLG1hKXt2YXIgSWE9ZGEuaW1hZ2Uud2lkdGgsT2E9ZGEuaW1hZ2UuaGVpZ2h0LGFiPU5jLmNvbnZlcnQoZGEuZm9ybWF0KTtPYy5zZXRUZXh0dXJlMkQoZGEsMCk7UmEuY29weVRleEltYWdlMkQoMzU1MyxtYXx8MCxhYixVLngsVS55LElhLE9hLDApfTt0aGlzLmNvcHlUZXh0dXJlVG9UZXh0dXJlPWZ1bmN0aW9uKFUsZGEsbWEsSWEpe3ZhciBPYT1kYS5pbWFnZS53aWR0aCxhYj1kYS5pbWFnZS5oZWlnaHQsUGE9TmMuY29udmVydChtYS5mb3JtYXQpLGZiPU5jLmNvbnZlcnQobWEudHlwZSk7T2Muc2V0VGV4dHVyZTJEKG1hLDApO2RhLmlzRGF0YVRleHR1cmU/ClJhLnRleFN1YkltYWdlMkQoMzU1MyxJYXx8MCxVLngsVS55LE9hLGFiLFBhLGZiLGRhLmltYWdlLmRhdGEpOlJhLnRleFN1YkltYWdlMkQoMzU1MyxJYXx8MCxVLngsVS55LFBhLGZiLGRhLmltYWdlKX07InVuZGVmaW5lZCIhPT10eXBlb2YgX19USFJFRV9ERVZUT09MU19fJiZfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoIm9ic2VydmUiLHtkZXRhaWw6dGhpc30pKX1mdW5jdGlvbiB6ZyhhLGMpe3RoaXMubmFtZT0iIjt0aGlzLmNvbG9yPW5ldyBJKGEpO3RoaXMuZGVuc2l0eT12b2lkIDAhPT1jP2M6Mi41RS00fWZ1bmN0aW9uIEFnKGEsYyxlKXt0aGlzLm5hbWU9IiI7dGhpcy5jb2xvcj1uZXcgSShhKTt0aGlzLm5lYXI9dm9pZCAwIT09Yz9jOjE7dGhpcy5mYXI9dm9pZCAwIT09ZT9lOjFFM31mdW5jdGlvbiBRZChhLGMpe3RoaXMuYXJyYXk9YTt0aGlzLnN0cmlkZT1jO3RoaXMuY291bnQ9dm9pZCAwIT09YT9hLmxlbmd0aC9jOjA7dGhpcy5keW5hbWljPQohMTt0aGlzLnVwZGF0ZVJhbmdlPXtvZmZzZXQ6MCxjb3VudDotMX07dGhpcy52ZXJzaW9uPTB9ZnVuY3Rpb24geGYoYSxjLGUsZyl7dGhpcy5kYXRhPWE7dGhpcy5pdGVtU2l6ZT1jO3RoaXMub2Zmc2V0PWU7dGhpcy5ub3JtYWxpemVkPSEwPT09Z31mdW5jdGlvbiBBZChhKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcHJpdGVNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgxNjc3NzIxNSk7dGhpcy5tYXA9bnVsbDt0aGlzLnJvdGF0aW9uPTA7dGhpcy5zaXplQXR0ZW51YXRpb249ITA7dGhpcy5saWdodHM9ITE7dGhpcy50cmFuc3BhcmVudD0hMDt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiB5ZihhKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcHJpdGUiO2lmKHZvaWQgMD09PUFlKXtBZT1uZXcgdmE7dmFyIGM9bmV3IFFkKG5ldyBGbG9hdDMyQXJyYXkoWy0uNSwtLjUsMCwwLDAsLjUsLS41LDAsMSwwLC41LC41LDAsMSwxLC0uNSwuNSwwLDAsMV0pLDUpO0FlLnNldEluZGV4KFswLAoxLDIsMCwyLDNdKTtBZS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgeGYoYywzLDAsITEpKTtBZS5hZGRBdHRyaWJ1dGUoInV2IixuZXcgeGYoYywyLDMsITEpKX10aGlzLmdlb21ldHJ5PUFlO3RoaXMubWF0ZXJpYWw9dm9pZCAwIT09YT9hOm5ldyBBZDt0aGlzLmNlbnRlcj1uZXcgZiguNSwuNSl9ZnVuY3Rpb24gQmcoYSxjLGUsZyxyLHYpe0JlLnN1YlZlY3RvcnMoYSxlKS5hZGRTY2FsYXIoLjUpLm11bHRpcGx5KGcpO3ZvaWQgMCE9PXI/KHpmLng9dipCZS54LXIqQmUueSx6Zi55PXIqQmUueCt2KkJlLnkpOnpmLmNvcHkoQmUpO2EuY29weShjKTthLngrPXpmLng7YS55Kz16Zi55O2EuYXBwbHlNYXRyaXg0KEZqKX1mdW5jdGlvbiBBZigpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxPRCI7T2JqZWN0LmRlZmluZVByb3BlcnRpZXModGhpcyx7bGV2ZWxzOntlbnVtZXJhYmxlOiEwLHZhbHVlOltdfX0pO3RoaXMuYXV0b1VwZGF0ZT0hMH1mdW5jdGlvbiBCZihhLGMpe2EmJmEuaXNHZW9tZXRyeSYmCmNvbnNvbGUuZXJyb3IoIlRIUkVFLlNraW5uZWRNZXNoIG5vIGxvbmdlciBzdXBwb3J0cyBUSFJFRS5HZW9tZXRyeS4gVXNlIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuIik7eGEuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJTa2lubmVkTWVzaCI7dGhpcy5iaW5kTW9kZT0iYXR0YWNoZWQiO3RoaXMuYmluZE1hdHJpeD1uZXcgcTt0aGlzLmJpbmRNYXRyaXhJbnZlcnNlPW5ldyBxfWZ1bmN0aW9uIENnKGEsYyl7YT1hfHxbXTt0aGlzLmJvbmVzPWEuc2xpY2UoMCk7dGhpcy5ib25lTWF0cmljZXM9bmV3IEZsb2F0MzJBcnJheSgxNip0aGlzLmJvbmVzLmxlbmd0aCk7aWYodm9pZCAwPT09Yyl0aGlzLmNhbGN1bGF0ZUludmVyc2VzKCk7ZWxzZSBpZih0aGlzLmJvbmVzLmxlbmd0aD09PWMubGVuZ3RoKXRoaXMuYm9uZUludmVyc2VzPWMuc2xpY2UoMCk7ZWxzZSBmb3IoY29uc29sZS53YXJuKCJUSFJFRS5Ta2VsZXRvbiBib25lSW52ZXJzZXMgaXMgdGhlIHdyb25nIGxlbmd0aC4iKSwKdGhpcy5ib25lSW52ZXJzZXM9W10sYT0wLGM9dGhpcy5ib25lcy5sZW5ndGg7YTxjO2ErKyl0aGlzLmJvbmVJbnZlcnNlcy5wdXNoKG5ldyBxKX1mdW5jdGlvbiBVaCgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkJvbmUifWZ1bmN0aW9uIEZiKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVCYXNpY01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLmxpbmV3aWR0aD0xO3RoaXMubGluZWpvaW49dGhpcy5saW5lY2FwPSJyb3VuZCI7dGhpcy5saWdodHM9ITE7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gVmIoYSxjLGUpezE9PT1lJiZjb25zb2xlLmVycm9yKCJUSFJFRS5MaW5lOiBwYXJhbWV0ZXIgVEhSRUUuTGluZVBpZWNlcyBubyBsb25nZXIgc3VwcG9ydGVkLiBVc2UgVEhSRUUuTGluZVNlZ21lbnRzIGluc3RlYWQuIik7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGluZSI7dGhpcy5nZW9tZXRyeT12b2lkIDAhPT1hP2E6bmV3IHZhO3RoaXMubWF0ZXJpYWw9CnZvaWQgMCE9PWM/YzpuZXcgRmIoe2NvbG9yOjE2Nzc3MjE1Kk1hdGgucmFuZG9tKCl9KX1mdW5jdGlvbiBJYihhLGMpe1ZiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iTGluZVNlZ21lbnRzIn1mdW5jdGlvbiBEZyhhLGMpe1ZiLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iTGluZUxvb3AifWZ1bmN0aW9uIEFjKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvaW50c01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLm1hcD1udWxsO3RoaXMuc2l6ZT0xO3RoaXMuc2l6ZUF0dGVudWF0aW9uPSEwO3RoaXMubGlnaHRzPXRoaXMubW9ycGhUYXJnZXRzPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIENlKGEsYyl7QS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUG9pbnRzIjt0aGlzLmdlb21ldHJ5PXZvaWQgMCE9PWE/YTpuZXcgdmE7dGhpcy5tYXRlcmlhbD12b2lkIDAhPT1jP2M6bmV3IEFjKHtjb2xvcjoxNjc3NzIxNSpNYXRoLnJhbmRvbSgpfSk7dGhpcy51cGRhdGVNb3JwaFRhcmdldHMoKX0KZnVuY3Rpb24gVmgoYSxjLGUsZyxyLHYseil7dmFyIEU9V2guZGlzdGFuY2VTcVRvUG9pbnQoYSk7RTxlJiYoZT1uZXcgayxXaC5jbG9zZXN0UG9pbnRUb1BvaW50KGEsZSksZS5hcHBseU1hdHJpeDQoZyksYT1yLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhlKSxhPHIubmVhcnx8YT5yLmZhcnx8di5wdXNoKHtkaXN0YW5jZTphLGRpc3RhbmNlVG9SYXk6TWF0aC5zcXJ0KEUpLHBvaW50OmUsaW5kZXg6YyxmYWNlOm51bGwsb2JqZWN0Onp9KSl9ZnVuY3Rpb24gWGgoYSxjLGUsZyxyLHYseixFLEYpe2wuY2FsbCh0aGlzLGEsYyxlLGcscix2LHosRSxGKTt0aGlzLmZvcm1hdD12b2lkIDAhPT16P3o6MTAyMjt0aGlzLm1pbkZpbHRlcj12b2lkIDAhPT12P3Y6MTAwNjt0aGlzLm1hZ0ZpbHRlcj12b2lkIDAhPT1yP3I6MTAwNjt0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMX1mdW5jdGlvbiBEZShhLGMsZSxnLHIsdix6LEUsRixKLFAsUil7bC5jYWxsKHRoaXMsbnVsbCx2LHosRSxGLEosZyxyLFAsClIpO3RoaXMuaW1hZ2U9e3dpZHRoOmMsaGVpZ2h0OmV9O3RoaXMubWlwbWFwcz1hO3RoaXMuZ2VuZXJhdGVNaXBtYXBzPXRoaXMuZmxpcFk9ITF9ZnVuY3Rpb24gQ2YoYSxjLGUsZyxyLHYseixFLEYpe2wuY2FsbCh0aGlzLGEsYyxlLGcscix2LHosRSxGKTt0aGlzLm5lZWRzVXBkYXRlPSEwfWZ1bmN0aW9uIERmKGEsYyxlLGcscix2LHosRSxGLEope0o9dm9pZCAwIT09Sj9KOjEwMjY7aWYoMTAyNiE9PUomJjEwMjchPT1KKXRocm93IEVycm9yKCJEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCIpO3ZvaWQgMD09PWUmJjEwMjY9PT1KJiYoZT0xMDEyKTt2b2lkIDA9PT1lJiYxMDI3PT09SiYmKGU9MTAyMCk7bC5jYWxsKHRoaXMsbnVsbCxnLHIsdix6LEUsSixlLEYpO3RoaXMuaW1hZ2U9e3dpZHRoOmEsaGVpZ2h0OmN9O3RoaXMubWFnRmlsdGVyPXZvaWQgMCE9PXo/ejoxMDAzO3RoaXMubWluRmlsdGVyPQp2b2lkIDAhPT1FP0U6MTAwMzt0aGlzLmdlbmVyYXRlTWlwbWFwcz10aGlzLmZsaXBZPSExfWZ1bmN0aW9uIEVlKGEpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJXaXJlZnJhbWVHZW9tZXRyeSI7dmFyIGM9W10sZSxnLHIsdj1bMCwwXSx6PXt9LEU9WyJhIiwiYiIsImMiXTtpZihhJiZhLmlzR2VvbWV0cnkpe3ZhciBGPWEuZmFjZXM7dmFyIEo9MDtmb3IoZz1GLmxlbmd0aDtKPGc7SisrKXt2YXIgUD1GW0pdO2ZvcihlPTA7Mz5lO2UrKyl7dmFyIFI9UFtFW2VdXTt2YXIgUz1QW0VbKGUrMSklM11dO3ZbMF09TWF0aC5taW4oUixTKTt2WzFdPU1hdGgubWF4KFIsUyk7Uj12WzBdKyIsIit2WzFdO3ZvaWQgMD09PXpbUl0mJih6W1JdPXtpbmRleDE6dlswXSxpbmRleDI6dlsxXX0pfX1mb3IoUiBpbiB6KUo9eltSXSxFPWEudmVydGljZXNbSi5pbmRleDFdLGMucHVzaChFLngsRS55LEUueiksRT1hLnZlcnRpY2VzW0ouaW5kZXgyXSxjLnB1c2goRS54LEUueSxFLnopfWVsc2UgaWYoYSYmCmEuaXNCdWZmZXJHZW9tZXRyeSlpZihFPW5ldyBrLG51bGwhPT1hLmluZGV4KXtGPWEuYXR0cmlidXRlcy5wb3NpdGlvbjtQPWEuaW5kZXg7dmFyIFY9YS5ncm91cHM7MD09PVYubGVuZ3RoJiYoVj1be3N0YXJ0OjAsY291bnQ6UC5jb3VudCxtYXRlcmlhbEluZGV4OjB9XSk7YT0wO2ZvcihyPVYubGVuZ3RoO2E8cjsrK2EpZm9yKEo9VlthXSxlPUouc3RhcnQsZz1KLmNvdW50LEo9ZSxnPWUrZztKPGc7Sis9Mylmb3IoZT0wOzM+ZTtlKyspUj1QLmdldFgoSitlKSxTPVAuZ2V0WChKKyhlKzEpJTMpLHZbMF09TWF0aC5taW4oUixTKSx2WzFdPU1hdGgubWF4KFIsUyksUj12WzBdKyIsIit2WzFdLHZvaWQgMD09PXpbUl0mJih6W1JdPXtpbmRleDE6dlswXSxpbmRleDI6dlsxXX0pO2ZvcihSIGluIHopSj16W1JdLEUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShGLEouaW5kZXgxKSxjLnB1c2goRS54LEUueSxFLnopLEUuZnJvbUJ1ZmZlckF0dHJpYnV0ZShGLEouaW5kZXgyKSxjLnB1c2goRS54LApFLnksRS56KX1lbHNlIGZvcihGPWEuYXR0cmlidXRlcy5wb3NpdGlvbixKPTAsZz1GLmNvdW50LzM7SjxnO0orKylmb3IoZT0wOzM+ZTtlKyspej0zKkorZSxFLmZyb21CdWZmZXJBdHRyaWJ1dGUoRix6KSxjLnB1c2goRS54LEUueSxFLnopLHo9MypKKyhlKzEpJTMsRS5mcm9tQnVmZmVyQXR0cmlidXRlKEYseiksYy5wdXNoKEUueCxFLnksRS56KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShjLDMpKX1mdW5jdGlvbiBFZihhLGMsZSl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBhcmFtZXRyaWNHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtmdW5jOmEsc2xpY2VzOmMsc3RhY2tzOmV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBGZShhLGMsZSkpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEZlKGEsYyxlKXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2Z1bmM6YSwKc2xpY2VzOmMsc3RhY2tzOmV9O3ZhciBnPVtdLHI9W10sdj1bXSx6PVtdLEU9bmV3IGssRj1uZXcgayxKPW5ldyBrLFA9bmV3IGssUj1uZXcgayxTLFY7Mz5hLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuUGFyYW1ldHJpY0dlb21ldHJ5OiBGdW5jdGlvbiBtdXN0IG5vdyBtb2RpZnkgYSBWZWN0b3IzIGFzIHRoaXJkIHBhcmFtZXRlci4iKTt2YXIgVz1jKzE7Zm9yKFM9MDtTPD1lO1MrKyl7dmFyIGhhPVMvZTtmb3IoVj0wO1Y8PWM7VisrKXt2YXIgZmE9Vi9jO2EoZmEsaGEsRik7ci5wdXNoKEYueCxGLnksRi56KTswPD1mYS0xRS01PyhhKGZhLTFFLTUsaGEsSiksUC5zdWJWZWN0b3JzKEYsSikpOihhKGZhKzFFLTUsaGEsSiksUC5zdWJWZWN0b3JzKEosRikpOzA8PWhhLTFFLTU/KGEoZmEsaGEtMUUtNSxKKSxSLnN1YlZlY3RvcnMoRixKKSk6KGEoZmEsaGErMUUtNSxKKSxSLnN1YlZlY3RvcnMoSixGKSk7RS5jcm9zc1ZlY3RvcnMoUCxSKS5ub3JtYWxpemUoKTt2LnB1c2goRS54LApFLnksRS56KTt6LnB1c2goZmEsaGEpfX1mb3IoUz0wO1M8ZTtTKyspZm9yKFY9MDtWPGM7VisrKWE9UypXK1YrMSxFPShTKzEpKlcrVisxLEY9KFMrMSkqVytWLGcucHVzaChTKlcrVixhLEYpLGcucHVzaChhLEUsRik7dGhpcy5zZXRJbmRleChnKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShyLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EodiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoeiwyKSl9ZnVuY3Rpb24gRmYoYSxjLGUsZyl7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvbHloZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt2ZXJ0aWNlczphLGluZGljZXM6YyxyYWRpdXM6ZSxkZXRhaWw6Z307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IGpjKGEsYyxlLGcpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBqYyhhLGMsZSxnKXtmdW5jdGlvbiByKFcsaGEsZmEscmEpe3JhPU1hdGgucG93KDIsCnJhKTt2YXIgcGE9W10scWEsdWE7Zm9yKHFhPTA7cWE8PXJhO3FhKyspe3BhW3FhXT1bXTt2YXIgb2E9Vy5jbG9uZSgpLmxlcnAoZmEscWEvcmEpLHRhPWhhLmNsb25lKCkubGVycChmYSxxYS9yYSksQmE9cmEtcWE7Zm9yKHVhPTA7dWE8PUJhO3VhKyspcGFbcWFdW3VhXT0wPT09dWEmJnFhPT09cmE/b2E6b2EuY2xvbmUoKS5sZXJwKHRhLHVhL0JhKX1mb3IocWE9MDtxYTxyYTtxYSsrKWZvcih1YT0wO3VhPDIqKHJhLXFhKS0xO3VhKyspVz1NYXRoLmZsb29yKHVhLzIpLDA9PT11YSUyPyh6KHBhW3FhXVtXKzFdKSx6KHBhW3FhKzFdW1ddKSx6KHBhW3FhXVtXXSkpOih6KHBhW3FhXVtXKzFdKSx6KHBhW3FhKzFdW1crMV0pLHoocGFbcWErMV1bV10pKX1mdW5jdGlvbiB2KCl7Zm9yKHZhciBXPTA7VzxWLmxlbmd0aDtXKz02KXt2YXIgaGE9VltXKzBdLGZhPVZbVysyXSxyYT1WW1crNF0scGE9TWF0aC5taW4oaGEsZmEscmEpOy45PE1hdGgubWF4KGhhLGZhLHJhKSYmLjE+cGEmJiguMj4KaGEmJihWW1crMF0rPTEpLC4yPmZhJiYoVltXKzJdKz0xKSwuMj5yYSYmKFZbVys0XSs9MSkpfX1mdW5jdGlvbiB6KFcpe1MucHVzaChXLngsVy55LFcueil9ZnVuY3Rpb24gRShXLGhhKXtXKj0zO2hhLng9YVtXKzBdO2hhLnk9YVtXKzFdO2hhLno9YVtXKzJdfWZ1bmN0aW9uIEYoKXtmb3IodmFyIFc9bmV3IGssaGE9bmV3IGssZmE9bmV3IGsscmE9bmV3IGsscGE9bmV3IGYscWE9bmV3IGYsdWE9bmV3IGYsb2E9MCx0YT0wO29hPFMubGVuZ3RoO29hKz05LHRhKz02KXtXLnNldChTW29hKzBdLFNbb2ErMV0sU1tvYSsyXSk7aGEuc2V0KFNbb2ErM10sU1tvYSs0XSxTW29hKzVdKTtmYS5zZXQoU1tvYSs2XSxTW29hKzddLFNbb2ErOF0pO3BhLnNldChWW3RhKzBdLFZbdGErMV0pO3FhLnNldChWW3RhKzJdLFZbdGErM10pO3VhLnNldChWW3RhKzRdLFZbdGErNV0pO3JhLmNvcHkoVykuYWRkKGhhKS5hZGQoZmEpLmRpdmlkZVNjYWxhcigzKTt2YXIgQmE9UChyYSk7SihwYSx0YSswLFcsCkJhKTtKKHFhLHRhKzIsaGEsQmEpO0oodWEsdGErNCxmYSxCYSl9fWZ1bmN0aW9uIEooVyxoYSxmYSxyYSl7MD5yYSYmMT09PVcueCYmKFZbaGFdPVcueC0xKTswPT09ZmEueCYmMD09PWZhLnomJihWW2hhXT1yYS8yL01hdGguUEkrLjUpfWZ1bmN0aW9uIFAoVyl7cmV0dXJuIE1hdGguYXRhbjIoVy56LC1XLngpfWZ1bmN0aW9uIFIoVyl7cmV0dXJuIE1hdGguYXRhbjIoLVcueSxNYXRoLnNxcnQoVy54KlcueCtXLnoqVy56KSl9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXt2ZXJ0aWNlczphLGluZGljZXM6YyxyYWRpdXM6ZSxkZXRhaWw6Z307ZT1lfHwxO2c9Z3x8MDt2YXIgUz1bXSxWPVtdOyhmdW5jdGlvbihXKXtmb3IodmFyIGhhPW5ldyBrLGZhPW5ldyBrLHJhPW5ldyBrLHBhPTA7cGE8Yy5sZW5ndGg7cGErPTMpRShjW3BhKzBdLGhhKSxFKGNbcGErMV0sZmEpLEUoY1twYSsyXSxyYSkscihoYSxmYSxyYSwKVyl9KShnKTsoZnVuY3Rpb24oVyl7Zm9yKHZhciBoYT1uZXcgayxmYT0wO2ZhPFMubGVuZ3RoO2ZhKz0zKWhhLng9U1tmYSswXSxoYS55PVNbZmErMV0saGEuej1TW2ZhKzJdLGhhLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKFcpLFNbZmErMF09aGEueCxTW2ZhKzFdPWhhLnksU1tmYSsyXT1oYS56fSkoZSk7KGZ1bmN0aW9uKCl7Zm9yKHZhciBXPW5ldyBrLGhhPTA7aGE8Uy5sZW5ndGg7aGErPTMpe1cueD1TW2hhKzBdO1cueT1TW2hhKzFdO1cuej1TW2hhKzJdO3ZhciBmYT1QKFcpLzIvTWF0aC5QSSsuNSxyYT1SKFcpL01hdGguUEkrLjU7Vi5wdXNoKGZhLDEtcmEpfUYoKTt2KCl9KSgpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKFMsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYShTLnNsaWNlKCksMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKFYsMikpOzA9PT1nP3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTp0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKX0KZnVuY3Rpb24gR2YoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVGV0cmFoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEdlKGEsYykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEdlKGEsYyl7amMuY2FsbCh0aGlzLFsxLDEsMSwtMSwtMSwxLC0xLDEsLTEsMSwtMSwtMV0sWzIsMSwwLDAsMywyLDEsMywwLDIsMywxXSxhLGMpO3RoaXMudHlwZT0iVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y319ZnVuY3Rpb24gSGYoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iT2N0YWhlZHJvbkdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgUmQoYSxjKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gUmQoYSxjKXtqYy5jYWxsKHRoaXMsClsxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMSwwLDAsMCwxLDAsMCwtMV0sWzAsMiw0LDAsNCwzLDAsMyw1LDAsNSwyLDEsMiw1LDEsNSwzLDEsMyw0LDEsNCwyXSxhLGMpO3RoaXMudHlwZT0iT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfX1mdW5jdGlvbiBJZihhLGMpe3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJJY29zYWhlZHJvbkdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfTt0aGlzLmZyb21CdWZmZXJHZW9tZXRyeShuZXcgSGUoYSxjKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gSGUoYSxjKXt2YXIgZT0oMStNYXRoLnNxcnQoNSkpLzI7amMuY2FsbCh0aGlzLFstMSxlLDAsMSxlLDAsLTEsLWUsMCwxLC1lLDAsMCwtMSxlLDAsMSxlLDAsLTEsLWUsMCwxLC1lLGUsMCwtMSxlLDAsMSwtZSwwLC0xLC1lLDAsMV0sWzAsMTEsNSwwLDUsMSwwLDEsNywwLDcsMTAsMCwxMCwxMSwKMSw1LDksNSwxMSw0LDExLDEwLDIsMTAsNyw2LDcsMSw4LDMsOSw0LDMsNCwyLDMsMiw2LDMsNiw4LDMsOCw5LDQsOSw1LDIsNCwxMSw2LDIsMTAsOCw2LDcsOSw4LDFdLGEsYyk7dGhpcy50eXBlPSJJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfX1mdW5jdGlvbiBKZihhLGMpe3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJEb2RlY2FoZWRyb25HZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSxkZXRhaWw6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEllKGEsYykpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEllKGEsYyl7dmFyIGU9KDErTWF0aC5zcXJ0KDUpKS8yLGc9MS9lO2pjLmNhbGwodGhpcyxbLTEsLTEsLTEsLTEsLTEsMSwtMSwxLC0xLC0xLDEsMSwxLC0xLC0xLDEsLTEsMSwxLDEsLTEsMSwxLDEsMCwtZywtZSwwLC1nLGUsMCxnLC1lLDAsZyxlLC1nLC1lLDAsLWcsZSwwLGcsCi1lLDAsZyxlLDAsLWUsMCwtZyxlLDAsLWcsLWUsMCxnLGUsMCxnXSxbMywxMSw3LDMsNywxNSwzLDE1LDEzLDcsMTksMTcsNywxNyw2LDcsNiwxNSwxNyw0LDgsMTcsOCwxMCwxNywxMCw2LDgsMCwxNiw4LDE2LDIsOCwyLDEwLDAsMTIsMSwwLDEsMTgsMCwxOCwxNiw2LDEwLDIsNiwyLDEzLDYsMTMsMTUsMiwxNiwxOCwyLDE4LDMsMiwzLDEzLDE4LDEsOSwxOCw5LDExLDE4LDExLDMsNCwxNCwxMiw0LDEyLDAsNCwwLDgsMTEsOSw1LDExLDUsMTksMTEsMTksNywxOSw1LDE0LDE5LDE0LDQsMTksNCwxNywxLDEyLDE0LDEsMTQsNSwxLDUsOV0sYSxjKTt0aGlzLnR5cGU9IkRvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGRldGFpbDpjfX1mdW5jdGlvbiBLZihhLGMsZSxnLHIsdil7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlR1YmVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwYXRoOmEsdHVidWxhclNlZ21lbnRzOmMscmFkaXVzOmUsCnJhZGlhbFNlZ21lbnRzOmcsY2xvc2VkOnJ9O3ZvaWQgMCE9PXYmJmNvbnNvbGUud2FybigiVEhSRUUuVHViZUdlb21ldHJ5OiB0YXBlciBoYXMgYmVlbiByZW1vdmVkLiIpO2E9bmV3IFNkKGEsYyxlLGcscik7dGhpcy50YW5nZW50cz1hLnRhbmdlbnRzO3RoaXMubm9ybWFscz1hLm5vcm1hbHM7dGhpcy5iaW5vcm1hbHM9YS5iaW5vcm1hbHM7dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoYSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gU2QoYSxjLGUsZyxyKXtmdW5jdGlvbiB2KHFhKXtTPWEuZ2V0UG9pbnRBdChxYS9jLFMpO3ZhciB1YT1GLm5vcm1hbHNbcWFdO3FhPUYuYmlub3JtYWxzW3FhXTtmb3IoVz0wO1c8PWc7VysrKXt2YXIgb2E9Vy9nKk1hdGguUEkqMix0YT1NYXRoLnNpbihvYSk7b2E9LU1hdGguY29zKG9hKTtQLng9b2EqdWEueCt0YSpxYS54O1AueT1vYSp1YS55K3RhKnFhLnk7UC56PW9hKnVhLnordGEqcWEuejtQLm5vcm1hbGl6ZSgpO2ZhLnB1c2goUC54LApQLnksUC56KTtKLng9Uy54K2UqUC54O0oueT1TLnkrZSpQLnk7Si56PVMueitlKlAuejtoYS5wdXNoKEoueCxKLnksSi56KX19ZnVuY3Rpb24geigpe2ZvcihXPTE7Vzw9YztXKyspZm9yKFY9MTtWPD1nO1YrKyl7dmFyIHFhPShnKzEpKlcrKFYtMSksdWE9KGcrMSkqVytWLG9hPShnKzEpKihXLTEpK1Y7cGEucHVzaCgoZysxKSooVy0xKSsoVi0xKSxxYSxvYSk7cGEucHVzaChxYSx1YSxvYSl9fWZ1bmN0aW9uIEUoKXtmb3IoVj0wO1Y8PWM7VisrKWZvcihXPTA7Vzw9ZztXKyspUi54PVYvYyxSLnk9Vy9nLHJhLnB1c2goUi54LFIueSl9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlR1YmVCdWZmZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwYXRoOmEsdHVidWxhclNlZ21lbnRzOmMscmFkaXVzOmUscmFkaWFsU2VnbWVudHM6ZyxjbG9zZWQ6cn07Yz1jfHw2NDtlPWV8fDE7Zz1nfHw4O3I9cnx8ITE7dmFyIEY9YS5jb21wdXRlRnJlbmV0RnJhbWVzKGMscik7dGhpcy50YW5nZW50cz0KRi50YW5nZW50czt0aGlzLm5vcm1hbHM9Ri5ub3JtYWxzO3RoaXMuYmlub3JtYWxzPUYuYmlub3JtYWxzO3ZhciBKPW5ldyBrLFA9bmV3IGssUj1uZXcgZixTPW5ldyBrLFYsVyxoYT1bXSxmYT1bXSxyYT1bXSxwYT1bXTsoZnVuY3Rpb24oKXtmb3IoVj0wO1Y8YztWKyspdihWKTt2KCExPT09cj9jOjApO0UoKTt6KCl9KSgpO3RoaXMuc2V0SW5kZXgocGEpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKGhhLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoZmEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKHJhLDIpKX1mdW5jdGlvbiBMZihhLGMsZSxnLHIsdix6KXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVG9ydXNLbm90R2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsdHViZTpjLHR1YnVsYXJTZWdtZW50czplLHJhZGlhbFNlZ21lbnRzOmcscDpyLHE6dn07dm9pZCAwIT09eiYmY29uc29sZS53YXJuKCJUSFJFRS5Ub3J1c0tub3RHZW9tZXRyeTogaGVpZ2h0U2NhbGUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5zY2FsZSggeCwgeSwgeiApIGluc3RlYWQuIik7CnRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBKZShhLGMsZSxnLHIsdikpO3RoaXMubWVyZ2VWZXJ0aWNlcygpfWZ1bmN0aW9uIEplKGEsYyxlLGcscix2KXtmdW5jdGlvbiB6KHRhLEJhLFRhLFVhLENhKXt2YXIgSGE9TWF0aC5zaW4odGEpO0JhPVRhL0JhKnRhO1RhPU1hdGguY29zKEJhKTtDYS54PVVhKigyK1RhKSouNSpNYXRoLmNvcyh0YSk7Q2EueT1VYSooMitUYSkqSGEqLjU7Q2Euej1VYSpNYXRoLnNpbihCYSkqLjV9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHR1YmU6Yyx0dWJ1bGFyU2VnbWVudHM6ZSxyYWRpYWxTZWdtZW50czpnLHA6cixxOnZ9O2E9YXx8MTtjPWN8fC40O2U9TWF0aC5mbG9vcihlKXx8NjQ7Zz1NYXRoLmZsb29yKGcpfHw4O3I9cnx8Mjt2PXZ8fDM7dmFyIEU9W10sRj1bXSxKPVtdLFA9W10sUixTPW5ldyBrLFY9bmV3IGssVz1uZXcgayxoYT1uZXcgayxmYT1uZXcgaywKcmE9bmV3IGsscGE9bmV3IGs7Zm9yKFI9MDtSPD1lOysrUil7dmFyIHFhPVIvZSpyKk1hdGguUEkqMjt6KHFhLHIsdixhLFcpO3oocWErLjAxLHIsdixhLGhhKTtyYS5zdWJWZWN0b3JzKGhhLFcpO3BhLmFkZFZlY3RvcnMoaGEsVyk7ZmEuY3Jvc3NWZWN0b3JzKHJhLHBhKTtwYS5jcm9zc1ZlY3RvcnMoZmEscmEpO2ZhLm5vcm1hbGl6ZSgpO3BhLm5vcm1hbGl6ZSgpO2ZvcihxYT0wO3FhPD1nOysrcWEpe3ZhciB1YT1xYS9nKk1hdGguUEkqMixvYT0tYypNYXRoLmNvcyh1YSk7dWE9YypNYXRoLnNpbih1YSk7Uy54PVcueCsob2EqcGEueCt1YSpmYS54KTtTLnk9Vy55KyhvYSpwYS55K3VhKmZhLnkpO1Muej1XLnorKG9hKnBhLnordWEqZmEueik7Ri5wdXNoKFMueCxTLnksUy56KTtWLnN1YlZlY3RvcnMoUyxXKS5ub3JtYWxpemUoKTtKLnB1c2goVi54LFYueSxWLnopO1AucHVzaChSL2UpO1AucHVzaChxYS9nKX19Zm9yKHFhPTE7cWE8PWU7cWErKylmb3IoUj0xO1I8PWc7UisrKWE9CihnKzEpKnFhKyhSLTEpLGM9KGcrMSkqcWErUixyPShnKzEpKihxYS0xKStSLEUucHVzaCgoZysxKSoocWEtMSkrKFItMSksYSxyKSxFLnB1c2goYSxjLHIpO3RoaXMuc2V0SW5kZXgoRSk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoRiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGNhKEosMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKFAsMikpfWZ1bmN0aW9uIE1mKGEsYyxlLGcscil7eWEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlRvcnVzR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsdHViZTpjLHJhZGlhbFNlZ21lbnRzOmUsdHVidWxhclNlZ21lbnRzOmcsYXJjOnJ9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBLZShhLGMsZSxnLHIpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBLZShhLGMsZSxnLHIpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJUb3J1c0J1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9CntyYWRpdXM6YSx0dWJlOmMscmFkaWFsU2VnbWVudHM6ZSx0dWJ1bGFyU2VnbWVudHM6ZyxhcmM6cn07YT1hfHwxO2M9Y3x8LjQ7ZT1NYXRoLmZsb29yKGUpfHw4O2c9TWF0aC5mbG9vcihnKXx8NjtyPXJ8fDIqTWF0aC5QSTt2YXIgdj1bXSx6PVtdLEU9W10sRj1bXSxKPW5ldyBrLFA9bmV3IGssUj1uZXcgayxTLFY7Zm9yKFM9MDtTPD1lO1MrKylmb3IoVj0wO1Y8PWc7VisrKXt2YXIgVz1WL2cqcixoYT1TL2UqTWF0aC5QSSoyO1AueD0oYStjKk1hdGguY29zKGhhKSkqTWF0aC5jb3MoVyk7UC55PShhK2MqTWF0aC5jb3MoaGEpKSpNYXRoLnNpbihXKTtQLno9YypNYXRoLnNpbihoYSk7ei5wdXNoKFAueCxQLnksUC56KTtKLng9YSpNYXRoLmNvcyhXKTtKLnk9YSpNYXRoLnNpbihXKTtSLnN1YlZlY3RvcnMoUCxKKS5ub3JtYWxpemUoKTtFLnB1c2goUi54LFIueSxSLnopO0YucHVzaChWL2cpO0YucHVzaChTL2UpfWZvcihTPTE7Uzw9ZTtTKyspZm9yKFY9MTtWPD1nO1YrKylhPShnKwoxKSooUy0xKStWLTEsYz0oZysxKSooUy0xKStWLHI9KGcrMSkqUytWLHYucHVzaCgoZysxKSpTK1YtMSxhLHIpLHYucHVzaChhLGMscik7dGhpcy5zZXRJbmRleCh2KTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYSh6LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoRSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoRiwyKSl9ZnVuY3Rpb24gR2ooYSxjLGUsZyxyKXtpZihyPT09MDxYbChhLGMsZSxnKSlmb3Iocj1jO3I8ZTtyKz1nKXZhciB2PUhqKHIsYVtyXSxhW3IrMV0sdik7ZWxzZSBmb3Iocj1lLWc7cj49YztyLT1nKXY9SGoocixhW3JdLGFbcisxXSx2KTt2JiZUZCh2LHYubmV4dCkmJihOZih2KSx2PXYubmV4dCk7cmV0dXJuIHZ9ZnVuY3Rpb24gT2YoYSxjKXtpZighYSlyZXR1cm4gYTtjfHwoYz1hKTtkb3t2YXIgZT0hMTtpZihhLnN0ZWluZXJ8fCFUZChhLGEubmV4dCkmJjAhPT1XYihhLnByZXYsYSxhLm5leHQpKWE9YS5uZXh0OwplbHNle05mKGEpO2E9Yz1hLnByZXY7aWYoYT09PWEubmV4dClicmVhaztlPSEwfX13aGlsZShlfHxhIT09Yyk7cmV0dXJuIGN9ZnVuY3Rpb24gUGYoYSxjLGUsZyxyLHYseil7aWYoYSl7IXomJnYmJllsKGEsZyxyLHYpO2Zvcih2YXIgRT1hLEYsSjthLnByZXYhPT1hLm5leHQ7KWlmKEY9YS5wcmV2LEo9YS5uZXh0LHY/WmwoYSxnLHIsdik6JGwoYSkpYy5wdXNoKEYuaS9lKSxjLnB1c2goYS5pL2UpLGMucHVzaChKLmkvZSksTmYoYSksRT1hPUoubmV4dDtlbHNlIGlmKGE9SixhPT09RSl7ej8xPT09ej8oYT1hbShhLGMsZSksUGYoYSxjLGUsZyxyLHYsMikpOjI9PT16JiZibShhLGMsZSxnLHIsdik6UGYoT2YoYSksYyxlLGcscix2LDEpO2JyZWFrfX19ZnVuY3Rpb24gJGwoYSl7dmFyIGM9YS5wcmV2LGU9YS5uZXh0O2lmKDA8PVdiKGMsYSxlKSlyZXR1cm4hMTtmb3IodmFyIGc9YS5uZXh0Lm5leHQ7ZyE9PWEucHJldjspe2lmKExlKGMueCxjLnksYS54LGEueSxlLngsZS55LGcueCwKZy55KSYmMDw9V2IoZy5wcmV2LGcsZy5uZXh0KSlyZXR1cm4hMTtnPWcubmV4dH1yZXR1cm4hMH1mdW5jdGlvbiBabChhLGMsZSxnKXt2YXIgcj1hLnByZXYsdj1hLm5leHQ7aWYoMDw9V2IocixhLHYpKXJldHVybiExO3ZhciB6PXIueD5hLng/ci54PnYueD9yLng6di54OmEueD52Lng/YS54OnYueCxFPXIueT5hLnk/ci55PnYueT9yLnk6di55OmEueT52Lnk/YS55OnYueSxGPVloKHIueDxhLng/ci54PHYueD9yLng6di54OmEueDx2Lng/YS54OnYueCxyLnk8YS55P3IueTx2Lnk/ci55OnYueTphLnk8di55P2EueTp2LnksYyxlLGcpO2M9WWgoeixFLGMsZSxnKTtlPWEucHJldlo7Zm9yKGc9YS5uZXh0WjtlJiZlLno+PUYmJmcmJmcuejw9Yzspe2lmKGUhPT1hLnByZXYmJmUhPT1hLm5leHQmJkxlKHIueCxyLnksYS54LGEueSx2Lngsdi55LGUueCxlLnkpJiYwPD1XYihlLnByZXYsZSxlLm5leHQpKXJldHVybiExO2U9ZS5wcmV2WjtpZihnIT09YS5wcmV2JiZnIT09YS5uZXh0JiZMZShyLngsCnIueSxhLngsYS55LHYueCx2LnksZy54LGcueSkmJjA8PVdiKGcucHJldixnLGcubmV4dCkpcmV0dXJuITE7Zz1nLm5leHRafWZvcig7ZSYmZS56Pj1GOyl7aWYoZSE9PWEucHJldiYmZSE9PWEubmV4dCYmTGUoci54LHIueSxhLngsYS55LHYueCx2LnksZS54LGUueSkmJjA8PVdiKGUucHJldixlLGUubmV4dCkpcmV0dXJuITE7ZT1lLnByZXZafWZvcig7ZyYmZy56PD1jOyl7aWYoZyE9PWEucHJldiYmZyE9PWEubmV4dCYmTGUoci54LHIueSxhLngsYS55LHYueCx2LnksZy54LGcueSkmJjA8PVdiKGcucHJldixnLGcubmV4dCkpcmV0dXJuITE7Zz1nLm5leHRafXJldHVybiEwfWZ1bmN0aW9uIGFtKGEsYyxlKXt2YXIgZz1hO2Rve3ZhciByPWcucHJldix2PWcubmV4dC5uZXh0OyFUZChyLHYpJiZJaihyLGcsZy5uZXh0LHYpJiZRZihyLHYpJiZRZih2LHIpJiYoYy5wdXNoKHIuaS9lKSxjLnB1c2goZy5pL2UpLGMucHVzaCh2LmkvZSksTmYoZyksTmYoZy5uZXh0KSxnPWE9dik7Zz1nLm5leHR9d2hpbGUoZyE9PQphKTtyZXR1cm4gZ31mdW5jdGlvbiBibShhLGMsZSxnLHIsdil7dmFyIHo9YTtkb3tmb3IodmFyIEU9ei5uZXh0Lm5leHQ7RSE9PXoucHJldjspe2lmKHouaSE9PUUuaSYmY20oeixFKSl7YT1Kaih6LEUpO3o9T2Yoeix6Lm5leHQpO2E9T2YoYSxhLm5leHQpO1BmKHosYyxlLGcscix2KTtQZihhLGMsZSxnLHIsdik7cmV0dXJufUU9RS5uZXh0fXo9ei5uZXh0fXdoaWxlKHohPT1hKX1mdW5jdGlvbiBkbShhLGMsZSxnKXt2YXIgcj1bXSx2O3ZhciB6PTA7Zm9yKHY9Yy5sZW5ndGg7ejx2O3orKyl7dmFyIEU9Y1t6XSpnO3ZhciBGPXo8di0xP2NbeisxXSpnOmEubGVuZ3RoO0U9R2ooYSxFLEYsZywhMSk7RT09PUUubmV4dCYmKEUuc3RlaW5lcj0hMCk7ci5wdXNoKGVtKEUpKX1yLnNvcnQoZm0pO2Zvcih6PTA7ejxyLmxlbmd0aDt6KyspZ20oclt6XSxlKSxlPU9mKGUsZS5uZXh0KTtyZXR1cm4gZX1mdW5jdGlvbiBmbShhLGMpe3JldHVybiBhLngtYy54fWZ1bmN0aW9uIGdtKGEsYyl7aWYoYz0KaG0oYSxjKSlhPUpqKGMsYSksT2YoYSxhLm5leHQpfWZ1bmN0aW9uIGhtKGEsYyl7dmFyIGU9YyxnPWEueCxyPWEueSx2PS1JbmZpbml0eTtkb3tpZihyPD1lLnkmJnI+PWUubmV4dC55JiZlLm5leHQueSE9PWUueSl7dmFyIHo9ZS54KyhyLWUueSkqKGUubmV4dC54LWUueCkvKGUubmV4dC55LWUueSk7aWYoejw9ZyYmej52KXt2PXo7aWYoej09PWcpe2lmKHI9PT1lLnkpcmV0dXJuIGU7aWYocj09PWUubmV4dC55KXJldHVybiBlLm5leHR9dmFyIEU9ZS54PGUubmV4dC54P2U6ZS5uZXh0fX1lPWUubmV4dH13aGlsZShlIT09Yyk7aWYoIUUpcmV0dXJuIG51bGw7aWYoZz09PXYpcmV0dXJuIEUucHJldjtjPUU7ej1FLng7dmFyIEY9RS55LEo9SW5maW5pdHk7Zm9yKGU9RS5uZXh0O2UhPT1jOyl7aWYoZz49ZS54JiZlLng+PXomJmchPT1lLngmJkxlKHI8Rj9nOnYscix6LEYscjxGP3Y6ZyxyLGUueCxlLnkpKXt2YXIgUD1NYXRoLmFicyhyLWUueSkvKGctZS54KTsoUDxKfHxQPT09SiYmCmUueD5FLngpJiZRZihlLGEpJiYoRT1lLEo9UCl9ZT1lLm5leHR9cmV0dXJuIEV9ZnVuY3Rpb24gWWwoYSxjLGUsZyl7dmFyIHI9YTtkbyBudWxsPT09ci56JiYoci56PVloKHIueCxyLnksYyxlLGcpKSxyLnByZXZaPXIucHJldixyPXIubmV4dFo9ci5uZXh0O3doaWxlKHIhPT1hKTtyLnByZXZaLm5leHRaPW51bGw7ci5wcmV2Wj1udWxsO2ltKHIpfWZ1bmN0aW9uIGltKGEpe3ZhciBjLGUsZyxyLHY9MTtkb3t2YXIgej1hO3ZhciBFPWE9bnVsbDtmb3IoZT0wO3o7KXtlKys7dmFyIEY9ejtmb3IoYz1nPTA7Yzx2JiYoZysrLEY9Ri5uZXh0WixGKTtjKyspO2ZvcihyPXY7MDxnfHwwPHImJkY7KTAhPT1nJiYoMD09PXJ8fCFGfHx6Lno8PUYueik/KGM9eix6PXoubmV4dFosZy0tKTooYz1GLEY9Ri5uZXh0WixyLS0pLEU/RS5uZXh0Wj1jOmE9YyxjLnByZXZaPUUsRT1jO3o9Rn1FLm5leHRaPW51bGw7dio9Mn13aGlsZSgxPGUpO3JldHVybiBhfWZ1bmN0aW9uIFloKGEsYyxlLGcscil7YT0KMzI3NjcqKGEtZSkqcjtjPTMyNzY3KihjLWcpKnI7YT0oYXxhPDw4KSYxNjcxMTkzNTthPShhfGE8PDQpJjI1MjY0NTEzNTthPShhfGE8PDIpJjg1ODk5MzQ1OTtjPShjfGM8PDgpJjE2NzExOTM1O2M9KGN8Yzw8NCkmMjUyNjQ1MTM1O2M9KGN8Yzw8MikmODU4OTkzNDU5O3JldHVybihhfGE8PDEpJjE0MzE2NTU3NjV8KChjfGM8PDEpJjE0MzE2NTU3NjUpPDwxfWZ1bmN0aW9uIGVtKGEpe3ZhciBjPWEsZT1hO2Rve2lmKGMueDxlLnh8fGMueD09PWUueCYmYy55PGUueSllPWM7Yz1jLm5leHR9d2hpbGUoYyE9PWEpO3JldHVybiBlfWZ1bmN0aW9uIExlKGEsYyxlLGcscix2LHosRSl7cmV0dXJuIDA8PShyLXopKihjLUUpLShhLXopKih2LUUpJiYwPD0oYS16KSooZy1FKS0oZS16KSooYy1FKSYmMDw9KGUteikqKHYtRSktKHIteikqKGctRSl9ZnVuY3Rpb24gY20oYSxjKXtyZXR1cm4gYS5uZXh0LmkhPT1jLmkmJmEucHJldi5pIT09Yy5pJiYham0oYSxjKSYmUWYoYSxjKSYmUWYoYyxhKSYmCmttKGEsYyl9ZnVuY3Rpb24gV2IoYSxjLGUpe3JldHVybihjLnktYS55KSooZS54LWMueCktKGMueC1hLngpKihlLnktYy55KX1mdW5jdGlvbiBUZChhLGMpe3JldHVybiBhLng9PT1jLngmJmEueT09PWMueX1mdW5jdGlvbiBJaihhLGMsZSxnKXtyZXR1cm4gVGQoYSxlKSYmVGQoYyxnKXx8VGQoYSxnKSYmVGQoZSxjKT8hMDowPFdiKGEsYyxlKSE9PTA8V2IoYSxjLGcpJiYwPFdiKGUsZyxhKSE9PTA8V2IoZSxnLGMpfWZ1bmN0aW9uIGptKGEsYyl7dmFyIGU9YTtkb3tpZihlLmkhPT1hLmkmJmUubmV4dC5pIT09YS5pJiZlLmkhPT1jLmkmJmUubmV4dC5pIT09Yy5pJiZJaihlLGUubmV4dCxhLGMpKXJldHVybiEwO2U9ZS5uZXh0fXdoaWxlKGUhPT1hKTtyZXR1cm4hMX1mdW5jdGlvbiBRZihhLGMpe3JldHVybiAwPldiKGEucHJldixhLGEubmV4dCk/MDw9V2IoYSxjLGEubmV4dCkmJjA8PVdiKGEsYS5wcmV2LGMpOjA+V2IoYSxjLGEucHJldil8fDA+V2IoYSxhLm5leHQsYyl9ZnVuY3Rpb24ga20oYSwKYyl7dmFyIGU9YSxnPSExLHI9KGEueCtjLngpLzI7Yz0oYS55K2MueSkvMjtkbyBlLnk+YyE9PWUubmV4dC55PmMmJmUubmV4dC55IT09ZS55JiZyPChlLm5leHQueC1lLngpKihjLWUueSkvKGUubmV4dC55LWUueSkrZS54JiYoZz0hZyksZT1lLm5leHQ7d2hpbGUoZSE9PWEpO3JldHVybiBnfWZ1bmN0aW9uIEpqKGEsYyl7dmFyIGU9bmV3IFpoKGEuaSxhLngsYS55KSxnPW5ldyBaaChjLmksYy54LGMueSkscj1hLm5leHQsdj1jLnByZXY7YS5uZXh0PWM7Yy5wcmV2PWE7ZS5uZXh0PXI7ci5wcmV2PWU7Zy5uZXh0PWU7ZS5wcmV2PWc7di5uZXh0PWc7Zy5wcmV2PXY7cmV0dXJuIGd9ZnVuY3Rpb24gSGooYSxjLGUsZyl7YT1uZXcgWmgoYSxjLGUpO2c/KGEubmV4dD1nLm5leHQsYS5wcmV2PWcsZy5uZXh0LnByZXY9YSxnLm5leHQ9YSk6KGEucHJldj1hLGEubmV4dD1hKTtyZXR1cm4gYX1mdW5jdGlvbiBOZihhKXthLm5leHQucHJldj1hLnByZXY7YS5wcmV2Lm5leHQ9YS5uZXh0O2EucHJldlomJgooYS5wcmV2Wi5uZXh0Wj1hLm5leHRaKTthLm5leHRaJiYoYS5uZXh0Wi5wcmV2Wj1hLnByZXZaKX1mdW5jdGlvbiBaaChhLGMsZSl7dGhpcy5pPWE7dGhpcy54PWM7dGhpcy55PWU7dGhpcy5uZXh0Wj10aGlzLnByZXZaPXRoaXMuej10aGlzLm5leHQ9dGhpcy5wcmV2PW51bGw7dGhpcy5zdGVpbmVyPSExfWZ1bmN0aW9uIFhsKGEsYyxlLGcpe2Zvcih2YXIgcj0wLHY9ZS1nO2M8ZTtjKz1nKXIrPShhW3ZdLWFbY10pKihhW2MrMV0rYVt2KzFdKSx2PWM7cmV0dXJuIHJ9ZnVuY3Rpb24gS2ooYSl7dmFyIGM9YS5sZW5ndGg7MjxjJiZhW2MtMV0uZXF1YWxzKGFbMF0pJiZhLnBvcCgpfWZ1bmN0aW9uIExqKGEsYyl7Zm9yKHZhciBlPTA7ZTxjLmxlbmd0aDtlKyspYS5wdXNoKGNbZV0ueCksYS5wdXNoKGNbZV0ueSl9ZnVuY3Rpb24gVWQoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRXh0cnVkZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczphLG9wdGlvbnM6Y307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFJjKGEsCmMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBSYyhhLGMpe2Z1bmN0aW9uIGUoRil7ZnVuY3Rpb24gSihRYSxlYixtYil7ZWJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0Iik7cmV0dXJuIGViLmNsb25lKCkubXVsdGlwbHlTY2FsYXIobWIpLmFkZChRYSl9ZnVuY3Rpb24gUChRYSxlYixtYil7dmFyIHBiPVFhLngtZWIueDt2YXIgc2I9UWEueS1lYi55O3ZhciBLYj1tYi54LVFhLng7dmFyIFNiPW1iLnktUWEueSxuYz1wYipwYitzYipzYjtpZihNYXRoLmFicyhwYipTYi1zYipLYik+TnVtYmVyLkVQU0lMT04pe3ZhciBRYz1NYXRoLnNxcnQobmMpLHpjPU1hdGguc3FydChLYipLYitTYipTYik7bmM9ZWIueC1zYi9RYztlYj1lYi55K3BiL1FjO1NiPSgobWIueC1TYi96Yy1uYykqU2ItKG1iLnkrS2IvemMtZWIpKktiKS8ocGIqU2Itc2IqS2IpO0tiPW5jK3BiKlNiLVFhLng7cGI9ZWIrc2IqU2ItUWEueTtzYj1LYioKS2IrcGIqcGI7aWYoMj49c2IpcmV0dXJuIG5ldyBmKEtiLHBiKTtzYj1NYXRoLnNxcnQoc2IvMil9ZWxzZSBRYT0hMSxwYj5OdW1iZXIuRVBTSUxPTj9LYj5OdW1iZXIuRVBTSUxPTiYmKFFhPSEwKTpwYjwtTnVtYmVyLkVQU0lMT04/S2I8LU51bWJlci5FUFNJTE9OJiYoUWE9ITApOk1hdGguc2lnbihzYik9PT1NYXRoLnNpZ24oU2IpJiYoUWE9ITApLFFhPyhLYj0tc2Isc2I9TWF0aC5zcXJ0KG5jKSk6KEtiPXBiLHBiPXNiLHNiPU1hdGguc3FydChuYy8yKSk7cmV0dXJuIG5ldyBmKEtiL3NiLHBiL3NiKX1mdW5jdGlvbiBSKFFhLGViKXtmb3IoamE9UWEubGVuZ3RoOzA8PS0tamE7KXt2YXIgbWI9amE7dmFyIHBiPWphLTE7MD5wYiYmKHBiPVFhLmxlbmd0aC0xKTt2YXIgc2IsS2I9cWErMipVYTtmb3Ioc2I9MDtzYjxLYjtzYisrKXt2YXIgU2I9WWEqc2IsbmM9WWEqKHNiKzEpO1coZWIrbWIrU2IsZWIrcGIrU2IsZWIrcGIrbmMsZWIrbWIrbmMpfX19ZnVuY3Rpb24gUyhRYSxlYixtYil7cmEucHVzaChRYSk7CnJhLnB1c2goZWIpO3JhLnB1c2gobWIpfWZ1bmN0aW9uIFYoUWEsZWIsbWIpe2hhKFFhKTtoYShlYik7aGEobWIpO1FhPXIubGVuZ3RoLzM7UWE9SGEuZ2VuZXJhdGVUb3BVVihnLHIsUWEtMyxRYS0yLFFhLTEpO2ZhKFFhWzBdKTtmYShRYVsxXSk7ZmEoUWFbMl0pfWZ1bmN0aW9uIFcoUWEsZWIsbWIscGIpe2hhKFFhKTtoYShlYik7aGEocGIpO2hhKGViKTtoYShtYik7aGEocGIpO1FhPXIubGVuZ3RoLzM7UWE9SGEuZ2VuZXJhdGVTaWRlV2FsbFVWKGcscixRYS02LFFhLTMsUWEtMixRYS0xKTtmYShRYVswXSk7ZmEoUWFbMV0pO2ZhKFFhWzNdKTtmYShRYVsxXSk7ZmEoUWFbMl0pO2ZhKFFhWzNdKX1mdW5jdGlvbiBoYShRYSl7ci5wdXNoKHJhWzMqUWFdKTtyLnB1c2gocmFbMypRYSsxXSk7ci5wdXNoKHJhWzMqUWErMl0pfWZ1bmN0aW9uIGZhKFFhKXt2LnB1c2goUWEueCk7di5wdXNoKFFhLnkpfXZhciByYT1bXSxwYT12b2lkIDAhPT1jLmN1cnZlU2VnbWVudHM/Yy5jdXJ2ZVNlZ21lbnRzOgoxMixxYT12b2lkIDAhPT1jLnN0ZXBzP2Muc3RlcHM6MSx1YT12b2lkIDAhPT1jLmRlcHRoP2MuZGVwdGg6MTAwLG9hPXZvaWQgMCE9PWMuYmV2ZWxFbmFibGVkP2MuYmV2ZWxFbmFibGVkOiEwLHRhPXZvaWQgMCE9PWMuYmV2ZWxUaGlja25lc3M/Yy5iZXZlbFRoaWNrbmVzczo2LEJhPXZvaWQgMCE9PWMuYmV2ZWxTaXplP2MuYmV2ZWxTaXplOnRhLTIsVGE9dm9pZCAwIT09Yy5iZXZlbE9mZnNldD9jLmJldmVsT2Zmc2V0OjAsVWE9dm9pZCAwIT09Yy5iZXZlbFNlZ21lbnRzP2MuYmV2ZWxTZWdtZW50czozLENhPWMuZXh0cnVkZVBhdGgsSGE9dm9pZCAwIT09Yy5VVkdlbmVyYXRvcj9jLlVWR2VuZXJhdG9yOmxtO3ZvaWQgMCE9PWMuYW1vdW50JiYoY29uc29sZS53YXJuKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IGFtb3VudCBoYXMgYmVlbiByZW5hbWVkIHRvIGRlcHRoLiIpLHVhPWMuYW1vdW50KTt2YXIgRGE9ITE7aWYoQ2Epe3ZhciBNYT1DYS5nZXRTcGFjZWRQb2ludHMocWEpOwpEYT0hMDtvYT0hMTt2YXIgZGI9Q2EuY29tcHV0ZUZyZW5ldEZyYW1lcyhxYSwhMSk7dmFyIHRiPW5ldyBrO3ZhciBLYT1uZXcgazt2YXIgYmI9bmV3IGt9b2F8fChUYT1CYT10YT1VYT0wKTt2YXIgamI7cGE9Ri5leHRyYWN0UG9pbnRzKHBhKTtGPXBhLnNoYXBlO3ZhciBFYj1wYS5ob2xlcztpZighZWQuaXNDbG9ja1dpc2UoRikpe0Y9Ri5yZXZlcnNlKCk7dmFyIHhiPTA7Zm9yKGpiPUViLmxlbmd0aDt4YjxqYjt4YisrKXt2YXIgaWE9RWJbeGJdO2VkLmlzQ2xvY2tXaXNlKGlhKSYmKEViW3hiXT1pYS5yZXZlcnNlKCkpfX12YXIgbmE9ZWQudHJpYW5ndWxhdGVTaGFwZShGLEViKSx6YT1GO3hiPTA7Zm9yKGpiPUViLmxlbmd0aDt4YjxqYjt4YisrKWlhPUViW3hiXSxGPUYuY29uY2F0KGlhKTt2YXIgSmEsWWE9Ri5sZW5ndGgsTmEsY2I9bmEubGVuZ3RoO3BhPVtdO3ZhciBqYT0wO3ZhciBHYT16YS5sZW5ndGg7dmFyIExhPUdhLTE7Zm9yKEphPWphKzE7amE8R2E7amErKyxMYSsrLEphKyspTGE9PT0KR2EmJihMYT0wKSxKYT09PUdhJiYoSmE9MCkscGFbamFdPVAoemFbamFdLHphW0xhXSx6YVtKYV0pO0NhPVtdO3ZhciBuYj1wYS5jb25jYXQoKTt4Yj0wO2ZvcihqYj1FYi5sZW5ndGg7eGI8amI7eGIrKyl7aWE9RWJbeGJdO3ZhciBWYT1bXTtqYT0wO0dhPWlhLmxlbmd0aDtMYT1HYS0xO2ZvcihKYT1qYSsxO2phPEdhO2phKyssTGErKyxKYSsrKUxhPT09R2EmJihMYT0wKSxKYT09PUdhJiYoSmE9MCksVmFbamFdPVAoaWFbamFdLGlhW0xhXSxpYVtKYV0pO0NhLnB1c2goVmEpO25iPW5iLmNvbmNhdChWYSl9Zm9yKExhPTA7TGE8VWE7TGErKyl7R2E9TGEvVWE7dmFyIGliPXRhKk1hdGguY29zKEdhKk1hdGguUEkvMik7SmE9QmEqTWF0aC5zaW4oR2EqTWF0aC5QSS8yKStUYTtqYT0wO2ZvcihHYT16YS5sZW5ndGg7amE8R2E7amErKyl7dmFyIGtiPUooemFbamFdLHBhW2phXSxKYSk7UyhrYi54LGtiLnksLWliKX14Yj0wO2ZvcihqYj1FYi5sZW5ndGg7eGI8amI7eGIrKylmb3IoaWE9CkViW3hiXSxWYT1DYVt4Yl0samE9MCxHYT1pYS5sZW5ndGg7amE8R2E7amErKylrYj1KKGlhW2phXSxWYVtqYV0sSmEpLFMoa2IueCxrYi55LC1pYil9SmE9QmErVGE7Zm9yKGphPTA7amE8WWE7amErKylrYj1vYT9KKEZbamFdLG5iW2phXSxKYSk6RltqYV0sRGE/KEthLmNvcHkoZGIubm9ybWFsc1swXSkubXVsdGlwbHlTY2FsYXIoa2IueCksdGIuY29weShkYi5iaW5vcm1hbHNbMF0pLm11bHRpcGx5U2NhbGFyKGtiLnkpLGJiLmNvcHkoTWFbMF0pLmFkZChLYSkuYWRkKHRiKSxTKGJiLngsYmIueSxiYi56KSk6UyhrYi54LGtiLnksMCk7Zm9yKEdhPTE7R2E8PXFhO0dhKyspZm9yKGphPTA7amE8WWE7amErKylrYj1vYT9KKEZbamFdLG5iW2phXSxKYSk6RltqYV0sRGE/KEthLmNvcHkoZGIubm9ybWFsc1tHYV0pLm11bHRpcGx5U2NhbGFyKGtiLngpLHRiLmNvcHkoZGIuYmlub3JtYWxzW0dhXSkubXVsdGlwbHlTY2FsYXIoa2IueSksYmIuY29weShNYVtHYV0pLmFkZChLYSkuYWRkKHRiKSwKUyhiYi54LGJiLnksYmIueikpOlMoa2IueCxrYi55LHVhL3FhKkdhKTtmb3IoTGE9VWEtMTswPD1MYTtMYS0tKXtHYT1MYS9VYTtpYj10YSpNYXRoLmNvcyhHYSpNYXRoLlBJLzIpO0phPUJhKk1hdGguc2luKEdhKk1hdGguUEkvMikrVGE7amE9MDtmb3IoR2E9emEubGVuZ3RoO2phPEdhO2phKyspa2I9Sih6YVtqYV0scGFbamFdLEphKSxTKGtiLngsa2IueSx1YStpYik7eGI9MDtmb3IoamI9RWIubGVuZ3RoO3hiPGpiO3hiKyspZm9yKGlhPUViW3hiXSxWYT1DYVt4Yl0samE9MCxHYT1pYS5sZW5ndGg7amE8R2E7amErKylrYj1KKGlhW2phXSxWYVtqYV0sSmEpLERhP1Moa2IueCxrYi55K01hW3FhLTFdLnksTWFbcWEtMV0ueCtpYik6UyhrYi54LGtiLnksdWEraWIpfShmdW5jdGlvbigpe3ZhciBRYT1yLmxlbmd0aC8zO2lmKG9hKXt2YXIgZWI9MCpZYTtmb3IoamE9MDtqYTxjYjtqYSsrKU5hPW5hW2phXSxWKE5hWzJdK2ViLE5hWzFdK2ViLE5hWzBdK2ViKTtlYj1ZYSoocWErMipVYSk7CmZvcihqYT0wO2phPGNiO2phKyspTmE9bmFbamFdLFYoTmFbMF0rZWIsTmFbMV0rZWIsTmFbMl0rZWIpfWVsc2V7Zm9yKGphPTA7amE8Y2I7amErKylOYT1uYVtqYV0sVihOYVsyXSxOYVsxXSxOYVswXSk7Zm9yKGphPTA7amE8Y2I7amErKylOYT1uYVtqYV0sVihOYVswXStZYSpxYSxOYVsxXStZYSpxYSxOYVsyXStZYSpxYSl9Zy5hZGRHcm91cChRYSxyLmxlbmd0aC8zLVFhLDApfSkoKTsoZnVuY3Rpb24oKXt2YXIgUWE9ci5sZW5ndGgvMyxlYj0wO1IoemEsZWIpO2ViKz16YS5sZW5ndGg7eGI9MDtmb3IoamI9RWIubGVuZ3RoO3hiPGpiO3hiKyspaWE9RWJbeGJdLFIoaWEsZWIpLGViKz1pYS5sZW5ndGg7Zy5hZGRHcm91cChRYSxyLmxlbmd0aC8zLVFhLDEpfSkoKX12YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRXh0cnVkZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3NoYXBlczphLG9wdGlvbnM6Y307YT1BcnJheS5pc0FycmF5KGEpP2E6W2FdO2Zvcih2YXIgZz10aGlzLApyPVtdLHY9W10sej0wLEU9YS5sZW5ndGg7ejxFO3orKyllKGFbel0pO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHIsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKHYsMikpO3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKX1mdW5jdGlvbiBNaihhLGMsZSl7ZS5zaGFwZXM9W107aWYoQXJyYXkuaXNBcnJheShhKSlmb3IodmFyIGc9MCxyPWEubGVuZ3RoO2c8cjtnKyspZS5zaGFwZXMucHVzaChhW2ddLnV1aWQpO2Vsc2UgZS5zaGFwZXMucHVzaChhLnV1aWQpO3ZvaWQgMCE9PWMuZXh0cnVkZVBhdGgmJihlLm9wdGlvbnMuZXh0cnVkZVBhdGg9Yy5leHRydWRlUGF0aC50b0pTT04oKSk7cmV0dXJuIGV9ZnVuY3Rpb24gUmYoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iVGV4dEdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3RleHQ6YSxwYXJhbWV0ZXJzOmN9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBNZShhLGMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX0KZnVuY3Rpb24gTWUoYSxjKXtjPWN8fHt9O3ZhciBlPWMuZm9udDtpZighZXx8IWUuaXNGb250KXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5UZXh0R2VvbWV0cnk6IGZvbnQgcGFyYW1ldGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5Gb250LiIpLG5ldyB5YTthPWUuZ2VuZXJhdGVTaGFwZXMoYSxjLnNpemUpO2MuZGVwdGg9dm9pZCAwIT09Yy5oZWlnaHQ/Yy5oZWlnaHQ6NTA7dm9pZCAwPT09Yy5iZXZlbFRoaWNrbmVzcyYmKGMuYmV2ZWxUaGlja25lc3M9MTApO3ZvaWQgMD09PWMuYmV2ZWxTaXplJiYoYy5iZXZlbFNpemU9OCk7dm9pZCAwPT09Yy5iZXZlbEVuYWJsZWQmJihjLmJldmVsRW5hYmxlZD0hMSk7UmMuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJUZXh0QnVmZmVyR2VvbWV0cnkifWZ1bmN0aW9uIFNmKGEsYyxlLGcscix2LHope3lhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcGhlcmVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXM6YSx3aWR0aFNlZ21lbnRzOmMsCmhlaWdodFNlZ21lbnRzOmUscGhpU3RhcnQ6ZyxwaGlMZW5ndGg6cix0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IEJkKGEsYyxlLGcscix2LHopKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBCZChhLGMsZSxnLHIsdix6KXt2YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU3BoZXJlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsd2lkdGhTZWdtZW50czpjLGhlaWdodFNlZ21lbnRzOmUscGhpU3RhcnQ6ZyxwaGlMZW5ndGg6cix0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en07YT1hfHwxO2M9TWF0aC5tYXgoMyxNYXRoLmZsb29yKGMpfHw4KTtlPU1hdGgubWF4KDIsTWF0aC5mbG9vcihlKXx8Nik7Zz12b2lkIDAhPT1nP2c6MDtyPXZvaWQgMCE9PXI/cjoyKk1hdGguUEk7dj12b2lkIDAhPT12P3Y6MDt6PXZvaWQgMCE9PXo/ejpNYXRoLlBJO3ZhciBFPU1hdGgubWluKHYreixNYXRoLlBJKSxGLApKLFA9MCxSPVtdLFM9bmV3IGssVj1uZXcgayxXPVtdLGhhPVtdLGZhPVtdLHJhPVtdO2ZvcihKPTA7Sjw9ZTtKKyspe3ZhciBwYT1bXSxxYT1KL2UsdWE9MDswPT1KJiYwPT12P3VhPS41L2M6Sj09ZSYmRT09TWF0aC5QSSYmKHVhPS0uNS9jKTtmb3IoRj0wO0Y8PWM7RisrKXt2YXIgb2E9Ri9jO1MueD0tYSpNYXRoLmNvcyhnK29hKnIpKk1hdGguc2luKHYrcWEqeik7Uy55PWEqTWF0aC5jb3ModitxYSp6KTtTLno9YSpNYXRoLnNpbihnK29hKnIpKk1hdGguc2luKHYrcWEqeik7aGEucHVzaChTLngsUy55LFMueik7Vi5jb3B5KFMpLm5vcm1hbGl6ZSgpO2ZhLnB1c2goVi54LFYueSxWLnopO3JhLnB1c2gob2ErdWEsMS1xYSk7cGEucHVzaChQKyspfVIucHVzaChwYSl9Zm9yKEo9MDtKPGU7SisrKWZvcihGPTA7RjxjO0YrKylhPVJbSl1bRisxXSxnPVJbSl1bRl0scj1SW0orMV1bRl0sej1SW0orMV1bRisxXSwoMCE9PUp8fDA8dikmJlcucHVzaChhLGcseiksKEohPT1lLTF8fEU8TWF0aC5QSSkmJgpXLnB1c2goZyxyLHopO3RoaXMuc2V0SW5kZXgoVyk7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoaGEsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYShmYSwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EocmEsMikpfWZ1bmN0aW9uIFRmKGEsYyxlLGcscix2KXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUmluZ0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e2lubmVyUmFkaXVzOmEsb3V0ZXJSYWRpdXM6Yyx0aGV0YVNlZ21lbnRzOmUscGhpU2VnbWVudHM6Zyx0aGV0YVN0YXJ0OnIsdGhldGFMZW5ndGg6dn07dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IE5lKGEsYyxlLGcscix2KSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gTmUoYSxjLGUsZyxyLHYpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJSaW5nQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17aW5uZXJSYWRpdXM6YSxvdXRlclJhZGl1czpjLHRoZXRhU2VnbWVudHM6ZSwKcGhpU2VnbWVudHM6Zyx0aGV0YVN0YXJ0OnIsdGhldGFMZW5ndGg6dn07YT1hfHwuNTtjPWN8fDE7cj12b2lkIDAhPT1yP3I6MDt2PXZvaWQgMCE9PXY/djoyKk1hdGguUEk7ZT12b2lkIDAhPT1lP01hdGgubWF4KDMsZSk6ODtnPXZvaWQgMCE9PWc/TWF0aC5tYXgoMSxnKToxO3ZhciB6PVtdLEU9W10sRj1bXSxKPVtdLFA9YSxSPShjLWEpL2csUz1uZXcgayxWPW5ldyBmLFcsaGE7Zm9yKFc9MDtXPD1nO1crKyl7Zm9yKGhhPTA7aGE8PWU7aGErKylhPXIraGEvZSp2LFMueD1QKk1hdGguY29zKGEpLFMueT1QKk1hdGguc2luKGEpLEUucHVzaChTLngsUy55LFMueiksRi5wdXNoKDAsMCwxKSxWLng9KFMueC9jKzEpLzIsVi55PShTLnkvYysxKS8yLEoucHVzaChWLngsVi55KTtQKz1SfWZvcihXPTA7VzxnO1crKylmb3IoYz1XKihlKzEpLGhhPTA7aGE8ZTtoYSsrKWE9aGErYyxyPWErZSsxLHY9YStlKzIsUD1hKzEsei5wdXNoKGEscixQKSx6LnB1c2gocix2LFApO3RoaXMuc2V0SW5kZXgoeik7CnRoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKEUsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYShGLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBjYShKLDIpKX1mdW5jdGlvbiBVZihhLGMsZSxnKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iTGF0aGVHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtwb2ludHM6YSxzZWdtZW50czpjLHBoaVN0YXJ0OmUscGhpTGVuZ3RoOmd9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBPZShhLGMsZSxnKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gT2UoYSxjLGUsZyl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxhdGhlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cG9pbnRzOmEsc2VnbWVudHM6YyxwaGlTdGFydDplLHBoaUxlbmd0aDpnfTtjPU1hdGguZmxvb3IoYyl8fDEyO2U9ZXx8MDtnPWd8fDIqTWF0aC5QSTtnPWhiLmNsYW1wKGcsMCwyKk1hdGguUEkpO3ZhciByPQpbXSx2PVtdLHo9W10sRT0xL2MsRj1uZXcgayxKPW5ldyBmLFA7Zm9yKFA9MDtQPD1jO1ArKyl7dmFyIFI9ZStQKkUqZzt2YXIgUz1NYXRoLnNpbihSKSxWPU1hdGguY29zKFIpO2ZvcihSPTA7Ujw9YS5sZW5ndGgtMTtSKyspRi54PWFbUl0ueCpTLEYueT1hW1JdLnksRi56PWFbUl0ueCpWLHYucHVzaChGLngsRi55LEYueiksSi54PVAvYyxKLnk9Ui8oYS5sZW5ndGgtMSksei5wdXNoKEoueCxKLnkpfWZvcihQPTA7UDxjO1ArKylmb3IoUj0wO1I8YS5sZW5ndGgtMTtSKyspZT1SK1AqYS5sZW5ndGgsRT1lK2EubGVuZ3RoLEY9ZSthLmxlbmd0aCsxLEo9ZSsxLHIucHVzaChlLEUsSiksci5wdXNoKEUsRixKKTt0aGlzLnNldEluZGV4KHIpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHYsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKHosMikpO3RoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtpZihnPT09MipNYXRoLlBJKWZvcihnPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwuYXJyYXksCnI9bmV3IGssdj1uZXcgayx6PW5ldyBrLGU9YyphLmxlbmd0aCozLFI9UD0wO1A8YS5sZW5ndGg7UCsrLFIrPTMpci54PWdbUiswXSxyLnk9Z1tSKzFdLHIuej1nW1IrMl0sdi54PWdbZStSKzBdLHYueT1nW2UrUisxXSx2Lno9Z1tlK1IrMl0sei5hZGRWZWN0b3JzKHIsdikubm9ybWFsaXplKCksZ1tSKzBdPWdbZStSKzBdPXoueCxnW1IrMV09Z1tlK1IrMV09ei55LGdbUisyXT1nW2UrUisyXT16Lnp9ZnVuY3Rpb24gVmQoYSxjKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iU2hhcGVHZW9tZXRyeSI7Im9iamVjdCI9PT10eXBlb2YgYyYmKGNvbnNvbGUud2FybigiVEhSRUUuU2hhcGVHZW9tZXRyeTogT3B0aW9ucyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVtb3ZlZC4iKSxjPWMuY3VydmVTZWdtZW50cyk7dGhpcy5wYXJhbWV0ZXJzPXtzaGFwZXM6YSxjdXJ2ZVNlZ21lbnRzOmN9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBXZChhLGMpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBXZChhLApjKXtmdW5jdGlvbiBlKFApe3ZhciBSLFM9ci5sZW5ndGgvMztQPVAuZXh0cmFjdFBvaW50cyhjKTt2YXIgVj1QLnNoYXBlLFc9UC5ob2xlczshMT09PWVkLmlzQ2xvY2tXaXNlKFYpJiYoVj1WLnJldmVyc2UoKSk7UD0wO2ZvcihSPVcubGVuZ3RoO1A8UjtQKyspe3ZhciBoYT1XW1BdOyEwPT09ZWQuaXNDbG9ja1dpc2UoaGEpJiYoV1tQXT1oYS5yZXZlcnNlKCkpfXZhciBmYT1lZC50cmlhbmd1bGF0ZVNoYXBlKFYsVyk7UD0wO2ZvcihSPVcubGVuZ3RoO1A8UjtQKyspaGE9V1tQXSxWPVYuY29uY2F0KGhhKTtQPTA7Zm9yKFI9Vi5sZW5ndGg7UDxSO1ArKyloYT1WW1BdLHIucHVzaChoYS54LGhhLnksMCksdi5wdXNoKDAsMCwxKSx6LnB1c2goaGEueCxoYS55KTtQPTA7Zm9yKFI9ZmEubGVuZ3RoO1A8UjtQKyspVj1mYVtQXSxnLnB1c2goVlswXStTLFZbMV0rUyxWWzJdK1MpLEYrPTN9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYXBlQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz0Ke3NoYXBlczphLGN1cnZlU2VnbWVudHM6Y307Yz1jfHwxMjt2YXIgZz1bXSxyPVtdLHY9W10sej1bXSxFPTAsRj0wO2lmKCExPT09QXJyYXkuaXNBcnJheShhKSllKGEpO2Vsc2UgZm9yKHZhciBKPTA7SjxhLmxlbmd0aDtKKyspZShhW0pdKSx0aGlzLmFkZEdyb3VwKEUsRixKKSxFKz1GLEY9MDt0aGlzLnNldEluZGV4KGcpO3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHIsMykpO3RoaXMuYWRkQXR0cmlidXRlKCJub3JtYWwiLG5ldyBjYSh2LDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLG5ldyBjYSh6LDIpKX1mdW5jdGlvbiBOaihhLGMpe2Muc2hhcGVzPVtdO2lmKEFycmF5LmlzQXJyYXkoYSkpZm9yKHZhciBlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKWMuc2hhcGVzLnB1c2goYVtlXS51dWlkKTtlbHNlIGMuc2hhcGVzLnB1c2goYS51dWlkKTtyZXR1cm4gY31mdW5jdGlvbiBQZShhLGMpe3ZhLmNhbGwodGhpcyk7dGhpcy50eXBlPSJFZGdlc0dlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9Cnt0aHJlc2hvbGRBbmdsZTpjfTt2YXIgZT1bXTtjPU1hdGguY29zKGhiLkRFRzJSQUQqKHZvaWQgMCE9PWM/YzoxKSk7dmFyIGc9WzAsMF0scj17fSx2PVsiYSIsImIiLCJjIl07aWYoYS5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgej1uZXcgeWE7ei5mcm9tQnVmZmVyR2VvbWV0cnkoYSl9ZWxzZSB6PWEuY2xvbmUoKTt6Lm1lcmdlVmVydGljZXMoKTt6LmNvbXB1dGVGYWNlTm9ybWFscygpO2E9ei52ZXJ0aWNlczt6PXouZmFjZXM7Zm9yKHZhciBFPTAsRj16Lmxlbmd0aDtFPEY7RSsrKWZvcih2YXIgSj16W0VdLFA9MDszPlA7UCsrKXt2YXIgUj1KW3ZbUF1dO3ZhciBTPUpbdlsoUCsxKSUzXV07Z1swXT1NYXRoLm1pbihSLFMpO2dbMV09TWF0aC5tYXgoUixTKTtSPWdbMF0rIiwiK2dbMV07dm9pZCAwPT09cltSXT9yW1JdPXtpbmRleDE6Z1swXSxpbmRleDI6Z1sxXSxmYWNlMTpFLGZhY2UyOnZvaWQgMH06cltSXS5mYWNlMj1FfWZvcihSIGluIHIpaWYoZz1yW1JdLHZvaWQgMD09PWcuZmFjZTJ8fAp6W2cuZmFjZTFdLm5vcm1hbC5kb3QoeltnLmZhY2UyXS5ub3JtYWwpPD1jKXY9YVtnLmluZGV4MV0sZS5wdXNoKHYueCx2Lnksdi56KSx2PWFbZy5pbmRleDJdLGUucHVzaCh2Lngsdi55LHYueik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoZSwzKSl9ZnVuY3Rpb24gWGQoYSxjLGUsZyxyLHYseixFKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3lsaW5kZXJHZW9tZXRyeSI7dGhpcy5wYXJhbWV0ZXJzPXtyYWRpdXNUb3A6YSxyYWRpdXNCb3R0b206YyxoZWlnaHQ6ZSxyYWRpYWxTZWdtZW50czpnLGhlaWdodFNlZ21lbnRzOnIsb3BlbkVuZGVkOnYsdGhldGFTdGFydDp6LHRoZXRhTGVuZ3RoOkV9O3RoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KG5ldyBmZChhLGMsZSxnLHIsdix6LEUpKTt0aGlzLm1lcmdlVmVydGljZXMoKX1mdW5jdGlvbiBmZChhLGMsZSxnLHIsdix6LEUpe2Z1bmN0aW9uIEYocGEpe3ZhciBxYSx1YT1uZXcgZixvYT1uZXcgayx0YT0wLEJhPSEwPT09CnBhP2E6YyxUYT0hMD09PXBhPzE6LTE7dmFyIFVhPVc7Zm9yKHFhPTE7cWE8PWc7cWErKylSLnB1c2goMCxmYSpUYSwwKSxTLnB1c2goMCxUYSwwKSxWLnB1c2goLjUsLjUpLFcrKzt2YXIgQ2E9Vztmb3IocWE9MDtxYTw9ZztxYSsrKXt2YXIgSGE9cWEvZypFK3osRGE9TWF0aC5jb3MoSGEpO0hhPU1hdGguc2luKEhhKTtvYS54PUJhKkhhO29hLnk9ZmEqVGE7b2Euej1CYSpEYTtSLnB1c2gob2EueCxvYS55LG9hLnopO1MucHVzaCgwLFRhLDApO3VhLng9LjUqRGErLjU7dWEueT0uNSpIYSpUYSsuNTtWLnB1c2godWEueCx1YS55KTtXKyt9Zm9yKHFhPTA7cWE8ZztxYSsrKXVhPVVhK3FhLG9hPUNhK3FhLCEwPT09cGE/UC5wdXNoKG9hLG9hKzEsdWEpOlAucHVzaChvYSsxLG9hLHVhKSx0YSs9MztKLmFkZEdyb3VwKHJhLHRhLCEwPT09cGE/MToyKTtyYSs9dGF9dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN5bGluZGVyQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzVG9wOmEsCnJhZGl1c0JvdHRvbTpjLGhlaWdodDplLHJhZGlhbFNlZ21lbnRzOmcsaGVpZ2h0U2VnbWVudHM6cixvcGVuRW5kZWQ6dix0aGV0YVN0YXJ0OnosdGhldGFMZW5ndGg6RX07dmFyIEo9dGhpczthPXZvaWQgMCE9PWE/YToxO2M9dm9pZCAwIT09Yz9jOjE7ZT1lfHwxO2c9TWF0aC5mbG9vcihnKXx8ODtyPU1hdGguZmxvb3Iocil8fDE7dj12b2lkIDAhPT12P3Y6ITE7ej12b2lkIDAhPT16P3o6MDtFPXZvaWQgMCE9PUU/RToyKk1hdGguUEk7dmFyIFA9W10sUj1bXSxTPVtdLFY9W10sVz0wLGhhPVtdLGZhPWUvMixyYT0wOyhmdW5jdGlvbigpe3ZhciBwYSxxYSx1YT1uZXcgayxvYT1uZXcgayx0YT0wLEJhPShjLWEpL2U7Zm9yKHFhPTA7cWE8PXI7cWErKyl7dmFyIFRhPVtdLFVhPXFhL3IsQ2E9VWEqKGMtYSkrYTtmb3IocGE9MDtwYTw9ZztwYSsrKXt2YXIgSGE9cGEvZyxEYT1IYSpFK3osTWE9TWF0aC5zaW4oRGEpO0RhPU1hdGguY29zKERhKTtvYS54PUNhKk1hO29hLnk9LVVhKmUrZmE7Cm9hLno9Q2EqRGE7Ui5wdXNoKG9hLngsb2EueSxvYS56KTt1YS5zZXQoTWEsQmEsRGEpLm5vcm1hbGl6ZSgpO1MucHVzaCh1YS54LHVhLnksdWEueik7Vi5wdXNoKEhhLDEtVWEpO1RhLnB1c2goVysrKX1oYS5wdXNoKFRhKX1mb3IocGE9MDtwYTxnO3BhKyspZm9yKHFhPTA7cWE8cjtxYSsrKXVhPWhhW3FhKzFdW3BhXSxvYT1oYVtxYSsxXVtwYSsxXSxCYT1oYVtxYV1bcGErMV0sUC5wdXNoKGhhW3FhXVtwYV0sdWEsQmEpLFAucHVzaCh1YSxvYSxCYSksdGErPTY7Si5hZGRHcm91cChyYSx0YSwwKTtyYSs9dGF9KSgpOyExPT09diYmKDA8YSYmRighMCksMDxjJiZGKCExKSk7dGhpcy5zZXRJbmRleChQKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShSLDMpKTt0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgY2EoUywzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoInV2IixuZXcgY2EoViwyKSl9ZnVuY3Rpb24gVmYoYSxjLGUsZyxyLHYseil7WGQuY2FsbCh0aGlzLAowLGEsYyxlLGcscix2LHopO3RoaXMudHlwZT0iQ29uZUdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLGhlaWdodDpjLHJhZGlhbFNlZ21lbnRzOmUsaGVpZ2h0U2VnbWVudHM6ZyxvcGVuRW5kZWQ6cix0aGV0YVN0YXJ0OnYsdGhldGFMZW5ndGg6en19ZnVuY3Rpb24gV2YoYSxjLGUsZyxyLHYseil7ZmQuY2FsbCh0aGlzLDAsYSxjLGUsZyxyLHYseik7dGhpcy50eXBlPSJDb25lQnVmZmVyR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsaGVpZ2h0OmMscmFkaWFsU2VnbWVudHM6ZSxoZWlnaHRTZWdtZW50czpnLG9wZW5FbmRlZDpyLHRoZXRhU3RhcnQ6dix0aGV0YUxlbmd0aDp6fX1mdW5jdGlvbiBYZihhLGMsZSxnKXt5YS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2lyY2xlR2VvbWV0cnkiO3RoaXMucGFyYW1ldGVycz17cmFkaXVzOmEsc2VnbWVudHM6Yyx0aGV0YVN0YXJ0OmUsdGhldGFMZW5ndGg6Z307dGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkobmV3IFFlKGEsCmMsZSxnKSk7dGhpcy5tZXJnZVZlcnRpY2VzKCl9ZnVuY3Rpb24gUWUoYSxjLGUsZyl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkNpcmNsZUJ1ZmZlckdlb21ldHJ5Ijt0aGlzLnBhcmFtZXRlcnM9e3JhZGl1czphLHNlZ21lbnRzOmMsdGhldGFTdGFydDplLHRoZXRhTGVuZ3RoOmd9O2E9YXx8MTtjPXZvaWQgMCE9PWM/TWF0aC5tYXgoMyxjKTo4O2U9dm9pZCAwIT09ZT9lOjA7Zz12b2lkIDAhPT1nP2c6MipNYXRoLlBJO3ZhciByPVtdLHY9W10sej1bXSxFPVtdLEYsSj1uZXcgayxQPW5ldyBmO3YucHVzaCgwLDAsMCk7ei5wdXNoKDAsMCwxKTtFLnB1c2goLjUsLjUpO3ZhciBSPTA7Zm9yKEY9MztSPD1jO1IrKyxGKz0zKXt2YXIgUz1lK1IvYypnO0oueD1hKk1hdGguY29zKFMpO0oueT1hKk1hdGguc2luKFMpO3YucHVzaChKLngsSi55LEoueik7ei5wdXNoKDAsMCwxKTtQLng9KHZbRl0vYSsxKS8yO1AueT0odltGKzFdL2ErMSkvMjtFLnB1c2goUC54LFAueSl9Zm9yKEY9MTtGPD0KYztGKyspci5wdXNoKEYsRisxLDApO3RoaXMuc2V0SW5kZXgocik7dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EodiwzKSk7dGhpcy5hZGRBdHRyaWJ1dGUoIm5vcm1hbCIsbmV3IGNhKHosMykpO3RoaXMuYWRkQXR0cmlidXRlKCJ1diIsbmV3IGNhKEUsMikpfWZ1bmN0aW9uIFlkKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlNoYWRvd01hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDApO3RoaXMudHJhbnNwYXJlbnQ9ITA7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gUmUoYSl7cWIuY2FsbCh0aGlzLGEpO3RoaXMudHlwZT0iUmF3U2hhZGVyTWF0ZXJpYWwifWZ1bmN0aW9uIFNjKGEpe00uY2FsbCh0aGlzKTt0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIifTt0aGlzLnR5cGU9Ik1lc2hTdGFuZGFyZE1hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLm1ldGFsbmVzcz10aGlzLnJvdWdobmVzcz0uNTt0aGlzLmxpZ2h0TWFwPXRoaXMubWFwPQpudWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEkoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xO3RoaXMuYnVtcE1hcD10aGlzLmVtaXNzaXZlTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMubWV0YWxuZXNzTWFwPXRoaXMucm91Z2huZXNzTWFwPW51bGw7dGhpcy5lbnZNYXBJbnRlbnNpdHk9MTt0aGlzLnJlZnJhY3Rpb25SYXRpbz0uOTg7dGhpcy53aXJlZnJhbWU9ITE7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9MTt0aGlzLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWNhcD0KInJvdW5kIjt0aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIFpkKGEpe1NjLmNhbGwodGhpcyk7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn07dGhpcy50eXBlPSJNZXNoUGh5c2ljYWxNYXRlcmlhbCI7dGhpcy5yZWZsZWN0aXZpdHk9LjU7dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXQ9MDt0aGlzLnNoZWVuPW51bGw7dGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZT1uZXcgZigxLDEpO3RoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwPW51bGw7dGhpcy50cmFuc3BhcmVuY3k9MDt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBCYyhhKXtNLmNhbGwodGhpcyk7dGhpcy50eXBlPSJNZXNoUGhvbmdNYXRlcmlhbCI7dGhpcy5jb2xvcj1uZXcgSSgxNjc3NzIxNSk7dGhpcy5zcGVjdWxhcj1uZXcgSSgxMTE4NDgxKTt0aGlzLnNoaW5pbmVzcz0zMDt0aGlzLmxpZ2h0TWFwPQp0aGlzLm1hcD1udWxsO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9MTt0aGlzLmFvTWFwPW51bGw7dGhpcy5hb01hcEludGVuc2l0eT0xO3RoaXMuZW1pc3NpdmU9bmV3IEkoMCk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT0xO3RoaXMuYnVtcE1hcD10aGlzLmVtaXNzaXZlTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMuc3BlY3VsYXJNYXA9bnVsbDt0aGlzLmNvbWJpbmU9MDt0aGlzLnJlZmxlY3Rpdml0eT0xO3RoaXMucmVmcmFjdGlvblJhdGlvPS45ODt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMud2lyZWZyYW1lTGluZWpvaW49dGhpcy53aXJlZnJhbWVMaW5lY2FwPQoicm91bmQiO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPXRoaXMuc2tpbm5pbmc9ITE7dGhpcy5zZXRWYWx1ZXMoYSl9ZnVuY3Rpb24gJGQoYSl7QmMuY2FsbCh0aGlzKTt0aGlzLmRlZmluZXM9e1RPT046IiJ9O3RoaXMudHlwZT0iTWVzaFRvb25NYXRlcmlhbCI7dGhpcy5ncmFkaWVudE1hcD1udWxsO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIGFlKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hOb3JtYWxNYXRlcmlhbCI7dGhpcy5idW1wTWFwPW51bGw7dGhpcy5idW1wU2NhbGU9MTt0aGlzLm5vcm1hbE1hcD1udWxsO3RoaXMubm9ybWFsTWFwVHlwZT0wO3RoaXMubm9ybWFsU2NhbGU9bmV3IGYoMSwxKTt0aGlzLmRpc3BsYWNlbWVudE1hcD1udWxsO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9MTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9MDt0aGlzLndpcmVmcmFtZT0hMTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD0xO3RoaXMubW9ycGhOb3JtYWxzPXRoaXMubW9ycGhUYXJnZXRzPQp0aGlzLnNraW5uaW5nPXRoaXMubGlnaHRzPXRoaXMuZm9nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIGJlKGEpe00uY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ik1lc2hMYW1iZXJ0TWF0ZXJpYWwiO3RoaXMuY29sb3I9bmV3IEkoMTY3NzcyMTUpO3RoaXMubGlnaHRNYXA9dGhpcy5tYXA9bnVsbDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PTE7dGhpcy5hb01hcD1udWxsO3RoaXMuYW9NYXBJbnRlbnNpdHk9MTt0aGlzLmVtaXNzaXZlPW5ldyBJKDApO3RoaXMuZW1pc3NpdmVJbnRlbnNpdHk9MTt0aGlzLmVudk1hcD10aGlzLmFscGhhTWFwPXRoaXMuc3BlY3VsYXJNYXA9dGhpcy5lbWlzc2l2ZU1hcD1udWxsO3RoaXMuY29tYmluZT0wO3RoaXMucmVmbGVjdGl2aXR5PTE7dGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4O3RoaXMud2lyZWZyYW1lPSExO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPTE7dGhpcy53aXJlZnJhbWVMaW5lam9pbj10aGlzLndpcmVmcmFtZUxpbmVjYXA9InJvdW5kIjsKdGhpcy5tb3JwaE5vcm1hbHM9dGhpcy5tb3JwaFRhcmdldHM9dGhpcy5za2lubmluZz0hMTt0aGlzLnNldFZhbHVlcyhhKX1mdW5jdGlvbiBjZShhKXtNLmNhbGwodGhpcyk7dGhpcy5kZWZpbmVzPXtNQVRDQVA6IiJ9O3RoaXMudHlwZT0iTWVzaE1hdGNhcE1hdGVyaWFsIjt0aGlzLmNvbG9yPW5ldyBJKDE2Nzc3MjE1KTt0aGlzLmJ1bXBNYXA9dGhpcy5tYXA9dGhpcy5tYXRjYXA9bnVsbDt0aGlzLmJ1bXBTY2FsZT0xO3RoaXMubm9ybWFsTWFwPW51bGw7dGhpcy5ub3JtYWxNYXBUeXBlPTA7dGhpcy5ub3JtYWxTY2FsZT1uZXcgZigxLDEpO3RoaXMuZGlzcGxhY2VtZW50TWFwPW51bGw7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT0xO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz0wO3RoaXMuYWxwaGFNYXA9bnVsbDt0aGlzLmxpZ2h0cz10aGlzLm1vcnBoTm9ybWFscz10aGlzLm1vcnBoVGFyZ2V0cz10aGlzLnNraW5uaW5nPSExO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIGRlKGEpe0ZiLmNhbGwodGhpcyk7CnRoaXMudHlwZT0iTGluZURhc2hlZE1hdGVyaWFsIjt0aGlzLnNjYWxlPTE7dGhpcy5kYXNoU2l6ZT0zO3RoaXMuZ2FwU2l6ZT0xO3RoaXMuc2V0VmFsdWVzKGEpfWZ1bmN0aW9uIG9jKGEsYyxlLGcpe3RoaXMucGFyYW1ldGVyUG9zaXRpb25zPWE7dGhpcy5fY2FjaGVkSW5kZXg9MDt0aGlzLnJlc3VsdEJ1ZmZlcj12b2lkIDAhPT1nP2c6bmV3IGMuY29uc3RydWN0b3IoZSk7dGhpcy5zYW1wbGVWYWx1ZXM9Yzt0aGlzLnZhbHVlU2l6ZT1lfWZ1bmN0aW9uIEVnKGEsYyxlLGcpe29jLmNhbGwodGhpcyxhLGMsZSxnKTt0aGlzLl9vZmZzZXROZXh0PXRoaXMuX3dlaWdodE5leHQ9dGhpcy5fb2Zmc2V0UHJldj10aGlzLl93ZWlnaHRQcmV2PS0wfWZ1bmN0aW9uIFlmKGEsYyxlLGcpe29jLmNhbGwodGhpcyxhLGMsZSxnKX1mdW5jdGlvbiBGZyhhLGMsZSxnKXtvYy5jYWxsKHRoaXMsYSxjLGUsZyl9ZnVuY3Rpb24gWGIoYSxjLGUsZyl7aWYodm9pZCAwPT09YSl0aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgbmFtZSBpcyB1bmRlZmluZWQiKTsKaWYodm9pZCAwPT09Y3x8MD09PWMubGVuZ3RoKXRocm93IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBubyBrZXlmcmFtZXMgaW4gdHJhY2sgbmFtZWQgIithKTt0aGlzLm5hbWU9YTt0aGlzLnRpbWVzPVRiLmNvbnZlcnRBcnJheShjLHRoaXMuVGltZUJ1ZmZlclR5cGUpO3RoaXMudmFsdWVzPVRiLmNvbnZlcnRBcnJheShlLHRoaXMuVmFsdWVCdWZmZXJUeXBlKTt0aGlzLnNldEludGVycG9sYXRpb24oZ3x8dGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbil9ZnVuY3Rpb24gR2coYSxjLGUpe1hiLmNhbGwodGhpcyxhLGMsZSl9ZnVuY3Rpb24gSGcoYSxjLGUsZyl7WGIuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIFNlKGEsYyxlLGcpe1hiLmNhbGwodGhpcyxhLGMsZSxnKX1mdW5jdGlvbiBJZyhhLGMsZSxnKXtvYy5jYWxsKHRoaXMsYSxjLGUsZyl9ZnVuY3Rpb24gWmYoYSxjLGUsZyl7WGIuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIEpnKGEsYyxlLGcpe1hiLmNhbGwodGhpcywKYSxjLGUsZyl9ZnVuY3Rpb24gVGUoYSxjLGUsZyl7WGIuY2FsbCh0aGlzLGEsYyxlLGcpfWZ1bmN0aW9uIHRjKGEsYyxlKXt0aGlzLm5hbWU9YTt0aGlzLnRyYWNrcz1lO3RoaXMuZHVyYXRpb249dm9pZCAwIT09Yz9jOi0xO3RoaXMudXVpZD1oYi5nZW5lcmF0ZVVVSUQoKTswPnRoaXMuZHVyYXRpb24mJnRoaXMucmVzZXREdXJhdGlvbigpfWZ1bmN0aW9uIG1tKGEpe3N3aXRjaChhLnRvTG93ZXJDYXNlKCkpe2Nhc2UgInNjYWxhciI6Y2FzZSAiZG91YmxlIjpjYXNlICJmbG9hdCI6Y2FzZSAibnVtYmVyIjpjYXNlICJpbnRlZ2VyIjpyZXR1cm4gU2U7Y2FzZSAidmVjdG9yIjpjYXNlICJ2ZWN0b3IyIjpjYXNlICJ2ZWN0b3IzIjpjYXNlICJ2ZWN0b3I0IjpyZXR1cm4gVGU7Y2FzZSAiY29sb3IiOnJldHVybiBIZztjYXNlICJxdWF0ZXJuaW9uIjpyZXR1cm4gWmY7Y2FzZSAiYm9vbCI6Y2FzZSAiYm9vbGVhbiI6cmV0dXJuIEdnO2Nhc2UgInN0cmluZyI6cmV0dXJuIEpnfXRocm93IEVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBVbnN1cHBvcnRlZCB0eXBlTmFtZTogIisKYSk7fWZ1bmN0aW9uIG5tKGEpe2lmKHZvaWQgMD09PWEudHlwZSl0aHJvdyBFcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgdHlwZSB1bmRlZmluZWQsIGNhbiBub3QgcGFyc2UiKTt2YXIgYz1tbShhLnR5cGUpO2lmKHZvaWQgMD09PWEudGltZXMpe3ZhciBlPVtdLGc9W107VGIuZmxhdHRlbkpTT04oYS5rZXlzLGUsZywidmFsdWUiKTthLnRpbWVzPWU7YS52YWx1ZXM9Z31yZXR1cm4gdm9pZCAwIT09Yy5wYXJzZT9jLnBhcnNlKGEpOm5ldyBjKGEubmFtZSxhLnRpbWVzLGEudmFsdWVzLGEuaW50ZXJwb2xhdGlvbil9ZnVuY3Rpb24gJGgoYSxjLGUpe3ZhciBnPXRoaXMscj0hMSx2PTAsej0wLEU9dm9pZCAwO3RoaXMub25TdGFydD12b2lkIDA7dGhpcy5vbkxvYWQ9YTt0aGlzLm9uUHJvZ3Jlc3M9Yzt0aGlzLm9uRXJyb3I9ZTt0aGlzLml0ZW1TdGFydD1mdW5jdGlvbihGKXt6Kys7aWYoITE9PT1yJiZ2b2lkIDAhPT1nLm9uU3RhcnQpZy5vblN0YXJ0KEYsdix6KTtyPSEwfTsKdGhpcy5pdGVtRW5kPWZ1bmN0aW9uKEYpe3YrKztpZih2b2lkIDAhPT1nLm9uUHJvZ3Jlc3MpZy5vblByb2dyZXNzKEYsdix6KTtpZih2PT09eiYmKHI9ITEsdm9pZCAwIT09Zy5vbkxvYWQpKWcub25Mb2FkKCl9O3RoaXMuaXRlbUVycm9yPWZ1bmN0aW9uKEYpe2lmKHZvaWQgMCE9PWcub25FcnJvcilnLm9uRXJyb3IoRil9O3RoaXMucmVzb2x2ZVVSTD1mdW5jdGlvbihGKXtyZXR1cm4gRT9FKEYpOkZ9O3RoaXMuc2V0VVJMTW9kaWZpZXI9ZnVuY3Rpb24oRil7RT1GO3JldHVybiB0aGlzfX1mdW5jdGlvbiBEYihhKXt0aGlzLm1hbmFnZXI9dm9pZCAwIT09YT9hOk9qO3RoaXMuY3Jvc3NPcmlnaW49ImFub255bW91cyI7dGhpcy5yZXNvdXJjZVBhdGg9dGhpcy5wYXRoPSIifWZ1bmN0aW9uIHVjKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiBhaShhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gYmkoYSl7RGIuY2FsbCh0aGlzLGEpO3RoaXMuX3BhcnNlcj1udWxsfWZ1bmN0aW9uIEtnKGEpe0RiLmNhbGwodGhpcywKYSk7dGhpcy5fcGFyc2VyPW51bGx9ZnVuY3Rpb24gVWUoYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIExnKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiBNZyhhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gWmEoKXt0aGlzLnR5cGU9IkN1cnZlIjt0aGlzLmFyY0xlbmd0aERpdmlzaW9ucz0yMDB9ZnVuY3Rpb24gcGMoYSxjLGUsZyxyLHYseixFKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iRWxsaXBzZUN1cnZlIjt0aGlzLmFYPWF8fDA7dGhpcy5hWT1jfHwwO3RoaXMueFJhZGl1cz1lfHwxO3RoaXMueVJhZGl1cz1nfHwxO3RoaXMuYVN0YXJ0QW5nbGU9cnx8MDt0aGlzLmFFbmRBbmdsZT12fHwyKk1hdGguUEk7dGhpcy5hQ2xvY2t3aXNlPXp8fCExO3RoaXMuYVJvdGF0aW9uPUV8fDB9ZnVuY3Rpb24gVmUoYSxjLGUsZyxyLHYpe3BjLmNhbGwodGhpcyxhLGMsZSxlLGcscix2KTt0aGlzLnR5cGU9IkFyY0N1cnZlIn1mdW5jdGlvbiBjaSgpe2Z1bmN0aW9uIGEodix6LEUsCkYpe2M9djtlPUU7Zz0tMyp2KzMqei0yKkUtRjtyPTIqdi0yKnorRStGfXZhciBjPTAsZT0wLGc9MCxyPTA7cmV0dXJue2luaXRDYXRtdWxsUm9tOmZ1bmN0aW9uKHYseixFLEYsSil7YSh6LEUsSiooRS12KSxKKihGLXopKX0saW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tOmZ1bmN0aW9uKHYseixFLEYsSixQLFIpe2EoeixFLCgoei12KS9KLShFLXYpLyhKK1ApKyhFLXopL1ApKlAsKChFLXopL1AtKEYteikvKFArUikrKEYtRSkvUikqUCl9LGNhbGM6ZnVuY3Rpb24odil7dmFyIHo9dip2O3JldHVybiBjK2UqditnKnorcip6KnZ9fX1mdW5jdGlvbiBaYihhLGMsZSxnKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ2F0bXVsbFJvbUN1cnZlMyI7dGhpcy5wb2ludHM9YXx8W107dGhpcy5jbG9zZWQ9Y3x8ITE7dGhpcy5jdXJ2ZVR5cGU9ZXx8ImNlbnRyaXBldGFsIjt0aGlzLnRlbnNpb249Z3x8LjV9ZnVuY3Rpb24gUGooYSxjLGUsZyxyKXtjPS41KihnLWMpO3I9LjUqKHItZSk7dmFyIHY9CmEqYTtyZXR1cm4oMiplLTIqZytjK3IpKmEqdisoLTMqZSszKmctMipjLXIpKnYrYyphK2V9ZnVuY3Rpb24gb20oYSxjKXthPTEtYTtyZXR1cm4gYSphKmN9ZnVuY3Rpb24gcG0oYSxjKXtyZXR1cm4gMiooMS1hKSphKmN9ZnVuY3Rpb24gcW0oYSxjKXtyZXR1cm4gYSphKmN9ZnVuY3Rpb24gJGYoYSxjLGUsZyl7cmV0dXJuIG9tKGEsYykrcG0oYSxlKStxbShhLGcpfWZ1bmN0aW9uIHJtKGEsYyl7YT0xLWE7cmV0dXJuIGEqYSphKmN9ZnVuY3Rpb24gc20oYSxjKXt2YXIgZT0xLWE7cmV0dXJuIDMqZSplKmEqY31mdW5jdGlvbiB0bShhLGMpe3JldHVybiAzKigxLWEpKmEqYSpjfWZ1bmN0aW9uIHVtKGEsYyl7cmV0dXJuIGEqYSphKmN9ZnVuY3Rpb24gYWcoYSxjLGUsZyxyKXtyZXR1cm4gcm0oYSxjKStzbShhLGUpK3RtKGEsZykrdW0oYSxyKX1mdW5jdGlvbiBDYyhhLGMsZSxnKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3ViaWNCZXppZXJDdXJ2ZSI7dGhpcy52MD1hfHxuZXcgZjsKdGhpcy52MT1jfHxuZXcgZjt0aGlzLnYyPWV8fG5ldyBmO3RoaXMudjM9Z3x8bmV3IGZ9ZnVuY3Rpb24gVGMoYSxjLGUsZyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkN1YmljQmV6aWVyQ3VydmUzIjt0aGlzLnYwPWF8fG5ldyBrO3RoaXMudjE9Y3x8bmV3IGs7dGhpcy52Mj1lfHxuZXcgazt0aGlzLnYzPWd8fG5ldyBrfWZ1bmN0aW9uIGtjKGEsYyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVDdXJ2ZSI7dGhpcy52MT1hfHxuZXcgZjt0aGlzLnYyPWN8fG5ldyBmfWZ1bmN0aW9uIERjKGEsYyl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpbmVDdXJ2ZTMiO3RoaXMudjE9YXx8bmV3IGs7dGhpcy52Mj1jfHxuZXcga31mdW5jdGlvbiBFYyhhLGMsZSl7WmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IlF1YWRyYXRpY0JlemllckN1cnZlIjt0aGlzLnYwPWF8fG5ldyBmO3RoaXMudjE9Y3x8bmV3IGY7dGhpcy52Mj1lfHxuZXcgZn1mdW5jdGlvbiBVYyhhLGMsZSl7WmEuY2FsbCh0aGlzKTsKdGhpcy50eXBlPSJRdWFkcmF0aWNCZXppZXJDdXJ2ZTMiO3RoaXMudjA9YXx8bmV3IGs7dGhpcy52MT1jfHxuZXcgazt0aGlzLnYyPWV8fG5ldyBrfWZ1bmN0aW9uIEZjKGEpe1phLmNhbGwodGhpcyk7dGhpcy50eXBlPSJTcGxpbmVDdXJ2ZSI7dGhpcy5wb2ludHM9YXx8W119ZnVuY3Rpb24gZ2QoKXtaYS5jYWxsKHRoaXMpO3RoaXMudHlwZT0iQ3VydmVQYXRoIjt0aGlzLmN1cnZlcz1bXTt0aGlzLmF1dG9DbG9zZT0hMX1mdW5jdGlvbiBHYyhhKXtnZC5jYWxsKHRoaXMpO3RoaXMudHlwZT0iUGF0aCI7dGhpcy5jdXJyZW50UG9pbnQ9bmV3IGY7YSYmdGhpcy5zZXRGcm9tUG9pbnRzKGEpfWZ1bmN0aW9uIENkKGEpe0djLmNhbGwodGhpcyxhKTt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy50eXBlPSJTaGFwZSI7dGhpcy5ob2xlcz1bXX1mdW5jdGlvbiBKYihhLGMpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkxpZ2h0Ijt0aGlzLmNvbG9yPW5ldyBJKGEpO3RoaXMuaW50ZW5zaXR5PQp2b2lkIDAhPT1jP2M6MTt0aGlzLnJlY2VpdmVTaGFkb3c9dm9pZCAwfWZ1bmN0aW9uIE5nKGEsYyxlKXtKYi5jYWxsKHRoaXMsYSxlKTt0aGlzLnR5cGU9IkhlbWlzcGhlcmVMaWdodCI7dGhpcy5jYXN0U2hhZG93PXZvaWQgMDt0aGlzLnBvc2l0aW9uLmNvcHkoQS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7dGhpcy5ncm91bmRDb2xvcj1uZXcgSShjKX1mdW5jdGlvbiBWYyhhKXt0aGlzLmNhbWVyYT1hO3RoaXMuYmlhcz0wO3RoaXMucmFkaXVzPTE7dGhpcy5tYXBTaXplPW5ldyBmKDUxMiw1MTIpO3RoaXMubWFwUGFzcz10aGlzLm1hcD1udWxsO3RoaXMubWF0cml4PW5ldyBxO3RoaXMuX2ZydXN0dW09bmV3IGljO3RoaXMuX2ZyYW1lRXh0ZW50cz1uZXcgZigxLDEpO3RoaXMuX3ZpZXdwb3J0Q291bnQ9MTt0aGlzLl92aWV3cG9ydHM9W25ldyBwKDAsMCwxLDEpXX1mdW5jdGlvbiBPZygpe1ZjLmNhbGwodGhpcyxuZXcgdmIoNTAsMSwuNSw1MDApKX1mdW5jdGlvbiBQZyhhLApjLGUsZyxyLHYpe0piLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iU3BvdExpZ2h0Ijt0aGlzLnBvc2l0aW9uLmNvcHkoQS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7dGhpcy50YXJnZXQ9bmV3IEE7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInBvd2VyIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW50ZW5zaXR5Kk1hdGguUEl9LHNldDpmdW5jdGlvbih6KXt0aGlzLmludGVuc2l0eT16L01hdGguUEl9fSk7dGhpcy5kaXN0YW5jZT12b2lkIDAhPT1lP2U6MDt0aGlzLmFuZ2xlPXZvaWQgMCE9PWc/ZzpNYXRoLlBJLzM7dGhpcy5wZW51bWJyYT12b2lkIDAhPT1yP3I6MDt0aGlzLmRlY2F5PXZvaWQgMCE9PXY/djoxO3RoaXMuc2hhZG93PW5ldyBPZ31mdW5jdGlvbiBkaSgpe1ZjLmNhbGwodGhpcyxuZXcgdmIoOTAsMSwuNSw1MDApKTt0aGlzLl9mcmFtZUV4dGVudHM9bmV3IGYoNCwyKTt0aGlzLl92aWV3cG9ydENvdW50PTY7dGhpcy5fdmlld3BvcnRzPVtuZXcgcCgyLAoxLDEsMSksbmV3IHAoMCwxLDEsMSksbmV3IHAoMywxLDEsMSksbmV3IHAoMSwxLDEsMSksbmV3IHAoMywwLDEsMSksbmV3IHAoMSwwLDEsMSldO3RoaXMuX2N1YmVEaXJlY3Rpb25zPVtuZXcgaygxLDAsMCksbmV3IGsoLTEsMCwwKSxuZXcgaygwLDAsMSksbmV3IGsoMCwwLC0xKSxuZXcgaygwLDEsMCksbmV3IGsoMCwtMSwwKV07dGhpcy5fY3ViZVVwcz1bbmV3IGsoMCwxLDApLG5ldyBrKDAsMSwwKSxuZXcgaygwLDEsMCksbmV3IGsoMCwxLDApLG5ldyBrKDAsMCwxKSxuZXcgaygwLDAsLTEpXX1mdW5jdGlvbiBRZyhhLGMsZSxnKXtKYi5jYWxsKHRoaXMsYSxjKTt0aGlzLnR5cGU9IlBvaW50TGlnaHQiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJwb3dlciIse2dldDpmdW5jdGlvbigpe3JldHVybiA0KnRoaXMuaW50ZW5zaXR5Kk1hdGguUEl9LHNldDpmdW5jdGlvbihyKXt0aGlzLmludGVuc2l0eT1yLyg0Kk1hdGguUEkpfX0pO3RoaXMuZGlzdGFuY2U9dm9pZCAwIT09ZT8KZTowO3RoaXMuZGVjYXk9dm9pZCAwIT09Zz9nOjE7dGhpcy5zaGFkb3c9bmV3IGRpfWZ1bmN0aW9uIGJnKGEsYyxlLGcscix2KXt6Yi5jYWxsKHRoaXMpO3RoaXMudHlwZT0iT3J0aG9ncmFwaGljQ2FtZXJhIjt0aGlzLnpvb209MTt0aGlzLnZpZXc9bnVsbDt0aGlzLmxlZnQ9dm9pZCAwIT09YT9hOi0xO3RoaXMucmlnaHQ9dm9pZCAwIT09Yz9jOjE7dGhpcy50b3A9dm9pZCAwIT09ZT9lOjE7dGhpcy5ib3R0b209dm9pZCAwIT09Zz9nOi0xO3RoaXMubmVhcj12b2lkIDAhPT1yP3I6LjE7dGhpcy5mYXI9dm9pZCAwIT09dj92OjJFMzt0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1mdW5jdGlvbiBSZygpe1ZjLmNhbGwodGhpcyxuZXcgYmcoLTUsNSw1LC01LC41LDUwMCkpfWZ1bmN0aW9uIFNnKGEsYyl7SmIuY2FsbCh0aGlzLGEsYyk7dGhpcy50eXBlPSJEaXJlY3Rpb25hbExpZ2h0Ijt0aGlzLnBvc2l0aW9uLmNvcHkoQS5EZWZhdWx0VXApO3RoaXMudXBkYXRlTWF0cml4KCk7CnRoaXMudGFyZ2V0PW5ldyBBO3RoaXMuc2hhZG93PW5ldyBSZ31mdW5jdGlvbiBUZyhhLGMpe0piLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iQW1iaWVudExpZ2h0Ijt0aGlzLmNhc3RTaGFkb3c9dm9pZCAwfWZ1bmN0aW9uIFVnKGEsYyxlLGcpe0piLmNhbGwodGhpcyxhLGMpO3RoaXMudHlwZT0iUmVjdEFyZWFMaWdodCI7dGhpcy53aWR0aD12b2lkIDAhPT1lP2U6MTA7dGhpcy5oZWlnaHQ9dm9pZCAwIT09Zz9nOjEwfWZ1bmN0aW9uIFZnKGEpe0RiLmNhbGwodGhpcyxhKTt0aGlzLnRleHR1cmVzPXt9fWZ1bmN0aW9uIFdnKCl7dmEuY2FsbCh0aGlzKTt0aGlzLnR5cGU9Ikluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5Ijt0aGlzLm1heEluc3RhbmNlZENvdW50PXZvaWQgMH1mdW5jdGlvbiBYZyhhLGMsZSxnKXsibnVtYmVyIj09PXR5cGVvZiBlJiYoZz1lLGU9ITEsY29uc29sZS5lcnJvcigiVEhSRUUuSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlOiBUaGUgY29uc3RydWN0b3Igbm93IGV4cGVjdHMgbm9ybWFsaXplZCBhcyB0aGUgdGhpcmQgYXJndW1lbnQuIikpOwpRLmNhbGwodGhpcyxhLGMsZSk7dGhpcy5tZXNoUGVyQXR0cmlidXRlPWd8fDF9ZnVuY3Rpb24gWWcoYSl7RGIuY2FsbCh0aGlzLGEpfWZ1bmN0aW9uIFpnKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiBlaShhKXsidW5kZWZpbmVkIj09PXR5cGVvZiBjcmVhdGVJbWFnZUJpdG1hcCYmY29uc29sZS53YXJuKCJUSFJFRS5JbWFnZUJpdG1hcExvYWRlcjogY3JlYXRlSW1hZ2VCaXRtYXAoKSBub3Qgc3VwcG9ydGVkLiIpOyJ1bmRlZmluZWQiPT09dHlwZW9mIGZldGNoJiZjb25zb2xlLndhcm4oIlRIUkVFLkltYWdlQml0bWFwTG9hZGVyOiBmZXRjaCgpIG5vdCBzdXBwb3J0ZWQuIik7RGIuY2FsbCh0aGlzLGEpO3RoaXMub3B0aW9ucz12b2lkIDB9ZnVuY3Rpb24gZmkoKXt0aGlzLnR5cGU9IlNoYXBlUGF0aCI7dGhpcy5jb2xvcj1uZXcgSTt0aGlzLnN1YlBhdGhzPVtdO3RoaXMuY3VycmVudFBhdGg9bnVsbH1mdW5jdGlvbiBnaShhKXt0aGlzLnR5cGU9IkZvbnQiO3RoaXMuZGF0YT0KYX1mdW5jdGlvbiB2bShhLGMsZSl7YT1BcnJheS5mcm9tP0FycmF5LmZyb20oYSk6U3RyaW5nKGEpLnNwbGl0KCIiKTtjLz1lLnJlc29sdXRpb247Zm9yKHZhciBnPShlLmJvdW5kaW5nQm94LnlNYXgtZS5ib3VuZGluZ0JveC55TWluK2UudW5kZXJsaW5lVGhpY2tuZXNzKSpjLHI9W10sdj0wLHo9MCxFPTA7RTxhLmxlbmd0aDtFKyspe3ZhciBGPWFbRV07IlxuIj09PUY/KHY9MCx6LT1nKTooRj13bShGLGMsdix6LGUpLHYrPUYub2Zmc2V0WCxyLnB1c2goRi5wYXRoKSl9cmV0dXJuIHJ9ZnVuY3Rpb24gd20oYSxjLGUsZyxyKXt2YXIgdj1yLmdseXBoc1thXXx8ci5nbHlwaHNbIj8iXTtpZih2KXthPW5ldyBmaTtpZih2Lm8pe3I9di5fY2FjaGVkT3V0bGluZXx8KHYuX2NhY2hlZE91dGxpbmU9di5vLnNwbGl0KCIgIikpO2Zvcih2YXIgej0wLEU9ci5sZW5ndGg7ejxFOylzd2l0Y2goclt6KytdKXtjYXNlICJtIjp2YXIgRj1yW3orK10qYytlO3ZhciBKPXJbeisrXSpjK2c7YS5tb3ZlVG8oRiwKSik7YnJlYWs7Y2FzZSAibCI6Rj1yW3orK10qYytlO0o9clt6KytdKmMrZzthLmxpbmVUbyhGLEopO2JyZWFrO2Nhc2UgInEiOkY9clt6KytdKmMrZTtKPXJbeisrXSpjK2c7dmFyIFA9clt6KytdKmMrZTt2YXIgUj1yW3orK10qYytnO2EucXVhZHJhdGljQ3VydmVUbyhQLFIsRixKKTticmVhaztjYXNlICJiIjpGPXJbeisrXSpjK2U7Sj1yW3orK10qYytnO1A9clt6KytdKmMrZTtSPXJbeisrXSpjK2c7dmFyIFM9clt6KytdKmMrZTt2YXIgVj1yW3orK10qYytnO2EuYmV6aWVyQ3VydmVUbyhQLFIsUyxWLEYsSil9fXJldHVybntvZmZzZXRYOnYuaGEqYyxwYXRoOmF9fWNvbnNvbGUuZXJyb3IoJ1RIUkVFLkZvbnQ6IGNoYXJhY3RlciAiJythKyciIGRvZXMgbm90IGV4aXN0cyBpbiBmb250IGZhbWlseSAnK3IuZmFtaWx5TmFtZSsiLiIpfWZ1bmN0aW9uIGhpKGEpe0RiLmNhbGwodGhpcyxhKX1mdW5jdGlvbiAkZyhhKXtEYi5jYWxsKHRoaXMsYSl9ZnVuY3Rpb24gYWgoKXt0aGlzLmNvZWZmaWNpZW50cz0KW107Zm9yKHZhciBhPTA7OT5hO2ErKyl0aGlzLmNvZWZmaWNpZW50cy5wdXNoKG5ldyBrKX1mdW5jdGlvbiBIYyhhLGMpe0piLmNhbGwodGhpcyx2b2lkIDAsYyk7dGhpcy5zaD12b2lkIDAhPT1hP2E6bmV3IGFofWZ1bmN0aW9uIGlpKGEsYyxlKXtIYy5jYWxsKHRoaXMsdm9pZCAwLGUpO2E9KG5ldyBJKS5zZXQoYSk7ZT0obmV3IEkpLnNldChjKTtjPW5ldyBrKGEucixhLmcsYS5iKTthPW5ldyBrKGUucixlLmcsZS5iKTtlPU1hdGguc3FydChNYXRoLlBJKTt2YXIgZz1lKk1hdGguc3FydCguNzUpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLmNvcHkoYykuYWRkKGEpLm11bHRpcGx5U2NhbGFyKGUpO3RoaXMuc2guY29lZmZpY2llbnRzWzFdLmNvcHkoYykuc3ViKGEpLm11bHRpcGx5U2NhbGFyKGcpfWZ1bmN0aW9uIGppKGEsYyl7SGMuY2FsbCh0aGlzLHZvaWQgMCxjKTthPShuZXcgSSkuc2V0KGEpO3RoaXMuc2guY29lZmZpY2llbnRzWzBdLnNldChhLnIsYS5nLGEuYikubXVsdGlwbHlTY2FsYXIoMioKTWF0aC5zcXJ0KE1hdGguUEkpKX1mdW5jdGlvbiBRaigpe3RoaXMudHlwZT0iU3RlcmVvQ2FtZXJhIjt0aGlzLmFzcGVjdD0xO3RoaXMuZXllU2VwPS4wNjQ7dGhpcy5jYW1lcmFMPW5ldyB2Yjt0aGlzLmNhbWVyYUwubGF5ZXJzLmVuYWJsZSgxKTt0aGlzLmNhbWVyYUwubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmNhbWVyYVI9bmV3IHZiO3RoaXMuY2FtZXJhUi5sYXllcnMuZW5hYmxlKDIpO3RoaXMuY2FtZXJhUi5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuX2NhY2hlPXtmb2N1czpudWxsLGZvdjpudWxsLGFzcGVjdDpudWxsLG5lYXI6bnVsbCxmYXI6bnVsbCx6b29tOm51bGwsZXllU2VwOm51bGx9fWZ1bmN0aW9uIGtpKGEpe3RoaXMuYXV0b1N0YXJ0PXZvaWQgMCE9PWE/YTohMDt0aGlzLmVsYXBzZWRUaW1lPXRoaXMub2xkVGltZT10aGlzLnN0YXJ0VGltZT0wO3RoaXMucnVubmluZz0hMX1mdW5jdGlvbiBsaSgpe0EuY2FsbCh0aGlzKTt0aGlzLnR5cGU9IkF1ZGlvTGlzdGVuZXIiOwp0aGlzLmNvbnRleHQ9bWkuZ2V0Q29udGV4dCgpO3RoaXMuZ2Fpbj10aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpO3RoaXMuZ2Fpbi5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7dGhpcy5maWx0ZXI9bnVsbDt0aGlzLnRpbWVEZWx0YT0wO3RoaXMuX2Nsb2NrPW5ldyBraX1mdW5jdGlvbiBXZShhKXtBLmNhbGwodGhpcyk7dGhpcy50eXBlPSJBdWRpbyI7dGhpcy5saXN0ZW5lcj1hO3RoaXMuY29udGV4dD1hLmNvbnRleHQ7dGhpcy5nYWluPXRoaXMuY29udGV4dC5jcmVhdGVHYWluKCk7dGhpcy5nYWluLmNvbm5lY3QoYS5nZXRJbnB1dCgpKTt0aGlzLmF1dG9wbGF5PSExO3RoaXMuYnVmZmVyPW51bGw7dGhpcy5kZXR1bmU9MDt0aGlzLmxvb3A9ITE7dGhpcy5vZmZzZXQ9dGhpcy5zdGFydFRpbWU9MDt0aGlzLmR1cmF0aW9uPXZvaWQgMDt0aGlzLnBsYXliYWNrUmF0ZT0xO3RoaXMuaXNQbGF5aW5nPSExO3RoaXMuaGFzUGxheWJhY2tDb250cm9sPSEwO3RoaXMuc291cmNlVHlwZT0KImVtcHR5Ijt0aGlzLmZpbHRlcnM9W119ZnVuY3Rpb24gbmkoYSl7V2UuY2FsbCh0aGlzLGEpO3RoaXMucGFubmVyPXRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTt0aGlzLnBhbm5lci5wYW5uaW5nTW9kZWw9IkhSVEYiO3RoaXMucGFubmVyLmNvbm5lY3QodGhpcy5nYWluKX1mdW5jdGlvbiBvaShhLGMpe3RoaXMuYW5hbHlzZXI9YS5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7dGhpcy5hbmFseXNlci5mZnRTaXplPXZvaWQgMCE9PWM/YzoyMDQ4O3RoaXMuZGF0YT1uZXcgVWludDhBcnJheSh0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50KTthLmdldE91dHB1dCgpLmNvbm5lY3QodGhpcy5hbmFseXNlcil9ZnVuY3Rpb24gcGkoYSxjLGUpe3RoaXMuYmluZGluZz1hO3RoaXMudmFsdWVTaXplPWU7YT1GbG9hdDY0QXJyYXk7c3dpdGNoKGMpe2Nhc2UgInF1YXRlcm5pb24iOmM9dGhpcy5fc2xlcnA7YnJlYWs7Y2FzZSAic3RyaW5nIjpjYXNlICJib29sIjphPUFycmF5O2M9CnRoaXMuX3NlbGVjdDticmVhaztkZWZhdWx0OmM9dGhpcy5fbGVycH10aGlzLmJ1ZmZlcj1uZXcgYSg0KmUpO3RoaXMuX21peEJ1ZmZlclJlZ2lvbj1jO3RoaXMucmVmZXJlbmNlQ291bnQ9dGhpcy51c2VDb3VudD10aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MH1mdW5jdGlvbiBSaihhLGMsZSl7ZT1lfHwkYi5wYXJzZVRyYWNrTmFtZShjKTt0aGlzLl90YXJnZXRHcm91cD1hO3RoaXMuX2JpbmRpbmdzPWEuc3Vic2NyaWJlXyhjLGUpfWZ1bmN0aW9uICRiKGEsYyxlKXt0aGlzLnBhdGg9Yzt0aGlzLnBhcnNlZFBhdGg9ZXx8JGIucGFyc2VUcmFja05hbWUoYyk7dGhpcy5ub2RlPSRiLmZpbmROb2RlKGEsdGhpcy5wYXJzZWRQYXRoLm5vZGVOYW1lKXx8YTt0aGlzLnJvb3ROb2RlPWF9ZnVuY3Rpb24gU2ooKXt0aGlzLnV1aWQ9aGIuZ2VuZXJhdGVVVUlEKCk7dGhpcy5fb2JqZWN0cz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpO3RoaXMubkNhY2hlZE9iamVjdHNfPTA7dmFyIGE9Cnt9O3RoaXMuX2luZGljZXNCeVVVSUQ9YTtmb3IodmFyIGM9MCxlPWFyZ3VtZW50cy5sZW5ndGg7YyE9PWU7KytjKWFbYXJndW1lbnRzW2NdLnV1aWRdPWM7dGhpcy5fcGF0aHM9W107dGhpcy5fcGFyc2VkUGF0aHM9W107dGhpcy5fYmluZGluZ3M9W107dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoPXt9O3ZhciBnPXRoaXM7dGhpcy5zdGF0cz17b2JqZWN0czp7Z2V0IHRvdGFsKCl7cmV0dXJuIGcuX29iamVjdHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gdGhpcy50b3RhbC1nLm5DYWNoZWRPYmplY3RzX319LGdldCBiaW5kaW5nc1Blck9iamVjdCgpe3JldHVybiBnLl9iaW5kaW5ncy5sZW5ndGh9fX1mdW5jdGlvbiBUaihhLGMsZSl7dGhpcy5fbWl4ZXI9YTt0aGlzLl9jbGlwPWM7dGhpcy5fbG9jYWxSb290PWV8fG51bGw7YT1jLnRyYWNrcztjPWEubGVuZ3RoO2U9QXJyYXkoYyk7Zm9yKHZhciBnPXtlbmRpbmdTdGFydDoyNDAwLGVuZGluZ0VuZDoyNDAwfSxyPTA7ciE9PQpjOysrcil7dmFyIHY9YVtyXS5jcmVhdGVJbnRlcnBvbGFudChudWxsKTtlW3JdPXY7di5zZXR0aW5ncz1nfXRoaXMuX2ludGVycG9sYW50U2V0dGluZ3M9Zzt0aGlzLl9pbnRlcnBvbGFudHM9ZTt0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzPUFycmF5KGMpO3RoaXMuX3dlaWdodEludGVycG9sYW50PXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50PXRoaXMuX2J5Q2xpcENhY2hlSW5kZXg9dGhpcy5fY2FjaGVJbmRleD1udWxsO3RoaXMubG9vcD0yMjAxO3RoaXMuX2xvb3BDb3VudD0tMTt0aGlzLl9zdGFydFRpbWU9bnVsbDt0aGlzLnRpbWU9MDt0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9dGhpcy53ZWlnaHQ9dGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPXRoaXMudGltZVNjYWxlPTE7dGhpcy5yZXBldGl0aW9ucz1JbmZpbml0eTt0aGlzLnBhdXNlZD0hMTt0aGlzLmVuYWJsZWQ9ITA7dGhpcy5jbGFtcFdoZW5GaW5pc2hlZD0hMTt0aGlzLnplcm9TbG9wZUF0RW5kPXRoaXMuemVyb1Nsb3BlQXRTdGFydD0KITB9ZnVuY3Rpb24gcWkoYSl7dGhpcy5fcm9vdD1hO3RoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7dGhpcy50aW1lPXRoaXMuX2FjY3VJbmRleD0wO3RoaXMudGltZVNjYWxlPTF9ZnVuY3Rpb24gYmgoYSxjKXsic3RyaW5nIj09PXR5cGVvZiBhJiYoY29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiBUeXBlIHBhcmFtZXRlciBpcyBubyBsb25nZXIgbmVlZGVkLiIpLGE9Yyk7dGhpcy52YWx1ZT1hfWZ1bmN0aW9uIHJpKGEsYyxlKXtRZC5jYWxsKHRoaXMsYSxjKTt0aGlzLm1lc2hQZXJBdHRyaWJ1dGU9ZXx8MX1mdW5jdGlvbiBVaihhLGMsZSxnKXt0aGlzLnJheT1uZXcgRChhLGMpO3RoaXMubmVhcj1lfHwwO3RoaXMuZmFyPWd8fEluZmluaXR5O3RoaXMuY2FtZXJhPW51bGw7dGhpcy5wYXJhbXM9e01lc2g6e30sTGluZTp7fSxMT0Q6e30sUG9pbnRzOnt0aHJlc2hvbGQ6MX0sU3ByaXRlOnt9fTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh0aGlzLnBhcmFtcyx7UG9pbnRDbG91ZDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5SYXljYXN0ZXI6IHBhcmFtcy5Qb2ludENsb3VkIGhhcyBiZWVuIHJlbmFtZWQgdG8gcGFyYW1zLlBvaW50cy4iKTsKcmV0dXJuIHRoaXMuUG9pbnRzfX19KX1mdW5jdGlvbiBWaihhLGMpe3JldHVybiBhLmRpc3RhbmNlLWMuZGlzdGFuY2V9ZnVuY3Rpb24gc2koYSxjLGUsZyl7aWYoITEhPT1hLnZpc2libGUmJihhLnJheWNhc3QoYyxlKSwhMD09PWcpKXthPWEuY2hpbGRyZW47Zz0wO2Zvcih2YXIgcj1hLmxlbmd0aDtnPHI7ZysrKXNpKGFbZ10sYyxlLCEwKX19ZnVuY3Rpb24gV2ooYSxjLGUpe3RoaXMucmFkaXVzPXZvaWQgMCE9PWE/YToxO3RoaXMucGhpPXZvaWQgMCE9PWM/YzowO3RoaXMudGhldGE9dm9pZCAwIT09ZT9lOjA7cmV0dXJuIHRoaXN9ZnVuY3Rpb24gWGooYSxjLGUpe3RoaXMucmFkaXVzPXZvaWQgMCE9PWE/YToxO3RoaXMudGhldGE9dm9pZCAwIT09Yz9jOjA7dGhpcy55PXZvaWQgMCE9PWU/ZTowO3JldHVybiB0aGlzfWZ1bmN0aW9uIHRpKGEsYyl7dGhpcy5taW49dm9pZCAwIT09YT9hOm5ldyBmKEluZmluaXR5LEluZmluaXR5KTt0aGlzLm1heD12b2lkIDAhPT1jP2M6bmV3IGYoLUluZmluaXR5LAotSW5maW5pdHkpfWZ1bmN0aW9uIHVpKGEsYyl7dGhpcy5zdGFydD12b2lkIDAhPT1hP2E6bmV3IGs7dGhpcy5lbmQ9dm9pZCAwIT09Yz9jOm5ldyBrfWZ1bmN0aW9uIGNnKGEpe0EuY2FsbCh0aGlzKTt0aGlzLm1hdGVyaWFsPWE7dGhpcy5yZW5kZXI9ZnVuY3Rpb24oKXt9fWZ1bmN0aW9uIGRnKGEsYyxlLGcpe3RoaXMub2JqZWN0PWE7dGhpcy5zaXplPXZvaWQgMCE9PWM/YzoxO2E9dm9pZCAwIT09ZT9lOjE2NzExNjgwO2c9dm9pZCAwIT09Zz9nOjE7Yz0wOyhlPXRoaXMub2JqZWN0Lmdlb21ldHJ5KSYmZS5pc0dlb21ldHJ5P2M9MyplLmZhY2VzLmxlbmd0aDplJiZlLmlzQnVmZmVyR2VvbWV0cnkmJihjPWUuYXR0cmlidXRlcy5ub3JtYWwuY291bnQpO2U9bmV3IHZhO2M9bmV3IGNhKDYqYywzKTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLGMpO0liLmNhbGwodGhpcyxlLG5ldyBGYih7Y29sb3I6YSxsaW5ld2lkdGg6Z30pKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX0KZnVuY3Rpb24gWGUoYSxjKXtBLmNhbGwodGhpcyk7dGhpcy5saWdodD1hO3RoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTt0aGlzLm1hdHJpeD1hLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmNvbG9yPWM7YT1uZXcgdmE7Yz1bMCwwLDAsMCwwLDEsMCwwLDAsMSwwLDEsMCwwLDAsLTEsMCwxLDAsMCwwLDAsMSwxLDAsMCwwLDAsLTEsMV07Zm9yKHZhciBlPTAsZz0xOzMyPmU7ZSsrLGcrKyl7dmFyIHI9ZS8zMipNYXRoLlBJKjIsdj1nLzMyKk1hdGguUEkqMjtjLnB1c2goTWF0aC5jb3MociksTWF0aC5zaW4ociksMSxNYXRoLmNvcyh2KSxNYXRoLnNpbih2KSwxKX1hLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShjLDMpKTtjPW5ldyBGYih7Zm9nOiExfSk7dGhpcy5jb25lPW5ldyBJYihhLGMpO3RoaXMuYWRkKHRoaXMuY29uZSk7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBZaihhKXt2YXIgYz1bXTthJiZhLmlzQm9uZSYmYy5wdXNoKGEpOwpmb3IodmFyIGU9MDtlPGEuY2hpbGRyZW4ubGVuZ3RoO2UrKyljLnB1c2guYXBwbHkoYyxZaihhLmNoaWxkcmVuW2VdKSk7cmV0dXJuIGN9ZnVuY3Rpb24gWWUoYSl7Zm9yKHZhciBjPVlqKGEpLGU9bmV3IHZhLGc9W10scj1bXSx2PW5ldyBJKDAsMCwxKSx6PW5ldyBJKDAsMSwwKSxFPTA7RTxjLmxlbmd0aDtFKyspe3ZhciBGPWNbRV07Ri5wYXJlbnQmJkYucGFyZW50LmlzQm9uZSYmKGcucHVzaCgwLDAsMCksZy5wdXNoKDAsMCwwKSxyLnB1c2godi5yLHYuZyx2LmIpLHIucHVzaCh6LnIsei5nLHouYikpfWUuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKGcsMykpO2UuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGNhKHIsMykpO2c9bmV3IEZiKHt2ZXJ0ZXhDb2xvcnM6MixkZXB0aFRlc3Q6ITEsZGVwdGhXcml0ZTohMSx0cmFuc3BhcmVudDohMH0pO0liLmNhbGwodGhpcyxlLGcpO3RoaXMucm9vdD1hO3RoaXMuYm9uZXM9Yzt0aGlzLm1hdHJpeD1hLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0KITF9ZnVuY3Rpb24gWmUoYSxjLGUpe3RoaXMubGlnaHQ9YTt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dGhpcy5jb2xvcj1lO2E9bmV3IEJkKGMsNCwyKTtjPW5ldyBMKHt3aXJlZnJhbWU6ITAsZm9nOiExfSk7eGEuY2FsbCh0aGlzLGEsYyk7dGhpcy5tYXRyaXg9dGhpcy5saWdodC5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiAkZShhLGMpe3RoaXMudHlwZT0iUmVjdEFyZWFMaWdodEhlbHBlciI7dGhpcy5saWdodD1hO3RoaXMuY29sb3I9YzthPW5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbMSwxLDAsLTEsMSwwLC0xLC0xLDAsMSwtMSwwLDEsMSwwXSwzKSk7YS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtjPW5ldyBGYih7Zm9nOiExfSk7VmIuY2FsbCh0aGlzLGEsYyk7YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWzEsMSwwLC0xLDEsMCwtMSwtMSwwLAoxLDEsMCwtMSwtMSwwLDEsLTEsMF0sMykpO2EuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7dGhpcy5hZGQobmV3IHhhKGEsbmV3IEwoe3NpZGU6MSxmb2c6ITF9KSkpO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gYWYoYSxjLGUpe0EuY2FsbCh0aGlzKTt0aGlzLmxpZ2h0PWE7dGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpO3RoaXMubWF0cml4PWEubWF0cml4V29ybGQ7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuY29sb3I9ZTthPW5ldyBSZChjKTthLnJvdGF0ZVkoLjUqTWF0aC5QSSk7dGhpcy5tYXRlcmlhbD1uZXcgTCh7d2lyZWZyYW1lOiEwLGZvZzohMX0pO3ZvaWQgMD09PXRoaXMuY29sb3ImJih0aGlzLm1hdGVyaWFsLnZlcnRleENvbG9ycz0yKTtjPWEuZ2V0QXR0cmlidXRlKCJwb3NpdGlvbiIpO2EuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IFEobmV3IEZsb2F0MzJBcnJheSgzKmMuY291bnQpLDMpKTt0aGlzLmFkZChuZXcgeGEoYSx0aGlzLm1hdGVyaWFsKSk7CnRoaXMudXBkYXRlKCl9ZnVuY3Rpb24gYmYoYSxjKXt0aGlzLmxpZ2h0UHJvYmU9YTt0aGlzLnNpemU9YzthPW5ldyBxYih7ZGVmaW5lczp7R0FNTUFfT1VUUFVUOiIifSx1bmlmb3Jtczp7c2g6e3ZhbHVlOnRoaXMubGlnaHRQcm9iZS5zaC5jb2VmZmljaWVudHN9LGludGVuc2l0eTp7dmFsdWU6dGhpcy5saWdodFByb2JlLmludGVuc2l0eX19LHZlcnRleFNoYWRlcjoidmFyeWluZyB2ZWMzIHZOb3JtYWw7XG52b2lkIG1haW4oKSB7XG5cdHZOb3JtYWwgXHgzZCBub3JtYWxpemUoIG5vcm1hbE1hdHJpeCAqIG5vcm1hbCApO1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCBwb3NpdGlvbiwgMS4wICk7XG59IixmcmFnbWVudFNoYWRlcjoiI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2XG52ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgbm9ybWFsLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0Ly8gbWF0cml4IGlzIGFzc3VtZWQgdG8gYmUgb3J0aG9nb25hbFxuXHRyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIG5vcm1hbCwgMC4wICkgKiBtYXRyaXggKS54eXogKTtcbn1cbnZlYzMgbGluZWFyVG9PdXRwdXQoIGluIHZlYzMgYSApIHtcblx0I2lmZGVmIEdBTU1BX09VVFBVVFxuXHRcdHJldHVybiBwb3coIGEsIHZlYzMoIDEuMCAvIGZsb2F0KCBHQU1NQV9GQUNUT1IgKSApICk7XG5cdCNlbHNlXG5cdFx0cmV0dXJuIGE7XG5cdCNlbmRpZlxufVxuLy8gc291cmNlOiBodHRwczovL2dyYXBoaWNzLnN0YW5mb3JkLmVkdS9wYXBlcnMvZW52bWFwL2Vudm1hcC5wZGZcbnZlYzMgc2hHZXRJcnJhZGlhbmNlQXQoIGluIHZlYzMgbm9ybWFsLCBpbiB2ZWMzIHNoQ29lZmZpY2llbnRzWyA5IF0gKSB7XG5cdC8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGhcblx0ZmxvYXQgeCBceDNkIG5vcm1hbC54LCB5IFx4M2Qgbm9ybWFsLnksIHogXHgzZCBub3JtYWwuejtcblx0Ly8gYmFuZCAwXG5cdHZlYzMgcmVzdWx0IFx4M2Qgc2hDb2VmZmljaWVudHNbIDAgXSAqIDAuODg2MjI3O1xuXHQvLyBiYW5kIDFcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAxIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcblx0Ly8gYmFuZCAyXG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNCBdICogMi4wICogMC40MjkwNDMgKiB4ICogeTtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA1IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHkgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDYgXSAqICggMC43NDMxMjUgKiB6ICogeiAtIDAuMjQ3NzA4ICk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNyBdICogMi4wICogMC40MjkwNDMgKiB4ICogejtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA4IF0gKiAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApO1xuXHRyZXR1cm4gcmVzdWx0O1xufVxudW5pZm9ybSB2ZWMzIHNoWyA5IF07IC8vIHNoIGNvZWZmaWNpZW50c1xudW5pZm9ybSBmbG9hdCBpbnRlbnNpdHk7IC8vIGxpZ2h0IHByb2JlIGludGVuc2l0eVxudmFyeWluZyB2ZWMzIHZOb3JtYWw7XG52b2lkIG1haW4oKSB7XG5cdHZlYzMgbm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2Tm9ybWFsICk7XG5cdHZlYzMgd29ybGROb3JtYWwgXHgzZCBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBub3JtYWwsIHZpZXdNYXRyaXggKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2Qgc2hHZXRJcnJhZGlhbmNlQXQoIHdvcmxkTm9ybWFsLCBzaCApO1xuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCBSRUNJUFJPQ0FMX1BJICogaXJyYWRpYW5jZSAqIGludGVuc2l0eTtcblx0b3V0Z29pbmdMaWdodCBceDNkIGxpbmVhclRvT3V0cHV0KCBvdXRnb2luZ0xpZ2h0ICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIG91dGdvaW5nTGlnaHQsIDEuMCApO1xufSJ9KTsKYz1uZXcgQmQoMSwzMiwxNik7eGEuY2FsbCh0aGlzLGMsYSk7dGhpcy5vbkJlZm9yZVJlbmRlcigpfWZ1bmN0aW9uIGNoKGEsYyxlLGcpe2E9YXx8MTA7Yz1jfHwxMDtlPW5ldyBJKHZvaWQgMCE9PWU/ZTo0NDczOTI0KTtnPW5ldyBJKHZvaWQgMCE9PWc/Zzo4OTQ3ODQ4KTt2YXIgcj1jLzIsdj1hL2Msej1hLzI7YT1bXTtmb3IodmFyIEU9W10sRj0wLEo9MCxQPS16O0Y8PWM7RisrLFArPXYpe2EucHVzaCgteiwwLFAseiwwLFApO2EucHVzaChQLDAsLXosUCwwLHopO3ZhciBSPUY9PT1yP2U6ZztSLnRvQXJyYXkoRSxKKTtKKz0zO1IudG9BcnJheShFLEopO0orPTM7Ui50b0FycmF5KEUsSik7Sis9MztSLnRvQXJyYXkoRSxKKTtKKz0zfWM9bmV3IHZhO2MuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKGEsMykpO2MuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGNhKEUsMykpO2U9bmV3IEZiKHt2ZXJ0ZXhDb2xvcnM6Mn0pO0liLmNhbGwodGhpcyxjLGUpfWZ1bmN0aW9uIGRoKGEsCmMsZSxnLHIsdil7YT1hfHwxMDtjPWN8fDE2O2U9ZXx8ODtnPWd8fDY0O3I9bmV3IEkodm9pZCAwIT09cj9yOjQ0NzM5MjQpO3Y9bmV3IEkodm9pZCAwIT09dj92Ojg5NDc4NDgpO3ZhciB6PVtdLEU9W10sRjtmb3IoRj0wO0Y8PWM7RisrKXt2YXIgSj1GL2MqMipNYXRoLlBJO3ZhciBQPU1hdGguc2luKEopKmE7Sj1NYXRoLmNvcyhKKSphO3oucHVzaCgwLDAsMCk7ei5wdXNoKFAsMCxKKTt2YXIgUj1GJjE/cjp2O0UucHVzaChSLnIsUi5nLFIuYik7RS5wdXNoKFIucixSLmcsUi5iKX1mb3IoRj0wO0Y8PWU7RisrKXtSPUYmMT9yOnY7dmFyIFM9YS1hL2UqRjtmb3IoYz0wO2M8ZztjKyspSj1jL2cqMipNYXRoLlBJLFA9TWF0aC5zaW4oSikqUyxKPU1hdGguY29zKEopKlMsei5wdXNoKFAsMCxKKSxFLnB1c2goUi5yLFIuZyxSLmIpLEo9KGMrMSkvZyoyKk1hdGguUEksUD1NYXRoLnNpbihKKSpTLEo9TWF0aC5jb3MoSikqUyx6LnB1c2goUCwwLEopLEUucHVzaChSLnIsUi5nLFIuYil9YT0KbmV3IHZhO2EuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IGNhKHosMykpO2EuYWRkQXR0cmlidXRlKCJjb2xvciIsbmV3IGNhKEUsMykpO3o9bmV3IEZiKHt2ZXJ0ZXhDb2xvcnM6Mn0pO0liLmNhbGwodGhpcyxhLHopfWZ1bmN0aW9uIGNmKGEsYyxlLGcpe3RoaXMuYXVkaW89YTt0aGlzLnJhbmdlPWN8fDE7dGhpcy5kaXZpc2lvbnNJbm5lckFuZ2xlPWV8fDE2O3RoaXMuZGl2aXNpb25zT3V0ZXJBbmdsZT1nfHwyO2E9bmV3IHZhO2EuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsbmV3IFEobmV3IEZsb2F0MzJBcnJheSgzKigzKih0aGlzLmRpdmlzaW9uc0lubmVyQW5nbGUrMip0aGlzLmRpdmlzaW9uc091dGVyQW5nbGUpKzMpKSwzKSk7Yz1uZXcgRmIoe2NvbG9yOjY1MjgwfSk7ZT1uZXcgRmIoe2NvbG9yOjE2Nzc2OTYwfSk7VmIuY2FsbCh0aGlzLGEsW2UsY10pO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gZWcoYSxjLGUsZyl7dGhpcy5vYmplY3Q9YTt0aGlzLnNpemU9dm9pZCAwIT09CmM/YzoxO2E9dm9pZCAwIT09ZT9lOjE2Nzc2OTYwO2c9dm9pZCAwIT09Zz9nOjE7Yz0wOyhlPXRoaXMub2JqZWN0Lmdlb21ldHJ5KSYmZS5pc0dlb21ldHJ5P2M9ZS5mYWNlcy5sZW5ndGg6Y29uc29sZS53YXJuKCJUSFJFRS5GYWNlTm9ybWFsc0hlbHBlcjogb25seSBUSFJFRS5HZW9tZXRyeSBpcyBzdXBwb3J0ZWQuIFVzZSBUSFJFRS5WZXJ0ZXhOb3JtYWxzSGVscGVyLCBpbnN0ZWFkLiIpO2U9bmV3IHZhO2M9bmV3IGNhKDYqYywzKTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLGMpO0liLmNhbGwodGhpcyxlLG5ldyBGYih7Y29sb3I6YSxsaW5ld2lkdGg6Z30pKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBkZihhLGMsZSl7QS5jYWxsKHRoaXMpO3RoaXMubGlnaHQ9YTt0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7dGhpcy5tYXRyaXg9YS5tYXRyaXhXb3JsZDt0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITE7dGhpcy5jb2xvcj1lOwp2b2lkIDA9PT1jJiYoYz0xKTthPW5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbLWMsYywwLGMsYywwLGMsLWMsMCwtYywtYywwLC1jLGMsMF0sMykpO2M9bmV3IEZiKHtmb2c6ITF9KTt0aGlzLmxpZ2h0UGxhbmU9bmV3IFZiKGEsYyk7dGhpcy5hZGQodGhpcy5saWdodFBsYW5lKTthPW5ldyB2YTthLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbMCwwLDAsMCwwLDFdLDMpKTt0aGlzLnRhcmdldExpbmU9bmV3IFZiKGEsYyk7dGhpcy5hZGQodGhpcy50YXJnZXRMaW5lKTt0aGlzLnVwZGF0ZSgpfWZ1bmN0aW9uIGZnKGEpe2Z1bmN0aW9uIGMoVixXLGhhKXtlKFYsaGEpO2UoVyxoYSl9ZnVuY3Rpb24gZShWLFcpe3YucHVzaCgwLDAsMCk7ei5wdXNoKFcucixXLmcsVy5iKTt2b2lkIDA9PT1FW1ZdJiYoRVtWXT1bXSk7RVtWXS5wdXNoKHYubGVuZ3RoLzMtMSl9dmFyIGc9bmV3IHZhLHI9bmV3IEZiKHtjb2xvcjoxNjc3NzIxNSx2ZXJ0ZXhDb2xvcnM6MX0pLAp2PVtdLHo9W10sRT17fSxGPW5ldyBJKDE2NzU1MjAwKSxKPW5ldyBJKDE2NzExNjgwKSxQPW5ldyBJKDQzNzc1KSxSPW5ldyBJKDE2Nzc3MjE1KSxTPW5ldyBJKDMzNTU0NDMpO2MoIm4xIiwibjIiLEYpO2MoIm4yIiwibjQiLEYpO2MoIm40IiwibjMiLEYpO2MoIm4zIiwibjEiLEYpO2MoImYxIiwiZjIiLEYpO2MoImYyIiwiZjQiLEYpO2MoImY0IiwiZjMiLEYpO2MoImYzIiwiZjEiLEYpO2MoIm4xIiwiZjEiLEYpO2MoIm4yIiwiZjIiLEYpO2MoIm4zIiwiZjMiLEYpO2MoIm40IiwiZjQiLEYpO2MoInAiLCJuMSIsSik7YygicCIsIm4yIixKKTtjKCJwIiwibjMiLEopO2MoInAiLCJuNCIsSik7YygidTEiLCJ1MiIsUCk7YygidTIiLCJ1MyIsUCk7YygidTMiLCJ1MSIsUCk7YygiYyIsInQiLFIpO2MoInAiLCJjIixTKTtjKCJjbjEiLCJjbjIiLFMpO2MoImNuMyIsImNuNCIsUyk7YygiY2YxIiwiY2YyIixTKTtjKCJjZjMiLCJjZjQiLFMpO2cuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsCm5ldyBjYSh2LDMpKTtnLmFkZEF0dHJpYnV0ZSgiY29sb3IiLG5ldyBjYSh6LDMpKTtJYi5jYWxsKHRoaXMsZyxyKTt0aGlzLmNhbWVyYT1hO3RoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgmJnRoaXMuY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTt0aGlzLm1hdHJpeD1hLm1hdHJpeFdvcmxkO3RoaXMubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLnBvaW50TWFwPUU7dGhpcy51cGRhdGUoKX1mdW5jdGlvbiBQYihhLGMsZSxnLHIsdix6KXtlaC5zZXQocix2LHopLnVucHJvamVjdChnKTthPWNbYV07aWYodm9pZCAwIT09YSlmb3IoZT1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKSxjPTAsZz1hLmxlbmd0aDtjPGc7YysrKWUuc2V0WFlaKGFbY10sZWgueCxlaC55LGVoLnopfWZ1bmN0aW9uIGhkKGEsYyl7dGhpcy5vYmplY3Q9YTt2b2lkIDA9PT1jJiYoYz0xNjc3Njk2MCk7YT1uZXcgVWludDE2QXJyYXkoWzAsMSwxLDIsMiwzLDMsMCw0LDUsNSw2LDYsNyw3LAo0LDAsNCwxLDUsMiw2LDMsN10pO3ZhciBlPW5ldyBGbG9hdDMyQXJyYXkoMjQpLGc9bmV3IHZhO2cuc2V0SW5kZXgobmV3IFEoYSwxKSk7Zy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgUShlLDMpKTtJYi5jYWxsKHRoaXMsZyxuZXcgRmIoe2NvbG9yOmN9KSk7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMudXBkYXRlKCl9ZnVuY3Rpb24gZ2coYSxjKXt0aGlzLnR5cGU9IkJveDNIZWxwZXIiO3RoaXMuYm94PWE7Yz1jfHwxNjc3Njk2MDthPW5ldyBVaW50MTZBcnJheShbMCwxLDEsMiwyLDMsMywwLDQsNSw1LDYsNiw3LDcsNCwwLDQsMSw1LDIsNiwzLDddKTt2YXIgZT1uZXcgdmE7ZS5zZXRJbmRleChuZXcgUShhLDEpKTtlLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwtMSwxLDEsMSwtMSwtMSwxLC0xLC0xLC0xLC0xLDEsLTEsLTFdLDMpKTtJYi5jYWxsKHRoaXMsZSxuZXcgRmIoe2NvbG9yOmN9KSk7dGhpcy5nZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKX0KZnVuY3Rpb24gaGcoYSxjLGUpe3RoaXMudHlwZT0iUGxhbmVIZWxwZXIiO3RoaXMucGxhbmU9YTt0aGlzLnNpemU9dm9pZCAwPT09Yz8xOmM7YT12b2lkIDAhPT1lP2U6MTY3NzY5NjA7Yz1uZXcgdmE7Yy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWzEsLTEsMSwtMSwxLDEsLTEsLTEsMSwxLDEsMSwtMSwxLDEsLTEsLTEsMSwxLC0xLDEsMSwxLDEsMCwwLDEsMCwwLDBdLDMpKTtjLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO1ZiLmNhbGwodGhpcyxjLG5ldyBGYih7Y29sb3I6YX0pKTtjPW5ldyB2YTtjLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBjYShbMSwxLDEsLTEsMSwxLC0xLC0xLDEsMSwxLDEsLTEsLTEsMSwxLC0xLDFdLDMpKTtjLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3RoaXMuYWRkKG5ldyB4YShjLG5ldyBMKHtjb2xvcjphLG9wYWNpdHk6LjIsdHJhbnNwYXJlbnQ6ITAsZGVwdGhXcml0ZTohMX0pKSl9ZnVuY3Rpb24gaWQoYSxjLGUsZyxyLHYpe0EuY2FsbCh0aGlzKTsKdm9pZCAwPT09YSYmKGE9bmV3IGsoMCwwLDEpKTt2b2lkIDA9PT1jJiYoYz1uZXcgaygwLDAsMCkpO3ZvaWQgMD09PWUmJihlPTEpO3ZvaWQgMD09PWcmJihnPTE2Nzc2OTYwKTt2b2lkIDA9PT1yJiYocj0uMiplKTt2b2lkIDA9PT12JiYodj0uMipyKTt2b2lkIDA9PT1maCYmKGZoPW5ldyB2YSxmaC5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoWzAsMCwwLDAsMSwwXSwzKSksdmk9bmV3IGZkKDAsLjUsMSw1LDEpLHZpLnRyYW5zbGF0ZSgwLC0uNSwwKSk7dGhpcy5wb3NpdGlvbi5jb3B5KGMpO3RoaXMubGluZT1uZXcgVmIoZmgsbmV3IEZiKHtjb2xvcjpnfSkpO3RoaXMubGluZS5tYXRyaXhBdXRvVXBkYXRlPSExO3RoaXMuYWRkKHRoaXMubGluZSk7dGhpcy5jb25lPW5ldyB4YSh2aSxuZXcgTCh7Y29sb3I6Z30pKTt0aGlzLmNvbmUubWF0cml4QXV0b1VwZGF0ZT0hMTt0aGlzLmFkZCh0aGlzLmNvbmUpO3RoaXMuc2V0RGlyZWN0aW9uKGEpO3RoaXMuc2V0TGVuZ3RoKGUsCnIsdil9ZnVuY3Rpb24gaWcoYSl7YT1hfHwxO3ZhciBjPVswLDAsMCxhLDAsMCwwLDAsMCwwLGEsMCwwLDAsMCwwLDAsYV07YT1uZXcgdmE7YS5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoYywzKSk7YS5hZGRBdHRyaWJ1dGUoImNvbG9yIixuZXcgY2EoWzEsMCwwLDEsLjYsMCwwLDEsMCwuNiwxLDAsMCwwLDEsMCwuNiwxXSwzKSk7Yz1uZXcgRmIoe3ZlcnRleENvbG9yczoyfSk7SWIuY2FsbCh0aGlzLGEsYyl9ZnVuY3Rpb24gWmooYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DbG9zZWRTcGxpbmVDdXJ2ZTMgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkNhdG11bGxSb21DdXJ2ZTMgaW5zdGVhZC4iKTtaYi5jYWxsKHRoaXMsYSk7dGhpcy50eXBlPSJjYXRtdWxscm9tIjt0aGlzLmNsb3NlZD0hMH1mdW5jdGlvbiBhayhhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNwbGluZUN1cnZlMyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLiIpOwpaYi5jYWxsKHRoaXMsYSk7dGhpcy50eXBlPSJjYXRtdWxscm9tIn1mdW5jdGlvbiB3aShhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNwbGluZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLiIpO1piLmNhbGwodGhpcyxhKTt0aGlzLnR5cGU9ImNhdG11bGxyb20ifXZvaWQgMD09PU51bWJlci5FUFNJTE9OJiYoTnVtYmVyLkVQU0lMT049TWF0aC5wb3coMiwtNTIpKTt2b2lkIDA9PT1OdW1iZXIuaXNJbnRlZ2VyJiYoTnVtYmVyLmlzSW50ZWdlcj1mdW5jdGlvbihhKXtyZXR1cm4ibnVtYmVyIj09PXR5cGVvZiBhJiZpc0Zpbml0ZShhKSYmTWF0aC5mbG9vcihhKT09PWF9KTt2b2lkIDA9PT1NYXRoLnNpZ24mJihNYXRoLnNpZ249ZnVuY3Rpb24oYSl7cmV0dXJuIDA+YT8tMTowPGE/MTorYX0pOyExPT09Im5hbWUiaW4gRnVuY3Rpb24ucHJvdG90eXBlJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoRnVuY3Rpb24ucHJvdG90eXBlLCJuYW1lIiwKe2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRvU3RyaW5nKCkubWF0Y2goL15ccypmdW5jdGlvblxzKihbXlwoXHNdKikvKVsxXX19KTt2b2lkIDA9PT1PYmplY3QuYXNzaWduJiYoT2JqZWN0LmFzc2lnbj1mdW5jdGlvbihhKXtpZih2b2lkIDA9PT1hfHxudWxsPT09YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3QgY29udmVydCB1bmRlZmluZWQgb3IgbnVsbCB0byBvYmplY3QiKTtmb3IodmFyIGM9T2JqZWN0KGEpLGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXt2YXIgZz1hcmd1bWVudHNbZV07aWYodm9pZCAwIT09ZyYmbnVsbCE9PWcpZm9yKHZhciByIGluIGcpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGcscikmJihjW3JdPWdbcl0pfXJldHVybiBjfSk7T2JqZWN0LmFzc2lnbihkLnByb3RvdHlwZSx7YWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PXRoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycz17fSk7dmFyIGU9CnRoaXMuX2xpc3RlbmVyczt2b2lkIDA9PT1lW2FdJiYoZVthXT1bXSk7LTE9PT1lW2FdLmluZGV4T2YoYykmJmVbYV0ucHVzaChjKX0saGFzRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMD09PXRoaXMuX2xpc3RlbmVycylyZXR1cm4hMTt2YXIgZT10aGlzLl9saXN0ZW5lcnM7cmV0dXJuIHZvaWQgMCE9PWVbYV0mJi0xIT09ZVthXS5pbmRleE9mKGMpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYyl7dm9pZCAwIT09dGhpcy5fbGlzdGVuZXJzJiYoYT10aGlzLl9saXN0ZW5lcnNbYV0sdm9pZCAwIT09YSYmKGM9YS5pbmRleE9mKGMpLC0xIT09YyYmYS5zcGxpY2UoYywxKSkpfSxkaXNwYXRjaEV2ZW50OmZ1bmN0aW9uKGEpe2lmKHZvaWQgMCE9PXRoaXMuX2xpc3RlbmVycyl7dmFyIGM9dGhpcy5fbGlzdGVuZXJzW2EudHlwZV07aWYodm9pZCAwIT09Yyl7YS50YXJnZXQ9dGhpcztjPWMuc2xpY2UoMCk7Zm9yKHZhciBlPTAsZz1jLmxlbmd0aDtlPGc7ZSsrKWNbZV0uY2FsbCh0aGlzLAphKX19fX0pO2Zvcih2YXIgWWI9W10samc9MDsyNTY+amc7amcrKylZYltqZ109KDE2PmpnPyIwIjoiIikramcudG9TdHJpbmcoMTYpO3ZhciBoYj17REVHMlJBRDpNYXRoLlBJLzE4MCxSQUQyREVHOjE4MC9NYXRoLlBJLGdlbmVyYXRlVVVJRDpmdW5jdGlvbigpe3ZhciBhPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLGM9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsZT00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxnPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwO3JldHVybihZYlthJjI1NV0rWWJbYT4+OCYyNTVdK1liW2E+PjE2JjI1NV0rWWJbYT4+MjQmMjU1XSsiLSIrWWJbYyYyNTVdK1liW2M+PjgmMjU1XSsiLSIrWWJbYz4+MTYmMTV8NjRdK1liW2M+PjI0JjI1NV0rIi0iK1liW2UmNjN8MTI4XStZYltlPj44JjI1NV0rIi0iK1liW2U+PjE2JjI1NV0rWWJbZT4+MjQmMjU1XStZYltnJjI1NV0rWWJbZz4+OCYyNTVdK1liW2c+PjE2JjI1NV0rWWJbZz4+MjQmMjU1XSkudG9VcHBlckNhc2UoKX0sCmNsYW1wOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gTWF0aC5tYXgoYyxNYXRoLm1pbihlLGEpKX0sZXVjbGlkZWFuTW9kdWxvOmZ1bmN0aW9uKGEsYyl7cmV0dXJuKGElYytjKSVjfSxtYXBMaW5lYXI6ZnVuY3Rpb24oYSxjLGUsZyxyKXtyZXR1cm4gZysoYS1jKSooci1nKS8oZS1jKX0sbGVycDpmdW5jdGlvbihhLGMsZSl7cmV0dXJuKDEtZSkqYStlKmN9LHNtb290aHN0ZXA6ZnVuY3Rpb24oYSxjLGUpe2lmKGE8PWMpcmV0dXJuIDA7aWYoYT49ZSlyZXR1cm4gMTthPShhLWMpLyhlLWMpO3JldHVybiBhKmEqKDMtMiphKX0sc21vb3RoZXJzdGVwOmZ1bmN0aW9uKGEsYyxlKXtpZihhPD1jKXJldHVybiAwO2lmKGE+PWUpcmV0dXJuIDE7YT0oYS1jKS8oZS1jKTtyZXR1cm4gYSphKmEqKGEqKDYqYS0xNSkrMTApfSxyYW5kSW50OmZ1bmN0aW9uKGEsYyl7cmV0dXJuIGErTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpKihjLWErMSkpfSxyYW5kRmxvYXQ6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gYSsKTWF0aC5yYW5kb20oKSooYy1hKX0scmFuZEZsb2F0U3ByZWFkOmZ1bmN0aW9uKGEpe3JldHVybiBhKiguNS1NYXRoLnJhbmRvbSgpKX0sZGVnVG9SYWQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEqaGIuREVHMlJBRH0scmFkVG9EZWc6ZnVuY3Rpb24oYSl7cmV0dXJuIGEqaGIuUkFEMkRFR30saXNQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe3JldHVybiAwPT09KGEmYS0xKSYmMCE9PWF9LGNlaWxQb3dlck9mVHdvOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLnBvdygyLE1hdGguY2VpbChNYXRoLmxvZyhhKS9NYXRoLkxOMikpfSxmbG9vclBvd2VyT2ZUd286ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyhhKS9NYXRoLkxOMikpfX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoZi5wcm90b3R5cGUse3dpZHRoOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy54PWF9fSxoZWlnaHQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnl9LApzZXQ6ZnVuY3Rpb24oYSl7dGhpcy55PWF9fX0pO09iamVjdC5hc3NpZ24oZi5wcm90b3R5cGUse2lzVmVjdG9yMjohMCxzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YTt0aGlzLnk9YztyZXR1cm4gdGhpc30sc2V0U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueT10aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WDpmdW5jdGlvbihhKXt0aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WTpmdW5jdGlvbihhKXt0aGlzLnk9YTtyZXR1cm4gdGhpc30sc2V0Q29tcG9uZW50OmZ1bmN0aW9uKGEsYyl7c3dpdGNoKGEpe2Nhc2UgMDp0aGlzLng9YzticmVhaztjYXNlIDE6dGhpcy55PWM7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK2EpO31yZXR1cm4gdGhpc30sZ2V0Q29tcG9uZW50OmZ1bmN0aW9uKGEpe3N3aXRjaChhKXtjYXNlIDA6cmV0dXJuIHRoaXMueDtjYXNlIDE6cmV0dXJuIHRoaXMueTtkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrCmEpO319LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnkpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMueD1hLng7dGhpcy55PWEueTtyZXR1cm4gdGhpc30sYWRkOmZ1bmN0aW9uKGEsYyl7aWYodm9pZCAwIT09YylyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuYWRkKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuYWRkVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5hZGRWZWN0b3JzKGEsYyk7dGhpcy54Kz1hLng7dGhpcy55Kz1hLnk7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngrPWE7dGhpcy55Kz1hO3JldHVybiB0aGlzfSxhZGRWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dGhpcy54PWEueCtjLng7dGhpcy55PWEueStjLnk7cmV0dXJuIHRoaXN9LGFkZFNjYWxlZFZlY3RvcjpmdW5jdGlvbihhLGMpe3RoaXMueCs9YS54KmM7dGhpcy55Kz1hLnkqYztyZXR1cm4gdGhpc30sCnN1YjpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuc3ViVmVjdG9ycyhhLGMpO3RoaXMueC09YS54O3RoaXMueS09YS55O3JldHVybiB0aGlzfSxzdWJTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54LT1hO3RoaXMueS09YTtyZXR1cm4gdGhpc30sc3ViVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngtYy54O3RoaXMueT1hLnktYy55O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihhKXt0aGlzLngqPWEueDt0aGlzLnkqPWEueTtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54Kj1hO3RoaXMueSo9YTtyZXR1cm4gdGhpc30sZGl2aWRlOmZ1bmN0aW9uKGEpe3RoaXMueC89YS54O3RoaXMueS89YS55O3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYSl9LGFwcGx5TWF0cml4MzpmdW5jdGlvbihhKXt2YXIgYz10aGlzLngsZT10aGlzLnk7YT1hLmVsZW1lbnRzO3RoaXMueD1hWzBdKmMrYVszXSplK2FbNl07dGhpcy55PWFbMV0qYythWzRdKmUrYVs3XTtyZXR1cm4gdGhpc30sbWluOmZ1bmN0aW9uKGEpe3RoaXMueD1NYXRoLm1pbih0aGlzLngsYS54KTt0aGlzLnk9TWF0aC5taW4odGhpcy55LGEueSk7cmV0dXJuIHRoaXN9LG1heDpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5tYXgodGhpcy54LGEueCk7dGhpcy55PU1hdGgubWF4KHRoaXMueSxhLnkpO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLngsTWF0aC5taW4oYy54LHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLnksTWF0aC5taW4oYy55LHRoaXMueSkpO3JldHVybiB0aGlzfSxjbGFtcFNjYWxhcjpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGEsTWF0aC5taW4oYywKdGhpcy55KSk7cmV0dXJuIHRoaXN9LGNsYW1wTGVuZ3RoOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoZXx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgoYSxNYXRoLm1pbihjLGUpKSl9LGZsb29yOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpO3JldHVybiB0aGlzfSxjZWlsOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguY2VpbCh0aGlzLngpO3RoaXMueT1NYXRoLmNlaWwodGhpcy55KTtyZXR1cm4gdGhpc30scm91bmQ6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5yb3VuZCh0aGlzLngpO3RoaXMueT1NYXRoLnJvdW5kKHRoaXMueSk7cmV0dXJuIHRoaXN9LHJvdW5kVG9aZXJvOmZ1bmN0aW9uKCl7dGhpcy54PTA+dGhpcy54P01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9MD50aGlzLnk/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpOwpyZXR1cm4gdGhpc30sbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy54PS10aGlzLng7dGhpcy55PS10aGlzLnk7cmV0dXJuIHRoaXN9LGRvdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54KmEueCt0aGlzLnkqYS55fSxjcm9zczpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54KmEueS10aGlzLnkqYS54fSxsZW5ndGhTcTpmdW5jdGlvbigpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnl9LGxlbmd0aDpmdW5jdGlvbigpe3JldHVybiBNYXRoLnNxcnQodGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfSxhbmdsZTpmdW5jdGlvbigpe3ZhciBhPU1hdGguYXRhbjIodGhpcy55LHRoaXMueCk7MD5hJiYoYSs9MipNYXRoLlBJKTtyZXR1cm4gYX0sCmRpc3RhbmNlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKGEpKX0sZGlzdGFuY2VUb1NxdWFyZWQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LWEueDthPXRoaXMueS1hLnk7cmV0dXJuIGMqYythKmF9LG1hbmhhdHRhbkRpc3RhbmNlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC1hLngpK01hdGguYWJzKHRoaXMueS1hLnkpfSxzZXRMZW5ndGg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoYSl9LGxlcnA6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPShhLngtdGhpcy54KSpjO3RoaXMueSs9KGEueS10aGlzLnkpKmM7cmV0dXJuIHRoaXN9LGxlcnBWZWN0b3JzOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKGMsYSkubXVsdGlwbHlTY2FsYXIoZSkuYWRkKGEpfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueD09PXRoaXMueCYmYS55PT09dGhpcy55fSwKZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7dGhpcy54PWFbY107dGhpcy55PWFbYysxXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTthW2NdPXRoaXMueDthW2MrMV09dGhpcy55O3JldHVybiBhfSxmcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXt2b2lkIDAhPT1lJiZjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTt0aGlzLng9YS5nZXRYKGMpO3RoaXMueT1hLmdldFkoYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZUFyb3VuZDpmdW5jdGlvbihhLGMpe3ZhciBlPU1hdGguY29zKGMpO2M9TWF0aC5zaW4oYyk7dmFyIGc9dGhpcy54LWEueCxyPXRoaXMueS1hLnk7dGhpcy54PWcqZS1yKmMrYS54O3RoaXMueT1nKmMrciplK2EueTtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKGgsCntzbGVycDpmdW5jdGlvbihhLGMsZSxnKXtyZXR1cm4gZS5jb3B5KGEpLnNsZXJwKGMsZyl9LHNsZXJwRmxhdDpmdW5jdGlvbihhLGMsZSxnLHIsdix6KXt2YXIgRT1lW2crMF0sRj1lW2crMV0sSj1lW2crMl07ZT1lW2crM107Zz1yW3YrMF07dmFyIFA9clt2KzFdLFI9clt2KzJdO3I9clt2KzNdO2lmKGUhPT1yfHxFIT09Z3x8RiE9PVB8fEohPT1SKXt2PTEtejt2YXIgUz1FKmcrRipQK0oqUitlKnIsVj0wPD1TPzE6LTEsVz0xLVMqUztXPk51bWJlci5FUFNJTE9OJiYoVz1NYXRoLnNxcnQoVyksUz1NYXRoLmF0YW4yKFcsUypWKSx2PU1hdGguc2luKHYqUykvVyx6PU1hdGguc2luKHoqUykvVyk7Vio9ejtFPUUqditnKlY7Rj1GKnYrUCpWO0o9Sip2K1IqVjtlPWUqdityKlY7dj09PTEteiYmKHo9MS9NYXRoLnNxcnQoRSpFK0YqRitKKkorZSplKSxFKj16LEYqPXosSio9eixlKj16KX1hW2NdPUU7YVtjKzFdPUY7YVtjKzJdPUo7YVtjKzNdPWV9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoaC5wcm90b3R5cGUsCnt4OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feH0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3g9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feX0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3k9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx6OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fen0sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3o9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fSx3OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fd30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMuX3c9YTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9fX0pO09iamVjdC5hc3NpZ24oaC5wcm90b3R5cGUse2lzUXVhdGVybmlvbjohMCxzZXQ6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5feD1hO3RoaXMuX3k9Yzt0aGlzLl96PWU7dGhpcy5fdz1nO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCwKdGhpcy5feSx0aGlzLl96LHRoaXMuX3cpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuX3g9YS54O3RoaXMuX3k9YS55O3RoaXMuX3o9YS56O3RoaXMuX3c9YS53O3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbUV1bGVyOmZ1bmN0aW9uKGEsYyl7aWYoIWF8fCFhLmlzRXVsZXIpdGhyb3cgRXJyb3IoIlRIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO3ZhciBlPWEuX3gsZz1hLl95LHI9YS5fejthPWEub3JkZXI7dmFyIHY9TWF0aC5jb3Msej1NYXRoLnNpbixFPXYoZS8yKSxGPXYoZy8yKTt2PXYoci8yKTtlPXooZS8yKTtnPXooZy8yKTtyPXooci8yKTsiWFlaIj09PWE/KHRoaXMuX3g9ZSpGKnYrRSpnKnIsdGhpcy5feT1FKmcqdi1lKkYqcix0aGlzLl96PUUqRipyK2UqZyp2LHRoaXMuX3c9RSpGKnYtZSpnKnIpOiJZWFoiPT09CmE/KHRoaXMuX3g9ZSpGKnYrRSpnKnIsdGhpcy5feT1FKmcqdi1lKkYqcix0aGlzLl96PUUqRipyLWUqZyp2LHRoaXMuX3c9RSpGKnYrZSpnKnIpOiJaWFkiPT09YT8odGhpcy5feD1lKkYqdi1FKmcqcix0aGlzLl95PUUqZyp2K2UqRipyLHRoaXMuX3o9RSpGKnIrZSpnKnYsdGhpcy5fdz1FKkYqdi1lKmcqcik6IlpZWCI9PT1hPyh0aGlzLl94PWUqRip2LUUqZypyLHRoaXMuX3k9RSpnKnYrZSpGKnIsdGhpcy5fej1FKkYqci1lKmcqdix0aGlzLl93PUUqRip2K2UqZypyKToiWVpYIj09PWE/KHRoaXMuX3g9ZSpGKnYrRSpnKnIsdGhpcy5feT1FKmcqditlKkYqcix0aGlzLl96PUUqRipyLWUqZyp2LHRoaXMuX3c9RSpGKnYtZSpnKnIpOiJYWlkiPT09YSYmKHRoaXMuX3g9ZSpGKnYtRSpnKnIsdGhpcy5feT1FKmcqdi1lKkYqcix0aGlzLl96PUUqRipyK2UqZyp2LHRoaXMuX3c9RSpGKnYrZSpnKnIpOyExIT09YyYmdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tQXhpc0FuZ2xlOmZ1bmN0aW9uKGEsCmMpe2MvPTI7dmFyIGU9TWF0aC5zaW4oYyk7dGhpcy5feD1hLngqZTt0aGlzLl95PWEueSplO3RoaXMuX3o9YS56KmU7dGhpcy5fdz1NYXRoLmNvcyhjKTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21Sb3RhdGlvbk1hdHJpeDpmdW5jdGlvbihhKXt2YXIgYz1hLmVsZW1lbnRzLGU9Y1swXTthPWNbNF07dmFyIGc9Y1s4XSxyPWNbMV0sdj1jWzVdLHo9Y1s5XSxFPWNbMl0sRj1jWzZdO2M9Y1sxMF07dmFyIEo9ZSt2K2M7MDxKPyhlPS41L01hdGguc3FydChKKzEpLHRoaXMuX3c9LjI1L2UsdGhpcy5feD0oRi16KSplLHRoaXMuX3k9KGctRSkqZSx0aGlzLl96PShyLWEpKmUpOmU+diYmZT5jPyhlPTIqTWF0aC5zcXJ0KDErZS12LWMpLHRoaXMuX3c9KEYteikvZSx0aGlzLl94PS4yNSplLHRoaXMuX3k9KGErcikvZSx0aGlzLl96PShnK0UpL2UpOnY+Yz8oZT0yKk1hdGguc3FydCgxK3YtZS1jKSx0aGlzLl93PShnLUUpL2UsdGhpcy5feD0oYStyKS9lLAp0aGlzLl95PS4yNSplLHRoaXMuX3o9KHorRikvZSk6KGU9MipNYXRoLnNxcnQoMStjLWUtdiksdGhpcy5fdz0oci1hKS9lLHRoaXMuX3g9KGcrRSkvZSx0aGlzLl95PSh6K0YpL2UsdGhpcy5fej0uMjUqZSk7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzZXRGcm9tVW5pdFZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLmRvdChjKSsxOzFFLTY+ZT8oZT0wLE1hdGguYWJzKGEueCk+TWF0aC5hYnMoYS56KT8odGhpcy5feD0tYS55LHRoaXMuX3k9YS54LHRoaXMuX3o9MCk6KHRoaXMuX3g9MCx0aGlzLl95PS1hLnosdGhpcy5fej1hLnkpKToodGhpcy5feD1hLnkqYy56LWEueipjLnksdGhpcy5feT1hLnoqYy54LWEueCpjLnosdGhpcy5fej1hLngqYy55LWEueSpjLngpO3RoaXMuX3c9ZTtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKX0sYW5nbGVUbzpmdW5jdGlvbihhKXtyZXR1cm4gMipNYXRoLmFjb3MoTWF0aC5hYnMoaGIuY2xhbXAodGhpcy5kb3QoYSksLTEsCjEpKSl9LHJvdGF0ZVRvd2FyZHM6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmFuZ2xlVG8oYSk7aWYoMD09PWUpcmV0dXJuIHRoaXM7dGhpcy5zbGVycChhLE1hdGgubWluKDEsYy9lKSk7cmV0dXJuIHRoaXN9LGludmVyc2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb25qdWdhdGUoKX0sY29uanVnYXRlOmZ1bmN0aW9uKCl7dGhpcy5feCo9LTE7dGhpcy5feSo9LTE7dGhpcy5feio9LTE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxkb3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3gqYS5feCt0aGlzLl95KmEuX3krdGhpcy5feiphLl96K3RoaXMuX3cqYS5fd30sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5feCp0aGlzLl94K3RoaXMuX3kqdGhpcy5feSt0aGlzLl96KnRoaXMuX3ordGhpcy5fdyp0aGlzLl93fSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuX3gqdGhpcy5feCt0aGlzLl95KnRoaXMuX3krdGhpcy5feioKdGhpcy5feit0aGlzLl93KnRoaXMuX3cpfSxub3JtYWxpemU6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmxlbmd0aCgpOzA9PT1hPyh0aGlzLl96PXRoaXMuX3k9dGhpcy5feD0wLHRoaXMuX3c9MSk6KGE9MS9hLHRoaXMuX3gqPWEsdGhpcy5feSo9YSx0aGlzLl96Kj1hLHRoaXMuX3cqPWEpO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sbXVsdGlwbHk6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdm9pZCAwIT09Yz8oY29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoYSxjKSk6dGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsYSl9LHByZW11bHRpcGx5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoYSx0aGlzKX0sbXVsdGlwbHlRdWF0ZXJuaW9uczpmdW5jdGlvbihhLApjKXt2YXIgZT1hLl94LGc9YS5feSxyPWEuX3o7YT1hLl93O3ZhciB2PWMuX3gsej1jLl95LEU9Yy5fejtjPWMuX3c7dGhpcy5feD1lKmMrYSp2K2cqRS1yKno7dGhpcy5feT1nKmMrYSp6K3Iqdi1lKkU7dGhpcy5fej1yKmMrYSpFK2Uqei1nKnY7dGhpcy5fdz1hKmMtZSp2LWcqei1yKkU7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxzbGVycDpmdW5jdGlvbihhLGMpe2lmKDA9PT1jKXJldHVybiB0aGlzO2lmKDE9PT1jKXJldHVybiB0aGlzLmNvcHkoYSk7dmFyIGU9dGhpcy5feCxnPXRoaXMuX3kscj10aGlzLl96LHY9dGhpcy5fdyx6PXYqYS5fdytlKmEuX3grZyphLl95K3IqYS5fejswPno/KHRoaXMuX3c9LWEuX3csdGhpcy5feD0tYS5feCx0aGlzLl95PS1hLl95LHRoaXMuX3o9LWEuX3osej0teik6dGhpcy5jb3B5KGEpO2lmKDE8PXopcmV0dXJuIHRoaXMuX3c9dix0aGlzLl94PWUsdGhpcy5feT1nLHRoaXMuX3o9cix0aGlzO2E9MS16Kno7aWYoYTw9TnVtYmVyLkVQU0lMT04pcmV0dXJuIHo9CjEtYyx0aGlzLl93PXoqditjKnRoaXMuX3csdGhpcy5feD16KmUrYyp0aGlzLl94LHRoaXMuX3k9eipnK2MqdGhpcy5feSx0aGlzLl96PXoqcitjKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpczthPU1hdGguc3FydChhKTt2YXIgRT1NYXRoLmF0YW4yKGEseik7ej1NYXRoLnNpbigoMS1jKSpFKS9hO2M9TWF0aC5zaW4oYypFKS9hO3RoaXMuX3c9dip6K3RoaXMuX3cqYzt0aGlzLl94PWUqeit0aGlzLl94KmM7dGhpcy5feT1nKnordGhpcy5feSpjO3RoaXMuX3o9cip6K3RoaXMuX3oqYzt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5feD09PXRoaXMuX3gmJmEuX3k9PT10aGlzLl95JiZhLl96PT09dGhpcy5feiYmYS5fdz09PXRoaXMuX3d9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMuX3g9YVtjXTt0aGlzLl95PWFbYysxXTsKdGhpcy5fej1hW2MrMl07dGhpcy5fdz1hW2MrM107dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PWMmJihjPTApO2FbY109dGhpcy5feDthW2MrMV09dGhpcy5feTthW2MrMl09dGhpcy5fejthW2MrM109dGhpcy5fdztyZXR1cm4gYX0sX29uQ2hhbmdlOmZ1bmN0aW9uKGEpe3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9YTtyZXR1cm4gdGhpc30sX29uQ2hhbmdlQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9fSk7dmFyIHhpPW5ldyBrLGJrPW5ldyBoO09iamVjdC5hc3NpZ24oay5wcm90b3R5cGUse2lzVmVjdG9yMzohMCxzZXQ6ZnVuY3Rpb24oYSxjLGUpe3RoaXMueD1hO3RoaXMueT1jO3RoaXMuej1lO3JldHVybiB0aGlzfSxzZXRTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy56PXRoaXMueT10aGlzLng9YTtyZXR1cm4gdGhpc30sc2V0WDpmdW5jdGlvbihhKXt0aGlzLng9YTtyZXR1cm4gdGhpc30sCnNldFk6ZnVuY3Rpb24oYSl7dGhpcy55PWE7cmV0dXJuIHRoaXN9LHNldFo6ZnVuY3Rpb24oYSl7dGhpcy56PWE7cmV0dXJuIHRoaXN9LHNldENvbXBvbmVudDpmdW5jdGlvbihhLGMpe3N3aXRjaChhKXtjYXNlIDA6dGhpcy54PWM7YnJlYWs7Y2FzZSAxOnRoaXMueT1jO2JyZWFrO2Nhc2UgMjp0aGlzLno9YzticmVhaztkZWZhdWx0OnRocm93IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrYSk7fXJldHVybiB0aGlzfSxnZXRDb21wb25lbnQ6ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIithKTt9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueil9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy54PWEueDt0aGlzLnk9YS55Owp0aGlzLno9YS56O3JldHVybiB0aGlzfSxhZGQ6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnMoYSxjKTt0aGlzLngrPWEueDt0aGlzLnkrPWEueTt0aGlzLnorPWEuejtyZXR1cm4gdGhpc30sYWRkU2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueCs9YTt0aGlzLnkrPWE7dGhpcy56Kz1hO3JldHVybiB0aGlzfSxhZGRWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dGhpcy54PWEueCtjLng7dGhpcy55PWEueStjLnk7dGhpcy56PWEueitjLno7cmV0dXJuIHRoaXN9LGFkZFNjYWxlZFZlY3RvcjpmdW5jdGlvbihhLGMpe3RoaXMueCs9YS54KmM7dGhpcy55Kz1hLnkqYzt0aGlzLnorPWEueipjO3JldHVybiB0aGlzfSxzdWI6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSwKdGhpcy5zdWJWZWN0b3JzKGEsYyk7dGhpcy54LT1hLng7dGhpcy55LT1hLnk7dGhpcy56LT1hLno7cmV0dXJuIHRoaXN9LHN1YlNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngtPWE7dGhpcy55LT1hO3RoaXMuei09YTtyZXR1cm4gdGhpc30sc3ViVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngtYy54O3RoaXMueT1hLnktYy55O3RoaXMuej1hLnotYy56O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5VmVjdG9ycyhhLGMpO3RoaXMueCo9YS54O3RoaXMueSo9YS55O3RoaXMueio9YS56O3JldHVybiB0aGlzfSxtdWx0aXBseVNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLngqPWE7dGhpcy55Kj1hO3RoaXMueio9CmE7cmV0dXJuIHRoaXN9LG11bHRpcGx5VmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngqYy54O3RoaXMueT1hLnkqYy55O3RoaXMuej1hLnoqYy56O3JldHVybiB0aGlzfSxhcHBseUV1bGVyOmZ1bmN0aW9uKGEpe2EmJmEuaXNFdWxlcnx8Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLmFwcGx5RXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihiay5zZXRGcm9tRXVsZXIoYSkpfSxhcHBseUF4aXNBbmdsZTpmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmFwcGx5UXVhdGVybmlvbihiay5zZXRGcm9tQXhpc0FuZ2xlKGEsYykpfSxhcHBseU1hdHJpeDM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56O2E9YS5lbGVtZW50czt0aGlzLng9YVswXSpjK2FbM10qZSthWzZdKmc7dGhpcy55PWFbMV0qYythWzRdKmUrYVs3XSoKZzt0aGlzLno9YVsyXSpjK2FbNV0qZSthWzhdKmc7cmV0dXJuIHRoaXN9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLngsZT10aGlzLnksZz10aGlzLno7YT1hLmVsZW1lbnRzO3ZhciByPTEvKGFbM10qYythWzddKmUrYVsxMV0qZythWzE1XSk7dGhpcy54PShhWzBdKmMrYVs0XSplK2FbOF0qZythWzEyXSkqcjt0aGlzLnk9KGFbMV0qYythWzVdKmUrYVs5XSpnK2FbMTNdKSpyO3RoaXMuej0oYVsyXSpjK2FbNl0qZSthWzEwXSpnK2FbMTRdKSpyO3JldHVybiB0aGlzfSxhcHBseVF1YXRlcm5pb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56LHI9YS54LHY9YS55LHo9YS56O2E9YS53O3ZhciBFPWEqYyt2KmcteiplLEY9YSplK3oqYy1yKmcsSj1hKmcrciplLXYqYztjPS1yKmMtdiplLXoqZzt0aGlzLng9RSphK2MqLXIrRiotei1KKi12O3RoaXMueT1GKmErYyotditKKi1yLUUqLXo7dGhpcy56PUoqYStjKi16K0UqLXYtRiotcjtyZXR1cm4gdGhpc30sCnByb2plY3Q6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGRJbnZlcnNlKS5hcHBseU1hdHJpeDQoYS5wcm9qZWN0aW9uTWF0cml4KX0sdW5wcm9qZWN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFwcGx5TWF0cml4NChhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKS5hcHBseU1hdHJpeDQoYS5tYXRyaXhXb3JsZCl9LHRyYW5zZm9ybURpcmVjdGlvbjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLngsZT10aGlzLnksZz10aGlzLno7YT1hLmVsZW1lbnRzO3RoaXMueD1hWzBdKmMrYVs0XSplK2FbOF0qZzt0aGlzLnk9YVsxXSpjK2FbNV0qZSthWzldKmc7dGhpcy56PWFbMl0qYythWzZdKmUrYVsxMF0qZztyZXR1cm4gdGhpcy5ub3JtYWxpemUoKX0sZGl2aWRlOmZ1bmN0aW9uKGEpe3RoaXMueC89YS54O3RoaXMueS89YS55O3RoaXMuei89YS56O3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYSl9LG1pbjpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5taW4odGhpcy54LGEueCk7dGhpcy55PU1hdGgubWluKHRoaXMueSxhLnkpO3RoaXMuej1NYXRoLm1pbih0aGlzLnosYS56KTtyZXR1cm4gdGhpc30sbWF4OmZ1bmN0aW9uKGEpe3RoaXMueD1NYXRoLm1heCh0aGlzLngsYS54KTt0aGlzLnk9TWF0aC5tYXgodGhpcy55LGEueSk7dGhpcy56PU1hdGgubWF4KHRoaXMueixhLnopO3JldHVybiB0aGlzfSxjbGFtcDpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLngsTWF0aC5taW4oYy54LHRoaXMueCkpO3RoaXMueT1NYXRoLm1heChhLnksTWF0aC5taW4oYy55LHRoaXMueSkpO3RoaXMuej1NYXRoLm1heChhLnosTWF0aC5taW4oYy56LHRoaXMueikpO3JldHVybiB0aGlzfSxjbGFtcFNjYWxhcjpmdW5jdGlvbihhLGMpe3RoaXMueD1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGEsTWF0aC5taW4oYyx0aGlzLnkpKTt0aGlzLno9TWF0aC5tYXgoYSwKTWF0aC5taW4oYyx0aGlzLnopKTtyZXR1cm4gdGhpc30sY2xhbXBMZW5ndGg6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmxlbmd0aCgpO3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcihlfHwxKS5tdWx0aXBseVNjYWxhcihNYXRoLm1heChhLE1hdGgubWluKGMsZSkpKX0sZmxvb3I6ZnVuY3Rpb24oKXt0aGlzLng9TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT1NYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PU1hdGguZmxvb3IodGhpcy56KTtyZXR1cm4gdGhpc30sY2VpbDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmNlaWwodGhpcy54KTt0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSk7dGhpcy56PU1hdGguY2VpbCh0aGlzLnopO3JldHVybiB0aGlzfSxyb3VuZDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLnJvdW5kKHRoaXMueCk7dGhpcy55PU1hdGgucm91bmQodGhpcy55KTt0aGlzLno9TWF0aC5yb3VuZCh0aGlzLnopO3JldHVybiB0aGlzfSxyb3VuZFRvWmVybzpmdW5jdGlvbigpe3RoaXMueD0KMD50aGlzLng/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT0wPnRoaXMueT9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PTA+dGhpcy56P01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KTtyZXR1cm4gdGhpc30sbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy54PS10aGlzLng7dGhpcy55PS10aGlzLnk7dGhpcy56PS10aGlzLno7cmV0dXJuIHRoaXN9LGRvdDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy54KmEueCt0aGlzLnkqYS55K3RoaXMueiphLnp9LGxlbmd0aFNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56fSxsZW5ndGg6ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KSsKTWF0aC5hYnModGhpcy56KX0sbm9ybWFsaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfSxzZXRMZW5ndGg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoYSl9LGxlcnA6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPShhLngtdGhpcy54KSpjO3RoaXMueSs9KGEueS10aGlzLnkpKmM7dGhpcy56Kz0oYS56LXRoaXMueikqYztyZXR1cm4gdGhpc30sbGVycFZlY3RvcnM6ZnVuY3Rpb24oYSxjLGUpe3JldHVybiB0aGlzLnN1YlZlY3RvcnMoYyxhKS5tdWx0aXBseVNjYWxhcihlKS5hZGQoYSl9LGNyb3NzOmZ1bmN0aW9uKGEsYyl7cmV0dXJuIHZvaWQgMCE9PWM/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmNyb3NzKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuY3Jvc3NWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmNyb3NzVmVjdG9ycyhhLGMpKTp0aGlzLmNyb3NzVmVjdG9ycyh0aGlzLAphKX0sY3Jvc3NWZWN0b3JzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS54LGc9YS55O2E9YS56O3ZhciByPWMueCx2PWMueTtjPWMuejt0aGlzLng9ZypjLWEqdjt0aGlzLnk9YSpyLWUqYzt0aGlzLno9ZSp2LWcqcjtyZXR1cm4gdGhpc30scHJvamVjdE9uVmVjdG9yOmZ1bmN0aW9uKGEpe3ZhciBjPWEuZG90KHRoaXMpL2EubGVuZ3RoU3EoKTtyZXR1cm4gdGhpcy5jb3B5KGEpLm11bHRpcGx5U2NhbGFyKGMpfSxwcm9qZWN0T25QbGFuZTpmdW5jdGlvbihhKXt4aS5jb3B5KHRoaXMpLnByb2plY3RPblZlY3RvcihhKTtyZXR1cm4gdGhpcy5zdWIoeGkpfSxyZWZsZWN0OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnN1Yih4aS5jb3B5KGEpLm11bHRpcGx5U2NhbGFyKDIqdGhpcy5kb3QoYSkpKX0sYW5nbGVUbzpmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5hY29zKGhiLmNsYW1wKHRoaXMuZG90KGEpL01hdGguc3FydCh0aGlzLmxlbmd0aFNxKCkqYS5sZW5ndGhTcSgpKSwtMSwxKSl9LGRpc3RhbmNlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKGEpKX0sCmRpc3RhbmNlVG9TcXVhcmVkOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMueC1hLngsZT10aGlzLnktYS55O2E9dGhpcy56LWEuejtyZXR1cm4gYypjK2UqZSthKmF9LG1hbmhhdHRhbkRpc3RhbmNlVG86ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC1hLngpK01hdGguYWJzKHRoaXMueS1hLnkpK01hdGguYWJzKHRoaXMuei1hLnopfSxzZXRGcm9tU3BoZXJpY2FsOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHMoYS5yYWRpdXMsYS5waGksYS50aGV0YSl9LHNldEZyb21TcGhlcmljYWxDb29yZHM6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPU1hdGguc2luKGMpKmE7dGhpcy54PWcqTWF0aC5zaW4oZSk7dGhpcy55PU1hdGguY29zKGMpKmE7dGhpcy56PWcqTWF0aC5jb3MoZSk7cmV0dXJuIHRoaXN9LHNldEZyb21DeWxpbmRyaWNhbDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHMoYS5yYWRpdXMsYS50aGV0YSwKYS55KX0sc2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLng9YSpNYXRoLnNpbihjKTt0aGlzLnk9ZTt0aGlzLno9YSpNYXRoLmNvcyhjKTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeFBvc2l0aW9uOmZ1bmN0aW9uKGEpe2E9YS5lbGVtZW50czt0aGlzLng9YVsxMl07dGhpcy55PWFbMTNdO3RoaXMuej1hWzE0XTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeFNjYWxlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbihhLDApLmxlbmd0aCgpLGU9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGEsMSkubGVuZ3RoKCk7YT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oYSwyKS5sZW5ndGgoKTt0aGlzLng9Yzt0aGlzLnk9ZTt0aGlzLno9YTtyZXR1cm4gdGhpc30sc2V0RnJvbU1hdHJpeENvbHVtbjpmdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmZyb21BcnJheShhLmVsZW1lbnRzLDQqYyl9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS54PT09CnRoaXMueCYmYS55PT09dGhpcy55JiZhLno9PT10aGlzLnp9LGZyb21BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMueD1hW2NdO3RoaXMueT1hW2MrMV07dGhpcy56PWFbYysyXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTthW2NdPXRoaXMueDthW2MrMV09dGhpcy55O2FbYysyXT10aGlzLno7cmV0dXJuIGF9LGZyb21CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oYSxjLGUpe3ZvaWQgMCE9PWUmJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpO3RoaXMueD1hLmdldFgoYyk7dGhpcy55PWEuZ2V0WShjKTt0aGlzLno9YS5nZXRaKGMpO3JldHVybiB0aGlzfX0pO3ZhciBlZT1uZXcgaztPYmplY3QuYXNzaWduKHQucHJvdG90eXBlLHtpc01hdHJpeDM6ITAsc2V0OmZ1bmN0aW9uKGEsCmMsZSxnLHIsdix6LEUsRil7dmFyIEo9dGhpcy5lbGVtZW50cztKWzBdPWE7SlsxXT1nO0pbMl09ejtKWzNdPWM7Sls0XT1yO0pbNV09RTtKWzZdPWU7Sls3XT12O0pbOF09RjtyZXR1cm4gdGhpc30saWRlbnRpdHk6ZnVuY3Rpb24oKXt0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9LGNvcHk6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthPWEuZWxlbWVudHM7Y1swXT1hWzBdO2NbMV09YVsxXTtjWzJdPWFbMl07Y1szXT1hWzNdO2NbNF09YVs0XTtjWzVdPWFbNV07Y1s2XT1hWzZdO2NbN109YVs3XTtjWzhdPWFbOF07cmV0dXJuIHRoaXN9LHNldEZyb21NYXRyaXg0OmZ1bmN0aW9uKGEpe2E9YS5lbGVtZW50czt0aGlzLnNldChhWzBdLGFbNF0sYVs4XSxhWzFdLGFbNV0sYVs5XSxhWzJdLGFbNl0sYVsxMF0pO3JldHVybiB0aGlzfSwKYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MCxlPWEuY291bnQ7YzxlO2MrKyllZS54PWEuZ2V0WChjKSxlZS55PWEuZ2V0WShjKSxlZS56PWEuZ2V0WihjKSxlZS5hcHBseU1hdHJpeDModGhpcyksYS5zZXRYWVooYyxlZS54LGVlLnksZWUueik7cmV0dXJuIGF9LG11bHRpcGx5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyxhKX0scHJlbXVsdGlwbHk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyhhLHRoaXMpfSxtdWx0aXBseU1hdHJpY2VzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS5lbGVtZW50cyxnPWMuZWxlbWVudHM7Yz10aGlzLmVsZW1lbnRzO2E9ZVswXTt2YXIgcj1lWzNdLHY9ZVs2XSx6PWVbMV0sRT1lWzRdLEY9ZVs3XSxKPWVbMl0sUD1lWzVdO2U9ZVs4XTt2YXIgUj1nWzBdLFM9Z1szXSxWPWdbNl0sVz1nWzFdLGhhPWdbNF0sZmE9Z1s3XSxyYT1nWzJdLHBhPWdbNV07Zz1nWzhdOwpjWzBdPWEqUityKlcrdipyYTtjWzNdPWEqUytyKmhhK3YqcGE7Y1s2XT1hKlYrcipmYSt2Kmc7Y1sxXT16KlIrRSpXK0YqcmE7Y1s0XT16KlMrRSpoYStGKnBhO2NbN109eipWK0UqZmErRipnO2NbMl09SipSK1AqVytlKnJhO2NbNV09SipTK1AqaGErZSpwYTtjWzhdPUoqVitQKmZhK2UqZztyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50cztjWzBdKj1hO2NbM10qPWE7Y1s2XSo9YTtjWzFdKj1hO2NbNF0qPWE7Y1s3XSo9YTtjWzJdKj1hO2NbNV0qPWE7Y1s4XSo9YTtyZXR1cm4gdGhpc30sZGV0ZXJtaW5hbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnRzLGM9YVswXSxlPWFbMV0sZz1hWzJdLHI9YVszXSx2PWFbNF0sej1hWzVdLEU9YVs2XSxGPWFbN107YT1hWzhdO3JldHVybiBjKnYqYS1jKnoqRi1lKnIqYStlKnoqRStnKnIqRi1nKnYqRX0sZ2V0SW52ZXJzZTpmdW5jdGlvbihhLGMpe2EmJmEuaXNNYXRyaXg0JiYKY29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBubyBsb25nZXIgdGFrZXMgYSBNYXRyaXg0IGFyZ3VtZW50LiIpO3ZhciBlPWEuZWxlbWVudHM7YT10aGlzLmVsZW1lbnRzO3ZhciBnPWVbMF0scj1lWzFdLHY9ZVsyXSx6PWVbM10sRT1lWzRdLEY9ZVs1XSxKPWVbNl0sUD1lWzddO2U9ZVs4XTt2YXIgUj1lKkUtRipQLFM9RipKLWUqeixWPVAqei1FKkosVz1nKlIrcipTK3YqVjtpZigwPT09Vyl7aWYoITA9PT1jKXRocm93IEVycm9yKCJUSFJFRS5NYXRyaXgzOiAuZ2V0SW52ZXJzZSgpIGNhbid0IGludmVydCBtYXRyaXgsIGRldGVybWluYW50IGlzIDAiKTtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCIpO3JldHVybiB0aGlzLmlkZW50aXR5KCl9Yz0xL1c7YVswXT1SKmM7YVsxXT0odipQLWUqcikqYzthWzJdPShGKnItdipFKSpjO2FbM109UypjO2FbNF09CihlKmctdipKKSpjO2FbNV09KHYqei1GKmcpKmM7YVs2XT1WKmM7YVs3XT0ocipKLVAqZykqYzthWzhdPShFKmctcip6KSpjO3JldHVybiB0aGlzfSx0cmFuc3Bvc2U6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnRzO3ZhciBjPWFbMV07YVsxXT1hWzNdO2FbM109YztjPWFbMl07YVsyXT1hWzZdO2FbNl09YztjPWFbNV07YVs1XT1hWzddO2FbN109YztyZXR1cm4gdGhpc30sZ2V0Tm9ybWFsTWF0cml4OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KGEpLmdldEludmVyc2UodGhpcykudHJhbnNwb3NlKCl9LHRyYW5zcG9zZUludG9BcnJheTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzO2FbMF09Y1swXTthWzFdPWNbM107YVsyXT1jWzZdO2FbM109Y1sxXTthWzRdPWNbNF07YVs1XT1jWzddO2FbNl09Y1syXTthWzddPWNbNV07YVs4XT1jWzhdO3JldHVybiB0aGlzfSxzZXRVdlRyYW5zZm9ybTpmdW5jdGlvbihhLGMsZSxnLHIsdix6KXt2YXIgRT0KTWF0aC5jb3Mocik7cj1NYXRoLnNpbihyKTt0aGlzLnNldChlKkUsZSpyLC1lKihFKnYrcip6KSt2K2EsLWcqcixnKkUsLWcqKC1yKnYrRSp6KSt6K2MsMCwwLDEpfSxzY2FsZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZWxlbWVudHM7ZVswXSo9YTtlWzNdKj1hO2VbNl0qPWE7ZVsxXSo9YztlWzRdKj1jO2VbN10qPWM7cmV0dXJuIHRoaXN9LHJvdGF0ZTpmdW5jdGlvbihhKXt2YXIgYz1NYXRoLmNvcyhhKTthPU1hdGguc2luKGEpO3ZhciBlPXRoaXMuZWxlbWVudHMsZz1lWzBdLHI9ZVszXSx2PWVbNl0sej1lWzFdLEU9ZVs0XSxGPWVbN107ZVswXT1jKmcrYSp6O2VbM109YypyK2EqRTtlWzZdPWMqdithKkY7ZVsxXT0tYSpnK2MqejtlWzRdPS1hKnIrYypFO2VbN109LWEqditjKkY7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZWxlbWVudHM7ZVswXSs9YSplWzJdO2VbM10rPWEqZVs1XTtlWzZdKz1hKmVbOF07ZVsxXSs9YyplWzJdO2VbNF0rPQpjKmVbNV07ZVs3XSs9YyplWzhdO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthPWEuZWxlbWVudHM7Zm9yKHZhciBlPTA7OT5lO2UrKylpZihjW2VdIT09YVtlXSlyZXR1cm4hMTtyZXR1cm4hMH0sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7Zm9yKHZhciBlPTA7OT5lO2UrKyl0aGlzLmVsZW1lbnRzW2VdPWFbZStjXTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTt2YXIgZT10aGlzLmVsZW1lbnRzO2FbY109ZVswXTthW2MrMV09ZVsxXTthW2MrMl09ZVsyXTthW2MrM109ZVszXTthW2MrNF09ZVs0XTthW2MrNV09ZVs1XTthW2MrNl09ZVs2XTthW2MrN109ZVs3XTthW2MrOF09ZVs4XTtyZXR1cm4gYX19KTt2YXIgZWYsRGQ9e2dldERhdGFVUkw6ZnVuY3Rpb24oYSl7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudClyZXR1cm4gYS5zcmM7CmlmKCEoYSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KSl7dm9pZCAwPT09ZWYmJihlZj1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKSk7ZWYud2lkdGg9YS53aWR0aDtlZi5oZWlnaHQ9YS5oZWlnaHQ7dmFyIGM9ZWYuZ2V0Q29udGV4dCgiMmQiKTthIGluc3RhbmNlb2YgSW1hZ2VEYXRhP2MucHV0SW1hZ2VEYXRhKGEsMCwwKTpjLmRyYXdJbWFnZShhLDAsMCxhLndpZHRoLGEuaGVpZ2h0KTthPWVmfXJldHVybiAyMDQ4PGEud2lkdGh8fDIwNDg8YS5oZWlnaHQ/YS50b0RhdGFVUkwoImltYWdlL2pwZWciLC42KTphLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIil9fSxOaz0wO2wuREVGQVVMVF9JTUFHRT12b2lkIDA7bC5ERUZBVUxUX01BUFBJTkc9MzAwO2wucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmwsaXNUZXh0dXJlOiEwLHVwZGF0ZU1hdHJpeDpmdW5jdGlvbigpe3RoaXMubWF0cml4LnNldFV2VHJhbnNmb3JtKHRoaXMub2Zmc2V0LngsCnRoaXMub2Zmc2V0LnksdGhpcy5yZXBlYXQueCx0aGlzLnJlcGVhdC55LHRoaXMucm90YXRpb24sdGhpcy5jZW50ZXIueCx0aGlzLmNlbnRlci55KX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5uYW1lPWEubmFtZTt0aGlzLmltYWdlPWEuaW1hZ2U7dGhpcy5taXBtYXBzPWEubWlwbWFwcy5zbGljZSgwKTt0aGlzLm1hcHBpbmc9YS5tYXBwaW5nO3RoaXMud3JhcFM9YS53cmFwUzt0aGlzLndyYXBUPWEud3JhcFQ7dGhpcy5tYWdGaWx0ZXI9YS5tYWdGaWx0ZXI7dGhpcy5taW5GaWx0ZXI9YS5taW5GaWx0ZXI7dGhpcy5hbmlzb3Ryb3B5PWEuYW5pc290cm9weTt0aGlzLmZvcm1hdD1hLmZvcm1hdDt0aGlzLnR5cGU9YS50eXBlO3RoaXMub2Zmc2V0LmNvcHkoYS5vZmZzZXQpO3RoaXMucmVwZWF0LmNvcHkoYS5yZXBlYXQpO3RoaXMuY2VudGVyLmNvcHkoYS5jZW50ZXIpO3RoaXMucm90YXRpb249CmEucm90YXRpb247dGhpcy5tYXRyaXhBdXRvVXBkYXRlPWEubWF0cml4QXV0b1VwZGF0ZTt0aGlzLm1hdHJpeC5jb3B5KGEubWF0cml4KTt0aGlzLmdlbmVyYXRlTWlwbWFwcz1hLmdlbmVyYXRlTWlwbWFwczt0aGlzLnByZW11bHRpcGx5QWxwaGE9YS5wcmVtdWx0aXBseUFscGhhO3RoaXMuZmxpcFk9YS5mbGlwWTt0aGlzLnVucGFja0FsaWdubWVudD1hLnVucGFja0FsaWdubWVudDt0aGlzLmVuY29kaW5nPWEuZW5jb2Rpbmc7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXt2YXIgYz12b2lkIDA9PT1hfHwic3RyaW5nIj09PXR5cGVvZiBhO2lmKCFjJiZ2b2lkIDAhPT1hLnRleHR1cmVzW3RoaXMudXVpZF0pcmV0dXJuIGEudGV4dHVyZXNbdGhpcy51dWlkXTt2YXIgZT17bWV0YWRhdGE6e3ZlcnNpb246NC41LHR5cGU6IlRleHR1cmUiLGdlbmVyYXRvcjoiVGV4dHVyZS50b0pTT04ifSx1dWlkOnRoaXMudXVpZCxuYW1lOnRoaXMubmFtZSxtYXBwaW5nOnRoaXMubWFwcGluZywKcmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCx0eXBlOnRoaXMudHlwZSxlbmNvZGluZzp0aGlzLmVuY29kaW5nLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxwcmVtdWx0aXBseUFscGhhOnRoaXMucHJlbXVsdGlwbHlBbHBoYSx1bnBhY2tBbGlnbm1lbnQ6dGhpcy51bnBhY2tBbGlnbm1lbnR9O2lmKHZvaWQgMCE9PXRoaXMuaW1hZ2Upe3ZhciBnPXRoaXMuaW1hZ2U7dm9pZCAwPT09Zy51dWlkJiYoZy51dWlkPWhiLmdlbmVyYXRlVVVJRCgpKTtpZighYyYmdm9pZCAwPT09YS5pbWFnZXNbZy51dWlkXSl7aWYoQXJyYXkuaXNBcnJheShnKSl7dmFyIHI9CltdO2Zvcih2YXIgdj0wLHo9Zy5sZW5ndGg7djx6O3YrKylyLnB1c2goRGQuZ2V0RGF0YVVSTChnW3ZdKSl9ZWxzZSByPURkLmdldERhdGFVUkwoZyk7YS5pbWFnZXNbZy51dWlkXT17dXVpZDpnLnV1aWQsdXJsOnJ9fWUuaW1hZ2U9Zy51dWlkfWN8fChhLnRleHR1cmVzW3RoaXMudXVpZF09ZSk7cmV0dXJuIGV9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9LHRyYW5zZm9ybVV2OmZ1bmN0aW9uKGEpe2lmKDMwMCE9PXRoaXMubWFwcGluZylyZXR1cm4gYTthLmFwcGx5TWF0cml4Myh0aGlzLm1hdHJpeCk7aWYoMD5hLnh8fDE8YS54KXN3aXRjaCh0aGlzLndyYXBTKXtjYXNlIDFFMzphLngtPU1hdGguZmxvb3IoYS54KTticmVhaztjYXNlIDEwMDE6YS54PTA+YS54PzA6MTticmVhaztjYXNlIDEwMDI6YS54PTE9PT1NYXRoLmFicyhNYXRoLmZsb29yKGEueCklMik/TWF0aC5jZWlsKGEueCktYS54OmEueC1NYXRoLmZsb29yKGEueCl9aWYoMD4KYS55fHwxPGEueSlzd2l0Y2godGhpcy53cmFwVCl7Y2FzZSAxRTM6YS55LT1NYXRoLmZsb29yKGEueSk7YnJlYWs7Y2FzZSAxMDAxOmEueT0wPmEueT8wOjE7YnJlYWs7Y2FzZSAxMDAyOmEueT0xPT09TWF0aC5hYnMoTWF0aC5mbG9vcihhLnkpJTIpP01hdGguY2VpbChhLnkpLWEueTphLnktTWF0aC5mbG9vcihhLnkpfXRoaXMuZmxpcFkmJihhLnk9MS1hLnkpO3JldHVybiBhfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShsLnByb3RvdHlwZSwibmVlZHNVcGRhdGUiLHtzZXQ6ZnVuY3Rpb24oYSl7ITA9PT1hJiZ0aGlzLnZlcnNpb24rK319KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhwLnByb3RvdHlwZSx7d2lkdGg6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnp9LHNldDpmdW5jdGlvbihhKXt0aGlzLno9YX19LGhlaWdodDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMud30sc2V0OmZ1bmN0aW9uKGEpe3RoaXMudz1hfX19KTtPYmplY3QuYXNzaWduKHAucHJvdG90eXBlLAp7aXNWZWN0b3I0OiEwLHNldDpmdW5jdGlvbihhLGMsZSxnKXt0aGlzLng9YTt0aGlzLnk9Yzt0aGlzLno9ZTt0aGlzLnc9ZztyZXR1cm4gdGhpc30sc2V0U2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMudz10aGlzLno9dGhpcy55PXRoaXMueD1hO3JldHVybiB0aGlzfSxzZXRYOmZ1bmN0aW9uKGEpe3RoaXMueD1hO3JldHVybiB0aGlzfSxzZXRZOmZ1bmN0aW9uKGEpe3RoaXMueT1hO3JldHVybiB0aGlzfSxzZXRaOmZ1bmN0aW9uKGEpe3RoaXMuej1hO3JldHVybiB0aGlzfSxzZXRXOmZ1bmN0aW9uKGEpe3RoaXMudz1hO3JldHVybiB0aGlzfSxzZXRDb21wb25lbnQ6ZnVuY3Rpb24oYSxjKXtzd2l0Y2goYSl7Y2FzZSAwOnRoaXMueD1jO2JyZWFrO2Nhc2UgMTp0aGlzLnk9YzticmVhaztjYXNlIDI6dGhpcy56PWM7YnJlYWs7Y2FzZSAzOnRoaXMudz1jO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIithKTt9cmV0dXJuIHRoaXN9LGdldENvbXBvbmVudDpmdW5jdGlvbihhKXtzd2l0Y2goYSl7Y2FzZSAwOnJldHVybiB0aGlzLng7CmNhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2Nhc2UgMzpyZXR1cm4gdGhpcy53O2RlZmF1bHQ6dGhyb3cgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIithKTt9fSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLngsdGhpcy55LHRoaXMueix0aGlzLncpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMueD1hLng7dGhpcy55PWEueTt0aGlzLno9YS56O3RoaXMudz12b2lkIDAhPT1hLnc/YS53OjE7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihhLGMpe2lmKHZvaWQgMCE9PWMpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuYWRkVmVjdG9ycyhhLGMpO3RoaXMueCs9YS54O3RoaXMueSs9YS55O3RoaXMueis9YS56O3RoaXMudys9YS53O3JldHVybiB0aGlzfSwKYWRkU2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueCs9YTt0aGlzLnkrPWE7dGhpcy56Kz1hO3RoaXMudys9YTtyZXR1cm4gdGhpc30sYWRkVmVjdG9yczpmdW5jdGlvbihhLGMpe3RoaXMueD1hLngrYy54O3RoaXMueT1hLnkrYy55O3RoaXMuej1hLnorYy56O3RoaXMudz1hLncrYy53O3JldHVybiB0aGlzfSxhZGRTY2FsZWRWZWN0b3I6ZnVuY3Rpb24oYSxjKXt0aGlzLngrPWEueCpjO3RoaXMueSs9YS55KmM7dGhpcy56Kz1hLnoqYzt0aGlzLncrPWEudypjO3JldHVybiB0aGlzfSxzdWI6ZnVuY3Rpb24oYSxjKXtpZih2b2lkIDAhPT1jKXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLnN1YlZlY3RvcnMoYSxjKTt0aGlzLngtPWEueDt0aGlzLnktPWEueTt0aGlzLnotPWEuejt0aGlzLnctPWEudztyZXR1cm4gdGhpc30sc3ViU2NhbGFyOmZ1bmN0aW9uKGEpe3RoaXMueC09CmE7dGhpcy55LT1hO3RoaXMuei09YTt0aGlzLnctPWE7cmV0dXJuIHRoaXN9LHN1YlZlY3RvcnM6ZnVuY3Rpb24oYSxjKXt0aGlzLng9YS54LWMueDt0aGlzLnk9YS55LWMueTt0aGlzLno9YS56LWMuejt0aGlzLnc9YS53LWMudztyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy54Kj1hO3RoaXMueSo9YTt0aGlzLnoqPWE7dGhpcy53Kj1hO3JldHVybiB0aGlzfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy54LGU9dGhpcy55LGc9dGhpcy56LHI9dGhpcy53O2E9YS5lbGVtZW50czt0aGlzLng9YVswXSpjK2FbNF0qZSthWzhdKmcrYVsxMl0qcjt0aGlzLnk9YVsxXSpjK2FbNV0qZSthWzldKmcrYVsxM10qcjt0aGlzLno9YVsyXSpjK2FbNl0qZSthWzEwXSpnK2FbMTRdKnI7dGhpcy53PWFbM10qYythWzddKmUrYVsxMV0qZythWzE1XSpyO3JldHVybiB0aGlzfSxkaXZpZGVTY2FsYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS8KYSl9LHNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3RoaXMudz0yKk1hdGguYWNvcyhhLncpO3ZhciBjPU1hdGguc3FydCgxLWEudyphLncpOzFFLTQ+Yz8odGhpcy54PTEsdGhpcy56PXRoaXMueT0wKToodGhpcy54PWEueC9jLHRoaXMueT1hLnkvYyx0aGlzLno9YS56L2MpO3JldHVybiB0aGlzfSxzZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXg6ZnVuY3Rpb24oYSl7YT1hLmVsZW1lbnRzO3ZhciBjPWFbMF07dmFyIGU9YVs0XTt2YXIgZz1hWzhdLHI9YVsxXSx2PWFbNV0sej1hWzldO3ZhciBFPWFbMl07dmFyIEY9YVs2XTt2YXIgSj1hWzEwXTtpZiguMDE+TWF0aC5hYnMoZS1yKSYmLjAxPk1hdGguYWJzKGctRSkmJi4wMT5NYXRoLmFicyh6LUYpKXtpZiguMT5NYXRoLmFicyhlK3IpJiYuMT5NYXRoLmFicyhnK0UpJiYuMT5NYXRoLmFicyh6K0YpJiYuMT5NYXRoLmFicyhjK3YrSi0zKSlyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCksdGhpczthPU1hdGguUEk7CmM9KGMrMSkvMjt2PSh2KzEpLzI7Sj0oSisxKS8yO2U9KGUrcikvNDtnPShnK0UpLzQ7ej0oeitGKS80O2M+diYmYz5KPy4wMT5jPyhGPTAsZT1FPS43MDcxMDY3ODEpOihGPU1hdGguc3FydChjKSxFPWUvRixlPWcvRik6dj5KPy4wMT52PyhGPS43MDcxMDY3ODEsRT0wLGU9LjcwNzEwNjc4MSk6KEU9TWF0aC5zcXJ0KHYpLEY9ZS9FLGU9ei9FKTouMDE+Sj8oRT1GPS43MDcxMDY3ODEsZT0wKTooZT1NYXRoLnNxcnQoSiksRj1nL2UsRT16L2UpO3RoaXMuc2V0KEYsRSxlLGEpO3JldHVybiB0aGlzfWE9TWF0aC5zcXJ0KChGLXopKihGLXopKyhnLUUpKihnLUUpKyhyLWUpKihyLWUpKTsuMDAxPk1hdGguYWJzKGEpJiYoYT0xKTt0aGlzLng9KEYteikvYTt0aGlzLnk9KGctRSkvYTt0aGlzLno9KHItZSkvYTt0aGlzLnc9TWF0aC5hY29zKChjK3YrSi0xKS8yKTtyZXR1cm4gdGhpc30sbWluOmZ1bmN0aW9uKGEpe3RoaXMueD1NYXRoLm1pbih0aGlzLngsYS54KTt0aGlzLnk9TWF0aC5taW4odGhpcy55LAphLnkpO3RoaXMuej1NYXRoLm1pbih0aGlzLnosYS56KTt0aGlzLnc9TWF0aC5taW4odGhpcy53LGEudyk7cmV0dXJuIHRoaXN9LG1heDpmdW5jdGlvbihhKXt0aGlzLng9TWF0aC5tYXgodGhpcy54LGEueCk7dGhpcy55PU1hdGgubWF4KHRoaXMueSxhLnkpO3RoaXMuej1NYXRoLm1heCh0aGlzLnosYS56KTt0aGlzLnc9TWF0aC5tYXgodGhpcy53LGEudyk7cmV0dXJuIHRoaXN9LGNsYW1wOmZ1bmN0aW9uKGEsYyl7dGhpcy54PU1hdGgubWF4KGEueCxNYXRoLm1pbihjLngsdGhpcy54KSk7dGhpcy55PU1hdGgubWF4KGEueSxNYXRoLm1pbihjLnksdGhpcy55KSk7dGhpcy56PU1hdGgubWF4KGEueixNYXRoLm1pbihjLnosdGhpcy56KSk7dGhpcy53PU1hdGgubWF4KGEudyxNYXRoLm1pbihjLncsdGhpcy53KSk7cmV0dXJuIHRoaXN9LGNsYW1wU2NhbGFyOmZ1bmN0aW9uKGEsYyl7dGhpcy54PU1hdGgubWF4KGEsTWF0aC5taW4oYyx0aGlzLngpKTt0aGlzLnk9TWF0aC5tYXgoYSxNYXRoLm1pbihjLAp0aGlzLnkpKTt0aGlzLno9TWF0aC5tYXgoYSxNYXRoLm1pbihjLHRoaXMueikpO3RoaXMudz1NYXRoLm1heChhLE1hdGgubWluKGMsdGhpcy53KSk7cmV0dXJuIHRoaXN9LGNsYW1wTGVuZ3RoOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoZXx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgoYSxNYXRoLm1pbihjLGUpKSl9LGZsb29yOmZ1bmN0aW9uKCl7dGhpcy54PU1hdGguZmxvb3IodGhpcy54KTt0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpO3RoaXMuej1NYXRoLmZsb29yKHRoaXMueik7dGhpcy53PU1hdGguZmxvb3IodGhpcy53KTtyZXR1cm4gdGhpc30sY2VpbDpmdW5jdGlvbigpe3RoaXMueD1NYXRoLmNlaWwodGhpcy54KTt0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSk7dGhpcy56PU1hdGguY2VpbCh0aGlzLnopO3RoaXMudz1NYXRoLmNlaWwodGhpcy53KTtyZXR1cm4gdGhpc30scm91bmQ6ZnVuY3Rpb24oKXt0aGlzLng9Ck1hdGgucm91bmQodGhpcy54KTt0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpO3RoaXMuej1NYXRoLnJvdW5kKHRoaXMueik7dGhpcy53PU1hdGgucm91bmQodGhpcy53KTtyZXR1cm4gdGhpc30scm91bmRUb1plcm86ZnVuY3Rpb24oKXt0aGlzLng9MD50aGlzLng/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpO3RoaXMueT0wPnRoaXMueT9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSk7dGhpcy56PTA+dGhpcy56P01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KTt0aGlzLnc9MD50aGlzLnc/TWF0aC5jZWlsKHRoaXMudyk6TWF0aC5mbG9vcih0aGlzLncpO3JldHVybiB0aGlzfSxuZWdhdGU6ZnVuY3Rpb24oKXt0aGlzLng9LXRoaXMueDt0aGlzLnk9LXRoaXMueTt0aGlzLno9LXRoaXMuejt0aGlzLnc9LXRoaXMudztyZXR1cm4gdGhpc30sZG90OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLngqYS54K3RoaXMueSphLnkrdGhpcy56KgphLnordGhpcy53KmEud30sbGVuZ3RoU3E6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud30sbGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueit0aGlzLncqdGhpcy53KX0sbWFuaGF0dGFuTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopK01hdGguYWJzKHRoaXMudyl9LG5vcm1hbGl6ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX0sc2V0TGVuZ3RoOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKGEpfSxsZXJwOmZ1bmN0aW9uKGEsYyl7dGhpcy54Kz0oYS54LXRoaXMueCkqYzt0aGlzLnkrPShhLnktdGhpcy55KSpjO3RoaXMueis9KGEuei0KdGhpcy56KSpjO3RoaXMudys9KGEudy10aGlzLncpKmM7cmV0dXJuIHRoaXN9LGxlcnBWZWN0b3JzOmZ1bmN0aW9uKGEsYyxlKXtyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKGMsYSkubXVsdGlwbHlTY2FsYXIoZSkuYWRkKGEpfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEueD09PXRoaXMueCYmYS55PT09dGhpcy55JiZhLno9PT10aGlzLnomJmEudz09PXRoaXMud30sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7dGhpcy54PWFbY107dGhpcy55PWFbYysxXTt0aGlzLno9YVtjKzJdO3RoaXMudz1hW2MrM107cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7YVtjXT10aGlzLng7YVtjKzFdPXRoaXMueTthW2MrMl09dGhpcy56O2FbYyszXT10aGlzLnc7cmV0dXJuIGF9LGZyb21CdWZmZXJBdHRyaWJ1dGU6ZnVuY3Rpb24oYSxjLGUpe3ZvaWQgMCE9PWUmJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpOwp0aGlzLng9YS5nZXRYKGMpO3RoaXMueT1hLmdldFkoYyk7dGhpcy56PWEuZ2V0WihjKTt0aGlzLnc9YS5nZXRXKGMpO3JldHVybiB0aGlzfX0pO20ucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOm0saXNXZWJHTFJlbmRlclRhcmdldDohMCxzZXRTaXplOmZ1bmN0aW9uKGEsYyl7aWYodGhpcy53aWR0aCE9PWF8fHRoaXMuaGVpZ2h0IT09Yyl0aGlzLndpZHRoPWEsdGhpcy5oZWlnaHQ9Yyx0aGlzLnRleHR1cmUuaW1hZ2Uud2lkdGg9YSx0aGlzLnRleHR1cmUuaW1hZ2UuaGVpZ2h0PWMsdGhpcy5kaXNwb3NlKCk7dGhpcy52aWV3cG9ydC5zZXQoMCwwLGEsYyk7dGhpcy5zY2lzc29yLnNldCgwLDAsYSxjKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy53aWR0aD1hLndpZHRoO3RoaXMuaGVpZ2h0PWEuaGVpZ2h0O3RoaXMudmlld3BvcnQuY29weShhLnZpZXdwb3J0KTsKdGhpcy50ZXh0dXJlPWEudGV4dHVyZS5jbG9uZSgpO3RoaXMuZGVwdGhCdWZmZXI9YS5kZXB0aEJ1ZmZlcjt0aGlzLnN0ZW5jaWxCdWZmZXI9YS5zdGVuY2lsQnVmZmVyO3RoaXMuZGVwdGhUZXh0dXJlPWEuZGVwdGhUZXh0dXJlO3JldHVybiB0aGlzfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX0pO24ucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShtLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOm4saXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7bS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5zYW1wbGVzPWEuc2FtcGxlcztyZXR1cm4gdGhpc319KTt2YXIgcWM9bmV3IGssUWI9bmV3IHEseG09bmV3IGsoMCwwLDApLHltPW5ldyBrKDEsMSwxKSxFZD1uZXcgayxnaD1uZXcgayxmYz1uZXcgaztPYmplY3QuYXNzaWduKHEucHJvdG90eXBlLHtpc01hdHJpeDQ6ITAsCnNldDpmdW5jdGlvbihhLGMsZSxnLHIsdix6LEUsRixKLFAsUixTLFYsVyxoYSl7dmFyIGZhPXRoaXMuZWxlbWVudHM7ZmFbMF09YTtmYVs0XT1jO2ZhWzhdPWU7ZmFbMTJdPWc7ZmFbMV09cjtmYVs1XT12O2ZhWzldPXo7ZmFbMTNdPUU7ZmFbMl09RjtmYVs2XT1KO2ZhWzEwXT1QO2ZhWzE0XT1SO2ZhWzNdPVM7ZmFbN109VjtmYVsxMV09VztmYVsxNV09aGE7cmV0dXJuIHRoaXN9LGlkZW50aXR5OmZ1bmN0aW9uKCl7dGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyBxKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9LGNvcHk6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50czthPWEuZWxlbWVudHM7Y1swXT1hWzBdO2NbMV09YVsxXTtjWzJdPWFbMl07Y1szXT1hWzNdO2NbNF09YVs0XTtjWzVdPWFbNV07Y1s2XT1hWzZdO2NbN109YVs3XTtjWzhdPWFbOF07Y1s5XT1hWzldO2NbMTBdPQphWzEwXTtjWzExXT1hWzExXTtjWzEyXT1hWzEyXTtjWzEzXT1hWzEzXTtjWzE0XT1hWzE0XTtjWzE1XT1hWzE1XTtyZXR1cm4gdGhpc30sY29weVBvc2l0aW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHM7YT1hLmVsZW1lbnRzO2NbMTJdPWFbMTJdO2NbMTNdPWFbMTNdO2NbMTRdPWFbMTRdO3JldHVybiB0aGlzfSxleHRyYWN0QmFzaXM6ZnVuY3Rpb24oYSxjLGUpe2Euc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDApO2Muc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDEpO2Uuc2V0RnJvbU1hdHJpeENvbHVtbih0aGlzLDIpO3JldHVybiB0aGlzfSxtYWtlQmFzaXM6ZnVuY3Rpb24oYSxjLGUpe3RoaXMuc2V0KGEueCxjLngsZS54LDAsYS55LGMueSxlLnksMCxhLnosYy56LGUueiwwLDAsMCwwLDEpO3JldHVybiB0aGlzfSxleHRyYWN0Um90YXRpb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5lbGVtZW50cyxlPWEuZWxlbWVudHMsZz0xL3FjLnNldEZyb21NYXRyaXhDb2x1bW4oYSwKMCkubGVuZ3RoKCkscj0xL3FjLnNldEZyb21NYXRyaXhDb2x1bW4oYSwxKS5sZW5ndGgoKTthPTEvcWMuc2V0RnJvbU1hdHJpeENvbHVtbihhLDIpLmxlbmd0aCgpO2NbMF09ZVswXSpnO2NbMV09ZVsxXSpnO2NbMl09ZVsyXSpnO2NbM109MDtjWzRdPWVbNF0qcjtjWzVdPWVbNV0qcjtjWzZdPWVbNl0qcjtjWzddPTA7Y1s4XT1lWzhdKmE7Y1s5XT1lWzldKmE7Y1sxMF09ZVsxMF0qYTtjWzExXT0wO2NbMTJdPTA7Y1sxM109MDtjWzE0XT0wO2NbMTVdPTE7cmV0dXJuIHRoaXN9LG1ha2VSb3RhdGlvbkZyb21FdWxlcjpmdW5jdGlvbihhKXthJiZhLmlzRXVsZXJ8fGNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tYWtlUm90YXRpb25Gcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuIik7dmFyIGM9dGhpcy5lbGVtZW50cyxlPWEueCxnPWEueSxyPWEueix2PU1hdGguY29zKGUpO2U9TWF0aC5zaW4oZSk7CnZhciB6PU1hdGguY29zKGcpO2c9TWF0aC5zaW4oZyk7dmFyIEU9TWF0aC5jb3Mocik7cj1NYXRoLnNpbihyKTtpZigiWFlaIj09PWEub3JkZXIpe2E9dipFO3ZhciBGPXYqcixKPWUqRSxQPWUqcjtjWzBdPXoqRTtjWzRdPS16KnI7Y1s4XT1nO2NbMV09RitKKmc7Y1s1XT1hLVAqZztjWzldPS1lKno7Y1syXT1QLWEqZztjWzZdPUorRipnO2NbMTBdPXYqen1lbHNlIllYWiI9PT1hLm9yZGVyPyhhPXoqRSxGPXoqcixKPWcqRSxQPWcqcixjWzBdPWErUCplLGNbNF09SiplLUYsY1s4XT12KmcsY1sxXT12KnIsY1s1XT12KkUsY1s5XT0tZSxjWzJdPUYqZS1KLGNbNl09UCthKmUsY1sxMF09dip6KToiWlhZIj09PWEub3JkZXI/KGE9eipFLEY9eipyLEo9ZypFLFA9ZypyLGNbMF09YS1QKmUsY1s0XT0tdipyLGNbOF09SitGKmUsY1sxXT1GK0oqZSxjWzVdPXYqRSxjWzldPVAtYSplLGNbMl09LXYqZyxjWzZdPWUsY1sxMF09dip6KToiWllYIj09PWEub3JkZXI/KGE9dipFLEY9dipyLEo9ZSoKRSxQPWUqcixjWzBdPXoqRSxjWzRdPUoqZy1GLGNbOF09YSpnK1AsY1sxXT16KnIsY1s1XT1QKmcrYSxjWzldPUYqZy1KLGNbMl09LWcsY1s2XT1lKnosY1sxMF09dip6KToiWVpYIj09PWEub3JkZXI/KGE9dip6LEY9dipnLEo9ZSp6LFA9ZSpnLGNbMF09eipFLGNbNF09UC1hKnIsY1s4XT1KKnIrRixjWzFdPXIsY1s1XT12KkUsY1s5XT0tZSpFLGNbMl09LWcqRSxjWzZdPUYqcitKLGNbMTBdPWEtUCpyKToiWFpZIj09PWEub3JkZXImJihhPXYqeixGPXYqZyxKPWUqeixQPWUqZyxjWzBdPXoqRSxjWzRdPS1yLGNbOF09ZypFLGNbMV09YSpyK1AsY1s1XT12KkUsY1s5XT1GKnItSixjWzJdPUoqci1GLGNbNl09ZSpFLGNbMTBdPVAqcithKTtjWzNdPTA7Y1s3XT0wO2NbMTFdPTA7Y1sxMl09MDtjWzEzXT0wO2NbMTRdPTA7Y1sxNV09MTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb246ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuY29tcG9zZSh4bSxhLHltKX0sbG9va0F0OmZ1bmN0aW9uKGEsCmMsZSl7dmFyIGc9dGhpcy5lbGVtZW50cztmYy5zdWJWZWN0b3JzKGEsYyk7MD09PWZjLmxlbmd0aFNxKCkmJihmYy56PTEpO2ZjLm5vcm1hbGl6ZSgpO0VkLmNyb3NzVmVjdG9ycyhlLGZjKTswPT09RWQubGVuZ3RoU3EoKSYmKDE9PT1NYXRoLmFicyhlLnopP2ZjLngrPTFFLTQ6ZmMueis9MUUtNCxmYy5ub3JtYWxpemUoKSxFZC5jcm9zc1ZlY3RvcnMoZSxmYykpO0VkLm5vcm1hbGl6ZSgpO2doLmNyb3NzVmVjdG9ycyhmYyxFZCk7Z1swXT1FZC54O2dbNF09Z2gueDtnWzhdPWZjLng7Z1sxXT1FZC55O2dbNV09Z2gueTtnWzldPWZjLnk7Z1syXT1FZC56O2dbNl09Z2guejtnWzEwXT1mYy56O3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihhLGMpe3JldHVybiB2b2lkIDAhPT1jPyhjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5TWF0cmljZXMoIGEsIGIgKSBpbnN0ZWFkLiIpLAp0aGlzLm11bHRpcGx5TWF0cmljZXMoYSxjKSk6dGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsYSl9LHByZW11bHRpcGx5OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm11bHRpcGx5TWF0cmljZXMoYSx0aGlzKX0sbXVsdGlwbHlNYXRyaWNlczpmdW5jdGlvbihhLGMpe3ZhciBlPWEuZWxlbWVudHMsZz1jLmVsZW1lbnRzO2M9dGhpcy5lbGVtZW50czthPWVbMF07dmFyIHI9ZVs0XSx2PWVbOF0sej1lWzEyXSxFPWVbMV0sRj1lWzVdLEo9ZVs5XSxQPWVbMTNdLFI9ZVsyXSxTPWVbNl0sVj1lWzEwXSxXPWVbMTRdLGhhPWVbM10sZmE9ZVs3XSxyYT1lWzExXTtlPWVbMTVdO3ZhciBwYT1nWzBdLHFhPWdbNF0sdWE9Z1s4XSxvYT1nWzEyXSx0YT1nWzFdLEJhPWdbNV0sVGE9Z1s5XSxVYT1nWzEzXSxDYT1nWzJdLEhhPWdbNl0sRGE9Z1sxMF0sTWE9Z1sxNF0sZGI9Z1szXSx0Yj1nWzddLEthPWdbMTFdO2c9Z1sxNV07Y1swXT1hKnBhK3IqdGErdipDYSt6KmRiO2NbNF09YSpxYStyKkJhK3YqCkhhK3oqdGI7Y1s4XT1hKnVhK3IqVGErdipEYSt6KkthO2NbMTJdPWEqb2ErcipVYSt2Kk1hK3oqZztjWzFdPUUqcGErRip0YStKKkNhK1AqZGI7Y1s1XT1FKnFhK0YqQmErSipIYStQKnRiO2NbOV09RSp1YStGKlRhK0oqRGErUCpLYTtjWzEzXT1FKm9hK0YqVWErSipNYStQKmc7Y1syXT1SKnBhK1MqdGErVipDYStXKmRiO2NbNl09UipxYStTKkJhK1YqSGErVyp0YjtjWzEwXT1SKnVhK1MqVGErVipEYStXKkthO2NbMTRdPVIqb2ErUypVYStWKk1hK1cqZztjWzNdPWhhKnBhK2ZhKnRhK3JhKkNhK2UqZGI7Y1s3XT1oYSpxYStmYSpCYStyYSpIYStlKnRiO2NbMTFdPWhhKnVhK2ZhKlRhK3JhKkRhK2UqS2E7Y1sxNV09aGEqb2ErZmEqVWErcmEqTWErZSpnO3JldHVybiB0aGlzfSxtdWx0aXBseVNjYWxhcjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzO2NbMF0qPWE7Y1s0XSo9YTtjWzhdKj1hO2NbMTJdKj1hO2NbMV0qPWE7Y1s1XSo9YTtjWzldKj1hO2NbMTNdKj1hO2NbMl0qPQphO2NbNl0qPWE7Y1sxMF0qPWE7Y1sxNF0qPWE7Y1szXSo9YTtjWzddKj1hO2NbMTFdKj1hO2NbMTVdKj1hO3JldHVybiB0aGlzfSxhcHBseVRvQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wLGU9YS5jb3VudDtjPGU7YysrKXFjLng9YS5nZXRYKGMpLHFjLnk9YS5nZXRZKGMpLHFjLno9YS5nZXRaKGMpLHFjLmFwcGx5TWF0cml4NCh0aGlzKSxhLnNldFhZWihjLHFjLngscWMueSxxYy56KTtyZXR1cm4gYX0sZGV0ZXJtaW5hbnQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnRzLGM9YVswXSxlPWFbNF0sZz1hWzhdLHI9YVsxMl0sdj1hWzFdLHo9YVs1XSxFPWFbOV0sRj1hWzEzXSxKPWFbMl0sUD1hWzZdLFI9YVsxMF0sUz1hWzE0XTtyZXR1cm4gYVszXSooK3IqRSpQLWcqRipQLXIqeipSK2UqRipSK2cqeipTLWUqRSpTKSthWzddKigrYypFKlMtYypGKlIrcip2KlItZyp2KlMrZypGKkotcipFKkopK2FbMTFdKigrYypGKlAtYyp6KlMtcip2KlArZSp2KlMrCnIqeipKLWUqRipKKSthWzE1XSooLWcqeipKLWMqRSpQK2MqeipSK2cqdipQLWUqdipSK2UqRSpKKX0sdHJhbnNwb3NlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5lbGVtZW50czt2YXIgYz1hWzFdO2FbMV09YVs0XTthWzRdPWM7Yz1hWzJdO2FbMl09YVs4XTthWzhdPWM7Yz1hWzZdO2FbNl09YVs5XTthWzldPWM7Yz1hWzNdO2FbM109YVsxMl07YVsxMl09YztjPWFbN107YVs3XT1hWzEzXTthWzEzXT1jO2M9YVsxMV07YVsxMV09YVsxNF07YVsxNF09YztyZXR1cm4gdGhpc30sc2V0UG9zaXRpb246ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuZWxlbWVudHM7YS5pc1ZlY3RvcjM/KGdbMTJdPWEueCxnWzEzXT1hLnksZ1sxNF09YS56KTooZ1sxMl09YSxnWzEzXT1jLGdbMTRdPWUpO3JldHVybiB0aGlzfSxnZXRJbnZlcnNlOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5lbGVtZW50cyxnPWEuZWxlbWVudHM7YT1nWzBdO3ZhciByPWdbMV0sdj1nWzJdLHo9Z1szXSxFPWdbNF0sRj1nWzVdLApKPWdbNl0sUD1nWzddLFI9Z1s4XSxTPWdbOV0sVj1nWzEwXSxXPWdbMTFdLGhhPWdbMTJdLGZhPWdbMTNdLHJhPWdbMTRdO2c9Z1sxNV07dmFyIHBhPVMqcmEqUC1mYSpWKlArZmEqSipXLUYqcmEqVy1TKkoqZytGKlYqZyxxYT1oYSpWKlAtUipyYSpQLWhhKkoqVytFKnJhKlcrUipKKmctRSpWKmcsdWE9UipmYSpQLWhhKlMqUCtoYSpGKlctRSpmYSpXLVIqRipnK0UqUypnLG9hPWhhKlMqSi1SKmZhKkotaGEqRipWK0UqZmEqVitSKkYqcmEtRSpTKnJhLHRhPWEqcGErcipxYSt2KnVhK3oqb2E7aWYoMD09PXRhKXtpZighMD09PWMpdGhyb3cgRXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5nZXRJbnZlcnNlKCkgY2FuJ3QgaW52ZXJ0IG1hdHJpeCwgZGV0ZXJtaW5hbnQgaXMgMCIpO2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwIik7cmV0dXJuIHRoaXMuaWRlbnRpdHkoKX1jPTEvdGE7ZVswXT0KcGEqYztlWzFdPShmYSpWKnotUypyYSp6LWZhKnYqVytyKnJhKlcrUyp2KmctcipWKmcpKmM7ZVsyXT0oRipyYSp6LWZhKkoqeitmYSp2KlAtcipyYSpQLUYqdipnK3IqSipnKSpjO2VbM109KFMqSip6LUYqVip6LVMqdipQK3IqVipQK0YqdipXLXIqSipXKSpjO2VbNF09cWEqYztlWzVdPShSKnJhKnotaGEqVip6K2hhKnYqVy1hKnJhKlctUip2KmcrYSpWKmcpKmM7ZVs2XT0oaGEqSip6LUUqcmEqei1oYSp2KlArYSpyYSpQK0UqdipnLWEqSipnKSpjO2VbN109KEUqVip6LVIqSip6K1IqdipQLWEqVipQLUUqdipXK2EqSipXKSpjO2VbOF09dWEqYztlWzldPShoYSpTKnotUipmYSp6LWhhKnIqVythKmZhKlcrUipyKmctYSpTKmcpKmM7ZVsxMF09KEUqZmEqei1oYSpGKnoraGEqcipQLWEqZmEqUC1FKnIqZythKkYqZykqYztlWzExXT0oUipGKnotRSpTKnotUipyKlArYSpTKlArRSpyKlctYSpGKlcpKmM7ZVsxMl09b2EqYztlWzEzXT0oUipmYSp2LWhhKlMqditoYSpyKlYtYSpmYSpWLQpSKnIqcmErYSpTKnJhKSpjO2VbMTRdPShoYSpGKnYtRSpmYSp2LWhhKnIqSithKmZhKkorRSpyKnJhLWEqRipyYSkqYztlWzE1XT0oRSpTKnYtUipGKnYrUipyKkotYSpTKkotRSpyKlYrYSpGKlYpKmM7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuZWxlbWVudHMsZT1hLngsZz1hLnk7YT1hLno7Y1swXSo9ZTtjWzRdKj1nO2NbOF0qPWE7Y1sxXSo9ZTtjWzVdKj1nO2NbOV0qPWE7Y1syXSo9ZTtjWzZdKj1nO2NbMTBdKj1hO2NbM10qPWU7Y1s3XSo9ZztjWzExXSo9YTtyZXR1cm4gdGhpc30sZ2V0TWF4U2NhbGVPbkF4aXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmVsZW1lbnRzO3JldHVybiBNYXRoLnNxcnQoTWF0aC5tYXgoYVswXSphWzBdK2FbMV0qYVsxXSthWzJdKmFbMl0sYVs0XSphWzRdK2FbNV0qYVs1XSthWzZdKmFbNl0sYVs4XSphWzhdK2FbOV0qYVs5XSthWzEwXSphWzEwXSkpfSxtYWtlVHJhbnNsYXRpb246ZnVuY3Rpb24oYSxjLGUpe3RoaXMuc2V0KDEsCjAsMCxhLDAsMSwwLGMsMCwwLDEsZSwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWDpmdW5jdGlvbihhKXt2YXIgYz1NYXRoLmNvcyhhKTthPU1hdGguc2luKGEpO3RoaXMuc2V0KDEsMCwwLDAsMCxjLC1hLDAsMCxhLGMsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWTpmdW5jdGlvbihhKXt2YXIgYz1NYXRoLmNvcyhhKTthPU1hdGguc2luKGEpO3RoaXMuc2V0KGMsMCxhLDAsMCwxLDAsMCwtYSwwLGMsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uWjpmdW5jdGlvbihhKXt2YXIgYz1NYXRoLmNvcyhhKTthPU1hdGguc2luKGEpO3RoaXMuc2V0KGMsLWEsMCwwLGEsYywwLDAsMCwwLDEsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVJvdGF0aW9uQXhpczpmdW5jdGlvbihhLGMpe3ZhciBlPU1hdGguY29zKGMpO2M9TWF0aC5zaW4oYyk7dmFyIGc9MS1lLHI9YS54LHY9YS55O2E9YS56O3ZhciB6PWcqcixFPWcqdjt0aGlzLnNldCh6KgpyK2Useip2LWMqYSx6KmErYyp2LDAseip2K2MqYSxFKnYrZSxFKmEtYypyLDAseiphLWMqdixFKmErYypyLGcqYSphK2UsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVNjYWxlOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnNldChhLDAsMCwwLDAsYywwLDAsMCwwLGUsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sbWFrZVNoZWFyOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnNldCgxLGMsZSwwLGEsMSxlLDAsYSxjLDEsMCwwLDAsMCwxKTtyZXR1cm4gdGhpc30sY29tcG9zZTpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5lbGVtZW50cyxyPWMuX3gsdj1jLl95LHo9Yy5feixFPWMuX3csRj1yK3IsSj12K3YsUD16K3o7Yz1yKkY7dmFyIFI9cipKO3IqPVA7dmFyIFM9dipKO3YqPVA7eio9UDtGKj1FO0oqPUU7RSo9UDtQPWUueDt2YXIgVj1lLnk7ZT1lLno7Z1swXT0oMS0oUyt6KSkqUDtnWzFdPShSK0UpKlA7Z1syXT0oci1KKSpQO2dbM109MDtnWzRdPShSLUUpKlY7Z1s1XT0oMS0oYyt6KSkqClY7Z1s2XT0oditGKSpWO2dbN109MDtnWzhdPShyK0opKmU7Z1s5XT0odi1GKSplO2dbMTBdPSgxLShjK1MpKSplO2dbMTFdPTA7Z1sxMl09YS54O2dbMTNdPWEueTtnWzE0XT1hLno7Z1sxNV09MTtyZXR1cm4gdGhpc30sZGVjb21wb3NlOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLmVsZW1lbnRzLHI9cWMuc2V0KGdbMF0sZ1sxXSxnWzJdKS5sZW5ndGgoKSx2PXFjLnNldChnWzRdLGdbNV0sZ1s2XSkubGVuZ3RoKCksej1xYy5zZXQoZ1s4XSxnWzldLGdbMTBdKS5sZW5ndGgoKTswPnRoaXMuZGV0ZXJtaW5hbnQoKSYmKHI9LXIpO2EueD1nWzEyXTthLnk9Z1sxM107YS56PWdbMTRdO1FiLmNvcHkodGhpcyk7YT0xL3I7Zz0xL3Y7dmFyIEU9MS96O1FiLmVsZW1lbnRzWzBdKj1hO1FiLmVsZW1lbnRzWzFdKj1hO1FiLmVsZW1lbnRzWzJdKj1hO1FiLmVsZW1lbnRzWzRdKj1nO1FiLmVsZW1lbnRzWzVdKj1nO1FiLmVsZW1lbnRzWzZdKj1nO1FiLmVsZW1lbnRzWzhdKj1FO1FiLmVsZW1lbnRzWzldKj0KRTtRYi5lbGVtZW50c1sxMF0qPUU7Yy5zZXRGcm9tUm90YXRpb25NYXRyaXgoUWIpO2UueD1yO2UueT12O2Uuej16O3JldHVybiB0aGlzfSxtYWtlUGVyc3BlY3RpdmU6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe3ZvaWQgMD09PXYmJmNvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm1ha2VQZXJzcGVjdGl2ZSgpIGhhcyBiZWVuIHJlZGVmaW5lZCBhbmQgaGFzIGEgbmV3IHNpZ25hdHVyZS4gUGxlYXNlIGNoZWNrIHRoZSBkb2NzLiIpO3ZhciB6PXRoaXMuZWxlbWVudHM7elswXT0yKnIvKGMtYSk7els0XT0wO3pbOF09KGMrYSkvKGMtYSk7elsxMl09MDt6WzFdPTA7els1XT0yKnIvKGUtZyk7els5XT0oZStnKS8oZS1nKTt6WzEzXT0wO3pbMl09MDt6WzZdPTA7elsxMF09LSh2K3IpLyh2LXIpO3pbMTRdPS0yKnYqci8odi1yKTt6WzNdPTA7els3XT0wO3pbMTFdPS0xO3pbMTVdPTA7cmV0dXJuIHRoaXN9LG1ha2VPcnRob2dyYXBoaWM6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe3ZhciB6PQp0aGlzLmVsZW1lbnRzLEU9MS8oYy1hKSxGPTEvKGUtZyksSj0xLyh2LXIpO3pbMF09MipFO3pbNF09MDt6WzhdPTA7elsxMl09LSgoYythKSpFKTt6WzFdPTA7els1XT0yKkY7els5XT0wO3pbMTNdPS0oKGUrZykqRik7elsyXT0wO3pbNl09MDt6WzEwXT0tMipKO3pbMTRdPS0oKHYrcikqSik7elszXT0wO3pbN109MDt6WzExXT0wO3pbMTVdPTE7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXt2YXIgYz10aGlzLmVsZW1lbnRzO2E9YS5lbGVtZW50cztmb3IodmFyIGU9MDsxNj5lO2UrKylpZihjW2VdIT09YVtlXSlyZXR1cm4hMTtyZXR1cm4hMH0sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7Zm9yKHZhciBlPTA7MTY+ZTtlKyspdGhpcy5lbGVtZW50c1tlXT1hW2UrY107cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7dmFyIGU9dGhpcy5lbGVtZW50czthW2NdPWVbMF07CmFbYysxXT1lWzFdO2FbYysyXT1lWzJdO2FbYyszXT1lWzNdO2FbYys0XT1lWzRdO2FbYys1XT1lWzVdO2FbYys2XT1lWzZdO2FbYys3XT1lWzddO2FbYys4XT1lWzhdO2FbYys5XT1lWzldO2FbYysxMF09ZVsxMF07YVtjKzExXT1lWzExXTthW2MrMTJdPWVbMTJdO2FbYysxM109ZVsxM107YVtjKzE0XT1lWzE0XTthW2MrMTVdPWVbMTVdO3JldHVybiBhfX0pO3ZhciBjaz1uZXcgcSxkaz1uZXcgaDt1LlJvdGF0aW9uT3JkZXJzPSJYWVogWVpYIFpYWSBYWlkgWVhaIFpZWCIuc3BsaXQoIiAiKTt1LkRlZmF1bHRPcmRlcj0iWFlaIjtPYmplY3QuZGVmaW5lUHJvcGVydGllcyh1LnByb3RvdHlwZSx7eDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3h9LHNldDpmdW5jdGlvbihhKXt0aGlzLl94PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0seTp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3l9LHNldDpmdW5jdGlvbihhKXt0aGlzLl95PWE7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfX0sCno6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl96fSxzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5fej1hO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19LG9yZGVyOntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb3JkZXJ9LHNldDpmdW5jdGlvbihhKXt0aGlzLl9vcmRlcj1hO3RoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX19fSk7T2JqZWN0LmFzc2lnbih1LnByb3RvdHlwZSx7aXNFdWxlcjohMCxzZXQ6ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5feD1hO3RoaXMuX3k9Yzt0aGlzLl96PWU7dGhpcy5fb3JkZXI9Z3x8dGhpcy5fb3JkZXI7dGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl9vcmRlcil9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5feD1hLl94O3RoaXMuX3k9YS5feTt0aGlzLl96PWEuX3o7dGhpcy5fb3JkZXI9YS5fb3JkZXI7CnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTtyZXR1cm4gdGhpc30sc2V0RnJvbVJvdGF0aW9uTWF0cml4OmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz1oYi5jbGFtcCxyPWEuZWxlbWVudHM7YT1yWzBdO3ZhciB2PXJbNF0sej1yWzhdLEU9clsxXSxGPXJbNV0sSj1yWzldLFA9clsyXSxSPXJbNl07cj1yWzEwXTtjPWN8fHRoaXMuX29yZGVyOyJYWVoiPT09Yz8odGhpcy5feT1NYXRoLmFzaW4oZyh6LC0xLDEpKSwuOTk5OTk5OT5NYXRoLmFicyh6KT8odGhpcy5feD1NYXRoLmF0YW4yKC1KLHIpLHRoaXMuX3o9TWF0aC5hdGFuMigtdixhKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihSLEYpLHRoaXMuX3o9MCkpOiJZWFoiPT09Yz8odGhpcy5feD1NYXRoLmFzaW4oLWcoSiwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoSik/KHRoaXMuX3k9TWF0aC5hdGFuMih6LHIpLHRoaXMuX3o9TWF0aC5hdGFuMihFLEYpKToodGhpcy5feT1NYXRoLmF0YW4yKC1QLGEpLHRoaXMuX3o9MCkpOiJaWFkiPT09Yz8odGhpcy5feD0KTWF0aC5hc2luKGcoUiwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoUik/KHRoaXMuX3k9TWF0aC5hdGFuMigtUCxyKSx0aGlzLl96PU1hdGguYXRhbjIoLXYsRikpOih0aGlzLl95PTAsdGhpcy5fej1NYXRoLmF0YW4yKEUsYSkpKToiWllYIj09PWM/KHRoaXMuX3k9TWF0aC5hc2luKC1nKFAsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKFApPyh0aGlzLl94PU1hdGguYXRhbjIoUixyKSx0aGlzLl96PU1hdGguYXRhbjIoRSxhKSk6KHRoaXMuX3g9MCx0aGlzLl96PU1hdGguYXRhbjIoLXYsRikpKToiWVpYIj09PWM/KHRoaXMuX3o9TWF0aC5hc2luKGcoRSwtMSwxKSksLjk5OTk5OTk+TWF0aC5hYnMoRSk/KHRoaXMuX3g9TWF0aC5hdGFuMigtSixGKSx0aGlzLl95PU1hdGguYXRhbjIoLVAsYSkpOih0aGlzLl94PTAsdGhpcy5feT1NYXRoLmF0YW4yKHoscikpKToiWFpZIj09PWM/KHRoaXMuX3o9TWF0aC5hc2luKC1nKHYsLTEsMSkpLC45OTk5OTk5Pk1hdGguYWJzKHYpPyh0aGlzLl94PQpNYXRoLmF0YW4yKFIsRiksdGhpcy5feT1NYXRoLmF0YW4yKHosYSkpOih0aGlzLl94PU1hdGguYXRhbjIoLUosciksdGhpcy5feT0wKSk6Y29uc29sZS53YXJuKCJUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGdpdmVuIHVuc3VwcG9ydGVkIG9yZGVyOiAiK2MpO3RoaXMuX29yZGVyPWM7ITEhPT1lJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHNldEZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEsYyxlKXtjay5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbihhKTtyZXR1cm4gdGhpcy5zZXRGcm9tUm90YXRpb25NYXRyaXgoY2ssYyxlKX0sc2V0RnJvbVZlY3RvcjM6ZnVuY3Rpb24oYSxjKXtyZXR1cm4gdGhpcy5zZXQoYS54LGEueSxhLnosY3x8dGhpcy5fb3JkZXIpfSxyZW9yZGVyOmZ1bmN0aW9uKGEpe2RrLnNldEZyb21FdWxlcih0aGlzKTtyZXR1cm4gdGhpcy5zZXRGcm9tUXVhdGVybmlvbihkayxhKX0sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLl94PT09CnRoaXMuX3gmJmEuX3k9PT10aGlzLl95JiZhLl96PT09dGhpcy5feiYmYS5fb3JkZXI9PT10aGlzLl9vcmRlcn0sZnJvbUFycmF5OmZ1bmN0aW9uKGEpe3RoaXMuX3g9YVswXTt0aGlzLl95PWFbMV07dGhpcy5fej1hWzJdO3ZvaWQgMCE9PWFbM10mJih0aGlzLl9vcmRlcj1hWzNdKTt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7cmV0dXJuIHRoaXN9LHRvQXJyYXk6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1hJiYoYT1bXSk7dm9pZCAwPT09YyYmKGM9MCk7YVtjXT10aGlzLl94O2FbYysxXT10aGlzLl95O2FbYysyXT10aGlzLl96O2FbYyszXT10aGlzLl9vcmRlcjtyZXR1cm4gYX0sdG9WZWN0b3IzOmZ1bmN0aW9uKGEpe3JldHVybiBhP2Euc2V0KHRoaXMuX3gsdGhpcy5feSx0aGlzLl96KTpuZXcgayh0aGlzLl94LHRoaXMuX3ksdGhpcy5feil9LF9vbkNoYW5nZTpmdW5jdGlvbihhKXt0aGlzLl9vbkNoYW5nZUNhbGxiYWNrPWE7cmV0dXJuIHRoaXN9LF9vbkNoYW5nZUNhbGxiYWNrOmZ1bmN0aW9uKCl7fX0pOwpPYmplY3QuYXNzaWduKHgucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYSl7dGhpcy5tYXNrPTE8PGF8MH0sZW5hYmxlOmZ1bmN0aW9uKGEpe3RoaXMubWFzaz10aGlzLm1hc2t8MTw8YXwwfSxlbmFibGVBbGw6ZnVuY3Rpb24oKXt0aGlzLm1hc2s9LTF9LHRvZ2dsZTpmdW5jdGlvbihhKXt0aGlzLm1hc2tePTE8PGF8MH0sZGlzYWJsZTpmdW5jdGlvbihhKXt0aGlzLm1hc2smPX4oMTw8YXwwKX0sZGlzYWJsZUFsbDpmdW5jdGlvbigpe3RoaXMubWFzaz0wfSx0ZXN0OmZ1bmN0aW9uKGEpe3JldHVybiAwIT09KHRoaXMubWFzayZhLm1hc2spfX0pO3ZhciBPaz0wLGVrPW5ldyBrLGZmPW5ldyBoLGpkPW5ldyBxLGhoPW5ldyBrLGtnPW5ldyBrLHptPW5ldyBrLEFtPW5ldyBoLGZrPW5ldyBrKDEsMCwwKSxnaz1uZXcgaygwLDEsMCksaGs9bmV3IGsoMCwwLDEpLEJtPXt0eXBlOiJhZGRlZCJ9LENtPXt0eXBlOiJyZW1vdmVkIn07QS5EZWZhdWx0VXA9bmV3IGsoMCwxLDApO0EuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGU9CiEwO0EucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkEsaXNPYmplY3QzRDohMCxvbkJlZm9yZVJlbmRlcjpmdW5jdGlvbigpe30sb25BZnRlclJlbmRlcjpmdW5jdGlvbigpe30sYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYSl7dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiZ0aGlzLnVwZGF0ZU1hdHJpeCgpO3RoaXMubWF0cml4LnByZW11bHRpcGx5KGEpO3RoaXMubWF0cml4LmRlY29tcG9zZSh0aGlzLnBvc2l0aW9uLHRoaXMucXVhdGVybmlvbix0aGlzLnNjYWxlKX0sYXBwbHlRdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3RoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShhKTtyZXR1cm4gdGhpc30sc2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlOmZ1bmN0aW9uKGEsYyl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoYSxjKX0sc2V0Um90YXRpb25Gcm9tRXVsZXI6ZnVuY3Rpb24oYSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21FdWxlcihhLAohMCl9LHNldFJvdGF0aW9uRnJvbU1hdHJpeDpmdW5jdGlvbihhKXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KGEpfSxzZXRSb3RhdGlvbkZyb21RdWF0ZXJuaW9uOmZ1bmN0aW9uKGEpe3RoaXMucXVhdGVybmlvbi5jb3B5KGEpfSxyb3RhdGVPbkF4aXM6ZnVuY3Rpb24oYSxjKXtmZi5zZXRGcm9tQXhpc0FuZ2xlKGEsYyk7dGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KGZmKTtyZXR1cm4gdGhpc30scm90YXRlT25Xb3JsZEF4aXM6ZnVuY3Rpb24oYSxjKXtmZi5zZXRGcm9tQXhpc0FuZ2xlKGEsYyk7dGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KGZmKTtyZXR1cm4gdGhpc30scm90YXRlWDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoZmssYSl9LHJvdGF0ZVk6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKGdrLGEpfSxyb3RhdGVaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhoayxhKX0sdHJhbnNsYXRlT25BeGlzOmZ1bmN0aW9uKGEsCmMpe2VrLmNvcHkoYSkuYXBwbHlRdWF0ZXJuaW9uKHRoaXMucXVhdGVybmlvbik7dGhpcy5wb3NpdGlvbi5hZGQoZWsubXVsdGlwbHlTY2FsYXIoYykpO3JldHVybiB0aGlzfSx0cmFuc2xhdGVYOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyhmayxhKX0sdHJhbnNsYXRlWTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoZ2ssYSl9LHRyYW5zbGF0ZVo6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGhrLGEpfSxsb2NhbFRvV29ybGQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpfSx3b3JsZFRvTG9jYWw6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KGpkLmdldEludmVyc2UodGhpcy5tYXRyaXhXb3JsZCkpfSxsb29rQXQ6ZnVuY3Rpb24oYSxjLGUpe2EuaXNWZWN0b3IzP2hoLmNvcHkoYSk6aGguc2V0KGEsYyxlKTthPXRoaXMucGFyZW50O3RoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsCiExKTtrZy5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7dGhpcy5pc0NhbWVyYXx8dGhpcy5pc0xpZ2h0P2pkLmxvb2tBdChrZyxoaCx0aGlzLnVwKTpqZC5sb29rQXQoaGgsa2csdGhpcy51cCk7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeChqZCk7YSYmKGpkLmV4dHJhY3RSb3RhdGlvbihhLm1hdHJpeFdvcmxkKSxmZi5zZXRGcm9tUm90YXRpb25NYXRyaXgoamQpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShmZi5pbnZlcnNlKCkpKX0sYWRkOmZ1bmN0aW9uKGEpe2lmKDE8YXJndW1lbnRzLmxlbmd0aCl7Zm9yKHZhciBjPTA7Yzxhcmd1bWVudHMubGVuZ3RoO2MrKyl0aGlzLmFkZChhcmd1bWVudHNbY10pO3JldHVybiB0aGlzfWlmKGE9PT10aGlzKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi4iLGEpLHRoaXM7YSYmYS5pc09iamVjdDNEPwoobnVsbCE9PWEucGFyZW50JiZhLnBhcmVudC5yZW1vdmUoYSksYS5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2goYSksYS5kaXNwYXRjaEV2ZW50KEJtKSk6Y29uc29sZS5lcnJvcigiVEhSRUUuT2JqZWN0M0QuYWRkOiBvYmplY3Qgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLk9iamVjdDNELiIsYSk7cmV0dXJuIHRoaXN9LHJlbW92ZTpmdW5jdGlvbihhKXtpZigxPGFyZ3VtZW50cy5sZW5ndGgpe2Zvcih2YXIgYz0wO2M8YXJndW1lbnRzLmxlbmd0aDtjKyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW2NdKTtyZXR1cm4gdGhpc31jPXRoaXMuY2hpbGRyZW4uaW5kZXhPZihhKTstMSE9PWMmJihhLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGMsMSksYS5kaXNwYXRjaEV2ZW50KENtKSk7cmV0dXJuIHRoaXN9LGF0dGFjaDpmdW5jdGlvbihhKXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtqZC5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpO251bGwhPT0KYS5wYXJlbnQmJihhLnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksamQubXVsdGlwbHkoYS5wYXJlbnQubWF0cml4V29ybGQpKTthLmFwcGx5TWF0cml4KGpkKTthLnVwZGF0ZVdvcmxkTWF0cml4KCExLCExKTt0aGlzLmFkZChhKTtyZXR1cm4gdGhpc30sZ2V0T2JqZWN0QnlJZDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJpZCIsYSl9LGdldE9iamVjdEJ5TmFtZTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIixhKX0sZ2V0T2JqZWN0QnlQcm9wZXJ0eTpmdW5jdGlvbihhLGMpe2lmKHRoaXNbYV09PT1jKXJldHVybiB0aGlzO2Zvcih2YXIgZT0wLGc9dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZTxnO2UrKyl7dmFyIHI9dGhpcy5jaGlsZHJlbltlXS5nZXRPYmplY3RCeVByb3BlcnR5KGEsYyk7aWYodm9pZCAwIT09cilyZXR1cm4gcn19LGdldFdvcmxkUG9zaXRpb246ZnVuY3Rpb24oYSl7dm9pZCAwPT09CmEmJihjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAuZ2V0V29ybGRQb3NpdGlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtyZXR1cm4gYS5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCl9LGdldFdvcmxkUXVhdGVybmlvbjpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUXVhdGVybmlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBoKTt0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTt0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShrZyxhLHptKTtyZXR1cm4gYX0sZ2V0V29ybGRTY2FsZTpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkU2NhbGUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7dGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCk7CnRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKGtnLEFtLGEpO3JldHVybiBhfSxnZXRXb3JsZERpcmVjdGlvbjpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9bmV3IGspO3RoaXMudXBkYXRlTWF0cml4V29ybGQoITApO3ZhciBjPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIGEuc2V0KGNbOF0sY1s5XSxjWzEwXSkubm9ybWFsaXplKCl9LHJheWNhc3Q6ZnVuY3Rpb24oKXt9LHRyYXZlcnNlOmZ1bmN0aW9uKGEpe2EodGhpcyk7Zm9yKHZhciBjPXRoaXMuY2hpbGRyZW4sZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKyljW2VdLnRyYXZlcnNlKGEpfSx0cmF2ZXJzZVZpc2libGU6ZnVuY3Rpb24oYSl7aWYoITEhPT10aGlzLnZpc2libGUpe2EodGhpcyk7Zm9yKHZhciBjPXRoaXMuY2hpbGRyZW4sZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKyljW2VdLnRyYXZlcnNlVmlzaWJsZShhKX19LAp0cmF2ZXJzZUFuY2VzdG9yczpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnBhcmVudDtudWxsIT09YyYmKGEoYyksYy50cmF2ZXJzZUFuY2VzdG9ycyhhKSl9LHVwZGF0ZU1hdHJpeDpmdW5jdGlvbigpe3RoaXMubWF0cml4LmNvbXBvc2UodGhpcy5wb3NpdGlvbix0aGlzLnF1YXRlcm5pb24sdGhpcy5zY2FsZSk7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCk7aWYodGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlfHxhKW51bGw9PT10aGlzLnBhcmVudD90aGlzLm1hdHJpeFdvcmxkLmNvcHkodGhpcy5tYXRyaXgpOnRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyh0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCx0aGlzLm1hdHJpeCksdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLGE9ITA7Zm9yKHZhciBjPXRoaXMuY2hpbGRyZW4sZT0KMCxnPWMubGVuZ3RoO2U8ZztlKyspY1tlXS51cGRhdGVNYXRyaXhXb3JsZChhKX0sdXBkYXRlV29ybGRNYXRyaXg6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLnBhcmVudDshMD09PWEmJm51bGwhPT1lJiZlLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCk7bnVsbD09PXRoaXMucGFyZW50P3RoaXMubWF0cml4V29ybGQuY29weSh0aGlzLm1hdHJpeCk6dGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKHRoaXMucGFyZW50Lm1hdHJpeFdvcmxkLHRoaXMubWF0cml4KTtpZighMD09PWMpZm9yKGE9dGhpcy5jaGlsZHJlbixjPTAsZT1hLmxlbmd0aDtjPGU7YysrKWFbY10udXBkYXRlV29ybGRNYXRyaXgoITEsITApfSx0b0pTT046ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhQLFIpe3ZvaWQgMD09PVBbUi51dWlkXSYmKFBbUi51dWlkXT1SLnRvSlNPTihhKSk7cmV0dXJuIFIudXVpZH1mdW5jdGlvbiBlKFApe3ZhciBSPQpbXSxTO2ZvcihTIGluIFApe3ZhciBWPVBbU107ZGVsZXRlIFYubWV0YWRhdGE7Ui5wdXNoKFYpfXJldHVybiBSfXZhciBnPXZvaWQgMD09PWF8fCJzdHJpbmciPT09dHlwZW9mIGEscj17fTtnJiYoYT17Z2VvbWV0cmllczp7fSxtYXRlcmlhbHM6e30sdGV4dHVyZXM6e30saW1hZ2VzOnt9LHNoYXBlczp7fX0sci5tZXRhZGF0YT17dmVyc2lvbjo0LjUsdHlwZToiT2JqZWN0IixnZW5lcmF0b3I6Ik9iamVjdDNELnRvSlNPTiJ9KTt2YXIgdj17fTt2LnV1aWQ9dGhpcy51dWlkO3YudHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJih2Lm5hbWU9dGhpcy5uYW1lKTshMD09PXRoaXMuY2FzdFNoYWRvdyYmKHYuY2FzdFNoYWRvdz0hMCk7ITA9PT10aGlzLnJlY2VpdmVTaGFkb3cmJih2LnJlY2VpdmVTaGFkb3c9ITApOyExPT09dGhpcy52aXNpYmxlJiYodi52aXNpYmxlPSExKTshMT09PXRoaXMuZnJ1c3R1bUN1bGxlZCYmKHYuZnJ1c3R1bUN1bGxlZD0hMSk7MCE9PXRoaXMucmVuZGVyT3JkZXImJgoodi5yZW5kZXJPcmRlcj10aGlzLnJlbmRlck9yZGVyKTsie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJih2LnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO3YubGF5ZXJzPXRoaXMubGF5ZXJzLm1hc2s7di5tYXRyaXg9dGhpcy5tYXRyaXgudG9BcnJheSgpOyExPT09dGhpcy5tYXRyaXhBdXRvVXBkYXRlJiYodi5tYXRyaXhBdXRvVXBkYXRlPSExKTt0aGlzLmlzTWVzaCYmMCE9PXRoaXMuZHJhd01vZGUmJih2LmRyYXdNb2RlPXRoaXMuZHJhd01vZGUpO2lmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7di5nZW9tZXRyeT1jKGEuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTt2YXIgej10aGlzLmdlb21ldHJ5LnBhcmFtZXRlcnM7aWYodm9pZCAwIT09eiYmdm9pZCAwIT09ei5zaGFwZXMpaWYoej16LnNoYXBlcyxBcnJheS5pc0FycmF5KHopKWZvcih2YXIgRT0wLEY9ei5sZW5ndGg7RTxGO0UrKyljKGEuc2hhcGVzLHpbRV0pO2Vsc2UgYyhhLnNoYXBlcywKeil9aWYodm9pZCAwIT09dGhpcy5tYXRlcmlhbClpZihBcnJheS5pc0FycmF5KHRoaXMubWF0ZXJpYWwpKXt6PVtdO0U9MDtmb3IoRj10aGlzLm1hdGVyaWFsLmxlbmd0aDtFPEY7RSsrKXoucHVzaChjKGEubWF0ZXJpYWxzLHRoaXMubWF0ZXJpYWxbRV0pKTt2Lm1hdGVyaWFsPXp9ZWxzZSB2Lm1hdGVyaWFsPWMoYS5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbCk7aWYoMDx0aGlzLmNoaWxkcmVuLmxlbmd0aClmb3Iodi5jaGlsZHJlbj1bXSxFPTA7RTx0aGlzLmNoaWxkcmVuLmxlbmd0aDtFKyspdi5jaGlsZHJlbi5wdXNoKHRoaXMuY2hpbGRyZW5bRV0udG9KU09OKGEpLm9iamVjdCk7aWYoZyl7Zz1lKGEuZ2VvbWV0cmllcyk7RT1lKGEubWF0ZXJpYWxzKTtGPWUoYS50ZXh0dXJlcyk7dmFyIEo9ZShhLmltYWdlcyk7ej1lKGEuc2hhcGVzKTswPGcubGVuZ3RoJiYoci5nZW9tZXRyaWVzPWcpOzA8RS5sZW5ndGgmJihyLm1hdGVyaWFscz1FKTswPEYubGVuZ3RoJiYoci50ZXh0dXJlcz1GKTsKMDxKLmxlbmd0aCYmKHIuaW1hZ2VzPUopOzA8ei5sZW5ndGgmJihyLnNoYXBlcz16KX1yLm9iamVjdD12O3JldHVybiByfSxjbG9uZTpmdW5jdGlvbihhKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyxhKX0sY29weTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPSEwKTt0aGlzLm5hbWU9YS5uYW1lO3RoaXMudXAuY29weShhLnVwKTt0aGlzLnBvc2l0aW9uLmNvcHkoYS5wb3NpdGlvbik7dGhpcy5xdWF0ZXJuaW9uLmNvcHkoYS5xdWF0ZXJuaW9uKTt0aGlzLnNjYWxlLmNvcHkoYS5zY2FsZSk7dGhpcy5tYXRyaXguY29weShhLm1hdHJpeCk7dGhpcy5tYXRyaXhXb3JsZC5jb3B5KGEubWF0cml4V29ybGQpO3RoaXMubWF0cml4QXV0b1VwZGF0ZT1hLm1hdHJpeEF1dG9VcGRhdGU7dGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPWEubWF0cml4V29ybGROZWVkc1VwZGF0ZTt0aGlzLmxheWVycy5tYXNrPWEubGF5ZXJzLm1hc2s7dGhpcy52aXNpYmxlPWEudmlzaWJsZTsKdGhpcy5jYXN0U2hhZG93PWEuY2FzdFNoYWRvdzt0aGlzLnJlY2VpdmVTaGFkb3c9YS5yZWNlaXZlU2hhZG93O3RoaXMuZnJ1c3R1bUN1bGxlZD1hLmZydXN0dW1DdWxsZWQ7dGhpcy5yZW5kZXJPcmRlcj1hLnJlbmRlck9yZGVyO3RoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShhLnVzZXJEYXRhKSk7aWYoITA9PT1jKWZvcihjPTA7YzxhLmNoaWxkcmVuLmxlbmd0aDtjKyspdGhpcy5hZGQoYS5jaGlsZHJlbltjXS5jbG9uZSgpKTtyZXR1cm4gdGhpc319KTt5LnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp5LGlzU2NlbmU6ITAsY29weTpmdW5jdGlvbihhLGMpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEsYyk7bnVsbCE9PWEuYmFja2dyb3VuZCYmKHRoaXMuYmFja2dyb3VuZD1hLmJhY2tncm91bmQuY2xvbmUoKSk7bnVsbCE9PWEuZm9nJiYodGhpcy5mb2c9YS5mb2cuY2xvbmUoKSk7Cm51bGwhPT1hLm92ZXJyaWRlTWF0ZXJpYWwmJih0aGlzLm92ZXJyaWRlTWF0ZXJpYWw9YS5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCkpO3RoaXMuYXV0b1VwZGF0ZT1hLmF1dG9VcGRhdGU7dGhpcy5tYXRyaXhBdXRvVXBkYXRlPWEubWF0cml4QXV0b1VwZGF0ZTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGEpe3ZhciBjPUEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYSk7bnVsbCE9PXRoaXMuYmFja2dyb3VuZCYmKGMub2JqZWN0LmJhY2tncm91bmQ9dGhpcy5iYWNrZ3JvdW5kLnRvSlNPTihhKSk7bnVsbCE9PXRoaXMuZm9nJiYoYy5vYmplY3QuZm9nPXRoaXMuZm9nLnRvSlNPTigpKTtyZXR1cm4gY30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTt2YXIga2Q9W25ldyBrLG5ldyBrLG5ldyBrLG5ldyBrLG5ldyBrLG5ldyBrLG5ldyBrLG5ldyBrXSxXYz1uZXcgayxnZj1uZXcgayxoZj1uZXcgayxqZj1uZXcgaywKRmQ9bmV3IGssR2Q9bmV3IGssZmU9bmV3IGssbGc9bmV3IGssaWg9bmV3IGssamg9bmV3IGssS2Q9bmV3IGs7T2JqZWN0LmFzc2lnbih3LnByb3RvdHlwZSx7aXNCb3gzOiEwLHNldDpmdW5jdGlvbihhLGMpe3RoaXMubWluLmNvcHkoYSk7dGhpcy5tYXguY29weShjKTtyZXR1cm4gdGhpc30sc2V0RnJvbUFycmF5OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1JbmZpbml0eSxlPUluZmluaXR5LGc9SW5maW5pdHkscj0tSW5maW5pdHksdj0tSW5maW5pdHksej0tSW5maW5pdHksRT0wLEY9YS5sZW5ndGg7RTxGO0UrPTMpe3ZhciBKPWFbRV0sUD1hW0UrMV0sUj1hW0UrMl07SjxjJiYoYz1KKTtQPGUmJihlPVApO1I8ZyYmKGc9Uik7Sj5yJiYocj1KKTtQPnYmJih2PVApO1I+eiYmKHo9Uil9dGhpcy5taW4uc2V0KGMsZSxnKTt0aGlzLm1heC5zZXQocix2LHopO3JldHVybiB0aGlzfSxzZXRGcm9tQnVmZmVyQXR0cmlidXRlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1JbmZpbml0eSxlPUluZmluaXR5LApnPUluZmluaXR5LHI9LUluZmluaXR5LHY9LUluZmluaXR5LHo9LUluZmluaXR5LEU9MCxGPWEuY291bnQ7RTxGO0UrKyl7dmFyIEo9YS5nZXRYKEUpLFA9YS5nZXRZKEUpLFI9YS5nZXRaKEUpO0o8YyYmKGM9Sik7UDxlJiYoZT1QKTtSPGcmJihnPVIpO0o+ciYmKHI9Sik7UD52JiYodj1QKTtSPnomJih6PVIpfXRoaXMubWluLnNldChjLGUsZyk7dGhpcy5tYXguc2V0KHIsdix6KTtyZXR1cm4gdGhpc30sc2V0RnJvbVBvaW50czpmdW5jdGlvbihhKXt0aGlzLm1ha2VFbXB0eSgpO2Zvcih2YXIgYz0wLGU9YS5sZW5ndGg7YzxlO2MrKyl0aGlzLmV4cGFuZEJ5UG9pbnQoYVtjXSk7cmV0dXJuIHRoaXN9LHNldEZyb21DZW50ZXJBbmRTaXplOmZ1bmN0aW9uKGEsYyl7Yz1XYy5jb3B5KGMpLm11bHRpcGx5U2NhbGFyKC41KTt0aGlzLm1pbi5jb3B5KGEpLnN1YihjKTt0aGlzLm1heC5jb3B5KGEpLmFkZChjKTtyZXR1cm4gdGhpc30sc2V0RnJvbU9iamVjdDpmdW5jdGlvbihhKXt0aGlzLm1ha2VFbXB0eSgpOwpyZXR1cm4gdGhpcy5leHBhbmRCeU9iamVjdChhKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5taW4uY29weShhLm1pbik7dGhpcy5tYXguY29weShhLm1heCk7cmV0dXJuIHRoaXN9LG1ha2VFbXB0eTpmdW5jdGlvbigpe3RoaXMubWluLng9dGhpcy5taW4ueT10aGlzLm1pbi56PUluZmluaXR5O3RoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS1JbmZpbml0eTtyZXR1cm4gdGhpc30saXNFbXB0eTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1heC54PHRoaXMubWluLnh8fHRoaXMubWF4Lnk8dGhpcy5taW4ueXx8dGhpcy5tYXguejx0aGlzLm1pbi56fSxnZXRDZW50ZXI6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/CmEuc2V0KDAsMCwwKTphLmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX0sZ2V0U2l6ZTpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/YS5zZXQoMCwwLDApOmEuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9LGV4cGFuZEJ5UG9pbnQ6ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWluKGEpO3RoaXMubWF4Lm1heChhKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlWZWN0b3I6ZnVuY3Rpb24oYSl7dGhpcy5taW4uc3ViKGEpO3RoaXMubWF4LmFkZChhKTtyZXR1cm4gdGhpc30sZXhwYW5kQnlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5taW4uYWRkU2NhbGFyKC1hKTt0aGlzLm1heC5hZGRTY2FsYXIoYSk7cmV0dXJuIHRoaXN9LGV4cGFuZEJ5T2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBjO2EudXBkYXRlV29ybGRNYXRyaXgoITEsCiExKTt2YXIgZT1hLmdlb21ldHJ5O2lmKHZvaWQgMCE9PWUpaWYoZS5pc0dlb21ldHJ5KXt2YXIgZz1lLnZlcnRpY2VzO2U9MDtmb3IoYz1nLmxlbmd0aDtlPGM7ZSsrKVdjLmNvcHkoZ1tlXSksV2MuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpLHRoaXMuZXhwYW5kQnlQb2ludChXYyl9ZWxzZSBpZihlLmlzQnVmZmVyR2VvbWV0cnkmJihnPWUuYXR0cmlidXRlcy5wb3NpdGlvbix2b2lkIDAhPT1nKSlmb3IoZT0wLGM9Zy5jb3VudDtlPGM7ZSsrKVdjLmZyb21CdWZmZXJBdHRyaWJ1dGUoZyxlKS5hcHBseU1hdHJpeDQoYS5tYXRyaXhXb3JsZCksdGhpcy5leHBhbmRCeVBvaW50KFdjKTthPWEuY2hpbGRyZW47ZT0wO2ZvcihjPWEubGVuZ3RoO2U8YztlKyspdGhpcy5leHBhbmRCeU9iamVjdChhW2VdKTtyZXR1cm4gdGhpc30sY29udGFpbnNQb2ludDpmdW5jdGlvbihhKXtyZXR1cm4gYS54PHRoaXMubWluLnh8fGEueD50aGlzLm1heC54fHxhLnk8dGhpcy5taW4ueXx8YS55PnRoaXMubWF4Lnl8fAphLno8dGhpcy5taW4uenx8YS56PnRoaXMubWF4Lno/ITE6ITB9LGNvbnRhaW5zQm94OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1pbi54PD1hLm1pbi54JiZhLm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD1hLm1pbi55JiZhLm1heC55PD10aGlzLm1heC55JiZ0aGlzLm1pbi56PD1hLm1pbi56JiZhLm1heC56PD10aGlzLm1heC56fSxnZXRQYXJhbWV0ZXI6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO3JldHVybiBjLnNldCgoYS54LXRoaXMubWluLngpLyh0aGlzLm1heC54LXRoaXMubWluLngpLChhLnktdGhpcy5taW4ueSkvKHRoaXMubWF4LnktdGhpcy5taW4ueSksKGEuei10aGlzLm1pbi56KS8odGhpcy5tYXguei10aGlzLm1pbi56KSl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWF4Lng8dGhpcy5taW4ueHx8CmEubWluLng+dGhpcy5tYXgueHx8YS5tYXgueTx0aGlzLm1pbi55fHxhLm1pbi55PnRoaXMubWF4Lnl8fGEubWF4Lno8dGhpcy5taW4uenx8YS5taW4uej50aGlzLm1heC56PyExOiEwfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGEpe3RoaXMuY2xhbXBQb2ludChhLmNlbnRlcixXYyk7cmV0dXJuIFdjLmRpc3RhbmNlVG9TcXVhcmVkKGEuY2VudGVyKTw9YS5yYWRpdXMqYS5yYWRpdXN9LGludGVyc2VjdHNQbGFuZTpmdW5jdGlvbihhKXtpZigwPGEubm9ybWFsLngpe3ZhciBjPWEubm9ybWFsLngqdGhpcy5taW4ueDt2YXIgZT1hLm5vcm1hbC54KnRoaXMubWF4Lnh9ZWxzZSBjPWEubm9ybWFsLngqdGhpcy5tYXgueCxlPWEubm9ybWFsLngqdGhpcy5taW4ueDswPGEubm9ybWFsLnk/KGMrPWEubm9ybWFsLnkqdGhpcy5taW4ueSxlKz1hLm5vcm1hbC55KnRoaXMubWF4LnkpOihjKz1hLm5vcm1hbC55KnRoaXMubWF4LnksZSs9YS5ub3JtYWwueSp0aGlzLm1pbi55KTswPGEubm9ybWFsLno/CihjKz1hLm5vcm1hbC56KnRoaXMubWluLnosZSs9YS5ub3JtYWwueip0aGlzLm1heC56KTooYys9YS5ub3JtYWwueip0aGlzLm1heC56LGUrPWEubm9ybWFsLnoqdGhpcy5taW4ueik7cmV0dXJuIGM8PS1hLmNvbnN0YW50JiZlPj0tYS5jb25zdGFudH0saW50ZXJzZWN0c1RyaWFuZ2xlOmZ1bmN0aW9uKGEpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKGxnKTtpaC5zdWJWZWN0b3JzKHRoaXMubWF4LGxnKTtnZi5zdWJWZWN0b3JzKGEuYSxsZyk7aGYuc3ViVmVjdG9ycyhhLmIsbGcpO2pmLnN1YlZlY3RvcnMoYS5jLGxnKTtGZC5zdWJWZWN0b3JzKGhmLGdmKTtHZC5zdWJWZWN0b3JzKGpmLGhmKTtmZS5zdWJWZWN0b3JzKGdmLGpmKTthPVswLC1GZC56LEZkLnksMCwtR2QueixHZC55LDAsLWZlLnosZmUueSxGZC56LDAsLUZkLngsR2QueiwwLC1HZC54LGZlLnosMCwtZmUueCwtRmQueSxGZC54LDAsLUdkLnksR2QueCwwLC1mZS55LGZlLngsMF07aWYoIUMoYSwKZ2YsaGYsamYsaWgpKXJldHVybiExO2E9WzEsMCwwLDAsMSwwLDAsMCwxXTtpZighQyhhLGdmLGhmLGpmLGloKSlyZXR1cm4hMTtqaC5jcm9zc1ZlY3RvcnMoRmQsR2QpO2E9W2poLngsamgueSxqaC56XTtyZXR1cm4gQyhhLGdmLGhmLGpmLGloKX0sY2xhbXBQb2ludDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO3JldHVybiBjLmNvcHkoYSkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIFdjLmNvcHkoYSkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLnN1YihhKS5sZW5ndGgoKX0sZ2V0Qm91bmRpbmdTcGhlcmU6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmY29uc29sZS5lcnJvcigiVEhSRUUuQm94MzogLmdldEJvdW5kaW5nU3BoZXJlKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpO3RoaXMuZ2V0Q2VudGVyKGEuY2VudGVyKTsKYS5yYWRpdXM9LjUqdGhpcy5nZXRTaXplKFdjKS5sZW5ndGgoKTtyZXR1cm4gYX0saW50ZXJzZWN0OmZ1bmN0aW9uKGEpe3RoaXMubWluLm1heChhLm1pbik7dGhpcy5tYXgubWluKGEubWF4KTt0aGlzLmlzRW1wdHkoKSYmdGhpcy5tYWtlRW1wdHkoKTtyZXR1cm4gdGhpc30sdW5pb246ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWluKGEubWluKTt0aGlzLm1heC5tYXgoYS5tYXgpO3JldHVybiB0aGlzfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSl7aWYodGhpcy5pc0VtcHR5KCkpcmV0dXJuIHRoaXM7a2RbMF0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQoYSk7a2RbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQoYSk7a2RbMl0uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQoYSk7a2RbM10uc2V0KHRoaXMubWluLngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQoYSk7CmtkWzRdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGEpO2tkWzVdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGEpO2tkWzZdLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KGEpO2tkWzddLnNldCh0aGlzLm1heC54LHRoaXMubWF4LnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KGEpO3RoaXMuc2V0RnJvbVBvaW50cyhrZCk7cmV0dXJuIHRoaXN9LHRyYW5zbGF0ZTpmdW5jdGlvbihhKXt0aGlzLm1pbi5hZGQoYSk7dGhpcy5tYXguYWRkKGEpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubWluLmVxdWFscyh0aGlzLm1pbikmJmEubWF4LmVxdWFscyh0aGlzLm1heCl9fSk7dmFyIERtPW5ldyB3O09iamVjdC5hc3NpZ24oRy5wcm90b3R5cGUse3NldDpmdW5jdGlvbihhLGMpe3RoaXMuY2VudGVyLmNvcHkoYSk7dGhpcy5yYWRpdXM9CmM7cmV0dXJuIHRoaXN9LHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYSxjKXt2YXIgZT10aGlzLmNlbnRlcjt2b2lkIDAhPT1jP2UuY29weShjKTpEbS5zZXRGcm9tUG9pbnRzKGEpLmdldENlbnRlcihlKTtmb3IodmFyIGc9Yz0wLHI9YS5sZW5ndGg7ZzxyO2crKyljPU1hdGgubWF4KGMsZS5kaXN0YW5jZVRvU3F1YXJlZChhW2ddKSk7dGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLmNlbnRlci5jb3B5KGEuY2VudGVyKTt0aGlzLnJhZGl1cz1hLnJhZGl1cztyZXR1cm4gdGhpc30sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gMD49dGhpcy5yYWRpdXN9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD10aGlzLnJhZGl1cyp0aGlzLnJhZGl1c30sZGlzdGFuY2VUb1BvaW50OmZ1bmN0aW9uKGEpe3JldHVybiBhLmRpc3RhbmNlVG8odGhpcy5jZW50ZXIpLQp0aGlzLnJhZGl1c30saW50ZXJzZWN0c1NwaGVyZTpmdW5jdGlvbihhKXt2YXIgYz10aGlzLnJhZGl1cythLnJhZGl1cztyZXR1cm4gYS5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5jZW50ZXIpPD1jKmN9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX0saW50ZXJzZWN0c1BsYW5lOmZ1bmN0aW9uKGEpe3JldHVybiBNYXRoLmFicyhhLmRpc3RhbmNlVG9Qb2ludCh0aGlzLmNlbnRlcikpPD10aGlzLnJhZGl1c30sY2xhbXBQb2ludDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKGEpO3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLlNwaGVyZTogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgayk7Yy5jb3B5KGEpO2U+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMmJihjLnN1Yih0aGlzLmNlbnRlcikubm9ybWFsaXplKCksYy5tdWx0aXBseVNjYWxhcih0aGlzLnJhZGl1cykuYWRkKHRoaXMuY2VudGVyKSk7CnJldHVybiBjfSxnZXRCb3VuZGluZ0JveDpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5TcGhlcmU6IC5nZXRCb3VuZGluZ0JveCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyB3KTthLnNldCh0aGlzLmNlbnRlcix0aGlzLmNlbnRlcik7YS5leHBhbmRCeVNjYWxhcih0aGlzLnJhZGl1cyk7cmV0dXJuIGF9LGFwcGx5TWF0cml4NDpmdW5jdGlvbihhKXt0aGlzLmNlbnRlci5hcHBseU1hdHJpeDQoYSk7dGhpcy5yYWRpdXMqPWEuZ2V0TWF4U2NhbGVPbkF4aXMoKTtyZXR1cm4gdGhpc30sdHJhbnNsYXRlOmZ1bmN0aW9uKGEpe3RoaXMuY2VudGVyLmFkZChhKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLmNlbnRlci5lcXVhbHModGhpcy5jZW50ZXIpJiZhLnJhZGl1cz09PXRoaXMucmFkaXVzfX0pO3ZhciBsZD1uZXcgayx5aT1uZXcgayxraD1uZXcgayxIZD1uZXcgayx6aT1uZXcgayxsaD1uZXcgayxBaT1uZXcgazsKT2JqZWN0LmFzc2lnbihELnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5vcmlnaW4uY29weShhKTt0aGlzLmRpcmVjdGlvbi5jb3B5KGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLm9yaWdpbi5jb3B5KGEub3JpZ2luKTt0aGlzLmRpcmVjdGlvbi5jb3B5KGEuZGlyZWN0aW9uKTtyZXR1cm4gdGhpc30sYXQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5hdCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxjPW5ldyBrKTtyZXR1cm4gYy5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy5vcmlnaW4pfSxsb29rQXQ6ZnVuY3Rpb24oYSl7dGhpcy5kaXJlY3Rpb24uY29weShhKS5zdWIodGhpcy5vcmlnaW4pLm5vcm1hbGl6ZSgpO3JldHVybiB0aGlzfSxyZWNhc3Q6ZnVuY3Rpb24oYSl7dGhpcy5vcmlnaW4uY29weSh0aGlzLmF0KGEsCmxkKSk7cmV0dXJuIHRoaXN9LGNsb3Nlc3RQb2ludFRvUG9pbnQ6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGM9bmV3IGspO2Muc3ViVmVjdG9ycyhhLHRoaXMub3JpZ2luKTthPWMuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gMD5hP2MuY29weSh0aGlzLm9yaWdpbik6Yy5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy5vcmlnaW4pfSxkaXN0YW5jZVRvUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlU3FUb1BvaW50KGEpKX0sZGlzdGFuY2VTcVRvUG9pbnQ6ZnVuY3Rpb24oYSl7dmFyIGM9bGQuc3ViVmVjdG9ycyhhLHRoaXMub3JpZ2luKS5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA+YylyZXR1cm4gdGhpcy5vcmlnaW4uZGlzdGFuY2VUb1NxdWFyZWQoYSk7bGQuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoYykuYWRkKHRoaXMub3JpZ2luKTsKcmV0dXJuIGxkLmRpc3RhbmNlVG9TcXVhcmVkKGEpfSxkaXN0YW5jZVNxVG9TZWdtZW50OmZ1bmN0aW9uKGEsYyxlLGcpe3lpLmNvcHkoYSkuYWRkKGMpLm11bHRpcGx5U2NhbGFyKC41KTtraC5jb3B5KGMpLnN1YihhKS5ub3JtYWxpemUoKTtIZC5jb3B5KHRoaXMub3JpZ2luKS5zdWIoeWkpO3ZhciByPS41KmEuZGlzdGFuY2VUbyhjKSx2PS10aGlzLmRpcmVjdGlvbi5kb3Qoa2gpLHo9SGQuZG90KHRoaXMuZGlyZWN0aW9uKSxFPS1IZC5kb3Qoa2gpLEY9SGQubGVuZ3RoU3EoKSxKPU1hdGguYWJzKDEtdip2KTtpZigwPEope2E9dipFLXo7Yz12KnotRTt2YXIgUD1yKko7MDw9YT9jPj0tUD9jPD1QPyhyPTEvSixhKj1yLGMqPXIsdj1hKihhK3YqYysyKnopK2MqKHYqYStjKzIqRSkrRik6KGM9cixhPU1hdGgubWF4KDAsLSh2KmMreikpLHY9LWEqYStjKihjKzIqRSkrRik6KGM9LXIsYT1NYXRoLm1heCgwLC0odipjK3opKSx2PS1hKmErYyooYysyKkUpK0YpOmM8PS1QPyhhPU1hdGgubWF4KDAsCi0oLXYqcit6KSksYz0wPGE/LXI6TWF0aC5taW4oTWF0aC5tYXgoLXIsLUUpLHIpLHY9LWEqYStjKihjKzIqRSkrRik6Yzw9UD8oYT0wLGM9TWF0aC5taW4oTWF0aC5tYXgoLXIsLUUpLHIpLHY9YyooYysyKkUpK0YpOihhPU1hdGgubWF4KDAsLSh2KnIreikpLGM9MDxhP3I6TWF0aC5taW4oTWF0aC5tYXgoLXIsLUUpLHIpLHY9LWEqYStjKihjKzIqRSkrRil9ZWxzZSBjPTA8dj8tcjpyLGE9TWF0aC5tYXgoMCwtKHYqYyt6KSksdj0tYSphK2MqKGMrMipFKStGO2UmJmUuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoYSkuYWRkKHRoaXMub3JpZ2luKTtnJiZnLmNvcHkoa2gpLm11bHRpcGx5U2NhbGFyKGMpLmFkZCh5aSk7cmV0dXJuIHZ9LGludGVyc2VjdFNwaGVyZTpmdW5jdGlvbihhLGMpe2xkLnN1YlZlY3RvcnMoYS5jZW50ZXIsdGhpcy5vcmlnaW4pO3ZhciBlPWxkLmRvdCh0aGlzLmRpcmVjdGlvbiksZz1sZC5kb3QobGQpLWUqZTthPWEucmFkaXVzKmEucmFkaXVzOwppZihnPmEpcmV0dXJuIG51bGw7YT1NYXRoLnNxcnQoYS1nKTtnPWUtYTtlKz1hO3JldHVybiAwPmcmJjA+ZT9udWxsOjA+Zz90aGlzLmF0KGUsYyk6dGhpcy5hdChnLGMpfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KGEuY2VudGVyKTw9YS5yYWRpdXMqYS5yYWRpdXN9LGRpc3RhbmNlVG9QbGFuZTpmdW5jdGlvbihhKXt2YXIgYz1hLm5vcm1hbC5kb3QodGhpcy5kaXJlY3Rpb24pO2lmKDA9PT1jKXJldHVybiAwPT09YS5kaXN0YW5jZVRvUG9pbnQodGhpcy5vcmlnaW4pPzA6bnVsbDthPS0odGhpcy5vcmlnaW4uZG90KGEubm9ybWFsKSthLmNvbnN0YW50KS9jO3JldHVybiAwPD1hP2E6bnVsbH0saW50ZXJzZWN0UGxhbmU6ZnVuY3Rpb24oYSxjKXthPXRoaXMuZGlzdGFuY2VUb1BsYW5lKGEpO3JldHVybiBudWxsPT09YT9udWxsOnRoaXMuYXQoYSxjKX0saW50ZXJzZWN0c1BsYW5lOmZ1bmN0aW9uKGEpe3ZhciBjPWEuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKTsKcmV0dXJuIDA9PT1jfHwwPmEubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqYz8hMDohMX0saW50ZXJzZWN0Qm94OmZ1bmN0aW9uKGEsYyl7dmFyIGU9MS90aGlzLmRpcmVjdGlvbi54O3ZhciBnPTEvdGhpcy5kaXJlY3Rpb24ueTt2YXIgcj0xL3RoaXMuZGlyZWN0aW9uLnosdj10aGlzLm9yaWdpbjtpZigwPD1lKXt2YXIgej0oYS5taW4ueC12LngpKmU7ZSo9YS5tYXgueC12Lnh9ZWxzZSB6PShhLm1heC54LXYueCkqZSxlKj1hLm1pbi54LXYueDtpZigwPD1nKXt2YXIgRT0oYS5taW4ueS12LnkpKmc7Zyo9YS5tYXgueS12Lnl9ZWxzZSBFPShhLm1heC55LXYueSkqZyxnKj1hLm1pbi55LXYueTtpZih6Pmd8fEU+ZSlyZXR1cm4gbnVsbDtpZihFPnp8fHohPT16KXo9RTtpZihnPGV8fGUhPT1lKWU9ZzswPD1yPyhFPShhLm1pbi56LXYueikqcixhPShhLm1heC56LXYueikqcik6KEU9KGEubWF4Lnotdi56KSpyLGE9KGEubWluLnotdi56KSpyKTtpZih6PmF8fEU+ZSlyZXR1cm4gbnVsbDsKaWYoRT56fHx6IT09eil6PUU7aWYoYTxlfHxlIT09ZSllPWE7cmV0dXJuIDA+ZT9udWxsOnRoaXMuYXQoMDw9ej96OmUsYyl9LGludGVyc2VjdHNCb3g6ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT10aGlzLmludGVyc2VjdEJveChhLGxkKX0saW50ZXJzZWN0VHJpYW5nbGU6ZnVuY3Rpb24oYSxjLGUsZyxyKXt6aS5zdWJWZWN0b3JzKGMsYSk7bGguc3ViVmVjdG9ycyhlLGEpO0FpLmNyb3NzVmVjdG9ycyh6aSxsaCk7Yz10aGlzLmRpcmVjdGlvbi5kb3QoQWkpO2lmKDA8Yyl7aWYoZylyZXR1cm4gbnVsbDtnPTF9ZWxzZSBpZigwPmMpZz0tMSxjPS1jO2Vsc2UgcmV0dXJuIG51bGw7SGQuc3ViVmVjdG9ycyh0aGlzLm9yaWdpbixhKTthPWcqdGhpcy5kaXJlY3Rpb24uZG90KGxoLmNyb3NzVmVjdG9ycyhIZCxsaCkpO2lmKDA+YSlyZXR1cm4gbnVsbDtlPWcqdGhpcy5kaXJlY3Rpb24uZG90KHppLmNyb3NzKEhkKSk7aWYoMD5lfHxhK2U+YylyZXR1cm4gbnVsbDthPS1nKkhkLmRvdChBaSk7CnJldHVybiAwPmE/bnVsbDp0aGlzLmF0KGEvYyxyKX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEpe3RoaXMub3JpZ2luLmFwcGx5TWF0cml4NChhKTt0aGlzLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oYSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5vcmlnaW4uZXF1YWxzKHRoaXMub3JpZ2luKSYmYS5kaXJlY3Rpb24uZXF1YWxzKHRoaXMuZGlyZWN0aW9uKX19KTt2YXIgSWM9bmV3IGssbWQ9bmV3IGssQmk9bmV3IGssbmQ9bmV3IGssa2Y9bmV3IGssbGY9bmV3IGssaWs9bmV3IGssQ2k9bmV3IGssRGk9bmV3IGssRWk9bmV3IGs7T2JqZWN0LmFzc2lnbihCLHtnZXROb3JtYWw6ZnVuY3Rpb24oYSxjLGUsZyl7dm9pZCAwPT09ZyYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXROb3JtYWwoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksZz1uZXcgayk7Zy5zdWJWZWN0b3JzKGUsYyk7SWMuc3ViVmVjdG9ycyhhLGMpO2cuY3Jvc3MoSWMpOwphPWcubGVuZ3RoU3EoKTtyZXR1cm4gMDxhP2cubXVsdGlwbHlTY2FsYXIoMS9NYXRoLnNxcnQoYSkpOmcuc2V0KDAsMCwwKX0sZ2V0QmFyeWNvb3JkOmZ1bmN0aW9uKGEsYyxlLGcscil7SWMuc3ViVmVjdG9ycyhnLGMpO21kLnN1YlZlY3RvcnMoZSxjKTtCaS5zdWJWZWN0b3JzKGEsYyk7YT1JYy5kb3QoSWMpO2M9SWMuZG90KG1kKTtlPUljLmRvdChCaSk7dmFyIHY9bWQuZG90KG1kKTtnPW1kLmRvdChCaSk7dmFyIHo9YSp2LWMqYzt2b2lkIDA9PT1yJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmdldEJhcnljb29yZCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxyPW5ldyBrKTtpZigwPT09eilyZXR1cm4gci5zZXQoLTIsLTEsLTEpO3o9MS96O3Y9KHYqZS1jKmcpKno7YT0oYSpnLWMqZSkqejtyZXR1cm4gci5zZXQoMS12LWEsYSx2KX0sY29udGFpbnNQb2ludDpmdW5jdGlvbihhLGMsZSxnKXtCLmdldEJhcnljb29yZChhLGMsZSxnLG5kKTtyZXR1cm4gMDw9bmQueCYmCjA8PW5kLnkmJjE+PW5kLngrbmQueX0sZ2V0VVY6ZnVuY3Rpb24oYSxjLGUsZyxyLHYseixFKXt0aGlzLmdldEJhcnljb29yZChhLGMsZSxnLG5kKTtFLnNldCgwLDApO0UuYWRkU2NhbGVkVmVjdG9yKHIsbmQueCk7RS5hZGRTY2FsZWRWZWN0b3IodixuZC55KTtFLmFkZFNjYWxlZFZlY3Rvcih6LG5kLnopO3JldHVybiBFfSxpc0Zyb250RmFjaW5nOmZ1bmN0aW9uKGEsYyxlLGcpe0ljLnN1YlZlY3RvcnMoZSxjKTttZC5zdWJWZWN0b3JzKGEsYyk7cmV0dXJuIDA+SWMuY3Jvc3MobWQpLmRvdChnKT8hMDohMX19KTtPYmplY3QuYXNzaWduKEIucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYSxjLGUpe3RoaXMuYS5jb3B5KGEpO3RoaXMuYi5jb3B5KGMpO3RoaXMuYy5jb3B5KGUpO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzQW5kSW5kaWNlczpmdW5jdGlvbihhLGMsZSxnKXt0aGlzLmEuY29weShhW2NdKTt0aGlzLmIuY29weShhW2VdKTt0aGlzLmMuY29weShhW2ddKTtyZXR1cm4gdGhpc30sCmNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuYS5jb3B5KGEuYSk7dGhpcy5iLmNvcHkoYS5iKTt0aGlzLmMuY29weShhLmMpO3JldHVybiB0aGlzfSxnZXRBcmVhOmZ1bmN0aW9uKCl7SWMuc3ViVmVjdG9ycyh0aGlzLmMsdGhpcy5iKTttZC5zdWJWZWN0b3JzKHRoaXMuYSx0aGlzLmIpO3JldHVybi41KkljLmNyb3NzKG1kKS5sZW5ndGgoKX0sZ2V0TWlkcG9pbnQ6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5nZXRNaWRwb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gYS5hZGRWZWN0b3JzKHRoaXMuYSx0aGlzLmIpLmFkZCh0aGlzLmMpLm11bHRpcGx5U2NhbGFyKDEvMyl9LGdldE5vcm1hbDpmdW5jdGlvbihhKXtyZXR1cm4gQi5nZXROb3JtYWwodGhpcy5hLHRoaXMuYix0aGlzLmMsYSl9LGdldFBsYW5lOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmdldFBsYW5lKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9bmV3IGspO3JldHVybiBhLnNldEZyb21Db3BsYW5hclBvaW50cyh0aGlzLmEsdGhpcy5iLHRoaXMuYyl9LGdldEJhcnljb29yZDpmdW5jdGlvbihhLGMpe3JldHVybiBCLmdldEJhcnljb29yZChhLHRoaXMuYSx0aGlzLmIsdGhpcy5jLGMpfSxnZXRVVjpmdW5jdGlvbihhLGMsZSxnLHIpe3JldHVybiBCLmdldFVWKGEsdGhpcy5hLHRoaXMuYix0aGlzLmMsYyxlLGcscil9LGNvbnRhaW5zUG9pbnQ6ZnVuY3Rpb24oYSl7cmV0dXJuIEIuY29udGFpbnNQb2ludChhLHRoaXMuYSx0aGlzLmIsdGhpcy5jKX0saXNGcm9udEZhY2luZzpmdW5jdGlvbihhKXtyZXR1cm4gQi5pc0Zyb250RmFjaW5nKHRoaXMuYSx0aGlzLmIsdGhpcy5jLGEpfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe3JldHVybiBhLmludGVyc2VjdHNUcmlhbmdsZSh0aGlzKX0sY2xvc2VzdFBvaW50VG9Qb2ludDpmdW5jdGlvbihhLApjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmNsb3Nlc3RQb2ludFRvUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgayk7dmFyIGU9dGhpcy5hLGc9dGhpcy5iLHI9dGhpcy5jO2tmLnN1YlZlY3RvcnMoZyxlKTtsZi5zdWJWZWN0b3JzKHIsZSk7Q2kuc3ViVmVjdG9ycyhhLGUpO3ZhciB2PWtmLmRvdChDaSksej1sZi5kb3QoQ2kpO2lmKDA+PXYmJjA+PXopcmV0dXJuIGMuY29weShlKTtEaS5zdWJWZWN0b3JzKGEsZyk7dmFyIEU9a2YuZG90KERpKSxGPWxmLmRvdChEaSk7aWYoMDw9RSYmRjw9RSlyZXR1cm4gYy5jb3B5KGcpO3ZhciBKPXYqRi1FKno7aWYoMD49SiYmMDw9diYmMD49RSlyZXR1cm4gZz12Lyh2LUUpLGMuY29weShlKS5hZGRTY2FsZWRWZWN0b3Ioa2YsZyk7RWkuc3ViVmVjdG9ycyhhLHIpO2E9a2YuZG90KEVpKTt2YXIgUD1sZi5kb3QoRWkpO2lmKDA8PVAmJmE8PVApcmV0dXJuIGMuY29weShyKTt2PWEqei0KdipQO2lmKDA+PXYmJjA8PXomJjA+PVApcmV0dXJuIEo9ei8oei1QKSxjLmNvcHkoZSkuYWRkU2NhbGVkVmVjdG9yKGxmLEopO3o9RSpQLWEqRjtpZigwPj16JiYwPD1GLUUmJjA8PWEtUClyZXR1cm4gaWsuc3ViVmVjdG9ycyhyLGcpLEo9KEYtRSkvKEYtRSsoYS1QKSksYy5jb3B5KGcpLmFkZFNjYWxlZFZlY3RvcihpayxKKTtyPTEvKHorditKKTtnPXYqcjtKKj1yO3JldHVybiBjLmNvcHkoZSkuYWRkU2NhbGVkVmVjdG9yKGtmLGcpLmFkZFNjYWxlZFZlY3RvcihsZixKKX0sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLmEuZXF1YWxzKHRoaXMuYSkmJmEuYi5lcXVhbHModGhpcy5iKSYmYS5jLmVxdWFscyh0aGlzLmMpfX0pO3ZhciBFbT17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSwKYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LApkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsCmxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NywKbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LApyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9LGxjPXtoOjAsCnM6MCxsOjB9LG1oPXtoOjAsczowLGw6MH07T2JqZWN0LmFzc2lnbihJLnByb3RvdHlwZSx7aXNDb2xvcjohMCxyOjEsZzoxLGI6MSxzZXQ6ZnVuY3Rpb24oYSl7YSYmYS5pc0NvbG9yP3RoaXMuY29weShhKToibnVtYmVyIj09PXR5cGVvZiBhP3RoaXMuc2V0SGV4KGEpOiJzdHJpbmciPT09dHlwZW9mIGEmJnRoaXMuc2V0U3R5bGUoYSk7cmV0dXJuIHRoaXN9LHNldFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLmI9dGhpcy5nPXRoaXMucj1hO3JldHVybiB0aGlzfSxzZXRIZXg6ZnVuY3Rpb24oYSl7YT1NYXRoLmZsb29yKGEpO3RoaXMucj0oYT4+MTYmMjU1KS8yNTU7dGhpcy5nPShhPj44JjI1NSkvMjU1O3RoaXMuYj0oYSYyNTUpLzI1NTtyZXR1cm4gdGhpc30sc2V0UkdCOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnI9YTt0aGlzLmc9Yzt0aGlzLmI9ZTtyZXR1cm4gdGhpc30sc2V0SFNMOmZ1bmN0aW9uKGEsYyxlKXthPWhiLmV1Y2xpZGVhbk1vZHVsbyhhLDEpO2M9aGIuY2xhbXAoYywwLAoxKTtlPWhiLmNsYW1wKGUsMCwxKTswPT09Yz90aGlzLnI9dGhpcy5nPXRoaXMuYj1lOihjPS41Pj1lP2UqKDErYyk6ZStjLWUqYyxlPTIqZS1jLHRoaXMucj1OKGUsYyxhKzEvMyksdGhpcy5nPU4oZSxjLGEpLHRoaXMuYj1OKGUsYyxhLTEvMykpO3JldHVybiB0aGlzfSxzZXRTdHlsZTpmdW5jdGlvbihhKXtmdW5jdGlvbiBjKHope3ZvaWQgMCE9PXomJjE+cGFyc2VGbG9hdCh6KSYmY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogQWxwaGEgY29tcG9uZW50IG9mICIrYSsiIHdpbGwgYmUgaWdub3JlZC4iKX12YXIgZTtpZihlPS9eKCg/OnJnYnxoc2wpYT8pXChccyooW15cKV0qKVwpLy5leGVjKGEpKXt2YXIgZz1lWzJdO3N3aXRjaChlWzFdKXtjYXNlICJyZ2IiOmNhc2UgInJnYmEiOmlmKGU9L14oXGQrKVxzKixccyooXGQrKVxzKixccyooXGQrKVxzKigsXHMqKFswLTldKlwuP1swLTldKylccyopPyQvLmV4ZWMoZykpcmV0dXJuIHRoaXMucj1NYXRoLm1pbigyNTUscGFyc2VJbnQoZVsxXSwKMTApKS8yNTUsdGhpcy5nPU1hdGgubWluKDI1NSxwYXJzZUludChlWzJdLDEwKSkvMjU1LHRoaXMuYj1NYXRoLm1pbigyNTUscGFyc2VJbnQoZVszXSwxMCkpLzI1NSxjKGVbNV0pLHRoaXM7aWYoZT0vXihcZCspJVxzKixccyooXGQrKSVccyosXHMqKFxkKyklXHMqKCxccyooWzAtOV0qXC4/WzAtOV0rKVxzKik/JC8uZXhlYyhnKSlyZXR1cm4gdGhpcy5yPU1hdGgubWluKDEwMCxwYXJzZUludChlWzFdLDEwKSkvMTAwLHRoaXMuZz1NYXRoLm1pbigxMDAscGFyc2VJbnQoZVsyXSwxMCkpLzEwMCx0aGlzLmI9TWF0aC5taW4oMTAwLHBhcnNlSW50KGVbM10sMTApKS8xMDAsYyhlWzVdKSx0aGlzO2JyZWFrO2Nhc2UgImhzbCI6Y2FzZSAiaHNsYSI6aWYoZT0vXihbMC05XSpcLj9bMC05XSspXHMqLFxzKihcZCspJVxzKixccyooXGQrKSVccyooLFxzKihbMC05XSpcLj9bMC05XSspXHMqKT8kLy5leGVjKGcpKXtnPXBhcnNlRmxvYXQoZVsxXSkvMzYwO3ZhciByPXBhcnNlSW50KGVbMl0sCjEwKS8xMDAsdj1wYXJzZUludChlWzNdLDEwKS8xMDA7YyhlWzVdKTtyZXR1cm4gdGhpcy5zZXRIU0woZyxyLHYpfX19ZWxzZSBpZihlPS9eIyhbQS1GYS1mMC05XSspJC8uZXhlYyhhKSl7ZT1lWzFdO2c9ZS5sZW5ndGg7aWYoMz09PWcpcmV0dXJuIHRoaXMucj1wYXJzZUludChlLmNoYXJBdCgwKStlLmNoYXJBdCgwKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludChlLmNoYXJBdCgxKStlLmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludChlLmNoYXJBdCgyKStlLmNoYXJBdCgyKSwxNikvMjU1LHRoaXM7aWYoNj09PWcpcmV0dXJuIHRoaXMucj1wYXJzZUludChlLmNoYXJBdCgwKStlLmNoYXJBdCgxKSwxNikvMjU1LHRoaXMuZz1wYXJzZUludChlLmNoYXJBdCgyKStlLmNoYXJBdCgzKSwxNikvMjU1LHRoaXMuYj1wYXJzZUludChlLmNoYXJBdCg0KStlLmNoYXJBdCg1KSwxNikvMjU1LHRoaXN9YSYmMDxhLmxlbmd0aCYmKGU9RW1bYV0sdm9pZCAwIT09ZT90aGlzLnNldEhleChlKToKY29uc29sZS53YXJuKCJUSFJFRS5Db2xvcjogVW5rbm93biBjb2xvciAiK2EpKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5yLHRoaXMuZyx0aGlzLmIpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMucj1hLnI7dGhpcy5nPWEuZzt0aGlzLmI9YS5iO3JldHVybiB0aGlzfSxjb3B5R2FtbWFUb0xpbmVhcjpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTIpO3RoaXMucj1NYXRoLnBvdyhhLnIsYyk7dGhpcy5nPU1hdGgucG93KGEuZyxjKTt0aGlzLmI9TWF0aC5wb3coYS5iLGMpO3JldHVybiB0aGlzfSxjb3B5TGluZWFyVG9HYW1tYTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTIpO2M9MDxjPzEvYzoxO3RoaXMucj1NYXRoLnBvdyhhLnIsYyk7dGhpcy5nPU1hdGgucG93KGEuZyxjKTt0aGlzLmI9TWF0aC5wb3coYS5iLGMpO3JldHVybiB0aGlzfSxjb252ZXJ0R2FtbWFUb0xpbmVhcjpmdW5jdGlvbihhKXt0aGlzLmNvcHlHYW1tYVRvTGluZWFyKHRoaXMsCmEpO3JldHVybiB0aGlzfSxjb252ZXJ0TGluZWFyVG9HYW1tYTpmdW5jdGlvbihhKXt0aGlzLmNvcHlMaW5lYXJUb0dhbW1hKHRoaXMsYSk7cmV0dXJuIHRoaXN9LGNvcHlTUkdCVG9MaW5lYXI6ZnVuY3Rpb24oYSl7dGhpcy5yPU8oYS5yKTt0aGlzLmc9TyhhLmcpO3RoaXMuYj1PKGEuYik7cmV0dXJuIHRoaXN9LGNvcHlMaW5lYXJUb1NSR0I6ZnVuY3Rpb24oYSl7dGhpcy5yPUgoYS5yKTt0aGlzLmc9SChhLmcpO3RoaXMuYj1IKGEuYik7cmV0dXJuIHRoaXN9LGNvbnZlcnRTUkdCVG9MaW5lYXI6ZnVuY3Rpb24oKXt0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyk7cmV0dXJuIHRoaXN9LGNvbnZlcnRMaW5lYXJUb1NSR0I6ZnVuY3Rpb24oKXt0aGlzLmNvcHlMaW5lYXJUb1NSR0IodGhpcyk7cmV0dXJuIHRoaXN9LGdldEhleDpmdW5jdGlvbigpe3JldHVybiAyNTUqdGhpcy5yPDwxNl4yNTUqdGhpcy5nPDw4XjI1NSp0aGlzLmI8PDB9LGdldEhleFN0cmluZzpmdW5jdGlvbigpe3JldHVybigiMDAwMDAwIisKdGhpcy5nZXRIZXgoKS50b1N0cmluZygxNikpLnNsaWNlKC02KX0sZ2V0SFNMOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiAuZ2V0SFNMKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGE9e2g6MCxzOjAsbDowfSk7dmFyIGM9dGhpcy5yLGU9dGhpcy5nLGc9dGhpcy5iLHI9TWF0aC5tYXgoYyxlLGcpLHY9TWF0aC5taW4oYyxlLGcpLHosRT0odityKS8yO2lmKHY9PT1yKXY9ej0wO2Vsc2V7dmFyIEY9ci12O3Y9LjU+PUU/Ri8ocit2KTpGLygyLXItdik7c3dpdGNoKHIpe2Nhc2UgYzp6PShlLWcpL0YrKGU8Zz82OjApO2JyZWFrO2Nhc2UgZTp6PShnLWMpL0YrMjticmVhaztjYXNlIGc6ej0oYy1lKS9GKzR9ei89Nn1hLmg9ejthLnM9djthLmw9RTtyZXR1cm4gYX0sZ2V0U3R5bGU6ZnVuY3Rpb24oKXtyZXR1cm4icmdiKCIrKDI1NSp0aGlzLnJ8MCkrIiwiKygyNTUqdGhpcy5nfDApKyIsIisoMjU1KnRoaXMuYnwwKSsiKSJ9LG9mZnNldEhTTDpmdW5jdGlvbihhLApjLGUpe3RoaXMuZ2V0SFNMKGxjKTtsYy5oKz1hO2xjLnMrPWM7bGMubCs9ZTt0aGlzLnNldEhTTChsYy5oLGxjLnMsbGMubCk7cmV0dXJuIHRoaXN9LGFkZDpmdW5jdGlvbihhKXt0aGlzLnIrPWEucjt0aGlzLmcrPWEuZzt0aGlzLmIrPWEuYjtyZXR1cm4gdGhpc30sYWRkQ29sb3JzOmZ1bmN0aW9uKGEsYyl7dGhpcy5yPWEucitjLnI7dGhpcy5nPWEuZytjLmc7dGhpcy5iPWEuYitjLmI7cmV0dXJuIHRoaXN9LGFkZFNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLnIrPWE7dGhpcy5nKz1hO3RoaXMuYis9YTtyZXR1cm4gdGhpc30sc3ViOmZ1bmN0aW9uKGEpe3RoaXMucj1NYXRoLm1heCgwLHRoaXMuci1hLnIpO3RoaXMuZz1NYXRoLm1heCgwLHRoaXMuZy1hLmcpO3RoaXMuYj1NYXRoLm1heCgwLHRoaXMuYi1hLmIpO3JldHVybiB0aGlzfSxtdWx0aXBseTpmdW5jdGlvbihhKXt0aGlzLnIqPWEucjt0aGlzLmcqPWEuZzt0aGlzLmIqPWEuYjtyZXR1cm4gdGhpc30sbXVsdGlwbHlTY2FsYXI6ZnVuY3Rpb24oYSl7dGhpcy5yKj0KYTt0aGlzLmcqPWE7dGhpcy5iKj1hO3JldHVybiB0aGlzfSxsZXJwOmZ1bmN0aW9uKGEsYyl7dGhpcy5yKz0oYS5yLXRoaXMucikqYzt0aGlzLmcrPShhLmctdGhpcy5nKSpjO3RoaXMuYis9KGEuYi10aGlzLmIpKmM7cmV0dXJuIHRoaXN9LGxlcnBIU0w6ZnVuY3Rpb24oYSxjKXt0aGlzLmdldEhTTChsYyk7YS5nZXRIU0wobWgpO2E9aGIubGVycChsYy5oLG1oLmgsYyk7dmFyIGU9aGIubGVycChsYy5zLG1oLnMsYyk7Yz1oYi5sZXJwKGxjLmwsbWgubCxjKTt0aGlzLnNldEhTTChhLGUsYyk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5yPT09dGhpcy5yJiZhLmc9PT10aGlzLmcmJmEuYj09PXRoaXMuYn0sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7dGhpcy5yPWFbY107dGhpcy5nPWFbYysxXTt0aGlzLmI9YVtjKzJdO3JldHVybiB0aGlzfSx0b0FycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YSYmKGE9W10pO3ZvaWQgMD09PQpjJiYoYz0wKTthW2NdPXRoaXMucjthW2MrMV09dGhpcy5nO2FbYysyXT10aGlzLmI7cmV0dXJuIGF9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldEhleCgpfX0pO09iamVjdC5hc3NpZ24oSy5wcm90b3R5cGUse2Nsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuYT1hLmE7dGhpcy5iPWEuYjt0aGlzLmM9YS5jO3RoaXMubm9ybWFsLmNvcHkoYS5ub3JtYWwpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hdGVyaWFsSW5kZXg9YS5tYXRlcmlhbEluZGV4O2Zvcih2YXIgYz0wLGU9YS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDtjPGU7YysrKXRoaXMudmVydGV4Tm9ybWFsc1tjXT1hLnZlcnRleE5vcm1hbHNbY10uY2xvbmUoKTtjPTA7Zm9yKGU9YS52ZXJ0ZXhDb2xvcnMubGVuZ3RoO2M8ZTtjKyspdGhpcy52ZXJ0ZXhDb2xvcnNbY109YS52ZXJ0ZXhDb2xvcnNbY10uY2xvbmUoKTsKcmV0dXJuIHRoaXN9fSk7dmFyIFBrPTA7TS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6TSxpc01hdGVyaWFsOiEwLG9uQmVmb3JlQ29tcGlsZTpmdW5jdGlvbigpe30sc2V0VmFsdWVzOmZ1bmN0aW9uKGEpe2lmKHZvaWQgMCE9PWEpZm9yKHZhciBjIGluIGEpe3ZhciBlPWFbY107aWYodm9pZCAwPT09ZSljb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAnIitjKyInIHBhcmFtZXRlciBpcyB1bmRlZmluZWQuIik7ZWxzZSBpZigic2hhZGluZyI9PT1jKWNvbnNvbGUud2FybigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpLHRoaXMuZmxhdFNoYWRpbmc9MT09PWU/ITA6ITE7ZWxzZXt2YXIgZz10aGlzW2NdO3ZvaWQgMD09PWc/Y29uc29sZS53YXJuKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAnIitjKyInIGlzIG5vdCBhIHByb3BlcnR5IG9mIHRoaXMgbWF0ZXJpYWwuIik6CmcmJmcuaXNDb2xvcj9nLnNldChlKTpnJiZnLmlzVmVjdG9yMyYmZSYmZS5pc1ZlY3RvcjM/Zy5jb3B5KGUpOnRoaXNbY109ZX19fSx0b0pTT046ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhyKXt2YXIgdj1bXSx6O2Zvcih6IGluIHIpe3ZhciBFPXJbel07ZGVsZXRlIEUubWV0YWRhdGE7di5wdXNoKEUpfXJldHVybiB2fXZhciBlPXZvaWQgMD09PWF8fCJzdHJpbmciPT09dHlwZW9mIGE7ZSYmKGE9e3RleHR1cmVzOnt9LGltYWdlczp7fX0pO3ZhciBnPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiTWF0ZXJpYWwiLGdlbmVyYXRvcjoiTWF0ZXJpYWwudG9KU09OIn19O2cudXVpZD10aGlzLnV1aWQ7Zy50eXBlPXRoaXMudHlwZTsiIiE9PXRoaXMubmFtZSYmKGcubmFtZT10aGlzLm5hbWUpO3RoaXMuY29sb3ImJnRoaXMuY29sb3IuaXNDb2xvciYmKGcuY29sb3I9dGhpcy5jb2xvci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5yb3VnaG5lc3MmJihnLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyk7CnZvaWQgMCE9PXRoaXMubWV0YWxuZXNzJiYoZy5tZXRhbG5lc3M9dGhpcy5tZXRhbG5lc3MpO3RoaXMuZW1pc3NpdmUmJnRoaXMuZW1pc3NpdmUuaXNDb2xvciYmKGcuZW1pc3NpdmU9dGhpcy5lbWlzc2l2ZS5nZXRIZXgoKSk7dGhpcy5lbWlzc2l2ZUludGVuc2l0eSYmMSE9PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkmJihnLmVtaXNzaXZlSW50ZW5zaXR5PXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkpO3RoaXMuc3BlY3VsYXImJnRoaXMuc3BlY3VsYXIuaXNDb2xvciYmKGcuc3BlY3VsYXI9dGhpcy5zcGVjdWxhci5nZXRIZXgoKSk7dm9pZCAwIT09dGhpcy5zaGluaW5lc3MmJihnLnNoaW5pbmVzcz10aGlzLnNoaW5pbmVzcyk7dm9pZCAwIT09dGhpcy5jbGVhcmNvYXQmJihnLmNsZWFyY29hdD10aGlzLmNsZWFyY29hdCk7dm9pZCAwIT09dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MmJihnLmNsZWFyY29hdFJvdWdobmVzcz10aGlzLmNsZWFyY29hdFJvdWdobmVzcyk7dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAmJgp0aGlzLmNsZWFyY29hdE5vcm1hbE1hcC5pc1RleHR1cmUmJihnLmNsZWFyY29hdE5vcm1hbE1hcD10aGlzLmNsZWFyY29hdE5vcm1hbE1hcC50b0pTT04oYSkudXVpZCxnLmNsZWFyY29hdE5vcm1hbFNjYWxlPXRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUudG9BcnJheSgpKTt0aGlzLm1hcCYmdGhpcy5tYXAuaXNUZXh0dXJlJiYoZy5tYXA9dGhpcy5tYXAudG9KU09OKGEpLnV1aWQpO3RoaXMubWF0Y2FwJiZ0aGlzLm1hdGNhcC5pc1RleHR1cmUmJihnLm1hdGNhcD10aGlzLm1hdGNhcC50b0pTT04oYSkudXVpZCk7dGhpcy5hbHBoYU1hcCYmdGhpcy5hbHBoYU1hcC5pc1RleHR1cmUmJihnLmFscGhhTWFwPXRoaXMuYWxwaGFNYXAudG9KU09OKGEpLnV1aWQpO3RoaXMubGlnaHRNYXAmJnRoaXMubGlnaHRNYXAuaXNUZXh0dXJlJiYoZy5saWdodE1hcD10aGlzLmxpZ2h0TWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLmFvTWFwJiZ0aGlzLmFvTWFwLmlzVGV4dHVyZSYmKGcuYW9NYXA9dGhpcy5hb01hcC50b0pTT04oYSkudXVpZCwKZy5hb01hcEludGVuc2l0eT10aGlzLmFvTWFwSW50ZW5zaXR5KTt0aGlzLmJ1bXBNYXAmJnRoaXMuYnVtcE1hcC5pc1RleHR1cmUmJihnLmJ1bXBNYXA9dGhpcy5idW1wTWFwLnRvSlNPTihhKS51dWlkLGcuYnVtcFNjYWxlPXRoaXMuYnVtcFNjYWxlKTt0aGlzLm5vcm1hbE1hcCYmdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlJiYoZy5ub3JtYWxNYXA9dGhpcy5ub3JtYWxNYXAudG9KU09OKGEpLnV1aWQsZy5ub3JtYWxNYXBUeXBlPXRoaXMubm9ybWFsTWFwVHlwZSxnLm5vcm1hbFNjYWxlPXRoaXMubm9ybWFsU2NhbGUudG9BcnJheSgpKTt0aGlzLmRpc3BsYWNlbWVudE1hcCYmdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlJiYoZy5kaXNwbGFjZW1lbnRNYXA9dGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKGEpLnV1aWQsZy5kaXNwbGFjZW1lbnRTY2FsZT10aGlzLmRpc3BsYWNlbWVudFNjYWxlLGcuZGlzcGxhY2VtZW50Qmlhcz10aGlzLmRpc3BsYWNlbWVudEJpYXMpO3RoaXMucm91Z2huZXNzTWFwJiYKdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYoZy5yb3VnaG5lc3NNYXA9dGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKGEpLnV1aWQpO3RoaXMubWV0YWxuZXNzTWFwJiZ0aGlzLm1ldGFsbmVzc01hcC5pc1RleHR1cmUmJihnLm1ldGFsbmVzc01hcD10aGlzLm1ldGFsbmVzc01hcC50b0pTT04oYSkudXVpZCk7dGhpcy5lbWlzc2l2ZU1hcCYmdGhpcy5lbWlzc2l2ZU1hcC5pc1RleHR1cmUmJihnLmVtaXNzaXZlTWFwPXRoaXMuZW1pc3NpdmVNYXAudG9KU09OKGEpLnV1aWQpO3RoaXMuc3BlY3VsYXJNYXAmJnRoaXMuc3BlY3VsYXJNYXAuaXNUZXh0dXJlJiYoZy5zcGVjdWxhck1hcD10aGlzLnNwZWN1bGFyTWFwLnRvSlNPTihhKS51dWlkKTt0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYoZy5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKGEpLnV1aWQsZy5yZWZsZWN0aXZpdHk9dGhpcy5yZWZsZWN0aXZpdHksZy5yZWZyYWN0aW9uUmF0aW89dGhpcy5yZWZyYWN0aW9uUmF0aW8sCnZvaWQgMCE9PXRoaXMuY29tYmluZSYmKGcuY29tYmluZT10aGlzLmNvbWJpbmUpLHZvaWQgMCE9PXRoaXMuZW52TWFwSW50ZW5zaXR5JiYoZy5lbnZNYXBJbnRlbnNpdHk9dGhpcy5lbnZNYXBJbnRlbnNpdHkpKTt0aGlzLmdyYWRpZW50TWFwJiZ0aGlzLmdyYWRpZW50TWFwLmlzVGV4dHVyZSYmKGcuZ3JhZGllbnRNYXA9dGhpcy5ncmFkaWVudE1hcC50b0pTT04oYSkudXVpZCk7dm9pZCAwIT09dGhpcy5zaXplJiYoZy5zaXplPXRoaXMuc2l6ZSk7dm9pZCAwIT09dGhpcy5zaXplQXR0ZW51YXRpb24mJihnLnNpemVBdHRlbnVhdGlvbj10aGlzLnNpemVBdHRlbnVhdGlvbik7MSE9PXRoaXMuYmxlbmRpbmcmJihnLmJsZW5kaW5nPXRoaXMuYmxlbmRpbmcpOyEwPT09dGhpcy5mbGF0U2hhZGluZyYmKGcuZmxhdFNoYWRpbmc9dGhpcy5mbGF0U2hhZGluZyk7MCE9PXRoaXMuc2lkZSYmKGcuc2lkZT10aGlzLnNpZGUpOzAhPT10aGlzLnZlcnRleENvbG9ycyYmKGcudmVydGV4Q29sb3JzPQp0aGlzLnZlcnRleENvbG9ycyk7MT50aGlzLm9wYWNpdHkmJihnLm9wYWNpdHk9dGhpcy5vcGFjaXR5KTshMD09PXRoaXMudHJhbnNwYXJlbnQmJihnLnRyYW5zcGFyZW50PXRoaXMudHJhbnNwYXJlbnQpO2cuZGVwdGhGdW5jPXRoaXMuZGVwdGhGdW5jO2cuZGVwdGhUZXN0PXRoaXMuZGVwdGhUZXN0O2cuZGVwdGhXcml0ZT10aGlzLmRlcHRoV3JpdGU7Zy5zdGVuY2lsV3JpdGU9dGhpcy5zdGVuY2lsV3JpdGU7Zy5zdGVuY2lsRnVuYz10aGlzLnN0ZW5jaWxGdW5jO2cuc3RlbmNpbFJlZj10aGlzLnN0ZW5jaWxSZWY7Zy5zdGVuY2lsTWFzaz10aGlzLnN0ZW5jaWxNYXNrO2cuc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbDtnLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxaRmFpbDtnLnN0ZW5jaWxaUGFzcz10aGlzLnN0ZW5jaWxaUGFzczt0aGlzLnJvdGF0aW9uJiYwIT09dGhpcy5yb3RhdGlvbiYmKGcucm90YXRpb249dGhpcy5yb3RhdGlvbik7ITA9PT10aGlzLnBvbHlnb25PZmZzZXQmJgooZy5wb2x5Z29uT2Zmc2V0PSEwKTswIT09dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yJiYoZy5wb2x5Z29uT2Zmc2V0RmFjdG9yPXRoaXMucG9seWdvbk9mZnNldEZhY3Rvcik7MCE9PXRoaXMucG9seWdvbk9mZnNldFVuaXRzJiYoZy5wb2x5Z29uT2Zmc2V0VW5pdHM9dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMpO3RoaXMubGluZXdpZHRoJiYxIT09dGhpcy5saW5ld2lkdGgmJihnLmxpbmV3aWR0aD10aGlzLmxpbmV3aWR0aCk7dm9pZCAwIT09dGhpcy5kYXNoU2l6ZSYmKGcuZGFzaFNpemU9dGhpcy5kYXNoU2l6ZSk7dm9pZCAwIT09dGhpcy5nYXBTaXplJiYoZy5nYXBTaXplPXRoaXMuZ2FwU2l6ZSk7dm9pZCAwIT09dGhpcy5zY2FsZSYmKGcuc2NhbGU9dGhpcy5zY2FsZSk7ITA9PT10aGlzLmRpdGhlcmluZyYmKGcuZGl0aGVyaW5nPSEwKTswPHRoaXMuYWxwaGFUZXN0JiYoZy5hbHBoYVRlc3Q9dGhpcy5hbHBoYVRlc3QpOyEwPT09dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEmJihnLnByZW11bHRpcGxpZWRBbHBoYT0KdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEpOyEwPT09dGhpcy53aXJlZnJhbWUmJihnLndpcmVmcmFtZT10aGlzLndpcmVmcmFtZSk7MTx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCYmKGcud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKTsicm91bmQiIT09dGhpcy53aXJlZnJhbWVMaW5lY2FwJiYoZy53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCk7InJvdW5kIiE9PXRoaXMud2lyZWZyYW1lTGluZWpvaW4mJihnLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pOyEwPT09dGhpcy5tb3JwaFRhcmdldHMmJihnLm1vcnBoVGFyZ2V0cz0hMCk7ITA9PT10aGlzLm1vcnBoTm9ybWFscyYmKGcubW9ycGhOb3JtYWxzPSEwKTshMD09PXRoaXMuc2tpbm5pbmcmJihnLnNraW5uaW5nPSEwKTshMT09PXRoaXMudmlzaWJsZSYmKGcudmlzaWJsZT0hMSk7ITE9PT10aGlzLnRvbmVNYXBwZWQmJihnLnRvbmVNYXBwZWQ9ITEpOwoie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJihnLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO2UmJihlPWMoYS50ZXh0dXJlcyksYT1jKGEuaW1hZ2VzKSwwPGUubGVuZ3RoJiYoZy50ZXh0dXJlcz1lKSwwPGEubGVuZ3RoJiYoZy5pbWFnZXM9YSkpO3JldHVybiBnfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLm5hbWU9YS5uYW1lO3RoaXMuZm9nPWEuZm9nO3RoaXMubGlnaHRzPWEubGlnaHRzO3RoaXMuYmxlbmRpbmc9YS5ibGVuZGluZzt0aGlzLnNpZGU9YS5zaWRlO3RoaXMuZmxhdFNoYWRpbmc9YS5mbGF0U2hhZGluZzt0aGlzLnZlcnRleENvbG9ycz1hLnZlcnRleENvbG9yczt0aGlzLm9wYWNpdHk9YS5vcGFjaXR5O3RoaXMudHJhbnNwYXJlbnQ9YS50cmFuc3BhcmVudDt0aGlzLmJsZW5kU3JjPWEuYmxlbmRTcmM7dGhpcy5ibGVuZERzdD1hLmJsZW5kRHN0O3RoaXMuYmxlbmRFcXVhdGlvbj0KYS5ibGVuZEVxdWF0aW9uO3RoaXMuYmxlbmRTcmNBbHBoYT1hLmJsZW5kU3JjQWxwaGE7dGhpcy5ibGVuZERzdEFscGhhPWEuYmxlbmREc3RBbHBoYTt0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT1hLmJsZW5kRXF1YXRpb25BbHBoYTt0aGlzLmRlcHRoRnVuYz1hLmRlcHRoRnVuYzt0aGlzLmRlcHRoVGVzdD1hLmRlcHRoVGVzdDt0aGlzLmRlcHRoV3JpdGU9YS5kZXB0aFdyaXRlO3RoaXMuc3RlbmNpbFdyaXRlPWEuc3RlbmNpbFdyaXRlO3RoaXMuc3RlbmNpbEZ1bmM9YS5zdGVuY2lsRnVuYzt0aGlzLnN0ZW5jaWxSZWY9YS5zdGVuY2lsUmVmO3RoaXMuc3RlbmNpbE1hc2s9YS5zdGVuY2lsTWFzazt0aGlzLnN0ZW5jaWxGYWlsPWEuc3RlbmNpbEZhaWw7dGhpcy5zdGVuY2lsWkZhaWw9YS5zdGVuY2lsWkZhaWw7dGhpcy5zdGVuY2lsWlBhc3M9YS5zdGVuY2lsWlBhc3M7dGhpcy5jb2xvcldyaXRlPWEuY29sb3JXcml0ZTt0aGlzLnByZWNpc2lvbj1hLnByZWNpc2lvbjt0aGlzLnBvbHlnb25PZmZzZXQ9CmEucG9seWdvbk9mZnNldDt0aGlzLnBvbHlnb25PZmZzZXRGYWN0b3I9YS5wb2x5Z29uT2Zmc2V0RmFjdG9yO3RoaXMucG9seWdvbk9mZnNldFVuaXRzPWEucG9seWdvbk9mZnNldFVuaXRzO3RoaXMuZGl0aGVyaW5nPWEuZGl0aGVyaW5nO3RoaXMuYWxwaGFUZXN0PWEuYWxwaGFUZXN0O3RoaXMucHJlbXVsdGlwbGllZEFscGhhPWEucHJlbXVsdGlwbGllZEFscGhhO3RoaXMudmlzaWJsZT1hLnZpc2libGU7dGhpcy50b25lTWFwcGVkPWEudG9uZU1hcHBlZDt0aGlzLnVzZXJEYXRhPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoYS51c2VyRGF0YSkpO3RoaXMuY2xpcFNoYWRvd3M9YS5jbGlwU2hhZG93czt0aGlzLmNsaXBJbnRlcnNlY3Rpb249YS5jbGlwSW50ZXJzZWN0aW9uO3ZhciBjPWEuY2xpcHBpbmdQbGFuZXMsZT1udWxsO2lmKG51bGwhPT1jKXt2YXIgZz1jLmxlbmd0aDtlPUFycmF5KGcpO2Zvcih2YXIgcj0wO3IhPT1nOysrcillW3JdPWNbcl0uY2xvbmUoKX10aGlzLmNsaXBwaW5nUGxhbmVzPQplO3RoaXMuc2hhZG93U2lkZT1hLnNoYWRvd1NpZGU7cmV0dXJuIHRoaXN9LGRpc3Bvc2U6ZnVuY3Rpb24oKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fSk7TC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7TC5wcm90b3R5cGUuY29uc3RydWN0b3I9TDtMLnByb3RvdHlwZS5pc01lc2hCYXNpY01hdGVyaWFsPSEwO0wucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMubWFwPWEubWFwO3RoaXMubGlnaHRNYXA9YS5saWdodE1hcDt0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PWEubGlnaHRNYXBJbnRlbnNpdHk7dGhpcy5hb01hcD1hLmFvTWFwO3RoaXMuYW9NYXBJbnRlbnNpdHk9YS5hb01hcEludGVuc2l0eTt0aGlzLnNwZWN1bGFyTWFwPWEuc3BlY3VsYXJNYXA7dGhpcy5hbHBoYU1hcD1hLmFscGhhTWFwO3RoaXMuZW52TWFwPWEuZW52TWFwOwp0aGlzLmNvbWJpbmU9YS5jb21iaW5lO3RoaXMucmVmbGVjdGl2aXR5PWEucmVmbGVjdGl2aXR5O3RoaXMucmVmcmFjdGlvblJhdGlvPWEucmVmcmFjdGlvblJhdGlvO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPWEud2lyZWZyYW1lTGluZXdpZHRoO3RoaXMud2lyZWZyYW1lTGluZWNhcD1hLndpcmVmcmFtZUxpbmVjYXA7dGhpcy53aXJlZnJhbWVMaW5lam9pbj1hLndpcmVmcmFtZUxpbmVqb2luO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0cztyZXR1cm4gdGhpc307T2JqZWN0LmRlZmluZVByb3BlcnR5KFEucHJvdG90eXBlLCJuZWVkc1VwZGF0ZSIse3NldDpmdW5jdGlvbihhKXshMD09PWEmJnRoaXMudmVyc2lvbisrfX0pO09iamVjdC5hc3NpZ24oUS5wcm90b3R5cGUse2lzQnVmZmVyQXR0cmlidXRlOiEwLG9uVXBsb2FkQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9LHNldEFycmF5OmZ1bmN0aW9uKGEpe2lmKEFycmF5LmlzQXJyYXkoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTsKdGhpcy5jb3VudD12b2lkIDAhPT1hP2EubGVuZ3RoL3RoaXMuaXRlbVNpemU6MDt0aGlzLmFycmF5PWE7cmV0dXJuIHRoaXN9LHNldER5bmFtaWM6ZnVuY3Rpb24oYSl7dGhpcy5keW5hbWljPWE7cmV0dXJuIHRoaXN9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5uYW1lPWEubmFtZTt0aGlzLmFycmF5PW5ldyBhLmFycmF5LmNvbnN0cnVjdG9yKGEuYXJyYXkpO3RoaXMuaXRlbVNpemU9YS5pdGVtU2l6ZTt0aGlzLmNvdW50PWEuY291bnQ7dGhpcy5ub3JtYWxpemVkPWEubm9ybWFsaXplZDt0aGlzLmR5bmFtaWM9YS5keW5hbWljO3JldHVybiB0aGlzfSxjb3B5QXQ6ZnVuY3Rpb24oYSxjLGUpe2EqPXRoaXMuaXRlbVNpemU7ZSo9Yy5pdGVtU2l6ZTtmb3IodmFyIGc9MCxyPXRoaXMuaXRlbVNpemU7ZzxyO2crKyl0aGlzLmFycmF5W2ErZ109Yy5hcnJheVtlK2ddO3JldHVybiB0aGlzfSxjb3B5QXJyYXk6ZnVuY3Rpb24oYSl7dGhpcy5hcnJheS5zZXQoYSk7cmV0dXJuIHRoaXN9LGNvcHlDb2xvcnNBcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9CnRoaXMuYXJyYXksZT0wLGc9MCxyPWEubGVuZ3RoO2c8cjtnKyspe3ZhciB2PWFbZ107dm9pZCAwPT09diYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSgpOiBjb2xvciBpcyB1bmRlZmluZWQiLGcpLHY9bmV3IEkpO2NbZSsrXT12LnI7Y1tlKytdPXYuZztjW2UrK109di5ifXJldHVybiB0aGlzfSxjb3B5VmVjdG9yMnNBcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5hcnJheSxlPTAsZz0wLHI9YS5sZW5ndGg7ZzxyO2crKyl7dmFyIHY9YVtnXTt2b2lkIDA9PT12JiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsZyksdj1uZXcgZik7Y1tlKytdPXYueDtjW2UrK109di55fXJldHVybiB0aGlzfSxjb3B5VmVjdG9yM3NBcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5hcnJheSxlPTAsZz0wLHI9YS5sZW5ndGg7ZzxyO2crKyl7dmFyIHY9CmFbZ107dm9pZCAwPT09diYmKGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQiLGcpLHY9bmV3IGspO2NbZSsrXT12Lng7Y1tlKytdPXYueTtjW2UrK109di56fXJldHVybiB0aGlzfSxjb3B5VmVjdG9yNHNBcnJheTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5hcnJheSxlPTAsZz0wLHI9YS5sZW5ndGg7ZzxyO2crKyl7dmFyIHY9YVtnXTt2b2lkIDA9PT12JiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjRzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsZyksdj1uZXcgcCk7Y1tlKytdPXYueDtjW2UrK109di55O2NbZSsrXT12Lno7Y1tlKytdPXYud31yZXR1cm4gdGhpc30sc2V0OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7dGhpcy5hcnJheS5zZXQoYSxjKTtyZXR1cm4gdGhpc30sZ2V0WDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcnJheVthKgp0aGlzLml0ZW1TaXplXX0sc2V0WDpmdW5jdGlvbihhLGMpe3RoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplXT1jO3JldHVybiB0aGlzfSxnZXRZOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZSsxXX0sc2V0WTpmdW5jdGlvbihhLGMpe3RoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplKzFdPWM7cmV0dXJuIHRoaXN9LGdldFo6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuYXJyYXlbYSp0aGlzLml0ZW1TaXplKzJdfSxzZXRaOmZ1bmN0aW9uKGEsYyl7dGhpcy5hcnJheVthKnRoaXMuaXRlbVNpemUrMl09YztyZXR1cm4gdGhpc30sZ2V0VzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5hcnJheVthKnRoaXMuaXRlbVNpemUrM119LHNldFc6ZnVuY3Rpb24oYSxjKXt0aGlzLmFycmF5W2EqdGhpcy5pdGVtU2l6ZSszXT1jO3JldHVybiB0aGlzfSxzZXRYWTpmdW5jdGlvbihhLGMsZSl7YSo9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2ErMF09Yzt0aGlzLmFycmF5W2ErCjFdPWU7cmV0dXJuIHRoaXN9LHNldFhZWjpmdW5jdGlvbihhLGMsZSxnKXthKj10aGlzLml0ZW1TaXplO3RoaXMuYXJyYXlbYSswXT1jO3RoaXMuYXJyYXlbYSsxXT1lO3RoaXMuYXJyYXlbYSsyXT1nO3JldHVybiB0aGlzfSxzZXRYWVpXOmZ1bmN0aW9uKGEsYyxlLGcscil7YSo9dGhpcy5pdGVtU2l6ZTt0aGlzLmFycmF5W2ErMF09Yzt0aGlzLmFycmF5W2ErMV09ZTt0aGlzLmFycmF5W2ErMl09Zzt0aGlzLmFycmF5W2ErM109cjtyZXR1cm4gdGhpc30sb25VcGxvYWQ6ZnVuY3Rpb24oYSl7dGhpcy5vblVwbG9hZENhbGxiYWNrPWE7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMuYXJyYXksdGhpcy5pdGVtU2l6ZSkpLmNvcHkodGhpcyl9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybntpdGVtU2l6ZTp0aGlzLml0ZW1TaXplLHR5cGU6dGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHRoaXMuYXJyYXkpLApub3JtYWxpemVkOnRoaXMubm9ybWFsaXplZH19fSk7VC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShRLnByb3RvdHlwZSk7VC5wcm90b3R5cGUuY29uc3RydWN0b3I9VDtYLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTtYLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YO2FhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTthYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YWE7bGEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpO2xhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1sYTtaLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTtaLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1aO2JhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFEucHJvdG90eXBlKTtiYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YmE7ZWEucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpO2VhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lYTtjYS5wcm90b3R5cGU9Ck9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpO2NhLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jYTtrYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShRLnByb3RvdHlwZSk7a2EucHJvdG90eXBlLmNvbnN0cnVjdG9yPWthO09iamVjdC5hc3NpZ24oWS5wcm90b3R5cGUse2NvbXB1dGVHcm91cHM6ZnVuY3Rpb24oYSl7dmFyIGM9W10sZT12b2lkIDA7YT1hLmZhY2VzO2Zvcih2YXIgZz0wO2c8YS5sZW5ndGg7ZysrKXt2YXIgcj1hW2ddO2lmKHIubWF0ZXJpYWxJbmRleCE9PWUpe2U9ci5tYXRlcmlhbEluZGV4O3ZvaWQgMCE9PXYmJih2LmNvdW50PTMqZy12LnN0YXJ0LGMucHVzaCh2KSk7dmFyIHY9e3N0YXJ0OjMqZyxtYXRlcmlhbEluZGV4OmV9fX12b2lkIDAhPT12JiYodi5jb3VudD0zKmctdi5zdGFydCxjLnB1c2godikpO3RoaXMuZ3JvdXBzPWN9LGZyb21HZW9tZXRyeTpmdW5jdGlvbihhKXt2YXIgYz1hLmZhY2VzLGU9YS52ZXJ0aWNlcyxnPWEuZmFjZVZlcnRleFV2cyxyPWdbMF0mJgowPGdbMF0ubGVuZ3RoLHY9Z1sxXSYmMDxnWzFdLmxlbmd0aCx6PWEubW9ycGhUYXJnZXRzLEU9ei5sZW5ndGg7aWYoMDxFKXt2YXIgRj1bXTtmb3IodmFyIEo9MDtKPEU7SisrKUZbSl09e25hbWU6eltKXS5uYW1lLGRhdGE6W119O3RoaXMubW9ycGhUYXJnZXRzLnBvc2l0aW9uPUZ9dmFyIFA9YS5tb3JwaE5vcm1hbHMsUj1QLmxlbmd0aDtpZigwPFIpe3ZhciBTPVtdO2ZvcihKPTA7SjxSO0orKylTW0pdPXtuYW1lOlBbSl0ubmFtZSxkYXRhOltdfTt0aGlzLm1vcnBoVGFyZ2V0cy5ub3JtYWw9U312YXIgVj1hLnNraW5JbmRpY2VzLFc9YS5za2luV2VpZ2h0cyxoYT1WLmxlbmd0aD09PWUubGVuZ3RoLGZhPVcubGVuZ3RoPT09ZS5sZW5ndGg7MDxlLmxlbmd0aCYmMD09PWMubGVuZ3RoJiZjb25zb2xlLmVycm9yKCJUSFJFRS5EaXJlY3RHZW9tZXRyeTogRmFjZWxlc3MgZ2VvbWV0cmllcyBhcmUgbm90IHN1cHBvcnRlZC4iKTtmb3IoSj0wO0o8Yy5sZW5ndGg7SisrKXt2YXIgcmE9Y1tKXTsKdGhpcy52ZXJ0aWNlcy5wdXNoKGVbcmEuYV0sZVtyYS5iXSxlW3JhLmNdKTt2YXIgcGE9cmEudmVydGV4Tm9ybWFsczszPT09cGEubGVuZ3RoP3RoaXMubm9ybWFscy5wdXNoKHBhWzBdLHBhWzFdLHBhWzJdKToocGE9cmEubm9ybWFsLHRoaXMubm9ybWFscy5wdXNoKHBhLHBhLHBhKSk7cGE9cmEudmVydGV4Q29sb3JzOzM9PT1wYS5sZW5ndGg/dGhpcy5jb2xvcnMucHVzaChwYVswXSxwYVsxXSxwYVsyXSk6KHBhPXJhLmNvbG9yLHRoaXMuY29sb3JzLnB1c2gocGEscGEscGEpKTshMD09PXImJihwYT1nWzBdW0pdLHZvaWQgMCE9PXBhP3RoaXMudXZzLnB1c2gocGFbMF0scGFbMV0scGFbMl0pOihjb25zb2xlLndhcm4oIlRIUkVFLkRpcmVjdEdlb21ldHJ5LmZyb21HZW9tZXRyeSgpOiBVbmRlZmluZWQgdmVydGV4VXYgIixKKSx0aGlzLnV2cy5wdXNoKG5ldyBmLG5ldyBmLG5ldyBmKSkpOyEwPT09diYmKHBhPWdbMV1bSl0sdm9pZCAwIT09cGE/dGhpcy51dnMyLnB1c2gocGFbMF0sCnBhWzFdLHBhWzJdKTooY29uc29sZS53YXJuKCJUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2MiAiLEopLHRoaXMudXZzMi5wdXNoKG5ldyBmLG5ldyBmLG5ldyBmKSkpO2ZvcihwYT0wO3BhPEU7cGErKyl7dmFyIHFhPXpbcGFdLnZlcnRpY2VzO0ZbcGFdLmRhdGEucHVzaChxYVtyYS5hXSxxYVtyYS5iXSxxYVtyYS5jXSl9Zm9yKHBhPTA7cGE8UjtwYSsrKXFhPVBbcGFdLnZlcnRleE5vcm1hbHNbSl0sU1twYV0uZGF0YS5wdXNoKHFhLmEscWEuYixxYS5jKTtoYSYmdGhpcy5za2luSW5kaWNlcy5wdXNoKFZbcmEuYV0sVltyYS5iXSxWW3JhLmNdKTtmYSYmdGhpcy5za2luV2VpZ2h0cy5wdXNoKFdbcmEuYV0sV1tyYS5iXSxXW3JhLmNdKX10aGlzLmNvbXB1dGVHcm91cHMoYSk7dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGU9YS52ZXJ0aWNlc05lZWRVcGRhdGU7dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT1hLm5vcm1hbHNOZWVkVXBkYXRlOwp0aGlzLmNvbG9yc05lZWRVcGRhdGU9YS5jb2xvcnNOZWVkVXBkYXRlO3RoaXMudXZzTmVlZFVwZGF0ZT1hLnV2c05lZWRVcGRhdGU7dGhpcy5ncm91cHNOZWVkVXBkYXRlPWEuZ3JvdXBzTmVlZFVwZGF0ZTtudWxsIT09YS5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9YS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKTtudWxsIT09YS5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9YS5ib3VuZGluZ0JveC5jbG9uZSgpKTtyZXR1cm4gdGhpc319KTt2YXIgUWs9MSxYYz1uZXcgcSxGaT1uZXcgQSxuaD1uZXcgayxnZT1uZXcgdyxHaT1uZXcgdyxKYz1uZXcgazt2YS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6dmEsaXNCdWZmZXJHZW9tZXRyeTohMCxnZXRJbmRleDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmluZGV4fSxzZXRJbmRleDpmdW5jdGlvbihhKXt0aGlzLmluZGV4PUFycmF5LmlzQXJyYXkoYSk/Cm5ldyAoNjU1MzU8RWEoYSk/ZWE6WikoYSwxKTphfSxhZGRBdHRyaWJ1dGU6ZnVuY3Rpb24oYSxjLGUpe2lmKCEoYyYmYy5pc0J1ZmZlckF0dHJpYnV0ZXx8YyYmYy5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKSlyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZEF0dHJpYnV0ZSgpIG5vdyBleHBlY3RzICggbmFtZSwgYXR0cmlidXRlICkuIiksdGhpcy5hZGRBdHRyaWJ1dGUoYSxuZXcgUShjLGUpKTtpZigiaW5kZXgiPT09YSlyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5hZGRBdHRyaWJ1dGU6IFVzZSAuc2V0SW5kZXgoKSBmb3IgaW5kZXggYXR0cmlidXRlLiIpLHRoaXMuc2V0SW5kZXgoYyksdGhpczt0aGlzLmF0dHJpYnV0ZXNbYV09YztyZXR1cm4gdGhpc30sZ2V0QXR0cmlidXRlOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmF0dHJpYnV0ZXNbYV19LHJlbW92ZUF0dHJpYnV0ZTpmdW5jdGlvbihhKXtkZWxldGUgdGhpcy5hdHRyaWJ1dGVzW2FdOwpyZXR1cm4gdGhpc30sYWRkR3JvdXA6ZnVuY3Rpb24oYSxjLGUpe3RoaXMuZ3JvdXBzLnB1c2goe3N0YXJ0OmEsY291bnQ6YyxtYXRlcmlhbEluZGV4OnZvaWQgMCE9PWU/ZTowfSl9LGNsZWFyR3JvdXBzOmZ1bmN0aW9uKCl7dGhpcy5ncm91cHM9W119LHNldERyYXdSYW5nZTpmdW5jdGlvbihhLGMpe3RoaXMuZHJhd1JhbmdlLnN0YXJ0PWE7dGhpcy5kcmF3UmFuZ2UuY291bnQ9Y30sYXBwbHlNYXRyaXg6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO3ZvaWQgMCE9PWMmJihhLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoYyksYy5uZWVkc1VwZGF0ZT0hMCk7dmFyIGU9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbDt2b2lkIDAhPT1lJiYoYz0obmV3IHQpLmdldE5vcm1hbE1hdHJpeChhKSxjLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoZSksZS5uZWVkc1VwZGF0ZT0hMCk7ZT10aGlzLmF0dHJpYnV0ZXMudGFuZ2VudDt2b2lkIDAhPT1lJiYoYz0obmV3IHQpLmdldE5vcm1hbE1hdHJpeChhKSwKYy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGUpLGUubmVlZHNVcGRhdGU9ITApO251bGwhPT10aGlzLmJvdW5kaW5nQm94JiZ0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO251bGwhPT10aGlzLmJvdW5kaW5nU3BoZXJlJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3JldHVybiB0aGlzfSxyb3RhdGVYOmZ1bmN0aW9uKGEpe1hjLm1ha2VSb3RhdGlvblgoYSk7dGhpcy5hcHBseU1hdHJpeChYYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZVk6ZnVuY3Rpb24oYSl7WGMubWFrZVJvdGF0aW9uWShhKTt0aGlzLmFwcGx5TWF0cml4KFhjKTtyZXR1cm4gdGhpc30scm90YXRlWjpmdW5jdGlvbihhKXtYYy5tYWtlUm90YXRpb25aKGEpO3RoaXMuYXBwbHlNYXRyaXgoWGMpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSxjLGUpe1hjLm1ha2VUcmFuc2xhdGlvbihhLGMsZSk7dGhpcy5hcHBseU1hdHJpeChYYyk7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGEsYyxlKXtYYy5tYWtlU2NhbGUoYSwKYyxlKTt0aGlzLmFwcGx5TWF0cml4KFhjKTtyZXR1cm4gdGhpc30sbG9va0F0OmZ1bmN0aW9uKGEpe0ZpLmxvb2tBdChhKTtGaS51cGRhdGVNYXRyaXgoKTt0aGlzLmFwcGx5TWF0cml4KEZpLm1hdHJpeCk7cmV0dXJuIHRoaXN9LGNlbnRlcjpmdW5jdGlvbigpe3RoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7dGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIobmgpLm5lZ2F0ZSgpO3RoaXMudHJhbnNsYXRlKG5oLngsbmgueSxuaC56KTtyZXR1cm4gdGhpc30sc2V0RnJvbU9iamVjdDpmdW5jdGlvbihhKXt2YXIgYz1hLmdlb21ldHJ5O2lmKGEuaXNQb2ludHN8fGEuaXNMaW5lKXthPW5ldyBjYSgzKmMudmVydGljZXMubGVuZ3RoLDMpO3ZhciBlPW5ldyBjYSgzKmMuY29sb3JzLmxlbmd0aCwzKTt0aGlzLmFkZEF0dHJpYnV0ZSgicG9zaXRpb24iLGEuY29weVZlY3RvcjNzQXJyYXkoYy52ZXJ0aWNlcykpO3RoaXMuYWRkQXR0cmlidXRlKCJjb2xvciIsZS5jb3B5Q29sb3JzQXJyYXkoYy5jb2xvcnMpKTsKYy5saW5lRGlzdGFuY2VzJiZjLmxpbmVEaXN0YW5jZXMubGVuZ3RoPT09Yy52ZXJ0aWNlcy5sZW5ndGgmJihhPW5ldyBjYShjLmxpbmVEaXN0YW5jZXMubGVuZ3RoLDEpLHRoaXMuYWRkQXR0cmlidXRlKCJsaW5lRGlzdGFuY2UiLGEuY29weUFycmF5KGMubGluZURpc3RhbmNlcykpKTtudWxsIT09Yy5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9Yy5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKTtudWxsIT09Yy5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9Yy5ib3VuZGluZ0JveC5jbG9uZSgpKX1lbHNlIGEuaXNNZXNoJiZjJiZjLmlzR2VvbWV0cnkmJnRoaXMuZnJvbUdlb21ldHJ5KGMpO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKXt2YXIgcj1hW2VdO2MucHVzaChyLngsci55LHIuenx8MCl9dGhpcy5hZGRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgY2EoYywzKSk7CnJldHVybiB0aGlzfSx1cGRhdGVGcm9tT2JqZWN0OmZ1bmN0aW9uKGEpe3ZhciBjPWEuZ2VvbWV0cnk7aWYoYS5pc01lc2gpe3ZhciBlPWMuX19kaXJlY3RHZW9tZXRyeTshMD09PWMuZWxlbWVudHNOZWVkVXBkYXRlJiYoZT12b2lkIDAsYy5lbGVtZW50c05lZWRVcGRhdGU9ITEpO2lmKHZvaWQgMD09PWUpcmV0dXJuIHRoaXMuZnJvbUdlb21ldHJ5KGMpO2UudmVydGljZXNOZWVkVXBkYXRlPWMudmVydGljZXNOZWVkVXBkYXRlO2Uubm9ybWFsc05lZWRVcGRhdGU9Yy5ub3JtYWxzTmVlZFVwZGF0ZTtlLmNvbG9yc05lZWRVcGRhdGU9Yy5jb2xvcnNOZWVkVXBkYXRlO2UudXZzTmVlZFVwZGF0ZT1jLnV2c05lZWRVcGRhdGU7ZS5ncm91cHNOZWVkVXBkYXRlPWMuZ3JvdXBzTmVlZFVwZGF0ZTtjLnZlcnRpY2VzTmVlZFVwZGF0ZT0hMTtjLm5vcm1hbHNOZWVkVXBkYXRlPSExO2MuY29sb3JzTmVlZFVwZGF0ZT0hMTtjLnV2c05lZWRVcGRhdGU9ITE7Yy5ncm91cHNOZWVkVXBkYXRlPSExOwpjPWV9ITA9PT1jLnZlcnRpY2VzTmVlZFVwZGF0ZSYmKGU9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLHZvaWQgMCE9PWUmJihlLmNvcHlWZWN0b3Izc0FycmF5KGMudmVydGljZXMpLGUubmVlZHNVcGRhdGU9ITApLGMudmVydGljZXNOZWVkVXBkYXRlPSExKTshMD09PWMubm9ybWFsc05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy5ub3JtYWwsdm9pZCAwIT09ZSYmKGUuY29weVZlY3RvcjNzQXJyYXkoYy5ub3JtYWxzKSxlLm5lZWRzVXBkYXRlPSEwKSxjLm5vcm1hbHNOZWVkVXBkYXRlPSExKTshMD09PWMuY29sb3JzTmVlZFVwZGF0ZSYmKGU9dGhpcy5hdHRyaWJ1dGVzLmNvbG9yLHZvaWQgMCE9PWUmJihlLmNvcHlDb2xvcnNBcnJheShjLmNvbG9ycyksZS5uZWVkc1VwZGF0ZT0hMCksYy5jb2xvcnNOZWVkVXBkYXRlPSExKTtjLnV2c05lZWRVcGRhdGUmJihlPXRoaXMuYXR0cmlidXRlcy51dix2b2lkIDAhPT1lJiYoZS5jb3B5VmVjdG9yMnNBcnJheShjLnV2cyksZS5uZWVkc1VwZGF0ZT0KITApLGMudXZzTmVlZFVwZGF0ZT0hMSk7Yy5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZSYmKGU9dGhpcy5hdHRyaWJ1dGVzLmxpbmVEaXN0YW5jZSx2b2lkIDAhPT1lJiYoZS5jb3B5QXJyYXkoYy5saW5lRGlzdGFuY2VzKSxlLm5lZWRzVXBkYXRlPSEwKSxjLmxpbmVEaXN0YW5jZXNOZWVkVXBkYXRlPSExKTtjLmdyb3Vwc05lZWRVcGRhdGUmJihjLmNvbXB1dGVHcm91cHMoYS5nZW9tZXRyeSksdGhpcy5ncm91cHM9Yy5ncm91cHMsYy5ncm91cHNOZWVkVXBkYXRlPSExKTtyZXR1cm4gdGhpc30sZnJvbUdlb21ldHJ5OmZ1bmN0aW9uKGEpe2EuX19kaXJlY3RHZW9tZXRyeT0obmV3IFkpLmZyb21HZW9tZXRyeShhKTtyZXR1cm4gdGhpcy5mcm9tRGlyZWN0R2VvbWV0cnkoYS5fX2RpcmVjdEdlb21ldHJ5KX0sZnJvbURpcmVjdEdlb21ldHJ5OmZ1bmN0aW9uKGEpe3RoaXMuYWRkQXR0cmlidXRlKCJwb3NpdGlvbiIsKG5ldyBRKG5ldyBGbG9hdDMyQXJyYXkoMyphLnZlcnRpY2VzLmxlbmd0aCksCjMpKS5jb3B5VmVjdG9yM3NBcnJheShhLnZlcnRpY2VzKSk7MDxhLm5vcm1hbHMubGVuZ3RoJiZ0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIiwobmV3IFEobmV3IEZsb2F0MzJBcnJheSgzKmEubm9ybWFscy5sZW5ndGgpLDMpKS5jb3B5VmVjdG9yM3NBcnJheShhLm5vcm1hbHMpKTswPGEuY29sb3JzLmxlbmd0aCYmdGhpcy5hZGRBdHRyaWJ1dGUoImNvbG9yIiwobmV3IFEobmV3IEZsb2F0MzJBcnJheSgzKmEuY29sb3JzLmxlbmd0aCksMykpLmNvcHlDb2xvcnNBcnJheShhLmNvbG9ycykpOzA8YS51dnMubGVuZ3RoJiZ0aGlzLmFkZEF0dHJpYnV0ZSgidXYiLChuZXcgUShuZXcgRmxvYXQzMkFycmF5KDIqYS51dnMubGVuZ3RoKSwyKSkuY29weVZlY3RvcjJzQXJyYXkoYS51dnMpKTswPGEudXZzMi5sZW5ndGgmJnRoaXMuYWRkQXR0cmlidXRlKCJ1djIiLChuZXcgUShuZXcgRmxvYXQzMkFycmF5KDIqYS51dnMyLmxlbmd0aCksMikpLmNvcHlWZWN0b3Iyc0FycmF5KGEudXZzMikpOwp0aGlzLmdyb3Vwcz1hLmdyb3Vwcztmb3IodmFyIGMgaW4gYS5tb3JwaFRhcmdldHMpe2Zvcih2YXIgZT1bXSxnPWEubW9ycGhUYXJnZXRzW2NdLHI9MCx2PWcubGVuZ3RoO3I8djtyKyspe3ZhciB6PWdbcl0sRT1uZXcgY2EoMyp6LmRhdGEubGVuZ3RoLDMpO0UubmFtZT16Lm5hbWU7ZS5wdXNoKEUuY29weVZlY3RvcjNzQXJyYXkoei5kYXRhKSl9dGhpcy5tb3JwaEF0dHJpYnV0ZXNbY109ZX0wPGEuc2tpbkluZGljZXMubGVuZ3RoJiYoYz1uZXcgY2EoNCphLnNraW5JbmRpY2VzLmxlbmd0aCw0KSx0aGlzLmFkZEF0dHJpYnV0ZSgic2tpbkluZGV4IixjLmNvcHlWZWN0b3I0c0FycmF5KGEuc2tpbkluZGljZXMpKSk7MDxhLnNraW5XZWlnaHRzLmxlbmd0aCYmKGM9bmV3IGNhKDQqYS5za2luV2VpZ2h0cy5sZW5ndGgsNCksdGhpcy5hZGRBdHRyaWJ1dGUoInNraW5XZWlnaHQiLGMuY29weVZlY3RvcjRzQXJyYXkoYS5za2luV2VpZ2h0cykpKTtudWxsIT09YS5ib3VuZGluZ1NwaGVyZSYmCih0aGlzLmJvdW5kaW5nU3BoZXJlPWEuYm91bmRpbmdTcGhlcmUuY2xvbmUoKSk7bnVsbCE9PWEuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PWEuYm91bmRpbmdCb3guY2xvbmUoKSk7cmV0dXJuIHRoaXN9LGNvbXB1dGVCb3VuZGluZ0JveDpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nQm94JiYodGhpcy5ib3VuZGluZ0JveD1uZXcgdyk7dmFyIGE9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uLGM9dGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247aWYodm9pZCAwIT09YSl7aWYodGhpcy5ib3VuZGluZ0JveC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGEpLGMpe2E9MDtmb3IodmFyIGU9Yy5sZW5ndGg7YTxlO2ErKylnZS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGNbYV0pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChnZS5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChnZS5tYXgpfX1lbHNlIHRoaXMuYm91bmRpbmdCb3gubWFrZUVtcHR5KCk7Cihpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi54KXx8aXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueSl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnopKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nQm94OiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX0sY29tcHV0ZUJvdW5kaW5nU3BoZXJlOmZ1bmN0aW9uKCl7bnVsbD09PXRoaXMuYm91bmRpbmdTcGhlcmUmJih0aGlzLmJvdW5kaW5nU3BoZXJlPW5ldyBHKTt2YXIgYT10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sYz10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZihhKXt2YXIgZT10aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjtnZS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGEpO2lmKGMpZm9yKHZhciBnPTAscj1jLmxlbmd0aDtnPHI7ZysrKXt2YXIgdj0KY1tnXTtHaS5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHYpO2dlLmV4cGFuZEJ5UG9pbnQoR2kubWluKTtnZS5leHBhbmRCeVBvaW50KEdpLm1heCl9Z2UuZ2V0Q2VudGVyKGUpO3ZhciB6PTA7Zz0wO2ZvcihyPWEuY291bnQ7ZzxyO2crKylKYy5mcm9tQnVmZmVyQXR0cmlidXRlKGEsZyksej1NYXRoLm1heCh6LGUuZGlzdGFuY2VUb1NxdWFyZWQoSmMpKTtpZihjKWZvcihnPTAscj1jLmxlbmd0aDtnPHI7ZysrKXt2PWNbZ107YT0wO2Zvcih2YXIgRT12LmNvdW50O2E8RTthKyspSmMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh2LGEpLHo9TWF0aC5tYXgoeixlLmRpc3RhbmNlVG9TcXVhcmVkKEpjKSl9dGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXM9TWF0aC5zcXJ0KHopO2lzTmFOKHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzKSYmY29uc29sZS5lcnJvcignVEhSRUUuQnVmZmVyR2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk6IENvbXB1dGVkIHJhZGl1cyBpcyBOYU4uIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsCnRoaXMpfX0sY29tcHV0ZUZhY2VOb3JtYWxzOmZ1bmN0aW9uKCl7fSxjb21wdXRlVmVydGV4Tm9ybWFsczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuaW5kZXgsYz10aGlzLmF0dHJpYnV0ZXM7aWYoYy5wb3NpdGlvbil7dmFyIGU9Yy5wb3NpdGlvbi5hcnJheTtpZih2b2lkIDA9PT1jLm5vcm1hbCl0aGlzLmFkZEF0dHJpYnV0ZSgibm9ybWFsIixuZXcgUShuZXcgRmxvYXQzMkFycmF5KGUubGVuZ3RoKSwzKSk7ZWxzZSBmb3IodmFyIGc9Yy5ub3JtYWwuYXJyYXkscj0wLHY9Zy5sZW5ndGg7cjx2O3IrKylnW3JdPTA7Zz1jLm5vcm1hbC5hcnJheTt2YXIgej1uZXcgayxFPW5ldyBrLEY9bmV3IGssSj1uZXcgayxQPW5ldyBrO2lmKGEpe3ZhciBSPWEuYXJyYXk7cj0wO2Zvcih2PWEuY291bnQ7cjx2O3IrPTMpe2E9MypSW3IrMF07dmFyIFM9MypSW3IrMV07dmFyIFY9MypSW3IrMl07ei5mcm9tQXJyYXkoZSxhKTtFLmZyb21BcnJheShlLFMpO0YuZnJvbUFycmF5KGUsVik7Si5zdWJWZWN0b3JzKEYsCkUpO1Auc3ViVmVjdG9ycyh6LEUpO0ouY3Jvc3MoUCk7Z1thXSs9Si54O2dbYSsxXSs9Si55O2dbYSsyXSs9Si56O2dbU10rPUoueDtnW1MrMV0rPUoueTtnW1MrMl0rPUouejtnW1ZdKz1KLng7Z1tWKzFdKz1KLnk7Z1tWKzJdKz1KLnp9fWVsc2UgZm9yKHI9MCx2PWUubGVuZ3RoO3I8djtyKz05KXouZnJvbUFycmF5KGUsciksRS5mcm9tQXJyYXkoZSxyKzMpLEYuZnJvbUFycmF5KGUscis2KSxKLnN1YlZlY3RvcnMoRixFKSxQLnN1YlZlY3RvcnMoeixFKSxKLmNyb3NzKFApLGdbcl09Si54LGdbcisxXT1KLnksZ1tyKzJdPUoueixnW3IrM109Si54LGdbcis0XT1KLnksZ1tyKzVdPUoueixnW3IrNl09Si54LGdbcis3XT1KLnksZ1tyKzhdPUouejt0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTtjLm5vcm1hbC5uZWVkc1VwZGF0ZT0hMH19LG1lcmdlOmZ1bmN0aW9uKGEsYyl7aWYoYSYmYS5pc0J1ZmZlckdlb21ldHJ5KXt2b2lkIDA9PT1jJiYoYz0wLGNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogT3ZlcndyaXRpbmcgb3JpZ2luYWwgZ2VvbWV0cnksIHN0YXJ0aW5nIGF0IG9mZnNldFx4M2QwLiBVc2UgQnVmZmVyR2VvbWV0cnlVdGlscy5tZXJnZUJ1ZmZlckdlb21ldHJpZXMoKSBmb3IgbG9zc2xlc3MgbWVyZ2UuIikpOwp2YXIgZT10aGlzLmF0dHJpYnV0ZXMsZztmb3IoZyBpbiBlKWlmKHZvaWQgMCE9PWEuYXR0cmlidXRlc1tnXSl7dmFyIHI9ZVtnXS5hcnJheSx2PWEuYXR0cmlidXRlc1tnXSx6PXYuYXJyYXksRT12Lml0ZW1TaXplKmM7dj1NYXRoLm1pbih6Lmxlbmd0aCxyLmxlbmd0aC1FKTtmb3IodmFyIEY9MDtGPHY7RisrLEUrKylyW0VdPXpbRl19cmV0dXJuIHRoaXN9Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkJ1ZmZlckdlb21ldHJ5LiIsYSl9LG5vcm1hbGl6ZU5vcm1hbHM6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5hdHRyaWJ1dGVzLm5vcm1hbCxjPTAsZT1hLmNvdW50O2M8ZTtjKyspSmMueD1hLmdldFgoYyksSmMueT1hLmdldFkoYyksSmMuej1hLmdldFooYyksSmMubm9ybWFsaXplKCksYS5zZXRYWVooYyxKYy54LEpjLnksSmMueil9LHRvTm9uSW5kZXhlZDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoUCwKUil7dmFyIFM9UC5hcnJheTtQPVAuaXRlbVNpemU7Zm9yKHZhciBWPW5ldyBTLmNvbnN0cnVjdG9yKFIubGVuZ3RoKlApLFcsaGE9MCxmYT0wLHJhPVIubGVuZ3RoO2ZhPHJhO2ZhKyspe1c9UltmYV0qUDtmb3IodmFyIHBhPTA7cGE8UDtwYSsrKVZbaGErK109U1tXKytdfXJldHVybiBuZXcgUShWLFApfWlmKG51bGw9PT10aGlzLmluZGV4KXJldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLiIpLHRoaXM7dmFyIGM9bmV3IHZhLGU9dGhpcy5pbmRleC5hcnJheSxnPXRoaXMuYXR0cmlidXRlcyxyO2ZvcihyIGluIGcpe3ZhciB2PWdbcl07dj1hKHYsZSk7Yy5hZGRBdHRyaWJ1dGUocix2KX12YXIgej10aGlzLm1vcnBoQXR0cmlidXRlcztmb3IociBpbiB6KXt2YXIgRT1bXSxGPXpbcl07Zz0wO2Zvcih2YXIgSj1GLmxlbmd0aDtnPEo7ZysrKXY9RltnXSx2PWEodixlKSxFLnB1c2godik7CmMubW9ycGhBdHRyaWJ1dGVzW3JdPUV9ZT10aGlzLmdyb3VwcztnPTA7Zm9yKHI9ZS5sZW5ndGg7ZzxyO2crKyl2PWVbZ10sYy5hZGRHcm91cCh2LnN0YXJ0LHYuY291bnQsdi5tYXRlcmlhbEluZGV4KTtyZXR1cm4gY30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGE9e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJCdWZmZXJHZW9tZXRyeSIsZ2VuZXJhdG9yOiJCdWZmZXJHZW9tZXRyeS50b0pTT04ifX07YS51dWlkPXRoaXMudXVpZDthLnR5cGU9dGhpcy50eXBlOyIiIT09dGhpcy5uYW1lJiYoYS5uYW1lPXRoaXMubmFtZSk7MDxPYmplY3Qua2V5cyh0aGlzLnVzZXJEYXRhKS5sZW5ndGgmJihhLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpO2lmKHZvaWQgMCE9PXRoaXMucGFyYW1ldGVycyl7dmFyIGM9dGhpcy5wYXJhbWV0ZXJzO2ZvcihKIGluIGMpdm9pZCAwIT09Y1tKXSYmKGFbSl09Y1tKXSk7cmV0dXJuIGF9YS5kYXRhPXthdHRyaWJ1dGVzOnt9fTtjPXRoaXMuaW5kZXg7bnVsbCE9PQpjJiYoYS5kYXRhLmluZGV4PXt0eXBlOmMuYXJyYXkuY29uc3RydWN0b3IubmFtZSxhcnJheTpBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjLmFycmF5KX0pO3ZhciBlPXRoaXMuYXR0cmlidXRlcztmb3IoSiBpbiBlKXtjPWVbSl07dmFyIGc9Yy50b0pTT04oKTsiIiE9PWMubmFtZSYmKGcubmFtZT1jLm5hbWUpO2EuZGF0YS5hdHRyaWJ1dGVzW0pdPWd9ZT17fTt2YXIgcj0hMTtmb3IoSiBpbiB0aGlzLm1vcnBoQXR0cmlidXRlcyl7Zm9yKHZhciB2PXRoaXMubW9ycGhBdHRyaWJ1dGVzW0pdLHo9W10sRT0wLEY9di5sZW5ndGg7RTxGO0UrKyljPXZbRV0sZz1jLnRvSlNPTigpLCIiIT09Yy5uYW1lJiYoZy5uYW1lPWMubmFtZSksei5wdXNoKGcpOzA8ei5sZW5ndGgmJihlW0pdPXoscj0hMCl9ciYmKGEuZGF0YS5tb3JwaEF0dHJpYnV0ZXM9ZSk7dmFyIEo9dGhpcy5ncm91cHM7MDxKLmxlbmd0aCYmKGEuZGF0YS5ncm91cHM9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShKKSkpO0o9CnRoaXMuYm91bmRpbmdTcGhlcmU7bnVsbCE9PUomJihhLmRhdGEuYm91bmRpbmdTcGhlcmU9e2NlbnRlcjpKLmNlbnRlci50b0FycmF5KCkscmFkaXVzOkoucmFkaXVzfSk7cmV0dXJuIGF9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB2YSkuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt2YXIgYzt0aGlzLmluZGV4PW51bGw7dGhpcy5hdHRyaWJ1dGVzPXt9O3RoaXMubW9ycGhBdHRyaWJ1dGVzPXt9O3RoaXMuZ3JvdXBzPVtdO3RoaXMuYm91bmRpbmdTcGhlcmU9dGhpcy5ib3VuZGluZ0JveD1udWxsO3RoaXMubmFtZT1hLm5hbWU7dmFyIGU9YS5pbmRleDtudWxsIT09ZSYmdGhpcy5zZXRJbmRleChlLmNsb25lKCkpO2U9YS5hdHRyaWJ1dGVzO2Zvcih6IGluIGUpdGhpcy5hZGRBdHRyaWJ1dGUoeixlW3pdLmNsb25lKCkpO3ZhciBnPWEubW9ycGhBdHRyaWJ1dGVzO2Zvcih6IGluIGcpe3ZhciByPVtdLHY9Z1t6XTtlPTA7Zm9yKGM9di5sZW5ndGg7ZTxjO2UrKylyLnB1c2godltlXS5jbG9uZSgpKTsKdGhpcy5tb3JwaEF0dHJpYnV0ZXNbel09cn12YXIgej1hLmdyb3VwcztlPTA7Zm9yKGM9ei5sZW5ndGg7ZTxjO2UrKylnPXpbZV0sdGhpcy5hZGRHcm91cChnLnN0YXJ0LGcuY291bnQsZy5tYXRlcmlhbEluZGV4KTt6PWEuYm91bmRpbmdCb3g7bnVsbCE9PXomJih0aGlzLmJvdW5kaW5nQm94PXouY2xvbmUoKSk7ej1hLmJvdW5kaW5nU3BoZXJlO251bGwhPT16JiYodGhpcy5ib3VuZGluZ1NwaGVyZT16LmNsb25lKCkpO3RoaXMuZHJhd1JhbmdlLnN0YXJ0PWEuZHJhd1JhbmdlLnN0YXJ0O3RoaXMuZHJhd1JhbmdlLmNvdW50PWEuZHJhd1JhbmdlLmNvdW50O3RoaXMudXNlckRhdGE9YS51c2VyRGF0YTtyZXR1cm4gdGhpc30sZGlzcG9zZTpmdW5jdGlvbigpe3RoaXMuZGlzcGF0Y2hFdmVudCh7dHlwZToiZGlzcG9zZSJ9KX19KTt2YXIgams9bmV3IHEsaGU9bmV3IEQsSGk9bmV3IEcsTGQ9bmV3IGssTWQ9bmV3IGssTmQ9bmV3IGssJGk9bmV3IGssYWo9bmV3IGssYmo9bmV3IGssSWg9Cm5ldyBrLEpoPW5ldyBrLEtoPW5ldyBrLG9lPW5ldyBmLHBlPW5ldyBmLHFlPW5ldyBmLHNmPW5ldyBrLHNnPW5ldyBrO3hhLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp4YSxpc01lc2g6ITAsc2V0RHJhd01vZGU6ZnVuY3Rpb24oYSl7dGhpcy5kcmF3TW9kZT1hfSxjb3B5OmZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZHJhd01vZGU9YS5kcmF3TW9kZTt2b2lkIDAhPT1hLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyYmKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPWEubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCkpO3ZvaWQgMCE9PWEubW9ycGhUYXJnZXREaWN0aW9uYXJ5JiYodGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9T2JqZWN0LmFzc2lnbih7fSxhLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSkpO3JldHVybiB0aGlzfSx1cGRhdGVNb3JwaFRhcmdldHM6ZnVuY3Rpb24oKXt2YXIgYT0KdGhpcy5nZW9tZXRyeTtpZihhLmlzQnVmZmVyR2VvbWV0cnkpe2E9YS5tb3JwaEF0dHJpYnV0ZXM7dmFyIGM9T2JqZWN0LmtleXMoYSk7aWYoMDxjLmxlbmd0aCl7dmFyIGU9YVtjWzBdXTtpZih2b2lkIDAhPT1lKWZvcih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT17fSxhPTAsYz1lLmxlbmd0aDthPGM7YSsrKXt2YXIgZz1lW2FdLm5hbWV8fFN0cmluZyhhKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApO3RoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W2ddPWF9fX1lbHNlIGE9YS5tb3JwaFRhcmdldHMsdm9pZCAwIT09YSYmMDxhLmxlbmd0aCYmY29uc29sZS5lcnJvcigiVEhSRUUuTWVzaC51cGRhdGVNb3JwaFRhcmdldHMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfSxyYXljYXN0OmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5nZW9tZXRyeSwKZz10aGlzLm1hdGVyaWFsLHI9dGhpcy5tYXRyaXhXb3JsZDtpZih2b2lkIDAhPT1nJiYobnVsbD09PWUuYm91bmRpbmdTcGhlcmUmJmUuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksSGkuY29weShlLmJvdW5kaW5nU3BoZXJlKSxIaS5hcHBseU1hdHJpeDQociksITEhPT1hLnJheS5pbnRlcnNlY3RzU3BoZXJlKEhpKSYmKGprLmdldEludmVyc2UociksaGUuY29weShhLnJheSkuYXBwbHlNYXRyaXg0KGprKSxudWxsPT09ZS5ib3VuZGluZ0JveHx8ITEhPT1oZS5pbnRlcnNlY3RzQm94KGUuYm91bmRpbmdCb3gpKSkpaWYoZS5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgdj1lLmluZGV4O3I9ZS5hdHRyaWJ1dGVzLnBvc2l0aW9uO3ZhciB6PWUubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLEU9ZS5hdHRyaWJ1dGVzLnV2LEY9ZS5hdHRyaWJ1dGVzLnV2MixKPWUuZ3JvdXBzLFA9ZS5kcmF3UmFuZ2UsUixTO2lmKG51bGwhPT12KWlmKEFycmF5LmlzQXJyYXkoZykpe3ZhciBWPTA7Zm9yKFI9Si5sZW5ndGg7VjwKUjtWKyspe3ZhciBXPUpbVl07dmFyIGhhPWdbVy5tYXRlcmlhbEluZGV4XTt2YXIgZmE9TWF0aC5tYXgoVy5zdGFydCxQLnN0YXJ0KTtmb3IoUz1lPU1hdGgubWluKFcuc3RhcnQrVy5jb3VudCxQLnN0YXJ0K1AuY291bnQpO2ZhPFM7ZmErPTMpe2U9di5nZXRYKGZhKTt2YXIgcmE9di5nZXRYKGZhKzEpO3ZhciBwYT12LmdldFgoZmErMik7aWYoZT1GYSh0aGlzLGhhLGEsaGUscix6LEUsRixlLHJhLHBhKSllLmZhY2VJbmRleD1NYXRoLmZsb29yKGZhLzMpLGUuZmFjZS5tYXRlcmlhbEluZGV4PVcubWF0ZXJpYWxJbmRleCxjLnB1c2goZSl9fX1lbHNlIGZvcihmYT1NYXRoLm1heCgwLFAuc3RhcnQpLGU9TWF0aC5taW4odi5jb3VudCxQLnN0YXJ0K1AuY291bnQpLFY9ZmEsUj1lO1Y8UjtWKz0zKXtpZihlPXYuZ2V0WChWKSxyYT12LmdldFgoVisxKSxwYT12LmdldFgoVisyKSxlPUZhKHRoaXMsZyxhLGhlLHIseixFLEYsZSxyYSxwYSkpZS5mYWNlSW5kZXg9TWF0aC5mbG9vcihWLzMpLApjLnB1c2goZSl9ZWxzZSBpZih2b2lkIDAhPT1yKWlmKEFycmF5LmlzQXJyYXkoZykpZm9yKFY9MCxSPUoubGVuZ3RoO1Y8UjtWKyspZm9yKFc9SltWXSxoYT1nW1cubWF0ZXJpYWxJbmRleF0sZmE9TWF0aC5tYXgoVy5zdGFydCxQLnN0YXJ0KSxTPWU9TWF0aC5taW4oVy5zdGFydCtXLmNvdW50LFAuc3RhcnQrUC5jb3VudCk7ZmE8UztmYSs9Myl7aWYoZT1mYSxyYT1mYSsxLHBhPWZhKzIsZT1GYSh0aGlzLGhhLGEsaGUscix6LEUsRixlLHJhLHBhKSllLmZhY2VJbmRleD1NYXRoLmZsb29yKGZhLzMpLGUuZmFjZS5tYXRlcmlhbEluZGV4PVcubWF0ZXJpYWxJbmRleCxjLnB1c2goZSl9ZWxzZSBmb3IoZmE9TWF0aC5tYXgoMCxQLnN0YXJ0KSxlPU1hdGgubWluKHIuY291bnQsUC5zdGFydCtQLmNvdW50KSxWPWZhLFI9ZTtWPFI7Vis9MylpZihlPVYscmE9VisxLHBhPVYrMixlPUZhKHRoaXMsZyxhLGhlLHIseixFLEYsZSxyYSxwYSkpZS5mYWNlSW5kZXg9TWF0aC5mbG9vcihWLzMpLGMucHVzaChlKX1lbHNlIGlmKGUuaXNHZW9tZXRyeSlmb3Iocj0KQXJyYXkuaXNBcnJheShnKSx6PWUudmVydGljZXMsRT1lLmZhY2VzLGU9ZS5mYWNlVmVydGV4VXZzWzBdLDA8ZS5sZW5ndGgmJih2PWUpLFY9MCxSPUUubGVuZ3RoO1Y8UjtWKyspaWYoVz1FW1ZdLGU9cj9nW1cubWF0ZXJpYWxJbmRleF06Zyx2b2lkIDAhPT1lJiYoRj16W1cuYV0sSj16W1cuYl0sUD16W1cuY10sZT1BYSh0aGlzLGUsYSxoZSxGLEosUCxzZikpKXYmJnZbVl0mJihoYT12W1ZdLG9lLmNvcHkoaGFbMF0pLHBlLmNvcHkoaGFbMV0pLHFlLmNvcHkoaGFbMl0pLGUudXY9Qi5nZXRVVihzZixGLEosUCxvZSxwZSxxZSxuZXcgZikpLGUuZmFjZT1XLGUuZmFjZUluZGV4PVYsYy5wdXNoKGUpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLmdlb21ldHJ5LHRoaXMubWF0ZXJpYWwpKS5jb3B5KHRoaXMpfX0pO3ZhciBSaz0wLFljPW5ldyBxLElpPW5ldyBBLG9oPW5ldyBrO3lhLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoZC5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6eWEsaXNHZW9tZXRyeTohMCxhcHBseU1hdHJpeDpmdW5jdGlvbihhKXtmb3IodmFyIGM9KG5ldyB0KS5nZXROb3JtYWxNYXRyaXgoYSksZT0wLGc9dGhpcy52ZXJ0aWNlcy5sZW5ndGg7ZTxnO2UrKyl0aGlzLnZlcnRpY2VzW2VdLmFwcGx5TWF0cml4NChhKTtlPTA7Zm9yKGc9dGhpcy5mYWNlcy5sZW5ndGg7ZTxnO2UrKyl7YT10aGlzLmZhY2VzW2VdO2Eubm9ybWFsLmFwcGx5TWF0cml4MyhjKS5ub3JtYWxpemUoKTtmb3IodmFyIHI9MCx2PWEudmVydGV4Tm9ybWFscy5sZW5ndGg7cjx2O3IrKylhLnZlcnRleE5vcm1hbHNbcl0uYXBwbHlNYXRyaXgzKGMpLm5vcm1hbGl6ZSgpfW51bGwhPT10aGlzLmJvdW5kaW5nQm94JiZ0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpO251bGwhPT10aGlzLmJvdW5kaW5nU3BoZXJlJiZ0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3RoaXMubm9ybWFsc05lZWRVcGRhdGU9dGhpcy52ZXJ0aWNlc05lZWRVcGRhdGU9ITA7cmV0dXJuIHRoaXN9LApyb3RhdGVYOmZ1bmN0aW9uKGEpe1ljLm1ha2VSb3RhdGlvblgoYSk7dGhpcy5hcHBseU1hdHJpeChZYyk7cmV0dXJuIHRoaXN9LHJvdGF0ZVk6ZnVuY3Rpb24oYSl7WWMubWFrZVJvdGF0aW9uWShhKTt0aGlzLmFwcGx5TWF0cml4KFljKTtyZXR1cm4gdGhpc30scm90YXRlWjpmdW5jdGlvbihhKXtZYy5tYWtlUm90YXRpb25aKGEpO3RoaXMuYXBwbHlNYXRyaXgoWWMpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSxjLGUpe1ljLm1ha2VUcmFuc2xhdGlvbihhLGMsZSk7dGhpcy5hcHBseU1hdHJpeChZYyk7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGEsYyxlKXtZYy5tYWtlU2NhbGUoYSxjLGUpO3RoaXMuYXBwbHlNYXRyaXgoWWMpO3JldHVybiB0aGlzfSxsb29rQXQ6ZnVuY3Rpb24oYSl7SWkubG9va0F0KGEpO0lpLnVwZGF0ZU1hdHJpeCgpO3RoaXMuYXBwbHlNYXRyaXgoSWkubWF0cml4KTtyZXR1cm4gdGhpc30sZnJvbUJ1ZmZlckdlb21ldHJ5OmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoViwKVyxoYSxmYSl7dmFyIHJhPXZvaWQgMD09PUU/W106W2UuY29sb3JzW1ZdLmNsb25lKCksZS5jb2xvcnNbV10uY2xvbmUoKSxlLmNvbG9yc1toYV0uY2xvbmUoKV0scGE9dm9pZCAwPT09ej9bXTpbKG5ldyBrKS5mcm9tQXJyYXkoeiwzKlYpLChuZXcgaykuZnJvbUFycmF5KHosMypXKSwobmV3IGspLmZyb21BcnJheSh6LDMqaGEpXTtmYT1uZXcgSyhWLFcsaGEscGEscmEsZmEpO2UuZmFjZXMucHVzaChmYSk7dm9pZCAwIT09RiYmZS5mYWNlVmVydGV4VXZzWzBdLnB1c2goWyhuZXcgZikuZnJvbUFycmF5KEYsMipWKSwobmV3IGYpLmZyb21BcnJheShGLDIqVyksKG5ldyBmKS5mcm9tQXJyYXkoRiwyKmhhKV0pO3ZvaWQgMCE9PUomJmUuZmFjZVZlcnRleFV2c1sxXS5wdXNoKFsobmV3IGYpLmZyb21BcnJheShKLDIqViksKG5ldyBmKS5mcm9tQXJyYXkoSiwyKlcpLChuZXcgZikuZnJvbUFycmF5KEosMipoYSldKX12YXIgZT10aGlzLGc9bnVsbCE9PWEuaW5kZXg/YS5pbmRleC5hcnJheToKdm9pZCAwLHI9YS5hdHRyaWJ1dGVzLHY9ci5wb3NpdGlvbi5hcnJheSx6PXZvaWQgMCE9PXIubm9ybWFsP3Iubm9ybWFsLmFycmF5OnZvaWQgMCxFPXZvaWQgMCE9PXIuY29sb3I/ci5jb2xvci5hcnJheTp2b2lkIDAsRj12b2lkIDAhPT1yLnV2P3IudXYuYXJyYXk6dm9pZCAwLEo9dm9pZCAwIT09ci51djI/ci51djIuYXJyYXk6dm9pZCAwO3ZvaWQgMCE9PUomJih0aGlzLmZhY2VWZXJ0ZXhVdnNbMV09W10pO2ZvcihyPTA7cjx2Lmxlbmd0aDtyKz0zKWUudmVydGljZXMucHVzaCgobmV3IGspLmZyb21BcnJheSh2LHIpKSx2b2lkIDAhPT1FJiZlLmNvbG9ycy5wdXNoKChuZXcgSSkuZnJvbUFycmF5KEUscikpO3ZhciBQPWEuZ3JvdXBzO2lmKDA8UC5sZW5ndGgpZm9yKHI9MDtyPFAubGVuZ3RoO3IrKyl7dj1QW3JdO3ZhciBSPXYuc3RhcnQsUz1SO2ZvcihSKz12LmNvdW50O1M8UjtTKz0zKXZvaWQgMCE9PWc/YyhnW1NdLGdbUysxXSxnW1MrMl0sdi5tYXRlcmlhbEluZGV4KTpjKFMsClMrMSxTKzIsdi5tYXRlcmlhbEluZGV4KX1lbHNlIGlmKHZvaWQgMCE9PWcpZm9yKHI9MDtyPGcubGVuZ3RoO3IrPTMpYyhnW3JdLGdbcisxXSxnW3IrMl0pO2Vsc2UgZm9yKHI9MDtyPHYubGVuZ3RoLzM7cis9MyljKHIscisxLHIrMik7dGhpcy5jb21wdXRlRmFjZU5vcm1hbHMoKTtudWxsIT09YS5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9YS5ib3VuZGluZ0JveC5jbG9uZSgpKTtudWxsIT09YS5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9YS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpKTtyZXR1cm4gdGhpc30sY2VudGVyOmZ1bmN0aW9uKCl7dGhpcy5jb21wdXRlQm91bmRpbmdCb3goKTt0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihvaCkubmVnYXRlKCk7dGhpcy50cmFuc2xhdGUob2gueCxvaC55LG9oLnopO3JldHVybiB0aGlzfSxub3JtYWxpemU6ZnVuY3Rpb24oKXt0aGlzLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3ZhciBhPXRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyLApjPXRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzO2M9MD09PWM/MToxL2M7dmFyIGU9bmV3IHE7ZS5zZXQoYywwLDAsLWMqYS54LDAsYywwLC1jKmEueSwwLDAsYywtYyphLnosMCwwLDAsMSk7dGhpcy5hcHBseU1hdHJpeChlKTtyZXR1cm4gdGhpc30sY29tcHV0ZUZhY2VOb3JtYWxzOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBrLGM9bmV3IGssZT0wLGc9dGhpcy5mYWNlcy5sZW5ndGg7ZTxnO2UrKyl7dmFyIHI9dGhpcy5mYWNlc1tlXSx2PXRoaXMudmVydGljZXNbci5hXSx6PXRoaXMudmVydGljZXNbci5iXTthLnN1YlZlY3RvcnModGhpcy52ZXJ0aWNlc1tyLmNdLHopO2Muc3ViVmVjdG9ycyh2LHopO2EuY3Jvc3MoYyk7YS5ub3JtYWxpemUoKTtyLm5vcm1hbC5jb3B5KGEpfX0sY29tcHV0ZVZlcnRleE5vcm1hbHM6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9ITApO3ZhciBjO3ZhciBlPUFycmF5KHRoaXMudmVydGljZXMubGVuZ3RoKTt2YXIgZz0wO2ZvcihjPXRoaXMudmVydGljZXMubGVuZ3RoO2c8CmM7ZysrKWVbZ109bmV3IGs7aWYoYSl7dmFyIHI9bmV3IGssdj1uZXcgazthPTA7Zm9yKGc9dGhpcy5mYWNlcy5sZW5ndGg7YTxnO2ErKyl7Yz10aGlzLmZhY2VzW2FdO3ZhciB6PXRoaXMudmVydGljZXNbYy5hXTt2YXIgRT10aGlzLnZlcnRpY2VzW2MuYl07dmFyIEY9dGhpcy52ZXJ0aWNlc1tjLmNdO3Iuc3ViVmVjdG9ycyhGLEUpO3Yuc3ViVmVjdG9ycyh6LEUpO3IuY3Jvc3Modik7ZVtjLmFdLmFkZChyKTtlW2MuYl0uYWRkKHIpO2VbYy5jXS5hZGQocil9fWVsc2UgZm9yKHRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCksYT0wLGc9dGhpcy5mYWNlcy5sZW5ndGg7YTxnO2ErKyljPXRoaXMuZmFjZXNbYV0sZVtjLmFdLmFkZChjLm5vcm1hbCksZVtjLmJdLmFkZChjLm5vcm1hbCksZVtjLmNdLmFkZChjLm5vcm1hbCk7Zz0wO2ZvcihjPXRoaXMudmVydGljZXMubGVuZ3RoO2c8YztnKyspZVtnXS5ub3JtYWxpemUoKTthPTA7Zm9yKGc9dGhpcy5mYWNlcy5sZW5ndGg7YTxnO2ErKyljPQp0aGlzLmZhY2VzW2FdLHo9Yy52ZXJ0ZXhOb3JtYWxzLDM9PT16Lmxlbmd0aD8oelswXS5jb3B5KGVbYy5hXSkselsxXS5jb3B5KGVbYy5iXSkselsyXS5jb3B5KGVbYy5jXSkpOih6WzBdPWVbYy5hXS5jbG9uZSgpLHpbMV09ZVtjLmJdLmNsb25lKCkselsyXT1lW2MuY10uY2xvbmUoKSk7MDx0aGlzLmZhY2VzLmxlbmd0aCYmKHRoaXMubm9ybWFsc05lZWRVcGRhdGU9ITApfSxjb21wdXRlRmxhdFZlcnRleE5vcm1hbHM6ZnVuY3Rpb24oKXt2YXIgYTt0aGlzLmNvbXB1dGVGYWNlTm9ybWFscygpO3ZhciBjPTA7Zm9yKGE9dGhpcy5mYWNlcy5sZW5ndGg7YzxhO2MrKyl7dmFyIGU9dGhpcy5mYWNlc1tjXTt2YXIgZz1lLnZlcnRleE5vcm1hbHM7Mz09PWcubGVuZ3RoPyhnWzBdLmNvcHkoZS5ub3JtYWwpLGdbMV0uY29weShlLm5vcm1hbCksZ1syXS5jb3B5KGUubm9ybWFsKSk6KGdbMF09ZS5ub3JtYWwuY2xvbmUoKSxnWzFdPWUubm9ybWFsLmNsb25lKCksZ1syXT1lLm5vcm1hbC5jbG9uZSgpKX0wPAp0aGlzLmZhY2VzLmxlbmd0aCYmKHRoaXMubm9ybWFsc05lZWRVcGRhdGU9ITApfSxjb21wdXRlTW9ycGhOb3JtYWxzOmZ1bmN0aW9uKCl7dmFyIGEsYzt2YXIgZT0wO2ZvcihjPXRoaXMuZmFjZXMubGVuZ3RoO2U8YztlKyspe3ZhciBnPXRoaXMuZmFjZXNbZV07Zy5fX29yaWdpbmFsRmFjZU5vcm1hbD9nLl9fb3JpZ2luYWxGYWNlTm9ybWFsLmNvcHkoZy5ub3JtYWwpOmcuX19vcmlnaW5hbEZhY2VOb3JtYWw9Zy5ub3JtYWwuY2xvbmUoKTtnLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzfHwoZy5fX29yaWdpbmFsVmVydGV4Tm9ybWFscz1bXSk7dmFyIHI9MDtmb3IoYT1nLnZlcnRleE5vcm1hbHMubGVuZ3RoO3I8YTtyKyspZy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1tyXT9nLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzW3JdLmNvcHkoZy52ZXJ0ZXhOb3JtYWxzW3JdKTpnLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzW3JdPWcudmVydGV4Tm9ybWFsc1tyXS5jbG9uZSgpfXZhciB2PW5ldyB5YTsKdi5mYWNlcz10aGlzLmZhY2VzO3I9MDtmb3IoYT10aGlzLm1vcnBoVGFyZ2V0cy5sZW5ndGg7cjxhO3IrKyl7aWYoIXRoaXMubW9ycGhOb3JtYWxzW3JdKXt0aGlzLm1vcnBoTm9ybWFsc1tyXT17fTt0aGlzLm1vcnBoTm9ybWFsc1tyXS5mYWNlTm9ybWFscz1bXTt0aGlzLm1vcnBoTm9ybWFsc1tyXS52ZXJ0ZXhOb3JtYWxzPVtdO2c9dGhpcy5tb3JwaE5vcm1hbHNbcl0uZmFjZU5vcm1hbHM7dmFyIHo9dGhpcy5tb3JwaE5vcm1hbHNbcl0udmVydGV4Tm9ybWFscztlPTA7Zm9yKGM9dGhpcy5mYWNlcy5sZW5ndGg7ZTxjO2UrKyl7dmFyIEU9bmV3IGs7dmFyIEY9e2E6bmV3IGssYjpuZXcgayxjOm5ldyBrfTtnLnB1c2goRSk7ei5wdXNoKEYpfX16PXRoaXMubW9ycGhOb3JtYWxzW3JdO3YudmVydGljZXM9dGhpcy5tb3JwaFRhcmdldHNbcl0udmVydGljZXM7di5jb21wdXRlRmFjZU5vcm1hbHMoKTt2LmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7ZT0wO2ZvcihjPXRoaXMuZmFjZXMubGVuZ3RoO2U8CmM7ZSsrKWc9dGhpcy5mYWNlc1tlXSxFPXouZmFjZU5vcm1hbHNbZV0sRj16LnZlcnRleE5vcm1hbHNbZV0sRS5jb3B5KGcubm9ybWFsKSxGLmEuY29weShnLnZlcnRleE5vcm1hbHNbMF0pLEYuYi5jb3B5KGcudmVydGV4Tm9ybWFsc1sxXSksRi5jLmNvcHkoZy52ZXJ0ZXhOb3JtYWxzWzJdKX1lPTA7Zm9yKGM9dGhpcy5mYWNlcy5sZW5ndGg7ZTxjO2UrKylnPXRoaXMuZmFjZXNbZV0sZy5ub3JtYWw9Zy5fX29yaWdpbmFsRmFjZU5vcm1hbCxnLnZlcnRleE5vcm1hbHM9Zy5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc30sY29tcHV0ZUJvdW5kaW5nQm94OmZ1bmN0aW9uKCl7bnVsbD09PXRoaXMuYm91bmRpbmdCb3gmJih0aGlzLmJvdW5kaW5nQm94PW5ldyB3KTt0aGlzLmJvdW5kaW5nQm94LnNldEZyb21Qb2ludHModGhpcy52ZXJ0aWNlcyl9LGNvbXB1dGVCb3VuZGluZ1NwaGVyZTpmdW5jdGlvbigpe251bGw9PT10aGlzLmJvdW5kaW5nU3BoZXJlJiYodGhpcy5ib3VuZGluZ1NwaGVyZT0KbmV3IEcpO3RoaXMuYm91bmRpbmdTcGhlcmUuc2V0RnJvbVBvaW50cyh0aGlzLnZlcnRpY2VzKX0sbWVyZ2U6ZnVuY3Rpb24oYSxjLGUpe2lmKGEmJmEuaXNHZW9tZXRyeSl7dmFyIGcscj10aGlzLnZlcnRpY2VzLmxlbmd0aCx2PXRoaXMudmVydGljZXMsej1hLnZlcnRpY2VzLEU9dGhpcy5mYWNlcyxGPWEuZmFjZXMsSj10aGlzLmNvbG9ycyxQPWEuY29sb3JzO3ZvaWQgMD09PWUmJihlPTApO3ZvaWQgMCE9PWMmJihnPShuZXcgdCkuZ2V0Tm9ybWFsTWF0cml4KGMpKTtmb3IodmFyIFI9MCxTPXoubGVuZ3RoO1I8UztSKyspe3ZhciBWPXpbUl0uY2xvbmUoKTt2b2lkIDAhPT1jJiZWLmFwcGx5TWF0cml4NChjKTt2LnB1c2goVil9Uj0wO2ZvcihTPVAubGVuZ3RoO1I8UztSKyspSi5wdXNoKFBbUl0uY2xvbmUoKSk7Uj0wO2ZvcihTPUYubGVuZ3RoO1I8UztSKyspe3o9RltSXTt2YXIgVz16LnZlcnRleE5vcm1hbHM7UD16LnZlcnRleENvbG9ycztKPW5ldyBLKHouYStyLHouYityLHouYysKcik7Si5ub3JtYWwuY29weSh6Lm5vcm1hbCk7dm9pZCAwIT09ZyYmSi5ub3JtYWwuYXBwbHlNYXRyaXgzKGcpLm5vcm1hbGl6ZSgpO2M9MDtmb3Iodj1XLmxlbmd0aDtjPHY7YysrKVY9V1tjXS5jbG9uZSgpLHZvaWQgMCE9PWcmJlYuYXBwbHlNYXRyaXgzKGcpLm5vcm1hbGl6ZSgpLEoudmVydGV4Tm9ybWFscy5wdXNoKFYpO0ouY29sb3IuY29weSh6LmNvbG9yKTtjPTA7Zm9yKHY9UC5sZW5ndGg7Yzx2O2MrKylWPVBbY10sSi52ZXJ0ZXhDb2xvcnMucHVzaChWLmNsb25lKCkpO0oubWF0ZXJpYWxJbmRleD16Lm1hdGVyaWFsSW5kZXgrZTtFLnB1c2goSil9Uj0wO2ZvcihTPWEuZmFjZVZlcnRleFV2cy5sZW5ndGg7UjxTO1IrKylmb3IoZT1hLmZhY2VWZXJ0ZXhVdnNbUl0sdm9pZCAwPT09dGhpcy5mYWNlVmVydGV4VXZzW1JdJiYodGhpcy5mYWNlVmVydGV4VXZzW1JdPVtdKSxjPTAsdj1lLmxlbmd0aDtjPHY7YysrKXtnPWVbY107cj1bXTtFPTA7Zm9yKEY9Zy5sZW5ndGg7RTxGO0UrKylyLnB1c2goZ1tFXS5jbG9uZSgpKTsKdGhpcy5mYWNlVmVydGV4VXZzW1JdLnB1c2gocil9fWVsc2UgY29uc29sZS5lcnJvcigiVEhSRUUuR2VvbWV0cnkubWVyZ2UoKTogZ2VvbWV0cnkgbm90IGFuIGluc3RhbmNlIG9mIFRIUkVFLkdlb21ldHJ5LiIsYSl9LG1lcmdlTWVzaDpmdW5jdGlvbihhKXthJiZhLmlzTWVzaD8oYS5tYXRyaXhBdXRvVXBkYXRlJiZhLnVwZGF0ZU1hdHJpeCgpLHRoaXMubWVyZ2UoYS5nZW9tZXRyeSxhLm1hdHJpeCkpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5Lm1lcmdlTWVzaCgpOiBtZXNoIG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5NZXNoLiIsYSl9LG1lcmdlVmVydGljZXM6ZnVuY3Rpb24oKXt2YXIgYT17fSxjPVtdLGU9W10sZz1NYXRoLnBvdygxMCw0KSxyO3ZhciB2PTA7Zm9yKHI9dGhpcy52ZXJ0aWNlcy5sZW5ndGg7djxyO3YrKyl7dmFyIHo9dGhpcy52ZXJ0aWNlc1t2XTt6PU1hdGgucm91bmQoei54KmcpKyJfIitNYXRoLnJvdW5kKHoueSpnKSsiXyIrTWF0aC5yb3VuZCh6LnoqCmcpO3ZvaWQgMD09PWFbel0/KGFbel09dixjLnB1c2godGhpcy52ZXJ0aWNlc1t2XSksZVt2XT1jLmxlbmd0aC0xKTplW3ZdPWVbYVt6XV19YT1bXTt2PTA7Zm9yKHI9dGhpcy5mYWNlcy5sZW5ndGg7djxyO3YrKylmb3IoZz10aGlzLmZhY2VzW3ZdLGcuYT1lW2cuYV0sZy5iPWVbZy5iXSxnLmM9ZVtnLmNdLGc9W2cuYSxnLmIsZy5jXSx6PTA7Mz56O3orKylpZihnW3pdPT09Z1soeisxKSUzXSl7YS5wdXNoKHYpO2JyZWFrfWZvcih2PWEubGVuZ3RoLTE7MDw9djt2LS0pZm9yKGc9YVt2XSx0aGlzLmZhY2VzLnNwbGljZShnLDEpLGU9MCxyPXRoaXMuZmFjZVZlcnRleFV2cy5sZW5ndGg7ZTxyO2UrKyl0aGlzLmZhY2VWZXJ0ZXhVdnNbZV0uc3BsaWNlKGcsMSk7dj10aGlzLnZlcnRpY2VzLmxlbmd0aC1jLmxlbmd0aDt0aGlzLnZlcnRpY2VzPWM7cmV0dXJuIHZ9LHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYSl7dGhpcy52ZXJ0aWNlcz1bXTtmb3IodmFyIGM9MCxlPWEubGVuZ3RoO2M8ZTtjKyspe3ZhciBnPQphW2NdO3RoaXMudmVydGljZXMucHVzaChuZXcgayhnLngsZy55LGcuenx8MCkpfXJldHVybiB0aGlzfSxzb3J0RmFjZXNCeU1hdGVyaWFsSW5kZXg6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5mYWNlcyxjPWEubGVuZ3RoLGU9MDtlPGM7ZSsrKWFbZV0uX2lkPWU7YS5zb3J0KGZ1bmN0aW9uKEYsSil7cmV0dXJuIEYubWF0ZXJpYWxJbmRleC1KLm1hdGVyaWFsSW5kZXh9KTt2YXIgZz10aGlzLmZhY2VWZXJ0ZXhVdnNbMF0scj10aGlzLmZhY2VWZXJ0ZXhVdnNbMV0sdix6O2cmJmcubGVuZ3RoPT09YyYmKHY9W10pO3ImJnIubGVuZ3RoPT09YyYmKHo9W10pO2ZvcihlPTA7ZTxjO2UrKyl7dmFyIEU9YVtlXS5faWQ7diYmdi5wdXNoKGdbRV0pO3omJnoucHVzaChyW0VdKX12JiYodGhpcy5mYWNlVmVydGV4VXZzWzBdPXYpO3omJih0aGlzLmZhY2VWZXJ0ZXhVdnNbMV09eil9LHRvSlNPTjpmdW5jdGlvbigpe2Z1bmN0aW9uIGEob2EsdGEsQmEpe3JldHVybiBCYT9vYXwxPDx0YTpvYSYKfigxPDx0YSl9ZnVuY3Rpb24gYyhvYSl7dmFyIHRhPW9hLngudG9TdHJpbmcoKStvYS55LnRvU3RyaW5nKCkrb2Euei50b1N0cmluZygpO2lmKHZvaWQgMCE9PUpbdGFdKXJldHVybiBKW3RhXTtKW3RhXT1GLmxlbmd0aC8zO0YucHVzaChvYS54LG9hLnksb2Eueik7cmV0dXJuIEpbdGFdfWZ1bmN0aW9uIGUob2Epe3ZhciB0YT1vYS5yLnRvU3RyaW5nKCkrb2EuZy50b1N0cmluZygpK29hLmIudG9TdHJpbmcoKTtpZih2b2lkIDAhPT1SW3RhXSlyZXR1cm4gUlt0YV07Ult0YV09UC5sZW5ndGg7UC5wdXNoKG9hLmdldEhleCgpKTtyZXR1cm4gUlt0YV19ZnVuY3Rpb24gZyhvYSl7dmFyIHRhPW9hLngudG9TdHJpbmcoKStvYS55LnRvU3RyaW5nKCk7aWYodm9pZCAwIT09Vlt0YV0pcmV0dXJuIFZbdGFdO1ZbdGFdPVMubGVuZ3RoLzI7Uy5wdXNoKG9hLngsb2EueSk7cmV0dXJuIFZbdGFdfXZhciByPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiR2VvbWV0cnkiLGdlbmVyYXRvcjoiR2VvbWV0cnkudG9KU09OIn19OwpyLnV1aWQ9dGhpcy51dWlkO3IudHlwZT10aGlzLnR5cGU7IiIhPT10aGlzLm5hbWUmJihyLm5hbWU9dGhpcy5uYW1lKTtpZih2b2lkIDAhPT10aGlzLnBhcmFtZXRlcnMpe3ZhciB2PXRoaXMucGFyYW1ldGVycyx6O2Zvcih6IGluIHYpdm9pZCAwIT09dlt6XSYmKHJbel09dlt6XSk7cmV0dXJuIHJ9dj1bXTtmb3Ioej0wO3o8dGhpcy52ZXJ0aWNlcy5sZW5ndGg7eisrKXt2YXIgRT10aGlzLnZlcnRpY2VzW3pdO3YucHVzaChFLngsRS55LEUueil9RT1bXTt2YXIgRj1bXSxKPXt9LFA9W10sUj17fSxTPVtdLFY9e307Zm9yKHo9MDt6PHRoaXMuZmFjZXMubGVuZ3RoO3orKyl7dmFyIFc9dGhpcy5mYWNlc1t6XSxoYT12b2lkIDAhPT10aGlzLmZhY2VWZXJ0ZXhVdnNbMF1bel0sZmE9MDxXLm5vcm1hbC5sZW5ndGgoKSxyYT0wPFcudmVydGV4Tm9ybWFscy5sZW5ndGgscGE9MSE9PVcuY29sb3Iucnx8MSE9PVcuY29sb3IuZ3x8MSE9PVcuY29sb3IuYixxYT0wPFcudmVydGV4Q29sb3JzLmxlbmd0aCwKdWE9MDt1YT1hKHVhLDAsMCk7dWE9YSh1YSwxLCEwKTt1YT1hKHVhLDIsITEpO3VhPWEodWEsMyxoYSk7dWE9YSh1YSw0LGZhKTt1YT1hKHVhLDUscmEpO3VhPWEodWEsNixwYSk7dWE9YSh1YSw3LHFhKTtFLnB1c2godWEpO0UucHVzaChXLmEsVy5iLFcuYyk7RS5wdXNoKFcubWF0ZXJpYWxJbmRleCk7aGEmJihoYT10aGlzLmZhY2VWZXJ0ZXhVdnNbMF1bel0sRS5wdXNoKGcoaGFbMF0pLGcoaGFbMV0pLGcoaGFbMl0pKSk7ZmEmJkUucHVzaChjKFcubm9ybWFsKSk7cmEmJihmYT1XLnZlcnRleE5vcm1hbHMsRS5wdXNoKGMoZmFbMF0pLGMoZmFbMV0pLGMoZmFbMl0pKSk7cGEmJkUucHVzaChlKFcuY29sb3IpKTtxYSYmKFc9Vy52ZXJ0ZXhDb2xvcnMsRS5wdXNoKGUoV1swXSksZShXWzFdKSxlKFdbMl0pKSl9ci5kYXRhPXt9O3IuZGF0YS52ZXJ0aWNlcz12O3IuZGF0YS5ub3JtYWxzPUY7MDxQLmxlbmd0aCYmKHIuZGF0YS5jb2xvcnM9UCk7MDxTLmxlbmd0aCYmKHIuZGF0YS51dnM9CltTXSk7ci5kYXRhLmZhY2VzPUU7cmV0dXJuIHJ9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB5YSkuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt2YXIgYyxlLGc7dGhpcy52ZXJ0aWNlcz1bXTt0aGlzLmNvbG9ycz1bXTt0aGlzLmZhY2VzPVtdO3RoaXMuZmFjZVZlcnRleFV2cz1bW11dO3RoaXMubW9ycGhUYXJnZXRzPVtdO3RoaXMubW9ycGhOb3JtYWxzPVtdO3RoaXMuc2tpbldlaWdodHM9W107dGhpcy5za2luSW5kaWNlcz1bXTt0aGlzLmxpbmVEaXN0YW5jZXM9W107dGhpcy5ib3VuZGluZ1NwaGVyZT10aGlzLmJvdW5kaW5nQm94PW51bGw7dGhpcy5uYW1lPWEubmFtZTt2YXIgcj1hLnZlcnRpY2VzO3ZhciB2PTA7Zm9yKGM9ci5sZW5ndGg7djxjO3YrKyl0aGlzLnZlcnRpY2VzLnB1c2goclt2XS5jbG9uZSgpKTtyPWEuY29sb3JzO3Y9MDtmb3IoYz1yLmxlbmd0aDt2PGM7disrKXRoaXMuY29sb3JzLnB1c2goclt2XS5jbG9uZSgpKTtyPWEuZmFjZXM7dj0wO2ZvcihjPQpyLmxlbmd0aDt2PGM7disrKXRoaXMuZmFjZXMucHVzaChyW3ZdLmNsb25lKCkpO3Y9MDtmb3IoYz1hLmZhY2VWZXJ0ZXhVdnMubGVuZ3RoO3Y8Yzt2Kyspe3ZhciB6PWEuZmFjZVZlcnRleFV2c1t2XTt2b2lkIDA9PT10aGlzLmZhY2VWZXJ0ZXhVdnNbdl0mJih0aGlzLmZhY2VWZXJ0ZXhVdnNbdl09W10pO3I9MDtmb3IoZT16Lmxlbmd0aDtyPGU7cisrKXt2YXIgRT16W3JdLEY9W107dmFyIEo9MDtmb3IoZz1FLmxlbmd0aDtKPGc7SisrKUYucHVzaChFW0pdLmNsb25lKCkpO3RoaXMuZmFjZVZlcnRleFV2c1t2XS5wdXNoKEYpfX1KPWEubW9ycGhUYXJnZXRzO3Y9MDtmb3IoYz1KLmxlbmd0aDt2PGM7disrKXtnPXt9O2cubmFtZT1KW3ZdLm5hbWU7aWYodm9pZCAwIT09Slt2XS52ZXJ0aWNlcylmb3IoZy52ZXJ0aWNlcz1bXSxyPTAsZT1KW3ZdLnZlcnRpY2VzLmxlbmd0aDtyPGU7cisrKWcudmVydGljZXMucHVzaChKW3ZdLnZlcnRpY2VzW3JdLmNsb25lKCkpO2lmKHZvaWQgMCE9PUpbdl0ubm9ybWFscylmb3IoZy5ub3JtYWxzPQpbXSxyPTAsZT1KW3ZdLm5vcm1hbHMubGVuZ3RoO3I8ZTtyKyspZy5ub3JtYWxzLnB1c2goSlt2XS5ub3JtYWxzW3JdLmNsb25lKCkpO3RoaXMubW9ycGhUYXJnZXRzLnB1c2goZyl9Sj1hLm1vcnBoTm9ybWFsczt2PTA7Zm9yKGM9Si5sZW5ndGg7djxjO3YrKyl7Zz17fTtpZih2b2lkIDAhPT1KW3ZdLnZlcnRleE5vcm1hbHMpZm9yKGcudmVydGV4Tm9ybWFscz1bXSxyPTAsZT1KW3ZdLnZlcnRleE5vcm1hbHMubGVuZ3RoO3I8ZTtyKyspej1KW3ZdLnZlcnRleE5vcm1hbHNbcl0sRT17fSxFLmE9ei5hLmNsb25lKCksRS5iPXouYi5jbG9uZSgpLEUuYz16LmMuY2xvbmUoKSxnLnZlcnRleE5vcm1hbHMucHVzaChFKTtpZih2b2lkIDAhPT1KW3ZdLmZhY2VOb3JtYWxzKWZvcihnLmZhY2VOb3JtYWxzPVtdLHI9MCxlPUpbdl0uZmFjZU5vcm1hbHMubGVuZ3RoO3I8ZTtyKyspZy5mYWNlTm9ybWFscy5wdXNoKEpbdl0uZmFjZU5vcm1hbHNbcl0uY2xvbmUoKSk7dGhpcy5tb3JwaE5vcm1hbHMucHVzaChnKX1yPQphLnNraW5XZWlnaHRzO3Y9MDtmb3IoYz1yLmxlbmd0aDt2PGM7disrKXRoaXMuc2tpbldlaWdodHMucHVzaChyW3ZdLmNsb25lKCkpO3I9YS5za2luSW5kaWNlczt2PTA7Zm9yKGM9ci5sZW5ndGg7djxjO3YrKyl0aGlzLnNraW5JbmRpY2VzLnB1c2goclt2XS5jbG9uZSgpKTtyPWEubGluZURpc3RhbmNlczt2PTA7Zm9yKGM9ci5sZW5ndGg7djxjO3YrKyl0aGlzLmxpbmVEaXN0YW5jZXMucHVzaChyW3ZdKTt2PWEuYm91bmRpbmdCb3g7bnVsbCE9PXYmJih0aGlzLmJvdW5kaW5nQm94PXYuY2xvbmUoKSk7dj1hLmJvdW5kaW5nU3BoZXJlO251bGwhPT12JiYodGhpcy5ib3VuZGluZ1NwaGVyZT12LmNsb25lKCkpO3RoaXMuZWxlbWVudHNOZWVkVXBkYXRlPWEuZWxlbWVudHNOZWVkVXBkYXRlO3RoaXMudmVydGljZXNOZWVkVXBkYXRlPWEudmVydGljZXNOZWVkVXBkYXRlO3RoaXMudXZzTmVlZFVwZGF0ZT1hLnV2c05lZWRVcGRhdGU7dGhpcy5ub3JtYWxzTmVlZFVwZGF0ZT1hLm5vcm1hbHNOZWVkVXBkYXRlOwp0aGlzLmNvbG9yc05lZWRVcGRhdGU9YS5jb2xvcnNOZWVkVXBkYXRlO3RoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGU9YS5saW5lRGlzdGFuY2VzTmVlZFVwZGF0ZTt0aGlzLmdyb3Vwc05lZWRVcGRhdGU9YS5ncm91cHNOZWVkVXBkYXRlO3JldHVybiB0aGlzfSxkaXNwb3NlOmZ1bmN0aW9uKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX0pO1NhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7U2EucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNhO1hhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7WGEucHJvdG90eXBlLmNvbnN0cnVjdG9yPVhhO3ZhciBGbT17Y2xvbmU6dWIsbWVyZ2U6QmJ9O3FiLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtxYi5wcm90b3R5cGUuY29uc3RydWN0b3I9cWI7cWIucHJvdG90eXBlLmlzU2hhZGVyTWF0ZXJpYWw9ITA7cWIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsCmEpO3RoaXMuZnJhZ21lbnRTaGFkZXI9YS5mcmFnbWVudFNoYWRlcjt0aGlzLnZlcnRleFNoYWRlcj1hLnZlcnRleFNoYWRlcjt0aGlzLnVuaWZvcm1zPXViKGEudW5pZm9ybXMpO3RoaXMuZGVmaW5lcz1PYmplY3QuYXNzaWduKHt9LGEuZGVmaW5lcyk7dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy5saWdodHM9YS5saWdodHM7dGhpcy5jbGlwcGluZz1hLmNsaXBwaW5nO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1hLm1vcnBoTm9ybWFsczt0aGlzLmV4dGVuc2lvbnM9YS5leHRlbnNpb25zO3JldHVybiB0aGlzfTtxYi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKGEpe3ZhciBjPU0ucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYSk7Yy51bmlmb3Jtcz17fTtmb3IodmFyIGUgaW4gdGhpcy51bmlmb3Jtcyl7dmFyIGc9CnRoaXMudW5pZm9ybXNbZV0udmFsdWU7Yy51bmlmb3Jtc1tlXT1nJiZnLmlzVGV4dHVyZT97dHlwZToidCIsdmFsdWU6Zy50b0pTT04oYSkudXVpZH06ZyYmZy5pc0NvbG9yP3t0eXBlOiJjIix2YWx1ZTpnLmdldEhleCgpfTpnJiZnLmlzVmVjdG9yMj97dHlwZToidjIiLHZhbHVlOmcudG9BcnJheSgpfTpnJiZnLmlzVmVjdG9yMz97dHlwZToidjMiLHZhbHVlOmcudG9BcnJheSgpfTpnJiZnLmlzVmVjdG9yND97dHlwZToidjQiLHZhbHVlOmcudG9BcnJheSgpfTpnJiZnLmlzTWF0cml4Mz97dHlwZToibTMiLHZhbHVlOmcudG9BcnJheSgpfTpnJiZnLmlzTWF0cml4ND97dHlwZToibTQiLHZhbHVlOmcudG9BcnJheSgpfTp7dmFsdWU6Z319MDxPYmplY3Qua2V5cyh0aGlzLmRlZmluZXMpLmxlbmd0aCYmKGMuZGVmaW5lcz10aGlzLmRlZmluZXMpO2MudmVydGV4U2hhZGVyPXRoaXMudmVydGV4U2hhZGVyO2MuZnJhZ21lbnRTaGFkZXI9dGhpcy5mcmFnbWVudFNoYWRlcjthPXt9O2Zvcih2YXIgciBpbiB0aGlzLmV4dGVuc2lvbnMpITA9PT0KdGhpcy5leHRlbnNpb25zW3JdJiYoYVtyXT0hMCk7MDxPYmplY3Qua2V5cyhhKS5sZW5ndGgmJihjLmV4dGVuc2lvbnM9YSk7cmV0dXJuIGN9O3piLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3Rvcjp6Yixpc0NhbWVyYTohMCxjb3B5OmZ1bmN0aW9uKGEsYyl7QS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSxjKTt0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5jb3B5KGEubWF0cml4V29ybGRJbnZlcnNlKTt0aGlzLnByb2plY3Rpb25NYXRyaXguY29weShhLnByb2plY3Rpb25NYXRyaXgpO3RoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuY29weShhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlKTtyZXR1cm4gdGhpc30sZ2V0V29ybGREaXJlY3Rpb246ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQ2FtZXJhOiAuZ2V0V29ybGREaXJlY3Rpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksCmE9bmV3IGspO3RoaXMudXBkYXRlTWF0cml4V29ybGQoITApO3ZhciBjPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIGEuc2V0KC1jWzhdLC1jWzldLC1jWzEwXSkubm9ybWFsaXplKCl9LHVwZGF0ZU1hdHJpeFdvcmxkOmZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwodGhpcyxhKTt0aGlzLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX19KTt2Yi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnZiLGlzUGVyc3BlY3RpdmVDYW1lcmE6ITAsY29weTpmdW5jdGlvbihhLGMpe3piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhLGMpO3RoaXMuZm92PWEuZm92O3RoaXMuem9vbT1hLnpvb207dGhpcy5uZWFyPWEubmVhcjt0aGlzLmZhcj0KYS5mYXI7dGhpcy5mb2N1cz1hLmZvY3VzO3RoaXMuYXNwZWN0PWEuYXNwZWN0O3RoaXMudmlldz1udWxsPT09YS52aWV3P251bGw6T2JqZWN0LmFzc2lnbih7fSxhLnZpZXcpO3RoaXMuZmlsbUdhdWdlPWEuZmlsbUdhdWdlO3RoaXMuZmlsbU9mZnNldD1hLmZpbG1PZmZzZXQ7cmV0dXJuIHRoaXN9LHNldEZvY2FsTGVuZ3RoOmZ1bmN0aW9uKGEpe3RoaXMuZm92PTIqaGIuUkFEMkRFRypNYXRoLmF0YW4oLjUqdGhpcy5nZXRGaWxtSGVpZ2h0KCkvYSk7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9LGdldEZvY2FsTGVuZ3RoOmZ1bmN0aW9uKCl7cmV0dXJuLjUqdGhpcy5nZXRGaWxtSGVpZ2h0KCkvTWF0aC50YW4oLjUqaGIuREVHMlJBRCp0aGlzLmZvdil9LGdldEVmZmVjdGl2ZUZPVjpmdW5jdGlvbigpe3JldHVybiAyKmhiLlJBRDJERUcqTWF0aC5hdGFuKE1hdGgudGFuKC41KmhiLkRFRzJSQUQqdGhpcy5mb3YpL3RoaXMuem9vbSl9LGdldEZpbG1XaWR0aDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbG1HYXVnZSoKTWF0aC5taW4odGhpcy5hc3BlY3QsMSl9LGdldEZpbG1IZWlnaHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWxtR2F1Z2UvTWF0aC5tYXgodGhpcy5hc3BlY3QsMSl9LHNldFZpZXdPZmZzZXQ6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe3RoaXMuYXNwZWN0PWEvYztudWxsPT09dGhpcy52aWV3JiYodGhpcy52aWV3PXtlbmFibGVkOiEwLGZ1bGxXaWR0aDoxLGZ1bGxIZWlnaHQ6MSxvZmZzZXRYOjAsb2Zmc2V0WTowLHdpZHRoOjEsaGVpZ2h0OjF9KTt0aGlzLnZpZXcuZW5hYmxlZD0hMDt0aGlzLnZpZXcuZnVsbFdpZHRoPWE7dGhpcy52aWV3LmZ1bGxIZWlnaHQ9Yzt0aGlzLnZpZXcub2Zmc2V0WD1lO3RoaXMudmlldy5vZmZzZXRZPWc7dGhpcy52aWV3LndpZHRoPXI7dGhpcy52aWV3LmhlaWdodD12O3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSxjbGVhclZpZXdPZmZzZXQ6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy52aWV3JiYodGhpcy52aWV3LmVuYWJsZWQ9ITEpO3RoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfSwKdXBkYXRlUHJvamVjdGlvbk1hdHJpeDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubmVhcixjPWEqTWF0aC50YW4oLjUqaGIuREVHMlJBRCp0aGlzLmZvdikvdGhpcy56b29tLGU9MipjLGc9dGhpcy5hc3BlY3QqZSxyPS0uNSpnLHY9dGhpcy52aWV3O2lmKG51bGwhPT10aGlzLnZpZXcmJnRoaXMudmlldy5lbmFibGVkKXt2YXIgej12LmZ1bGxXaWR0aCxFPXYuZnVsbEhlaWdodDtyKz12Lm9mZnNldFgqZy96O2MtPXYub2Zmc2V0WSplL0U7Zyo9di53aWR0aC96O2UqPXYuaGVpZ2h0L0V9dj10aGlzLmZpbG1PZmZzZXQ7MCE9PXYmJihyKz1hKnYvdGhpcy5nZXRGaWxtV2lkdGgoKSk7dGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZShyLHIrZyxjLGMtZSxhLHRoaXMuZmFyKTt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmdldEludmVyc2UodGhpcy5wcm9qZWN0aW9uTWF0cml4KX0sdG9KU09OOmZ1bmN0aW9uKGEpe2E9QS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcywKYSk7YS5vYmplY3QuZm92PXRoaXMuZm92O2Eub2JqZWN0Lnpvb209dGhpcy56b29tO2Eub2JqZWN0Lm5lYXI9dGhpcy5uZWFyO2Eub2JqZWN0LmZhcj10aGlzLmZhcjthLm9iamVjdC5mb2N1cz10aGlzLmZvY3VzO2Eub2JqZWN0LmFzcGVjdD10aGlzLmFzcGVjdDtudWxsIT09dGhpcy52aWV3JiYoYS5vYmplY3Qudmlldz1PYmplY3QuYXNzaWduKHt9LHRoaXMudmlldykpO2Eub2JqZWN0LmZpbG1HYXVnZT10aGlzLmZpbG1HYXVnZTthLm9iamVjdC5maWxtT2Zmc2V0PXRoaXMuZmlsbU9mZnNldDtyZXR1cm4gYX19KTtHYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSk7R2IucHJvdG90eXBlLmNvbnN0cnVjdG9yPUdiO05iLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG0ucHJvdG90eXBlKTtOYi5wcm90b3R5cGUuY29uc3RydWN0b3I9TmI7TmIucHJvdG90eXBlLmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlPSEwO05iLnByb3RvdHlwZS5mcm9tRXF1aXJlY3Rhbmd1bGFyVGV4dHVyZT0KZnVuY3Rpb24oYSxjKXt0aGlzLnRleHR1cmUudHlwZT1jLnR5cGU7dGhpcy50ZXh0dXJlLmZvcm1hdD1jLmZvcm1hdDt0aGlzLnRleHR1cmUuZW5jb2Rpbmc9Yy5lbmNvZGluZzt2YXIgZT1uZXcgeSxnPW5ldyBxYih7dHlwZToiQ3ViZW1hcEZyb21FcXVpcmVjdCIsdW5pZm9ybXM6dWIoe3RFcXVpcmVjdDp7dmFsdWU6bnVsbH19KSx2ZXJ0ZXhTaGFkZXI6InZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG52ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkge1xuXHRyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTtcbn1cbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uIFx4M2QgdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxufSIsCmZyYWdtZW50U2hhZGVyOiJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MThcbiNkZWZpbmUgUkVDSVBST0NBTF9QSTIgMC4xNTkxNTQ5NFxudm9pZCBtYWluKCkge1xuXHR2ZWMzIGRpcmVjdGlvbiBceDNkIG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7XG5cdHZlYzIgc2FtcGxlVVY7XG5cdHNhbXBsZVVWLnkgXHgzZCBhc2luKCBjbGFtcCggZGlyZWN0aW9uLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTtcblx0c2FtcGxlVVYueCBceDNkIGF0YW4oIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApO1xufSIsc2lkZToxLGJsZW5kaW5nOjB9KTtnLnVuaWZvcm1zLnRFcXVpcmVjdC52YWx1ZT1jOwpjPW5ldyB4YShuZXcgWGEoNSw1LDUpLGcpO2UuYWRkKGMpO2c9bmV3IEdiKDEsMTAsMSk7Zy5yZW5kZXJUYXJnZXQ9dGhpcztnLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWU9IkN1YmVDYW1lcmFUZXh0dXJlIjtnLnVwZGF0ZShhLGUpO2MuZ2VvbWV0cnkuZGlzcG9zZSgpO2MubWF0ZXJpYWwuZGlzcG9zZSgpO3JldHVybiB0aGlzfTtBYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShsLnByb3RvdHlwZSk7QWIucHJvdG90eXBlLmNvbnN0cnVjdG9yPUFiO0FiLnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlPSEwO3ZhciBKaT1uZXcgayxHbT1uZXcgayxIbT1uZXcgdDtPYmplY3QuYXNzaWduKEhiLnByb3RvdHlwZSx7aXNQbGFuZTohMCxzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLm5vcm1hbC5jb3B5KGEpO3RoaXMuY29uc3RhbnQ9YztyZXR1cm4gdGhpc30sc2V0Q29tcG9uZW50czpmdW5jdGlvbihhLGMsZSxnKXt0aGlzLm5vcm1hbC5zZXQoYSxjLGUpO3RoaXMuY29uc3RhbnQ9ZztyZXR1cm4gdGhpc30sCnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50OmZ1bmN0aW9uKGEsYyl7dGhpcy5ub3JtYWwuY29weShhKTt0aGlzLmNvbnN0YW50PS1jLmRvdCh0aGlzLm5vcm1hbCk7cmV0dXJuIHRoaXN9LHNldEZyb21Db3BsYW5hclBvaW50czpmdW5jdGlvbihhLGMsZSl7Yz1KaS5zdWJWZWN0b3JzKGUsYykuY3Jvc3MoR20uc3ViVmVjdG9ycyhhLGMpKS5ub3JtYWxpemUoKTt0aGlzLnNldEZyb21Ob3JtYWxBbmRDb3BsYW5hclBvaW50KGMsYSk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMubm9ybWFsLmNvcHkoYS5ub3JtYWwpO3RoaXMuY29uc3RhbnQ9YS5jb25zdGFudDtyZXR1cm4gdGhpc30sbm9ybWFsaXplOmZ1bmN0aW9uKCl7dmFyIGE9MS90aGlzLm5vcm1hbC5sZW5ndGgoKTt0aGlzLm5vcm1hbC5tdWx0aXBseVNjYWxhcihhKTt0aGlzLmNvbnN0YW50Kj1hO3JldHVybiB0aGlzfSwKbmVnYXRlOmZ1bmN0aW9uKCl7dGhpcy5jb25zdGFudCo9LTE7dGhpcy5ub3JtYWwubmVnYXRlKCk7cmV0dXJuIHRoaXN9LGRpc3RhbmNlVG9Qb2ludDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5ub3JtYWwuZG90KGEpK3RoaXMuY29uc3RhbnR9LGRpc3RhbmNlVG9TcGhlcmU6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KGEuY2VudGVyKS1hLnJhZGl1c30scHJvamVjdFBvaW50OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5wcm9qZWN0UG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgayk7cmV0dXJuIGMuY29weSh0aGlzLm5vcm1hbCkubXVsdGlwbHlTY2FsYXIoLXRoaXMuZGlzdGFuY2VUb1BvaW50KGEpKS5hZGQoYSl9LGludGVyc2VjdExpbmU6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5QbGFuZTogLmludGVyc2VjdExpbmUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksCmM9bmV3IGspO3ZhciBlPWEuZGVsdGEoSmkpLGc9dGhpcy5ub3JtYWwuZG90KGUpO2lmKDA9PT1nKXtpZigwPT09dGhpcy5kaXN0YW5jZVRvUG9pbnQoYS5zdGFydCkpcmV0dXJuIGMuY29weShhLnN0YXJ0KX1lbHNlIGlmKGc9LShhLnN0YXJ0LmRvdCh0aGlzLm5vcm1hbCkrdGhpcy5jb25zdGFudCkvZywhKDA+Z3x8MTxnKSlyZXR1cm4gYy5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKGcpLmFkZChhLnN0YXJ0KX0saW50ZXJzZWN0c0xpbmU6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5kaXN0YW5jZVRvUG9pbnQoYS5zdGFydCk7YT10aGlzLmRpc3RhbmNlVG9Qb2ludChhLmVuZCk7cmV0dXJuIDA+YyYmMDxhfHwwPmEmJjA8Y30saW50ZXJzZWN0c0JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5pbnRlcnNlY3RzUGxhbmUodGhpcyl9LGludGVyc2VjdHNTcGhlcmU6ZnVuY3Rpb24oYSl7cmV0dXJuIGEuaW50ZXJzZWN0c1BsYW5lKHRoaXMpfSxjb3BsYW5hclBvaW50OmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoY29uc29sZS53YXJuKCJUSFJFRS5QbGFuZTogLmNvcGxhbmFyUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYT1uZXcgayk7cmV0dXJuIGEuY29weSh0aGlzLm5vcm1hbCkubXVsdGlwbHlTY2FsYXIoLXRoaXMuY29uc3RhbnQpfSxhcHBseU1hdHJpeDQ6ZnVuY3Rpb24oYSxjKXtjPWN8fEhtLmdldE5vcm1hbE1hdHJpeChhKTthPXRoaXMuY29wbGFuYXJQb2ludChKaSkuYXBwbHlNYXRyaXg0KGEpO2M9dGhpcy5ub3JtYWwuYXBwbHlNYXRyaXgzKGMpLm5vcm1hbGl6ZSgpO3RoaXMuY29uc3RhbnQ9LWEuZG90KGMpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSl7dGhpcy5jb25zdGFudC09YS5kb3QodGhpcy5ub3JtYWwpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7cmV0dXJuIGEubm9ybWFsLmVxdWFscyh0aGlzLm5vcm1hbCkmJmEuY29uc3RhbnQ9PT10aGlzLmNvbnN0YW50fX0pO3ZhciBtZj1uZXcgRyxwaD1uZXcgaztPYmplY3QuYXNzaWduKGljLnByb3RvdHlwZSwKe3NldDpmdW5jdGlvbihhLGMsZSxnLHIsdil7dmFyIHo9dGhpcy5wbGFuZXM7elswXS5jb3B5KGEpO3pbMV0uY29weShjKTt6WzJdLmNvcHkoZSk7elszXS5jb3B5KGcpO3pbNF0uY29weShyKTt6WzVdLmNvcHkodik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz10aGlzLnBsYW5lcyxlPTA7Nj5lO2UrKyljW2VdLmNvcHkoYS5wbGFuZXNbZV0pO3JldHVybiB0aGlzfSxzZXRGcm9tTWF0cml4OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucGxhbmVzLGU9YS5lbGVtZW50czthPWVbMF07dmFyIGc9ZVsxXSxyPWVbMl0sdj1lWzNdLHo9ZVs0XSxFPWVbNV0sRj1lWzZdLEo9ZVs3XSxQPWVbOF0sUj1lWzldLFM9ZVsxMF0sVj1lWzExXSxXPWVbMTJdLGhhPWVbMTNdLGZhPWVbMTRdO2U9ZVsxNV07Y1swXS5zZXRDb21wb25lbnRzKHYtYSxKLXosVi1QLGUtVykubm9ybWFsaXplKCk7CmNbMV0uc2V0Q29tcG9uZW50cyh2K2EsSit6LFYrUCxlK1cpLm5vcm1hbGl6ZSgpO2NbMl0uc2V0Q29tcG9uZW50cyh2K2csSitFLFYrUixlK2hhKS5ub3JtYWxpemUoKTtjWzNdLnNldENvbXBvbmVudHModi1nLEotRSxWLVIsZS1oYSkubm9ybWFsaXplKCk7Y1s0XS5zZXRDb21wb25lbnRzKHYtcixKLUYsVi1TLGUtZmEpLm5vcm1hbGl6ZSgpO2NbNV0uc2V0Q29tcG9uZW50cyh2K3IsSitGLFYrUyxlK2ZhKS5ub3JtYWxpemUoKTtyZXR1cm4gdGhpc30saW50ZXJzZWN0c09iamVjdDpmdW5jdGlvbihhKXt2YXIgYz1hLmdlb21ldHJ5O251bGw9PT1jLmJvdW5kaW5nU3BoZXJlJiZjLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO21mLmNvcHkoYy5ib3VuZGluZ1NwaGVyZSkuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpO3JldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUobWYpfSxpbnRlcnNlY3RzU3ByaXRlOmZ1bmN0aW9uKGEpe21mLmNlbnRlci5zZXQoMCwwLDApO21mLnJhZGl1cz0KLjcwNzEwNjc4MTE4NjU0NzY7bWYuYXBwbHlNYXRyaXg0KGEubWF0cml4V29ybGQpO3JldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUobWYpfSxpbnRlcnNlY3RzU3BoZXJlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucGxhbmVzLGU9YS5jZW50ZXI7YT0tYS5yYWRpdXM7Zm9yKHZhciBnPTA7Nj5nO2crKylpZihjW2ddLmRpc3RhbmNlVG9Qb2ludChlKTxhKXJldHVybiExO3JldHVybiEwfSxpbnRlcnNlY3RzQm94OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz10aGlzLnBsYW5lcyxlPTA7Nj5lO2UrKyl7dmFyIGc9Y1tlXTtwaC54PTA8Zy5ub3JtYWwueD9hLm1heC54OmEubWluLng7cGgueT0wPGcubm9ybWFsLnk/YS5tYXgueTphLm1pbi55O3BoLno9MDxnLm5vcm1hbC56P2EubWF4Lno6YS5taW4uejtpZigwPmcuZGlzdGFuY2VUb1BvaW50KHBoKSlyZXR1cm4hMX1yZXR1cm4hMH0sY29udGFpbnNQb2ludDpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5wbGFuZXMsZT0wOzY+ZTtlKyspaWYoMD4KY1tlXS5kaXN0YW5jZVRvUG9pbnQoYSkpcmV0dXJuITE7cmV0dXJuITB9fSk7dmFyIHJiPXthbHBoYW1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHRkaWZmdXNlQ29sb3IuYSAqXHgzZCB0ZXh0dXJlMkQoIGFscGhhTWFwLCB2VXYgKS5nO1xuI2VuZGlmIixhbHBoYW1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FMUEhBTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGFscGhhTWFwO1xuI2VuZGlmIixhbHBoYXRlc3RfZnJhZ21lbnQ6IiNpZmRlZiBBTFBIQVRFU1Rcblx0aWYgKCBkaWZmdXNlQ29sb3IuYSBceDNjIEFMUEhBVEVTVCApIGRpc2NhcmQ7XG4jZW5kaWYiLGFvbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0FPTUFQXG5cdGZsb2F0IGFtYmllbnRPY2NsdXNpb24gXHgzZCAoIHRleHR1cmUyRCggYW9NYXAsIHZVdjIgKS5yIC0gMS4wICkgKiBhb01hcEludGVuc2l0eSArIDEuMDtcblx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICpceDNkIGFtYmllbnRPY2NsdXNpb247XG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgXHgyNlx4MjYgZGVmaW5lZCggU1RBTkRBUkQgKVxuXHRcdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICpceDNkIGNvbXB1dGVTcGVjdWxhck9jY2x1c2lvbiggZG90TlYsIGFtYmllbnRPY2NsdXNpb24sIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzICk7XG5cdCNlbmRpZlxuI2VuZGlmIiwKYW9tYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9BT01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcblx0dW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTtcbiNlbmRpZiIsYmVnaW5fdmVydGV4OiJ2ZWMzIHRyYW5zZm9ybWVkIFx4M2QgdmVjMyggcG9zaXRpb24gKTsiLGJlZ2lubm9ybWFsX3ZlcnRleDoidmVjMyBvYmplY3ROb3JtYWwgXHgzZCB2ZWMzKCBub3JtYWwgKTtcbiNpZmRlZiBVU0VfVEFOR0VOVFxuXHR2ZWMzIG9iamVjdFRhbmdlbnQgXHgzZCB2ZWMzKCB0YW5nZW50Lnh5eiApO1xuI2VuZGlmIixic2RmczoidmVjMiBpbnRlZ3JhdGVTcGVjdWxhckJSREYoIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IHZlYzQgYzAgXHgzZCB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApO1xuXHRjb25zdCB2ZWM0IGMxIFx4M2QgdmVjNCggMSwgMC4wNDI1LCAxLjA0LCAtIDAuMDQgKTtcblx0dmVjNCByIFx4M2Qgcm91Z2huZXNzICogYzAgKyBjMTtcblx0ZmxvYXQgYTAwNCBceDNkIG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XG5cdHJldHVybiB2ZWMyKCAtMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7XG59XG5mbG9hdCBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBjdXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHtcbiNpZiBkZWZpbmVkICggUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyApXG5cdGZsb2F0IGRpc3RhbmNlRmFsbG9mZiBceDNkIDEuMCAvIG1heCggcG93KCBsaWdodERpc3RhbmNlLCBkZWNheUV4cG9uZW50ICksIDAuMDEgKTtcblx0aWYoIGN1dG9mZkRpc3RhbmNlIFx4M2UgMC4wICkge1xuXHRcdGRpc3RhbmNlRmFsbG9mZiAqXHgzZCBwb3cyKCBzYXR1cmF0ZSggMS4wIC0gcG93NCggbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICkgKSApO1xuXHR9XG5cdHJldHVybiBkaXN0YW5jZUZhbGxvZmY7XG4jZWxzZVxuXHRpZiggY3V0b2ZmRGlzdGFuY2UgXHgzZSAwLjAgXHgyNlx4MjYgZGVjYXlFeHBvbmVudCBceDNlIDAuMCApIHtcblx0XHRyZXR1cm4gcG93KCBzYXR1cmF0ZSggLWxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSArIDEuMCApLCBkZWNheUV4cG9uZW50ICk7XG5cdH1cblx0cmV0dXJuIDEuMDtcbiNlbmRpZlxufVxudmVjMyBCUkRGX0RpZmZ1c2VfTGFtYmVydCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogZGlmZnVzZUNvbG9yO1xufVxudmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgZG90TEggKSB7XG5cdGZsb2F0IGZyZXNuZWwgXHgzZCBleHAyKCAoIC01LjU1NDczICogZG90TEggLSA2Ljk4MzE2ICkgKiBkb3RMSCApO1xuXHRyZXR1cm4gKCAxLjAgLSBzcGVjdWxhckNvbG9yICkgKiBmcmVzbmVsICsgc3BlY3VsYXJDb2xvcjtcbn1cbnZlYzMgRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggY29uc3QgaW4gdmVjMyBGMCwgY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgZnJlc25lbCBceDNkIGV4cDIoICggLTUuNTU0NzMgKiBkb3ROViAtIDYuOTgzMTYgKSAqIGRvdE5WICk7XG5cdHZlYzMgRnIgXHgzZCBtYXgoIHZlYzMoIDEuMCAtIHJvdWdobmVzcyApLCBGMCApIC0gRjA7XG5cdHJldHVybiBGciAqIGZyZXNuZWwgKyBGMDtcbn1cbmZsb2F0IEdfR0dYX1NtaXRoKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiBceDNkIHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGdsIFx4M2QgZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcblx0ZmxvYXQgZ3YgXHgzZCBkb3ROViArIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRyZXR1cm4gMS4wIC8gKCBnbCAqIGd2ICk7XG59XG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XG5cdGZsb2F0IGEyIFx4M2QgcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZ3YgXHgzZCBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRmbG9hdCBnbCBceDNkIGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XG5cdHJldHVybiAwLjUgLyBtYXgoIGd2ICsgZ2wsIEVQU0lMT04gKTtcbn1cbmZsb2F0IERfR0dYKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdGZsb2F0IGEyIFx4M2QgcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZGVub20gXHgzZCBwb3cyKCBkb3ROSCApICogKCBhMiAtIDEuMCApICsgMS4wO1xuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyIC8gcG93MiggZGVub20gKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGFscGhhIFx4M2QgcG93Miggcm91Z2huZXNzICk7XG5cdHZlYzMgaGFsZkRpciBceDNkIG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyB2aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5MIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcblx0ZmxvYXQgZG90TkggXHgzZCBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCBceDNkIHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGIFx4M2QgRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xuXHRmbG9hdCBHIFx4M2QgR19HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7XG5cdGZsb2F0IEQgXHgzZCBEX0dHWCggYWxwaGEsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxudmVjMiBMVENfVXYoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IGZsb2F0IExVVF9TSVpFICBceDNkIDY0LjA7XG5cdGNvbnN0IGZsb2F0IExVVF9TQ0FMRSBceDNkICggTFVUX1NJWkUgLSAxLjAgKSAvIExVVF9TSVpFO1xuXHRjb25zdCBmbG9hdCBMVVRfQklBUyAgXHgzZCAwLjUgLyBMVVRfU0laRTtcblx0ZmxvYXQgZG90TlYgXHgzZCBzYXR1cmF0ZSggZG90KCBOLCBWICkgKTtcblx0dmVjMiB1diBceDNkIHZlYzIoIHJvdWdobmVzcywgc3FydCggMS4wIC0gZG90TlYgKSApO1xuXHR1diBceDNkIHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7XG5cdHJldHVybiB1djtcbn1cbmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkge1xuXHRmbG9hdCBsIFx4M2QgbGVuZ3RoKCBmICk7XG5cdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTtcbn1cbnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkge1xuXHRmbG9hdCB4IFx4M2QgZG90KCB2MSwgdjIgKTtcblx0ZmxvYXQgeSBceDNkIGFicyggeCApO1xuXHRmbG9hdCBhIFx4M2QgMC44NTQzOTg1ICsgKCAwLjQ5NjUxNTUgKyAwLjAxNDUyMDYgKiB5ICkgKiB5O1xuXHRmbG9hdCBiIFx4M2QgMy40MTc1OTQwICsgKCA0LjE2MTY3MjQgKyB5ICkgKiB5O1xuXHRmbG9hdCB2IFx4M2QgYSAvIGI7XG5cdGZsb2F0IHRoZXRhX3NpbnRoZXRhIFx4M2QgKCB4IFx4M2UgMC4wICkgPyB2IDogMC41ICogaW52ZXJzZXNxcnQoIG1heCggMS4wIC0geCAqIHgsIDFlLTcgKSApIC0gdjtcblx0cmV0dXJuIGNyb3NzKCB2MSwgdjIgKSAqIHRoZXRhX3NpbnRoZXRhO1xufVxudmVjMyBMVENfRXZhbHVhdGUoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiB2ZWMzIFAsIGNvbnN0IGluIG1hdDMgbUludiwgY29uc3QgaW4gdmVjMyByZWN0Q29vcmRzWyA0IF0gKSB7XG5cdHZlYzMgdjEgXHgzZCByZWN0Q29vcmRzWyAxIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgdjIgXHgzZCByZWN0Q29vcmRzWyAzIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgbGlnaHROb3JtYWwgXHgzZCBjcm9zcyggdjEsIHYyICk7XG5cdGlmKCBkb3QoIGxpZ2h0Tm9ybWFsLCBQIC0gcmVjdENvb3Jkc1sgMCBdICkgXHgzYyAwLjAgKSByZXR1cm4gdmVjMyggMC4wICk7XG5cdHZlYzMgVDEsIFQyO1xuXHRUMSBceDNkIG5vcm1hbGl6ZSggViAtIE4gKiBkb3QoIFYsIE4gKSApO1xuXHRUMiBceDNkIC0gY3Jvc3MoIE4sIFQxICk7XG5cdG1hdDMgbWF0IFx4M2QgbUludiAqIHRyYW5zcG9zZU1hdDMoIG1hdDMoIFQxLCBUMiwgTiApICk7XG5cdHZlYzMgY29vcmRzWyA0IF07XG5cdGNvb3Jkc1sgMCBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAwIF0gLSBQICk7XG5cdGNvb3Jkc1sgMSBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAxIF0gLSBQICk7XG5cdGNvb3Jkc1sgMiBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAyIF0gLSBQICk7XG5cdGNvb3Jkc1sgMyBdIFx4M2QgbWF0ICogKCByZWN0Q29vcmRzWyAzIF0gLSBQICk7XG5cdGNvb3Jkc1sgMCBdIFx4M2Qgbm9ybWFsaXplKCBjb29yZHNbIDAgXSApO1xuXHRjb29yZHNbIDEgXSBceDNkIG5vcm1hbGl6ZSggY29vcmRzWyAxIF0gKTtcblx0Y29vcmRzWyAyIF0gXHgzZCBub3JtYWxpemUoIGNvb3Jkc1sgMiBdICk7XG5cdGNvb3Jkc1sgMyBdIFx4M2Qgbm9ybWFsaXplKCBjb29yZHNbIDMgXSApO1xuXHR2ZWMzIHZlY3RvckZvcm1GYWN0b3IgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjdG9yRm9ybUZhY3RvciArXHgzZCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMCBdLCBjb29yZHNbIDEgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICtceDNkIExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAxIF0sIGNvb3Jkc1sgMiBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgK1x4M2QgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArXHgzZCBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMyBdLCBjb29yZHNbIDAgXSApO1xuXHRmbG9hdCByZXN1bHQgXHgzZCBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHZlY3RvckZvcm1GYWN0b3IgKTtcblx0cmV0dXJuIHZlYzMoIHJlc3VsdCApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcblx0dmVjMiBicmRmIFx4M2QgaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XG5cdHJldHVybiBzcGVjdWxhckNvbG9yICogYnJkZi54ICsgYnJkZi55O1xufVxudm9pZCBCUkRGX1NwZWN1bGFyX011bHRpc2NhdHRlcmluZ19FbnZpcm9ubWVudCggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGlub3V0IHZlYzMgc2luZ2xlU2NhdHRlciwgaW5vdXQgdmVjMyBtdWx0aVNjYXR0ZXIgKSB7XG5cdGZsb2F0IGRvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0dmVjMyBGIFx4M2QgRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggc3BlY3VsYXJDb2xvciwgZG90TlYsIHJvdWdobmVzcyApO1xuXHR2ZWMyIGJyZGYgXHgzZCBpbnRlZ3JhdGVTcGVjdWxhckJSREYoIGRvdE5WLCByb3VnaG5lc3MgKTtcblx0dmVjMyBGc3NFc3MgXHgzZCBGICogYnJkZi54ICsgYnJkZi55O1xuXHRmbG9hdCBFc3MgXHgzZCBicmRmLnggKyBicmRmLnk7XG5cdGZsb2F0IEVtcyBceDNkIDEuMCAtIEVzcztcblx0dmVjMyBGYXZnIFx4M2Qgc3BlY3VsYXJDb2xvciArICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogMC4wNDc2MTk7XHR2ZWMzIEZtcyBceDNkIEZzc0VzcyAqIEZhdmcgLyAoIDEuMCAtIEVtcyAqIEZhdmcgKTtcblx0c2luZ2xlU2NhdHRlciArXHgzZCBGc3NFc3M7XG5cdG11bHRpU2NhdHRlciArXHgzZCBGbXMgKiBFbXM7XG59XG5mbG9hdCBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICkge1xuXHRyZXR1cm4gMC4yNTtcbn1cbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiAoIHNoaW5pbmVzcyAqIDAuNSArIDEuMCApICogcG93KCBkb3ROSCwgc2hpbmluZXNzICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBpbmNpZGVudExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcyApIHtcblx0dmVjMyBoYWxmRGlyIFx4M2Qgbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcblx0ZmxvYXQgZG90TkggXHgzZCBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCBceDNkIHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGIFx4M2QgRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xuXHRmbG9hdCBHIFx4M2QgR19CbGlublBob25nX0ltcGxpY2l0KCApO1xuXHRmbG9hdCBEIFx4M2QgRF9CbGlublBob25nKCBzaGluaW5lc3MsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxuZmxvYXQgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50KCBjb25zdCBpbiBmbG9hdCBnZ3hSb3VnaG5lc3MgKSB7XG5cdHJldHVybiAoIDIuMCAvIHBvdzIoIGdneFJvdWdobmVzcyArIDAuMDAwMSApIC0gMi4wICk7XG59XG5mbG9hdCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IGJsaW5uRXhwb25lbnQgKSB7XG5cdHJldHVybiBzcXJ0KCAyLjAgLyAoIGJsaW5uRXhwb25lbnQgKyAyLjAgKSApO1xufVxuI2lmIGRlZmluZWQoIFVTRV9TSEVFTiApXG5mbG9hdCBEX0NoYXJsaWUoZmxvYXQgcm91Z2huZXNzLCBmbG9hdCBOb0gpIHtcblx0ZmxvYXQgaW52QWxwaGEgIFx4M2QgMS4wIC8gcm91Z2huZXNzO1xuXHRmbG9hdCBjb3MyaCBceDNkIE5vSCAqIE5vSDtcblx0ZmxvYXQgc2luMmggXHgzZCBtYXgoMS4wIC0gY29zMmgsIDAuMDA3ODEyNSk7XHRyZXR1cm4gKDIuMCArIGludkFscGhhKSAqIHBvdyhzaW4yaCwgaW52QWxwaGEgKiAwLjUpIC8gKDIuMCAqIFBJKTtcbn1cbmZsb2F0IFZfTmV1YmVsdChmbG9hdCBOb1YsIGZsb2F0IE5vTCkge1xuXHRyZXR1cm4gc2F0dXJhdGUoMS4wIC8gKDQuMCAqIChOb0wgKyBOb1YgLSBOb0wgKiBOb1YpKSk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfU2hlZW4oIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBMLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCB2ZWMzIHNwZWN1bGFyQ29sb3IgKSB7XG5cdHZlYzMgTiBceDNkIGdlb21ldHJ5Lm5vcm1hbDtcblx0dmVjMyBWIFx4M2QgZ2VvbWV0cnkudmlld0Rpcjtcblx0dmVjMyBIIFx4M2Qgbm9ybWFsaXplKCBWICsgTCApO1xuXHRmbG9hdCBkb3ROSCBceDNkIHNhdHVyYXRlKCBkb3QoIE4sIEggKSApO1xuXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIERfQ2hhcmxpZSggcm91Z2huZXNzLCBkb3ROSCApICogVl9OZXViZWx0KCBkb3QoTiwgViksIGRvdChOLCBMKSApO1xufVxuI2VuZGlmIiwKYnVtcG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0JVTVBNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgYnVtcE1hcDtcblx0dW5pZm9ybSBmbG9hdCBidW1wU2NhbGU7XG5cdHZlYzIgZEhkeHlfZndkKCkge1xuXHRcdHZlYzIgZFNUZHggXHgzZCBkRmR4KCB2VXYgKTtcblx0XHR2ZWMyIGRTVGR5IFx4M2QgZEZkeSggdlV2ICk7XG5cdFx0ZmxvYXQgSGxsIFx4M2QgYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKS54O1xuXHRcdGZsb2F0IGRCeCBceDNkIGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHggKS54IC0gSGxsO1xuXHRcdGZsb2F0IGRCeSBceDNkIGJ1bXBTY2FsZSAqIHRleHR1cmUyRCggYnVtcE1hcCwgdlV2ICsgZFNUZHkgKS54IC0gSGxsO1xuXHRcdHJldHVybiB2ZWMyKCBkQngsIGRCeSApO1xuXHR9XG5cdHZlYzMgcGVydHVyYk5vcm1hbEFyYiggdmVjMyBzdXJmX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgZEhkeHkgKSB7XG5cdFx0dmVjMyB2U2lnbWFYIFx4M2QgdmVjMyggZEZkeCggc3VyZl9wb3MueCApLCBkRmR4KCBzdXJmX3Bvcy55ICksIGRGZHgoIHN1cmZfcG9zLnogKSApO1xuXHRcdHZlYzMgdlNpZ21hWSBceDNkIHZlYzMoIGRGZHkoIHN1cmZfcG9zLnggKSwgZEZkeSggc3VyZl9wb3MueSApLCBkRmR5KCBzdXJmX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHZOIFx4M2Qgc3VyZl9ub3JtO1xuXHRcdHZlYzMgUjEgXHgzZCBjcm9zcyggdlNpZ21hWSwgdk4gKTtcblx0XHR2ZWMzIFIyIFx4M2QgY3Jvc3MoIHZOLCB2U2lnbWFYICk7XG5cdFx0ZmxvYXQgZkRldCBceDNkIGRvdCggdlNpZ21hWCwgUjEgKTtcblx0XHRmRGV0ICpceDNkICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHR2ZWMzIHZHcmFkIFx4M2Qgc2lnbiggZkRldCApICogKCBkSGR4eS54ICogUjEgKyBkSGR4eS55ICogUjIgKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKCBhYnMoIGZEZXQgKSAqIHN1cmZfbm9ybSAtIHZHcmFkICk7XG5cdH1cbiNlbmRpZiIsCmNsaXBwaW5nX3BsYW5lc19mcmFnbWVudDoiI2lmIE5VTV9DTElQUElOR19QTEFORVMgXHgzZSAwXG5cdHZlYzQgcGxhbmU7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpICsrICkge1xuXHRcdHBsYW5lIFx4M2QgY2xpcHBpbmdQbGFuZXNbIGkgXTtcblx0XHRpZiAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgXHgzZSBwbGFuZS53ICkgZGlzY2FyZDtcblx0fVxuXHQjaWYgVU5JT05fQ0xJUFBJTkdfUExBTkVTIFx4M2MgTlVNX0NMSVBQSU5HX1BMQU5FU1xuXHRcdGJvb2wgY2xpcHBlZCBceDNkIHRydWU7XG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRcdGZvciAoIGludCBpIFx4M2QgVU5JT05fQ0xJUFBJTkdfUExBTkVTOyBpIFx4M2MgTlVNX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcblx0XHRcdHBsYW5lIFx4M2QgY2xpcHBpbmdQbGFuZXNbIGkgXTtcblx0XHRcdGNsaXBwZWQgXHgzZCAoIGRvdCggdlZpZXdQb3NpdGlvbiwgcGxhbmUueHl6ICkgXHgzZSBwbGFuZS53ICkgXHgyNlx4MjYgY2xpcHBlZDtcblx0XHR9XG5cdFx0aWYgKCBjbGlwcGVkICkgZGlzY2FyZDtcblx0I2VuZGlmXG4jZW5kaWYiLApjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudDoiI2lmIE5VTV9DTElQUElOR19QTEFORVMgXHgzZSAwXG5cdCNpZiAhIGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgISBkZWZpbmVkKCBQSE9ORyApIFx4MjZceDI2ICEgZGVmaW5lZCggTUFUQ0FQIClcblx0XHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcblx0I2VuZGlmXG5cdHVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdO1xuI2VuZGlmIixjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMCBceDI2XHgyNiAhIGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgISBkZWZpbmVkKCBQSE9ORyApIFx4MjZceDI2ICEgZGVmaW5lZCggTUFUQ0FQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWYiLGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg6IiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTIFx4M2UgMCBceDI2XHgyNiAhIGRlZmluZWQoIFNUQU5EQVJEICkgXHgyNlx4MjYgISBkZWZpbmVkKCBQSE9ORyApIFx4MjZceDI2ICEgZGVmaW5lZCggTUFUQ0FQIClcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWYiLApjb2xvcl9mcmFnbWVudDoiI2lmZGVmIFVTRV9DT0xPUlxuXHRkaWZmdXNlQ29sb3IucmdiICpceDNkIHZDb2xvcjtcbiNlbmRpZiIsY29sb3JfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9DT0xPUlxuXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xuI2VuZGlmIixjb2xvcl9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9DT0xPUlxuXHR2YXJ5aW5nIHZlYzMgdkNvbG9yO1xuI2VuZGlmIixjb2xvcl92ZXJ0ZXg6IiNpZmRlZiBVU0VfQ09MT1Jcblx0dkNvbG9yLnh5eiBceDNkIGNvbG9yLnh5ejtcbiNlbmRpZiIsY29tbW9uOiIjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTlcbiNkZWZpbmUgUEkyIDYuMjgzMTg1MzA3MThcbiNkZWZpbmUgUElfSEFMRiAxLjU3MDc5NjMyNjc5NDlcbiNkZWZpbmUgUkVDSVBST0NBTF9QSSAwLjMxODMwOTg4NjE4XG4jZGVmaW5lIFJFQ0lQUk9DQUxfUEkyIDAuMTU5MTU0OTRcbiNkZWZpbmUgTE9HMiAxLjQ0MjY5NVxuI2RlZmluZSBFUFNJTE9OIDFlLTZcbiNkZWZpbmUgc2F0dXJhdGUoYSkgY2xhbXAoIGEsIDAuMCwgMS4wIClcbiNkZWZpbmUgd2hpdGVDb21wbGVtZW50KGEpICggMS4wIC0gc2F0dXJhdGUoIGEgKSApXG5mbG9hdCBwb3cyKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4OyB9XG5mbG9hdCBwb3czKCBjb25zdCBpbiBmbG9hdCB4ICkgeyByZXR1cm4geCp4Kng7IH1cbmZsb2F0IHBvdzQoIGNvbnN0IGluIGZsb2F0IHggKSB7IGZsb2F0IHgyIFx4M2QgeCp4OyByZXR1cm4geDIqeDI7IH1cbmZsb2F0IGF2ZXJhZ2UoIGNvbnN0IGluIHZlYzMgY29sb3IgKSB7IHJldHVybiBkb3QoIGNvbG9yLCB2ZWMzKCAwLjMzMzMgKSApOyB9XG5oaWdocCBmbG9hdCByYW5kKCBjb25zdCBpbiB2ZWMyIHV2ICkge1xuXHRjb25zdCBoaWdocCBmbG9hdCBhIFx4M2QgMTIuOTg5OCwgYiBceDNkIDc4LjIzMywgYyBceDNkIDQzNzU4LjU0NTM7XG5cdGhpZ2hwIGZsb2F0IGR0IFx4M2QgZG90KCB1di54eSwgdmVjMiggYSxiICkgKSwgc24gXHgzZCBtb2QoIGR0LCBQSSApO1xuXHRyZXR1cm4gZnJhY3Qoc2luKHNuKSAqIGMpO1xufVxuI2lmZGVmIEhJR0hfUFJFQ0lTSU9OXG5cdGZsb2F0IHByZWNpc2lvblNhZmVMZW5ndGgoIHZlYzMgdiApIHsgcmV0dXJuIGxlbmd0aCggdiApOyB9XG4jZWxzZVxuXHRmbG9hdCBtYXgzKCB2ZWMzIHYgKSB7IHJldHVybiBtYXgoIG1heCggdi54LCB2LnkgKSwgdi56ICk7IH1cblx0ZmxvYXQgcHJlY2lzaW9uU2FmZUxlbmd0aCggdmVjMyB2ICkge1xuXHRcdGZsb2F0IG1heENvbXBvbmVudCBceDNkIG1heDMoIGFicyggdiApICk7XG5cdFx0cmV0dXJuIGxlbmd0aCggdiAvIG1heENvbXBvbmVudCApICogbWF4Q29tcG9uZW50O1xuXHR9XG4jZW5kaWZcbnN0cnVjdCBJbmNpZGVudExpZ2h0IHtcblx0dmVjMyBjb2xvcjtcblx0dmVjMyBkaXJlY3Rpb247XG5cdGJvb2wgdmlzaWJsZTtcbn07XG5zdHJ1Y3QgUmVmbGVjdGVkTGlnaHQge1xuXHR2ZWMzIGRpcmVjdERpZmZ1c2U7XG5cdHZlYzMgZGlyZWN0U3BlY3VsYXI7XG5cdHZlYzMgaW5kaXJlY3REaWZmdXNlO1xuXHR2ZWMzIGluZGlyZWN0U3BlY3VsYXI7XG59O1xuc3RydWN0IEdlb21ldHJpY0NvbnRleHQge1xuXHR2ZWMzIHBvc2l0aW9uO1xuXHR2ZWMzIG5vcm1hbDtcblx0dmVjMyB2aWV3RGlyO1xuI2lmZGVmIENMRUFSQ09BVFxuXHR2ZWMzIGNsZWFyY29hdE5vcm1hbDtcbiNlbmRpZlxufTtcbnZlYzMgdHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdHJldHVybiBub3JtYWxpemUoICggbWF0cml4ICogdmVjNCggZGlyLCAwLjAgKSApLnh5eiApO1xufVxudmVjMyBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCBpbiB2ZWMzIGRpciwgaW4gbWF0NCBtYXRyaXggKSB7XG5cdHJldHVybiBub3JtYWxpemUoICggdmVjNCggZGlyLCAwLjAgKSAqIG1hdHJpeCApLnh5eiApO1xufVxudmVjMyBwcm9qZWN0T25QbGFuZShpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcblx0ZmxvYXQgZGlzdGFuY2UgXHgzZCBkb3QoIHBsYW5lTm9ybWFsLCBwb2ludCAtIHBvaW50T25QbGFuZSApO1xuXHRyZXR1cm4gLSBkaXN0YW5jZSAqIHBsYW5lTm9ybWFsICsgcG9pbnQ7XG59XG5mbG9hdCBzaWRlT2ZQbGFuZSggaW4gdmVjMyBwb2ludCwgaW4gdmVjMyBwb2ludE9uUGxhbmUsIGluIHZlYzMgcGxhbmVOb3JtYWwgKSB7XG5cdHJldHVybiBzaWduKCBkb3QoIHBvaW50IC0gcG9pbnRPblBsYW5lLCBwbGFuZU5vcm1hbCApICk7XG59XG52ZWMzIGxpbmVQbGFuZUludGVyc2VjdCggaW4gdmVjMyBwb2ludE9uTGluZSwgaW4gdmVjMyBsaW5lRGlyZWN0aW9uLCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcblx0cmV0dXJuIGxpbmVEaXJlY3Rpb24gKiAoIGRvdCggcGxhbmVOb3JtYWwsIHBvaW50T25QbGFuZSAtIHBvaW50T25MaW5lICkgLyBkb3QoIHBsYW5lTm9ybWFsLCBsaW5lRGlyZWN0aW9uICkgKSArIHBvaW50T25MaW5lO1xufVxubWF0MyB0cmFuc3Bvc2VNYXQzKCBjb25zdCBpbiBtYXQzIG0gKSB7XG5cdG1hdDMgdG1wO1xuXHR0bXBbIDAgXSBceDNkIHZlYzMoIG1bIDAgXS54LCBtWyAxIF0ueCwgbVsgMiBdLnggKTtcblx0dG1wWyAxIF0gXHgzZCB2ZWMzKCBtWyAwIF0ueSwgbVsgMSBdLnksIG1bIDIgXS55ICk7XG5cdHRtcFsgMiBdIFx4M2QgdmVjMyggbVsgMCBdLnosIG1bIDEgXS56LCBtWyAyIF0ueiApO1xuXHRyZXR1cm4gdG1wO1xufVxuZmxvYXQgbGluZWFyVG9SZWxhdGl2ZUx1bWluYW5jZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHtcblx0dmVjMyB3ZWlnaHRzIFx4M2QgdmVjMyggMC4yMTI2LCAwLjcxNTIsIDAuMDcyMiApO1xuXHRyZXR1cm4gZG90KCB3ZWlnaHRzLCBjb2xvci5yZ2IgKTtcbn0iLApjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQ6IiNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFX1VWXG4jZGVmaW5lIGN1YmVVVl90ZXh0dXJlU2l6ZSAoMTAyNC4wKVxuaW50IGdldEZhY2VGcm9tRGlyZWN0aW9uKHZlYzMgZGlyZWN0aW9uKSB7XG5cdHZlYzMgYWJzRGlyZWN0aW9uIFx4M2QgYWJzKGRpcmVjdGlvbik7XG5cdGludCBmYWNlIFx4M2QgLTE7XG5cdGlmKCBhYnNEaXJlY3Rpb24ueCBceDNlIGFic0RpcmVjdGlvbi56ICkge1xuXHRcdGlmKGFic0RpcmVjdGlvbi54IFx4M2UgYWJzRGlyZWN0aW9uLnkgKVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi54IFx4M2UgMC4wID8gMCA6IDM7XG5cdFx0ZWxzZVxuXHRcdFx0ZmFjZSBceDNkIGRpcmVjdGlvbi55IFx4M2UgMC4wID8gMSA6IDQ7XG5cdH1cblx0ZWxzZSB7XG5cdFx0aWYoYWJzRGlyZWN0aW9uLnogXHgzZSBhYnNEaXJlY3Rpb24ueSApXG5cdFx0XHRmYWNlIFx4M2QgZGlyZWN0aW9uLnogXHgzZSAwLjAgPyAyIDogNTtcblx0XHRlbHNlXG5cdFx0XHRmYWNlIFx4M2QgZGlyZWN0aW9uLnkgXHgzZSAwLjAgPyAxIDogNDtcblx0fVxuXHRyZXR1cm4gZmFjZTtcbn1cbiNkZWZpbmUgY3ViZVVWX21heExvZHMxICAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAxLjApXG4jZGVmaW5lIGN1YmVVVl9yYW5nZUNsYW1wIChleHAyKCg2LjAgLSAxLjApICogMi4wKSlcbnZlYzIgTWlwTGV2ZWxJbmZvKCB2ZWMzIHZlYywgZmxvYXQgcm91Z2huZXNzTGV2ZWwsIGZsb2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgc2NhbGUgXHgzZCBleHAyKGN1YmVVVl9tYXhMb2RzMSAtIHJvdWdobmVzc0xldmVsKTtcblx0ZmxvYXQgZHhSb3VnaG5lc3MgXHgzZCBkRmR4KHJvdWdobmVzcyk7XG5cdGZsb2F0IGR5Um91Z2huZXNzIFx4M2QgZEZkeShyb3VnaG5lc3MpO1xuXHR2ZWMzIGR4IFx4M2QgZEZkeCggdmVjICogc2NhbGUgKiBkeFJvdWdobmVzcyApO1xuXHR2ZWMzIGR5IFx4M2QgZEZkeSggdmVjICogc2NhbGUgKiBkeVJvdWdobmVzcyApO1xuXHRmbG9hdCBkIFx4M2QgbWF4KCBkb3QoIGR4LCBkeCApLCBkb3QoIGR5LCBkeSApICk7XG5cdGQgXHgzZCBjbGFtcChkLCAxLjAsIGN1YmVVVl9yYW5nZUNsYW1wKTtcblx0ZmxvYXQgbWlwTGV2ZWwgXHgzZCAwLjUgKiBsb2cyKGQpO1xuXHRyZXR1cm4gdmVjMihmbG9vcihtaXBMZXZlbCksIGZyYWN0KG1pcExldmVsKSk7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMiAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAyLjApXG4jZGVmaW5lIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZSAoMS4wIC8gY3ViZVVWX3RleHR1cmVTaXplKVxudmVjMiBnZXRDdWJlVVYodmVjMyBkaXJlY3Rpb24sIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCBtaXBMZXZlbCkge1xuXHRtaXBMZXZlbCBceDNkIHJvdWdobmVzc0xldmVsIFx4M2UgY3ViZVVWX21heExvZHMyIC0gMy4wID8gMC4wIDogbWlwTGV2ZWw7XG5cdGZsb2F0IGEgXHgzZCAxNi4wICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xuXHR2ZWMyIGV4cDJfcGFja2VkIFx4M2QgZXhwMiggdmVjMiggcm91Z2huZXNzTGV2ZWwsIG1pcExldmVsICkgKTtcblx0dmVjMiByY3BfZXhwMl9wYWNrZWQgXHgzZCB2ZWMyKCAxLjAgKSAvIGV4cDJfcGFja2VkO1xuXHRmbG9hdCBwb3dTY2FsZSBceDNkIGV4cDJfcGFja2VkLnggKiBleHAyX3BhY2tlZC55O1xuXHRmbG9hdCBzY2FsZSBceDNkIHJjcF9leHAyX3BhY2tlZC54ICogcmNwX2V4cDJfcGFja2VkLnkgKiAwLjI1O1xuXHRmbG9hdCBtaXBPZmZzZXQgXHgzZCAwLjc1KigxLjAgLSByY3BfZXhwMl9wYWNrZWQueSkgKiByY3BfZXhwMl9wYWNrZWQueDtcblx0Ym9vbCBiUmVzIFx4M2QgbWlwTGV2ZWwgXHgzZFx4M2QgMC4wO1xuXHRzY2FsZSBceDNkICBiUmVzIFx4MjZceDI2IChzY2FsZSBceDNjIGEpID8gYSA6IHNjYWxlO1xuXHR2ZWMzIHI7XG5cdHZlYzIgb2Zmc2V0O1xuXHRpbnQgZmFjZSBceDNkIGdldEZhY2VGcm9tRGlyZWN0aW9uKGRpcmVjdGlvbik7XG5cdGZsb2F0IHJjcFBvd1NjYWxlIFx4M2QgMS4wIC8gcG93U2NhbGU7XG5cdGlmKCBmYWNlIFx4M2RceDNkIDApIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueCwgLWRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueSk7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMigwLjArbWlwT2Zmc2V0LDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlIFx4M2RceDNkIDEpIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi56KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKHNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSBceDNkIGJSZXMgXHgyNlx4MjYgKG9mZnNldC55IFx4M2MgMi4wKmEpID8gYSA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgXHgzZFx4M2QgMikge1xuXHRcdHIgXHgzZCB2ZWMzKGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC43NSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSBceDNkIGJSZXMgXHgyNlx4MjYgKG9mZnNldC55IFx4M2MgMi4wKmEpID8gYSA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgXHgzZFx4M2QgMykge1xuXHRcdHIgXHgzZCB2ZWMzKGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCBceDNkIHZlYzIoMC4wK21pcE9mZnNldCwwLjUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xuXHR9XG5cdGVsc2UgaWYoIGZhY2UgXHgzZFx4M2QgNCkge1xuXHRcdHIgXHgzZCB2ZWMzKGRpcmVjdGlvbi55LCBkaXJlY3Rpb24ueCwgLWRpcmVjdGlvbi56KTtcblx0XHRvZmZzZXQgXHgzZCB2ZWMyKHNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55IFx4M2QgYlJlcyBceDI2XHgyNiAob2Zmc2V0LnkgXHgzYyAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIHtcblx0XHRyIFx4M2QgdmVjMyhkaXJlY3Rpb24ueiwgLWRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueSk7XG5cdFx0b2Zmc2V0IFx4M2QgdmVjMigyLjAqc2NhbGUrbWlwT2Zmc2V0LCAwLjUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgXHgzZCBiUmVzIFx4MjZceDI2IChvZmZzZXQueSBceDNjIDIuMCphKSA/IDAuMCA6IG9mZnNldC55O1xuXHR9XG5cdHIgXHgzZCBub3JtYWxpemUocik7XG5cdGZsb2F0IHRleGVsT2Zmc2V0IFx4M2QgMC41ICogY3ViZVVWX3JjcFRleHR1cmVTaXplO1xuXHR2ZWMyIHMgXHgzZCAoIHIueXogLyBhYnMoIHIueCApICsgdmVjMiggMS4wICkgKSAqIDAuNTtcblx0dmVjMiBiYXNlIFx4M2Qgb2Zmc2V0ICsgdmVjMiggdGV4ZWxPZmZzZXQgKTtcblx0cmV0dXJuIGJhc2UgKyBzICogKCBzY2FsZSAtIDIuMCAqIHRleGVsT2Zmc2V0ICk7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMyAobG9nMihjdWJlVVZfdGV4dHVyZVNpemUqMC4yNSkgLSAzLjApXG52ZWM0IHRleHR1cmVDdWJlVVYoIHNhbXBsZXIyRCBlbnZNYXAsIHZlYzMgcmVmbGVjdGVkRGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IHJvdWdobmVzc1ZhbCBceDNkIHJvdWdobmVzcyogY3ViZVVWX21heExvZHMzO1xuXHRmbG9hdCByMSBceDNkIGZsb29yKHJvdWdobmVzc1ZhbCk7XG5cdGZsb2F0IHIyIFx4M2QgcjEgKyAxLjA7XG5cdGZsb2F0IHQgXHgzZCBmcmFjdChyb3VnaG5lc3NWYWwpO1xuXHR2ZWMyIG1pcEluZm8gXHgzZCBNaXBMZXZlbEluZm8ocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgcm91Z2huZXNzKTtcblx0ZmxvYXQgcyBceDNkIG1pcEluZm8ueTtcblx0ZmxvYXQgbGV2ZWwwIFx4M2QgbWlwSW5mby54O1xuXHRmbG9hdCBsZXZlbDEgXHgzZCBsZXZlbDAgKyAxLjA7XG5cdGxldmVsMSBceDNkIGxldmVsMSBceDNlIDUuMCA/IDUuMCA6IGxldmVsMTtcblx0bGV2ZWwwICtceDNkIG1pbiggZmxvb3IoIHMgKyAwLjUgKSwgNS4wICk7XG5cdHZlYzIgdXZfMTAgXHgzZCBnZXRDdWJlVVYocmVmbGVjdGVkRGlyZWN0aW9uLCByMSwgbGV2ZWwwKTtcblx0dmVjNCBjb2xvcjEwIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhcih0ZXh0dXJlMkQoZW52TWFwLCB1dl8xMCkpO1xuXHR2ZWMyIHV2XzIwIFx4M2QgZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjIsIGxldmVsMCk7XG5cdHZlYzQgY29sb3IyMCBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMjApKTtcblx0dmVjNCByZXN1bHQgXHgzZCBtaXgoY29sb3IxMCwgY29sb3IyMCwgdCk7XG5cdHJldHVybiB2ZWM0KHJlc3VsdC5yZ2IsIDEuMCk7XG59XG4jZW5kaWYiLApkZWZhdWx0bm9ybWFsX3ZlcnRleDoidmVjMyB0cmFuc2Zvcm1lZE5vcm1hbCBceDNkIG5vcm1hbE1hdHJpeCAqIG9iamVjdE5vcm1hbDtcbiNpZmRlZiBGTElQX1NJREVEXG5cdHRyYW5zZm9ybWVkTm9ybWFsIFx4M2QgLSB0cmFuc2Zvcm1lZE5vcm1hbDtcbiNlbmRpZlxuI2lmZGVmIFVTRV9UQU5HRU5UXG5cdHZlYzMgdHJhbnNmb3JtZWRUYW5nZW50IFx4M2Qgbm9ybWFsTWF0cml4ICogb2JqZWN0VGFuZ2VudDtcblx0I2lmZGVmIEZMSVBfU0lERURcblx0XHR0cmFuc2Zvcm1lZFRhbmdlbnQgXHgzZCAtIHRyYW5zZm9ybWVkVGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWYiLGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFwO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudEJpYXM7XG4jZW5kaWYiLGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg6IiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHRyYW5zZm9ybWVkICtceDNkIG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB1diApLnggKiBkaXNwbGFjZW1lbnRTY2FsZSArIGRpc3BsYWNlbWVudEJpYXMgKTtcbiNlbmRpZiIsCmVtaXNzaXZlbWFwX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5cdHZlYzQgZW1pc3NpdmVDb2xvciBceDNkIHRleHR1cmUyRCggZW1pc3NpdmVNYXAsIHZVdiApO1xuXHRlbWlzc2l2ZUNvbG9yLnJnYiBceDNkIGVtaXNzaXZlTWFwVGV4ZWxUb0xpbmVhciggZW1pc3NpdmVDb2xvciApLnJnYjtcblx0dG90YWxFbWlzc2l2ZVJhZGlhbmNlICpceDNkIGVtaXNzaXZlQ29sb3IucmdiO1xuI2VuZGlmIixlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0VNSVNTSVZFTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGVtaXNzaXZlTWFwO1xuI2VuZGlmIixlbmNvZGluZ3NfZnJhZ21lbnQ6ImdsX0ZyYWdDb2xvciBceDNkIGxpbmVhclRvT3V0cHV0VGV4ZWwoIGdsX0ZyYWdDb2xvciApOyIsZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IlxudmVjNCBMaW5lYXJUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZhbHVlO1xufVxudmVjNCBHYW1tYVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcblx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCBnYW1tYUZhY3RvciApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgTGluZWFyVG9HYW1tYSggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgZ2FtbWFGYWN0b3IgKSB7XG5cdHJldHVybiB2ZWM0KCBwb3coIHZhbHVlLnJnYiwgdmVjMyggMS4wIC8gZ2FtbWFGYWN0b3IgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IHNSR0JUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIG1peCggcG93KCB2YWx1ZS5yZ2IgKiAwLjk0Nzg2NzI5ODYgKyB2ZWMzKCAwLjA1MjEzMjcwMTQgKSwgdmVjMyggMi40ICkgKSwgdmFsdWUucmdiICogMC4wNzczOTkzODA4LCB2ZWMzKCBsZXNzVGhhbkVxdWFsKCB2YWx1ZS5yZ2IsIHZlYzMoIDAuMDQwNDUgKSApICkgKSwgdmFsdWUuYSApO1xufVxudmVjNCBMaW5lYXJUb3NSR0IoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCBtaXgoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAwLjQxNjY2ICkgKSAqIDEuMDU1IC0gdmVjMyggMC4wNTUgKSwgdmFsdWUucmdiICogMTIuOTIsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wMDMxMzA4ICkgKSApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgUkdCRVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogZXhwMiggdmFsdWUuYSAqIDI1NS4wIC0gMTI4LjAgKSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCRSggaW4gdmVjNCB2YWx1ZSApIHtcblx0ZmxvYXQgbWF4Q29tcG9uZW50IFx4M2QgbWF4KCBtYXgoIHZhbHVlLnIsIHZhbHVlLmcgKSwgdmFsdWUuYiApO1xuXHRmbG9hdCBmRXhwIFx4M2QgY2xhbXAoIGNlaWwoIGxvZzIoIG1heENvbXBvbmVudCApICksIC0xMjguMCwgMTI3LjAgKTtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAvIGV4cDIoIGZFeHAgKSwgKCBmRXhwICsgMTI4LjAgKSAvIDI1NS4wICk7XG59XG52ZWM0IFJHQk1Ub0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiB2YWx1ZS5hICogbWF4UmFuZ2UsIDEuMCApO1xufVxudmVjNCBMaW5lYXJUb1JHQk0oIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRmbG9hdCBtYXhSR0IgXHgzZCBtYXgoIHZhbHVlLnIsIG1heCggdmFsdWUuZywgdmFsdWUuYiApICk7XG5cdGZsb2F0IE0gXHgzZCBjbGFtcCggbWF4UkdCIC8gbWF4UmFuZ2UsIDAuMCwgMS4wICk7XG5cdE0gXHgzZCBjZWlsKCBNICogMjU1LjAgKSAvIDI1NS4wO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gKCBNICogbWF4UmFuZ2UgKSwgTSApO1xufVxudmVjNCBSR0JEVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IG1heFJhbmdlICkge1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCAoIG1heFJhbmdlIC8gMjU1LjAgKSAvIHZhbHVlLmEgKSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCRCggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdGZsb2F0IG1heFJHQiBceDNkIG1heCggdmFsdWUuciwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcblx0ZmxvYXQgRCBceDNkIG1heCggbWF4UmFuZ2UgLyBtYXhSR0IsIDEuMCApO1xuXHREIFx4M2QgbWluKCBmbG9vciggRCApIC8gMjU1LjAsIDEuMCApO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiICogKCBEICogKCAyNTUuMCAvIG1heFJhbmdlICkgKSwgRCApO1xufVxuY29uc3QgbWF0MyBjTG9nTHV2TSBceDNkIG1hdDMoIDAuMjIwOSwgMC4zMzkwLCAwLjQxODQsIDAuMTEzOCwgMC42NzgwLCAwLjczMTksIDAuMDEwMiwgMC4xMTMwLCAwLjI5NjkgKTtcbnZlYzQgTGluZWFyVG9Mb2dMdXYoIGluIHZlYzQgdmFsdWUgKSAge1xuXHR2ZWMzIFhwX1lfWFlacCBceDNkIGNMb2dMdXZNICogdmFsdWUucmdiO1xuXHRYcF9ZX1hZWnAgXHgzZCBtYXgoIFhwX1lfWFlacCwgdmVjMyggMWUtNiwgMWUtNiwgMWUtNiApICk7XG5cdHZlYzQgdlJlc3VsdDtcblx0dlJlc3VsdC54eSBceDNkIFhwX1lfWFlacC54eSAvIFhwX1lfWFlacC56O1xuXHRmbG9hdCBMZSBceDNkIDIuMCAqIGxvZzIoWHBfWV9YWVpwLnkpICsgMTI3LjA7XG5cdHZSZXN1bHQudyBceDNkIGZyYWN0KCBMZSApO1xuXHR2UmVzdWx0LnogXHgzZCAoIExlIC0gKCBmbG9vciggdlJlc3VsdC53ICogMjU1LjAgKSApIC8gMjU1LjAgKSAvIDI1NS4wO1xuXHRyZXR1cm4gdlJlc3VsdDtcbn1cbmNvbnN0IG1hdDMgY0xvZ0x1dkludmVyc2VNIFx4M2QgbWF0MyggNi4wMDE0LCAtMi43MDA4LCAtMS43OTk2LCAtMS4zMzIwLCAzLjEwMjksIC01Ljc3MjEsIDAuMzAwOCwgLTEuMDg4MiwgNS42MjY4ICk7XG52ZWM0IExvZ0x1dlRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRmbG9hdCBMZSBceDNkIHZhbHVlLnogKiAyNTUuMCArIHZhbHVlLnc7XG5cdHZlYzMgWHBfWV9YWVpwO1xuXHRYcF9ZX1hZWnAueSBceDNkIGV4cDIoICggTGUgLSAxMjcuMCApIC8gMi4wICk7XG5cdFhwX1lfWFlacC56IFx4M2QgWHBfWV9YWVpwLnkgLyB2YWx1ZS55O1xuXHRYcF9ZX1hZWnAueCBceDNkIHZhbHVlLnggKiBYcF9ZX1hZWnAuejtcblx0dmVjMyB2UkdCIFx4M2QgY0xvZ0x1dkludmVyc2VNICogWHBfWV9YWVpwLnJnYjtcblx0cmV0dXJuIHZlYzQoIG1heCggdlJHQiwgMC4wICksIDEuMCApO1xufSIsCmVudm1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZlYzMgY2FtZXJhVG9WZXJ0ZXggXHgzZCBub3JtYWxpemUoIHZXb3JsZFBvc2l0aW9uIC0gY2FtZXJhUG9zaXRpb24gKTtcblx0XHR2ZWMzIHdvcmxkTm9ybWFsIFx4M2QgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZlYzMgcmVmbGVjdFZlYyBceDNkIHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZyYWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwsIHJlZnJhY3Rpb25SYXRpbyApO1xuXHRcdCNlbmRpZlxuXHQjZWxzZVxuXHRcdHZlYzMgcmVmbGVjdFZlYyBceDNkIHZSZWZsZWN0O1xuXHQjZW5kaWZcblx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHR2ZWM0IGVudkNvbG9yIFx4M2QgdGV4dHVyZUN1YmUoIGVudk1hcCwgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxuXHRcdHZlYzIgc2FtcGxlVVY7XG5cdFx0cmVmbGVjdFZlYyBceDNkIG5vcm1hbGl6ZSggcmVmbGVjdFZlYyApO1xuXHRcdHNhbXBsZVVWLnkgXHgzZCBhc2luKCBjbGFtcCggcmVmbGVjdFZlYy55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdFx0c2FtcGxlVVYueCBceDNkIGF0YW4oIHJlZmxlY3RWZWMueiwgcmVmbGVjdFZlYy54ICkgKiBSRUNJUFJPQ0FMX1BJMiArIDAuNTtcblx0XHR2ZWM0IGVudkNvbG9yIFx4M2QgdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXG5cdFx0cmVmbGVjdFZlYyBceDNkIG5vcm1hbGl6ZSggcmVmbGVjdFZlYyApO1xuXHRcdHZlYzMgcmVmbGVjdFZpZXcgXHgzZCBub3JtYWxpemUoICggdmlld01hdHJpeCAqIHZlYzQoIHJlZmxlY3RWZWMsIDAuMCApICkueHl6ICsgdmVjMyggMC4wLCAwLjAsIDEuMCApICk7XG5cdFx0dmVjNCBlbnZDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSApO1xuXHQjZWxzZVxuXHRcdHZlYzQgZW52Q29sb3IgXHgzZCB2ZWM0KCAwLjAgKTtcblx0I2VuZGlmXG5cdGVudkNvbG9yIFx4M2QgZW52TWFwVGV4ZWxUb0xpbmVhciggZW52Q29sb3IgKTtcblx0I2lmZGVmIEVOVk1BUF9CTEVORElOR19NVUxUSVBMWVxuXHRcdG91dGdvaW5nTGlnaHQgXHgzZCBtaXgoIG91dGdvaW5nTGlnaHQsIG91dGdvaW5nTGlnaHQgKiBlbnZDb2xvci54eXosIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHkgKTtcblx0I2VsaWYgZGVmaW5lZCggRU5WTUFQX0JMRU5ESU5HX01JWCApXG5cdFx0b3V0Z29pbmdMaWdodCBceDNkIG1peCggb3V0Z29pbmdMaWdodCwgZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19BREQgKVxuXHRcdG91dGdvaW5nTGlnaHQgK1x4M2QgZW52Q29sb3IueHl6ICogc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eTtcblx0I2VuZGlmXG4jZW5kaWYiLAplbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfRU5WTUFQXG5cdHVuaWZvcm0gZmxvYXQgZW52TWFwSW50ZW5zaXR5O1xuXHR1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XG5cdHVuaWZvcm0gaW50IG1heE1pcExldmVsO1xuXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdHVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcblx0I2VuZGlmXG5cdFxuI2VuZGlmIixlbnZtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0dW5pZm9ybSBmbG9hdCByZWZsZWN0aXZpdHk7XG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXG5cdFx0I2RlZmluZSBFTlZfV09STERQT1Ncblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbHNlXG5cdFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xuXHQjZW5kaWZcbiNlbmRpZiIsCmVudm1hcF9wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmIGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVVNFX05PUk1BTE1BUCApIHx8ZGVmaW5lZCggUEhPTkcgKVxuXHRcdCNkZWZpbmUgRU5WX1dPUkxEUE9TXG5cdCNlbmRpZlxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXG5cdFx0XG5cdFx0dmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuXHQjZWxzZVxuXHRcdHZhcnlpbmcgdmVjMyB2UmVmbGVjdDtcblx0XHR1bmlmb3JtIGZsb2F0IHJlZnJhY3Rpb25SYXRpbztcblx0I2VuZGlmXG4jZW5kaWYiLGVudm1hcF9waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApXG5cdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZSQUNUSU9OXG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbmRpZlxuXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHR2ZWMzIHdvcmxkTm9ybWFsIFx4M2QgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggZ2VvbWV0cnkubm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHRcdHZlYzMgcXVlcnlWZWMgXHgzZCB2ZWMzKCBmbGlwRW52TWFwICogd29ybGROb3JtYWwueCwgd29ybGROb3JtYWwueXogKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRcdHZlYzMgcXVlcnlWZWMgXHgzZCB2ZWMzKCBmbGlwRW52TWFwICogd29ybGROb3JtYWwueCwgd29ybGROb3JtYWwueXogKTtcblx0XHRcdHZlYzQgZW52TWFwQ29sb3IgXHgzZCB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIHF1ZXJ5VmVjLCAxLjAgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHZlYzQoIDAuMCApO1xuXHRcdCNlbmRpZlxuXHRcdHJldHVybiBQSSAqIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcblx0fVxuXHRmbG9hdCBnZXRTcGVjdWxhck1JUExldmVsKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHRmbG9hdCBtYXhNSVBMZXZlbFNjYWxhciBceDNkIGZsb2F0KCBtYXhNSVBMZXZlbCApO1xuXHRcdGZsb2F0IHNpZ21hIFx4M2QgUEkgKiByb3VnaG5lc3MgKiByb3VnaG5lc3MgLyAoIDEuMCArIHJvdWdobmVzcyApO1xuXHRcdGZsb2F0IGRlc2lyZWRNSVBMZXZlbCBceDNkIG1heE1JUExldmVsU2NhbGFyICsgbG9nMiggc2lnbWEgKTtcblx0XHRyZXR1cm4gY2xhbXAoIGRlc2lyZWRNSVBMZXZlbCwgMC4wLCBtYXhNSVBMZXZlbFNjYWxhciApO1xuXHR9XG5cdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0ICB2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZsZWN0KCAtdmlld0Rpciwgbm9ybWFsICk7XG5cdFx0ICByZWZsZWN0VmVjIFx4M2Qgbm9ybWFsaXplKCBtaXgoIHJlZmxlY3RWZWMsIG5vcm1hbCwgcm91Z2huZXNzICogcm91Z2huZXNzKSApO1xuXHRcdCNlbHNlXG5cdFx0ICB2ZWMzIHJlZmxlY3RWZWMgXHgzZCByZWZyYWN0KCAtdmlld0Rpciwgbm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0XHRyZWZsZWN0VmVjIFx4M2QgaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggcmVmbGVjdFZlYywgdmlld01hdHJpeCApO1xuXHRcdGZsb2F0IHNwZWN1bGFyTUlQTGV2ZWwgXHgzZCBnZXRTcGVjdWxhck1JUExldmVsKCByb3VnaG5lc3MsIG1heE1JUExldmVsICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHRcdHZlYzMgcXVlcnlSZWZsZWN0VmVjIFx4M2QgdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgXHgzZCB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZUN1YmVVViggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHJvdWdobmVzcyApO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxuXHRcdFx0dmVjMiBzYW1wbGVVVjtcblx0XHRcdHNhbXBsZVVWLnkgXHgzZCBhc2luKCBjbGFtcCggcmVmbGVjdFZlYy55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdFx0XHRzYW1wbGVVVi54IFx4M2QgYXRhbiggcmVmbGVjdFZlYy56LCByZWZsZWN0VmVjLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yIFx4M2QgdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiBceDNkIGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXG5cdFx0XHR2ZWMzIHJlZmxlY3RWaWV3IFx4M2Qgbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwwLjAsMS4wICkgKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRExvZEVYVCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciBceDNkIHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgXHgzZCBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xuXHR9XG4jZW5kaWYiLAplbnZtYXBfdmVydGV4OiIjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaWZkZWYgRU5WX1dPUkxEUE9TXG5cdFx0dldvcmxkUG9zaXRpb24gXHgzZCB3b3JsZFBvc2l0aW9uLnh5ejtcblx0I2Vsc2Vcblx0XHR2ZWMzIGNhbWVyYVRvVmVydGV4IFx4M2Qgbm9ybWFsaXplKCB3b3JsZFBvc2l0aW9uLnh5eiAtIGNhbWVyYVBvc2l0aW9uICk7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIHRyYW5zZm9ybWVkTm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9NT0RFX1JFRkxFQ1RJT05cblx0XHRcdHZSZWZsZWN0IFx4M2QgcmVmbGVjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHZSZWZsZWN0IFx4M2QgcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWYiLGZvZ192ZXJ0ZXg6IiNpZmRlZiBVU0VfRk9HXG5cdGZvZ0RlcHRoIFx4M2QgLW12UG9zaXRpb24uejtcbiNlbmRpZiIsCmZvZ19wYXJzX3ZlcnRleDoiI2lmZGVmIFVTRV9GT0dcblx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcbiNlbmRpZiIsZm9nX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0ZPR1xuXHQjaWZkZWYgRk9HX0VYUDJcblx0XHRmbG9hdCBmb2dGYWN0b3IgXHgzZCAxLjAgLSBleHAoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiBmb2dEZXB0aCAqIGZvZ0RlcHRoICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgZm9nRmFjdG9yIFx4M2Qgc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCBmb2dEZXB0aCApO1xuXHQjZW5kaWZcblx0Z2xfRnJhZ0NvbG9yLnJnYiBceDNkIG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApO1xuI2VuZGlmIixmb2dfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9GT0dcblx0dW5pZm9ybSB2ZWMzIGZvZ0NvbG9yO1xuXHR2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xuXHQjaWZkZWYgRk9HX0VYUDJcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dOZWFyO1xuXHRcdHVuaWZvcm0gZmxvYXQgZm9nRmFyO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBUT09OXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGdyYWRpZW50TWFwO1xuXHR2ZWMzIGdldEdyYWRpZW50SXJyYWRpYW5jZSggdmVjMyBub3JtYWwsIHZlYzMgbGlnaHREaXJlY3Rpb24gKSB7XG5cdFx0ZmxvYXQgZG90TkwgXHgzZCBkb3QoIG5vcm1hbCwgbGlnaHREaXJlY3Rpb24gKTtcblx0XHR2ZWMyIGNvb3JkIFx4M2QgdmVjMiggZG90TkwgKiAwLjUgKyAwLjUsIDAuMCApO1xuXHRcdCNpZmRlZiBVU0VfR1JBRElFTlRNQVBcblx0XHRcdHJldHVybiB0ZXh0dXJlMkQoIGdyYWRpZW50TWFwLCBjb29yZCApLnJnYjtcblx0XHQjZWxzZVxuXHRcdFx0cmV0dXJuICggY29vcmQueCBceDNjIDAuNyApID8gdmVjMyggMC43ICkgOiB2ZWMzKCAxLjAgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmIixsaWdodG1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9MSUdIVE1BUFxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgUEkgKiB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG4jZW5kaWYiLApsaWdodG1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGxpZ2h0TWFwO1xuXHR1bmlmb3JtIGZsb2F0IGxpZ2h0TWFwSW50ZW5zaXR5O1xuI2VuZGlmIixsaWdodHNfbGFtYmVydF92ZXJ0ZXg6InZlYzMgZGlmZnVzZSBceDNkIHZlYzMoIDEuMCApO1xuR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeTtcbmdlb21ldHJ5LnBvc2l0aW9uIFx4M2QgbXZQb3NpdGlvbi54eXo7XG5nZW9tZXRyeS5ub3JtYWwgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG5nZW9tZXRyeS52aWV3RGlyIFx4M2Qgbm9ybWFsaXplKCAtbXZQb3NpdGlvbi54eXogKTtcbkdlb21ldHJpY0NvbnRleHQgYmFja0dlb21ldHJ5O1xuYmFja0dlb21ldHJ5LnBvc2l0aW9uIFx4M2QgZ2VvbWV0cnkucG9zaXRpb247XG5iYWNrR2VvbWV0cnkubm9ybWFsIFx4M2QgLWdlb21ldHJ5Lm5vcm1hbDtcbmJhY2tHZW9tZXRyeS52aWV3RGlyIFx4M2QgZ2VvbWV0cnkudmlld0RpcjtcbnZMaWdodEZyb250IFx4M2QgdmVjMyggMC4wICk7XG52SW5kaXJlY3RGcm9udCBceDNkIHZlYzMoIDAuMCApO1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2TGlnaHRCYWNrIFx4M2QgdmVjMyggMC4wICk7XG5cdHZJbmRpcmVjdEJhY2sgXHgzZCB2ZWMzKCAwLjAgKTtcbiNlbmRpZlxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcbmZsb2F0IGRvdE5MO1xudmVjMyBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG4jaWYgTlVNX1BPSU5UX0xJR0hUUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUE9JTlRfTElHSFRTOyBpICsrICkge1xuXHRcdGdldFBvaW50RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBwb2ludExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCBceDNkIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgXHgzZCBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICtceDNkIHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgK1x4M2Qgc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fU1BPVF9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xuXHRcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgXHgzZCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlIFx4M2QgUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArXHgzZCBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICtceDNkIHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4jaWYgTlVNX0RJUl9MSUdIVFMgXHgzZSAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XG5cdFx0Z2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGRpcmVjdGlvbmFsTGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MIFx4M2QgZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSBceDNkIFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgK1x4M2Qgc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArXHgzZCBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9IRU1JX0xJR0hUUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fSEVNSV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0dkluZGlyZWN0RnJvbnQgK1x4M2QgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZJbmRpcmVjdEJhY2sgK1x4M2QgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBiYWNrR2VvbWV0cnkgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmIiwKbGlnaHRzX3BhcnNfYmVnaW46InVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjtcbnVuaWZvcm0gdmVjMyBsaWdodFByb2JlWyA5IF07XG52ZWMzIHNoR2V0SXJyYWRpYW5jZUF0KCBpbiB2ZWMzIG5vcm1hbCwgaW4gdmVjMyBzaENvZWZmaWNpZW50c1sgOSBdICkge1xuXHRmbG9hdCB4IFx4M2Qgbm9ybWFsLngsIHkgXHgzZCBub3JtYWwueSwgeiBceDNkIG5vcm1hbC56O1xuXHR2ZWMzIHJlc3VsdCBceDNkIHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNztcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyAxIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHk7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA0IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB5O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDUgXSAqIDIuMCAqIDAuNDI5MDQzICogeSAqIHo7XG5cdHJlc3VsdCArXHgzZCBzaENvZWZmaWNpZW50c1sgNiBdICogKCAwLjc0MzEyNSAqIHogKiB6IC0gMC4yNDc3MDggKTtcblx0cmVzdWx0ICtceDNkIHNoQ29lZmZpY2llbnRzWyA3IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB6O1xuXHRyZXN1bHQgK1x4M2Qgc2hDb2VmZmljaWVudHNbIDggXSAqIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICk7XG5cdHJldHVybiByZXN1bHQ7XG59XG52ZWMzIGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGxpZ2h0UHJvYmVbIDkgXSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcblx0dmVjMyB3b3JsZE5vcm1hbCBceDNkIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xuXHR2ZWMzIGlycmFkaWFuY2UgXHgzZCBzaEdldElycmFkaWFuY2VBdCggd29ybGROb3JtYWwsIGxpZ2h0UHJvYmUgKTtcblx0cmV0dXJuIGlycmFkaWFuY2U7XG59XG52ZWMzIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgYW1iaWVudExpZ2h0Q29sb3IgKSB7XG5cdHZlYzMgaXJyYWRpYW5jZSBceDNkIGFtYmllbnRMaWdodENvbG9yO1xuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICpceDNkIFBJO1xuXHQjZW5kaWZcblx0cmV0dXJuIGlycmFkaWFuY2U7XG59XG4jaWYgTlVNX0RJUl9MSUdIVFMgXHgzZSAwXG5cdHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGludCBzaGFkb3c7XG5cdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHR9O1xuXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07XG5cdHZvaWQgZ2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgXHgzZCBkaXJlY3Rpb25hbExpZ2h0LmNvbG9yO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiBceDNkIGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LnZpc2libGUgXHgzZCB0cnVlO1xuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUE9JTlRfTElHSFRTIFx4M2UgMFxuXHRzdHJ1Y3QgUG9pbnRMaWdodCB7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRlY2F5O1xuXHRcdGludCBzaGFkb3c7XG5cdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHRcdGZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7XG5cdFx0ZmxvYXQgc2hhZG93Q2FtZXJhRmFyO1xuXHR9O1xuXHR1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0dm9pZCBnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcblx0XHR2ZWMzIGxWZWN0b3IgXHgzZCBwb2ludExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uIFx4M2Qgbm9ybWFsaXplKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgbGlnaHREaXN0YW5jZSBceDNkIGxlbmd0aCggbFZlY3RvciApO1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yIFx4M2QgcG9pbnRMaWdodC5jb2xvcjtcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqXHgzZCBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5ICk7XG5cdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSBceDNkICggZGlyZWN0TGlnaHQuY29sb3IgIVx4M2QgdmVjMyggMC4wICkgKTtcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTIFx4M2UgMFxuXHRzdHJ1Y3QgU3BvdExpZ2h0IHtcblx0XHR2ZWMzIHBvc2l0aW9uO1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0ZmxvYXQgZGlzdGFuY2U7XG5cdFx0ZmxvYXQgZGVjYXk7XG5cdFx0ZmxvYXQgY29uZUNvcztcblx0XHRmbG9hdCBwZW51bWJyYUNvcztcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0fTtcblx0dW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07XG5cdHZvaWQgZ2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gU3BvdExpZ2h0IHNwb3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgICkge1xuXHRcdHZlYzMgbFZlY3RvciBceDNkIHNwb3RMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiBceDNkIG5vcm1hbGl6ZSggbFZlY3RvciApO1xuXHRcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgXHgzZCBsZW5ndGgoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBhbmdsZUNvcyBceDNkIGRvdCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBzcG90TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0aWYgKCBhbmdsZUNvcyBceDNlIHNwb3RMaWdodC5jb25lQ29zICkge1xuXHRcdFx0ZmxvYXQgc3BvdEVmZmVjdCBceDNkIHNtb290aHN0ZXAoIHNwb3RMaWdodC5jb25lQ29zLCBzcG90TGlnaHQucGVudW1icmFDb3MsIGFuZ2xlQ29zICk7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciBceDNkIHNwb3RMaWdodC5jb2xvcjtcblx0XHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIHNwb3RFZmZlY3QgKiBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBzcG90TGlnaHQuZGlzdGFuY2UsIHNwb3RMaWdodC5kZWNheSApO1xuXHRcdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSBceDNkIHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRpcmVjdExpZ2h0LmNvbG9yIFx4M2QgdmVjMyggMC4wICk7XG5cdFx0XHRkaXJlY3RMaWdodC52aXNpYmxlIFx4M2QgZmFsc2U7XG5cdFx0fVxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IFJlY3RBcmVhTGlnaHQge1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGhhbGZXaWR0aDtcblx0XHR2ZWMzIGhhbGZIZWlnaHQ7XG5cdH07XG5cdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18xO1x0dW5pZm9ybSBzYW1wbGVyMkQgbHRjXzI7XG5cdHVuaWZvcm0gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0c1sgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXTtcbiNlbmRpZlxuI2lmIE5VTV9IRU1JX0xJR0hUUyBceDNlIDBcblx0c3RydWN0IEhlbWlzcGhlcmVMaWdodCB7XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVjMyBza3lDb2xvcjtcblx0XHR2ZWMzIGdyb3VuZENvbG9yO1xuXHR9O1xuXHR1bmlmb3JtIEhlbWlzcGhlcmVMaWdodCBoZW1pc3BoZXJlTGlnaHRzWyBOVU1fSEVNSV9MSUdIVFMgXTtcblx0dmVjMyBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBIZW1pc3BoZXJlTGlnaHQgaGVtaUxpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5ICkge1xuXHRcdGZsb2F0IGRvdE5MIFx4M2QgZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhlbWlMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRmbG9hdCBoZW1pRGlmZnVzZVdlaWdodCBceDNkIDAuNSAqIGRvdE5MICsgMC41O1xuXHRcdHZlYzMgaXJyYWRpYW5jZSBceDNkIG1peCggaGVtaUxpZ2h0Lmdyb3VuZENvbG9yLCBoZW1pTGlnaHQuc2t5Q29sb3IsIGhlbWlEaWZmdXNlV2VpZ2h0ICk7XG5cdFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0XHRpcnJhZGlhbmNlICpceDNkIFBJO1xuXHRcdCNlbmRpZlxuXHRcdHJldHVybiBpcnJhZGlhbmNlO1xuXHR9XG4jZW5kaWYiLApsaWdodHNfcGhvbmdfZnJhZ21lbnQ6IkJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciBceDNkIGRpZmZ1c2VDb2xvci5yZ2I7XG5tYXRlcmlhbC5zcGVjdWxhckNvbG9yIFx4M2Qgc3BlY3VsYXI7XG5tYXRlcmlhbC5zcGVjdWxhclNoaW5pbmVzcyBceDNkIHNoaW5pbmVzcztcbm1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGggXHgzZCBzcGVjdWxhclN0cmVuZ3RoOyIsbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQ6InZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuc3RydWN0IEJsaW5uUGhvbmdNYXRlcmlhbCB7XG5cdHZlYzNcdGRpZmZ1c2VDb2xvcjtcblx0dmVjM1x0c3BlY3VsYXJDb2xvcjtcblx0ZmxvYXRcdHNwZWN1bGFyU2hpbmluZXNzO1xuXHRmbG9hdFx0c3BlY3VsYXJTdHJlbmd0aDtcbn07XG52b2lkIFJFX0RpcmVjdF9CbGlublBob25nKCBjb25zdCBpbiBJbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHQjaWZkZWYgVE9PTlxuXHRcdHZlYzMgaXJyYWRpYW5jZSBceDNkIGdldEdyYWRpZW50SXJyYWRpYW5jZSggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGRvdE5MIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xuXHRcdHZlYzMgaXJyYWRpYW5jZSBceDNkIGRvdE5MICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNlbmRpZlxuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICpceDNkIFBJO1xuXHQjZW5kaWZcblx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArXHgzZCBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArXHgzZCBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9CbGlublBob25nKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLnNwZWN1bGFyQ29sb3IsIG1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzICkgKiBtYXRlcmlhbC5zcGVjdWxhclN0cmVuZ3RoO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZyggY29uc3QgaW4gdmVjMyBpcnJhZGlhbmNlLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiBCbGlublBob25nTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgaXJyYWRpYW5jZSAqIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfQmxpbm5QaG9uZ1xuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX0JsaW5uUGhvbmdcbiNkZWZpbmUgTWF0ZXJpYWxfTGlnaHRQcm9iZUxPRCggbWF0ZXJpYWwgKVx0KDApIiwKbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50OiJQaHlzaWNhbE1hdGVyaWFsIG1hdGVyaWFsO1xubWF0ZXJpYWwuZGlmZnVzZUNvbG9yIFx4M2QgZGlmZnVzZUNvbG9yLnJnYiAqICggMS4wIC0gbWV0YWxuZXNzRmFjdG9yICk7XG5tYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyBceDNkIGNsYW1wKCByb3VnaG5lc3NGYWN0b3IsIDAuMDQsIDEuMCApO1xuI2lmZGVmIFJFRkxFQ1RJVklUWVxuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yIFx4M2QgbWl4KCB2ZWMzKCBNQVhJTVVNX1NQRUNVTEFSX0NPRUZGSUNJRU5UICogcG93MiggcmVmbGVjdGl2aXR5ICkgKSwgZGlmZnVzZUNvbG9yLnJnYiwgbWV0YWxuZXNzRmFjdG9yICk7XG4jZWxzZVxuXHRtYXRlcmlhbC5zcGVjdWxhckNvbG9yIFx4M2QgbWl4KCB2ZWMzKCBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuI2VuZGlmXG4jaWZkZWYgQ0xFQVJDT0FUXG5cdG1hdGVyaWFsLmNsZWFyY29hdCBceDNkIHNhdHVyYXRlKCBjbGVhcmNvYXQgKTtcdG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcyBceDNkIGNsYW1wKCBjbGVhcmNvYXRSb3VnaG5lc3MsIDAuMDQsIDEuMCApO1xuI2VuZGlmXG4jaWZkZWYgVVNFX1NIRUVOXG5cdG1hdGVyaWFsLnNoZWVuQ29sb3IgXHgzZCBzaGVlbjtcbiNlbmRpZiIsCmxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50OiJzdHJ1Y3QgUGh5c2ljYWxNYXRlcmlhbCB7XG5cdHZlYzNcdGRpZmZ1c2VDb2xvcjtcblx0ZmxvYXRcdHNwZWN1bGFyUm91Z2huZXNzO1xuXHR2ZWMzXHRzcGVjdWxhckNvbG9yO1xuI2lmZGVmIENMRUFSQ09BVFxuXHRmbG9hdCBjbGVhcmNvYXQ7XG5cdGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcztcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHR2ZWMzIHNoZWVuQ29sb3I7XG4jZW5kaWZcbn07XG4jZGVmaW5lIE1BWElNVU1fU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgMC4xNlxuI2RlZmluZSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMDRcbmZsb2F0IGNsZWFyY29hdERIUkFwcHJveCggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROTCApIHtcblx0cmV0dXJuIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKyAoIDEuMCAtIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSAqICggcG93KCAxLjAgLSBkb3ROTCwgNS4wICkgKiBwb3coIDEuMCAtIHJvdWdobmVzcywgMi4wICkgKTtcbn1cbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyBceDNlIDBcblx0dm9pZCBSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwoIGNvbnN0IGluIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdFx0dmVjMyBub3JtYWwgXHgzZCBnZW9tZXRyeS5ub3JtYWw7XG5cdFx0dmVjMyB2aWV3RGlyIFx4M2QgZ2VvbWV0cnkudmlld0Rpcjtcblx0XHR2ZWMzIHBvc2l0aW9uIFx4M2QgZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0dmVjMyBsaWdodFBvcyBceDNkIHJlY3RBcmVhTGlnaHQucG9zaXRpb247XG5cdFx0dmVjMyBoYWxmV2lkdGggXHgzZCByZWN0QXJlYUxpZ2h0LmhhbGZXaWR0aDtcblx0XHR2ZWMzIGhhbGZIZWlnaHQgXHgzZCByZWN0QXJlYUxpZ2h0LmhhbGZIZWlnaHQ7XG5cdFx0dmVjMyBsaWdodENvbG9yIFx4M2QgcmVjdEFyZWFMaWdodC5jb2xvcjtcblx0XHRmbG9hdCByb3VnaG5lc3MgXHgzZCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcztcblx0XHR2ZWMzIHJlY3RDb29yZHNbIDQgXTtcblx0XHRyZWN0Q29vcmRzWyAwIF0gXHgzZCBsaWdodFBvcyArIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XHRcdHJlY3RDb29yZHNbIDEgXSBceDNkIGxpZ2h0UG9zIC0gaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcblx0XHRyZWN0Q29vcmRzWyAyIF0gXHgzZCBsaWdodFBvcyAtIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XG5cdFx0cmVjdENvb3Jkc1sgMyBdIFx4M2QgbGlnaHRQb3MgKyBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xuXHRcdHZlYzIgdXYgXHgzZCBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XG5cdFx0dmVjNCB0MSBceDNkIHRleHR1cmUyRCggbHRjXzEsIHV2ICk7XG5cdFx0dmVjNCB0MiBceDNkIHRleHR1cmUyRCggbHRjXzIsIHV2ICk7XG5cdFx0bWF0MyBtSW52IFx4M2QgbWF0Myhcblx0XHRcdHZlYzMoIHQxLngsIDAsIHQxLnkgKSxcblx0XHRcdHZlYzMoICAgIDAsIDEsICAgIDAgKSxcblx0XHRcdHZlYzMoIHQxLnosIDAsIHQxLncgKVxuXHRcdCk7XG5cdFx0dmVjMyBmcmVzbmVsIFx4M2QgKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogdDIueCArICggdmVjMyggMS4wICkgLSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICkgKiB0Mi55ICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgbGlnaHRDb2xvciAqIGZyZXNuZWwgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICtceDNkIGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEuMCApLCByZWN0Q29vcmRzICk7XG5cdH1cbiNlbmRpZlxudm9pZCBSRV9EaXJlY3RfUGh5c2ljYWwoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRmbG9hdCBkb3ROTCBceDNkIHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2QgZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0I2VuZGlmXG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRmbG9hdCBjY0RvdE5MIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xuXHRcdHZlYzMgY2NJcnJhZGlhbmNlIFx4M2QgY2NEb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0Y2NJcnJhZGlhbmNlICpceDNkIFBJO1xuXHRcdCNlbmRpZlxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiBceDNkIG1hdGVyaWFsLmNsZWFyY29hdCAqIGNsZWFyY29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCBjY0RvdE5MICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgK1x4M2QgY2NJcnJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgY2xlYXJjb2F0REhSIFx4M2QgMC4wO1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9TSEVFTlxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICtceDNkICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9TaGVlbihcblx0XHRcdG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLFxuXHRcdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uLFxuXHRcdFx0Z2VvbWV0cnksXG5cdFx0XHRtYXRlcmlhbC5zaGVlbkNvbG9yXG5cdFx0KTtcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArXHgzZCAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyk7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICtceDNkICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIHJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgY2xlYXJjb2F0UmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0KSB7XG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRmbG9hdCBjY0RvdE5WIFx4M2Qgc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICtceDNkIGNsZWFyY29hdFJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcblx0XHRmbG9hdCBjY0RvdE5MIFx4M2QgY2NEb3ROVjtcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgXHgzZCBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiBceDNkIDAuMDtcblx0I2VuZGlmXG5cdGZsb2F0IGNsZWFyY29hdEludiBceDNkIDEuMCAtIGNsZWFyY29hdERIUjtcblx0dmVjMyBzaW5nbGVTY2F0dGVyaW5nIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzMgbXVsdGlTY2F0dGVyaW5nIFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzMgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlIFx4M2QgaXJyYWRpYW5jZSAqIFJFQ0lQUk9DQUxfUEk7XG5cdEJSREZfU3BlY3VsYXJfTXVsdGlzY2F0dGVyaW5nX0Vudmlyb25tZW50KCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsIHNpbmdsZVNjYXR0ZXJpbmcsIG11bHRpU2NhdHRlcmluZyApO1xuXHR2ZWMzIGRpZmZ1c2UgXHgzZCBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiAoIDEuMCAtICggc2luZ2xlU2NhdHRlcmluZyArIG11bHRpU2NhdHRlcmluZyApICk7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgK1x4M2QgY2xlYXJjb2F0SW52ICogcmFkaWFuY2UgKiBzaW5nbGVTY2F0dGVyaW5nO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgbXVsdGlTY2F0dGVyaW5nICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgZGlmZnVzZSAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfUGh5c2ljYWxcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXHRcdFJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsXG4jZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXJcdFx0UkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbFxuZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRyZXR1cm4gc2F0dXJhdGUoIHBvdyggZG90TlYgKyBhbWJpZW50T2NjbHVzaW9uLCBleHAyKCAtIDE2LjAgKiByb3VnaG5lc3MgLSAxLjAgKSApIC0gMS4wICsgYW1iaWVudE9jY2x1c2lvbiApO1xufSIsCmxpZ2h0c19mcmFnbWVudF9iZWdpbjoiXG5HZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5O1xuZ2VvbWV0cnkucG9zaXRpb24gXHgzZCAtIHZWaWV3UG9zaXRpb247XG5nZW9tZXRyeS5ub3JtYWwgXHgzZCBub3JtYWw7XG5nZW9tZXRyeS52aWV3RGlyIFx4M2Qgbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XG4jaWZkZWYgQ0xFQVJDT0FUXG5cdGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCBceDNkIGNsZWFyY29hdE5vcm1hbDtcbiNlbmRpZlxuSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodDtcbiNpZiAoIE5VTV9QT0lOVF9MSUdIVFMgXHgzZSAwICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0cG9pbnRMaWdodCBceDNkIHBvaW50TGlnaHRzWyBpIF07XG5cdFx0Z2V0UG9pbnREaXJlY3RMaWdodElycmFkaWFuY2UoIHBvaW50TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgXHgyNlx4MjYgKCBVTlJPTExFRF9MT09QX0lOREVYIFx4M2MgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgKVxuXHRcdGRpcmVjdExpZ2h0LmNvbG9yICpceDNkIGFsbCggYnZlYzIoIHBvaW50TGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFBvaW50U2hhZG93KCBwb2ludFNoYWRvd01hcFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd01hcFNpemUsIHBvaW50TGlnaHQuc2hhZG93QmlhcywgcG9pbnRMaWdodC5zaGFkb3dSYWRpdXMsIHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhTmVhciwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFGYXIgKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmICggTlVNX1NQT1RfTElHSFRTIFx4M2UgMCApIFx4MjZceDI2IGRlZmluZWQoIFJFX0RpcmVjdCApXG5cdFNwb3RMaWdodCBzcG90TGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1NQT1RfTElHSFRTOyBpICsrICkge1xuXHRcdHNwb3RMaWdodCBceDNkIHNwb3RMaWdodHNbIGkgXTtcblx0XHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgXHgyNlx4MjYgKCBVTlJPTExFRF9MT09QX0lOREVYIFx4M2MgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyApXG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKlx4M2QgYWxsKCBidmVjMiggc3BvdExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmICggTlVNX0RJUl9MSUdIVFMgXHgzZSAwICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGRpcmVjdGlvbmFsTGlnaHQgXHgzZCBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdO1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0LCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHQjaWYgZGVmaW5lZCggVVNFX1NIQURPV01BUCApIFx4MjZceDI2ICggVU5ST0xMRURfTE9PUF9JTkRFWCBceDNjIE5VTV9ESVJfTElHSFRfU0hBRE9XUyApXG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKlx4M2QgYWxsKCBidmVjMiggZGlyZWN0aW9uYWxMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0U2hhZG93KCBkaXJlY3Rpb25hbFNoYWRvd01hcFsgaSBdLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd01hcFNpemUsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93QmlhcywgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dSYWRpdXMsIHZEaXJlY3Rpb25hbFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0XHQjZW5kaWZcblx0XHRSRV9EaXJlY3QoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmICggTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXHgzZSAwICkgXHgyNlx4MjYgZGVmaW5lZCggUkVfRGlyZWN0X1JlY3RBcmVhIClcblx0UmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9SRUNUX0FSRUFfTElHSFRTOyBpICsrICkge1xuXHRcdHJlY3RBcmVhTGlnaHQgXHgzZCByZWN0QXJlYUxpZ2h0c1sgaSBdO1xuXHRcdFJFX0RpcmVjdF9SZWN0QXJlYSggcmVjdEFyZWFMaWdodCwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuXHR9XG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHR2ZWMzIGlibElycmFkaWFuY2UgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjMyBpcnJhZGlhbmNlIFx4M2QgZ2V0QW1iaWVudExpZ2h0SXJyYWRpYW5jZSggYW1iaWVudExpZ2h0Q29sb3IgKTtcblx0aXJyYWRpYW5jZSArXHgzZCBnZXRMaWdodFByb2JlSXJyYWRpYW5jZSggbGlnaHRQcm9iZSwgZ2VvbWV0cnkgKTtcblx0I2lmICggTlVNX0hFTUlfTElHSFRTIFx4M2UgMCApXG5cdFx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRcdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9IRU1JX0xJR0hUUzsgaSArKyApIHtcblx0XHRcdGlycmFkaWFuY2UgK1x4M2QgZ2V0SGVtaXNwaGVyZUxpZ2h0SXJyYWRpYW5jZSggaGVtaXNwaGVyZUxpZ2h0c1sgaSBdLCBnZW9tZXRyeSApO1xuXHRcdH1cblx0I2VuZGlmXG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcblx0dmVjMyByYWRpYW5jZSBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWMzIGNsZWFyY29hdFJhZGlhbmNlIFx4M2QgdmVjMyggMC4wICk7XG4jZW5kaWYiLApsaWdodHNfZnJhZ21lbnRfbWFwczoiI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdCNpZmRlZiBVU0VfTElHSFRNQVBcblx0XHR2ZWMzIGxpZ2h0TWFwSXJyYWRpYW5jZSBceDNkIHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcblx0XHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRcdGxpZ2h0TWFwSXJyYWRpYW5jZSAqXHgzZCBQSTtcblx0XHQjZW5kaWZcblx0XHRpcnJhZGlhbmNlICtceDNkIGxpZ2h0TWFwSXJyYWRpYW5jZTtcblx0I2VuZGlmXG5cdCNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgXHgyNlx4MjYgZGVmaW5lZCggU1RBTkRBUkQgKSBceDI2XHgyNiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRpYmxJcnJhZGlhbmNlICtceDNkIGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGdlb21ldHJ5LCBtYXhNaXBMZXZlbCApO1xuXHQjZW5kaWZcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSBceDI2XHgyNiBkZWZpbmVkKCBSRV9JbmRpcmVjdFNwZWN1bGFyIClcblx0cmFkaWFuY2UgK1x4M2QgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5Lm5vcm1hbCwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsIG1heE1pcExldmVsICk7XG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRjbGVhcmNvYXRSYWRpYW5jZSArXHgzZCBnZXRMaWdodFByb2JlSW5kaXJlY3RSYWRpYW5jZSggZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MsIG1heE1pcExldmVsICk7XG5cdCNlbmRpZlxuI2VuZGlmIiwKbGlnaHRzX2ZyYWdtZW50X2VuZDoiI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdFJFX0luZGlyZWN0RGlmZnVzZSggaXJyYWRpYW5jZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdFJFX0luZGlyZWN0U3BlY3VsYXIoIHJhZGlhbmNlLCBpYmxJcnJhZGlhbmNlLCBjbGVhcmNvYXRSYWRpYW5jZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuI2VuZGlmIixsb2dkZXB0aGJ1Zl9mcmFnbWVudDoiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApIFx4MjZceDI2IGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxuXHRnbF9GcmFnRGVwdGhFWFQgXHgzZCBsb2cyKCB2RnJhZ0RlcHRoICkgKiBsb2dEZXB0aEJ1ZkZDICogMC41O1xuI2VuZGlmIixsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50OiIjaWYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGICkgXHgyNlx4MjYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGX0VYVCApXG5cdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xuI2VuZGlmIiwKbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcblx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcblx0XHR2YXJ5aW5nIGZsb2F0IHZGcmFnRGVwdGg7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBmbG9hdCBsb2dEZXB0aEJ1ZkZDO1xuXHQjZW5kaWZcbiNlbmRpZiIsbG9nZGVwdGhidWZfdmVydGV4OiIjaWZkZWYgVVNFX0xPR0RFUFRIQlVGXG5cdCNpZmRlZiBVU0VfTE9HREVQVEhCVUZfRVhUXG5cdFx0dkZyYWdEZXB0aCBceDNkIDEuMCArIGdsX1Bvc2l0aW9uLnc7XG5cdCNlbHNlXG5cdFx0Z2xfUG9zaXRpb24ueiBceDNkIGxvZzIoIG1heCggRVBTSUxPTiwgZ2xfUG9zaXRpb24udyArIDEuMCApICkgKiBsb2dEZXB0aEJ1ZkZDIC0gMS4wO1xuXHRcdGdsX1Bvc2l0aW9uLnogKlx4M2QgZ2xfUG9zaXRpb24udztcblx0I2VuZGlmXG4jZW5kaWYiLG1hcF9mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dmVjNCB0ZXhlbENvbG9yIFx4M2QgdGV4dHVyZTJEKCBtYXAsIHZVdiApO1xuXHR0ZXhlbENvbG9yIFx4M2QgbWFwVGV4ZWxUb0xpbmVhciggdGV4ZWxDb2xvciApO1xuXHRkaWZmdXNlQ29sb3IgKlx4M2QgdGV4ZWxDb2xvcjtcbiNlbmRpZiIsCm1hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWYiLG1hcF9wYXJ0aWNsZV9mcmFnbWVudDoiI2lmZGVmIFVTRV9NQVBcblx0dmVjMiB1diBceDNkICggdXZUcmFuc2Zvcm0gKiB2ZWMzKCBnbF9Qb2ludENvb3JkLngsIDEuMCAtIGdsX1BvaW50Q29vcmQueSwgMSApICkueHk7XG5cdHZlYzQgbWFwVGV4ZWwgXHgzZCB0ZXh0dXJlMkQoIG1hcCwgdXYgKTtcblx0ZGlmZnVzZUNvbG9yICpceDNkIG1hcFRleGVsVG9MaW5lYXIoIG1hcFRleGVsICk7XG4jZW5kaWYiLG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX01BUFxuXHR1bmlmb3JtIG1hdDMgdXZUcmFuc2Zvcm07XG5cdHVuaWZvcm0gc2FtcGxlcjJEIG1hcDtcbiNlbmRpZiIsbWV0YWxuZXNzbWFwX2ZyYWdtZW50OiJmbG9hdCBtZXRhbG5lc3NGYWN0b3IgXHgzZCBtZXRhbG5lc3M7XG4jaWZkZWYgVVNFX01FVEFMTkVTU01BUFxuXHR2ZWM0IHRleGVsTWV0YWxuZXNzIFx4M2QgdGV4dHVyZTJEKCBtZXRhbG5lc3NNYXAsIHZVdiApO1xuXHRtZXRhbG5lc3NGYWN0b3IgKlx4M2QgdGV4ZWxNZXRhbG5lc3MuYjtcbiNlbmRpZiIsCm1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50OiIjaWZkZWYgVVNFX01FVEFMTkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtZXRhbG5lc3NNYXA7XG4jZW5kaWYiLG1vcnBobm9ybWFsX3ZlcnRleDoiI2lmZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0b2JqZWN0Tm9ybWFsICtceDNkICggbW9ycGhOb3JtYWwwIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcblx0b2JqZWN0Tm9ybWFsICtceDNkICggbW9ycGhOb3JtYWwxIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0b2JqZWN0Tm9ybWFsICtceDNkICggbW9ycGhOb3JtYWwyIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcblx0b2JqZWN0Tm9ybWFsICtceDNkICggbW9ycGhOb3JtYWwzIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcbiNlbmRpZiIsbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xuXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgOCBdO1xuXHQjZWxzZVxuXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xuXHQjZW5kaWZcbiNlbmRpZiIsCm1vcnBodGFyZ2V0X3ZlcnRleDoiI2lmZGVmIFVTRV9NT1JQSFRBUkdFVFNcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDAgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAwIF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQxIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMSBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0MiAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDMgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAzIF07XG5cdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0NCAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDQgXTtcblx0dHJhbnNmb3JtZWQgK1x4M2QgKCBtb3JwaFRhcmdldDUgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA1IF07XG5cdHRyYW5zZm9ybWVkICtceDNkICggbW9ycGhUYXJnZXQ2IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNiBdO1xuXHR0cmFuc2Zvcm1lZCArXHgzZCAoIG1vcnBoVGFyZ2V0NyAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDcgXTtcblx0I2VuZGlmXG4jZW5kaWYiLApub3JtYWxfZnJhZ21lbnRfYmVnaW46IiNpZmRlZiBGTEFUX1NIQURFRFxuXHR2ZWMzIGZkeCBceDNkIHZlYzMoIGRGZHgoIHZWaWV3UG9zaXRpb24ueCApLCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnkgKSwgZEZkeCggdlZpZXdQb3NpdGlvbi56ICkgKTtcblx0dmVjMyBmZHkgXHgzZCB2ZWMzKCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeSggdlZpZXdQb3NpdGlvbi55ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueiApICk7XG5cdHZlYzMgbm9ybWFsIFx4M2Qgbm9ybWFsaXplKCBjcm9zcyggZmR4LCBmZHkgKSApO1xuI2Vsc2Vcblx0dmVjMyBub3JtYWwgXHgzZCBub3JtYWxpemUoIHZOb3JtYWwgKTtcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdG5vcm1hbCBceDNkIG5vcm1hbCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0I2VuZGlmXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZlYzMgdGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggdlRhbmdlbnQgKTtcblx0XHR2ZWMzIGJpdGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggdkJpdGFuZ2VudCApO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHRhbmdlbnQgXHgzZCB0YW5nZW50ICogKCBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAtIDEuMCApO1xuXHRcdFx0Yml0YW5nZW50IFx4M2QgYml0YW5nZW50ICogKCBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAtIDEuMCApO1xuXHRcdCNlbmRpZlxuXHQjZW5kaWZcbiNlbmRpZlxudmVjMyBnZW9tZXRyeU5vcm1hbCBceDNkIG5vcm1hbDsiLApub3JtYWxfZnJhZ21lbnRfbWFwczoiI2lmZGVmIE9CSkVDVFNQQUNFX05PUk1BTE1BUFxuXHRub3JtYWwgXHgzZCB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHQjaWZkZWYgRkxJUF9TSURFRFxuXHRcdG5vcm1hbCBceDNkIC0gbm9ybWFsO1xuXHQjZW5kaWZcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdG5vcm1hbCBceDNkIG5vcm1hbCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0I2VuZGlmXG5cdG5vcm1hbCBceDNkIG5vcm1hbGl6ZSggbm9ybWFsTWF0cml4ICogbm9ybWFsICk7XG4jZWxpZiBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0bWF0MyB2VEJOIFx4M2QgbWF0MyggdGFuZ2VudCwgYml0YW5nZW50LCBub3JtYWwgKTtcblx0XHR2ZWMzIG1hcE4gXHgzZCB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHRcdG1hcE4ueHkgXHgzZCBub3JtYWxTY2FsZSAqIG1hcE4ueHk7XG5cdFx0bm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2VEJOICogbWFwTiApO1xuXHQjZWxzZVxuXHRcdG5vcm1hbCBceDNkIHBlcnR1cmJOb3JtYWwyQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBub3JtYWxTY2FsZSwgbm9ybWFsTWFwICk7XG5cdCNlbmRpZlxuI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKVxuXHRub3JtYWwgXHgzZCBwZXJ0dXJiTm9ybWFsQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBkSGR4eV9md2QoKSApO1xuI2VuZGlmIiwKbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfTk9STUFMTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIG5vcm1hbE1hcDtcblx0dW5pZm9ybSB2ZWMyIG5vcm1hbFNjYWxlO1xuI2VuZGlmXG4jaWZkZWYgT0JKRUNUU1BBQ0VfTk9STUFMTUFQXG5cdHVuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7XG4jZW5kaWZcbiNpZiAhIGRlZmluZWQgKCBVU0VfVEFOR0VOVCApIFx4MjZceDI2ICggZGVmaW5lZCAoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkICggVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVAgKSApXG5cdHZlYzMgcGVydHVyYk5vcm1hbDJBcmIoIHZlYzMgZXllX3BvcywgdmVjMyBzdXJmX25vcm0sIHZlYzIgbm9ybWFsU2NhbGUsIGluIHNhbXBsZXIyRCBub3JtYWxNYXAgKSB7XG5cdFx0dmVjMyBxMCBceDNkIHZlYzMoIGRGZHgoIGV5ZV9wb3MueCApLCBkRmR4KCBleWVfcG9zLnkgKSwgZEZkeCggZXllX3Bvcy56ICkgKTtcblx0XHR2ZWMzIHExIFx4M2QgdmVjMyggZEZkeSggZXllX3Bvcy54ICksIGRGZHkoIGV5ZV9wb3MueSApLCBkRmR5KCBleWVfcG9zLnogKSApO1xuXHRcdHZlYzIgc3QwIFx4M2QgZEZkeCggdlV2LnN0ICk7XG5cdFx0dmVjMiBzdDEgXHgzZCBkRmR5KCB2VXYuc3QgKTtcblx0XHRmbG9hdCBzY2FsZSBceDNkIHNpZ24oIHN0MS50ICogc3QwLnMgLSBzdDAudCAqIHN0MS5zICk7XG5cdFx0dmVjMyBTIFx4M2Qgbm9ybWFsaXplKCAoIHEwICogc3QxLnQgLSBxMSAqIHN0MC50ICkgKiBzY2FsZSApO1xuXHRcdHZlYzMgVCBceDNkIG5vcm1hbGl6ZSggKCAtIHEwICogc3QxLnMgKyBxMSAqIHN0MC5zICkgKiBzY2FsZSApO1xuXHRcdHZlYzMgTiBceDNkIG5vcm1hbGl6ZSggc3VyZl9ub3JtICk7XG5cdFx0dmVjMyBtYXBOIFx4M2QgdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0XHRtYXBOLnh5ICpceDNkIG5vcm1hbFNjYWxlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZlYzMgTmZyb21TVCBceDNkIGNyb3NzKCBTLCBUICk7XG5cdFx0XHRpZiggZG90KCBOZnJvbVNULCBOICkgXHgzZSAwLjAgKSB7XG5cdFx0XHRcdFMgKlx4M2QgLTEuMDtcblx0XHRcdFx0VCAqXHgzZCAtMS4wO1xuXHRcdFx0fVxuXHRcdCNlbHNlXG5cdFx0XHRtYXBOLnh5ICpceDNkICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHQjZW5kaWZcblx0XHRtYXQzIHRzbiBceDNkIG1hdDMoIFMsIFQsIE4gKTtcblx0XHRyZXR1cm4gbm9ybWFsaXplKCB0c24gKiBtYXBOICk7XG5cdH1cbiNlbmRpZiIsCmNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfYmVnaW46IiNpZmRlZiBDTEVBUkNPQVRcblx0dmVjMyBjbGVhcmNvYXROb3JtYWwgXHgzZCBnZW9tZXRyeU5vcm1hbDtcbiNlbmRpZiIsY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzOiIjaWZkZWYgVVNFX0NMRUFSQ09BVF9OT1JNQUxNQVBcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0bWF0MyB2VEJOIFx4M2QgbWF0MyggdGFuZ2VudCwgYml0YW5nZW50LCBjbGVhcmNvYXROb3JtYWwgKTtcblx0XHR2ZWMzIG1hcE4gXHgzZCB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHRcdG1hcE4ueHkgXHgzZCBjbGVhcmNvYXROb3JtYWxTY2FsZSAqIG1hcE4ueHk7XG5cdFx0Y2xlYXJjb2F0Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB2VEJOICogbWFwTiApO1xuXHQjZWxzZVxuXHRcdGNsZWFyY29hdE5vcm1hbCBceDNkIHBlcnR1cmJOb3JtYWwyQXJiKCAtIHZWaWV3UG9zaXRpb24sIGNsZWFyY29hdE5vcm1hbCwgY2xlYXJjb2F0Tm9ybWFsU2NhbGUsIGNsZWFyY29hdE5vcm1hbE1hcCApO1xuXHQjZW5kaWZcbiNlbmRpZiIsCmNsZWFyY29hdF9ub3JtYWxtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdE5vcm1hbE1hcDtcblx0dW5pZm9ybSB2ZWMyIGNsZWFyY29hdE5vcm1hbFNjYWxlO1xuI2VuZGlmIixwYWNraW5nOiJ2ZWMzIHBhY2tOb3JtYWxUb1JHQiggY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7XG5cdHJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41O1xufVxudmVjMyB1bnBhY2tSR0JUb05vcm1hbCggY29uc3QgaW4gdmVjMyByZ2IgKSB7XG5cdHJldHVybiAyLjAgKiByZ2IueHl6IC0gMS4wO1xufVxuY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgXHgzZCAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgXHgzZCAyNTUuIC8gMjU2LjtcbmNvbnN0IHZlYzMgUGFja0ZhY3RvcnMgXHgzZCB2ZWMzKCAyNTYuICogMjU2LiAqIDI1Ni4sIDI1Ni4gKiAyNTYuLCAgMjU2LiApO1xuY29uc3QgdmVjNCBVbnBhY2tGYWN0b3JzIFx4M2QgVW5wYWNrRG93bnNjYWxlIC8gdmVjNCggUGFja0ZhY3RvcnMsIDEuICk7XG5jb25zdCBmbG9hdCBTaGlmdFJpZ2h0OCBceDNkIDEuIC8gMjU2LjtcbnZlYzQgcGFja0RlcHRoVG9SR0JBKCBjb25zdCBpbiBmbG9hdCB2ICkge1xuXHR2ZWM0IHIgXHgzZCB2ZWM0KCBmcmFjdCggdiAqIFBhY2tGYWN0b3JzICksIHYgKTtcblx0ci55encgLVx4M2Qgci54eXogKiBTaGlmdFJpZ2h0ODtcdHJldHVybiByICogUGFja1Vwc2NhbGU7XG59XG5mbG9hdCB1bnBhY2tSR0JBVG9EZXB0aCggY29uc3QgaW4gdmVjNCB2ICkge1xuXHRyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzICk7XG59XG52ZWM0IGVuY29kZUhhbGZSR0JBICggdmVjMiB2ICkge1xuXHR2ZWM0IGVuY29kZWQgXHgzZCB2ZWM0KCAwLjAgKTtcblx0Y29uc3QgdmVjMiBvZmZzZXQgXHgzZCB2ZWMyKCAxLjAgLyAyNTUuMCwgMC4wICk7XG5cdGVuY29kZWQueHkgXHgzZCB2ZWMyKCB2LngsIGZyYWN0KCB2LnggKiAyNTUuMCApICk7XG5cdGVuY29kZWQueHkgXHgzZCBlbmNvZGVkLnh5IC0gKCBlbmNvZGVkLnl5ICogb2Zmc2V0ICk7XG5cdGVuY29kZWQuencgXHgzZCB2ZWMyKCB2LnksIGZyYWN0KCB2LnkgKiAyNTUuMCApICk7XG5cdGVuY29kZWQuencgXHgzZCBlbmNvZGVkLnp3IC0gKCBlbmNvZGVkLnd3ICogb2Zmc2V0ICk7XG5cdHJldHVybiBlbmNvZGVkO1xufVxudmVjMiBkZWNvZGVIYWxmUkdCQSggdmVjNCB2ICkge1xuXHRyZXR1cm4gdmVjMiggdi54ICsgKCB2LnkgLyAyNTUuMCApLCB2LnogKyAoIHYudyAvIDI1NS4wICkgKTtcbn1cbmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggdmlld1ogKyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTtcbn1cbmZsb2F0IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgbGluZWFyQ2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuIGxpbmVhckNsaXBaICogKCBuZWFyIC0gZmFyICkgLSBuZWFyO1xufVxuZmxvYXQgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoKCBuZWFyICsgdmlld1ogKSAqIGZhciApIC8gKCggZmFyIC0gbmVhciApICogdmlld1ogKTtcbn1cbmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBpbnZDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogaW52Q2xpcFogLSBmYXIgKTtcbn0iLApwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50OiIjaWZkZWYgUFJFTVVMVElQTElFRF9BTFBIQVxuXHRnbF9GcmFnQ29sb3IucmdiICpceDNkIGdsX0ZyYWdDb2xvci5hO1xuI2VuZGlmIixwcm9qZWN0X3ZlcnRleDoidmVjNCBtdlBvc2l0aW9uIFx4M2QgbW9kZWxWaWV3TWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuZ2xfUG9zaXRpb24gXHgzZCBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjsiLGRpdGhlcmluZ19mcmFnbWVudDoiI2lmZGVmIERJVEhFUklOR1xuXHRnbF9GcmFnQ29sb3IucmdiIFx4M2QgZGl0aGVyaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XG4jZW5kaWYiLGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50OiIjaWZkZWYgRElUSEVSSU5HXG5cdHZlYzMgZGl0aGVyaW5nKCB2ZWMzIGNvbG9yICkge1xuXHRcdGZsb2F0IGdyaWRfcG9zaXRpb24gXHgzZCByYW5kKCBnbF9GcmFnQ29vcmQueHkgKTtcblx0XHR2ZWMzIGRpdGhlcl9zaGlmdF9SR0IgXHgzZCB2ZWMzKCAwLjI1IC8gMjU1LjAsIC0wLjI1IC8gMjU1LjAsIDAuMjUgLyAyNTUuMCApO1xuXHRcdGRpdGhlcl9zaGlmdF9SR0IgXHgzZCBtaXgoIDIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIC0yLjAgKiBkaXRoZXJfc2hpZnRfUkdCLCBncmlkX3Bvc2l0aW9uICk7XG5cdFx0cmV0dXJuIGNvbG9yICsgZGl0aGVyX3NoaWZ0X1JHQjtcblx0fVxuI2VuZGlmIiwKcm91Z2huZXNzbWFwX2ZyYWdtZW50OiJmbG9hdCByb3VnaG5lc3NGYWN0b3IgXHgzZCByb3VnaG5lc3M7XG4jaWZkZWYgVVNFX1JPVUdITkVTU01BUFxuXHR2ZWM0IHRleGVsUm91Z2huZXNzIFx4M2QgdGV4dHVyZTJEKCByb3VnaG5lc3NNYXAsIHZVdiApO1xuXHRyb3VnaG5lc3NGYWN0b3IgKlx4M2QgdGV4ZWxSb3VnaG5lc3MuZztcbiNlbmRpZiIscm91Z2huZXNzbWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfUk9VR0hORVNTTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIHJvdWdobmVzc01hcDtcbiNlbmRpZiIsc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgZGlyZWN0aW9uYWxTaGFkb3dNYXBbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgTlVNX0RJUl9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBzcG90U2hhZG93TWFwWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZTcG90U2hhZG93Q29vcmRbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0XHR1bmlmb3JtIHNhbXBsZXIyRCBwb2ludFNoYWRvd01hcFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHRmbG9hdCB0ZXh0dXJlMkRDb21wYXJlKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xuXHRcdHJldHVybiBzdGVwKCBjb21wYXJlLCB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBkZXB0aHMsIHV2ICkgKSApO1xuXHR9XG5cdHZlYzIgdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2ICkge1xuXHRcdHJldHVybiBkZWNvZGVIYWxmUkdCQSggdGV4dHVyZTJEKCBzaGFkb3csIHV2ICkgKTtcblx0fVxuXHRmbG9hdCBWU01TaGFkb3cgKHNhbXBsZXIyRCBzaGFkb3csIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKXtcblx0XHRmbG9hdCBvY2NsdXNpb24gXHgzZCAxLjA7XG5cdFx0dmVjMiBkaXN0cmlidXRpb24gXHgzZCB0ZXh0dXJlMkREaXN0cmlidXRpb24oIHNoYWRvdywgdXYgKTtcblx0XHRmbG9hdCBoYXJkX3NoYWRvdyBceDNkIHN0ZXAoIGNvbXBhcmUgLCBkaXN0cmlidXRpb24ueCApO1xuXHRcdGlmIChoYXJkX3NoYWRvdyAhXHgzZCAxLjAgKSB7XG5cdFx0XHRmbG9hdCBkaXN0YW5jZSBceDNkIGNvbXBhcmUgLSBkaXN0cmlidXRpb24ueCA7XG5cdFx0XHRmbG9hdCB2YXJpYW5jZSBceDNkIG1heCggMC4wMDAwMCwgZGlzdHJpYnV0aW9uLnkgKiBkaXN0cmlidXRpb24ueSApO1xuXHRcdFx0ZmxvYXQgc29mdG5lc3NfcHJvYmFiaWxpdHkgXHgzZCB2YXJpYW5jZSAvICh2YXJpYW5jZSArIGRpc3RhbmNlICogZGlzdGFuY2UgKTtcdFx0XHRzb2Z0bmVzc19wcm9iYWJpbGl0eSBceDNkIGNsYW1wKCAoIHNvZnRuZXNzX3Byb2JhYmlsaXR5IC0gMC4zICkgLyAoIDAuOTUgLSAwLjMgKSwgMC4wLCAxLjAgKTtcdFx0XHRvY2NsdXNpb24gXHgzZCBjbGFtcCggbWF4KCBoYXJkX3NoYWRvdywgc29mdG5lc3NfcHJvYmFiaWxpdHkgKSwgMC4wLCAxLjAgKTtcblx0XHR9XG5cdFx0cmV0dXJuIG9jY2x1c2lvbjtcblx0fVxuXHRmbG9hdCB0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzYW1wbGVyMkQgZGVwdGhzLCB2ZWMyIHNpemUsIHZlYzIgdXYsIGZsb2F0IGNvbXBhcmUgKSB7XG5cdFx0Y29uc3QgdmVjMiBvZmZzZXQgXHgzZCB2ZWMyKCAwLjAsIDEuMCApO1xuXHRcdHZlYzIgdGV4ZWxTaXplIFx4M2QgdmVjMiggMS4wICkgLyBzaXplO1xuXHRcdHZlYzIgY2VudHJvaWRVViBceDNkICggZmxvb3IoIHV2ICogc2l6ZSAtIDAuNSApICsgMC41ICkgKiB0ZXhlbFNpemU7XG5cdFx0ZmxvYXQgbGIgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHgsIGNvbXBhcmUgKTtcblx0XHRmbG9hdCBsdCBceDNkIHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC54eSwgY29tcGFyZSApO1xuXHRcdGZsb2F0IHJiIFx4M2QgdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl4LCBjb21wYXJlICk7XG5cdFx0ZmxvYXQgcnQgXHgzZCB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueXksIGNvbXBhcmUgKTtcblx0XHR2ZWMyIGYgXHgzZCBmcmFjdCggdXYgKiBzaXplICsgMC41ICk7XG5cdFx0ZmxvYXQgYSBceDNkIG1peCggbGIsIGx0LCBmLnkgKTtcblx0XHRmbG9hdCBiIFx4M2QgbWl4KCByYiwgcnQsIGYueSApO1xuXHRcdGZsb2F0IGMgXHgzZCBtaXgoIGEsIGIsIGYueCApO1xuXHRcdHJldHVybiBjO1xuXHR9XG5cdGZsb2F0IGdldFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQgKSB7XG5cdFx0ZmxvYXQgc2hhZG93IFx4M2QgMS4wO1xuXHRcdHNoYWRvd0Nvb3JkLnh5eiAvXHgzZCBzaGFkb3dDb29yZC53O1xuXHRcdHNoYWRvd0Nvb3JkLnogK1x4M2Qgc2hhZG93Qmlhcztcblx0XHRidmVjNCBpbkZydXN0dW1WZWMgXHgzZCBidmVjNCAoIHNoYWRvd0Nvb3JkLnggXHgzZVx4M2QgMC4wLCBzaGFkb3dDb29yZC54IFx4M2NceDNkIDEuMCwgc2hhZG93Q29vcmQueSBceDNlXHgzZCAwLjAsIHNoYWRvd0Nvb3JkLnkgXHgzY1x4M2QgMS4wICk7XG5cdFx0Ym9vbCBpbkZydXN0dW0gXHgzZCBhbGwoIGluRnJ1c3R1bVZlYyApO1xuXHRcdGJ2ZWMyIGZydXN0dW1UZXN0VmVjIFx4M2QgYnZlYzIoIGluRnJ1c3R1bSwgc2hhZG93Q29vcmQueiBceDNjXHgzZCAxLjAgKTtcblx0XHRib29sIGZydXN0dW1UZXN0IFx4M2QgYWxsKCBmcnVzdHVtVGVzdFZlYyApO1xuXHRcdGlmICggZnJ1c3R1bVRlc3QgKSB7XG5cdFx0I2lmIGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1BDRiApXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IGR4MCBceDNkIC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTAgXHgzZCAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgxIFx4M2QgKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MSBceDNkICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeDIgXHgzZCBkeDAgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeTIgXHgzZCBkeTAgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeDMgXHgzZCBkeDEgLyAyLjA7XG5cdFx0XHRmbG9hdCBkeTMgXHgzZCBkeTEgLyAyLjA7XG5cdFx0XHRzaGFkb3cgXHgzZCAoXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDIsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MywgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MSApLCBzaGFkb3dDb29yZC56IClcblx0XHRcdCkgKiAoIDEuMCAvIDE3LjAgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApXG5cdFx0XHR2ZWMyIHRleGVsU2l6ZSBceDNkIHZlYzIoIDEuMCApIC8gc2hhZG93TWFwU2l6ZTtcblx0XHRcdGZsb2F0IGR4MCBceDNkIC0gdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTAgXHgzZCAtIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgxIFx4M2QgKyB0ZXhlbFNpemUueCAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR5MSBceDNkICsgdGV4ZWxTaXplLnkgKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRzaGFkb3cgXHgzZCAoXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXG5cdFx0XHQpICogKCAxLjAgLyA5LjAgKTtcblx0XHQjZWxpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxuXHRcdFx0c2hhZG93IFx4M2QgVlNNU2hhZG93KCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHNoYWRvdyBceDNkIHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKTtcblx0XHQjZW5kaWZcblx0XHR9XG5cdFx0cmV0dXJuIHNoYWRvdztcblx0fVxuXHR2ZWMyIGN1YmVUb1VWKCB2ZWMzIHYsIGZsb2F0IHRleGVsU2l6ZVkgKSB7XG5cdFx0dmVjMyBhYnNWIFx4M2QgYWJzKCB2ICk7XG5cdFx0ZmxvYXQgc2NhbGVUb0N1YmUgXHgzZCAxLjAgLyBtYXgoIGFic1YueCwgbWF4KCBhYnNWLnksIGFic1YueiApICk7XG5cdFx0YWJzViAqXHgzZCBzY2FsZVRvQ3ViZTtcblx0XHR2ICpceDNkIHNjYWxlVG9DdWJlICogKCAxLjAgLSAyLjAgKiB0ZXhlbFNpemVZICk7XG5cdFx0dmVjMiBwbGFuYXIgXHgzZCB2Lnh5O1xuXHRcdGZsb2F0IGFsbW9zdEFUZXhlbCBceDNkIDEuNSAqIHRleGVsU2l6ZVk7XG5cdFx0ZmxvYXQgYWxtb3N0T25lIFx4M2QgMS4wIC0gYWxtb3N0QVRleGVsO1xuXHRcdGlmICggYWJzVi56IFx4M2VceDNkIGFsbW9zdE9uZSApIHtcblx0XHRcdGlmICggdi56IFx4M2UgMC4wIClcblx0XHRcdFx0cGxhbmFyLnggXHgzZCA0LjAgLSB2Lng7XG5cdFx0fSBlbHNlIGlmICggYWJzVi54IFx4M2VceDNkIGFsbW9zdE9uZSApIHtcblx0XHRcdGZsb2F0IHNpZ25YIFx4M2Qgc2lnbiggdi54ICk7XG5cdFx0XHRwbGFuYXIueCBceDNkIHYueiAqIHNpZ25YICsgMi4wICogc2lnblg7XG5cdFx0fSBlbHNlIGlmICggYWJzVi55IFx4M2VceDNkIGFsbW9zdE9uZSApIHtcblx0XHRcdGZsb2F0IHNpZ25ZIFx4M2Qgc2lnbiggdi55ICk7XG5cdFx0XHRwbGFuYXIueCBceDNkIHYueCArIDIuMCAqIHNpZ25ZICsgMi4wO1xuXHRcdFx0cGxhbmFyLnkgXHgzZCB2LnogKiBzaWduWSAtIDIuMDtcblx0XHR9XG5cdFx0cmV0dXJuIHZlYzIoIDAuMTI1LCAwLjI1ICkgKiBwbGFuYXIgKyB2ZWMyKCAwLjM3NSwgMC43NSApO1xuXHR9XG5cdGZsb2F0IGdldFBvaW50U2hhZG93KCBzYW1wbGVyMkQgc2hhZG93TWFwLCB2ZWMyIHNoYWRvd01hcFNpemUsIGZsb2F0IHNoYWRvd0JpYXMsIGZsb2F0IHNoYWRvd1JhZGl1cywgdmVjNCBzaGFkb3dDb29yZCwgZmxvYXQgc2hhZG93Q2FtZXJhTmVhciwgZmxvYXQgc2hhZG93Q2FtZXJhRmFyICkge1xuXHRcdHZlYzIgdGV4ZWxTaXplIFx4M2QgdmVjMiggMS4wICkgLyAoIHNoYWRvd01hcFNpemUgKiB2ZWMyKCA0LjAsIDIuMCApICk7XG5cdFx0dmVjMyBsaWdodFRvUG9zaXRpb24gXHgzZCBzaGFkb3dDb29yZC54eXo7XG5cdFx0ZmxvYXQgZHAgXHgzZCAoIGxlbmd0aCggbGlnaHRUb1Bvc2l0aW9uICkgLSBzaGFkb3dDYW1lcmFOZWFyICkgLyAoIHNoYWRvd0NhbWVyYUZhciAtIHNoYWRvd0NhbWVyYU5lYXIgKTtcdFx0ZHAgK1x4M2Qgc2hhZG93Qmlhcztcblx0XHR2ZWMzIGJkM0QgXHgzZCBub3JtYWxpemUoIGxpZ2h0VG9Qb3NpdGlvbiApO1xuXHRcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0ZfU09GVCApIHx8IGRlZmluZWQoIFNIQURPV01BUF9UWVBFX1ZTTSApXG5cdFx0XHR2ZWMyIG9mZnNldCBceDNkIHZlYzIoIC0gMSwgMSApICogc2hhZG93UmFkaXVzICogdGV4ZWxTaXplLnk7XG5cdFx0XHRyZXR1cm4gKFxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXl5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eCwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnh4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueXh5LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eCwgdGV4ZWxTaXplLnkgKSwgZHAgKVxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XG5cdFx0I2Vsc2Vcblx0XHRcdHJldHVybiB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWYiLApzaGFkb3dtYXBfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBtYXQ0IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXHgzZSAwXG5cdFx0dW5pZm9ybSBtYXQ0IHNwb3RTaGFkb3dNYXRyaXhbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRcdHVuaWZvcm0gbWF0NCBwb2ludFNoYWRvd01hdHJpeFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuI2VuZGlmIiwKc2hhZG93bWFwX3ZlcnRleDoiI2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0dkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSBceDNkIGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBpIF0gKiB3b3JsZFBvc2l0aW9uO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHZTcG90U2hhZG93Q29vcmRbIGkgXSBceDNkIHNwb3RTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSBceDNkIDA7IGkgXHgzYyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHR2UG9pbnRTaGFkb3dDb29yZFsgaSBdIFx4M2QgcG9pbnRTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XG5cdH1cblx0I2VuZGlmXG4jZW5kaWYiLApzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ6ImZsb2F0IGdldFNoYWRvd01hc2soKSB7XG5cdGZsb2F0IHNoYWRvdyBceDNkIDEuMDtcblx0I2lmZGVmIFVTRV9TSEFET1dNQVBcblx0I2lmIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBceDNlIDBcblx0RGlyZWN0aW9uYWxMaWdodCBkaXJlY3Rpb25hbExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHRkaXJlY3Rpb25hbExpZ2h0IFx4M2QgZGlyZWN0aW9uYWxMaWdodHNbIGkgXTtcblx0XHRzaGFkb3cgKlx4M2QgYm9vbCggZGlyZWN0aW9uYWxMaWdodC5zaGFkb3cgKSA/IGdldFNoYWRvdyggZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGkgXSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dNYXBTaXplLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd0JpYXMsIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93UmFkaXVzLCB2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRTcG90TGlnaHQgc3BvdExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpIFx4M2QgMDsgaSBceDNjIE5VTV9TUE9UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0c3BvdExpZ2h0IFx4M2Qgc3BvdExpZ2h0c1sgaSBdO1xuXHRcdHNoYWRvdyAqXHgzZCBib29sKCBzcG90TGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIHNwb3RTaGFkb3dNYXBbIGkgXSwgc3BvdExpZ2h0LnNoYWRvd01hcFNpemUsIHNwb3RMaWdodC5zaGFkb3dCaWFzLCBzcG90TGlnaHQuc2hhZG93UmFkaXVzLCB2U3BvdFNoYWRvd0Nvb3JkWyBpIF0gKSA6IDEuMDtcblx0fVxuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIFx4M2UgMFxuXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgXHgzZCAwOyBpIFx4M2MgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0cG9pbnRMaWdodCBceDNkIHBvaW50TGlnaHRzWyBpIF07XG5cdFx0c2hhZG93ICpceDNkIGJvb2woIHBvaW50TGlnaHQuc2hhZG93ICkgPyBnZXRQb2ludFNoYWRvdyggcG9pbnRTaGFkb3dNYXBbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dNYXBTaXplLCBwb2ludExpZ2h0LnNoYWRvd0JpYXMsIHBvaW50TGlnaHQuc2hhZG93UmFkaXVzLCB2UG9pbnRTaGFkb3dDb29yZFsgaSBdLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYU5lYXIsIHBvaW50TGlnaHQuc2hhZG93Q2FtZXJhRmFyICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNlbmRpZlxuXHRyZXR1cm4gc2hhZG93O1xufSIsCnNraW5iYXNlX3ZlcnRleDoiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHRtYXQ0IGJvbmVNYXRYIFx4M2QgZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnggKTtcblx0bWF0NCBib25lTWF0WSBceDNkIGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC55ICk7XG5cdG1hdDQgYm9uZU1hdFogXHgzZCBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApO1xuXHRtYXQ0IGJvbmVNYXRXIFx4M2QgZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LncgKTtcbiNlbmRpZiIsc2tpbm5pbmdfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXg7XG5cdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4SW52ZXJzZTtcblx0I2lmZGVmIEJPTkVfVEVYVFVSRVxuXHRcdHVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIGJvbmVUZXh0dXJlO1xuXHRcdHVuaWZvcm0gaW50IGJvbmVUZXh0dXJlU2l6ZTtcblx0XHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XG5cdFx0XHRmbG9hdCBqIFx4M2QgaSAqIDQuMDtcblx0XHRcdGZsb2F0IHggXHgzZCBtb2QoIGosIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xuXHRcdFx0ZmxvYXQgeSBceDNkIGZsb29yKCBqIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XG5cdFx0XHRmbG9hdCBkeCBceDNkIDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtcblx0XHRcdGZsb2F0IGR5IFx4M2QgMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xuXHRcdFx0eSBceDNkIGR5ICogKCB5ICsgMC41ICk7XG5cdFx0XHR2ZWM0IHYxIFx4M2QgdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAwLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHYyIFx4M2QgdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAxLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHYzIFx4M2QgdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAyLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHY0IFx4M2QgdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAzLjUgKSwgeSApICk7XG5cdFx0XHRtYXQ0IGJvbmUgXHgzZCBtYXQ0KCB2MSwgdjIsIHYzLCB2NCApO1xuXHRcdFx0cmV0dXJuIGJvbmU7XG5cdFx0fVxuXHQjZWxzZVxuXHRcdHVuaWZvcm0gbWF0NCBib25lTWF0cmljZXNbIE1BWF9CT05FUyBdO1xuXHRcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcblx0XHRcdG1hdDQgYm9uZSBceDNkIGJvbmVNYXRyaWNlc1sgaW50KGkpIF07XG5cdFx0XHRyZXR1cm4gYm9uZTtcblx0XHR9XG5cdCNlbmRpZlxuI2VuZGlmIiwKc2tpbm5pbmdfdmVydGV4OiIjaWZkZWYgVVNFX1NLSU5OSU5HXG5cdHZlYzQgc2tpblZlcnRleCBceDNkIGJpbmRNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XG5cdHZlYzQgc2tpbm5lZCBceDNkIHZlYzQoIDAuMCApO1xuXHRza2lubmVkICtceDNkIGJvbmVNYXRYICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueDtcblx0c2tpbm5lZCArXHgzZCBib25lTWF0WSAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lnk7XG5cdHNraW5uZWQgK1x4M2QgYm9uZU1hdFogKiBza2luVmVydGV4ICogc2tpbldlaWdodC56O1xuXHRza2lubmVkICtceDNkIGJvbmVNYXRXICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQudztcblx0dHJhbnNmb3JtZWQgXHgzZCAoIGJpbmRNYXRyaXhJbnZlcnNlICogc2tpbm5lZCApLnh5ejtcbiNlbmRpZiIsc2tpbm5vcm1hbF92ZXJ0ZXg6IiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0bWF0NCBza2luTWF0cml4IFx4M2QgbWF0NCggMC4wICk7XG5cdHNraW5NYXRyaXggK1x4M2Qgc2tpbldlaWdodC54ICogYm9uZU1hdFg7XG5cdHNraW5NYXRyaXggK1x4M2Qgc2tpbldlaWdodC55ICogYm9uZU1hdFk7XG5cdHNraW5NYXRyaXggK1x4M2Qgc2tpbldlaWdodC56ICogYm9uZU1hdFo7XG5cdHNraW5NYXRyaXggK1x4M2Qgc2tpbldlaWdodC53ICogYm9uZU1hdFc7XG5cdHNraW5NYXRyaXggIFx4M2QgYmluZE1hdHJpeEludmVyc2UgKiBza2luTWF0cml4ICogYmluZE1hdHJpeDtcblx0b2JqZWN0Tm9ybWFsIFx4M2QgdmVjNCggc2tpbk1hdHJpeCAqIHZlYzQoIG9iamVjdE5vcm1hbCwgMC4wICkgKS54eXo7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG9iamVjdFRhbmdlbnQgXHgzZCB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0VGFuZ2VudCwgMC4wICkgKS54eXo7XG5cdCNlbmRpZlxuI2VuZGlmIiwKc3BlY3VsYXJtYXBfZnJhZ21lbnQ6ImZsb2F0IHNwZWN1bGFyU3RyZW5ndGg7XG4jaWZkZWYgVVNFX1NQRUNVTEFSTUFQXG5cdHZlYzQgdGV4ZWxTcGVjdWxhciBceDNkIHRleHR1cmUyRCggc3BlY3VsYXJNYXAsIHZVdiApO1xuXHRzcGVjdWxhclN0cmVuZ3RoIFx4M2QgdGV4ZWxTcGVjdWxhci5yO1xuI2Vsc2Vcblx0c3BlY3VsYXJTdHJlbmd0aCBceDNkIDEuMDtcbiNlbmRpZiIsc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudDoiI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBzcGVjdWxhck1hcDtcbiNlbmRpZiIsdG9uZW1hcHBpbmdfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBUT05FX01BUFBJTkcgKVxuXHRnbF9GcmFnQ29sb3IucmdiIFx4M2QgdG9uZU1hcHBpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcbiNlbmRpZiIsdG9uZW1hcHBpbmdfcGFyc19mcmFnbWVudDoiI2lmbmRlZiBzYXR1cmF0ZVxuXHQjZGVmaW5lIHNhdHVyYXRlKGEpIGNsYW1wKCBhLCAwLjAsIDEuMCApXG4jZW5kaWZcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdFeHBvc3VyZTtcbnVuaWZvcm0gZmxvYXQgdG9uZU1hcHBpbmdXaGl0ZVBvaW50O1xudmVjMyBMaW5lYXJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0cmV0dXJuIHRvbmVNYXBwaW5nRXhwb3N1cmUgKiBjb2xvcjtcbn1cbnZlYzMgUmVpbmhhcmRUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKlx4M2QgdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0cmV0dXJuIHNhdHVyYXRlKCBjb2xvciAvICggdmVjMyggMS4wICkgKyBjb2xvciApICk7XG59XG4jZGVmaW5lIFVuY2hhcnRlZDJIZWxwZXIoIHggKSBtYXgoICggKCB4ICogKCAwLjE1ICogeCArIDAuMTAgKiAwLjUwICkgKyAwLjIwICogMC4wMiApIC8gKCB4ICogKCAwLjE1ICogeCArIDAuNTAgKSArIDAuMjAgKiAwLjMwICkgKSAtIDAuMDIgLyAwLjMwLCB2ZWMzKCAwLjAgKSApXG52ZWMzIFVuY2hhcnRlZDJUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKlx4M2QgdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0cmV0dXJuIHNhdHVyYXRlKCBVbmNoYXJ0ZWQySGVscGVyKCBjb2xvciApIC8gVW5jaGFydGVkMkhlbHBlciggdmVjMyggdG9uZU1hcHBpbmdXaGl0ZVBvaW50ICkgKSApO1xufVxudmVjMyBPcHRpbWl6ZWRDaW5lb25Ub25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKlx4M2QgdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0Y29sb3IgXHgzZCBtYXgoIHZlYzMoIDAuMCApLCBjb2xvciAtIDAuMDA0ICk7XG5cdHJldHVybiBwb3coICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMC41ICkgKSAvICggY29sb3IgKiAoIDYuMiAqIGNvbG9yICsgMS43ICkgKyAwLjA2ICksIHZlYzMoIDIuMiApICk7XG59XG52ZWMzIEFDRVNGaWxtaWNUb25lTWFwcGluZyggdmVjMyBjb2xvciApIHtcblx0Y29sb3IgKlx4M2QgdG9uZU1hcHBpbmdFeHBvc3VyZTtcblx0cmV0dXJuIHNhdHVyYXRlKCAoIGNvbG9yICogKCAyLjUxICogY29sb3IgKyAwLjAzICkgKSAvICggY29sb3IgKiAoIDIuNDMgKiBjb2xvciArIDAuNTkgKSArIDAuMTQgKSApO1xufSIsCnV2X3BhcnNfZnJhZ21lbnQ6IiNpZmRlZiBVU0VfVVZcblx0dmFyeWluZyB2ZWMyIHZVdjtcbiNlbmRpZiIsdXZfcGFyc192ZXJ0ZXg6IiNpZmRlZiBVU0VfVVZcblx0dmFyeWluZyB2ZWMyIHZVdjtcblx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xuI2VuZGlmIix1dl92ZXJ0ZXg6IiNpZmRlZiBVU0VfVVZcblx0dlV2IFx4M2QgKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTtcbiNlbmRpZiIsdXYyX3BhcnNfZnJhZ21lbnQ6IiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2YXJ5aW5nIHZlYzIgdlV2MjtcbiNlbmRpZiIsdXYyX3BhcnNfdmVydGV4OiIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0YXR0cmlidXRlIHZlYzIgdXYyO1xuXHR2YXJ5aW5nIHZlYzIgdlV2MjtcbiNlbmRpZiIsdXYyX3ZlcnRleDoiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdHZVdjIgXHgzZCB1djI7XG4jZW5kaWYiLAp3b3JsZHBvc192ZXJ0ZXg6IiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgfHwgZGVmaW5lZCggRElTVEFOQ0UgKSB8fCBkZWZpbmVkICggVVNFX1NIQURPV01BUCApXG5cdHZlYzQgd29ybGRQb3NpdGlvbiBceDNkIG1vZGVsTWF0cml4ICogdmVjNCggdHJhbnNmb3JtZWQsIDEuMCApO1xuI2VuZGlmIixiYWNrZ3JvdW5kX2ZyYWc6InVuaWZvcm0gc2FtcGxlcjJEIHQyRDtcbnZhcnlpbmcgdmVjMiB2VXY7XG52b2lkIG1haW4oKSB7XG5cdHZlYzQgdGV4Q29sb3IgXHgzZCB0ZXh0dXJlMkQoIHQyRCwgdlV2ICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcbn0iLGJhY2tncm91bmRfdmVydDoidmFyeWluZyB2ZWMyIHZVdjtcbnVuaWZvcm0gbWF0MyB1dlRyYW5zZm9ybTtcbnZvaWQgbWFpbigpIHtcblx0dlV2IFx4M2QgKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTtcblx0Z2xfUG9zaXRpb24gXHgzZCB2ZWM0KCBwb3NpdGlvbi54eSwgMS4wLCAxLjAgKTtcbn0iLApjdWJlX2ZyYWc6InVuaWZvcm0gc2FtcGxlckN1YmUgdEN1YmU7XG51bmlmb3JtIGZsb2F0IHRGbGlwO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbnZvaWQgbWFpbigpIHtcblx0dmVjNCB0ZXhDb2xvciBceDNkIHRleHR1cmVDdWJlKCB0Q3ViZSwgdmVjMyggdEZsaXAgKiB2V29ybGREaXJlY3Rpb24ueCwgdldvcmxkRGlyZWN0aW9uLnl6ICkgKTtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgbWFwVGV4ZWxUb0xpbmVhciggdGV4Q29sb3IgKTtcblx0Z2xfRnJhZ0NvbG9yLmEgKlx4M2Qgb3BhY2l0eTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxufSIsY3ViZV92ZXJ0OiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uIFx4M2QgdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHRnbF9Qb3NpdGlvbi56IFx4M2QgZ2xfUG9zaXRpb24udztcbn0iLApkZXB0aF9mcmFnOiIjaWYgREVQVEhfUEFDS0lORyBceDNkXHgzZCAzMjAwXG5cdHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIDEuMCApO1xuXHQjaWYgREVQVEhfUEFDS0lORyBceDNkXHgzZCAzMjAwXG5cdFx0ZGlmZnVzZUNvbG9yLmEgXHgzZCBvcGFjaXR5O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpZiBERVBUSF9QQUNLSU5HIFx4M2RceDNkIDMyMDBcblx0XHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCB2ZWMzKCAxLjAgLSBnbF9GcmFnQ29vcmQueiApLCBvcGFjaXR5ICk7XG5cdCNlbGlmIERFUFRIX1BBQ0tJTkcgXHgzZFx4M2QgMzIwMVxuXHRcdGdsX0ZyYWdDb2xvciBceDNkIHBhY2tEZXB0aFRvUkdCQSggZ2xfRnJhZ0Nvb3JkLnogKTtcblx0I2VuZGlmXG59IiwKZGVwdGhfdmVydDoiI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0XHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcbn0iLApkaXN0YW5jZVJHQkFfZnJhZzoiI2RlZmluZSBESVNUQU5DRVxudW5pZm9ybSB2ZWMzIHJlZmVyZW5jZVBvc2l0aW9uO1xudW5pZm9ybSBmbG9hdCBuZWFyRGlzdGFuY2U7XG51bmlmb3JtIGZsb2F0IGZhckRpc3RhbmNlO1xudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbiAoKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggMS4wICk7XG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0ZmxvYXQgZGlzdCBceDNkIGxlbmd0aCggdldvcmxkUG9zaXRpb24gLSByZWZlcmVuY2VQb3NpdGlvbiApO1xuXHRkaXN0IFx4M2QgKCBkaXN0IC0gbmVhckRpc3RhbmNlICkgLyAoIGZhckRpc3RhbmNlIC0gbmVhckRpc3RhbmNlICk7XG5cdGRpc3QgXHgzZCBzYXR1cmF0ZSggZGlzdCApO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCBwYWNrRGVwdGhUb1JHQkEoIGRpc3QgKTtcbn0iLApkaXN0YW5jZVJHQkFfdmVydDoiI2RlZmluZSBESVNUQU5DRVxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2tpbm5pbmdfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdFx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0XHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0dldvcmxkUG9zaXRpb24gXHgzZCB3b3JsZFBvc2l0aW9uLnh5ejtcbn0iLAplcXVpcmVjdF9mcmFnOiJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7XG52YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbnZvaWQgbWFpbigpIHtcblx0dmVjMyBkaXJlY3Rpb24gXHgzZCBub3JtYWxpemUoIHZXb3JsZERpcmVjdGlvbiApO1xuXHR2ZWMyIHNhbXBsZVVWO1xuXHRzYW1wbGVVVi55IFx4M2QgYXNpbiggY2xhbXAoIGRpcmVjdGlvbi55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdHNhbXBsZVVWLnggXHgzZCBhdGFuKCBkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHR2ZWM0IHRleENvbG9yIFx4M2QgdGV4dHVyZTJEKCB0RXF1aXJlY3QsIHNhbXBsZVVWICk7XG5cdGdsX0ZyYWdDb2xvciBceDNkIG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcbn0iLAplcXVpcmVjdF92ZXJ0OiJ2YXJ5aW5nIHZlYzMgdldvcmxkRGlyZWN0aW9uO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbnZvaWQgbWFpbigpIHtcblx0dldvcmxkRGlyZWN0aW9uIFx4M2QgdHJhbnNmb3JtRGlyZWN0aW9uKCBwb3NpdGlvbiwgbW9kZWxNYXRyaXggKTtcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxufSIsbGluZWRhc2hlZF9mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnVuaWZvcm0gZmxvYXQgZGFzaFNpemU7XG51bmlmb3JtIGZsb2F0IHRvdGFsU2l6ZTtcbnZhcnlpbmcgZmxvYXQgdkxpbmVEaXN0YW5jZTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHRpZiAoIG1vZCggdkxpbmVEaXN0YW5jZSwgdG90YWxTaXplICkgXHgzZSBkYXNoU2l6ZSApIHtcblx0XHRkaXNjYXJkO1xuXHR9XG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfZnJhZ21lbnRceDNlXG5cdG91dGdvaW5nTGlnaHQgXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCmxpbmVkYXNoZWRfdmVydDoidW5pZm9ybSBmbG9hdCBzY2FsZTtcbmF0dHJpYnV0ZSBmbG9hdCBsaW5lRGlzdGFuY2U7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2Njb2xvcl92ZXJ0ZXhceDNlXG5cdHZMaW5lRGlzdGFuY2UgXHgzZCBzY2FsZSAqIGxpbmVEaXN0YW5jZTtcblx0dmVjNCBtdlBvc2l0aW9uIFx4M2QgbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaGJhc2ljX2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2Vudm1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2ZvZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9mcmFnbWVudFx4M2Vcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgXHgzZCBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0I2lmZGVmIFVTRV9MSUdIVE1BUFxuXHRcdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArXHgzZCB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG5cdCNlbHNlXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkIHZlYzMoIDEuMCApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2FvbWFwX2ZyYWdtZW50XHgzZVxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKlx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlO1xuXHQjaW5jbHVkZSBceDNjZW52bWFwX2ZyYWdtZW50XHgzZVxuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCm1lc2hiYXNpY192ZXJ0OiIjaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3V2Ml92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Njb2xvcl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2luYmFzZV92ZXJ0ZXhceDNlXG5cdCNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RlZmF1bHRub3JtYWxfdmVydGV4XHgzZVxuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjd29ybGRwb3NfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm1lc2hsYW1iZXJ0X2ZyYWc6InVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIHZMaWdodEZyb250O1xudmFyeWluZyB2ZWMzIHZJbmRpcmVjdEZyb250O1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcblx0dmFyeWluZyB2ZWMzIHZJbmRpcmVjdEJhY2s7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFza19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0IFx4M2QgUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlIFx4M2QgZW1pc3NpdmU7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGFtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NzcGVjdWxhcm1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX2ZyYWdtZW50XHgzZVxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgXHgzZCBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICtceDNkICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZJbmRpcmVjdEZyb250IDogdkluZGlyZWN0QmFjaztcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgK1x4M2QgdkluZGlyZWN0RnJvbnQ7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjbGlnaHRtYXBfZnJhZ21lbnRceDNlXG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqXHgzZCBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSBceDNkICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZMaWdodEZyb250IDogdkxpZ2h0QmFjaztcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlIFx4M2QgdkxpZ2h0RnJvbnQ7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICpceDNkIEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBnZXRTaGFkb3dNYXNrKCk7XG5cdCNpbmNsdWRlIFx4M2Nhb21hcF9mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF9mcmFnbWVudFx4M2Vcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RpdGhlcmluZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNobGFtYmVydF92ZXJ0OiIjZGVmaW5lIExBTUJFUlRcbnZhcnlpbmcgdmVjMyB2TGlnaHRGcm9udDtcbnZhcnlpbmcgdmVjMyB2SW5kaXJlY3RGcm9udDtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dmFyeWluZyB2ZWMzIHZMaWdodEJhY2s7XG5cdHZhcnlpbmcgdmVjMyB2SW5kaXJlY3RCYWNrO1xuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjYnNkZnNceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Vudm1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfbGFtYmVydF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLAptZXNobWF0Y2FwX2ZyYWc6IiNkZWZpbmUgTUFUQ0FQXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnVuaWZvcm0gc2FtcGxlcjJEIG1hdGNhcDtcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FscGhhbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHR2ZWMzIHZpZXdEaXIgXHgzZCBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcblx0dmVjMyB4IFx4M2Qgbm9ybWFsaXplKCB2ZWMzKCB2aWV3RGlyLnosIDAuMCwgLSB2aWV3RGlyLnggKSApO1xuXHR2ZWMzIHkgXHgzZCBjcm9zcyggdmlld0RpciwgeCApO1xuXHR2ZWMyIHV2IFx4M2QgdmVjMiggZG90KCB4LCBub3JtYWwgKSwgZG90KCB5LCBub3JtYWwgKSApICogMC40OTUgKyAwLjU7XG5cdCNpZmRlZiBVU0VfTUFUQ0FQXG5cdFx0dmVjNCBtYXRjYXBDb2xvciBceDNkIHRleHR1cmUyRCggbWF0Y2FwLCB1diApO1xuXHRcdG1hdGNhcENvbG9yIFx4M2QgbWF0Y2FwVGV4ZWxUb0xpbmVhciggbWF0Y2FwQ29sb3IgKTtcblx0I2Vsc2Vcblx0XHR2ZWM0IG1hdGNhcENvbG9yIFx4M2QgdmVjNCggMS4wICk7XG5cdCNlbmRpZlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCBkaWZmdXNlQ29sb3IucmdiICogbWF0Y2FwQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsCm1lc2htYXRjYXBfdmVydDoiI2RlZmluZSBNQVRDQVBcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY3V2X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBobm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5iYXNlX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGVmYXVsdG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpZm5kZWYgRkxBVF9TSEFERURcblx0XHR2Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxuXHR2Vmlld1Bvc2l0aW9uIFx4M2QgLSBtdlBvc2l0aW9uLnh5ejtcbn0iLAptZXNocGhvbmdfZnJhZzoiI2RlZmluZSBQSE9OR1xudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIHZlYzMgZW1pc3NpdmU7XG51bmlmb3JtIHZlYzMgc3BlY3VsYXI7XG51bmlmb3JtIGZsb2F0IHNoaW5pbmVzcztcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2NkaXRoZXJpbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Njb2xvcl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYWxwaGFtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nhb21hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xpZ2h0bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZ3JhZGllbnRtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nic2Rmc1x4M2VcbiNpbmNsdWRlIFx4M2NsaWdodHNfcGFyc19iZWdpblx4M2VcbiNpbmNsdWRlIFx4M2NsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NidW1wbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgXHgzZCBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgXHgzZCBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NwZWN1bGFybWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbm9ybWFsX2ZyYWdtZW50X2JlZ2luXHgzZVxuXHQjaW5jbHVkZSBceDNjbm9ybWFsX2ZyYWdtZW50X21hcHNceDNlXG5cdCNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19waG9uZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY2xpZ2h0c19mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X2VuZFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FvbWFwX2ZyYWdtZW50XHgzZVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCByZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICsgcmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICsgdG90YWxFbWlzc2l2ZVJhZGlhbmNlO1xuXHQjaW5jbHVkZSBceDNjZW52bWFwX2ZyYWdtZW50XHgzZVxuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZGl0aGVyaW5nX2ZyYWdtZW50XHgzZVxufSIsCm1lc2hwaG9uZ192ZXJ0OiIjZGVmaW5lIFBIT05HXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjdXYyX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2VcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcbiNlbmRpZlxuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGh0YXJnZXRfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5pbmdfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZGlzcGxhY2VtZW50bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0dlZpZXdQb3NpdGlvbiBceDNkIC0gbXZQb3NpdGlvbi54eXo7XG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NlbnZtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2hhZG93bWFwX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKbWVzaHBoeXNpY2FsX2ZyYWc6IiNkZWZpbmUgU1RBTkRBUkRcbiNpZmRlZiBQSFlTSUNBTFxuXHQjZGVmaW5lIFJFRkxFQ1RJVklUWVxuXHQjZGVmaW5lIENMRUFSQ09BVFxuXHQjZGVmaW5lIFRSQU5TUEFSRU5DWVxuI2VuZGlmXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcbnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzO1xudW5pZm9ybSBmbG9hdCBtZXRhbG5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaWZkZWYgVFJBTlNQQVJFTkNZXG5cdHVuaWZvcm0gZmxvYXQgdHJhbnNwYXJlbmN5O1xuI2VuZGlmXG4jaWZkZWYgUkVGTEVDVElWSVRZXG5cdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xuI2VuZGlmXG4jaWZkZWYgQ0xFQVJDT0FUXG5cdHVuaWZvcm0gZmxvYXQgY2xlYXJjb2F0O1xuXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcztcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHR1bmlmb3JtIHZlYzMgc2hlZW47XG4jZW5kaWZcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY2RpdGhlcmluZ19wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NvbG9yX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjdXZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2N1djJfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NhbHBoYW1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2FvbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2JzZGZzXHgzZVxuI2luY2x1ZGUgXHgzY2N1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BhcnNfYmVnaW5ceDNlXG4jaW5jbHVkZSBceDNjbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsZWFyY29hdF9ub3JtYWxtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWM0IGRpZmZ1c2VDb2xvciBceDNkIHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgXHgzZCBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgXHgzZCBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYW1hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2FscGhhdGVzdF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY3JvdWdobmVzc21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21ldGFsbmVzc21hcF9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHQjaW5jbHVkZSBceDNjY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwc1x4M2Vcblx0I2luY2x1ZGUgXHgzY2VtaXNzaXZlbWFwX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X2JlZ2luXHgzZVxuXHQjaW5jbHVkZSBceDNjbGlnaHRzX2ZyYWdtZW50X21hcHNceDNlXG5cdCNpbmNsdWRlIFx4M2NsaWdodHNfZnJhZ21lbnRfZW5kXHgzZVxuXHQjaW5jbHVkZSBceDNjYW9tYXBfZnJhZ21lbnRceDNlXG5cdHZlYzMgb3V0Z29pbmdMaWdodCBceDNkIHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpZmRlZiBUUkFOU1BBUkVOQ1lcblx0XHRkaWZmdXNlQ29sb3IuYSAqXHgzZCBzYXR1cmF0ZSggMS4gLSB0cmFuc3BhcmVuY3kgKyBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKCByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKSApO1xuXHQjZW5kaWZcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3RvbmVtYXBwaW5nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZW5jb2RpbmdzX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RpdGhlcmluZ19mcmFnbWVudFx4M2Vcbn0iLAptZXNocGh5c2ljYWxfdmVydDoiI2RlZmluZSBTVEFOREFSRFxudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3V2Ml9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NraW5uaW5nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY3NoYWRvd21hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N1djJfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY29sb3JfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjYmVnaW5ub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjbW9ycGhub3JtYWxfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbmJhc2VfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjc2tpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkZWZhdWx0bm9ybWFsX3ZlcnRleFx4M2VcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dk5vcm1hbCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWROb3JtYWwgKTtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dlRhbmdlbnQgXHgzZCBub3JtYWxpemUoIHRyYW5zZm9ybWVkVGFuZ2VudCApO1xuXHRcdHZCaXRhbmdlbnQgXHgzZCBub3JtYWxpemUoIGNyb3NzKCB2Tm9ybWFsLCB2VGFuZ2VudCApICogdGFuZ2VudC53ICk7XG5cdCNlbmRpZlxuI2VuZGlmXG5cdCNpbmNsdWRlIFx4M2NiZWdpbl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubmluZ192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NkaXNwbGFjZW1lbnRtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfdmVydGV4XHgzZVxuXHR2Vmlld1Bvc2l0aW9uIFx4M2QgLSBtdlBvc2l0aW9uLnh5ejtcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NoYWRvd21hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfdmVydGV4XHgzZVxufSIsCm5vcm1hbF9mcmFnOiIjZGVmaW5lIE5PUk1BTFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2lmIGRlZmluZWQoIEZMQVRfU0hBREVEICkgfHwgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWZcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIFx4M2NwYWNraW5nXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjYnVtcG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9iZWdpblx4M2Vcblx0I2luY2x1ZGUgXHgzY25vcm1hbF9mcmFnbWVudF9tYXBzXHgzZVxuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBwYWNrTm9ybWFsVG9SR0IoIG5vcm1hbCApLCBvcGFjaXR5ICk7XG59IiwKbm9ybWFsX3ZlcnQ6IiNkZWZpbmUgTk9STUFMXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxuXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNlbmRpZlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Ntb3JwaHRhcmdldF9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nza2lubmluZ19wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXhceDNlXG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIFx4M2N1dl92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NiZWdpbm5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Ntb3JwaG5vcm1hbF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2luYmFzZV92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nza2lubm9ybWFsX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2RlZmF1bHRub3JtYWxfdmVydGV4XHgzZVxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsIFx4M2Qgbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2VGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XG5cdFx0dkJpdGFuZ2VudCBceDNkIG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTtcblx0I2VuZGlmXG4jZW5kaWZcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3NraW5uaW5nX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2Rpc3BsYWNlbWVudG1hcF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2Nwcm9qZWN0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc192ZXJ0ZXhceDNlXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxuXHR2Vmlld1Bvc2l0aW9uIFx4M2QgLSBtdlBvc2l0aW9uLnh5ejtcbiNlbmRpZlxufSIsCnBvaW50c19mcmFnOiJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NtYXBfcGFydGljbGVfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50XHgzZVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgXHgzZCB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgXHgzZCB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIFx4M2Nsb2dkZXB0aGJ1Zl9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY21hcF9wYXJ0aWNsZV9mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2NvbG9yX2ZyYWdtZW50XHgzZVxuXHQjaW5jbHVkZSBceDNjYWxwaGF0ZXN0X2ZyYWdtZW50XHgzZVxuXHRvdXRnb2luZ0xpZ2h0IFx4M2QgZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yIFx4M2QgdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgXHgzY3ByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2N0b25lbWFwcGluZ19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2VuY29kaW5nc19mcmFnbWVudFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ19mcmFnbWVudFx4M2Vcbn0iLApwb2ludHNfdmVydDoidW5pZm9ybSBmbG9hdCBzaXplO1xudW5pZm9ybSBmbG9hdCBzY2FsZTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjY29sb3JfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2xvZ2RlcHRoYnVmX3BhcnNfdmVydGV4XHgzZVxuI2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NvbG9yX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2JlZ2luX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY21vcnBodGFyZ2V0X3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3Byb2plY3RfdmVydGV4XHgzZVxuXHRnbF9Qb2ludFNpemUgXHgzZCBzaXplO1xuXHQjaWZkZWYgVVNFX1NJWkVBVFRFTlVBVElPTlxuXHRcdGJvb2wgaXNQZXJzcGVjdGl2ZSBceDNkICggcHJvamVjdGlvbk1hdHJpeFsgMiBdWyAzIF0gXHgzZFx4M2QgLSAxLjAgKTtcblx0XHRpZiAoIGlzUGVyc3BlY3RpdmUgKSBnbF9Qb2ludFNpemUgKlx4M2QgKCBzY2FsZSAvIC0gbXZQb3NpdGlvbi56ICk7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY3dvcmxkcG9zX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59IiwKc2hhZG93X2ZyYWc6InVuaWZvcm0gdmVjMyBjb2xvcjtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIFx4M2Njb21tb25ceDNlXG4jaW5jbHVkZSBceDNjcGFja2luZ1x4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2Nic2Rmc1x4M2VcbiNpbmNsdWRlIFx4M2NsaWdodHNfcGFyc19iZWdpblx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnRceDNlXG52b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xvciBceDNkIHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApO1xuXHQjaW5jbHVkZSBceDNjZm9nX2ZyYWdtZW50XHgzZVxufSIsc2hhZG93X3ZlcnQ6IiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjc2hhZG93bWFwX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjYmVnaW5fdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjcHJvamVjdF92ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2N3b3JsZHBvc192ZXJ0ZXhceDNlXG5cdCNpbmNsdWRlIFx4M2NzaGFkb3dtYXBfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjZm9nX3ZlcnRleFx4M2Vcbn0iLApzcHJpdGVfZnJhZzoidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaW5jbHVkZSBceDNjY29tbW9uXHgzZVxuI2luY2x1ZGUgXHgzY3V2X3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbWFwX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjZm9nX3BhcnNfZnJhZ21lbnRceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudFx4M2VcbiNpbmNsdWRlIFx4M2NjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudFx4M2VcbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgXHgzY2NsaXBwaW5nX3BsYW5lc19mcmFnbWVudFx4M2Vcblx0dmVjMyBvdXRnb2luZ0xpZ2h0IFx4M2QgdmVjMyggMC4wICk7XG5cdHZlYzQgZGlmZnVzZUNvbG9yIFx4M2QgdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NtYXBfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NhbHBoYXRlc3RfZnJhZ21lbnRceDNlXG5cdG91dGdvaW5nTGlnaHQgXHgzZCBkaWZmdXNlQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgXHgzZCB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSBceDNjdG9uZW1hcHBpbmdfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2NlbmNvZGluZ3NfZnJhZ21lbnRceDNlXG5cdCNpbmNsdWRlIFx4M2Nmb2dfZnJhZ21lbnRceDNlXG59IiwKc3ByaXRlX3ZlcnQ6InVuaWZvcm0gZmxvYXQgcm90YXRpb247XG51bmlmb3JtIHZlYzIgY2VudGVyO1xuI2luY2x1ZGUgXHgzY2NvbW1vblx4M2VcbiNpbmNsdWRlIFx4M2N1dl9wYXJzX3ZlcnRleFx4M2VcbiNpbmNsdWRlIFx4M2Nmb2dfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXhceDNlXG4jaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4XHgzZVxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSBceDNjdXZfdmVydGV4XHgzZVxuXHR2ZWM0IG12UG9zaXRpb24gXHgzZCBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCAwLjAsIDAuMCwgMC4wLCAxLjAgKTtcblx0dmVjMiBzY2FsZTtcblx0c2NhbGUueCBceDNkIGxlbmd0aCggdmVjMyggbW9kZWxNYXRyaXhbIDAgXS54LCBtb2RlbE1hdHJpeFsgMCBdLnksIG1vZGVsTWF0cml4WyAwIF0ueiApICk7XG5cdHNjYWxlLnkgXHgzZCBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAxIF0ueCwgbW9kZWxNYXRyaXhbIDEgXS55LCBtb2RlbE1hdHJpeFsgMSBdLnogKSApO1xuXHQjaWZuZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cblx0XHRib29sIGlzUGVyc3BlY3RpdmUgXHgzZCAoIHByb2plY3Rpb25NYXRyaXhbIDIgXVsgMyBdIFx4M2RceDNkIC0gMS4wICk7XG5cdFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgc2NhbGUgKlx4M2QgLSBtdlBvc2l0aW9uLno7XG5cdCNlbmRpZlxuXHR2ZWMyIGFsaWduZWRQb3NpdGlvbiBceDNkICggcG9zaXRpb24ueHkgLSAoIGNlbnRlciAtIHZlYzIoIDAuNSApICkgKSAqIHNjYWxlO1xuXHR2ZWMyIHJvdGF0ZWRQb3NpdGlvbjtcblx0cm90YXRlZFBvc2l0aW9uLnggXHgzZCBjb3MoIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCAtIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xuXHRyb3RhdGVkUG9zaXRpb24ueSBceDNkIHNpbiggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi54ICsgY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnk7XG5cdG12UG9zaXRpb24ueHkgK1x4M2Qgcm90YXRlZFBvc2l0aW9uO1xuXHRnbF9Qb3NpdGlvbiBceDNkIHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuXHQjaW5jbHVkZSBceDNjbG9nZGVwdGhidWZfdmVydGV4XHgzZVxuXHQjaW5jbHVkZSBceDNjY2xpcHBpbmdfcGxhbmVzX3ZlcnRleFx4M2Vcblx0I2luY2x1ZGUgXHgzY2ZvZ192ZXJ0ZXhceDNlXG59In0sCldhPXtjb21tb246e2RpZmZ1c2U6e3ZhbHVlOm5ldyBJKDE1NjU4NzM0KX0sb3BhY2l0eTp7dmFsdWU6MX0sbWFwOnt2YWx1ZTpudWxsfSx1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IHR9LGFscGhhTWFwOnt2YWx1ZTpudWxsfX0sc3BlY3VsYXJtYXA6e3NwZWN1bGFyTWFwOnt2YWx1ZTpudWxsfX0sZW52bWFwOntlbnZNYXA6e3ZhbHVlOm51bGx9LGZsaXBFbnZNYXA6e3ZhbHVlOi0xfSxyZWZsZWN0aXZpdHk6e3ZhbHVlOjF9LHJlZnJhY3Rpb25SYXRpbzp7dmFsdWU6Ljk4fSxtYXhNaXBMZXZlbDp7dmFsdWU6MH19LGFvbWFwOnthb01hcDp7dmFsdWU6bnVsbH0sYW9NYXBJbnRlbnNpdHk6e3ZhbHVlOjF9fSxsaWdodG1hcDp7bGlnaHRNYXA6e3ZhbHVlOm51bGx9LGxpZ2h0TWFwSW50ZW5zaXR5Ont2YWx1ZToxfX0sZW1pc3NpdmVtYXA6e2VtaXNzaXZlTWFwOnt2YWx1ZTpudWxsfX0sYnVtcG1hcDp7YnVtcE1hcDp7dmFsdWU6bnVsbH0sYnVtcFNjYWxlOnt2YWx1ZToxfX0sbm9ybWFsbWFwOntub3JtYWxNYXA6e3ZhbHVlOm51bGx9LApub3JtYWxTY2FsZTp7dmFsdWU6bmV3IGYoMSwxKX19LGRpc3BsYWNlbWVudG1hcDp7ZGlzcGxhY2VtZW50TWFwOnt2YWx1ZTpudWxsfSxkaXNwbGFjZW1lbnRTY2FsZTp7dmFsdWU6MX0sZGlzcGxhY2VtZW50Qmlhczp7dmFsdWU6MH19LHJvdWdobmVzc21hcDp7cm91Z2huZXNzTWFwOnt2YWx1ZTpudWxsfX0sbWV0YWxuZXNzbWFwOnttZXRhbG5lc3NNYXA6e3ZhbHVlOm51bGx9fSxncmFkaWVudG1hcDp7Z3JhZGllbnRNYXA6e3ZhbHVlOm51bGx9fSxmb2c6e2ZvZ0RlbnNpdHk6e3ZhbHVlOjIuNUUtNH0sZm9nTmVhcjp7dmFsdWU6MX0sZm9nRmFyOnt2YWx1ZToyRTN9LGZvZ0NvbG9yOnt2YWx1ZTpuZXcgSSgxNjc3NzIxNSl9fSxsaWdodHM6e2FtYmllbnRMaWdodENvbG9yOnt2YWx1ZTpbXX0sbGlnaHRQcm9iZTp7dmFsdWU6W119LGRpcmVjdGlvbmFsTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntkaXJlY3Rpb246e30sY29sb3I6e30sc2hhZG93Ont9LHNoYWRvd0JpYXM6e30sCnNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sZGlyZWN0aW9uYWxTaGFkb3dNYXA6e3ZhbHVlOltdfSxkaXJlY3Rpb25hbFNoYWRvd01hdHJpeDp7dmFsdWU6W119LHNwb3RMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2NvbG9yOnt9LHBvc2l0aW9uOnt9LGRpcmVjdGlvbjp7fSxkaXN0YW5jZTp7fSxjb25lQ29zOnt9LHBlbnVtYnJhQ29zOnt9LGRlY2F5Ont9LHNoYWRvdzp7fSxzaGFkb3dCaWFzOnt9LHNoYWRvd1JhZGl1czp7fSxzaGFkb3dNYXBTaXplOnt9fX0sc3BvdFNoYWRvd01hcDp7dmFsdWU6W119LHNwb3RTaGFkb3dNYXRyaXg6e3ZhbHVlOltdfSxwb2ludExpZ2h0czp7dmFsdWU6W10scHJvcGVydGllczp7Y29sb3I6e30scG9zaXRpb246e30sZGVjYXk6e30sZGlzdGFuY2U6e30sc2hhZG93Ont9LHNoYWRvd0JpYXM6e30sc2hhZG93UmFkaXVzOnt9LHNoYWRvd01hcFNpemU6e30sc2hhZG93Q2FtZXJhTmVhcjp7fSxzaGFkb3dDYW1lcmFGYXI6e319fSwKcG9pbnRTaGFkb3dNYXA6e3ZhbHVlOltdfSxwb2ludFNoYWRvd01hdHJpeDp7dmFsdWU6W119LGhlbWlzcGhlcmVMaWdodHM6e3ZhbHVlOltdLHByb3BlcnRpZXM6e2RpcmVjdGlvbjp7fSxza3lDb2xvcjp7fSxncm91bmRDb2xvcjp7fX19LHJlY3RBcmVhTGlnaHRzOnt2YWx1ZTpbXSxwcm9wZXJ0aWVzOntjb2xvcjp7fSxwb3NpdGlvbjp7fSx3aWR0aDp7fSxoZWlnaHQ6e319fX0scG9pbnRzOntkaWZmdXNlOnt2YWx1ZTpuZXcgSSgxNTY1ODczNCl9LG9wYWNpdHk6e3ZhbHVlOjF9LHNpemU6e3ZhbHVlOjF9LHNjYWxlOnt2YWx1ZToxfSxtYXA6e3ZhbHVlOm51bGx9LHV2VHJhbnNmb3JtOnt2YWx1ZTpuZXcgdH19LHNwcml0ZTp7ZGlmZnVzZTp7dmFsdWU6bmV3IEkoMTU2NTg3MzQpfSxvcGFjaXR5Ont2YWx1ZToxfSxjZW50ZXI6e3ZhbHVlOm5ldyBmKC41LC41KX0scm90YXRpb246e3ZhbHVlOjB9LG1hcDp7dmFsdWU6bnVsbH0sdXZUcmFuc2Zvcm06e3ZhbHVlOm5ldyB0fX19LE1jPQp7YmFzaWM6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2Euc3BlY3VsYXJtYXAsV2EuZW52bWFwLFdhLmFvbWFwLFdhLmxpZ2h0bWFwLFdhLmZvZ10pLHZlcnRleFNoYWRlcjpyYi5tZXNoYmFzaWNfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNoYmFzaWNfZnJhZ30sbGFtYmVydDp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5zcGVjdWxhcm1hcCxXYS5lbnZtYXAsV2EuYW9tYXAsV2EubGlnaHRtYXAsV2EuZW1pc3NpdmVtYXAsV2EuZm9nLFdhLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBJKDApfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubWVzaGxhbWJlcnRfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNobGFtYmVydF9mcmFnfSxwaG9uZzp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5zcGVjdWxhcm1hcCxXYS5lbnZtYXAsV2EuYW9tYXAsV2EubGlnaHRtYXAsV2EuZW1pc3NpdmVtYXAsV2EuYnVtcG1hcCxXYS5ub3JtYWxtYXAsV2EuZGlzcGxhY2VtZW50bWFwLFdhLmdyYWRpZW50bWFwLApXYS5mb2csV2EubGlnaHRzLHtlbWlzc2l2ZTp7dmFsdWU6bmV3IEkoMCl9LHNwZWN1bGFyOnt2YWx1ZTpuZXcgSSgxMTE4NDgxKX0sc2hpbmluZXNzOnt2YWx1ZTozMH19XSksdmVydGV4U2hhZGVyOnJiLm1lc2hwaG9uZ192ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLm1lc2hwaG9uZ19mcmFnfSxzdGFuZGFyZDp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5lbnZtYXAsV2EuYW9tYXAsV2EubGlnaHRtYXAsV2EuZW1pc3NpdmVtYXAsV2EuYnVtcG1hcCxXYS5ub3JtYWxtYXAsV2EuZGlzcGxhY2VtZW50bWFwLFdhLnJvdWdobmVzc21hcCxXYS5tZXRhbG5lc3NtYXAsV2EuZm9nLFdhLmxpZ2h0cyx7ZW1pc3NpdmU6e3ZhbHVlOm5ldyBJKDApfSxyb3VnaG5lc3M6e3ZhbHVlOi41fSxtZXRhbG5lc3M6e3ZhbHVlOi41fSxlbnZNYXBJbnRlbnNpdHk6e3ZhbHVlOjF9fV0pLHZlcnRleFNoYWRlcjpyYi5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNocGh5c2ljYWxfZnJhZ30sCm1hdGNhcDp7dW5pZm9ybXM6QmIoW1dhLmNvbW1vbixXYS5idW1wbWFwLFdhLm5vcm1hbG1hcCxXYS5kaXNwbGFjZW1lbnRtYXAsV2EuZm9nLHttYXRjYXA6e3ZhbHVlOm51bGx9fV0pLHZlcnRleFNoYWRlcjpyYi5tZXNobWF0Y2FwX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubWVzaG1hdGNhcF9mcmFnfSxwb2ludHM6e3VuaWZvcm1zOkJiKFtXYS5wb2ludHMsV2EuZm9nXSksdmVydGV4U2hhZGVyOnJiLnBvaW50c192ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLnBvaW50c19mcmFnfSxkYXNoZWQ6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuZm9nLHtzY2FsZTp7dmFsdWU6MX0sZGFzaFNpemU6e3ZhbHVlOjF9LHRvdGFsU2l6ZTp7dmFsdWU6Mn19XSksdmVydGV4U2hhZGVyOnJiLmxpbmVkYXNoZWRfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5saW5lZGFzaGVkX2ZyYWd9LGRlcHRoOnt1bmlmb3JtczpCYihbV2EuY29tbW9uLFdhLmRpc3BsYWNlbWVudG1hcF0pLHZlcnRleFNoYWRlcjpyYi5kZXB0aF92ZXJ0LApmcmFnbWVudFNoYWRlcjpyYi5kZXB0aF9mcmFnfSxub3JtYWw6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuYnVtcG1hcCxXYS5ub3JtYWxtYXAsV2EuZGlzcGxhY2VtZW50bWFwLHtvcGFjaXR5Ont2YWx1ZToxfX1dKSx2ZXJ0ZXhTaGFkZXI6cmIubm9ybWFsX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIubm9ybWFsX2ZyYWd9LHNwcml0ZTp7dW5pZm9ybXM6QmIoW1dhLnNwcml0ZSxXYS5mb2ddKSx2ZXJ0ZXhTaGFkZXI6cmIuc3ByaXRlX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIuc3ByaXRlX2ZyYWd9LGJhY2tncm91bmQ6e3VuaWZvcm1zOnt1dlRyYW5zZm9ybTp7dmFsdWU6bmV3IHR9LHQyRDp7dmFsdWU6bnVsbH19LHZlcnRleFNoYWRlcjpyYi5iYWNrZ3JvdW5kX3ZlcnQsZnJhZ21lbnRTaGFkZXI6cmIuYmFja2dyb3VuZF9mcmFnfSxjdWJlOnt1bmlmb3Jtczp7dEN1YmU6e3ZhbHVlOm51bGx9LHRGbGlwOnt2YWx1ZTotMX0sb3BhY2l0eTp7dmFsdWU6MX19LHZlcnRleFNoYWRlcjpyYi5jdWJlX3ZlcnQsCmZyYWdtZW50U2hhZGVyOnJiLmN1YmVfZnJhZ30sZXF1aXJlY3Q6e3VuaWZvcm1zOnt0RXF1aXJlY3Q6e3ZhbHVlOm51bGx9fSx2ZXJ0ZXhTaGFkZXI6cmIuZXF1aXJlY3RfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5lcXVpcmVjdF9mcmFnfSxkaXN0YW5jZVJHQkE6e3VuaWZvcm1zOkJiKFtXYS5jb21tb24sV2EuZGlzcGxhY2VtZW50bWFwLHtyZWZlcmVuY2VQb3NpdGlvbjp7dmFsdWU6bmV3IGt9LG5lYXJEaXN0YW5jZTp7dmFsdWU6MX0sZmFyRGlzdGFuY2U6e3ZhbHVlOjFFM319XSksdmVydGV4U2hhZGVyOnJiLmRpc3RhbmNlUkdCQV92ZXJ0LGZyYWdtZW50U2hhZGVyOnJiLmRpc3RhbmNlUkdCQV9mcmFnfSxzaGFkb3c6e3VuaWZvcm1zOkJiKFtXYS5saWdodHMsV2EuZm9nLHtjb2xvcjp7dmFsdWU6bmV3IEkoMCl9LG9wYWNpdHk6e3ZhbHVlOjF9fV0pLHZlcnRleFNoYWRlcjpyYi5zaGFkb3dfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5zaGFkb3dfZnJhZ319O01jLnBoeXNpY2FsPQp7dW5pZm9ybXM6QmIoW01jLnN0YW5kYXJkLnVuaWZvcm1zLHt0cmFuc3BhcmVuY3k6e3ZhbHVlOjB9LGNsZWFyY29hdDp7dmFsdWU6MH0sY2xlYXJjb2F0Um91Z2huZXNzOnt2YWx1ZTowfSxzaGVlbjp7dmFsdWU6bmV3IEkoMCl9LGNsZWFyY29hdE5vcm1hbFNjYWxlOnt2YWx1ZTpuZXcgZigxLDEpfSxjbGVhcmNvYXROb3JtYWxNYXA6e3ZhbHVlOm51bGx9fV0pLHZlcnRleFNoYWRlcjpyYi5tZXNocGh5c2ljYWxfdmVydCxmcmFnbWVudFNoYWRlcjpyYi5tZXNocGh5c2ljYWxfZnJhZ307cmQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtyZC5wcm90b3R5cGUuY29uc3RydWN0b3I9cmQ7TGMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtMYy5wcm90b3R5cGUuY29uc3RydWN0b3I9TGM7Y2QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO2NkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jZDtjZC5wcm90b3R5cGUuaXNDdWJlVGV4dHVyZT0KITA7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNkLnByb3RvdHlwZSwiaW1hZ2VzIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW1hZ2V9LHNldDpmdW5jdGlvbihhKXt0aGlzLmltYWdlPWF9fSk7cmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO3JlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1yZTtyZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZTJEQXJyYXk9ITA7c2UucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO3NlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1zZTtzZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZTNEPSEwO3ZhciBpaj1uZXcgbCxlbD1uZXcgcmUsZ2w9bmV3IHNlLGpqPW5ldyBjZCxjaj1bXSxlaj1bXSxoaj1uZXcgRmxvYXQzMkFycmF5KDE2KSxnaj1uZXcgRmxvYXQzMkFycmF5KDkpLGZqPW5ldyBGbG9hdDMyQXJyYXkoNCk7a2oucHJvdG90eXBlLnVwZGF0ZUNhY2hlPWZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuY2FjaGU7YSBpbnN0YW5jZW9mCkZsb2F0MzJBcnJheSYmYy5sZW5ndGghPT1hLmxlbmd0aCYmKHRoaXMuY2FjaGU9bmV3IEZsb2F0MzJBcnJheShhLmxlbmd0aCkpO21jKGMsYSl9O2xqLnByb3RvdHlwZS5zZXRWYWx1ZT1mdW5jdGlvbihhLGMsZSl7Zm9yKHZhciBnPXRoaXMuc2VxLHI9MCx2PWcubGVuZ3RoO3IhPT12Oysrcil7dmFyIHo9Z1tyXTt6LnNldFZhbHVlKGEsY1t6LmlkXSxlKX19O3ZhciBMaD0vKFtcd1xkX10rKShcXSk/KFxbfFwuKT8vZzt1ZC5wcm90b3R5cGUuc2V0VmFsdWU9ZnVuY3Rpb24oYSxjLGUsZyl7Yz10aGlzLm1hcFtjXTt2b2lkIDAhPT1jJiZjLnNldFZhbHVlKGEsZSxnKX07dWQucHJvdG90eXBlLnNldE9wdGlvbmFsPWZ1bmN0aW9uKGEsYyxlKXtjPWNbZV07dm9pZCAwIT09YyYmdGhpcy5zZXRWYWx1ZShhLGUsYyl9O3VkLnVwbG9hZD1mdW5jdGlvbihhLGMsZSxnKXtmb3IodmFyIHI9MCx2PWMubGVuZ3RoO3IhPT12Oysrcil7dmFyIHo9Y1tyXSxFPWVbei5pZF07ITEhPT1FLm5lZWRzVXBkYXRlJiYKei5zZXRWYWx1ZShhLEUudmFsdWUsZyl9fTt1ZC5zZXFXaXRoVmFsdWU9ZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9W10sZz0wLHI9YS5sZW5ndGg7ZyE9PXI7KytnKXt2YXIgdj1hW2ddO3YuaWQgaW4gYyYmZS5wdXNoKHYpfXJldHVybiBlfTt2YXIgS2w9MCxUbD0wO3ZkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTt2ZC5wcm90b3R5cGUuY29uc3RydWN0b3I9dmQ7dmQucHJvdG90eXBlLmlzTWVzaERlcHRoTWF0ZXJpYWw9ITA7dmQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5kZXB0aFBhY2tpbmc9YS5kZXB0aFBhY2tpbmc7dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubWFwPWEubWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmRpc3BsYWNlbWVudE1hcD1hLmRpc3BsYWNlbWVudE1hcDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPQphLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7cmV0dXJuIHRoaXN9O3dkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTt3ZC5wcm90b3R5cGUuY29uc3RydWN0b3I9d2Q7d2QucHJvdG90eXBlLmlzTWVzaERpc3RhbmNlTWF0ZXJpYWw9ITA7d2QucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5yZWZlcmVuY2VQb3NpdGlvbi5jb3B5KGEucmVmZXJlbmNlUG9zaXRpb24pO3RoaXMubmVhckRpc3RhbmNlPWEubmVhckRpc3RhbmNlO3RoaXMuZmFyRGlzdGFuY2U9YS5mYXJEaXN0YW5jZTt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tYXA9YS5tYXA7dGhpcy5hbHBoYU1hcD0KYS5hbHBoYU1hcDt0aGlzLmRpc3BsYWNlbWVudE1hcD1hLmRpc3BsYWNlbWVudE1hcDt0aGlzLmRpc3BsYWNlbWVudFNjYWxlPWEuZGlzcGxhY2VtZW50U2NhbGU7dGhpcy5kaXNwbGFjZW1lbnRCaWFzPWEuZGlzcGxhY2VtZW50QmlhcztyZXR1cm4gdGhpc307dWUucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnVlLGlzR3JvdXA6ITB9KTt2Zi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHZiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnZmLGlzQXJyYXlDYW1lcmE6ITB9KTt2YXIgeWo9bmV3IGssemo9bmV3IGs7T2JqZWN0LmFzc2lnbihOaC5wcm90b3R5cGUsZC5wcm90b3R5cGUpO09iamVjdC5hc3NpZ24oQWoucHJvdG90eXBlLGQucHJvdG90eXBlKTtPYmplY3QuYXNzaWduKHpnLnByb3RvdHlwZSx7aXNGb2dFeHAyOiEwLGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyB6Zyh0aGlzLmNvbG9yLAp0aGlzLmRlbnNpdHkpfSx0b0pTT046ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiRm9nRXhwMiIsY29sb3I6dGhpcy5jb2xvci5nZXRIZXgoKSxkZW5zaXR5OnRoaXMuZGVuc2l0eX19fSk7T2JqZWN0LmFzc2lnbihBZy5wcm90b3R5cGUse2lzRm9nOiEwLGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBBZyh0aGlzLmNvbG9yLHRoaXMubmVhcix0aGlzLmZhcil9LHRvSlNPTjpmdW5jdGlvbigpe3JldHVybnt0eXBlOiJGb2ciLGNvbG9yOnRoaXMuY29sb3IuZ2V0SGV4KCksbmVhcjp0aGlzLm5lYXIsZmFyOnRoaXMuZmFyfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoUWQucHJvdG90eXBlLCJuZWVkc1VwZGF0ZSIse3NldDpmdW5jdGlvbihhKXshMD09PWEmJnRoaXMudmVyc2lvbisrfX0pO09iamVjdC5hc3NpZ24oUWQucHJvdG90eXBlLHtpc0ludGVybGVhdmVkQnVmZmVyOiEwLG9uVXBsb2FkQ2FsbGJhY2s6ZnVuY3Rpb24oKXt9LHNldEFycmF5OmZ1bmN0aW9uKGEpe2lmKEFycmF5LmlzQXJyYXkoYSkpdGhyb3cgbmV3IFR5cGVFcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiBhcnJheSBzaG91bGQgYmUgYSBUeXBlZCBBcnJheS4iKTsKdGhpcy5jb3VudD12b2lkIDAhPT1hP2EubGVuZ3RoL3RoaXMuc3RyaWRlOjA7dGhpcy5hcnJheT1hO3JldHVybiB0aGlzfSxzZXREeW5hbWljOmZ1bmN0aW9uKGEpe3RoaXMuZHluYW1pYz1hO3JldHVybiB0aGlzfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuYXJyYXk9bmV3IGEuYXJyYXkuY29uc3RydWN0b3IoYS5hcnJheSk7dGhpcy5jb3VudD1hLmNvdW50O3RoaXMuc3RyaWRlPWEuc3RyaWRlO3RoaXMuZHluYW1pYz1hLmR5bmFtaWM7cmV0dXJuIHRoaXN9LGNvcHlBdDpmdW5jdGlvbihhLGMsZSl7YSo9dGhpcy5zdHJpZGU7ZSo9Yy5zdHJpZGU7Zm9yKHZhciBnPTAscj10aGlzLnN0cmlkZTtnPHI7ZysrKXRoaXMuYXJyYXlbYStnXT1jLmFycmF5W2UrZ107cmV0dXJuIHRoaXN9LHNldDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjPTApO3RoaXMuYXJyYXkuc2V0KGEsYyk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSwKb25VcGxvYWQ6ZnVuY3Rpb24oYSl7dGhpcy5vblVwbG9hZENhbGxiYWNrPWE7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoeGYucHJvdG90eXBlLHtjb3VudDp7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGF0YS5jb3VudH19LGFycmF5OntnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kYXRhLmFycmF5fX19KTtPYmplY3QuYXNzaWduKHhmLnByb3RvdHlwZSx7aXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZTohMCxzZXRYOmZ1bmN0aW9uKGEsYyl7dGhpcy5kYXRhLmFycmF5W2EqdGhpcy5kYXRhLnN0cmlkZSt0aGlzLm9mZnNldF09YztyZXR1cm4gdGhpc30sc2V0WTpmdW5jdGlvbihhLGMpe3RoaXMuZGF0YS5hcnJheVthKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMV09YztyZXR1cm4gdGhpc30sc2V0WjpmdW5jdGlvbihhLGMpe3RoaXMuZGF0YS5hcnJheVthKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQrMl09YztyZXR1cm4gdGhpc30sCnNldFc6ZnVuY3Rpb24oYSxjKXt0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdPWM7cmV0dXJuIHRoaXN9LGdldFg6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGF0YS5hcnJheVthKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXRdfSxnZXRZOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzFdfSxnZXRaOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzJdfSxnZXRXOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmRhdGEuYXJyYXlbYSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0KzNdfSxzZXRYWTpmdW5jdGlvbihhLGMsZSl7YT1hKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7dGhpcy5kYXRhLmFycmF5W2ErMF09Yzt0aGlzLmRhdGEuYXJyYXlbYSsxXT1lO3JldHVybiB0aGlzfSxzZXRYWVo6ZnVuY3Rpb24oYSwKYyxlLGcpe2E9YSp0aGlzLmRhdGEuc3RyaWRlK3RoaXMub2Zmc2V0O3RoaXMuZGF0YS5hcnJheVthKzBdPWM7dGhpcy5kYXRhLmFycmF5W2ErMV09ZTt0aGlzLmRhdGEuYXJyYXlbYSsyXT1nO3JldHVybiB0aGlzfSxzZXRYWVpXOmZ1bmN0aW9uKGEsYyxlLGcscil7YT1hKnRoaXMuZGF0YS5zdHJpZGUrdGhpcy5vZmZzZXQ7dGhpcy5kYXRhLmFycmF5W2ErMF09Yzt0aGlzLmRhdGEuYXJyYXlbYSsxXT1lO3RoaXMuZGF0YS5hcnJheVthKzJdPWc7dGhpcy5kYXRhLmFycmF5W2ErM109cjtyZXR1cm4gdGhpc319KTtBZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7QWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPUFkO0FkLnByb3RvdHlwZS5pc1Nwcml0ZU1hdGVyaWFsPSEwO0FkLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hcD1hLm1hcDt0aGlzLnJvdGF0aW9uPQphLnJvdGF0aW9uO3RoaXMuc2l6ZUF0dGVudWF0aW9uPWEuc2l6ZUF0dGVudWF0aW9uO3JldHVybiB0aGlzfTt2YXIgQWUsbWc9bmV3IGssbmY9bmV3IGssb2Y9bmV3IGssQmU9bmV3IGYsemY9bmV3IGYsRmo9bmV3IHEscWg9bmV3IGssbmc9bmV3IGsscmg9bmV3IGssa2s9bmV3IGYsS2k9bmV3IGYsbGs9bmV3IGY7eWYucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnlmLGlzU3ByaXRlOiEwLHJheWNhc3Q6ZnVuY3Rpb24oYSxjKXtudWxsPT09YS5jYW1lcmEmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLlNwcml0ZTogIlJheWNhc3Rlci5jYW1lcmEiIG5lZWRzIHRvIGJlIHNldCBpbiBvcmRlciB0byByYXljYXN0IGFnYWluc3Qgc3ByaXRlcy4nKTtuZi5zZXRGcm9tTWF0cml4U2NhbGUodGhpcy5tYXRyaXhXb3JsZCk7RmouY29weShhLmNhbWVyYS5tYXRyaXhXb3JsZCk7dGhpcy5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyhhLmNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsCnRoaXMubWF0cml4V29ybGQpO29mLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1vZGVsVmlld01hdHJpeCk7YS5jYW1lcmEuaXNQZXJzcGVjdGl2ZUNhbWVyYSYmITE9PT10aGlzLm1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiYmbmYubXVsdGlwbHlTY2FsYXIoLW9mLnopO3ZhciBlPXRoaXMubWF0ZXJpYWwucm90YXRpb247aWYoMCE9PWUpe3ZhciBnPU1hdGguY29zKGUpO3ZhciByPU1hdGguc2luKGUpfWU9dGhpcy5jZW50ZXI7QmcocWguc2V0KC0uNSwtLjUsMCksb2YsZSxuZixyLGcpO0JnKG5nLnNldCguNSwtLjUsMCksb2YsZSxuZixyLGcpO0JnKHJoLnNldCguNSwuNSwwKSxvZixlLG5mLHIsZyk7a2suc2V0KDAsMCk7S2kuc2V0KDEsMCk7bGsuc2V0KDEsMSk7dmFyIHY9YS5yYXkuaW50ZXJzZWN0VHJpYW5nbGUocWgsbmcscmgsITEsbWcpO2lmKG51bGw9PT12JiYoQmcobmcuc2V0KC0uNSwuNSwwKSxvZixlLG5mLHIsZyksS2kuc2V0KDAsMSksdj1hLnJheS5pbnRlcnNlY3RUcmlhbmdsZShxaCwKcmgsbmcsITEsbWcpLG51bGw9PT12KSlyZXR1cm47cj1hLnJheS5vcmlnaW4uZGlzdGFuY2VUbyhtZyk7cjxhLm5lYXJ8fHI+YS5mYXJ8fGMucHVzaCh7ZGlzdGFuY2U6cixwb2ludDptZy5jbG9uZSgpLHV2OkIuZ2V0VVYobWcscWgsbmcscmgsa2ssS2ksbGssbmV3IGYpLGZhY2U6bnVsbCxvYmplY3Q6dGhpc30pfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt2b2lkIDAhPT1hLmNlbnRlciYmdGhpcy5jZW50ZXIuY29weShhLmNlbnRlcik7cmV0dXJuIHRoaXN9fSk7dmFyIHNoPW5ldyBrLG1rPW5ldyBrO0FmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpBZixpc0xPRDohMCxjb3B5OmZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLAphLCExKTthPWEubGV2ZWxzO2Zvcih2YXIgYz0wLGU9YS5sZW5ndGg7YzxlO2MrKyl7dmFyIGc9YVtjXTt0aGlzLmFkZExldmVsKGcub2JqZWN0LmNsb25lKCksZy5kaXN0YW5jZSl9cmV0dXJuIHRoaXN9LGFkZExldmVsOmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7Yz1NYXRoLmFicyhjKTtmb3IodmFyIGU9dGhpcy5sZXZlbHMsZz0wO2c8ZS5sZW5ndGgmJiEoYzxlW2ddLmRpc3RhbmNlKTtnKyspO2Uuc3BsaWNlKGcsMCx7ZGlzdGFuY2U6YyxvYmplY3Q6YX0pO3RoaXMuYWRkKGEpO3JldHVybiB0aGlzfSxnZXRPYmplY3RGb3JEaXN0YW5jZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5sZXZlbHMsZT0xLGc9Yy5sZW5ndGg7ZTxnJiYhKGE8Y1tlXS5kaXN0YW5jZSk7ZSsrKTtyZXR1cm4gY1tlLTFdLm9iamVjdH0scmF5Y2FzdDpmdW5jdGlvbihhLGMpe3NoLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLm1hdHJpeFdvcmxkKTt0aGlzLmdldE9iamVjdEZvckRpc3RhbmNlKGEucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKHNoKSkucmF5Y2FzdChhLApjKX0sdXBkYXRlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMubGV2ZWxzO2lmKDE8Yy5sZW5ndGgpe3NoLnNldEZyb21NYXRyaXhQb3NpdGlvbihhLm1hdHJpeFdvcmxkKTttay5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5tYXRyaXhXb3JsZCk7YT1zaC5kaXN0YW5jZVRvKG1rKTtjWzBdLm9iamVjdC52aXNpYmxlPSEwO2Zvcih2YXIgZT0xLGc9Yy5sZW5ndGg7ZTxnO2UrKylpZihhPj1jW2VdLmRpc3RhbmNlKWNbZS0xXS5vYmplY3QudmlzaWJsZT0hMSxjW2VdLm9iamVjdC52aXNpYmxlPSEwO2Vsc2UgYnJlYWs7Zm9yKDtlPGc7ZSsrKWNbZV0ub2JqZWN0LnZpc2libGU9ITF9fSx0b0pTT046ZnVuY3Rpb24oYSl7YT1BLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2Eub2JqZWN0LmxldmVscz1bXTtmb3IodmFyIGM9dGhpcy5sZXZlbHMsZT0wLGc9Yy5sZW5ndGg7ZTxnO2UrKyl7dmFyIHI9Y1tlXTthLm9iamVjdC5sZXZlbHMucHVzaCh7b2JqZWN0OnIub2JqZWN0LnV1aWQsCmRpc3RhbmNlOnIuZGlzdGFuY2V9KX1yZXR1cm4gYX19KTtCZi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkJmLGlzU2tpbm5lZE1lc2g6ITAsYmluZDpmdW5jdGlvbihhLGMpe3RoaXMuc2tlbGV0b249YTt2b2lkIDA9PT1jJiYodGhpcy51cGRhdGVNYXRyaXhXb3JsZCghMCksdGhpcy5za2VsZXRvbi5jYWxjdWxhdGVJbnZlcnNlcygpLGM9dGhpcy5tYXRyaXhXb3JsZCk7dGhpcy5iaW5kTWF0cml4LmNvcHkoYyk7dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKGMpfSxwb3NlOmZ1bmN0aW9uKCl7dGhpcy5za2VsZXRvbi5wb3NlKCl9LG5vcm1hbGl6ZVNraW5XZWlnaHRzOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPW5ldyBwLGM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQsZT0wLGc9Yy5jb3VudDtlPGc7ZSsrKXthLng9Yy5nZXRYKGUpO2EueT1jLmdldFkoZSk7YS56PWMuZ2V0WihlKTsKYS53PWMuZ2V0VyhlKTt2YXIgcj0xL2EubWFuaGF0dGFuTGVuZ3RoKCk7SW5maW5pdHkhPT1yP2EubXVsdGlwbHlTY2FsYXIocik6YS5zZXQoMSwwLDAsMCk7Yy5zZXRYWVpXKGUsYS54LGEueSxhLnosYS53KX19LHVwZGF0ZU1hdHJpeFdvcmxkOmZ1bmN0aW9uKGEpe3hhLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSk7ImF0dGFjaGVkIj09PXRoaXMuYmluZE1vZGU/dGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKHRoaXMubWF0cml4V29ybGQpOiJkZXRhY2hlZCI9PT10aGlzLmJpbmRNb2RlP3RoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSh0aGlzLmJpbmRNYXRyaXgpOmNvbnNvbGUud2FybigiVEhSRUUuU2tpbm5lZE1lc2g6IFVucmVjb2duaXplZCBiaW5kTW9kZTogIit0aGlzLmJpbmRNb2RlKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTsKdmFyIG5rPW5ldyBxLEltPW5ldyBxO09iamVjdC5hc3NpZ24oQ2cucHJvdG90eXBlLHtjYWxjdWxhdGVJbnZlcnNlczpmdW5jdGlvbigpe3RoaXMuYm9uZUludmVyc2VzPVtdO2Zvcih2YXIgYT0wLGM9dGhpcy5ib25lcy5sZW5ndGg7YTxjO2ErKyl7dmFyIGU9bmV3IHE7dGhpcy5ib25lc1thXSYmZS5nZXRJbnZlcnNlKHRoaXMuYm9uZXNbYV0ubWF0cml4V29ybGQpO3RoaXMuYm9uZUludmVyc2VzLnB1c2goZSl9fSxwb3NlOmZ1bmN0aW9uKCl7dmFyIGEsYzt2YXIgZT0wO2ZvcihjPXRoaXMuYm9uZXMubGVuZ3RoO2U8YztlKyspKGE9dGhpcy5ib25lc1tlXSkmJmEubWF0cml4V29ybGQuZ2V0SW52ZXJzZSh0aGlzLmJvbmVJbnZlcnNlc1tlXSk7ZT0wO2ZvcihjPXRoaXMuYm9uZXMubGVuZ3RoO2U8YztlKyspaWYoYT10aGlzLmJvbmVzW2VdKWEucGFyZW50JiZhLnBhcmVudC5pc0JvbmU/KGEubWF0cml4LmdldEludmVyc2UoYS5wYXJlbnQubWF0cml4V29ybGQpLGEubWF0cml4Lm11bHRpcGx5KGEubWF0cml4V29ybGQpKToKYS5tYXRyaXguY29weShhLm1hdHJpeFdvcmxkKSxhLm1hdHJpeC5kZWNvbXBvc2UoYS5wb3NpdGlvbixhLnF1YXRlcm5pb24sYS5zY2FsZSl9LHVwZGF0ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLmJvbmVzLGM9dGhpcy5ib25lSW52ZXJzZXMsZT10aGlzLmJvbmVNYXRyaWNlcyxnPXRoaXMuYm9uZVRleHR1cmUscj0wLHY9YS5sZW5ndGg7cjx2O3IrKyluay5tdWx0aXBseU1hdHJpY2VzKGFbcl0/YVtyXS5tYXRyaXhXb3JsZDpJbSxjW3JdKSxuay50b0FycmF5KGUsMTYqcik7dm9pZCAwIT09ZyYmKGcubmVlZHNVcGRhdGU9ITApfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybiBuZXcgQ2codGhpcy5ib25lcyx0aGlzLmJvbmVJbnZlcnNlcyl9LGdldEJvbmVCeU5hbWU6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTAsZT10aGlzLmJvbmVzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz10aGlzLmJvbmVzW2NdO2lmKGcubmFtZT09PWEpcmV0dXJuIGd9fX0pO1VoLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6VWgsaXNCb25lOiEwfSk7RmIucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO0ZiLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1GYjtGYi5wcm90b3R5cGUuaXNMaW5lQmFzaWNNYXRlcmlhbD0hMDtGYi5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5saW5ld2lkdGg9YS5saW5ld2lkdGg7dGhpcy5saW5lY2FwPWEubGluZWNhcDt0aGlzLmxpbmVqb2luPWEubGluZWpvaW47cmV0dXJuIHRoaXN9O3ZhciBvaz1uZXcgayxwaz1uZXcgayxxaz1uZXcgcSx0aD1uZXcgRCxvZz1uZXcgRztWYi5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VmIsaXNMaW5lOiEwLGNvbXB1dGVMaW5lRGlzdGFuY2VzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZW9tZXRyeTtpZihhLmlzQnVmZmVyR2VvbWV0cnkpaWYobnVsbD09PQphLmluZGV4KXtmb3IodmFyIGM9YS5hdHRyaWJ1dGVzLnBvc2l0aW9uLGU9WzBdLGc9MSxyPWMuY291bnQ7ZzxyO2crKylvay5mcm9tQnVmZmVyQXR0cmlidXRlKGMsZy0xKSxway5mcm9tQnVmZmVyQXR0cmlidXRlKGMsZyksZVtnXT1lW2ctMV0sZVtnXSs9b2suZGlzdGFuY2VUbyhwayk7YS5hZGRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IGNhKGUsMSkpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5MaW5lLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCk6IENvbXB1dGF0aW9uIG9ubHkgcG9zc2libGUgd2l0aCBub24taW5kZXhlZCBCdWZmZXJHZW9tZXRyeS4iKTtlbHNlIGlmKGEuaXNHZW9tZXRyeSlmb3IoYz1hLnZlcnRpY2VzLGU9YS5saW5lRGlzdGFuY2VzLGVbMF09MCxnPTEscj1jLmxlbmd0aDtnPHI7ZysrKWVbZ109ZVtnLTFdLGVbZ10rPWNbZy0xXS5kaXN0YW5jZVRvKGNbZ10pO3JldHVybiB0aGlzfSxyYXljYXN0OmZ1bmN0aW9uKGEsYyl7dmFyIGU9YS5saW5lUHJlY2lzaW9uLApnPXRoaXMuZ2VvbWV0cnkscj10aGlzLm1hdHJpeFdvcmxkO251bGw9PT1nLmJvdW5kaW5nU3BoZXJlJiZnLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO29nLmNvcHkoZy5ib3VuZGluZ1NwaGVyZSk7b2cuYXBwbHlNYXRyaXg0KHIpO29nLnJhZGl1cys9ZTtpZighMSE9PWEucmF5LmludGVyc2VjdHNTcGhlcmUob2cpKXtxay5nZXRJbnZlcnNlKHIpO3RoLmNvcHkoYS5yYXkpLmFwcGx5TWF0cml4NChxayk7ZS89KHRoaXMuc2NhbGUueCt0aGlzLnNjYWxlLnkrdGhpcy5zY2FsZS56KS8zO2UqPWU7dmFyIHY9bmV3IGssej1uZXcgaztyPW5ldyBrO3ZhciBFPW5ldyBrLEY9dGhpcyYmdGhpcy5pc0xpbmVTZWdtZW50cz8yOjE7aWYoZy5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgSj1nLmluZGV4LFA9Zy5hdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5O2lmKG51bGwhPT1KKXtKPUouYXJyYXk7Zz0wO2Zvcih2YXIgUj1KLmxlbmd0aC0xO2c8UjtnKz1GKXt2YXIgUz1KW2crMV07di5mcm9tQXJyYXkoUCwKMypKW2ddKTt6LmZyb21BcnJheShQLDMqUyk7Uz10aC5kaXN0YW5jZVNxVG9TZWdtZW50KHYseixFLHIpO1M+ZXx8KEUuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLFM9YS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oRSksUzxhLm5lYXJ8fFM+YS5mYXJ8fGMucHVzaCh7ZGlzdGFuY2U6Uyxwb2ludDpyLmNsb25lKCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLGluZGV4OmcsZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSkpfX1lbHNlIGZvcihnPTAsUj1QLmxlbmd0aC8zLTE7ZzxSO2crPUYpdi5mcm9tQXJyYXkoUCwzKmcpLHouZnJvbUFycmF5KFAsMypnKzMpLFM9dGguZGlzdGFuY2VTcVRvU2VnbWVudCh2LHosRSxyKSxTPmV8fChFLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSxTPWEucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKEUpLFM8YS5uZWFyfHxTPmEuZmFyfHxjLnB1c2goe2Rpc3RhbmNlOlMscG9pbnQ6ci5jbG9uZSgpLmFwcGx5TWF0cml4NCh0aGlzLm1hdHJpeFdvcmxkKSwKaW5kZXg6ZyxmYWNlOm51bGwsZmFjZUluZGV4Om51bGwsb2JqZWN0OnRoaXN9KSl9ZWxzZSBpZihnLmlzR2VvbWV0cnkpZm9yKHY9Zy52ZXJ0aWNlcyx6PXYubGVuZ3RoLGc9MDtnPHotMTtnKz1GKVM9dGguZGlzdGFuY2VTcVRvU2VnbWVudCh2W2ddLHZbZysxXSxFLHIpLFM+ZXx8KEUuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLFM9YS5yYXkub3JpZ2luLmRpc3RhbmNlVG8oRSksUzxhLm5lYXJ8fFM+YS5mYXJ8fGMucHVzaCh7ZGlzdGFuY2U6Uyxwb2ludDpyLmNsb25lKCkuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpLGluZGV4OmcsZmFjZTpudWxsLGZhY2VJbmRleDpudWxsLG9iamVjdDp0aGlzfSkpfX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTt2YXIgdWg9bmV3IGssdmg9bmV3IGs7SWIucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShWYi5wcm90b3R5cGUpLAp7Y29uc3RydWN0b3I6SWIsaXNMaW5lU2VnbWVudHM6ITAsY29tcHV0ZUxpbmVEaXN0YW5jZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmdlb21ldHJ5O2lmKGEuaXNCdWZmZXJHZW9tZXRyeSlpZihudWxsPT09YS5pbmRleCl7Zm9yKHZhciBjPWEuYXR0cmlidXRlcy5wb3NpdGlvbixlPVtdLGc9MCxyPWMuY291bnQ7ZzxyO2crPTIpdWguZnJvbUJ1ZmZlckF0dHJpYnV0ZShjLGcpLHZoLmZyb21CdWZmZXJBdHRyaWJ1dGUoYyxnKzEpLGVbZ109MD09PWc/MDplW2ctMV0sZVtnKzFdPWVbZ10rdWguZGlzdGFuY2VUbyh2aCk7YS5hZGRBdHRyaWJ1dGUoImxpbmVEaXN0YW5jZSIsbmV3IGNhKGUsMSkpfWVsc2UgY29uc29sZS53YXJuKCJUSFJFRS5MaW5lU2VnbWVudHMuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTogQ29tcHV0YXRpb24gb25seSBwb3NzaWJsZSB3aXRoIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5LiIpO2Vsc2UgaWYoYS5pc0dlb21ldHJ5KWZvcihjPWEudmVydGljZXMsZT0KYS5saW5lRGlzdGFuY2VzLGc9MCxyPWMubGVuZ3RoO2c8cjtnKz0yKXVoLmNvcHkoY1tnXSksdmguY29weShjW2crMV0pLGVbZ109MD09PWc/MDplW2ctMV0sZVtnKzFdPWVbZ10rdWguZGlzdGFuY2VUbyh2aCk7cmV0dXJuIHRoaXN9fSk7RGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShWYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpEZyxpc0xpbmVMb29wOiEwfSk7QWMucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO0FjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1BYztBYy5wcm90b3R5cGUuaXNQb2ludHNNYXRlcmlhbD0hMDtBYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtNLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5tYXA9YS5tYXA7dGhpcy5zaXplPWEuc2l6ZTt0aGlzLnNpemVBdHRlbnVhdGlvbj1hLnNpemVBdHRlbnVhdGlvbjt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czsKcmV0dXJuIHRoaXN9O3ZhciByaz1uZXcgcSxXaD1uZXcgRCxwZz1uZXcgRyx3aD1uZXcgaztDZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6Q2UsaXNQb2ludHM6ITAscmF5Y2FzdDpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZ2VvbWV0cnksZz10aGlzLm1hdHJpeFdvcmxkLHI9YS5wYXJhbXMuUG9pbnRzLnRocmVzaG9sZDtudWxsPT09ZS5ib3VuZGluZ1NwaGVyZSYmZS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTtwZy5jb3B5KGUuYm91bmRpbmdTcGhlcmUpO3BnLmFwcGx5TWF0cml4NChnKTtwZy5yYWRpdXMrPXI7aWYoITEhPT1hLnJheS5pbnRlcnNlY3RzU3BoZXJlKHBnKSlpZihyay5nZXRJbnZlcnNlKGcpLFdoLmNvcHkoYS5yYXkpLmFwcGx5TWF0cml4NChyayksci89KHRoaXMuc2NhbGUueCt0aGlzLnNjYWxlLnkrdGhpcy5zY2FsZS56KS8zLHIqPXIsZS5pc0J1ZmZlckdlb21ldHJ5KXt2YXIgdj1lLmluZGV4OwplPWUuYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTtpZihudWxsIT09dil7dmFyIHo9di5hcnJheTt2PTA7Zm9yKHZhciBFPXoubGVuZ3RoO3Y8RTt2Kyspe3ZhciBGPXpbdl07d2guZnJvbUFycmF5KGUsMypGKTtWaCh3aCxGLHIsZyxhLGMsdGhpcyl9fWVsc2UgZm9yKHY9MCx6PWUubGVuZ3RoLzM7djx6O3YrKyl3aC5mcm9tQXJyYXkoZSwzKnYpLFZoKHdoLHYscixnLGEsYyx0aGlzKX1lbHNlIGZvcihlPWUudmVydGljZXMsdj0wLHo9ZS5sZW5ndGg7djx6O3YrKylWaChlW3ZdLHYscixnLGEsYyx0aGlzKX0sdXBkYXRlTW9ycGhUYXJnZXRzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZW9tZXRyeTtpZihhLmlzQnVmZmVyR2VvbWV0cnkpe2E9YS5tb3JwaEF0dHJpYnV0ZXM7dmFyIGM9T2JqZWN0LmtleXMoYSk7aWYoMDxjLmxlbmd0aCl7dmFyIGU9YVtjWzBdXTtpZih2b2lkIDAhPT1lKWZvcih0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcz1bXSx0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeT0Ke30sYT0wLGM9ZS5sZW5ndGg7YTxjO2ErKyl7dmFyIGc9ZVthXS5uYW1lfHxTdHJpbmcoYSk7dGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMucHVzaCgwKTt0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVtnXT1hfX19ZWxzZSBhPWEubW9ycGhUYXJnZXRzLHZvaWQgMCE9PWEmJjA8YS5sZW5ndGgmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLlBvaW50cy51cGRhdGVNb3JwaFRhcmdldHMoKSBkb2VzIG5vdCBzdXBwb3J0IFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5nZW9tZXRyeSx0aGlzLm1hdGVyaWFsKSkuY29weSh0aGlzKX19KTtYaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGwucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6WGgsaXNWaWRlb1RleHR1cmU6ITAsdXBkYXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5pbWFnZTthLnJlYWR5U3RhdGU+PQphLkhBVkVfQ1VSUkVOVF9EQVRBJiYodGhpcy5uZWVkc1VwZGF0ZT0hMCl9fSk7RGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO0RlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1EZTtEZS5wcm90b3R5cGUuaXNDb21wcmVzc2VkVGV4dHVyZT0hMDtDZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShsLnByb3RvdHlwZSk7Q2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPUNmO0NmLnByb3RvdHlwZS5pc0NhbnZhc1RleHR1cmU9ITA7RGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUobC5wcm90b3R5cGUpO0RmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1EZjtEZi5wcm90b3R5cGUuaXNEZXB0aFRleHR1cmU9ITA7RWUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtFZS5wcm90b3R5cGUuY29uc3RydWN0b3I9RWU7RWYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtFZi5wcm90b3R5cGUuY29uc3RydWN0b3I9RWY7RmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTsKRmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZlO0ZmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7RmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZmO2pjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7amMucHJvdG90eXBlLmNvbnN0cnVjdG9yPWpjO0dmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7R2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPUdmO0dlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGpjLnByb3RvdHlwZSk7R2UucHJvdG90eXBlLmNvbnN0cnVjdG9yPUdlO0hmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7SGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPUhmO1JkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGpjLnByb3RvdHlwZSk7UmQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJkO0lmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7SWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPQpJZjtIZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShqYy5wcm90b3R5cGUpO0hlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1IZTtKZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO0pmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1KZjtJZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShqYy5wcm90b3R5cGUpO0llLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1JZTtLZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO0tmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1LZjtTZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO1NkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1TZDtTZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9dmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EucGF0aD10aGlzLnBhcmFtZXRlcnMucGF0aC50b0pTT04oKTtyZXR1cm4gYX07TGYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTsKTGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPUxmO0plLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7SmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPUplO01mLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7TWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPU1mO0tlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7S2UucHJvdG90eXBlLmNvbnN0cnVjdG9yPUtlO3ZhciBKbT17dHJpYW5ndWxhdGU6ZnVuY3Rpb24oYSxjLGUpe2U9ZXx8Mjt2YXIgZz1jJiZjLmxlbmd0aCxyPWc/Y1swXSplOmEubGVuZ3RoLHY9R2ooYSwwLHIsZSwhMCksej1bXTtpZighdnx8di5uZXh0PT09di5wcmV2KXJldHVybiB6O2cmJih2PWRtKGEsYyx2LGUpKTtpZihhLmxlbmd0aD44MCplKXt2YXIgRT1jPWFbMF07dmFyIEY9Zz1hWzFdO2Zvcih2YXIgSj1lO0o8cjtKKz1lKXt2YXIgUD1hW0pdO3ZhciBSPWFbSisxXTtQPEUmJihFPVApO1I8RiYmKEY9Uik7ClA+YyYmKGM9UCk7Uj5nJiYoZz1SKX1QPU1hdGgubWF4KGMtRSxnLUYpO1A9MCE9PVA/MS9QOjB9UGYodix6LGUsRSxGLFApO3JldHVybiB6fX0sZWQ9e2FyZWE6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWEubGVuZ3RoLGU9MCxnPWMtMSxyPTA7cjxjO2c9cisrKWUrPWFbZ10ueCphW3JdLnktYVtyXS54KmFbZ10ueTtyZXR1cm4uNSplfSxpc0Nsb2NrV2lzZTpmdW5jdGlvbihhKXtyZXR1cm4gMD5lZC5hcmVhKGEpfSx0cmlhbmd1bGF0ZVNoYXBlOmZ1bmN0aW9uKGEsYyl7dmFyIGU9W10sZz1bXSxyPVtdO0tqKGEpO0xqKGUsYSk7dmFyIHY9YS5sZW5ndGg7Yy5mb3JFYWNoKEtqKTtmb3IoYT0wO2E8Yy5sZW5ndGg7YSsrKWcucHVzaCh2KSx2Kz1jW2FdLmxlbmd0aCxMaihlLGNbYV0pO2M9Sm0udHJpYW5ndWxhdGUoZSxnKTtmb3IoYT0wO2E8Yy5sZW5ndGg7YSs9MylyLnB1c2goYy5zbGljZShhLGErMykpO3JldHVybiByfX07VWQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTsKVWQucHJvdG90eXBlLmNvbnN0cnVjdG9yPVVkO1VkLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT15YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7cmV0dXJuIE1qKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsdGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnMsYSl9O1JjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7UmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJjO1JjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT12YS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7cmV0dXJuIE1qKHRoaXMucGFyYW1ldGVycy5zaGFwZXMsdGhpcy5wYXJhbWV0ZXJzLm9wdGlvbnMsYSl9O3ZhciBsbT17Z2VuZXJhdGVUb3BVVjpmdW5jdGlvbihhLGMsZSxnLHIpe2E9Y1szKmddO2c9Y1szKmcrMV07dmFyIHY9Y1szKnJdO3I9Y1szKnIrMV07cmV0dXJuW25ldyBmKGNbMyplXSxjWzMqZSsxXSksbmV3IGYoYSxnKSxuZXcgZih2LHIpXX0sZ2VuZXJhdGVTaWRlV2FsbFVWOmZ1bmN0aW9uKGEsCmMsZSxnLHIsdil7YT1jWzMqZV07dmFyIHo9Y1szKmUrMV07ZT1jWzMqZSsyXTt2YXIgRT1jWzMqZ10sRj1jWzMqZysxXTtnPWNbMypnKzJdO3ZhciBKPWNbMypyXSxQPWNbMypyKzFdO3I9Y1szKnIrMl07dmFyIFI9Y1szKnZdLFM9Y1szKnYrMV07Yz1jWzMqdisyXTtyZXR1cm4uMDE+TWF0aC5hYnMoei1GKT9bbmV3IGYoYSwxLWUpLG5ldyBmKEUsMS1nKSxuZXcgZihKLDEtciksbmV3IGYoUiwxLWMpXTpbbmV3IGYoeiwxLWUpLG5ldyBmKEYsMS1nKSxuZXcgZihQLDEtciksbmV3IGYoUywxLWMpXX19O1JmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7UmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPVJmO01lLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFJjLnByb3RvdHlwZSk7TWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPU1lO1NmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7U2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNmO0JkLnByb3RvdHlwZT0KT2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO0JkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1CZDtUZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO1RmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1UZjtOZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO05lLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1OZTtVZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO1VmLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VZjtPZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh2YS5wcm90b3R5cGUpO09lLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1PZTtWZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZSh5YS5wcm90b3R5cGUpO1ZkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1WZDtWZC5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9eWEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO3JldHVybiBOaih0aGlzLnBhcmFtZXRlcnMuc2hhcGVzLAphKX07V2QucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtXZC5wcm90b3R5cGUuY29uc3RydWN0b3I9V2Q7V2QucHJvdG90eXBlLnRvSlNPTj1mdW5jdGlvbigpe3ZhciBhPXZhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTtyZXR1cm4gTmoodGhpcy5wYXJhbWV0ZXJzLnNoYXBlcyxhKX07UGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtQZS5wcm90b3R5cGUuY29uc3RydWN0b3I9UGU7WGQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoeWEucHJvdG90eXBlKTtYZC5wcm90b3R5cGUuY29uc3RydWN0b3I9WGQ7ZmQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUodmEucHJvdG90eXBlKTtmZC5wcm90b3R5cGUuY29uc3RydWN0b3I9ZmQ7VmYucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWGQucHJvdG90eXBlKTtWZi5wcm90b3R5cGUuY29uc3RydWN0b3I9VmY7V2YucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZmQucHJvdG90eXBlKTtXZi5wcm90b3R5cGUuY29uc3RydWN0b3I9CldmO1hmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHlhLnByb3RvdHlwZSk7WGYucHJvdG90eXBlLmNvbnN0cnVjdG9yPVhmO1FlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSk7UWUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVFlO3ZhciBnYz1PYmplY3QuZnJlZXplKHtXaXJlZnJhbWVHZW9tZXRyeTpFZSxQYXJhbWV0cmljR2VvbWV0cnk6RWYsUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5OkZlLFRldHJhaGVkcm9uR2VvbWV0cnk6R2YsVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeTpHZSxPY3RhaGVkcm9uR2VvbWV0cnk6SGYsT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5OlJkLEljb3NhaGVkcm9uR2VvbWV0cnk6SWYsSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeTpIZSxEb2RlY2FoZWRyb25HZW9tZXRyeTpKZixEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTpJZSxQb2x5aGVkcm9uR2VvbWV0cnk6RmYsUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OmpjLFR1YmVHZW9tZXRyeTpLZiwKVHViZUJ1ZmZlckdlb21ldHJ5OlNkLFRvcnVzS25vdEdlb21ldHJ5OkxmLFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5OkplLFRvcnVzR2VvbWV0cnk6TWYsVG9ydXNCdWZmZXJHZW9tZXRyeTpLZSxUZXh0R2VvbWV0cnk6UmYsVGV4dEJ1ZmZlckdlb21ldHJ5Ok1lLFNwaGVyZUdlb21ldHJ5OlNmLFNwaGVyZUJ1ZmZlckdlb21ldHJ5OkJkLFJpbmdHZW9tZXRyeTpUZixSaW5nQnVmZmVyR2VvbWV0cnk6TmUsUGxhbmVHZW9tZXRyeTpyZCxQbGFuZUJ1ZmZlckdlb21ldHJ5OkxjLExhdGhlR2VvbWV0cnk6VWYsTGF0aGVCdWZmZXJHZW9tZXRyeTpPZSxTaGFwZUdlb21ldHJ5OlZkLFNoYXBlQnVmZmVyR2VvbWV0cnk6V2QsRXh0cnVkZUdlb21ldHJ5OlVkLEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTpSYyxFZGdlc0dlb21ldHJ5OlBlLENvbmVHZW9tZXRyeTpWZixDb25lQnVmZmVyR2VvbWV0cnk6V2YsQ3lsaW5kZXJHZW9tZXRyeTpYZCxDeWxpbmRlckJ1ZmZlckdlb21ldHJ5OmZkLENpcmNsZUdlb21ldHJ5OlhmLApDaXJjbGVCdWZmZXJHZW9tZXRyeTpRZSxCb3hHZW9tZXRyeTpTYSxCb3hCdWZmZXJHZW9tZXRyeTpYYX0pO1lkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtZZC5wcm90b3R5cGUuY29uc3RydWN0b3I9WWQ7WWQucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWw9ITA7WWQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3JldHVybiB0aGlzfTtSZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShxYi5wcm90b3R5cGUpO1JlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1SZTtSZS5wcm90b3R5cGUuaXNSYXdTaGFkZXJNYXRlcmlhbD0hMDtTYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShNLnByb3RvdHlwZSk7U2MucHJvdG90eXBlLmNvbnN0cnVjdG9yPVNjO1NjLnByb3RvdHlwZS5pc01lc2hTdGFuZGFyZE1hdGVyaWFsPSEwO1NjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLAphKTt0aGlzLmRlZmluZXM9e1NUQU5EQVJEOiIifTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5yb3VnaG5lc3M9YS5yb3VnaG5lc3M7dGhpcy5tZXRhbG5lc3M9YS5tZXRhbG5lc3M7dGhpcy5tYXA9YS5tYXA7dGhpcy5saWdodE1hcD1hLmxpZ2h0TWFwO3RoaXMubGlnaHRNYXBJbnRlbnNpdHk9YS5saWdodE1hcEludGVuc2l0eTt0aGlzLmFvTWFwPWEuYW9NYXA7dGhpcy5hb01hcEludGVuc2l0eT1hLmFvTWFwSW50ZW5zaXR5O3RoaXMuZW1pc3NpdmUuY29weShhLmVtaXNzaXZlKTt0aGlzLmVtaXNzaXZlTWFwPWEuZW1pc3NpdmVNYXA7dGhpcy5lbWlzc2l2ZUludGVuc2l0eT1hLmVtaXNzaXZlSW50ZW5zaXR5O3RoaXMuYnVtcE1hcD1hLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9YS5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9YS5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYS5ub3JtYWxTY2FsZSk7CnRoaXMuZGlzcGxhY2VtZW50TWFwPWEuZGlzcGxhY2VtZW50TWFwO3RoaXMuZGlzcGxhY2VtZW50U2NhbGU9YS5kaXNwbGFjZW1lbnRTY2FsZTt0aGlzLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzO3RoaXMucm91Z2huZXNzTWFwPWEucm91Z2huZXNzTWFwO3RoaXMubWV0YWxuZXNzTWFwPWEubWV0YWxuZXNzTWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmVudk1hcD1hLmVudk1hcDt0aGlzLmVudk1hcEludGVuc2l0eT1hLmVudk1hcEludGVuc2l0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1hLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1hLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1hLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwO3RoaXMud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9CmEubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTtaZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShTYy5wcm90b3R5cGUpO1pkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1aZDtaZC5wcm90b3R5cGUuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbD0hMDtaZC5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtTYy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5kZWZpbmVzPXtTVEFOREFSRDoiIixQSFlTSUNBTDoiIn07dGhpcy5yZWZsZWN0aXZpdHk9YS5yZWZsZWN0aXZpdHk7dGhpcy5jbGVhcmNvYXQ9YS5jbGVhcmNvYXQ7dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3M9YS5jbGVhcmNvYXRSb3VnaG5lc3M7dGhpcy5zaGVlbj1hLnNoZWVuPyh0aGlzLnNoZWVufHxuZXcgSSkuY29weShhLnNoZWVuKTpudWxsO3RoaXMuY2xlYXJjb2F0Tm9ybWFsTWFwPWEuY2xlYXJjb2F0Tm9ybWFsTWFwO3RoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUuY29weShhLmNsZWFyY29hdE5vcm1hbFNjYWxlKTsKdGhpcy50cmFuc3BhcmVuY3k9YS50cmFuc3BhcmVuY3k7cmV0dXJuIHRoaXN9O0JjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtCYy5wcm90b3R5cGUuY29uc3RydWN0b3I9QmM7QmMucHJvdG90eXBlLmlzTWVzaFBob25nTWF0ZXJpYWw9ITA7QmMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7TS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMuc3BlY3VsYXIuY29weShhLnNwZWN1bGFyKTt0aGlzLnNoaW5pbmVzcz1hLnNoaW5pbmVzczt0aGlzLm1hcD1hLm1hcDt0aGlzLmxpZ2h0TWFwPWEubGlnaHRNYXA7dGhpcy5saWdodE1hcEludGVuc2l0eT1hLmxpZ2h0TWFwSW50ZW5zaXR5O3RoaXMuYW9NYXA9YS5hb01hcDt0aGlzLmFvTWFwSW50ZW5zaXR5PWEuYW9NYXBJbnRlbnNpdHk7dGhpcy5lbWlzc2l2ZS5jb3B5KGEuZW1pc3NpdmUpO3RoaXMuZW1pc3NpdmVNYXA9YS5lbWlzc2l2ZU1hcDt0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PQphLmVtaXNzaXZlSW50ZW5zaXR5O3RoaXMuYnVtcE1hcD1hLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9YS5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9YS5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYS5ub3JtYWxTY2FsZSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7dGhpcy5zcGVjdWxhck1hcD1hLnNwZWN1bGFyTWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmVudk1hcD1hLmVudk1hcDt0aGlzLmNvbWJpbmU9YS5jb21iaW5lO3RoaXMucmVmbGVjdGl2aXR5PWEucmVmbGVjdGl2aXR5O3RoaXMucmVmcmFjdGlvblJhdGlvPWEucmVmcmFjdGlvblJhdGlvO3RoaXMud2lyZWZyYW1lPWEud2lyZWZyYW1lO3RoaXMud2lyZWZyYW1lTGluZXdpZHRoPQphLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwO3RoaXMud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHM7cmV0dXJuIHRoaXN9OyRkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEJjLnByb3RvdHlwZSk7JGQucHJvdG90eXBlLmNvbnN0cnVjdG9yPSRkOyRkLnByb3RvdHlwZS5pc01lc2hUb29uTWF0ZXJpYWw9ITA7JGQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7QmMucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZ3JhZGllbnRNYXA9YS5ncmFkaWVudE1hcDtyZXR1cm4gdGhpc307YWUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO2FlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hZTthZS5wcm90b3R5cGUuaXNNZXNoTm9ybWFsTWF0ZXJpYWw9CiEwO2FlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuYnVtcE1hcD1hLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9YS5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9YS5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYS5ub3JtYWxTY2FsZSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7dGhpcy53aXJlZnJhbWU9YS53aXJlZnJhbWU7dGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9YS53aXJlZnJhbWVMaW5ld2lkdGg7dGhpcy5za2lubmluZz1hLnNraW5uaW5nO3RoaXMubW9ycGhUYXJnZXRzPWEubW9ycGhUYXJnZXRzO3RoaXMubW9ycGhOb3JtYWxzPWEubW9ycGhOb3JtYWxzO3JldHVybiB0aGlzfTsKYmUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoTS5wcm90b3R5cGUpO2JlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1iZTtiZS5wcm90b3R5cGUuaXNNZXNoTGFtYmVydE1hdGVyaWFsPSEwO2JlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuY29sb3IuY29weShhLmNvbG9yKTt0aGlzLm1hcD1hLm1hcDt0aGlzLmxpZ2h0TWFwPWEubGlnaHRNYXA7dGhpcy5saWdodE1hcEludGVuc2l0eT1hLmxpZ2h0TWFwSW50ZW5zaXR5O3RoaXMuYW9NYXA9YS5hb01hcDt0aGlzLmFvTWFwSW50ZW5zaXR5PWEuYW9NYXBJbnRlbnNpdHk7dGhpcy5lbWlzc2l2ZS5jb3B5KGEuZW1pc3NpdmUpO3RoaXMuZW1pc3NpdmVNYXA9YS5lbWlzc2l2ZU1hcDt0aGlzLmVtaXNzaXZlSW50ZW5zaXR5PWEuZW1pc3NpdmVJbnRlbnNpdHk7dGhpcy5zcGVjdWxhck1hcD1hLnNwZWN1bGFyTWFwO3RoaXMuYWxwaGFNYXA9YS5hbHBoYU1hcDt0aGlzLmVudk1hcD0KYS5lbnZNYXA7dGhpcy5jb21iaW5lPWEuY29tYmluZTt0aGlzLnJlZmxlY3Rpdml0eT1hLnJlZmxlY3Rpdml0eTt0aGlzLnJlZnJhY3Rpb25SYXRpbz1hLnJlZnJhY3Rpb25SYXRpbzt0aGlzLndpcmVmcmFtZT1hLndpcmVmcmFtZTt0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD1hLndpcmVmcmFtZUxpbmV3aWR0aDt0aGlzLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwO3RoaXMud2lyZWZyYW1lTGluZWpvaW49YS53aXJlZnJhbWVMaW5lam9pbjt0aGlzLnNraW5uaW5nPWEuc2tpbm5pbmc7dGhpcy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHM7dGhpcy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHM7cmV0dXJuIHRoaXN9O2NlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKE0ucHJvdG90eXBlKTtjZS5wcm90b3R5cGUuY29uc3RydWN0b3I9Y2U7Y2UucHJvdG90eXBlLmlzTWVzaE1hdGNhcE1hdGVyaWFsPSEwO2NlLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe00ucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLAphKTt0aGlzLmRlZmluZXM9e01BVENBUDoiIn07dGhpcy5jb2xvci5jb3B5KGEuY29sb3IpO3RoaXMubWF0Y2FwPWEubWF0Y2FwO3RoaXMubWFwPWEubWFwO3RoaXMuYnVtcE1hcD1hLmJ1bXBNYXA7dGhpcy5idW1wU2NhbGU9YS5idW1wU2NhbGU7dGhpcy5ub3JtYWxNYXA9YS5ub3JtYWxNYXA7dGhpcy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZTt0aGlzLm5vcm1hbFNjYWxlLmNvcHkoYS5ub3JtYWxTY2FsZSk7dGhpcy5kaXNwbGFjZW1lbnRNYXA9YS5kaXNwbGFjZW1lbnRNYXA7dGhpcy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlO3RoaXMuZGlzcGxhY2VtZW50Qmlhcz1hLmRpc3BsYWNlbWVudEJpYXM7dGhpcy5hbHBoYU1hcD1hLmFscGhhTWFwO3RoaXMuc2tpbm5pbmc9YS5za2lubmluZzt0aGlzLm1vcnBoVGFyZ2V0cz1hLm1vcnBoVGFyZ2V0czt0aGlzLm1vcnBoTm9ybWFscz1hLm1vcnBoTm9ybWFscztyZXR1cm4gdGhpc307ZGUucHJvdG90eXBlPQpPYmplY3QuY3JlYXRlKEZiLnByb3RvdHlwZSk7ZGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPWRlO2RlLnByb3RvdHlwZS5pc0xpbmVEYXNoZWRNYXRlcmlhbD0hMDtkZS5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtGYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5zY2FsZT1hLnNjYWxlO3RoaXMuZGFzaFNpemU9YS5kYXNoU2l6ZTt0aGlzLmdhcFNpemU9YS5nYXBTaXplO3JldHVybiB0aGlzfTt2YXIgS209T2JqZWN0LmZyZWV6ZSh7U2hhZG93TWF0ZXJpYWw6WWQsU3ByaXRlTWF0ZXJpYWw6QWQsUmF3U2hhZGVyTWF0ZXJpYWw6UmUsU2hhZGVyTWF0ZXJpYWw6cWIsUG9pbnRzTWF0ZXJpYWw6QWMsTWVzaFBoeXNpY2FsTWF0ZXJpYWw6WmQsTWVzaFN0YW5kYXJkTWF0ZXJpYWw6U2MsTWVzaFBob25nTWF0ZXJpYWw6QmMsTWVzaFRvb25NYXRlcmlhbDokZCxNZXNoTm9ybWFsTWF0ZXJpYWw6YWUsTWVzaExhbWJlcnRNYXRlcmlhbDpiZSxNZXNoRGVwdGhNYXRlcmlhbDp2ZCwKTWVzaERpc3RhbmNlTWF0ZXJpYWw6d2QsTWVzaEJhc2ljTWF0ZXJpYWw6TCxNZXNoTWF0Y2FwTWF0ZXJpYWw6Y2UsTGluZURhc2hlZE1hdGVyaWFsOmRlLExpbmVCYXNpY01hdGVyaWFsOkZiLE1hdGVyaWFsOk19KSxUYj17YXJyYXlTbGljZTpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIFRiLmlzVHlwZWRBcnJheShhKT9uZXcgYS5jb25zdHJ1Y3RvcihhLnN1YmFycmF5KGMsdm9pZCAwIT09ZT9lOmEubGVuZ3RoKSk6YS5zbGljZShjLGUpfSxjb252ZXJ0QXJyYXk6ZnVuY3Rpb24oYSxjLGUpe3JldHVybiFhfHwhZSYmYS5jb25zdHJ1Y3Rvcj09PWM/YToibnVtYmVyIj09PXR5cGVvZiBjLkJZVEVTX1BFUl9FTEVNRU5UP25ldyBjKGEpOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGEpfSxpc1R5cGVkQXJyYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyhhKSYmIShhIGluc3RhbmNlb2YgRGF0YVZpZXcpfSxnZXRLZXlmcmFtZU9yZGVyOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0KYS5sZW5ndGgsZT1BcnJheShjKSxnPTA7ZyE9PWM7KytnKWVbZ109ZztlLnNvcnQoZnVuY3Rpb24ocix2KXtyZXR1cm4gYVtyXS1hW3ZdfSk7cmV0dXJuIGV9LHNvcnRlZEFycmF5OmZ1bmN0aW9uKGEsYyxlKXtmb3IodmFyIGc9YS5sZW5ndGgscj1uZXcgYS5jb25zdHJ1Y3RvcihnKSx2PTAsej0wO3ohPT1nOysrdilmb3IodmFyIEU9ZVt2XSpjLEY9MDtGIT09YzsrK0Ypclt6KytdPWFbRStGXTtyZXR1cm4gcn0sZmxhdHRlbkpTT046ZnVuY3Rpb24oYSxjLGUsZyl7Zm9yKHZhciByPTEsdj1hWzBdO3ZvaWQgMCE9PXYmJnZvaWQgMD09PXZbZ107KXY9YVtyKytdO2lmKHZvaWQgMCE9PXYpe3ZhciB6PXZbZ107aWYodm9pZCAwIT09eilpZihBcnJheS5pc0FycmF5KHopKXtkbyB6PXZbZ10sdm9pZCAwIT09eiYmKGMucHVzaCh2LnRpbWUpLGUucHVzaC5hcHBseShlLHopKSx2PWFbcisrXTt3aGlsZSh2b2lkIDAhPT12KX1lbHNlIGlmKHZvaWQgMCE9PXoudG9BcnJheSl7ZG8gej12W2ddLAp2b2lkIDAhPT16JiYoYy5wdXNoKHYudGltZSksei50b0FycmF5KGUsZS5sZW5ndGgpKSx2PWFbcisrXTt3aGlsZSh2b2lkIDAhPT12KX1lbHNle2RvIHo9dltnXSx2b2lkIDAhPT16JiYoYy5wdXNoKHYudGltZSksZS5wdXNoKHopKSx2PWFbcisrXTt3aGlsZSh2b2lkIDAhPT12KX19fX07T2JqZWN0LmFzc2lnbihvYy5wcm90b3R5cGUse2V2YWx1YXRlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMucGFyYW1ldGVyUG9zaXRpb25zLGU9dGhpcy5fY2FjaGVkSW5kZXgsZz1jW2VdLHI9Y1tlLTFdO2E6e2I6e2M6e2Q6aWYoIShhPGcpKXtmb3IodmFyIHY9ZSsyOzspe2lmKHZvaWQgMD09PWcpe2lmKGE8cilicmVhayBkO3RoaXMuX2NhY2hlZEluZGV4PWU9Yy5sZW5ndGg7cmV0dXJuIHRoaXMuYWZ0ZXJFbmRfKGUtMSxhLHIpfWlmKGU9PT12KWJyZWFrO3I9ZztnPWNbKytlXTtpZihhPGcpYnJlYWsgYn1nPWMubGVuZ3RoO2JyZWFrIGN9aWYoYT49cilicmVhayBhO2Vsc2V7dj1jWzFdO2E8diYmCihlPTIscj12KTtmb3Iodj1lLTI7Oyl7aWYodm9pZCAwPT09cilyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmJlZm9yZVN0YXJ0XygwLGEsZyk7aWYoZT09PXYpYnJlYWs7Zz1yO3I9Y1stLWUtMV07aWYoYT49cilicmVhayBifWc9ZTtlPTB9fWZvcig7ZTxnOylyPWUrZz4+PjEsYTxjW3JdP2c9cjplPXIrMTtnPWNbZV07cj1jW2UtMV07aWYodm9pZCAwPT09cilyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9MCx0aGlzLmJlZm9yZVN0YXJ0XygwLGEsZyk7aWYodm9pZCAwPT09ZylyZXR1cm4gdGhpcy5fY2FjaGVkSW5kZXg9ZT1jLmxlbmd0aCx0aGlzLmFmdGVyRW5kXyhlLTEscixhKX10aGlzLl9jYWNoZWRJbmRleD1lO3RoaXMuaW50ZXJ2YWxDaGFuZ2VkXyhlLHIsZyl9cmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVfKGUscixhLGcpfSxzZXR0aW5nczpudWxsLERlZmF1bHRTZXR0aW5nc186e30sZ2V0U2V0dGluZ3NfOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2V0dGluZ3N8fAp0aGlzLkRlZmF1bHRTZXR0aW5nc199LGNvcHlTYW1wbGVWYWx1ZV86ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5yZXN1bHRCdWZmZXIsZT10aGlzLnNhbXBsZVZhbHVlcyxnPXRoaXMudmFsdWVTaXplO2EqPWc7Zm9yKHZhciByPTA7ciE9PWc7KytyKWNbcl09ZVthK3JdO3JldHVybiBjfSxpbnRlcnBvbGF0ZV86ZnVuY3Rpb24oKXt0aHJvdyBFcnJvcigiY2FsbCB0byBhYnN0cmFjdCBtZXRob2QiKTt9LGludGVydmFsQ2hhbmdlZF86ZnVuY3Rpb24oKXt9fSk7T2JqZWN0LmFzc2lnbihvYy5wcm90b3R5cGUse2JlZm9yZVN0YXJ0XzpvYy5wcm90b3R5cGUuY29weVNhbXBsZVZhbHVlXyxhZnRlckVuZF86b2MucHJvdG90eXBlLmNvcHlTYW1wbGVWYWx1ZV99KTtFZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG9jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkVnLERlZmF1bHRTZXR0aW5nc186e2VuZGluZ1N0YXJ0OjI0MDAsZW5kaW5nRW5kOjI0MDB9LGludGVydmFsQ2hhbmdlZF86ZnVuY3Rpb24oYSwKYyxlKXt2YXIgZz10aGlzLnBhcmFtZXRlclBvc2l0aW9ucyxyPWEtMix2PWErMSx6PWdbcl0sRT1nW3ZdO2lmKHZvaWQgMD09PXopc3dpdGNoKHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3RhcnQpe2Nhc2UgMjQwMTpyPWE7ej0yKmMtZTticmVhaztjYXNlIDI0MDI6cj1nLmxlbmd0aC0yO3o9YytnW3JdLWdbcisxXTticmVhaztkZWZhdWx0OnI9YSx6PWV9aWYodm9pZCAwPT09RSlzd2l0Y2godGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQpe2Nhc2UgMjQwMTp2PWE7RT0yKmUtYzticmVhaztjYXNlIDI0MDI6dj0xO0U9ZStnWzFdLWdbMF07YnJlYWs7ZGVmYXVsdDp2PWEtMSxFPWN9YT0uNSooZS1jKTtnPXRoaXMudmFsdWVTaXplO3RoaXMuX3dlaWdodFByZXY9YS8oYy16KTt0aGlzLl93ZWlnaHROZXh0PWEvKEUtZSk7dGhpcy5fb2Zmc2V0UHJldj1yKmc7dGhpcy5fb2Zmc2V0TmV4dD12Kmd9LGludGVycG9sYXRlXzpmdW5jdGlvbihhLGMsZSxnKXt2YXIgcj10aGlzLnJlc3VsdEJ1ZmZlciwKdj10aGlzLnNhbXBsZVZhbHVlcyx6PXRoaXMudmFsdWVTaXplO2EqPXo7dmFyIEU9YS16LEY9dGhpcy5fb2Zmc2V0UHJldixKPXRoaXMuX29mZnNldE5leHQsUD10aGlzLl93ZWlnaHRQcmV2LFI9dGhpcy5fd2VpZ2h0TmV4dCxTPShlLWMpLyhnLWMpO2U9UypTO2c9ZSpTO2M9LVAqZysyKlAqZS1QKlM7UD0oMStQKSpnKygtMS41LTIqUCkqZSsoLS41K1ApKlMrMTtTPSgtMS1SKSpnKygxLjUrUikqZSsuNSpTO1I9UipnLVIqZTtmb3IoZT0wO2UhPT16OysrZSlyW2VdPWMqdltGK2VdK1AqdltFK2VdK1MqdlthK2VdK1IqdltKK2VdO3JldHVybiByfX0pO1lmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUob2MucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6WWYsaW50ZXJwb2xhdGVfOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMucmVzdWx0QnVmZmVyLHY9dGhpcy5zYW1wbGVWYWx1ZXMsej10aGlzLnZhbHVlU2l6ZTthKj16O3ZhciBFPWEtejtjPShlLWMpLyhnLQpjKTtlPTEtYztmb3IoZz0wO2chPT16OysrZylyW2ddPXZbRStnXSplK3ZbYStnXSpjO3JldHVybiByfX0pO0ZnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUob2MucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6RmcsaW50ZXJwb2xhdGVfOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLmNvcHlTYW1wbGVWYWx1ZV8oYS0xKX19KTtPYmplY3QuYXNzaWduKFhiLHt0b0pTT046ZnVuY3Rpb24oYSl7dmFyIGM9YS5jb25zdHJ1Y3RvcjtpZih2b2lkIDAhPT1jLnRvSlNPTiljPWMudG9KU09OKGEpO2Vsc2V7Yz17bmFtZTphLm5hbWUsdGltZXM6VGIuY29udmVydEFycmF5KGEudGltZXMsQXJyYXkpLHZhbHVlczpUYi5jb252ZXJ0QXJyYXkoYS52YWx1ZXMsQXJyYXkpfTt2YXIgZT1hLmdldEludGVycG9sYXRpb24oKTtlIT09YS5EZWZhdWx0SW50ZXJwb2xhdGlvbiYmKGMuaW50ZXJwb2xhdGlvbj1lKX1jLnR5cGU9YS5WYWx1ZVR5cGVOYW1lO3JldHVybiBjfX0pO09iamVjdC5hc3NpZ24oWGIucHJvdG90eXBlLAp7Y29uc3RydWN0b3I6WGIsVGltZUJ1ZmZlclR5cGU6RmxvYXQzMkFycmF5LFZhbHVlQnVmZmVyVHlwZTpGbG9hdDMyQXJyYXksRGVmYXVsdEludGVycG9sYXRpb246MjMwMSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IEZnKHRoaXMudGltZXMsdGhpcy52YWx1ZXMsdGhpcy5nZXRWYWx1ZVNpemUoKSxhKX0sSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOmZ1bmN0aW9uKGEpe3JldHVybiBuZXcgWWYodGhpcy50aW1lcyx0aGlzLnZhbHVlcyx0aGlzLmdldFZhbHVlU2l6ZSgpLGEpfSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBFZyh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksYSl9LHNldEludGVycG9sYXRpb246ZnVuY3Rpb24oYSl7c3dpdGNoKGEpe2Nhc2UgMjMwMDp2YXIgYz10aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOwpicmVhaztjYXNlIDIzMDE6Yz10aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjticmVhaztjYXNlIDIzMDI6Yz10aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aH1pZih2b2lkIDA9PT1jKXtjPSJ1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciAiK3RoaXMuVmFsdWVUeXBlTmFtZSsiIGtleWZyYW1lIHRyYWNrIG5hbWVkICIrdGhpcy5uYW1lO2lmKHZvaWQgMD09PXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpaWYoYSE9PXRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pdGhpcy5zZXRJbnRlcnBvbGF0aW9uKHRoaXMuRGVmYXVsdEludGVycG9sYXRpb24pO2Vsc2UgdGhyb3cgRXJyb3IoYyk7Y29uc29sZS53YXJuKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiIsYyk7cmV0dXJuIHRoaXN9dGhpcy5jcmVhdGVJbnRlcnBvbGFudD1jO3JldHVybiB0aGlzfSxnZXRJbnRlcnBvbGF0aW9uOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQpe2Nhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2REaXNjcmV0ZTpyZXR1cm4gMjMwMDsKY2FzZSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjpyZXR1cm4gMjMwMTtjYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnJldHVybiAyMzAyfX0sZ2V0VmFsdWVTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aC90aGlzLnRpbWVzLmxlbmd0aH0sc2hpZnQ6ZnVuY3Rpb24oYSl7aWYoMCE9PWEpZm9yKHZhciBjPXRoaXMudGltZXMsZT0wLGc9Yy5sZW5ndGg7ZSE9PWc7KytlKWNbZV0rPWE7cmV0dXJuIHRoaXN9LHNjYWxlOmZ1bmN0aW9uKGEpe2lmKDEhPT1hKWZvcih2YXIgYz10aGlzLnRpbWVzLGU9MCxnPWMubGVuZ3RoO2UhPT1nOysrZSljW2VdKj1hO3JldHVybiB0aGlzfSx0cmltOmZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPXRoaXMudGltZXMsZz1lLmxlbmd0aCxyPTAsdj1nLTE7ciE9PWcmJmVbcl08YTspKytyO2Zvcig7LTEhPT12JiZlW3ZdPmM7KS0tdjsrK3Y7aWYoMCE9PXJ8fHYhPT1nKXI+PXYmJih2PU1hdGgubWF4KHYsCjEpLHI9di0xKSxhPXRoaXMuZ2V0VmFsdWVTaXplKCksdGhpcy50aW1lcz1UYi5hcnJheVNsaWNlKGUscix2KSx0aGlzLnZhbHVlcz1UYi5hcnJheVNsaWNlKHRoaXMudmFsdWVzLHIqYSx2KmEpO3JldHVybiB0aGlzfSx2YWxpZGF0ZTpmdW5jdGlvbigpe3ZhciBhPSEwLGM9dGhpcy5nZXRWYWx1ZVNpemUoKTswIT09Yy1NYXRoLmZsb29yKGMpJiYoY29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogSW52YWxpZCB2YWx1ZSBzaXplIGluIHRyYWNrLiIsdGhpcyksYT0hMSk7dmFyIGU9dGhpcy50aW1lcztjPXRoaXMudmFsdWVzO3ZhciBnPWUubGVuZ3RoOzA9PT1nJiYoY29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVHJhY2sgaXMgZW1wdHkuIix0aGlzKSxhPSExKTtmb3IodmFyIHI9bnVsbCx2PTA7diE9PWc7disrKXt2YXIgej1lW3ZdO2lmKCJudW1iZXIiPT09dHlwZW9mIHomJmlzTmFOKHopKXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBUaW1lIGlzIG5vdCBhIHZhbGlkIG51bWJlci4iLAp0aGlzLHYseik7YT0hMTticmVha31pZihudWxsIT09ciYmcj56KXtjb25zb2xlLmVycm9yKCJUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4iLHRoaXMsdix6LHIpO2E9ITE7YnJlYWt9cj16fWlmKHZvaWQgMCE9PWMmJlRiLmlzVHlwZWRBcnJheShjKSlmb3Iodj0wLGU9Yy5sZW5ndGg7diE9PWU7Kyt2KWlmKGc9Y1t2XSxpc05hTihnKSl7Y29uc29sZS5lcnJvcigiVEhSRUUuS2V5ZnJhbWVUcmFjazogVmFsdWUgaXMgbm90IGEgdmFsaWQgbnVtYmVyLiIsdGhpcyx2LGcpO2E9ITE7YnJlYWt9cmV0dXJuIGF9LG9wdGltaXplOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMudGltZXMsYz10aGlzLnZhbHVlcyxlPXRoaXMuZ2V0VmFsdWVTaXplKCksZz0yMzAyPT09dGhpcy5nZXRJbnRlcnBvbGF0aW9uKCkscj0xLHY9YS5sZW5ndGgtMSx6PTE7ejx2Oysreil7dmFyIEU9ITEsRj1hW3pdO2lmKEYhPT1hW3orMV0mJigxIT09enx8RiE9PUZbMF0pKWlmKGcpRT0hMDsKZWxzZXt2YXIgSj16KmUsUD1KLWUsUj1KK2U7Zm9yKEY9MDtGIT09ZTsrK0Ype3ZhciBTPWNbSitGXTtpZihTIT09Y1tQK0ZdfHxTIT09Y1tSK0ZdKXtFPSEwO2JyZWFrfX19aWYoRSl7aWYoeiE9PXIpZm9yKGFbcl09YVt6XSxFPXoqZSxKPXIqZSxGPTA7RiE9PWU7KytGKWNbSitGXT1jW0UrRl07KytyfX1pZigwPHYpe2Fbcl09YVt2XTtFPXYqZTtKPXIqZTtmb3IoRj0wO0YhPT1lOysrRiljW0orRl09Y1tFK0ZdOysrcn1yIT09YS5sZW5ndGgmJih0aGlzLnRpbWVzPVRiLmFycmF5U2xpY2UoYSwwLHIpLHRoaXMudmFsdWVzPVRiLmFycmF5U2xpY2UoYywwLHIqZSkpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3ZhciBhPVRiLmFycmF5U2xpY2UodGhpcy50aW1lcywwKSxjPVRiLmFycmF5U2xpY2UodGhpcy52YWx1ZXMsMCk7YT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLm5hbWUsYSxjKTthLmNyZWF0ZUludGVycG9sYW50PXRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ7cmV0dXJuIGF9fSk7CkdnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6R2csVmFsdWVUeXBlTmFtZToiYm9vbCIsVmFsdWVCdWZmZXJUeXBlOkFycmF5LERlZmF1bHRJbnRlcnBvbGF0aW9uOjIzMDAsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kTGluZWFyOnZvaWQgMCxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6dm9pZCAwfSk7SGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShYYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpIZyxWYWx1ZVR5cGVOYW1lOiJjb2xvciJ9KTtTZS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFhiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlNlLFZhbHVlVHlwZU5hbWU6Im51bWJlciJ9KTtJZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKG9jLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOklnLGludGVycG9sYXRlXzpmdW5jdGlvbihhLApjLGUsZyl7dmFyIHI9dGhpcy5yZXN1bHRCdWZmZXIsdj10aGlzLnNhbXBsZVZhbHVlcyx6PXRoaXMudmFsdWVTaXplO2EqPXo7Yz0oZS1jKS8oZy1jKTtmb3IoZT1hK3o7YSE9PWU7YSs9NCloLnNsZXJwRmxhdChyLDAsdixhLXosdixhLGMpO3JldHVybiByfX0pO1pmLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6WmYsVmFsdWVUeXBlTmFtZToicXVhdGVybmlvbiIsRGVmYXVsdEludGVycG9sYXRpb246MjMwMSxJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6ZnVuY3Rpb24oYSl7cmV0dXJuIG5ldyBJZyh0aGlzLnRpbWVzLHRoaXMudmFsdWVzLHRoaXMuZ2V0VmFsdWVTaXplKCksYSl9LEludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDp2b2lkIDB9KTtKZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKFhiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkpnLFZhbHVlVHlwZU5hbWU6InN0cmluZyIsClZhbHVlQnVmZmVyVHlwZTpBcnJheSxEZWZhdWx0SW50ZXJwb2xhdGlvbjoyMzAwLEludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjp2b2lkIDAsSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOnZvaWQgMH0pO1RlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VGUsVmFsdWVUeXBlTmFtZToidmVjdG9yIn0pO09iamVjdC5hc3NpZ24odGMse3BhcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxlPWEudHJhY2tzLGc9MS8oYS5mcHN8fDEpLHI9MCx2PWUubGVuZ3RoO3IhPT12OysrciljLnB1c2gobm0oZVtyXSkuc2NhbGUoZykpO3JldHVybiBuZXcgdGMoYS5uYW1lLGEuZHVyYXRpb24sYyl9LHRvSlNPTjpmdW5jdGlvbihhKXt2YXIgYz1bXSxlPWEudHJhY2tzO2E9e25hbWU6YS5uYW1lLGR1cmF0aW9uOmEuZHVyYXRpb24sdHJhY2tzOmMsdXVpZDphLnV1aWR9O2Zvcih2YXIgZz0wLHI9ZS5sZW5ndGg7ZyE9PQpyOysrZyljLnB1c2goWGIudG9KU09OKGVbZ10pKTtyZXR1cm4gYX0sQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2U6ZnVuY3Rpb24oYSxjLGUsZyl7Zm9yKHZhciByPWMubGVuZ3RoLHY9W10sej0wO3o8cjt6Kyspe3ZhciBFPVtdLEY9W107RS5wdXNoKCh6K3ItMSklcix6LCh6KzEpJXIpO0YucHVzaCgwLDEsMCk7dmFyIEo9VGIuZ2V0S2V5ZnJhbWVPcmRlcihFKTtFPVRiLnNvcnRlZEFycmF5KEUsMSxKKTtGPVRiLnNvcnRlZEFycmF5KEYsMSxKKTtnfHwwIT09RVswXXx8KEUucHVzaChyKSxGLnB1c2goRlswXSkpO3YucHVzaCgobmV3IFNlKCIubW9ycGhUYXJnZXRJbmZsdWVuY2VzWyIrY1t6XS5uYW1lKyJdIixFLEYpKS5zY2FsZSgxL2UpKX1yZXR1cm4gbmV3IHRjKGEsLTEsdil9LGZpbmRCeU5hbWU6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hO0FycmF5LmlzQXJyYXkoYSl8fChlPWEuZ2VvbWV0cnkmJmEuZ2VvbWV0cnkuYW5pbWF0aW9uc3x8YS5hbmltYXRpb25zKTtmb3IoYT0KMDthPGUubGVuZ3RoO2ErKylpZihlW2FdLm5hbWU9PT1jKXJldHVybiBlW2FdO3JldHVybiBudWxsfSxDcmVhdGVDbGlwc0Zyb21Nb3JwaFRhcmdldFNlcXVlbmNlczpmdW5jdGlvbihhLGMsZSl7Zm9yKHZhciBnPXt9LHI9L14oW1x3LV0qPykoW1xkXSspJC8sdj0wLHo9YS5sZW5ndGg7djx6O3YrKyl7dmFyIEU9YVt2XSxGPUUubmFtZS5tYXRjaChyKTtpZihGJiYxPEYubGVuZ3RoKXt2YXIgSj1GWzFdOyhGPWdbSl0pfHwoZ1tKXT1GPVtdKTtGLnB1c2goRSl9fWE9W107Zm9yKEogaW4gZylhLnB1c2godGMuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoSixnW0pdLGMsZSkpO3JldHVybiBhfSxwYXJzZUFuaW1hdGlvbjpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoaGEsZmEscmEscGEscWEpe2lmKDAhPT1yYS5sZW5ndGgpe3ZhciB1YT1bXSxvYT1bXTtUYi5mbGF0dGVuSlNPTihyYSx1YSxvYSxwYSk7MCE9PXVhLmxlbmd0aCYmcWEucHVzaChuZXcgaGEoZmEsdWEsb2EpKX19CmlmKCFhKXJldHVybiBjb25zb2xlLmVycm9yKCJUSFJFRS5BbmltYXRpb25DbGlwOiBObyBhbmltYXRpb24gaW4gSlNPTkxvYWRlciBkYXRhLiIpLG51bGw7dmFyIGc9W10scj1hLm5hbWV8fCJkZWZhdWx0Iix2PWEubGVuZ3RofHwtMSx6PWEuZnBzfHwzMDthPWEuaGllcmFyY2h5fHxbXTtmb3IodmFyIEU9MDtFPGEubGVuZ3RoO0UrKyl7dmFyIEY9YVtFXS5rZXlzO2lmKEYmJjAhPT1GLmxlbmd0aClpZihGWzBdLm1vcnBoVGFyZ2V0cyl7dj17fTtmb3IodmFyIEo9MDtKPEYubGVuZ3RoO0orKylpZihGW0pdLm1vcnBoVGFyZ2V0cylmb3IodmFyIFA9MDtQPEZbSl0ubW9ycGhUYXJnZXRzLmxlbmd0aDtQKyspdltGW0pdLm1vcnBoVGFyZ2V0c1tQXV09LTE7Zm9yKHZhciBSIGluIHYpe3ZhciBTPVtdLFY9W107Zm9yKFA9MDtQIT09RltKXS5tb3JwaFRhcmdldHMubGVuZ3RoOysrUCl7dmFyIFc9RltKXTtTLnB1c2goVy50aW1lKTtWLnB1c2goVy5tb3JwaFRhcmdldD09PVI/MTowKX1nLnB1c2gobmV3IFNlKCIubW9ycGhUYXJnZXRJbmZsdWVuY2VbIisKUisiXSIsUyxWKSl9dj12Lmxlbmd0aCooenx8MSl9ZWxzZSBKPSIuYm9uZXNbIitjW0VdLm5hbWUrIl0iLGUoVGUsSisiLnBvc2l0aW9uIixGLCJwb3MiLGcpLGUoWmYsSisiLnF1YXRlcm5pb24iLEYsInJvdCIsZyksZShUZSxKKyIuc2NhbGUiLEYsInNjbCIsZyl9cmV0dXJuIDA9PT1nLmxlbmd0aD9udWxsOm5ldyB0YyhyLHYsZyl9fSk7T2JqZWN0LmFzc2lnbih0Yy5wcm90b3R5cGUse3Jlc2V0RHVyYXRpb246ZnVuY3Rpb24oKXtmb3IodmFyIGE9MCxjPTAsZT10aGlzLnRyYWNrcy5sZW5ndGg7YyE9PWU7KytjKXt2YXIgZz10aGlzLnRyYWNrc1tjXTthPU1hdGgubWF4KGEsZy50aW1lc1tnLnRpbWVzLmxlbmd0aC0xXSl9dGhpcy5kdXJhdGlvbj1hO3JldHVybiB0aGlzfSx0cmltOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTA7YTx0aGlzLnRyYWNrcy5sZW5ndGg7YSsrKXRoaXMudHJhY2tzW2FdLnRyaW0oMCx0aGlzLmR1cmF0aW9uKTtyZXR1cm4gdGhpc30sdmFsaWRhdGU6ZnVuY3Rpb24oKXtmb3IodmFyIGE9CiEwLGM9MDtjPHRoaXMudHJhY2tzLmxlbmd0aDtjKyspYT1hJiZ0aGlzLnRyYWNrc1tjXS52YWxpZGF0ZSgpO3JldHVybiBhfSxvcHRpbWl6ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT0wO2E8dGhpcy50cmFja3MubGVuZ3RoO2ErKyl0aGlzLnRyYWNrc1thXS5vcHRpbWl6ZSgpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe2Zvcih2YXIgYT1bXSxjPTA7Yzx0aGlzLnRyYWNrcy5sZW5ndGg7YysrKWEucHVzaCh0aGlzLnRyYWNrc1tjXS5jbG9uZSgpKTtyZXR1cm4gbmV3IHRjKHRoaXMubmFtZSx0aGlzLmR1cmF0aW9uLGEpfX0pO3ZhciBpZT17ZW5hYmxlZDohMSxmaWxlczp7fSxhZGQ6ZnVuY3Rpb24oYSxjKXshMSE9PXRoaXMuZW5hYmxlZCYmKHRoaXMuZmlsZXNbYV09Yyl9LGdldDpmdW5jdGlvbihhKXtpZighMSE9PXRoaXMuZW5hYmxlZClyZXR1cm4gdGhpcy5maWxlc1thXX0scmVtb3ZlOmZ1bmN0aW9uKGEpe2RlbGV0ZSB0aGlzLmZpbGVzW2FdfSxjbGVhcjpmdW5jdGlvbigpe3RoaXMuZmlsZXM9Cnt9fX0sT2o9bmV3ICRoO09iamVjdC5hc3NpZ24oRGIucHJvdG90eXBlLHtsb2FkOmZ1bmN0aW9uKCl7fSxwYXJzZTpmdW5jdGlvbigpe30sc2V0Q3Jvc3NPcmlnaW46ZnVuY3Rpb24oYSl7dGhpcy5jcm9zc09yaWdpbj1hO3JldHVybiB0aGlzfSxzZXRQYXRoOmZ1bmN0aW9uKGEpe3RoaXMucGF0aD1hO3JldHVybiB0aGlzfSxzZXRSZXNvdXJjZVBhdGg6ZnVuY3Rpb24oYSl7dGhpcy5yZXNvdXJjZVBhdGg9YTtyZXR1cm4gdGhpc319KTtEYi5IYW5kbGVycz17aGFuZGxlcnM6W10sYWRkOmZ1bmN0aW9uKGEsYyl7dGhpcy5oYW5kbGVycy5wdXNoKGEsYyl9LGdldDpmdW5jdGlvbihhKXtmb3IodmFyIGM9dGhpcy5oYW5kbGVycyxlPTAsZz1jLmxlbmd0aDtlPGc7ZSs9Mil7dmFyIHI9Y1tlKzFdO2lmKGNbZV0udGVzdChhKSlyZXR1cm4gcn1yZXR1cm4gbnVsbH19O3ZhciBLYz17fTt1Yy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOnVjLApsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZvaWQgMD09PWEmJihhPSIiKTt2b2lkIDAhPT10aGlzLnBhdGgmJihhPXRoaXMucGF0aCthKTthPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGEpO3ZhciByPXRoaXMsdj1pZS5nZXQoYSk7aWYodm9pZCAwIT09dilyZXR1cm4gci5tYW5hZ2VyLml0ZW1TdGFydChhKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyYmYyh2KTtyLm1hbmFnZXIuaXRlbUVuZChhKX0sMCksdjtpZih2b2lkIDAhPT1LY1thXSlLY1thXS5wdXNoKHtvbkxvYWQ6YyxvblByb2dyZXNzOmUsb25FcnJvcjpnfSk7ZWxzZXt2YXIgej1hLm1hdGNoKC9eZGF0YTooLio/KSg7YmFzZTY0KT8sKC4qKSQvKTtpZih6KXtlPXpbMV07dmFyIEU9ISF6WzJdO3o9elszXTt6PWRlY29kZVVSSUNvbXBvbmVudCh6KTtFJiYoej1hdG9iKHopKTt0cnl7dmFyIEY9KHRoaXMucmVzcG9uc2VUeXBlfHwiIikudG9Mb3dlckNhc2UoKTtzd2l0Y2goRil7Y2FzZSAiYXJyYXlidWZmZXIiOmNhc2UgImJsb2IiOnZhciBKPQpuZXcgVWludDhBcnJheSh6Lmxlbmd0aCk7Zm9yKEU9MDtFPHoubGVuZ3RoO0UrKylKW0VdPXouY2hhckNvZGVBdChFKTt2YXIgUD0iYmxvYiI9PT1GP25ldyBCbG9iKFtKLmJ1ZmZlcl0se3R5cGU6ZX0pOkouYnVmZmVyO2JyZWFrO2Nhc2UgImRvY3VtZW50IjpQPShuZXcgRE9NUGFyc2VyKS5wYXJzZUZyb21TdHJpbmcoeixlKTticmVhaztjYXNlICJqc29uIjpQPUpTT04ucGFyc2Uoeik7YnJlYWs7ZGVmYXVsdDpQPXp9c2V0VGltZW91dChmdW5jdGlvbigpe2MmJmMoUCk7ci5tYW5hZ2VyLml0ZW1FbmQoYSl9LDApfWNhdGNoKFMpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXtnJiZnKFMpO3IubWFuYWdlci5pdGVtRXJyb3IoYSk7ci5tYW5hZ2VyLml0ZW1FbmQoYSl9LDApfX1lbHNle0tjW2FdPVtdO0tjW2FdLnB1c2goe29uTG9hZDpjLG9uUHJvZ3Jlc3M6ZSxvbkVycm9yOmd9KTt2YXIgUj1uZXcgWE1MSHR0cFJlcXVlc3Q7Ui5vcGVuKCJHRVQiLGEsITApO1IuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsCmZ1bmN0aW9uKFMpe3ZhciBWPXRoaXMucmVzcG9uc2U7aWUuYWRkKGEsVik7dmFyIFc9S2NbYV07ZGVsZXRlIEtjW2FdO2lmKDIwMD09PXRoaXMuc3RhdHVzfHwwPT09dGhpcy5zdGF0dXMpezA9PT10aGlzLnN0YXR1cyYmY29uc29sZS53YXJuKCJUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLiIpO2Zvcih2YXIgaGE9MCxmYT1XLmxlbmd0aDtoYTxmYTtoYSsrKXt2YXIgcmE9V1toYV07aWYocmEub25Mb2FkKXJhLm9uTG9hZChWKX19ZWxzZXtoYT0wO2ZvcihmYT1XLmxlbmd0aDtoYTxmYTtoYSsrKWlmKHJhPVdbaGFdLHJhLm9uRXJyb3IpcmEub25FcnJvcihTKTtyLm1hbmFnZXIuaXRlbUVycm9yKGEpfXIubWFuYWdlci5pdGVtRW5kKGEpfSwhMSk7Ui5hZGRFdmVudExpc3RlbmVyKCJwcm9ncmVzcyIsZnVuY3Rpb24oUyl7Zm9yKHZhciBWPUtjW2FdLFc9MCxoYT1WLmxlbmd0aDtXPGhhO1crKyl7dmFyIGZhPVZbV107aWYoZmEub25Qcm9ncmVzcylmYS5vblByb2dyZXNzKFMpfX0sCiExKTtSLmFkZEV2ZW50TGlzdGVuZXIoImVycm9yIixmdW5jdGlvbihTKXt2YXIgVj1LY1thXTtkZWxldGUgS2NbYV07Zm9yKHZhciBXPTAsaGE9Vi5sZW5ndGg7VzxoYTtXKyspe3ZhciBmYT1WW1ddO2lmKGZhLm9uRXJyb3IpZmEub25FcnJvcihTKX1yLm1hbmFnZXIuaXRlbUVycm9yKGEpO3IubWFuYWdlci5pdGVtRW5kKGEpfSwhMSk7Ui5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsZnVuY3Rpb24oUyl7dmFyIFY9S2NbYV07ZGVsZXRlIEtjW2FdO2Zvcih2YXIgVz0wLGhhPVYubGVuZ3RoO1c8aGE7VysrKXt2YXIgZmE9VltXXTtpZihmYS5vbkVycm9yKWZhLm9uRXJyb3IoUyl9ci5tYW5hZ2VyLml0ZW1FcnJvcihhKTtyLm1hbmFnZXIuaXRlbUVuZChhKX0sITEpO3ZvaWQgMCE9PXRoaXMucmVzcG9uc2VUeXBlJiYoUi5yZXNwb25zZVR5cGU9dGhpcy5yZXNwb25zZVR5cGUpO3ZvaWQgMCE9PXRoaXMud2l0aENyZWRlbnRpYWxzJiYoUi53aXRoQ3JlZGVudGlhbHM9dGhpcy53aXRoQ3JlZGVudGlhbHMpOwpSLm92ZXJyaWRlTWltZVR5cGUmJlIub3ZlcnJpZGVNaW1lVHlwZSh2b2lkIDAhPT10aGlzLm1pbWVUeXBlP3RoaXMubWltZVR5cGU6InRleHQvcGxhaW4iKTtmb3IoRSBpbiB0aGlzLnJlcXVlc3RIZWFkZXIpUi5zZXRSZXF1ZXN0SGVhZGVyKEUsdGhpcy5yZXF1ZXN0SGVhZGVyW0VdKTtSLnNlbmQobnVsbCl9ci5tYW5hZ2VyLml0ZW1TdGFydChhKTtyZXR1cm4gUn19LHNldFJlc3BvbnNlVHlwZTpmdW5jdGlvbihhKXt0aGlzLnJlc3BvbnNlVHlwZT1hO3JldHVybiB0aGlzfSxzZXRXaXRoQ3JlZGVudGlhbHM6ZnVuY3Rpb24oYSl7dGhpcy53aXRoQ3JlZGVudGlhbHM9YTtyZXR1cm4gdGhpc30sc2V0TWltZVR5cGU6ZnVuY3Rpb24oYSl7dGhpcy5taW1lVHlwZT1hO3JldHVybiB0aGlzfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGEpe3RoaXMucmVxdWVzdEhlYWRlcj1hO3JldHVybiB0aGlzfX0pO2FpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOmFpLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9dGhpcyx2PW5ldyB1YyhyLm1hbmFnZXIpO3Yuc2V0UGF0aChyLnBhdGgpO3YubG9hZChhLGZ1bmN0aW9uKHope2Moci5wYXJzZShKU09OLnBhcnNlKHopKSl9LGUsZyl9LHBhcnNlOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxlPTA7ZTxhLmxlbmd0aDtlKyspe3ZhciBnPXRjLnBhcnNlKGFbZV0pO2MucHVzaChnKX1yZXR1cm4gY319KTtiaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmJpLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7ZnVuY3Rpb24gcihTKXtGLmxvYWQoYVtTXSxmdW5jdGlvbihWKXtWPXYuX3BhcnNlcihWLCEwKTt6W1NdPXt3aWR0aDpWLndpZHRoLGhlaWdodDpWLmhlaWdodCxmb3JtYXQ6Vi5mb3JtYXQsbWlwbWFwczpWLm1pcG1hcHN9O0orPTE7Nj09PUomJigxPT09Vi5taXBtYXBDb3VudCYmKEUubWluRmlsdGVyPQoxMDA2KSxFLmZvcm1hdD1WLmZvcm1hdCxFLm5lZWRzVXBkYXRlPSEwLGMmJmMoRSkpfSxlLGcpfXZhciB2PXRoaXMsej1bXSxFPW5ldyBEZTtFLmltYWdlPXo7dmFyIEY9bmV3IHVjKHRoaXMubWFuYWdlcik7Ri5zZXRQYXRoKHRoaXMucGF0aCk7Ri5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7aWYoQXJyYXkuaXNBcnJheShhKSlmb3IodmFyIEo9MCxQPTAsUj1hLmxlbmd0aDtQPFI7KytQKXIoUCk7ZWxzZSBGLmxvYWQoYSxmdW5jdGlvbihTKXtTPXYuX3BhcnNlcihTLCEwKTtpZihTLmlzQ3ViZW1hcClmb3IodmFyIFY9Uy5taXBtYXBzLmxlbmd0aC9TLm1pcG1hcENvdW50LFc9MDtXPFY7VysrKXt6W1ddPXttaXBtYXBzOltdfTtmb3IodmFyIGhhPTA7aGE8Uy5taXBtYXBDb3VudDtoYSsrKXpbV10ubWlwbWFwcy5wdXNoKFMubWlwbWFwc1tXKlMubWlwbWFwQ291bnQraGFdKSx6W1ddLmZvcm1hdD1TLmZvcm1hdCx6W1ddLndpZHRoPVMud2lkdGgseltXXS5oZWlnaHQ9Uy5oZWlnaHR9ZWxzZSBFLmltYWdlLndpZHRoPQpTLndpZHRoLEUuaW1hZ2UuaGVpZ2h0PVMuaGVpZ2h0LEUubWlwbWFwcz1TLm1pcG1hcHM7MT09PVMubWlwbWFwQ291bnQmJihFLm1pbkZpbHRlcj0xMDA2KTtFLmZvcm1hdD1TLmZvcm1hdDtFLm5lZWRzVXBkYXRlPSEwO2MmJmMoRSl9LGUsZyk7cmV0dXJuIEV9fSk7S2cucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpLZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMsdj1uZXcgQWIsej1uZXcgdWModGhpcy5tYW5hZ2VyKTt6LnNldFJlc3BvbnNlVHlwZSgiYXJyYXlidWZmZXIiKTt6LnNldFBhdGgodGhpcy5wYXRoKTt6LmxvYWQoYSxmdW5jdGlvbihFKXtpZihFPXIuX3BhcnNlcihFKSl2b2lkIDAhPT1FLmltYWdlP3YuaW1hZ2U9RS5pbWFnZTp2b2lkIDAhPT1FLmRhdGEmJih2LmltYWdlLndpZHRoPUUud2lkdGgsdi5pbWFnZS5oZWlnaHQ9RS5oZWlnaHQsdi5pbWFnZS5kYXRhPUUuZGF0YSksdi53cmFwUz0Kdm9pZCAwIT09RS53cmFwUz9FLndyYXBTOjEwMDEsdi53cmFwVD12b2lkIDAhPT1FLndyYXBUP0Uud3JhcFQ6MTAwMSx2Lm1hZ0ZpbHRlcj12b2lkIDAhPT1FLm1hZ0ZpbHRlcj9FLm1hZ0ZpbHRlcjoxMDA2LHYubWluRmlsdGVyPXZvaWQgMCE9PUUubWluRmlsdGVyP0UubWluRmlsdGVyOjEwMDgsdi5hbmlzb3Ryb3B5PXZvaWQgMCE9PUUuYW5pc290cm9weT9FLmFuaXNvdHJvcHk6MSx2b2lkIDAhPT1FLmZvcm1hdCYmKHYuZm9ybWF0PUUuZm9ybWF0KSx2b2lkIDAhPT1FLnR5cGUmJih2LnR5cGU9RS50eXBlKSx2b2lkIDAhPT1FLm1pcG1hcHMmJih2Lm1pcG1hcHM9RS5taXBtYXBzKSwxPT09RS5taXBtYXBDb3VudCYmKHYubWluRmlsdGVyPTEwMDYpLHYubmVlZHNVcGRhdGU9ITAsYyYmYyh2LEUpfSxlLGcpO3JldHVybiB2fX0pO1VlLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoRGIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VWUsbG9hZDpmdW5jdGlvbihhLApjLGUsZyl7ZnVuY3Rpb24gcigpe0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsciwhMSk7Ri5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdiwhMSk7aWUuYWRkKGEsdGhpcyk7YyYmYyh0aGlzKTt6Lm1hbmFnZXIuaXRlbUVuZChhKX1mdW5jdGlvbiB2KEope0YucmVtb3ZlRXZlbnRMaXN0ZW5lcigibG9hZCIsciwhMSk7Ri5yZW1vdmVFdmVudExpc3RlbmVyKCJlcnJvciIsdiwhMSk7ZyYmZyhKKTt6Lm1hbmFnZXIuaXRlbUVycm9yKGEpO3oubWFuYWdlci5pdGVtRW5kKGEpfXZvaWQgMCE9PXRoaXMucGF0aCYmKGE9dGhpcy5wYXRoK2EpO2E9dGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoYSk7dmFyIHo9dGhpcyxFPWllLmdldChhKTtpZih2b2lkIDAhPT1FKXJldHVybiB6Lm1hbmFnZXIuaXRlbVN0YXJ0KGEpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjJiZjKEUpO3oubWFuYWdlci5pdGVtRW5kKGEpfSwwKSxFO3ZhciBGPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsCiJpbWciKTtGLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLHIsITEpO0YuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLHYsITEpOyJkYXRhOiIhPT1hLnN1YnN0cigwLDUpJiZ2b2lkIDAhPT10aGlzLmNyb3NzT3JpZ2luJiYoRi5jcm9zc09yaWdpbj10aGlzLmNyb3NzT3JpZ2luKTt6Lm1hbmFnZXIuaXRlbVN0YXJ0KGEpO0Yuc3JjPWE7cmV0dXJuIEZ9fSk7TGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpMZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe2Z1bmN0aW9uIHIoRil7ei5sb2FkKGFbRl0sZnVuY3Rpb24oSil7di5pbWFnZXNbRl09SjtFKys7Nj09PUUmJih2Lm5lZWRzVXBkYXRlPSEwLGMmJmModikpfSx2b2lkIDAsZyl9dmFyIHY9bmV3IGNkLHo9bmV3IFVlKHRoaXMubWFuYWdlcik7ei5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTt6LnNldFBhdGgodGhpcy5wYXRoKTt2YXIgRT0wO2ZvcihlPQowO2U8YS5sZW5ndGg7KytlKXIoZSk7cmV0dXJuIHZ9fSk7TWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpNZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPW5ldyBsLHY9bmV3IFVlKHRoaXMubWFuYWdlcik7di5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTt2LnNldFBhdGgodGhpcy5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXtyLmltYWdlPXo7ej0wPGEuc2VhcmNoKC9cLmpwZT9nKCR8XD8pL2kpfHwwPT09YS5zZWFyY2goL15kYXRhOmltYWdlXC9qcGVnLyk7ci5mb3JtYXQ9ej8xMDIyOjEwMjM7ci5uZWVkc1VwZGF0ZT0hMDt2b2lkIDAhPT1jJiZjKHIpfSxlLGcpO3JldHVybiByfX0pO09iamVjdC5hc3NpZ24oWmEucHJvdG90eXBlLHtnZXRQb2ludDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4iKTtyZXR1cm4gbnVsbH0sCmdldFBvaW50QXQ6ZnVuY3Rpb24oYSxjKXthPXRoaXMuZ2V0VXRvVG1hcHBpbmcoYSk7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoYSxjKX0sZ2V0UG9pbnRzOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPTUpO2Zvcih2YXIgYz1bXSxlPTA7ZTw9YTtlKyspYy5wdXNoKHRoaXMuZ2V0UG9pbnQoZS9hKSk7cmV0dXJuIGN9LGdldFNwYWNlZFBvaW50czpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoYT01KTtmb3IodmFyIGM9W10sZT0wO2U8PWE7ZSsrKWMucHVzaCh0aGlzLmdldFBvaW50QXQoZS9hKSk7cmV0dXJuIGN9LGdldExlbmd0aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0TGVuZ3RocygpO3JldHVybiBhW2EubGVuZ3RoLTFdfSxnZXRMZW5ndGhzOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PWEmJihhPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zKTtpZih0aGlzLmNhY2hlQXJjTGVuZ3RocyYmdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoPT09YSsxJiYhdGhpcy5uZWVkc1VwZGF0ZSlyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7CnRoaXMubmVlZHNVcGRhdGU9ITE7dmFyIGM9W10sZT10aGlzLmdldFBvaW50KDApLGcscj0wO2MucHVzaCgwKTtmb3IoZz0xO2c8PWE7ZysrKXt2YXIgdj10aGlzLmdldFBvaW50KGcvYSk7cis9di5kaXN0YW5jZVRvKGUpO2MucHVzaChyKTtlPXZ9cmV0dXJuIHRoaXMuY2FjaGVBcmNMZW5ndGhzPWN9LHVwZGF0ZUFyY0xlbmd0aHM6ZnVuY3Rpb24oKXt0aGlzLm5lZWRzVXBkYXRlPSEwO3RoaXMuZ2V0TGVuZ3RocygpfSxnZXRVdG9UbWFwcGluZzpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuZ2V0TGVuZ3RocygpLGc9ZS5sZW5ndGg7Yz1jP2M6YSplW2ctMV07Zm9yKHZhciByPTAsdj1nLTEsejtyPD12OylpZihhPU1hdGguZmxvb3Iocisodi1yKS8yKSx6PWVbYV0tYywwPnopcj1hKzE7ZWxzZSBpZigwPHopdj1hLTE7ZWxzZXt2PWE7YnJlYWt9YT12O2lmKGVbYV09PT1jKXJldHVybiBhLyhnLTEpO3I9ZVthXTtyZXR1cm4oYSsoYy1yKS8oZVthKzFdLXIpKS8oZy0xKX0sZ2V0VGFuZ2VudDpmdW5jdGlvbihhKXt2YXIgYz0KYS0xRS00O2ErPTFFLTQ7MD5jJiYoYz0wKTsxPGEmJihhPTEpO2M9dGhpcy5nZXRQb2ludChjKTtyZXR1cm4gdGhpcy5nZXRQb2ludChhKS5jbG9uZSgpLnN1YihjKS5ub3JtYWxpemUoKX0sZ2V0VGFuZ2VudEF0OmZ1bmN0aW9uKGEpe2E9dGhpcy5nZXRVdG9UbWFwcGluZyhhKTtyZXR1cm4gdGhpcy5nZXRUYW5nZW50KGEpfSxjb21wdXRlRnJlbmV0RnJhbWVzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9bmV3IGssZz1bXSxyPVtdLHY9W10sej1uZXcgayxFPW5ldyBxLEY7Zm9yKEY9MDtGPD1hO0YrKyl7dmFyIEo9Ri9hO2dbRl09dGhpcy5nZXRUYW5nZW50QXQoSik7Z1tGXS5ub3JtYWxpemUoKX1yWzBdPW5ldyBrO3ZbMF09bmV3IGs7Rj1OdW1iZXIuTUFYX1ZBTFVFO0o9TWF0aC5hYnMoZ1swXS54KTt2YXIgUD1NYXRoLmFicyhnWzBdLnkpLFI9TWF0aC5hYnMoZ1swXS56KTtKPD1GJiYoRj1KLGUuc2V0KDEsMCwwKSk7UDw9RiYmKEY9UCxlLnNldCgwLDEsMCkpO1I8PUYmJmUuc2V0KDAsCjAsMSk7ei5jcm9zc1ZlY3RvcnMoZ1swXSxlKS5ub3JtYWxpemUoKTtyWzBdLmNyb3NzVmVjdG9ycyhnWzBdLHopO3ZbMF0uY3Jvc3NWZWN0b3JzKGdbMF0sclswXSk7Zm9yKEY9MTtGPD1hO0YrKylyW0ZdPXJbRi0xXS5jbG9uZSgpLHZbRl09dltGLTFdLmNsb25lKCksei5jcm9zc1ZlY3RvcnMoZ1tGLTFdLGdbRl0pLHoubGVuZ3RoKCk+TnVtYmVyLkVQU0lMT04mJih6Lm5vcm1hbGl6ZSgpLGU9TWF0aC5hY29zKGhiLmNsYW1wKGdbRi0xXS5kb3QoZ1tGXSksLTEsMSkpLHJbRl0uYXBwbHlNYXRyaXg0KEUubWFrZVJvdGF0aW9uQXhpcyh6LGUpKSksdltGXS5jcm9zc1ZlY3RvcnMoZ1tGXSxyW0ZdKTtpZighMD09PWMpZm9yKGU9TWF0aC5hY29zKGhiLmNsYW1wKHJbMF0uZG90KHJbYV0pLC0xLDEpKSxlLz1hLDA8Z1swXS5kb3Qoei5jcm9zc1ZlY3RvcnMoclswXSxyW2FdKSkmJihlPS1lKSxGPTE7Rjw9YTtGKyspcltGXS5hcHBseU1hdHJpeDQoRS5tYWtlUm90YXRpb25BeGlzKGdbRl0sCmUqRikpLHZbRl0uY3Jvc3NWZWN0b3JzKGdbRl0scltGXSk7cmV0dXJue3RhbmdlbnRzOmcsbm9ybWFsczpyLGJpbm9ybWFsczp2fX0sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9YS5hcmNMZW5ndGhEaXZpc2lvbnM7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiQ3VydmUiLGdlbmVyYXRvcjoiQ3VydmUudG9KU09OIn19O2EuYXJjTGVuZ3RoRGl2aXNpb25zPXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zO2EudHlwZT10aGlzLnR5cGU7cmV0dXJuIGF9LGZyb21KU09OOmZ1bmN0aW9uKGEpe3RoaXMuYXJjTGVuZ3RoRGl2aXNpb25zPWEuYXJjTGVuZ3RoRGl2aXNpb25zO3JldHVybiB0aGlzfX0pO3BjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7cGMucHJvdG90eXBlLmNvbnN0cnVjdG9yPQpwYztwYy5wcm90b3R5cGUuaXNFbGxpcHNlQ3VydmU9ITA7cGMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgZjtmb3IodmFyIGU9MipNYXRoLlBJLGc9dGhpcy5hRW5kQW5nbGUtdGhpcy5hU3RhcnRBbmdsZSxyPU1hdGguYWJzKGcpPE51bWJlci5FUFNJTE9OOzA+ZzspZys9ZTtmb3IoO2c+ZTspZy09ZTtnPE51bWJlci5FUFNJTE9OJiYoZz1yPzA6ZSk7ITAhPT10aGlzLmFDbG9ja3dpc2V8fHJ8fChnPWc9PT1lPy1lOmctZSk7ZT10aGlzLmFTdGFydEFuZ2xlK2EqZzthPXRoaXMuYVgrdGhpcy54UmFkaXVzKk1hdGguY29zKGUpO3ZhciB2PXRoaXMuYVkrdGhpcy55UmFkaXVzKk1hdGguc2luKGUpOzAhPT10aGlzLmFSb3RhdGlvbiYmKGU9TWF0aC5jb3ModGhpcy5hUm90YXRpb24pLGc9TWF0aC5zaW4odGhpcy5hUm90YXRpb24pLHI9YS10aGlzLmFYLHYtPXRoaXMuYVksYT1yKmUtdipnK3RoaXMuYVgsdj1yKmcrdiplK3RoaXMuYVkpO3JldHVybiBjLnNldChhLAp2KX07cGMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuYVg9YS5hWDt0aGlzLmFZPWEuYVk7dGhpcy54UmFkaXVzPWEueFJhZGl1czt0aGlzLnlSYWRpdXM9YS55UmFkaXVzO3RoaXMuYVN0YXJ0QW5nbGU9YS5hU3RhcnRBbmdsZTt0aGlzLmFFbmRBbmdsZT1hLmFFbmRBbmdsZTt0aGlzLmFDbG9ja3dpc2U9YS5hQ2xvY2t3aXNlO3RoaXMuYVJvdGF0aW9uPWEuYVJvdGF0aW9uO3JldHVybiB0aGlzfTtwYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EuYVg9dGhpcy5hWDthLmFZPXRoaXMuYVk7YS54UmFkaXVzPXRoaXMueFJhZGl1czthLnlSYWRpdXM9dGhpcy55UmFkaXVzO2EuYVN0YXJ0QW5nbGU9dGhpcy5hU3RhcnRBbmdsZTthLmFFbmRBbmdsZT10aGlzLmFFbmRBbmdsZTthLmFDbG9ja3dpc2U9dGhpcy5hQ2xvY2t3aXNlO2EuYVJvdGF0aW9uPQp0aGlzLmFSb3RhdGlvbjtyZXR1cm4gYX07cGMucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy5hWD1hLmFYO3RoaXMuYVk9YS5hWTt0aGlzLnhSYWRpdXM9YS54UmFkaXVzO3RoaXMueVJhZGl1cz1hLnlSYWRpdXM7dGhpcy5hU3RhcnRBbmdsZT1hLmFTdGFydEFuZ2xlO3RoaXMuYUVuZEFuZ2xlPWEuYUVuZEFuZ2xlO3RoaXMuYUNsb2Nrd2lzZT1hLmFDbG9ja3dpc2U7dGhpcy5hUm90YXRpb249YS5hUm90YXRpb247cmV0dXJuIHRoaXN9O1ZlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHBjLnByb3RvdHlwZSk7VmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVZlO1ZlLnByb3RvdHlwZS5pc0FyY0N1cnZlPSEwO3ZhciB4aD1uZXcgayxMaT1uZXcgY2ksTWk9bmV3IGNpLE5pPW5ldyBjaTtaYi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO1piLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1aYjsKWmIucHJvdG90eXBlLmlzQ2F0bXVsbFJvbUN1cnZlMz0hMDtaYi5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBrO3ZhciBlPXRoaXMucG9pbnRzLGc9ZS5sZW5ndGg7YSo9Zy0odGhpcy5jbG9zZWQ/MDoxKTt2YXIgcj1NYXRoLmZsb29yKGEpO2EtPXI7dGhpcy5jbG9zZWQ/cis9MDxyPzA6KE1hdGguZmxvb3IoTWF0aC5hYnMocikvZykrMSkqZzowPT09YSYmcj09PWctMSYmKHI9Zy0yLGE9MSk7aWYodGhpcy5jbG9zZWR8fDA8cil2YXIgdj1lWyhyLTEpJWddO2Vsc2UgeGguc3ViVmVjdG9ycyhlWzBdLGVbMV0pLmFkZChlWzBdKSx2PXhoO3ZhciB6PWVbciVnXTt2YXIgRT1lWyhyKzEpJWddO3RoaXMuY2xvc2VkfHxyKzI8Zz9lPWVbKHIrMiklZ106KHhoLnN1YlZlY3RvcnMoZVtnLTFdLGVbZy0yXSkuYWRkKGVbZy0xXSksZT14aCk7aWYoImNlbnRyaXBldGFsIj09PXRoaXMuY3VydmVUeXBlfHwiY2hvcmRhbCI9PT10aGlzLmN1cnZlVHlwZSl7dmFyIEY9CiJjaG9yZGFsIj09PXRoaXMuY3VydmVUeXBlPy41Oi4yNTtnPU1hdGgucG93KHYuZGlzdGFuY2VUb1NxdWFyZWQoeiksRik7cj1NYXRoLnBvdyh6LmRpc3RhbmNlVG9TcXVhcmVkKEUpLEYpO0Y9TWF0aC5wb3coRS5kaXN0YW5jZVRvU3F1YXJlZChlKSxGKTsxRS00PnImJihyPTEpOzFFLTQ+ZyYmKGc9cik7MUUtND5GJiYoRj1yKTtMaS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20odi54LHoueCxFLngsZS54LGcscixGKTtNaS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20odi55LHoueSxFLnksZS55LGcscixGKTtOaS5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20odi56LHoueixFLnosZS56LGcscixGKX1lbHNlImNhdG11bGxyb20iPT09dGhpcy5jdXJ2ZVR5cGUmJihMaS5pbml0Q2F0bXVsbFJvbSh2Lngsei54LEUueCxlLngsdGhpcy50ZW5zaW9uKSxNaS5pbml0Q2F0bXVsbFJvbSh2Lnksei55LEUueSxlLnksdGhpcy50ZW5zaW9uKSxOaS5pbml0Q2F0bXVsbFJvbSh2Lnosei56LEUueiwKZS56LHRoaXMudGVuc2lvbikpO2Muc2V0KExpLmNhbGMoYSksTWkuY2FsYyhhKSxOaS5jYWxjKGEpKTtyZXR1cm4gY307WmIucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMucG9pbnRzPVtdO2Zvcih2YXIgYz0wLGU9YS5wb2ludHMubGVuZ3RoO2M8ZTtjKyspdGhpcy5wb2ludHMucHVzaChhLnBvaW50c1tjXS5jbG9uZSgpKTt0aGlzLmNsb3NlZD1hLmNsb3NlZDt0aGlzLmN1cnZlVHlwZT1hLmN1cnZlVHlwZTt0aGlzLnRlbnNpb249YS50ZW5zaW9uO3JldHVybiB0aGlzfTtaYi5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EucG9pbnRzPVtdO2Zvcih2YXIgYz0wLGU9dGhpcy5wb2ludHMubGVuZ3RoO2M8ZTtjKyspYS5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tjXS50b0FycmF5KCkpO2EuY2xvc2VkPXRoaXMuY2xvc2VkO2EuY3VydmVUeXBlPXRoaXMuY3VydmVUeXBlOwphLnRlbnNpb249dGhpcy50ZW5zaW9uO3JldHVybiBhfTtaYi5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPWEucG9pbnRzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz1hLnBvaW50c1tjXTt0aGlzLnBvaW50cy5wdXNoKChuZXcgaykuZnJvbUFycmF5KGcpKX10aGlzLmNsb3NlZD1hLmNsb3NlZDt0aGlzLmN1cnZlVHlwZT1hLmN1cnZlVHlwZTt0aGlzLnRlbnNpb249YS50ZW5zaW9uO3JldHVybiB0aGlzfTtDYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO0NjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1DYztDYy5wcm90b3R5cGUuaXNDdWJpY0JlemllckN1cnZlPSEwO0NjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGY7dmFyIGU9dGhpcy52MCxnPXRoaXMudjEscj10aGlzLnYyLHY9dGhpcy52MztjLnNldChhZyhhLAplLngsZy54LHIueCx2LngpLGFnKGEsZS55LGcueSxyLnksdi55KSk7cmV0dXJuIGN9O0NjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYwLmNvcHkoYS52MCk7dGhpcy52MS5jb3B5KGEudjEpO3RoaXMudjIuY29weShhLnYyKTt0aGlzLnYzLmNvcHkoYS52Myk7cmV0dXJuIHRoaXN9O0NjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT1aYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS52MD10aGlzLnYwLnRvQXJyYXkoKTthLnYxPXRoaXMudjEudG9BcnJheSgpO2EudjI9dGhpcy52Mi50b0FycmF5KCk7YS52Mz10aGlzLnYzLnRvQXJyYXkoKTtyZXR1cm4gYX07Q2MucHJvdG90eXBlLmZyb21KU09OPWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKHRoaXMsYSk7dGhpcy52MC5mcm9tQXJyYXkoYS52MCk7dGhpcy52MS5mcm9tQXJyYXkoYS52MSk7dGhpcy52Mi5mcm9tQXJyYXkoYS52Mik7CnRoaXMudjMuZnJvbUFycmF5KGEudjMpO3JldHVybiB0aGlzfTtUYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO1RjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1UYztUYy5wcm90b3R5cGUuaXNDdWJpY0JlemllckN1cnZlMz0hMDtUYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBrO3ZhciBlPXRoaXMudjAsZz10aGlzLnYxLHI9dGhpcy52Mix2PXRoaXMudjM7Yy5zZXQoYWcoYSxlLngsZy54LHIueCx2LngpLGFnKGEsZS55LGcueSxyLnksdi55KSxhZyhhLGUueixnLnosci56LHYueikpO3JldHVybiBjfTtUYy5wcm90b3R5cGUuY29weT1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy52MC5jb3B5KGEudjApO3RoaXMudjEuY29weShhLnYxKTt0aGlzLnYyLmNvcHkoYS52Mik7dGhpcy52My5jb3B5KGEudjMpO3JldHVybiB0aGlzfTtUYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9ClphLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLnYwPXRoaXMudjAudG9BcnJheSgpO2EudjE9dGhpcy52MS50b0FycmF5KCk7YS52Mj10aGlzLnYyLnRvQXJyYXkoKTthLnYzPXRoaXMudjMudG9BcnJheSgpO3JldHVybiBhfTtUYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYwLmZyb21BcnJheShhLnYwKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTt0aGlzLnYyLmZyb21BcnJheShhLnYyKTt0aGlzLnYzLmZyb21BcnJheShhLnYzKTtyZXR1cm4gdGhpc307a2MucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTtrYy5wcm90b3R5cGUuY29uc3RydWN0b3I9a2M7a2MucHJvdG90eXBlLmlzTGluZUN1cnZlPSEwO2tjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGY7MT09PWE/Yy5jb3B5KHRoaXMudjIpOihjLmNvcHkodGhpcy52Mikuc3ViKHRoaXMudjEpLApjLm11bHRpcGx5U2NhbGFyKGEpLmFkZCh0aGlzLnYxKSk7cmV0dXJuIGN9O2tjLnByb3RvdHlwZS5nZXRQb2ludEF0PWZ1bmN0aW9uKGEsYyl7cmV0dXJuIHRoaXMuZ2V0UG9pbnQoYSxjKX07a2MucHJvdG90eXBlLmdldFRhbmdlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52Mi5jbG9uZSgpLnN1Yih0aGlzLnYxKS5ub3JtYWxpemUoKX07a2MucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMudjEuY29weShhLnYxKTt0aGlzLnYyLmNvcHkoYS52Mik7cmV0dXJuIHRoaXN9O2tjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT1aYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBhfTtrYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTsKdGhpcy52Mi5mcm9tQXJyYXkoYS52Mik7cmV0dXJuIHRoaXN9O0RjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7RGMucHJvdG90eXBlLmNvbnN0cnVjdG9yPURjO0RjLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZTM9ITA7RGMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHxuZXcgazsxPT09YT9jLmNvcHkodGhpcy52Mik6KGMuY29weSh0aGlzLnYyKS5zdWIodGhpcy52MSksYy5tdWx0aXBseVNjYWxhcihhKS5hZGQodGhpcy52MSkpO3JldHVybiBjfTtEYy5wcm90b3R5cGUuZ2V0UG9pbnRBdD1mdW5jdGlvbihhLGMpe3JldHVybiB0aGlzLmdldFBvaW50KGEsYyl9O0RjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3JldHVybiB0aGlzfTtEYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpOwphLnYxPXRoaXMudjEudG9BcnJheSgpO2EudjI9dGhpcy52Mi50b0FycmF5KCk7cmV0dXJuIGF9O0RjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGEpO3RoaXMudjEuZnJvbUFycmF5KGEudjEpO3RoaXMudjIuZnJvbUFycmF5KGEudjIpO3JldHVybiB0aGlzfTtFYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO0VjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1FYztFYy5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZT0hMDtFYy5wcm90b3R5cGUuZ2V0UG9pbnQ9ZnVuY3Rpb24oYSxjKXtjPWN8fG5ldyBmO3ZhciBlPXRoaXMudjAsZz10aGlzLnYxLHI9dGhpcy52MjtjLnNldCgkZihhLGUueCxnLngsci54KSwkZihhLGUueSxnLnksci55KSk7cmV0dXJuIGN9O0VjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnYwLmNvcHkoYS52MCk7CnRoaXMudjEuY29weShhLnYxKTt0aGlzLnYyLmNvcHkoYS52Mik7cmV0dXJuIHRoaXN9O0VjLnByb3RvdHlwZS50b0pTT049ZnVuY3Rpb24oKXt2YXIgYT1aYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS52MD10aGlzLnYwLnRvQXJyYXkoKTthLnYxPXRoaXMudjEudG9BcnJheSgpO2EudjI9dGhpcy52Mi50b0FycmF5KCk7cmV0dXJuIGF9O0VjLnByb3RvdHlwZS5mcm9tSlNPTj1mdW5jdGlvbihhKXtaYS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCh0aGlzLGEpO3RoaXMudjAuZnJvbUFycmF5KGEudjApO3RoaXMudjEuZnJvbUFycmF5KGEudjEpO3RoaXMudjIuZnJvbUFycmF5KGEudjIpO3JldHVybiB0aGlzfTtVYy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShaYS5wcm90b3R5cGUpO1VjLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1VYztVYy5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZTM9ITA7VWMucHJvdG90eXBlLmdldFBvaW50PWZ1bmN0aW9uKGEsYyl7Yz1jfHwKbmV3IGs7dmFyIGU9dGhpcy52MCxnPXRoaXMudjEscj10aGlzLnYyO2Muc2V0KCRmKGEsZS54LGcueCxyLngpLCRmKGEsZS55LGcueSxyLnkpLCRmKGEsZS56LGcueixyLnopKTtyZXR1cm4gY307VWMucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMudjAuY29weShhLnYwKTt0aGlzLnYxLmNvcHkoYS52MSk7dGhpcy52Mi5jb3B5KGEudjIpO3JldHVybiB0aGlzfTtVYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudjA9dGhpcy52MC50b0FycmF5KCk7YS52MT10aGlzLnYxLnRvQXJyYXkoKTthLnYyPXRoaXMudjIudG9BcnJheSgpO3JldHVybiBhfTtVYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnYwLmZyb21BcnJheShhLnYwKTt0aGlzLnYxLmZyb21BcnJheShhLnYxKTsKdGhpcy52Mi5mcm9tQXJyYXkoYS52Mik7cmV0dXJuIHRoaXN9O0ZjLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFphLnByb3RvdHlwZSk7RmMucHJvdG90eXBlLmNvbnN0cnVjdG9yPUZjO0ZjLnByb3RvdHlwZS5pc1NwbGluZUN1cnZlPSEwO0ZjLnByb3RvdHlwZS5nZXRQb2ludD1mdW5jdGlvbihhLGMpe2M9Y3x8bmV3IGY7dmFyIGU9dGhpcy5wb2ludHMsZz0oZS5sZW5ndGgtMSkqYTthPU1hdGguZmxvb3IoZyk7Zy09YTt2YXIgcj1lWzA9PT1hP2E6YS0xXSx2PWVbYV0sej1lW2E+ZS5sZW5ndGgtMj9lLmxlbmd0aC0xOmErMV07ZT1lW2E+ZS5sZW5ndGgtMz9lLmxlbmd0aC0xOmErMl07Yy5zZXQoUGooZyxyLngsdi54LHoueCxlLngpLFBqKGcsci55LHYueSx6LnksZS55KSk7cmV0dXJuIGN9O0ZjLnByb3RvdHlwZS5jb3B5PWZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPWEucG9pbnRzLmxlbmd0aDtjPAplO2MrKyl0aGlzLnBvaW50cy5wdXNoKGEucG9pbnRzW2NdLmNsb25lKCkpO3JldHVybiB0aGlzfTtGYy5wcm90b3R5cGUudG9KU09OPWZ1bmN0aW9uKCl7dmFyIGE9WmEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EucG9pbnRzPVtdO2Zvcih2YXIgYz0wLGU9dGhpcy5wb2ludHMubGVuZ3RoO2M8ZTtjKyspYS5wb2ludHMucHVzaCh0aGlzLnBvaW50c1tjXS50b0FycmF5KCkpO3JldHVybiBhfTtGYy5wcm90b3R5cGUuZnJvbUpTT049ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnBvaW50cz1bXTtmb3IodmFyIGM9MCxlPWEucG9pbnRzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz1hLnBvaW50c1tjXTt0aGlzLnBvaW50cy5wdXNoKChuZXcgZikuZnJvbUFycmF5KGcpKX1yZXR1cm4gdGhpc307dmFyIE9pPU9iamVjdC5mcmVlemUoe0FyY0N1cnZlOlZlLENhdG11bGxSb21DdXJ2ZTM6WmIsQ3ViaWNCZXppZXJDdXJ2ZTpDYyxDdWJpY0JlemllckN1cnZlMzpUYywKRWxsaXBzZUN1cnZlOnBjLExpbmVDdXJ2ZTprYyxMaW5lQ3VydmUzOkRjLFF1YWRyYXRpY0JlemllckN1cnZlOkVjLFF1YWRyYXRpY0JlemllckN1cnZlMzpVYyxTcGxpbmVDdXJ2ZTpGY30pO2dkLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6Z2QsYWRkOmZ1bmN0aW9uKGEpe3RoaXMuY3VydmVzLnB1c2goYSl9LGNsb3NlUGF0aDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuY3VydmVzWzBdLmdldFBvaW50KDApLGM9dGhpcy5jdXJ2ZXNbdGhpcy5jdXJ2ZXMubGVuZ3RoLTFdLmdldFBvaW50KDEpO2EuZXF1YWxzKGMpfHx0aGlzLmN1cnZlcy5wdXNoKG5ldyBrYyhjLGEpKX0sZ2V0UG9pbnQ6ZnVuY3Rpb24oYSl7dmFyIGM9YSp0aGlzLmdldExlbmd0aCgpLGU9dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtmb3IoYT0wO2E8ZS5sZW5ndGg7KXtpZihlW2FdPj1jKXJldHVybiBjPWVbYV0tYyxhPXRoaXMuY3VydmVzW2FdLGU9CmEuZ2V0TGVuZ3RoKCksYS5nZXRQb2ludEF0KDA9PT1lPzA6MS1jL2UpO2ErK31yZXR1cm4gbnVsbH0sZ2V0TGVuZ3RoOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRDdXJ2ZUxlbmd0aHMoKTtyZXR1cm4gYVthLmxlbmd0aC0xXX0sdXBkYXRlQXJjTGVuZ3RoczpmdW5jdGlvbigpe3RoaXMubmVlZHNVcGRhdGU9ITA7dGhpcy5jYWNoZUxlbmd0aHM9bnVsbDt0aGlzLmdldEN1cnZlTGVuZ3RocygpfSxnZXRDdXJ2ZUxlbmd0aHM6ZnVuY3Rpb24oKXtpZih0aGlzLmNhY2hlTGVuZ3RocyYmdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoPT09dGhpcy5jdXJ2ZXMubGVuZ3RoKXJldHVybiB0aGlzLmNhY2hlTGVuZ3Rocztmb3IodmFyIGE9W10sYz0wLGU9MCxnPXRoaXMuY3VydmVzLmxlbmd0aDtlPGc7ZSsrKWMrPXRoaXMuY3VydmVzW2VdLmdldExlbmd0aCgpLGEucHVzaChjKTtyZXR1cm4gdGhpcy5jYWNoZUxlbmd0aHM9YX0sZ2V0U3BhY2VkUG9pbnRzOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoYT00MCk7Zm9yKHZhciBjPVtdLGU9MDtlPD1hO2UrKyljLnB1c2godGhpcy5nZXRQb2ludChlL2EpKTt0aGlzLmF1dG9DbG9zZSYmYy5wdXNoKGNbMF0pO3JldHVybiBjfSxnZXRQb2ludHM6ZnVuY3Rpb24oYSl7YT1hfHwxMjtmb3IodmFyIGM9W10sZSxnPTAscj10aGlzLmN1cnZlcztnPHIubGVuZ3RoO2crKyl7dmFyIHY9cltnXTt2PXYuZ2V0UG9pbnRzKHYmJnYuaXNFbGxpcHNlQ3VydmU/MiphOnYmJih2LmlzTGluZUN1cnZlfHx2LmlzTGluZUN1cnZlMyk/MTp2JiZ2LmlzU3BsaW5lQ3VydmU/YSp2LnBvaW50cy5sZW5ndGg6YSk7Zm9yKHZhciB6PTA7ejx2Lmxlbmd0aDt6Kyspe3ZhciBFPXZbel07ZSYmZS5lcXVhbHMoRSl8fChjLnB1c2goRSksZT1FKX19dGhpcy5hdXRvQ2xvc2UmJjE8Yy5sZW5ndGgmJiFjW2MubGVuZ3RoLTFdLmVxdWFscyhjWzBdKSYmYy5wdXNoKGNbMF0pO3JldHVybiBjfSxjb3B5OmZ1bmN0aW9uKGEpe1phLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSk7dGhpcy5jdXJ2ZXM9W107Zm9yKHZhciBjPTAsZT1hLmN1cnZlcy5sZW5ndGg7YzxlO2MrKyl0aGlzLmN1cnZlcy5wdXNoKGEuY3VydmVzW2NdLmNsb25lKCkpO3RoaXMuYXV0b0Nsb3NlPWEuYXV0b0Nsb3NlO3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oKXt2YXIgYT1aYS5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyk7YS5hdXRvQ2xvc2U9dGhpcy5hdXRvQ2xvc2U7YS5jdXJ2ZXM9W107Zm9yKHZhciBjPTAsZT10aGlzLmN1cnZlcy5sZW5ndGg7YzxlO2MrKylhLmN1cnZlcy5wdXNoKHRoaXMuY3VydmVzW2NdLnRvSlNPTigpKTtyZXR1cm4gYX0sZnJvbUpTT046ZnVuY3Rpb24oYSl7WmEucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLmF1dG9DbG9zZT1hLmF1dG9DbG9zZTt0aGlzLmN1cnZlcz1bXTtmb3IodmFyIGM9MCxlPWEuY3VydmVzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz1hLmN1cnZlc1tjXTt0aGlzLmN1cnZlcy5wdXNoKChuZXcgT2lbZy50eXBlXSkuZnJvbUpTT04oZykpfXJldHVybiB0aGlzfX0pOwpHYy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGdkLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkdjLHNldEZyb21Qb2ludHM6ZnVuY3Rpb24oYSl7dGhpcy5tb3ZlVG8oYVswXS54LGFbMF0ueSk7Zm9yKHZhciBjPTEsZT1hLmxlbmd0aDtjPGU7YysrKXRoaXMubGluZVRvKGFbY10ueCxhW2NdLnkpfSxtb3ZlVG86ZnVuY3Rpb24oYSxjKXt0aGlzLmN1cnJlbnRQb2ludC5zZXQoYSxjKX0sbGluZVRvOmZ1bmN0aW9uKGEsYyl7dmFyIGU9bmV3IGtjKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IGYoYSxjKSk7dGhpcy5jdXJ2ZXMucHVzaChlKTt0aGlzLmN1cnJlbnRQb2ludC5zZXQoYSxjKX0scXVhZHJhdGljQ3VydmVUbzpmdW5jdGlvbihhLGMsZSxnKXthPW5ldyBFYyh0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLG5ldyBmKGEsYyksbmV3IGYoZSxnKSk7dGhpcy5jdXJ2ZXMucHVzaChhKTt0aGlzLmN1cnJlbnRQb2ludC5zZXQoZSxnKX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbihhLApjLGUsZyxyLHYpe2E9bmV3IENjKHRoaXMuY3VycmVudFBvaW50LmNsb25lKCksbmV3IGYoYSxjKSxuZXcgZihlLGcpLG5ldyBmKHIsdikpO3RoaXMuY3VydmVzLnB1c2goYSk7dGhpcy5jdXJyZW50UG9pbnQuc2V0KHIsdil9LHNwbGluZVRocnU6ZnVuY3Rpb24oYSl7dmFyIGM9W3RoaXMuY3VycmVudFBvaW50LmNsb25lKCldLmNvbmNhdChhKTtjPW5ldyBGYyhjKTt0aGlzLmN1cnZlcy5wdXNoKGMpO3RoaXMuY3VycmVudFBvaW50LmNvcHkoYVthLmxlbmd0aC0xXSl9LGFyYzpmdW5jdGlvbihhLGMsZSxnLHIsdil7dGhpcy5hYnNhcmMoYSt0aGlzLmN1cnJlbnRQb2ludC54LGMrdGhpcy5jdXJyZW50UG9pbnQueSxlLGcscix2KX0sYWJzYXJjOmZ1bmN0aW9uKGEsYyxlLGcscix2KXt0aGlzLmFic2VsbGlwc2UoYSxjLGUsZSxnLHIsdil9LGVsbGlwc2U6ZnVuY3Rpb24oYSxjLGUsZyxyLHYseixFKXt0aGlzLmFic2VsbGlwc2UoYSt0aGlzLmN1cnJlbnRQb2ludC54LGMrdGhpcy5jdXJyZW50UG9pbnQueSwKZSxnLHIsdix6LEUpfSxhYnNlbGxpcHNlOmZ1bmN0aW9uKGEsYyxlLGcscix2LHosRSl7YT1uZXcgcGMoYSxjLGUsZyxyLHYseixFKTswPHRoaXMuY3VydmVzLmxlbmd0aCYmKGM9YS5nZXRQb2ludCgwKSxjLmVxdWFscyh0aGlzLmN1cnJlbnRQb2ludCl8fHRoaXMubGluZVRvKGMueCxjLnkpKTt0aGlzLmN1cnZlcy5wdXNoKGEpO2E9YS5nZXRQb2ludCgxKTt0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGEpfSxjb3B5OmZ1bmN0aW9uKGEpe2dkLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmN1cnJlbnRQb2ludC5jb3B5KGEuY3VycmVudFBvaW50KTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGE9Z2QucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EuY3VycmVudFBvaW50PXRoaXMuY3VycmVudFBvaW50LnRvQXJyYXkoKTtyZXR1cm4gYX0sZnJvbUpTT046ZnVuY3Rpb24oYSl7Z2QucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLmN1cnJlbnRQb2ludC5mcm9tQXJyYXkoYS5jdXJyZW50UG9pbnQpOwpyZXR1cm4gdGhpc319KTtDZC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEdjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkNkLGdldFBvaW50c0hvbGVzOmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1bXSxlPTAsZz10aGlzLmhvbGVzLmxlbmd0aDtlPGc7ZSsrKWNbZV09dGhpcy5ob2xlc1tlXS5nZXRQb2ludHMoYSk7cmV0dXJuIGN9LGV4dHJhY3RQb2ludHM6ZnVuY3Rpb24oYSl7cmV0dXJue3NoYXBlOnRoaXMuZ2V0UG9pbnRzKGEpLGhvbGVzOnRoaXMuZ2V0UG9pbnRzSG9sZXMoYSl9fSxjb3B5OmZ1bmN0aW9uKGEpe0djLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmhvbGVzPVtdO2Zvcih2YXIgYz0wLGU9YS5ob2xlcy5sZW5ndGg7YzxlO2MrKyl0aGlzLmhvbGVzLnB1c2goYS5ob2xlc1tjXS5jbG9uZSgpKTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKCl7dmFyIGE9R2MucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EudXVpZD10aGlzLnV1aWQ7CmEuaG9sZXM9W107Zm9yKHZhciBjPTAsZT10aGlzLmhvbGVzLmxlbmd0aDtjPGU7YysrKWEuaG9sZXMucHVzaCh0aGlzLmhvbGVzW2NdLnRvSlNPTigpKTtyZXR1cm4gYX0sZnJvbUpTT046ZnVuY3Rpb24oYSl7R2MucHJvdG90eXBlLmZyb21KU09OLmNhbGwodGhpcyxhKTt0aGlzLnV1aWQ9YS51dWlkO3RoaXMuaG9sZXM9W107Zm9yKHZhciBjPTAsZT1hLmhvbGVzLmxlbmd0aDtjPGU7YysrKXt2YXIgZz1hLmhvbGVzW2NdO3RoaXMuaG9sZXMucHVzaCgobmV3IEdjKS5mcm9tSlNPTihnKSl9cmV0dXJuIHRoaXN9fSk7SmIucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkpiLGlzTGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmNvbG9yLmNvcHkoYS5jb2xvcik7dGhpcy5pbnRlbnNpdHk9YS5pbnRlbnNpdHk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXthPQpBLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2Eub2JqZWN0LmNvbG9yPXRoaXMuY29sb3IuZ2V0SGV4KCk7YS5vYmplY3QuaW50ZW5zaXR5PXRoaXMuaW50ZW5zaXR5O3ZvaWQgMCE9PXRoaXMuZ3JvdW5kQ29sb3ImJihhLm9iamVjdC5ncm91bmRDb2xvcj10aGlzLmdyb3VuZENvbG9yLmdldEhleCgpKTt2b2lkIDAhPT10aGlzLmRpc3RhbmNlJiYoYS5vYmplY3QuZGlzdGFuY2U9dGhpcy5kaXN0YW5jZSk7dm9pZCAwIT09dGhpcy5hbmdsZSYmKGEub2JqZWN0LmFuZ2xlPXRoaXMuYW5nbGUpO3ZvaWQgMCE9PXRoaXMuZGVjYXkmJihhLm9iamVjdC5kZWNheT10aGlzLmRlY2F5KTt2b2lkIDAhPT10aGlzLnBlbnVtYnJhJiYoYS5vYmplY3QucGVudW1icmE9dGhpcy5wZW51bWJyYSk7dm9pZCAwIT09dGhpcy5zaGFkb3cmJihhLm9iamVjdC5zaGFkb3c9dGhpcy5zaGFkb3cudG9KU09OKCkpO3JldHVybiBhfX0pO05nLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoSmIucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOk5nLGlzSGVtaXNwaGVyZUxpZ2h0OiEwLGNvcHk6ZnVuY3Rpb24oYSl7SmIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZ3JvdW5kQ29sb3IuY29weShhLmdyb3VuZENvbG9yKTtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKFZjLnByb3RvdHlwZSx7X3Byb2pTY3JlZW5NYXRyaXg6bmV3IHEsX2xpZ2h0UG9zaXRpb25Xb3JsZDpuZXcgayxfbG9va1RhcmdldDpuZXcgayxnZXRWaWV3cG9ydENvdW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3ZpZXdwb3J0Q291bnR9LGdldEZydXN0dW06ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnJ1c3R1bX0sdXBkYXRlTWF0cmljZXM6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5jYW1lcmEsZT10aGlzLm1hdHJpeCxnPXRoaXMuX3Byb2pTY3JlZW5NYXRyaXgscj10aGlzLl9sb29rVGFyZ2V0LHY9dGhpcy5fbGlnaHRQb3NpdGlvbldvcmxkO3Yuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGEubWF0cml4V29ybGQpOwpjLnBvc2l0aW9uLmNvcHkodik7ci5zZXRGcm9tTWF0cml4UG9zaXRpb24oYS50YXJnZXQubWF0cml4V29ybGQpO2MubG9va0F0KHIpO2MudXBkYXRlTWF0cml4V29ybGQoKTtnLm11bHRpcGx5TWF0cmljZXMoYy5wcm9qZWN0aW9uTWF0cml4LGMubWF0cml4V29ybGRJbnZlcnNlKTt0aGlzLl9mcnVzdHVtLnNldEZyb21NYXRyaXgoZyk7ZS5zZXQoLjUsMCwwLC41LDAsLjUsMCwuNSwwLDAsLjUsLjUsMCwwLDAsMSk7ZS5tdWx0aXBseShjLnByb2plY3Rpb25NYXRyaXgpO2UubXVsdGlwbHkoYy5tYXRyaXhXb3JsZEludmVyc2UpfSxnZXRWaWV3cG9ydDpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5fdmlld3BvcnRzW2FdfSxnZXRGcmFtZUV4dGVudHM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZnJhbWVFeHRlbnRzfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuY2FtZXJhPWEuY2FtZXJhLmNsb25lKCk7dGhpcy5iaWFzPWEuYmlhczt0aGlzLnJhZGl1cz1hLnJhZGl1czt0aGlzLm1hcFNpemUuY29weShhLm1hcFNpemUpOwpyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPXt9OzAhPT10aGlzLmJpYXMmJihhLmJpYXM9dGhpcy5iaWFzKTsxIT09dGhpcy5yYWRpdXMmJihhLnJhZGl1cz10aGlzLnJhZGl1cyk7aWYoNTEyIT09dGhpcy5tYXBTaXplLnh8fDUxMiE9PXRoaXMubWFwU2l6ZS55KWEubWFwU2l6ZT10aGlzLm1hcFNpemUudG9BcnJheSgpO2EuY2FtZXJhPXRoaXMuY2FtZXJhLnRvSlNPTighMSkub2JqZWN0O2RlbGV0ZSBhLmNhbWVyYS5tYXRyaXg7cmV0dXJuIGF9fSk7T2cucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShWYy5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpPZyxpc1Nwb3RMaWdodFNoYWRvdzohMCx1cGRhdGVNYXRyaWNlczpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5jYW1lcmEscj0yKmhiLlJBRDJERUcqYS5hbmdsZSx2PXRoaXMubWFwU2l6ZS53aWR0aC8KdGhpcy5tYXBTaXplLmhlaWdodCx6PWEuZGlzdGFuY2V8fGcuZmFyO2lmKHIhPT1nLmZvdnx8diE9PWcuYXNwZWN0fHx6IT09Zy5mYXIpZy5mb3Y9cixnLmFzcGVjdD12LGcuZmFyPXosZy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7VmMucHJvdG90eXBlLnVwZGF0ZU1hdHJpY2VzLmNhbGwodGhpcyxhLGMsZSl9fSk7UGcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShKYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpQZyxpc1Nwb3RMaWdodDohMCxjb3B5OmZ1bmN0aW9uKGEpe0piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLmRpc3RhbmNlPWEuZGlzdGFuY2U7dGhpcy5hbmdsZT1hLmFuZ2xlO3RoaXMucGVudW1icmE9YS5wZW51bWJyYTt0aGlzLmRlY2F5PWEuZGVjYXk7dGhpcy50YXJnZXQ9YS50YXJnZXQuY2xvbmUoKTt0aGlzLnNoYWRvdz1hLnNoYWRvdy5jbG9uZSgpO3JldHVybiB0aGlzfX0pO2RpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoVmMucHJvdG90eXBlKSwKe2NvbnN0cnVjdG9yOmRpLGlzUG9pbnRMaWdodFNoYWRvdzohMCx1cGRhdGVNYXRyaWNlczpmdW5jdGlvbihhLGMsZSl7Yz10aGlzLmNhbWVyYTt2YXIgZz10aGlzLm1hdHJpeCxyPXRoaXMuX2xpZ2h0UG9zaXRpb25Xb3JsZCx2PXRoaXMuX2xvb2tUYXJnZXQsej10aGlzLl9wcm9qU2NyZWVuTWF0cml4O3Iuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGEubWF0cml4V29ybGQpO2MucG9zaXRpb24uY29weShyKTt2LmNvcHkoYy5wb3NpdGlvbik7di5hZGQodGhpcy5fY3ViZURpcmVjdGlvbnNbZV0pO2MudXAuY29weSh0aGlzLl9jdWJlVXBzW2VdKTtjLmxvb2tBdCh2KTtjLnVwZGF0ZU1hdHJpeFdvcmxkKCk7Zy5tYWtlVHJhbnNsYXRpb24oLXIueCwtci55LC1yLnopO3oubXVsdGlwbHlNYXRyaWNlcyhjLnByb2plY3Rpb25NYXRyaXgsYy5tYXRyaXhXb3JsZEludmVyc2UpO3RoaXMuX2ZydXN0dW0uc2V0RnJvbU1hdHJpeCh6KX19KTtRZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpRZyxpc1BvaW50TGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtKYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5kaXN0YW5jZT1hLmRpc3RhbmNlO3RoaXMuZGVjYXk9YS5kZWNheTt0aGlzLnNoYWRvdz1hLnNoYWRvdy5jbG9uZSgpO3JldHVybiB0aGlzfX0pO2JnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoemIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6YmcsaXNPcnRob2dyYXBoaWNDYW1lcmE6ITAsY29weTpmdW5jdGlvbihhLGMpe3piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhLGMpO3RoaXMubGVmdD1hLmxlZnQ7dGhpcy5yaWdodD1hLnJpZ2h0O3RoaXMudG9wPWEudG9wO3RoaXMuYm90dG9tPWEuYm90dG9tO3RoaXMubmVhcj1hLm5lYXI7dGhpcy5mYXI9YS5mYXI7dGhpcy56b29tPWEuem9vbTt0aGlzLnZpZXc9bnVsbD09PWEudmlldz9udWxsOk9iamVjdC5hc3NpZ24oe30sYS52aWV3KTtyZXR1cm4gdGhpc30sCnNldFZpZXdPZmZzZXQ6ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe251bGw9PT10aGlzLnZpZXcmJih0aGlzLnZpZXc9e2VuYWJsZWQ6ITAsZnVsbFdpZHRoOjEsZnVsbEhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pO3RoaXMudmlldy5lbmFibGVkPSEwO3RoaXMudmlldy5mdWxsV2lkdGg9YTt0aGlzLnZpZXcuZnVsbEhlaWdodD1jO3RoaXMudmlldy5vZmZzZXRYPWU7dGhpcy52aWV3Lm9mZnNldFk9Zzt0aGlzLnZpZXcud2lkdGg9cjt0aGlzLnZpZXcuaGVpZ2h0PXY7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9LGNsZWFyVmlld09mZnNldDpmdW5jdGlvbigpe251bGwhPT10aGlzLnZpZXcmJih0aGlzLnZpZXcuZW5hYmxlZD0hMSk7dGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9LHVwZGF0ZVByb2plY3Rpb25NYXRyaXg6ZnVuY3Rpb24oKXt2YXIgYT0odGhpcy5yaWdodC10aGlzLmxlZnQpLygyKnRoaXMuem9vbSksYz0odGhpcy50b3AtCnRoaXMuYm90dG9tKS8oMip0aGlzLnpvb20pLGU9KHRoaXMucmlnaHQrdGhpcy5sZWZ0KS8yLGc9KHRoaXMudG9wK3RoaXMuYm90dG9tKS8yLHI9ZS1hO2UrPWE7YT1nK2M7Yz1nLWM7aWYobnVsbCE9PXRoaXMudmlldyYmdGhpcy52aWV3LmVuYWJsZWQpe2U9dGhpcy56b29tLyh0aGlzLnZpZXcud2lkdGgvdGhpcy52aWV3LmZ1bGxXaWR0aCk7Yz10aGlzLnpvb20vKHRoaXMudmlldy5oZWlnaHQvdGhpcy52aWV3LmZ1bGxIZWlnaHQpO3ZhciB2PSh0aGlzLnJpZ2h0LXRoaXMubGVmdCkvdGhpcy52aWV3LndpZHRoO2c9KHRoaXMudG9wLXRoaXMuYm90dG9tKS90aGlzLnZpZXcuaGVpZ2h0O3IrPXRoaXMudmlldy5vZmZzZXRYL2UqdjtlPXIrdGhpcy52aWV3LndpZHRoL2UqdjthLT10aGlzLnZpZXcub2Zmc2V0WS9jKmc7Yz1hLXRoaXMudmlldy5oZWlnaHQvYypnfXRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlT3J0aG9ncmFwaGljKHIsZSxhLGMsdGhpcy5uZWFyLHRoaXMuZmFyKTt0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmdldEludmVyc2UodGhpcy5wcm9qZWN0aW9uTWF0cml4KX0sCnRvSlNPTjpmdW5jdGlvbihhKXthPUEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsYSk7YS5vYmplY3Quem9vbT10aGlzLnpvb207YS5vYmplY3QubGVmdD10aGlzLmxlZnQ7YS5vYmplY3QucmlnaHQ9dGhpcy5yaWdodDthLm9iamVjdC50b3A9dGhpcy50b3A7YS5vYmplY3QuYm90dG9tPXRoaXMuYm90dG9tO2Eub2JqZWN0Lm5lYXI9dGhpcy5uZWFyO2Eub2JqZWN0LmZhcj10aGlzLmZhcjtudWxsIT09dGhpcy52aWV3JiYoYS5vYmplY3Qudmlldz1PYmplY3QuYXNzaWduKHt9LHRoaXMudmlldykpO3JldHVybiBhfX0pO1JnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoVmMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6UmcsaXNEaXJlY3Rpb25hbExpZ2h0U2hhZG93OiEwLHVwZGF0ZU1hdHJpY2VzOmZ1bmN0aW9uKGEsYyxlKXtWYy5wcm90b3R5cGUudXBkYXRlTWF0cmljZXMuY2FsbCh0aGlzLGEsYyxlKX19KTtTZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpTZyxpc0RpcmVjdGlvbmFsTGlnaHQ6ITAsY29weTpmdW5jdGlvbihhKXtKYi5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy50YXJnZXQ9YS50YXJnZXQuY2xvbmUoKTt0aGlzLnNoYWRvdz1hLnNoYWRvdy5jbG9uZSgpO3JldHVybiB0aGlzfX0pO1RnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoSmIucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6VGcsaXNBbWJpZW50TGlnaHQ6ITB9KTtVZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlVnLGlzUmVjdEFyZWFMaWdodDohMCxjb3B5OmZ1bmN0aW9uKGEpe0piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTt0aGlzLndpZHRoPWEud2lkdGg7dGhpcy5oZWlnaHQ9YS5oZWlnaHQ7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXthPUpiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpO2Eub2JqZWN0LndpZHRoPQp0aGlzLndpZHRoO2Eub2JqZWN0LmhlaWdodD10aGlzLmhlaWdodDtyZXR1cm4gYX19KTtWZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOlZnLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9dGhpcyx2PW5ldyB1YyhyLm1hbmFnZXIpO3Yuc2V0UGF0aChyLnBhdGgpO3YubG9hZChhLGZ1bmN0aW9uKHope2Moci5wYXJzZShKU09OLnBhcnNlKHopKSl9LGUsZyl9LHBhcnNlOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGMoRSl7dm9pZCAwPT09ZVtFXSYmY29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbExvYWRlcjogVW5kZWZpbmVkIHRleHR1cmUiLEUpO3JldHVybiBlW0VdfXZhciBlPXRoaXMudGV4dHVyZXMsZz1uZXcgS21bYS50eXBlXTt2b2lkIDAhPT1hLnV1aWQmJihnLnV1aWQ9YS51dWlkKTt2b2lkIDAhPT1hLm5hbWUmJihnLm5hbWU9YS5uYW1lKTt2b2lkIDAhPT1hLmNvbG9yJiZnLmNvbG9yLnNldEhleChhLmNvbG9yKTsKdm9pZCAwIT09YS5yb3VnaG5lc3MmJihnLnJvdWdobmVzcz1hLnJvdWdobmVzcyk7dm9pZCAwIT09YS5tZXRhbG5lc3MmJihnLm1ldGFsbmVzcz1hLm1ldGFsbmVzcyk7dm9pZCAwIT09YS5lbWlzc2l2ZSYmZy5lbWlzc2l2ZS5zZXRIZXgoYS5lbWlzc2l2ZSk7dm9pZCAwIT09YS5zcGVjdWxhciYmZy5zcGVjdWxhci5zZXRIZXgoYS5zcGVjdWxhcik7dm9pZCAwIT09YS5zaGluaW5lc3MmJihnLnNoaW5pbmVzcz1hLnNoaW5pbmVzcyk7dm9pZCAwIT09YS5jbGVhcmNvYXQmJihnLmNsZWFyY29hdD1hLmNsZWFyY29hdCk7dm9pZCAwIT09YS5jbGVhcmNvYXRSb3VnaG5lc3MmJihnLmNsZWFyY29hdFJvdWdobmVzcz1hLmNsZWFyY29hdFJvdWdobmVzcyk7dm9pZCAwIT09YS52ZXJ0ZXhDb2xvcnMmJihnLnZlcnRleENvbG9ycz1hLnZlcnRleENvbG9ycyk7dm9pZCAwIT09YS5mb2cmJihnLmZvZz1hLmZvZyk7dm9pZCAwIT09YS5mbGF0U2hhZGluZyYmKGcuZmxhdFNoYWRpbmc9YS5mbGF0U2hhZGluZyk7CnZvaWQgMCE9PWEuYmxlbmRpbmcmJihnLmJsZW5kaW5nPWEuYmxlbmRpbmcpO3ZvaWQgMCE9PWEuY29tYmluZSYmKGcuY29tYmluZT1hLmNvbWJpbmUpO3ZvaWQgMCE9PWEuc2lkZSYmKGcuc2lkZT1hLnNpZGUpO3ZvaWQgMCE9PWEub3BhY2l0eSYmKGcub3BhY2l0eT1hLm9wYWNpdHkpO3ZvaWQgMCE9PWEudHJhbnNwYXJlbnQmJihnLnRyYW5zcGFyZW50PWEudHJhbnNwYXJlbnQpO3ZvaWQgMCE9PWEuYWxwaGFUZXN0JiYoZy5hbHBoYVRlc3Q9YS5hbHBoYVRlc3QpO3ZvaWQgMCE9PWEuZGVwdGhUZXN0JiYoZy5kZXB0aFRlc3Q9YS5kZXB0aFRlc3QpO3ZvaWQgMCE9PWEuZGVwdGhXcml0ZSYmKGcuZGVwdGhXcml0ZT1hLmRlcHRoV3JpdGUpO3ZvaWQgMCE9PWEuY29sb3JXcml0ZSYmKGcuY29sb3JXcml0ZT1hLmNvbG9yV3JpdGUpO3ZvaWQgMCE9PWEud2lyZWZyYW1lJiYoZy53aXJlZnJhbWU9YS53aXJlZnJhbWUpO3ZvaWQgMCE9PWEud2lyZWZyYW1lTGluZXdpZHRoJiYoZy53aXJlZnJhbWVMaW5ld2lkdGg9CmEud2lyZWZyYW1lTGluZXdpZHRoKTt2b2lkIDAhPT1hLndpcmVmcmFtZUxpbmVjYXAmJihnLndpcmVmcmFtZUxpbmVjYXA9YS53aXJlZnJhbWVMaW5lY2FwKTt2b2lkIDAhPT1hLndpcmVmcmFtZUxpbmVqb2luJiYoZy53aXJlZnJhbWVMaW5lam9pbj1hLndpcmVmcmFtZUxpbmVqb2luKTt2b2lkIDAhPT1hLnJvdGF0aW9uJiYoZy5yb3RhdGlvbj1hLnJvdGF0aW9uKTsxIT09YS5saW5ld2lkdGgmJihnLmxpbmV3aWR0aD1hLmxpbmV3aWR0aCk7dm9pZCAwIT09YS5kYXNoU2l6ZSYmKGcuZGFzaFNpemU9YS5kYXNoU2l6ZSk7dm9pZCAwIT09YS5nYXBTaXplJiYoZy5nYXBTaXplPWEuZ2FwU2l6ZSk7dm9pZCAwIT09YS5zY2FsZSYmKGcuc2NhbGU9YS5zY2FsZSk7dm9pZCAwIT09YS5wb2x5Z29uT2Zmc2V0JiYoZy5wb2x5Z29uT2Zmc2V0PWEucG9seWdvbk9mZnNldCk7dm9pZCAwIT09YS5wb2x5Z29uT2Zmc2V0RmFjdG9yJiYoZy5wb2x5Z29uT2Zmc2V0RmFjdG9yPWEucG9seWdvbk9mZnNldEZhY3Rvcik7CnZvaWQgMCE9PWEucG9seWdvbk9mZnNldFVuaXRzJiYoZy5wb2x5Z29uT2Zmc2V0VW5pdHM9YS5wb2x5Z29uT2Zmc2V0VW5pdHMpO3ZvaWQgMCE9PWEuc2tpbm5pbmcmJihnLnNraW5uaW5nPWEuc2tpbm5pbmcpO3ZvaWQgMCE9PWEubW9ycGhUYXJnZXRzJiYoZy5tb3JwaFRhcmdldHM9YS5tb3JwaFRhcmdldHMpO3ZvaWQgMCE9PWEubW9ycGhOb3JtYWxzJiYoZy5tb3JwaE5vcm1hbHM9YS5tb3JwaE5vcm1hbHMpO3ZvaWQgMCE9PWEuZGl0aGVyaW5nJiYoZy5kaXRoZXJpbmc9YS5kaXRoZXJpbmcpO3ZvaWQgMCE9PWEudmlzaWJsZSYmKGcudmlzaWJsZT1hLnZpc2libGUpO3ZvaWQgMCE9PWEudG9uZU1hcHBlZCYmKGcudG9uZU1hcHBlZD1hLnRvbmVNYXBwZWQpO3ZvaWQgMCE9PWEudXNlckRhdGEmJihnLnVzZXJEYXRhPWEudXNlckRhdGEpO2lmKHZvaWQgMCE9PWEudW5pZm9ybXMpZm9yKHZhciByIGluIGEudW5pZm9ybXMpe3ZhciB2PWEudW5pZm9ybXNbcl07Zy51bmlmb3Jtc1tyXT0Ke307c3dpdGNoKHYudHlwZSl7Y2FzZSAidCI6Zy51bmlmb3Jtc1tyXS52YWx1ZT1jKHYudmFsdWUpO2JyZWFrO2Nhc2UgImMiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBJKS5zZXRIZXgodi52YWx1ZSk7YnJlYWs7Y2FzZSAidjIiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBmKS5mcm9tQXJyYXkodi52YWx1ZSk7YnJlYWs7Y2FzZSAidjMiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBrKS5mcm9tQXJyYXkodi52YWx1ZSk7YnJlYWs7Y2FzZSAidjQiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBwKS5mcm9tQXJyYXkodi52YWx1ZSk7YnJlYWs7Y2FzZSAibTMiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyB0KS5mcm9tQXJyYXkodi52YWx1ZSk7Y2FzZSAibTQiOmcudW5pZm9ybXNbcl0udmFsdWU9KG5ldyBxKS5mcm9tQXJyYXkodi52YWx1ZSk7YnJlYWs7ZGVmYXVsdDpnLnVuaWZvcm1zW3JdLnZhbHVlPXYudmFsdWV9fXZvaWQgMCE9PWEuZGVmaW5lcyYmKGcuZGVmaW5lcz1hLmRlZmluZXMpOwp2b2lkIDAhPT1hLnZlcnRleFNoYWRlciYmKGcudmVydGV4U2hhZGVyPWEudmVydGV4U2hhZGVyKTt2b2lkIDAhPT1hLmZyYWdtZW50U2hhZGVyJiYoZy5mcmFnbWVudFNoYWRlcj1hLmZyYWdtZW50U2hhZGVyKTtpZih2b2lkIDAhPT1hLmV4dGVuc2lvbnMpZm9yKHZhciB6IGluIGEuZXh0ZW5zaW9ucylnLmV4dGVuc2lvbnNbel09YS5leHRlbnNpb25zW3pdO3ZvaWQgMCE9PWEuc2hhZGluZyYmKGcuZmxhdFNoYWRpbmc9MT09PWEuc2hhZGluZyk7dm9pZCAwIT09YS5zaXplJiYoZy5zaXplPWEuc2l6ZSk7dm9pZCAwIT09YS5zaXplQXR0ZW51YXRpb24mJihnLnNpemVBdHRlbnVhdGlvbj1hLnNpemVBdHRlbnVhdGlvbik7dm9pZCAwIT09YS5tYXAmJihnLm1hcD1jKGEubWFwKSk7dm9pZCAwIT09YS5tYXRjYXAmJihnLm1hdGNhcD1jKGEubWF0Y2FwKSk7dm9pZCAwIT09YS5hbHBoYU1hcCYmKGcuYWxwaGFNYXA9YyhhLmFscGhhTWFwKSxnLnRyYW5zcGFyZW50PSEwKTt2b2lkIDAhPT0KYS5idW1wTWFwJiYoZy5idW1wTWFwPWMoYS5idW1wTWFwKSk7dm9pZCAwIT09YS5idW1wU2NhbGUmJihnLmJ1bXBTY2FsZT1hLmJ1bXBTY2FsZSk7dm9pZCAwIT09YS5ub3JtYWxNYXAmJihnLm5vcm1hbE1hcD1jKGEubm9ybWFsTWFwKSk7dm9pZCAwIT09YS5ub3JtYWxNYXBUeXBlJiYoZy5ub3JtYWxNYXBUeXBlPWEubm9ybWFsTWFwVHlwZSk7dm9pZCAwIT09YS5ub3JtYWxTY2FsZSYmKHI9YS5ub3JtYWxTY2FsZSwhMT09PUFycmF5LmlzQXJyYXkocikmJihyPVtyLHJdKSxnLm5vcm1hbFNjYWxlPShuZXcgZikuZnJvbUFycmF5KHIpKTt2b2lkIDAhPT1hLmRpc3BsYWNlbWVudE1hcCYmKGcuZGlzcGxhY2VtZW50TWFwPWMoYS5kaXNwbGFjZW1lbnRNYXApKTt2b2lkIDAhPT1hLmRpc3BsYWNlbWVudFNjYWxlJiYoZy5kaXNwbGFjZW1lbnRTY2FsZT1hLmRpc3BsYWNlbWVudFNjYWxlKTt2b2lkIDAhPT1hLmRpc3BsYWNlbWVudEJpYXMmJihnLmRpc3BsYWNlbWVudEJpYXM9YS5kaXNwbGFjZW1lbnRCaWFzKTsKdm9pZCAwIT09YS5yb3VnaG5lc3NNYXAmJihnLnJvdWdobmVzc01hcD1jKGEucm91Z2huZXNzTWFwKSk7dm9pZCAwIT09YS5tZXRhbG5lc3NNYXAmJihnLm1ldGFsbmVzc01hcD1jKGEubWV0YWxuZXNzTWFwKSk7dm9pZCAwIT09YS5lbWlzc2l2ZU1hcCYmKGcuZW1pc3NpdmVNYXA9YyhhLmVtaXNzaXZlTWFwKSk7dm9pZCAwIT09YS5lbWlzc2l2ZUludGVuc2l0eSYmKGcuZW1pc3NpdmVJbnRlbnNpdHk9YS5lbWlzc2l2ZUludGVuc2l0eSk7dm9pZCAwIT09YS5zcGVjdWxhck1hcCYmKGcuc3BlY3VsYXJNYXA9YyhhLnNwZWN1bGFyTWFwKSk7dm9pZCAwIT09YS5lbnZNYXAmJihnLmVudk1hcD1jKGEuZW52TWFwKSk7dm9pZCAwIT09YS5lbnZNYXBJbnRlbnNpdHkmJihnLmVudk1hcEludGVuc2l0eT1hLmVudk1hcEludGVuc2l0eSk7dm9pZCAwIT09YS5yZWZsZWN0aXZpdHkmJihnLnJlZmxlY3Rpdml0eT1hLnJlZmxlY3Rpdml0eSk7dm9pZCAwIT09YS5yZWZyYWN0aW9uUmF0aW8mJihnLnJlZnJhY3Rpb25SYXRpbz0KYS5yZWZyYWN0aW9uUmF0aW8pO3ZvaWQgMCE9PWEubGlnaHRNYXAmJihnLmxpZ2h0TWFwPWMoYS5saWdodE1hcCkpO3ZvaWQgMCE9PWEubGlnaHRNYXBJbnRlbnNpdHkmJihnLmxpZ2h0TWFwSW50ZW5zaXR5PWEubGlnaHRNYXBJbnRlbnNpdHkpO3ZvaWQgMCE9PWEuYW9NYXAmJihnLmFvTWFwPWMoYS5hb01hcCkpO3ZvaWQgMCE9PWEuYW9NYXBJbnRlbnNpdHkmJihnLmFvTWFwSW50ZW5zaXR5PWEuYW9NYXBJbnRlbnNpdHkpO3ZvaWQgMCE9PWEuZ3JhZGllbnRNYXAmJihnLmdyYWRpZW50TWFwPWMoYS5ncmFkaWVudE1hcCkpO3ZvaWQgMCE9PWEuY2xlYXJjb2F0Tm9ybWFsTWFwJiYoZy5jbGVhcmNvYXROb3JtYWxNYXA9YyhhLmNsZWFyY29hdE5vcm1hbE1hcCkpO3ZvaWQgMCE9PWEuY2xlYXJjb2F0Tm9ybWFsU2NhbGUmJihnLmNsZWFyY29hdE5vcm1hbFNjYWxlPShuZXcgZikuZnJvbUFycmF5KGEuY2xlYXJjb2F0Tm9ybWFsU2NhbGUpKTtyZXR1cm4gZ30sc2V0VGV4dHVyZXM6ZnVuY3Rpb24oYSl7dGhpcy50ZXh0dXJlcz0KYTtyZXR1cm4gdGhpc319KTt2YXIgUGk9e2RlY29kZVRleHQ6ZnVuY3Rpb24oYSl7aWYoInVuZGVmaW5lZCIhPT10eXBlb2YgVGV4dERlY29kZXIpcmV0dXJuKG5ldyBUZXh0RGVjb2RlcikuZGVjb2RlKGEpO2Zvcih2YXIgYz0iIixlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKWMrPVN0cmluZy5mcm9tQ2hhckNvZGUoYVtlXSk7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZXNjYXBlKGMpKX1jYXRjaChyKXtyZXR1cm4gY319LGV4dHJhY3RVcmxCYXNlOmZ1bmN0aW9uKGEpe3ZhciBjPWEubGFzdEluZGV4T2YoIi8iKTtyZXR1cm4tMT09PWM/Ii4vIjphLnN1YnN0cigwLGMrMSl9fTtXZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKHZhLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOldnLGlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk6ITAsY29weTpmdW5jdGlvbihhKXt2YS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7dGhpcy5tYXhJbnN0YW5jZWRDb3VudD0KYS5tYXhJbnN0YW5jZWRDb3VudDtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPXZhLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzKTthLm1heEluc3RhbmNlZENvdW50PXRoaXMubWF4SW5zdGFuY2VkQ291bnQ7YS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PSEwO3JldHVybiBhfX0pO1hnLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoUS5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpYZyxpc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZTohMCxjb3B5OmZ1bmN0aW9uKGEpe1EucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMubWVzaFBlckF0dHJpYnV0ZT1hLm1lc2hQZXJBdHRyaWJ1dGU7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbigpe3ZhciBhPVEucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMpO2EubWVzaFBlckF0dHJpYnV0ZT0KdGhpcy5tZXNoUGVyQXR0cmlidXRlO2EuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU9ITA7cmV0dXJuIGF9fSk7WWcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpZZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMsdj1uZXcgdWMoci5tYW5hZ2VyKTt2LnNldFBhdGgoci5wYXRoKTt2LmxvYWQoYSxmdW5jdGlvbih6KXtjKHIucGFyc2UoSlNPTi5wYXJzZSh6KSkpfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhKXt2YXIgYz1hLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnk/bmV3IFdnOm5ldyB2YSxlPWEuZGF0YS5pbmRleDtpZih2b2lkIDAhPT1lKXt2YXIgZz1uZXcgUWlbZS50eXBlXShlLmFycmF5KTtjLnNldEluZGV4KG5ldyBRKGcsMSkpfWU9YS5kYXRhLmF0dHJpYnV0ZXM7Zm9yKHZhciByIGluIGUpe3ZhciB2PWVbcl07Zz1uZXcgUWlbdi50eXBlXSh2LmFycmF5KTtnPW5ldyAodi5pc0luc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT8KWGc6USkoZyx2Lml0ZW1TaXplLHYubm9ybWFsaXplZCk7dm9pZCAwIT09di5uYW1lJiYoZy5uYW1lPXYubmFtZSk7Yy5hZGRBdHRyaWJ1dGUocixnKX12YXIgej1hLmRhdGEubW9ycGhBdHRyaWJ1dGVzO2lmKHopZm9yKHIgaW4geil7dmFyIEU9eltyXSxGPVtdO2U9MDtmb3IodmFyIEo9RS5sZW5ndGg7ZTxKO2UrKyl2PUVbZV0sZz1uZXcgUWlbdi50eXBlXSh2LmFycmF5KSxnPW5ldyBRKGcsdi5pdGVtU2l6ZSx2Lm5vcm1hbGl6ZWQpLHZvaWQgMCE9PXYubmFtZSYmKGcubmFtZT12Lm5hbWUpLEYucHVzaChnKTtjLm1vcnBoQXR0cmlidXRlc1tyXT1GfXI9YS5kYXRhLmdyb3Vwc3x8YS5kYXRhLmRyYXdjYWxsc3x8YS5kYXRhLm9mZnNldHM7aWYodm9pZCAwIT09cilmb3IoZT0wLHY9ci5sZW5ndGg7ZSE9PXY7KytlKWc9cltlXSxjLmFkZEdyb3VwKGcuc3RhcnQsZy5jb3VudCxnLm1hdGVyaWFsSW5kZXgpO2U9YS5kYXRhLmJvdW5kaW5nU3BoZXJlO3ZvaWQgMCE9PWUmJihyPW5ldyBrLAp2b2lkIDAhPT1lLmNlbnRlciYmci5mcm9tQXJyYXkoZS5jZW50ZXIpLGMuYm91bmRpbmdTcGhlcmU9bmV3IEcocixlLnJhZGl1cykpO2EubmFtZSYmKGMubmFtZT1hLm5hbWUpO2EudXNlckRhdGEmJihjLnVzZXJEYXRhPWEudXNlckRhdGEpO3JldHVybiBjfX0pO3ZhciBRaT17SW50OEFycmF5LFVpbnQ4QXJyYXksVWludDhDbGFtcGVkQXJyYXk6InVuZGVmaW5lZCIhPT10eXBlb2YgVWludDhDbGFtcGVkQXJyYXk/VWludDhDbGFtcGVkQXJyYXk6VWludDhBcnJheSxJbnQxNkFycmF5LFVpbnQxNkFycmF5LEludDMyQXJyYXksVWludDMyQXJyYXksRmxvYXQzMkFycmF5LEZsb2F0NjRBcnJheX07WmcucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpaZyxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZhciByPXRoaXMsdj0iIj09PXRoaXMucGF0aD9QaS5leHRyYWN0VXJsQmFzZShhKTp0aGlzLnBhdGg7dGhpcy5yZXNvdXJjZVBhdGg9CnRoaXMucmVzb3VyY2VQYXRofHx2O3Y9bmV3IHVjKHIubWFuYWdlcik7di5zZXRQYXRoKHRoaXMucGF0aCk7di5sb2FkKGEsZnVuY3Rpb24oeil7dmFyIEU9bnVsbDt0cnl7RT1KU09OLnBhcnNlKHopfWNhdGNoKEYpe3ZvaWQgMCE9PWcmJmcoRik7Y29uc29sZS5lcnJvcigiVEhSRUU6T2JqZWN0TG9hZGVyOiBDYW4ndCBwYXJzZSAiK2ErIi4iLEYubWVzc2FnZSk7cmV0dXJufXo9RS5tZXRhZGF0YTt2b2lkIDA9PT16fHx2b2lkIDA9PT16LnR5cGV8fCJnZW9tZXRyeSI9PT16LnR5cGUudG9Mb3dlckNhc2UoKT9jb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3RMb2FkZXI6IENhbid0IGxvYWQgIithKTpyLnBhcnNlKEUsYyl9LGUsZyl9LHBhcnNlOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5wYXJzZVNoYXBlKGEuc2hhcGVzKTtlPXRoaXMucGFyc2VHZW9tZXRyaWVzKGEuZ2VvbWV0cmllcyxlKTt2YXIgZz10aGlzLnBhcnNlSW1hZ2VzKGEuaW1hZ2VzLGZ1bmN0aW9uKCl7dm9pZCAwIT09CmMmJmMocil9KTtnPXRoaXMucGFyc2VUZXh0dXJlcyhhLnRleHR1cmVzLGcpO2c9dGhpcy5wYXJzZU1hdGVyaWFscyhhLm1hdGVyaWFscyxnKTt2YXIgcj10aGlzLnBhcnNlT2JqZWN0KGEub2JqZWN0LGUsZyk7YS5hbmltYXRpb25zJiYoci5hbmltYXRpb25zPXRoaXMucGFyc2VBbmltYXRpb25zKGEuYW5pbWF0aW9ucykpO3ZvaWQgMCE9PWEuaW1hZ2VzJiYwIT09YS5pbWFnZXMubGVuZ3RofHx2b2lkIDA9PT1jfHxjKHIpO3JldHVybiByfSxwYXJzZVNoYXBlOmZ1bmN0aW9uKGEpe3ZhciBjPXt9O2lmKHZvaWQgMCE9PWEpZm9yKHZhciBlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKXt2YXIgcj0obmV3IENkKS5mcm9tSlNPTihhW2VdKTtjW3IudXVpZF09cn1yZXR1cm4gY30scGFyc2VHZW9tZXRyaWVzOmZ1bmN0aW9uKGEsYyl7dmFyIGU9e307aWYodm9pZCAwIT09YSlmb3IodmFyIGc9bmV3IFlnLHI9MCx2PWEubGVuZ3RoO3I8djtyKyspe3ZhciB6PWFbcl07c3dpdGNoKHoudHlwZSl7Y2FzZSAiUGxhbmVHZW9tZXRyeSI6Y2FzZSAiUGxhbmVCdWZmZXJHZW9tZXRyeSI6dmFyIEU9Cm5ldyBnY1t6LnR5cGVdKHoud2lkdGgsei5oZWlnaHQsei53aWR0aFNlZ21lbnRzLHouaGVpZ2h0U2VnbWVudHMpO2JyZWFrO2Nhc2UgIkJveEdlb21ldHJ5IjpjYXNlICJCb3hCdWZmZXJHZW9tZXRyeSI6Y2FzZSAiQ3ViZUdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoud2lkdGgsei5oZWlnaHQsei5kZXB0aCx6LndpZHRoU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6LmRlcHRoU2VnbWVudHMpO2JyZWFrO2Nhc2UgIkNpcmNsZUdlb21ldHJ5IjpjYXNlICJDaXJjbGVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LnJhZGl1cyx6LnNlZ21lbnRzLHoudGhldGFTdGFydCx6LnRoZXRhTGVuZ3RoKTticmVhaztjYXNlICJDeWxpbmRlckdlb21ldHJ5IjpjYXNlICJDeWxpbmRlckJ1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoucmFkaXVzVG9wLHoucmFkaXVzQm90dG9tLHouaGVpZ2h0LHoucmFkaWFsU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6Lm9wZW5FbmRlZCwKei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIkNvbmVHZW9tZXRyeSI6Y2FzZSAiQ29uZUJ1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoucmFkaXVzLHouaGVpZ2h0LHoucmFkaWFsU2VnbWVudHMsei5oZWlnaHRTZWdtZW50cyx6Lm9wZW5FbmRlZCx6LnRoZXRhU3RhcnQsei50aGV0YUxlbmd0aCk7YnJlYWs7Y2FzZSAiU3BoZXJlR2VvbWV0cnkiOmNhc2UgIlNwaGVyZUJ1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoucmFkaXVzLHoud2lkdGhTZWdtZW50cyx6LmhlaWdodFNlZ21lbnRzLHoucGhpU3RhcnQsei5waGlMZW5ndGgsei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIkRvZGVjYWhlZHJvbkdlb21ldHJ5IjpjYXNlICJEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSI6Y2FzZSAiSWNvc2FoZWRyb25HZW9tZXRyeSI6Y2FzZSAiSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSI6Y2FzZSAiT2N0YWhlZHJvbkdlb21ldHJ5IjpjYXNlICJPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOmNhc2UgIlRldHJhaGVkcm9uR2VvbWV0cnkiOmNhc2UgIlRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkiOkU9Cm5ldyBnY1t6LnR5cGVdKHoucmFkaXVzLHouZGV0YWlsKTticmVhaztjYXNlICJSaW5nR2VvbWV0cnkiOmNhc2UgIlJpbmdCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LmlubmVyUmFkaXVzLHoub3V0ZXJSYWRpdXMsei50aGV0YVNlZ21lbnRzLHoucGhpU2VnbWVudHMsei50aGV0YVN0YXJ0LHoudGhldGFMZW5ndGgpO2JyZWFrO2Nhc2UgIlRvcnVzR2VvbWV0cnkiOmNhc2UgIlRvcnVzQnVmZmVyR2VvbWV0cnkiOkU9bmV3IGdjW3oudHlwZV0oei5yYWRpdXMsei50dWJlLHoucmFkaWFsU2VnbWVudHMsei50dWJ1bGFyU2VnbWVudHMsei5hcmMpO2JyZWFrO2Nhc2UgIlRvcnVzS25vdEdlb21ldHJ5IjpjYXNlICJUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LnJhZGl1cyx6LnR1YmUsei50dWJ1bGFyU2VnbWVudHMsei5yYWRpYWxTZWdtZW50cyx6LnAsei5xKTticmVhaztjYXNlICJUdWJlR2VvbWV0cnkiOmNhc2UgIlR1YmVCdWZmZXJHZW9tZXRyeSI6RT0KbmV3IGdjW3oudHlwZV0oKG5ldyBPaVt6LnBhdGgudHlwZV0pLmZyb21KU09OKHoucGF0aCksei50dWJ1bGFyU2VnbWVudHMsei5yYWRpdXMsei5yYWRpYWxTZWdtZW50cyx6LmNsb3NlZCk7YnJlYWs7Y2FzZSAiTGF0aGVHZW9tZXRyeSI6Y2FzZSAiTGF0aGVCdWZmZXJHZW9tZXRyeSI6RT1uZXcgZ2Nbei50eXBlXSh6LnBvaW50cyx6LnNlZ21lbnRzLHoucGhpU3RhcnQsei5waGlMZW5ndGgpO2JyZWFrO2Nhc2UgIlBvbHloZWRyb25HZW9tZXRyeSI6Y2FzZSAiUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5IjpFPW5ldyBnY1t6LnR5cGVdKHoudmVydGljZXMsei5pbmRpY2VzLHoucmFkaXVzLHouZGV0YWlscyk7YnJlYWs7Y2FzZSAiU2hhcGVHZW9tZXRyeSI6Y2FzZSAiU2hhcGVCdWZmZXJHZW9tZXRyeSI6RT1bXTtmb3IodmFyIEY9MCxKPXouc2hhcGVzLmxlbmd0aDtGPEo7RisrKXt2YXIgUD1jW3ouc2hhcGVzW0ZdXTtFLnB1c2goUCl9RT1uZXcgZ2Nbei50eXBlXShFLHouY3VydmVTZWdtZW50cyk7CmJyZWFrO2Nhc2UgIkV4dHJ1ZGVHZW9tZXRyeSI6Y2FzZSAiRXh0cnVkZUJ1ZmZlckdlb21ldHJ5IjpFPVtdO0Y9MDtmb3IoSj16LnNoYXBlcy5sZW5ndGg7RjxKO0YrKylQPWNbei5zaGFwZXNbRl1dLEUucHVzaChQKTtGPXoub3B0aW9ucy5leHRydWRlUGF0aDt2b2lkIDAhPT1GJiYoei5vcHRpb25zLmV4dHJ1ZGVQYXRoPShuZXcgT2lbRi50eXBlXSkuZnJvbUpTT04oRikpO0U9bmV3IGdjW3oudHlwZV0oRSx6Lm9wdGlvbnMpO2JyZWFrO2Nhc2UgIkJ1ZmZlckdlb21ldHJ5IjpjYXNlICJJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSI6RT1nLnBhcnNlKHopO2JyZWFrO2Nhc2UgIkdlb21ldHJ5IjoiVEhSRUUiaW4gd2luZG93JiYiTGVnYWN5SlNPTkxvYWRlciJpbiBUSFJFRT9FPShuZXcgVEhSRUUuTGVnYWN5SlNPTkxvYWRlcikucGFyc2Uoeix0aGlzLnJlc291cmNlUGF0aCkuZ2VvbWV0cnk6Y29uc29sZS5lcnJvcignVEhSRUUuT2JqZWN0TG9hZGVyOiBZb3UgaGF2ZSB0byBpbXBvcnQgTGVnYWN5SlNPTkxvYWRlciBpbiBvcmRlciBsb2FkIGdlb21ldHJ5IGRhdGEgb2YgdHlwZSAiR2VvbWV0cnkiLicpOwpicmVhaztkZWZhdWx0OmNvbnNvbGUud2FybignVEhSRUUuT2JqZWN0TG9hZGVyOiBVbnN1cHBvcnRlZCBnZW9tZXRyeSB0eXBlICInK3oudHlwZSsnIicpO2NvbnRpbnVlfUUudXVpZD16LnV1aWQ7dm9pZCAwIT09ei5uYW1lJiYoRS5uYW1lPXoubmFtZSk7ITA9PT1FLmlzQnVmZmVyR2VvbWV0cnkmJnZvaWQgMCE9PXoudXNlckRhdGEmJihFLnVzZXJEYXRhPXoudXNlckRhdGEpO2Vbei51dWlkXT1FfXJldHVybiBlfSxwYXJzZU1hdGVyaWFsczpmdW5jdGlvbihhLGMpe3ZhciBlPXt9LGc9e307aWYodm9pZCAwIT09YSl7dmFyIHI9bmV3IFZnO3Iuc2V0VGV4dHVyZXMoYyk7Yz0wO2Zvcih2YXIgdj1hLmxlbmd0aDtjPHY7YysrKXt2YXIgej1hW2NdO2lmKCJNdWx0aU1hdGVyaWFsIj09PXoudHlwZSl7Zm9yKHZhciBFPVtdLEY9MDtGPHoubWF0ZXJpYWxzLmxlbmd0aDtGKyspe3ZhciBKPXoubWF0ZXJpYWxzW0ZdO3ZvaWQgMD09PWVbSi51dWlkXSYmKGVbSi51dWlkXT1yLnBhcnNlKEopKTsKRS5wdXNoKGVbSi51dWlkXSl9Z1t6LnV1aWRdPUV9ZWxzZSB2b2lkIDA9PT1lW3oudXVpZF0mJihlW3oudXVpZF09ci5wYXJzZSh6KSksZ1t6LnV1aWRdPWVbei51dWlkXX19cmV0dXJuIGd9LHBhcnNlQW5pbWF0aW9uczpmdW5jdGlvbihhKXtmb3IodmFyIGM9W10sZT0wO2U8YS5sZW5ndGg7ZSsrKXt2YXIgZz1hW2VdLHI9dGMucGFyc2UoZyk7dm9pZCAwIT09Zy51dWlkJiYoci51dWlkPWcudXVpZCk7Yy5wdXNoKHIpfXJldHVybiBjfSxwYXJzZUltYWdlczpmdW5jdGlvbihhLGMpe2Z1bmN0aW9uIGUoUyl7Zy5tYW5hZ2VyLml0ZW1TdGFydChTKTtyZXR1cm4gdi5sb2FkKFMsZnVuY3Rpb24oKXtnLm1hbmFnZXIuaXRlbUVuZChTKX0sdm9pZCAwLGZ1bmN0aW9uKCl7Zy5tYW5hZ2VyLml0ZW1FcnJvcihTKTtnLm1hbmFnZXIuaXRlbUVuZChTKX0pfXZhciBnPXRoaXMscj17fTtpZih2b2lkIDAhPT1hJiYwPGEubGVuZ3RoKXtjPW5ldyAkaChjKTt2YXIgdj1uZXcgVWUoYyk7di5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTsKYz0wO2Zvcih2YXIgej1hLmxlbmd0aDtjPHo7YysrKXt2YXIgRT1hW2NdLEY9RS51cmw7aWYoQXJyYXkuaXNBcnJheShGKSl7cltFLnV1aWRdPVtdO2Zvcih2YXIgSj0wLFA9Ri5sZW5ndGg7SjxQO0orKyl7dmFyIFI9RltKXTtSPS9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KFIpP1I6Zy5yZXNvdXJjZVBhdGgrUjtyW0UudXVpZF0ucHVzaChlKFIpKX19ZWxzZSBSPS9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KEUudXJsKT9FLnVybDpnLnJlc291cmNlUGF0aCtFLnVybCxyW0UudXVpZF09ZShSKX19cmV0dXJuIHJ9LHBhcnNlVGV4dHVyZXM6ZnVuY3Rpb24oYSxjKXtmdW5jdGlvbiBlKEYsSil7aWYoIm51bWJlciI9PT10eXBlb2YgRilyZXR1cm4gRjtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlci5wYXJzZVRleHR1cmU6IENvbnN0YW50IHNob3VsZCBiZSBpbiBudW1lcmljIGZvcm0uIixGKTtyZXR1cm4gSltGXX12YXIgZz17fTtpZih2b2lkIDAhPT0KYSlmb3IodmFyIHI9MCx2PWEubGVuZ3RoO3I8djtyKyspe3ZhciB6PWFbcl07dm9pZCAwPT09ei5pbWFnZSYmY29uc29sZS53YXJuKCdUSFJFRS5PYmplY3RMb2FkZXI6IE5vICJpbWFnZSIgc3BlY2lmaWVkIGZvcicsei51dWlkKTt2b2lkIDA9PT1jW3ouaW1hZ2VdJiZjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGltYWdlIix6LmltYWdlKTt2YXIgRT1BcnJheS5pc0FycmF5KGNbei5pbWFnZV0pP25ldyBjZChjW3ouaW1hZ2VdKTpuZXcgbChjW3ouaW1hZ2VdKTtFLm5lZWRzVXBkYXRlPSEwO0UudXVpZD16LnV1aWQ7dm9pZCAwIT09ei5uYW1lJiYoRS5uYW1lPXoubmFtZSk7dm9pZCAwIT09ei5tYXBwaW5nJiYoRS5tYXBwaW5nPWUoei5tYXBwaW5nLExtKSk7dm9pZCAwIT09ei5vZmZzZXQmJkUub2Zmc2V0LmZyb21BcnJheSh6Lm9mZnNldCk7dm9pZCAwIT09ei5yZXBlYXQmJkUucmVwZWF0LmZyb21BcnJheSh6LnJlcGVhdCk7dm9pZCAwIT09ei5jZW50ZXImJgpFLmNlbnRlci5mcm9tQXJyYXkoei5jZW50ZXIpO3ZvaWQgMCE9PXoucm90YXRpb24mJihFLnJvdGF0aW9uPXoucm90YXRpb24pO3ZvaWQgMCE9PXoud3JhcCYmKEUud3JhcFM9ZSh6LndyYXBbMF0sc2spLEUud3JhcFQ9ZSh6LndyYXBbMV0sc2spKTt2b2lkIDAhPT16LmZvcm1hdCYmKEUuZm9ybWF0PXouZm9ybWF0KTt2b2lkIDAhPT16LnR5cGUmJihFLnR5cGU9ei50eXBlKTt2b2lkIDAhPT16LmVuY29kaW5nJiYoRS5lbmNvZGluZz16LmVuY29kaW5nKTt2b2lkIDAhPT16Lm1pbkZpbHRlciYmKEUubWluRmlsdGVyPWUoei5taW5GaWx0ZXIsdGspKTt2b2lkIDAhPT16Lm1hZ0ZpbHRlciYmKEUubWFnRmlsdGVyPWUoei5tYWdGaWx0ZXIsdGspKTt2b2lkIDAhPT16LmFuaXNvdHJvcHkmJihFLmFuaXNvdHJvcHk9ei5hbmlzb3Ryb3B5KTt2b2lkIDAhPT16LmZsaXBZJiYoRS5mbGlwWT16LmZsaXBZKTt2b2lkIDAhPT16LnByZW11bHRpcGx5QWxwaGEmJihFLnByZW11bHRpcGx5QWxwaGE9CnoucHJlbXVsdGlwbHlBbHBoYSk7dm9pZCAwIT09ei51bnBhY2tBbGlnbm1lbnQmJihFLnVucGFja0FsaWdubWVudD16LnVucGFja0FsaWdubWVudCk7Z1t6LnV1aWRdPUV9cmV0dXJuIGd9LHBhcnNlT2JqZWN0OmZ1bmN0aW9uKGEsYyxlKXtmdW5jdGlvbiBnKEope3ZvaWQgMD09PWNbSl0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgZ2VvbWV0cnkiLEopO3JldHVybiBjW0pdfWZ1bmN0aW9uIHIoSil7aWYodm9pZCAwIT09Sil7aWYoQXJyYXkuaXNBcnJheShKKSl7Zm9yKHZhciBQPVtdLFI9MCxTPUoubGVuZ3RoO1I8UztSKyspe3ZhciBWPUpbUl07dm9pZCAwPT09ZVtWXSYmY29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCIsVik7UC5wdXNoKGVbVl0pfXJldHVybiBQfXZvaWQgMD09PWVbSl0mJmNvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwiLEopO3JldHVybiBlW0pdfX0Kc3dpdGNoKGEudHlwZSl7Y2FzZSAiU2NlbmUiOnZhciB2PW5ldyB5O3ZvaWQgMCE9PWEuYmFja2dyb3VuZCYmTnVtYmVyLmlzSW50ZWdlcihhLmJhY2tncm91bmQpJiYodi5iYWNrZ3JvdW5kPW5ldyBJKGEuYmFja2dyb3VuZCkpO3ZvaWQgMCE9PWEuZm9nJiYoIkZvZyI9PT1hLmZvZy50eXBlP3YuZm9nPW5ldyBBZyhhLmZvZy5jb2xvcixhLmZvZy5uZWFyLGEuZm9nLmZhcik6IkZvZ0V4cDIiPT09YS5mb2cudHlwZSYmKHYuZm9nPW5ldyB6ZyhhLmZvZy5jb2xvcixhLmZvZy5kZW5zaXR5KSkpO2JyZWFrO2Nhc2UgIlBlcnNwZWN0aXZlQ2FtZXJhIjp2PW5ldyB2YihhLmZvdixhLmFzcGVjdCxhLm5lYXIsYS5mYXIpO3ZvaWQgMCE9PWEuZm9jdXMmJih2LmZvY3VzPWEuZm9jdXMpO3ZvaWQgMCE9PWEuem9vbSYmKHYuem9vbT1hLnpvb20pO3ZvaWQgMCE9PWEuZmlsbUdhdWdlJiYodi5maWxtR2F1Z2U9YS5maWxtR2F1Z2UpO3ZvaWQgMCE9PWEuZmlsbU9mZnNldCYmKHYuZmlsbU9mZnNldD0KYS5maWxtT2Zmc2V0KTt2b2lkIDAhPT1hLnZpZXcmJih2LnZpZXc9T2JqZWN0LmFzc2lnbih7fSxhLnZpZXcpKTticmVhaztjYXNlICJPcnRob2dyYXBoaWNDYW1lcmEiOnY9bmV3IGJnKGEubGVmdCxhLnJpZ2h0LGEudG9wLGEuYm90dG9tLGEubmVhcixhLmZhcik7dm9pZCAwIT09YS56b29tJiYodi56b29tPWEuem9vbSk7dm9pZCAwIT09YS52aWV3JiYodi52aWV3PU9iamVjdC5hc3NpZ24oe30sYS52aWV3KSk7YnJlYWs7Y2FzZSAiQW1iaWVudExpZ2h0Ijp2PW5ldyBUZyhhLmNvbG9yLGEuaW50ZW5zaXR5KTticmVhaztjYXNlICJEaXJlY3Rpb25hbExpZ2h0Ijp2PW5ldyBTZyhhLmNvbG9yLGEuaW50ZW5zaXR5KTticmVhaztjYXNlICJQb2ludExpZ2h0Ijp2PW5ldyBRZyhhLmNvbG9yLGEuaW50ZW5zaXR5LGEuZGlzdGFuY2UsYS5kZWNheSk7YnJlYWs7Y2FzZSAiUmVjdEFyZWFMaWdodCI6dj1uZXcgVWcoYS5jb2xvcixhLmludGVuc2l0eSxhLndpZHRoLGEuaGVpZ2h0KTticmVhazsKY2FzZSAiU3BvdExpZ2h0Ijp2PW5ldyBQZyhhLmNvbG9yLGEuaW50ZW5zaXR5LGEuZGlzdGFuY2UsYS5hbmdsZSxhLnBlbnVtYnJhLGEuZGVjYXkpO2JyZWFrO2Nhc2UgIkhlbWlzcGhlcmVMaWdodCI6dj1uZXcgTmcoYS5jb2xvcixhLmdyb3VuZENvbG9yLGEuaW50ZW5zaXR5KTticmVhaztjYXNlICJTa2lubmVkTWVzaCI6Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VPYmplY3QoKSBkb2VzIG5vdCBzdXBwb3J0IFNraW5uZWRNZXNoIHlldC4iKTtjYXNlICJNZXNoIjp2PWcoYS5nZW9tZXRyeSk7dmFyIHo9cihhLm1hdGVyaWFsKTt2PXYuYm9uZXMmJjA8di5ib25lcy5sZW5ndGg/bmV3IEJmKHYseik6bmV3IHhhKHYseik7dm9pZCAwIT09YS5kcmF3TW9kZSYmdi5zZXREcmF3TW9kZShhLmRyYXdNb2RlKTticmVhaztjYXNlICJMT0QiOnY9bmV3IEFmO2JyZWFrO2Nhc2UgIkxpbmUiOnY9bmV3IFZiKGcoYS5nZW9tZXRyeSkscihhLm1hdGVyaWFsKSxhLm1vZGUpOwpicmVhaztjYXNlICJMaW5lTG9vcCI6dj1uZXcgRGcoZyhhLmdlb21ldHJ5KSxyKGEubWF0ZXJpYWwpKTticmVhaztjYXNlICJMaW5lU2VnbWVudHMiOnY9bmV3IEliKGcoYS5nZW9tZXRyeSkscihhLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSAiUG9pbnRDbG91ZCI6Y2FzZSAiUG9pbnRzIjp2PW5ldyBDZShnKGEuZ2VvbWV0cnkpLHIoYS5tYXRlcmlhbCkpO2JyZWFrO2Nhc2UgIlNwcml0ZSI6dj1uZXcgeWYocihhLm1hdGVyaWFsKSk7YnJlYWs7Y2FzZSAiR3JvdXAiOnY9bmV3IHVlO2JyZWFrO2RlZmF1bHQ6dj1uZXcgQX12LnV1aWQ9YS51dWlkO3ZvaWQgMCE9PWEubmFtZSYmKHYubmFtZT1hLm5hbWUpO3ZvaWQgMCE9PWEubWF0cml4Pyh2Lm1hdHJpeC5mcm9tQXJyYXkoYS5tYXRyaXgpLHZvaWQgMCE9PWEubWF0cml4QXV0b1VwZGF0ZSYmKHYubWF0cml4QXV0b1VwZGF0ZT1hLm1hdHJpeEF1dG9VcGRhdGUpLHYubWF0cml4QXV0b1VwZGF0ZSYmdi5tYXRyaXguZGVjb21wb3NlKHYucG9zaXRpb24sCnYucXVhdGVybmlvbix2LnNjYWxlKSk6KHZvaWQgMCE9PWEucG9zaXRpb24mJnYucG9zaXRpb24uZnJvbUFycmF5KGEucG9zaXRpb24pLHZvaWQgMCE9PWEucm90YXRpb24mJnYucm90YXRpb24uZnJvbUFycmF5KGEucm90YXRpb24pLHZvaWQgMCE9PWEucXVhdGVybmlvbiYmdi5xdWF0ZXJuaW9uLmZyb21BcnJheShhLnF1YXRlcm5pb24pLHZvaWQgMCE9PWEuc2NhbGUmJnYuc2NhbGUuZnJvbUFycmF5KGEuc2NhbGUpKTt2b2lkIDAhPT1hLmNhc3RTaGFkb3cmJih2LmNhc3RTaGFkb3c9YS5jYXN0U2hhZG93KTt2b2lkIDAhPT1hLnJlY2VpdmVTaGFkb3cmJih2LnJlY2VpdmVTaGFkb3c9YS5yZWNlaXZlU2hhZG93KTthLnNoYWRvdyYmKHZvaWQgMCE9PWEuc2hhZG93LmJpYXMmJih2LnNoYWRvdy5iaWFzPWEuc2hhZG93LmJpYXMpLHZvaWQgMCE9PWEuc2hhZG93LnJhZGl1cyYmKHYuc2hhZG93LnJhZGl1cz1hLnNoYWRvdy5yYWRpdXMpLHZvaWQgMCE9PWEuc2hhZG93Lm1hcFNpemUmJgp2LnNoYWRvdy5tYXBTaXplLmZyb21BcnJheShhLnNoYWRvdy5tYXBTaXplKSx2b2lkIDAhPT1hLnNoYWRvdy5jYW1lcmEmJih2LnNoYWRvdy5jYW1lcmE9dGhpcy5wYXJzZU9iamVjdChhLnNoYWRvdy5jYW1lcmEpKSk7dm9pZCAwIT09YS52aXNpYmxlJiYodi52aXNpYmxlPWEudmlzaWJsZSk7dm9pZCAwIT09YS5mcnVzdHVtQ3VsbGVkJiYodi5mcnVzdHVtQ3VsbGVkPWEuZnJ1c3R1bUN1bGxlZCk7dm9pZCAwIT09YS5yZW5kZXJPcmRlciYmKHYucmVuZGVyT3JkZXI9YS5yZW5kZXJPcmRlcik7dm9pZCAwIT09YS51c2VyRGF0YSYmKHYudXNlckRhdGE9YS51c2VyRGF0YSk7dm9pZCAwIT09YS5sYXllcnMmJih2LmxheWVycy5tYXNrPWEubGF5ZXJzKTtpZih2b2lkIDAhPT1hLmNoaWxkcmVuKXt6PWEuY2hpbGRyZW47Zm9yKHZhciBFPTA7RTx6Lmxlbmd0aDtFKyspdi5hZGQodGhpcy5wYXJzZU9iamVjdCh6W0VdLGMsZSkpfWlmKCJMT0QiPT09YS50eXBlKWZvcihhPWEubGV2ZWxzLHo9CjA7ejxhLmxlbmd0aDt6Kyspe0U9YVt6XTt2YXIgRj12LmdldE9iamVjdEJ5UHJvcGVydHkoInV1aWQiLEUub2JqZWN0KTt2b2lkIDAhPT1GJiZ2LmFkZExldmVsKEYsRS5kaXN0YW5jZSl9cmV0dXJuIHZ9fSk7dmFyIExtPXtVVk1hcHBpbmc6MzAwLEN1YmVSZWZsZWN0aW9uTWFwcGluZzozMDEsQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOjMwMixFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzozMDMsRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6MzA0LFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nOjMwNSxDdWJlVVZSZWZsZWN0aW9uTWFwcGluZzozMDYsQ3ViZVVWUmVmcmFjdGlvbk1hcHBpbmc6MzA3fSxzaz17UmVwZWF0V3JhcHBpbmc6MUUzLENsYW1wVG9FZGdlV3JhcHBpbmc6MTAwMSxNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOjEwMDJ9LHRrPXtOZWFyZXN0RmlsdGVyOjEwMDMsTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI6MTAwNCxOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyOjEwMDUsCkxpbmVhckZpbHRlcjoxMDA2LExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI6MTAwNyxMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI6MTAwOH07ZWkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShEYi5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjplaSxzZXRPcHRpb25zOmZ1bmN0aW9uKGEpe3RoaXMub3B0aW9ucz1hO3JldHVybiB0aGlzfSxsb2FkOmZ1bmN0aW9uKGEsYyxlLGcpe3ZvaWQgMD09PWEmJihhPSIiKTt2b2lkIDAhPT10aGlzLnBhdGgmJihhPXRoaXMucGF0aCthKTthPXRoaXMubWFuYWdlci5yZXNvbHZlVVJMKGEpO3ZhciByPXRoaXMsdj1pZS5nZXQoYSk7aWYodm9pZCAwIT09dilyZXR1cm4gci5tYW5hZ2VyLml0ZW1TdGFydChhKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YyYmYyh2KTtyLm1hbmFnZXIuaXRlbUVuZChhKX0sMCksdjtmZXRjaChhKS50aGVuKGZ1bmN0aW9uKHope3JldHVybiB6LmJsb2IoKX0pLnRoZW4oZnVuY3Rpb24oeil7cmV0dXJuIHZvaWQgMD09PQpyLm9wdGlvbnM/Y3JlYXRlSW1hZ2VCaXRtYXAoeik6Y3JlYXRlSW1hZ2VCaXRtYXAoeixyLm9wdGlvbnMpfSkudGhlbihmdW5jdGlvbih6KXtpZS5hZGQoYSx6KTtjJiZjKHopO3IubWFuYWdlci5pdGVtRW5kKGEpfSkuY2F0Y2goZnVuY3Rpb24oeil7ZyYmZyh6KTtyLm1hbmFnZXIuaXRlbUVycm9yKGEpO3IubWFuYWdlci5pdGVtRW5kKGEpfSk7ci5tYW5hZ2VyLml0ZW1TdGFydChhKX19KTtPYmplY3QuYXNzaWduKGZpLnByb3RvdHlwZSx7bW92ZVRvOmZ1bmN0aW9uKGEsYyl7dGhpcy5jdXJyZW50UGF0aD1uZXcgR2M7dGhpcy5zdWJQYXRocy5wdXNoKHRoaXMuY3VycmVudFBhdGgpO3RoaXMuY3VycmVudFBhdGgubW92ZVRvKGEsYyl9LGxpbmVUbzpmdW5jdGlvbihhLGMpe3RoaXMuY3VycmVudFBhdGgubGluZVRvKGEsYyl9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24oYSxjLGUsZyl7dGhpcy5jdXJyZW50UGF0aC5xdWFkcmF0aWNDdXJ2ZVRvKGEsYyxlLGcpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKGEsCmMsZSxnLHIsdil7dGhpcy5jdXJyZW50UGF0aC5iZXppZXJDdXJ2ZVRvKGEsYyxlLGcscix2KX0sc3BsaW5lVGhydTpmdW5jdGlvbihhKXt0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUoYSl9LHRvU2hhcGVzOmZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZShmYSl7Zm9yKHZhciByYT1bXSxwYT0wLHFhPWZhLmxlbmd0aDtwYTxxYTtwYSsrKXt2YXIgdWE9ZmFbcGFdLG9hPW5ldyBDZDtvYS5jdXJ2ZXM9dWEuY3VydmVzO3JhLnB1c2gob2EpfXJldHVybiByYX1mdW5jdGlvbiBnKGZhLHJhKXtmb3IodmFyIHBhPXJhLmxlbmd0aCxxYT0hMSx1YT1wYS0xLG9hPTA7b2E8cGE7dWE9b2ErKyl7dmFyIHRhPXJhW3VhXSxCYT1yYVtvYV0sVGE9QmEueC10YS54LFVhPUJhLnktdGEueTtpZihNYXRoLmFicyhVYSk+TnVtYmVyLkVQU0lMT04pe2lmKDA+VWEmJih0YT1yYVtvYV0sVGE9LVRhLEJhPXJhW3VhXSxVYT0tVWEpLCEoZmEueTx0YS55fHxmYS55PkJhLnkpKWlmKGZhLnk9PT10YS55KXtpZihmYS54PT09CnRhLngpcmV0dXJuITB9ZWxzZXt1YT1VYSooZmEueC10YS54KS1UYSooZmEueS10YS55KTtpZigwPT09dWEpcmV0dXJuITA7MD51YXx8KHFhPSFxYSl9fWVsc2UgaWYoZmEueT09PXRhLnkmJihCYS54PD1mYS54JiZmYS54PD10YS54fHx0YS54PD1mYS54JiZmYS54PD1CYS54KSlyZXR1cm4hMH1yZXR1cm4gcWF9dmFyIHI9ZWQuaXNDbG9ja1dpc2Usdj10aGlzLnN1YlBhdGhzO2lmKDA9PT12Lmxlbmd0aClyZXR1cm5bXTtpZighMD09PWMpcmV0dXJuIGUodik7Yz1bXTtpZigxPT09di5sZW5ndGgpe3ZhciB6PXZbMF07dmFyIEU9bmV3IENkO0UuY3VydmVzPXouY3VydmVzO2MucHVzaChFKTtyZXR1cm4gY312YXIgRj0hcih2WzBdLmdldFBvaW50cygpKTtGPWE/IUY6RjtFPVtdO3ZhciBKPVtdLFA9W10sUj0wO0pbUl09dm9pZCAwO1BbUl09W107Zm9yKHZhciBTPTAsVj12Lmxlbmd0aDtTPFY7UysrKXt6PXZbU107dmFyIFc9ei5nZXRQb2ludHMoKTt2YXIgaGE9cihXKTsoaGE9YT8haGE6CmhhKT8oIUYmJkpbUl0mJlIrKyxKW1JdPXtzOm5ldyBDZCxwOld9LEpbUl0ucy5jdXJ2ZXM9ei5jdXJ2ZXMsRiYmUisrLFBbUl09W10pOlBbUl0ucHVzaCh7aDp6LHA6V1swXX0pfWlmKCFKWzBdKXJldHVybiBlKHYpO2lmKDE8Si5sZW5ndGgpe1M9ITE7YT1bXTtyPTA7Zm9yKHY9Si5sZW5ndGg7cjx2O3IrKylFW3JdPVtdO3I9MDtmb3Iodj1KLmxlbmd0aDtyPHY7cisrKWZvcih6PVBbcl0saGE9MDtoYTx6Lmxlbmd0aDtoYSsrKXtGPXpbaGFdO1I9ITA7Zm9yKFc9MDtXPEoubGVuZ3RoO1crKylnKEYucCxKW1ddLnApJiYociE9PVcmJmEucHVzaCh7ZnJvbXM6cix0b3M6Vyxob2xlOmhhfSksUj8oUj0hMSxFW1ddLnB1c2goRikpOlM9ITApO1ImJkVbcl0ucHVzaChGKX0wPGEubGVuZ3RoJiYoU3x8KFA9RSkpfVM9MDtmb3Iocj1KLmxlbmd0aDtTPHI7UysrKWZvcihFPUpbU10ucyxjLnB1c2goRSksYT1QW1NdLHY9MCx6PWEubGVuZ3RoO3Y8ejt2KyspRS5ob2xlcy5wdXNoKGFbdl0uaCk7CnJldHVybiBjfX0pO09iamVjdC5hc3NpZ24oZ2kucHJvdG90eXBlLHtpc0ZvbnQ6ITAsZ2VuZXJhdGVTaGFwZXM6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoYz0xMDApO3ZhciBlPVtdO2E9dm0oYSxjLHRoaXMuZGF0YSk7Yz0wO2Zvcih2YXIgZz1hLmxlbmd0aDtjPGc7YysrKUFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGUsYVtjXS50b1NoYXBlcygpKTtyZXR1cm4gZX19KTtoaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmhpLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9dGhpcyx2PW5ldyB1Yyh0aGlzLm1hbmFnZXIpO3Yuc2V0UGF0aCh0aGlzLnBhdGgpO3YubG9hZChhLGZ1bmN0aW9uKHope3RyeXt2YXIgRT1KU09OLnBhcnNlKHopfWNhdGNoKEYpe2NvbnNvbGUud2FybigiVEhSRUUuRm9udExvYWRlcjogdHlwZWZhY2UuanMgc3VwcG9ydCBpcyBiZWluZyBkZXByZWNhdGVkLiBVc2UgdHlwZWZhY2UuanNvbiBpbnN0ZWFkLiIpLApFPUpTT04ucGFyc2Uoei5zdWJzdHJpbmcoNjUsei5sZW5ndGgtMikpfXo9ci5wYXJzZShFKTtjJiZjKHopfSxlLGcpfSxwYXJzZTpmdW5jdGlvbihhKXtyZXR1cm4gbmV3IGdpKGEpfX0pO3ZhciB5aCxtaT17Z2V0Q29udGV4dDpmdW5jdGlvbigpe3ZvaWQgMD09PXloJiYoeWg9bmV3ICh3aW5kb3cuQXVkaW9Db250ZXh0fHx3aW5kb3cud2Via2l0QXVkaW9Db250ZXh0KSk7cmV0dXJuIHlofSxzZXRDb250ZXh0OmZ1bmN0aW9uKGEpe3loPWF9fTskZy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKERiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOiRnLGxvYWQ6ZnVuY3Rpb24oYSxjLGUsZyl7dmFyIHI9bmV3IHVjKHRoaXMubWFuYWdlcik7ci5zZXRSZXNwb25zZVR5cGUoImFycmF5YnVmZmVyIik7ci5zZXRQYXRoKHRoaXMucGF0aCk7ci5sb2FkKGEsZnVuY3Rpb24odil7dj12LnNsaWNlKDApO21pLmdldENvbnRleHQoKS5kZWNvZGVBdWRpb0RhdGEodixmdW5jdGlvbih6KXtjKHopfSl9LAplLGcpfX0pO09iamVjdC5hc3NpZ24oYWgucHJvdG90eXBlLHtpc1NwaGVyaWNhbEhhcm1vbmljczM6ITAsc2V0OmZ1bmN0aW9uKGEpe2Zvcih2YXIgYz0wOzk+YztjKyspdGhpcy5jb2VmZmljaWVudHNbY10uY29weShhW2NdKTtyZXR1cm4gdGhpc30semVybzpmdW5jdGlvbigpe2Zvcih2YXIgYT0wOzk+YTthKyspdGhpcy5jb2VmZmljaWVudHNbYV0uc2V0KDAsMCwwKTtyZXR1cm4gdGhpc30sZ2V0QXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLngsZz1hLnk7YT1hLno7dmFyIHI9dGhpcy5jb2VmZmljaWVudHM7Yy5jb3B5KHJbMF0pLm11bHRpcGx5U2NhbGFyKC4yODIwOTUpO2MuYWRkU2NhbGUoclsxXSwuNDg4NjAzKmcpO2MuYWRkU2NhbGUoclsyXSwuNDg4NjAzKmEpO2MuYWRkU2NhbGUoclszXSwuNDg4NjAzKmUpO2MuYWRkU2NhbGUocls0XSwxLjA5MjU0OCplKmcpO2MuYWRkU2NhbGUocls1XSwxLjA5MjU0OCpnKmEpO2MuYWRkU2NhbGUocls2XSwuMzE1MzkyKigzKmEqYS0xKSk7CmMuYWRkU2NhbGUocls3XSwxLjA5MjU0OCplKmEpO2MuYWRkU2NhbGUocls4XSwuNTQ2Mjc0KihlKmUtZypnKSk7cmV0dXJuIGN9LGdldElycmFkaWFuY2VBdDpmdW5jdGlvbihhLGMpe3ZhciBlPWEueCxnPWEueTthPWEuejt2YXIgcj10aGlzLmNvZWZmaWNpZW50cztjLmNvcHkoclswXSkubXVsdGlwbHlTY2FsYXIoLjg4NjIyNyk7Yy5hZGRTY2FsZShyWzFdLDEuMDIzMzI4KmcpO2MuYWRkU2NhbGUoclsyXSwxLjAyMzMyOCphKTtjLmFkZFNjYWxlKHJbM10sMS4wMjMzMjgqZSk7Yy5hZGRTY2FsZShyWzRdLC44NTgwODYqZSpnKTtjLmFkZFNjYWxlKHJbNV0sLjg1ODA4NipnKmEpO2MuYWRkU2NhbGUocls2XSwuNzQzMTI1KmEqYS0uMjQ3NzA4KTtjLmFkZFNjYWxlKHJbN10sLjg1ODA4NiplKmEpO2MuYWRkU2NhbGUocls4XSwuNDI5MDQzKihlKmUtZypnKSk7cmV0dXJuIGN9LGFkZDpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDs5PmM7YysrKXRoaXMuY29lZmZpY2llbnRzW2NdLmFkZChhLmNvZWZmaWNpZW50c1tjXSk7CnJldHVybiB0aGlzfSxzY2FsZTpmdW5jdGlvbihhKXtmb3IodmFyIGM9MDs5PmM7YysrKXRoaXMuY29lZmZpY2llbnRzW2NdLm11bHRpcGx5U2NhbGFyKGEpO3JldHVybiB0aGlzfSxsZXJwOmZ1bmN0aW9uKGEsYyl7Zm9yKHZhciBlPTA7OT5lO2UrKyl0aGlzLmNvZWZmaWNpZW50c1tlXS5sZXJwKGEuY29lZmZpY2llbnRzW2VdLGMpO3JldHVybiB0aGlzfSxlcXVhbHM6ZnVuY3Rpb24oYSl7Zm9yKHZhciBjPTA7OT5jO2MrKylpZighdGhpcy5jb2VmZmljaWVudHNbY10uZXF1YWxzKGEuY29lZmZpY2llbnRzW2NdKSlyZXR1cm4hMTtyZXR1cm4hMH0sY29weTpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXQoYS5jb2VmZmljaWVudHMpfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sZnJvbUFycmF5OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGM9MCk7Zm9yKHZhciBlPXRoaXMuY29lZmZpY2llbnRzLGc9MDs5Pmc7ZysrKWVbZ10uZnJvbUFycmF5KGEsCmMrMypnKTtyZXR1cm4gdGhpc30sdG9BcnJheTpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWEmJihhPVtdKTt2b2lkIDA9PT1jJiYoYz0wKTtmb3IodmFyIGU9dGhpcy5jb2VmZmljaWVudHMsZz0wOzk+ZztnKyspZVtnXS50b0FycmF5KGEsYyszKmcpO3JldHVybiBhfX0pO09iamVjdC5hc3NpZ24oYWgse2dldEJhc2lzQXQ6ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLngsZz1hLnk7YT1hLno7Y1swXT0uMjgyMDk1O2NbMV09LjQ4ODYwMypnO2NbMl09LjQ4ODYwMyphO2NbM109LjQ4ODYwMyplO2NbNF09MS4wOTI1NDgqZSpnO2NbNV09MS4wOTI1NDgqZyphO2NbNl09LjMxNTM5MiooMyphKmEtMSk7Y1s3XT0xLjA5MjU0OCplKmE7Y1s4XT0uNTQ2Mjc0KihlKmUtZypnKX19KTtIYy5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEpiLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOkhjLGlzTGlnaHRQcm9iZTohMCxjb3B5OmZ1bmN0aW9uKGEpe0piLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcywKYSk7dGhpcy5zaC5jb3B5KGEuc2gpO3RoaXMuaW50ZW5zaXR5PWEuaW50ZW5zaXR5O3JldHVybiB0aGlzfSx0b0pTT046ZnVuY3Rpb24oYSl7cmV0dXJuIEpiLnByb3RvdHlwZS50b0pTT04uY2FsbCh0aGlzLGEpfX0pO2lpLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoSGMucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6aWksaXNIZW1pc3BoZXJlTGlnaHRQcm9iZTohMCxjb3B5OmZ1bmN0aW9uKGEpe0hjLnByb3RvdHlwZS5jb3B5LmNhbGwodGhpcyxhKTtyZXR1cm4gdGhpc30sdG9KU09OOmZ1bmN0aW9uKGEpe3JldHVybiBIYy5wcm90b3R5cGUudG9KU09OLmNhbGwodGhpcyxhKX19KTtqaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEhjLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmppLGlzQW1iaWVudExpZ2h0UHJvYmU6ITAsY29weTpmdW5jdGlvbihhKXtIYy5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSk7cmV0dXJuIHRoaXN9LHRvSlNPTjpmdW5jdGlvbihhKXtyZXR1cm4gSGMucHJvdG90eXBlLnRvSlNPTi5jYWxsKHRoaXMsCmEpfX0pO3ZhciB1az1uZXcgcSx2az1uZXcgcTtPYmplY3QuYXNzaWduKFFqLnByb3RvdHlwZSx7dXBkYXRlOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2NhY2hlO2lmKGMuZm9jdXMhPT1hLmZvY3VzfHxjLmZvdiE9PWEuZm92fHxjLmFzcGVjdCE9PWEuYXNwZWN0KnRoaXMuYXNwZWN0fHxjLm5lYXIhPT1hLm5lYXJ8fGMuZmFyIT09YS5mYXJ8fGMuem9vbSE9PWEuem9vbXx8Yy5leWVTZXAhPT10aGlzLmV5ZVNlcCl7Yy5mb2N1cz1hLmZvY3VzO2MuZm92PWEuZm92O2MuYXNwZWN0PWEuYXNwZWN0KnRoaXMuYXNwZWN0O2MubmVhcj1hLm5lYXI7Yy5mYXI9YS5mYXI7Yy56b29tPWEuem9vbTtjLmV5ZVNlcD10aGlzLmV5ZVNlcDt2YXIgZT1hLnByb2plY3Rpb25NYXRyaXguY2xvbmUoKSxnPWMuZXllU2VwLzIscj1nKmMubmVhci9jLmZvY3VzLHY9Yy5uZWFyKk1hdGgudGFuKGhiLkRFRzJSQUQqYy5mb3YqLjUpL2Muem9vbTt2ay5lbGVtZW50c1sxMl09LWc7dWsuZWxlbWVudHNbMTJdPQpnO2c9LXYqYy5hc3BlY3Qrcjt2YXIgej12KmMuYXNwZWN0K3I7ZS5lbGVtZW50c1swXT0yKmMubmVhci8oei1nKTtlLmVsZW1lbnRzWzhdPSh6K2cpLyh6LWcpO3RoaXMuY2FtZXJhTC5wcm9qZWN0aW9uTWF0cml4LmNvcHkoZSk7Zz0tdipjLmFzcGVjdC1yO3o9dipjLmFzcGVjdC1yO2UuZWxlbWVudHNbMF09MipjLm5lYXIvKHotZyk7ZS5lbGVtZW50c1s4XT0oeitnKS8oei1nKTt0aGlzLmNhbWVyYVIucHJvamVjdGlvbk1hdHJpeC5jb3B5KGUpfXRoaXMuY2FtZXJhTC5tYXRyaXhXb3JsZC5jb3B5KGEubWF0cml4V29ybGQpLm11bHRpcGx5KHZrKTt0aGlzLmNhbWVyYVIubWF0cml4V29ybGQuY29weShhLm1hdHJpeFdvcmxkKS5tdWx0aXBseSh1ayl9fSk7T2JqZWN0LmFzc2lnbihraS5wcm90b3R5cGUse3N0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5vbGRUaW1lPXRoaXMuc3RhcnRUaW1lPSgidW5kZWZpbmVkIj09PXR5cGVvZiBwZXJmb3JtYW5jZT9EYXRlOnBlcmZvcm1hbmNlKS5ub3coKTsKdGhpcy5lbGFwc2VkVGltZT0wO3RoaXMucnVubmluZz0hMH0sc3RvcDpmdW5jdGlvbigpe3RoaXMuZ2V0RWxhcHNlZFRpbWUoKTt0aGlzLmF1dG9TdGFydD10aGlzLnJ1bm5pbmc9ITF9LGdldEVsYXBzZWRUaW1lOmZ1bmN0aW9uKCl7dGhpcy5nZXREZWx0YSgpO3JldHVybiB0aGlzLmVsYXBzZWRUaW1lfSxnZXREZWx0YTpmdW5jdGlvbigpe3ZhciBhPTA7aWYodGhpcy5hdXRvU3RhcnQmJiF0aGlzLnJ1bm5pbmcpcmV0dXJuIHRoaXMuc3RhcnQoKSwwO2lmKHRoaXMucnVubmluZyl7dmFyIGM9KCJ1bmRlZmluZWQiPT09dHlwZW9mIHBlcmZvcm1hbmNlP0RhdGU6cGVyZm9ybWFuY2UpLm5vdygpO2E9KGMtdGhpcy5vbGRUaW1lKS8xRTM7dGhpcy5vbGRUaW1lPWM7dGhpcy5lbGFwc2VkVGltZSs9YX1yZXR1cm4gYX19KTt2YXIgamU9bmV3IGssd2s9bmV3IGgsTW09bmV3IGssa2U9bmV3IGs7bGkucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpsaSxnZXRJbnB1dDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhaW59LHJlbW92ZUZpbHRlcjpmdW5jdGlvbigpe251bGwhPT10aGlzLmZpbHRlciYmKHRoaXMuZ2Fpbi5kaXNjb25uZWN0KHRoaXMuZmlsdGVyKSx0aGlzLmZpbHRlci5kaXNjb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiksdGhpcy5nYWluLmNvbm5lY3QodGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uKSx0aGlzLmZpbHRlcj1udWxsKTtyZXR1cm4gdGhpc30sZ2V0RmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsdGVyfSxzZXRGaWx0ZXI6ZnVuY3Rpb24oYSl7bnVsbCE9PXRoaXMuZmlsdGVyPyh0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmZpbHRlciksdGhpcy5maWx0ZXIuZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pKTp0aGlzLmdhaW4uZGlzY29ubmVjdCh0aGlzLmNvbnRleHQuZGVzdGluYXRpb24pO3RoaXMuZmlsdGVyPWE7dGhpcy5nYWluLmNvbm5lY3QodGhpcy5maWx0ZXIpOwp0aGlzLmZpbHRlci5jb25uZWN0KHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbik7cmV0dXJuIHRoaXN9LGdldE1hc3RlclZvbHVtZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdhaW4uZ2Fpbi52YWx1ZX0sc2V0TWFzdGVyVm9sdW1lOmZ1bmN0aW9uKGEpe3RoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZShhLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpO3JldHVybiB0aGlzfSx1cGRhdGVNYXRyaXhXb3JsZDpmdW5jdGlvbihhKXtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSk7YT10aGlzLmNvbnRleHQubGlzdGVuZXI7dmFyIGM9dGhpcy51cDt0aGlzLnRpbWVEZWx0YT10aGlzLl9jbG9jay5nZXREZWx0YSgpO3RoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKGplLHdrLE1tKTtrZS5zZXQoMCwwLC0xKS5hcHBseVF1YXRlcm5pb24od2spO2lmKGEucG9zaXRpb25YKXt2YXIgZT10aGlzLmNvbnRleHQuY3VycmVudFRpbWUrdGhpcy50aW1lRGVsdGE7CmEucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGplLngsZSk7YS5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoamUueSxlKTthLnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShqZS56LGUpO2EuZm9yd2FyZFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoa2UueCxlKTthLmZvcndhcmRZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGtlLnksZSk7YS5mb3J3YXJkWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShrZS56LGUpO2EudXBYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGMueCxlKTthLnVwWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShjLnksZSk7YS51cFoubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoYy56LGUpfWVsc2UgYS5zZXRQb3NpdGlvbihqZS54LGplLnksamUueiksYS5zZXRPcmllbnRhdGlvbihrZS54LGtlLnksa2UueixjLngsYy55LGMueil9fSk7V2UucHJvdG90eXBlPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSksCntjb25zdHJ1Y3RvcjpXZSxnZXRPdXRwdXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nYWlufSxzZXROb2RlU291cmNlOmZ1bmN0aW9uKGEpe3RoaXMuaGFzUGxheWJhY2tDb250cm9sPSExO3RoaXMuc291cmNlVHlwZT0iYXVkaW9Ob2RlIjt0aGlzLnNvdXJjZT1hO3RoaXMuY29ubmVjdCgpO3JldHVybiB0aGlzfSxzZXRNZWRpYUVsZW1lbnRTb3VyY2U6ZnVuY3Rpb24oYSl7dGhpcy5oYXNQbGF5YmFja0NvbnRyb2w9ITE7dGhpcy5zb3VyY2VUeXBlPSJtZWRpYU5vZGUiO3RoaXMuc291cmNlPXRoaXMuY29udGV4dC5jcmVhdGVNZWRpYUVsZW1lbnRTb3VyY2UoYSk7dGhpcy5jb25uZWN0KCk7cmV0dXJuIHRoaXN9LHNldEJ1ZmZlcjpmdW5jdGlvbihhKXt0aGlzLmJ1ZmZlcj1hO3RoaXMuc291cmNlVHlwZT0iYnVmZmVyIjt0aGlzLmF1dG9wbGF5JiZ0aGlzLnBsYXkoKTtyZXR1cm4gdGhpc30scGxheTpmdW5jdGlvbigpe2lmKCEwPT09dGhpcy5pc1BsYXlpbmcpY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLiIpOwplbHNlIGlmKCExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2wpY29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4iKTtlbHNle3ZhciBhPXRoaXMuY29udGV4dC5jcmVhdGVCdWZmZXJTb3VyY2UoKTthLmJ1ZmZlcj10aGlzLmJ1ZmZlcjthLmxvb3A9dGhpcy5sb29wO2Eub25lbmRlZD10aGlzLm9uRW5kZWQuYmluZCh0aGlzKTt0aGlzLnN0YXJ0VGltZT10aGlzLmNvbnRleHQuY3VycmVudFRpbWU7YS5zdGFydCh0aGlzLnN0YXJ0VGltZSx0aGlzLm9mZnNldCx0aGlzLmR1cmF0aW9uKTt0aGlzLmlzUGxheWluZz0hMDt0aGlzLnNvdXJjZT1hO3RoaXMuc2V0RGV0dW5lKHRoaXMuZGV0dW5lKTt0aGlzLnNldFBsYXliYWNrUmF0ZSh0aGlzLnBsYXliYWNrUmF0ZSk7cmV0dXJuIHRoaXMuY29ubmVjdCgpfX0scGF1c2U6ZnVuY3Rpb24oKXtpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7CmVsc2UgcmV0dXJuITA9PT10aGlzLmlzUGxheWluZyYmKHRoaXMuc291cmNlLnN0b3AoKSx0aGlzLnNvdXJjZS5vbmVuZGVkPW51bGwsdGhpcy5vZmZzZXQrPSh0aGlzLmNvbnRleHQuY3VycmVudFRpbWUtdGhpcy5zdGFydFRpbWUpKnRoaXMucGxheWJhY2tSYXRlLHRoaXMuaXNQbGF5aW5nPSExKSx0aGlzfSxzdG9wOmZ1bmN0aW9uKCl7aWYoITE9PT10aGlzLmhhc1BsYXliYWNrQ29udHJvbCljb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLiIpO2Vsc2UgcmV0dXJuIHRoaXMuc291cmNlLnN0b3AoKSx0aGlzLnNvdXJjZS5vbmVuZGVkPW51bGwsdGhpcy5vZmZzZXQ9MCx0aGlzLmlzUGxheWluZz0hMSx0aGlzfSxjb25uZWN0OmZ1bmN0aW9uKCl7aWYoMDx0aGlzLmZpbHRlcnMubGVuZ3RoKXt0aGlzLnNvdXJjZS5jb25uZWN0KHRoaXMuZmlsdGVyc1swXSk7Zm9yKHZhciBhPTEsYz10aGlzLmZpbHRlcnMubGVuZ3RoO2E8YzthKyspdGhpcy5maWx0ZXJzW2EtCjFdLmNvbm5lY3QodGhpcy5maWx0ZXJzW2FdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5jb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpc30sZGlzY29ubmVjdDpmdW5jdGlvbigpe2lmKDA8dGhpcy5maWx0ZXJzLmxlbmd0aCl7dGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmZpbHRlcnNbMF0pO2Zvcih2YXIgYT0xLGM9dGhpcy5maWx0ZXJzLmxlbmd0aDthPGM7YSsrKXRoaXMuZmlsdGVyc1thLTFdLmRpc2Nvbm5lY3QodGhpcy5maWx0ZXJzW2FdKTt0aGlzLmZpbHRlcnNbdGhpcy5maWx0ZXJzLmxlbmd0aC0xXS5kaXNjb25uZWN0KHRoaXMuZ2V0T3V0cHV0KCkpfWVsc2UgdGhpcy5zb3VyY2UuZGlzY29ubmVjdCh0aGlzLmdldE91dHB1dCgpKTtyZXR1cm4gdGhpc30sZ2V0RmlsdGVyczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbHRlcnN9LHNldEZpbHRlcnM6ZnVuY3Rpb24oYSl7YXx8CihhPVtdKTshMD09PXRoaXMuaXNQbGF5aW5nPyh0aGlzLmRpc2Nvbm5lY3QoKSx0aGlzLmZpbHRlcnM9YSx0aGlzLmNvbm5lY3QoKSk6dGhpcy5maWx0ZXJzPWE7cmV0dXJuIHRoaXN9LHNldERldHVuZTpmdW5jdGlvbihhKXt0aGlzLmRldHVuZT1hO2lmKHZvaWQgMCE9PXRoaXMuc291cmNlLmRldHVuZSlyZXR1cm4hMD09PXRoaXMuaXNQbGF5aW5nJiZ0aGlzLnNvdXJjZS5kZXR1bmUuc2V0VGFyZ2V0QXRUaW1lKHRoaXMuZGV0dW5lLHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwuMDEpLHRoaXN9LGdldERldHVuZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmRldHVuZX0sZ2V0RmlsdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RmlsdGVycygpWzBdfSxzZXRGaWx0ZXI6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuc2V0RmlsdGVycyhhP1thXTpbXSl9LHNldFBsYXliYWNrUmF0ZTpmdW5jdGlvbihhKXtpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7CmVsc2UgcmV0dXJuIHRoaXMucGxheWJhY2tSYXRlPWEsITA9PT10aGlzLmlzUGxheWluZyYmdGhpcy5zb3VyY2UucGxheWJhY2tSYXRlLnNldFRhcmdldEF0VGltZSh0aGlzLnBsYXliYWNrUmF0ZSx0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsLjAxKSx0aGlzfSxnZXRQbGF5YmFja1JhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wbGF5YmFja1JhdGV9LG9uRW5kZWQ6ZnVuY3Rpb24oKXt0aGlzLmlzUGxheWluZz0hMX0sZ2V0TG9vcDpmdW5jdGlvbigpe3JldHVybiExPT09dGhpcy5oYXNQbGF5YmFja0NvbnRyb2w/KGNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIiksITEpOnRoaXMubG9vcH0sc2V0TG9vcDpmdW5jdGlvbihhKXtpZighMT09PXRoaXMuaGFzUGxheWJhY2tDb250cm9sKWNvbnNvbGUud2FybigiVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuIik7ZWxzZSByZXR1cm4gdGhpcy5sb29wPQphLCEwPT09dGhpcy5pc1BsYXlpbmcmJih0aGlzLnNvdXJjZS5sb29wPXRoaXMubG9vcCksdGhpc30sZ2V0Vm9sdW1lOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlfSxzZXRWb2x1bWU6ZnVuY3Rpb24oYSl7dGhpcy5nYWluLmdhaW4uc2V0VGFyZ2V0QXRUaW1lKGEsdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lLC4wMSk7cmV0dXJuIHRoaXN9fSk7dmFyIGxlPW5ldyBrLHhrPW5ldyBoLE5tPW5ldyBrLG1lPW5ldyBrO25pLnByb3RvdHlwZT1PYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUoV2UucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6bmksZ2V0T3V0cHV0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFubmVyfSxnZXRSZWZEaXN0YW5jZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZX0sc2V0UmVmRGlzdGFuY2U6ZnVuY3Rpb24oYSl7dGhpcy5wYW5uZXIucmVmRGlzdGFuY2U9YTtyZXR1cm4gdGhpc30sZ2V0Um9sbG9mZkZhY3RvcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yfSwKc2V0Um9sbG9mZkZhY3RvcjpmdW5jdGlvbihhKXt0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yPWE7cmV0dXJuIHRoaXN9LGdldERpc3RhbmNlTW9kZWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbH0sc2V0RGlzdGFuY2VNb2RlbDpmdW5jdGlvbihhKXt0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsPWE7cmV0dXJuIHRoaXN9LGdldE1heERpc3RhbmNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucGFubmVyLm1heERpc3RhbmNlfSxzZXRNYXhEaXN0YW5jZTpmdW5jdGlvbihhKXt0aGlzLnBhbm5lci5tYXhEaXN0YW5jZT1hO3JldHVybiB0aGlzfSxzZXREaXJlY3Rpb25hbENvbmU6ZnVuY3Rpb24oYSxjLGUpe3RoaXMucGFubmVyLmNvbmVJbm5lckFuZ2xlPWE7dGhpcy5wYW5uZXIuY29uZU91dGVyQW5nbGU9Yzt0aGlzLnBhbm5lci5jb25lT3V0ZXJHYWluPWU7cmV0dXJuIHRoaXN9LHVwZGF0ZU1hdHJpeFdvcmxkOmZ1bmN0aW9uKGEpe0EucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwodGhpcywKYSk7aWYoITAhPT10aGlzLmhhc1BsYXliYWNrQ29udHJvbHx8ITEhPT10aGlzLmlzUGxheWluZylpZih0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZShsZSx4ayxObSksbWUuc2V0KDAsMCwxKS5hcHBseVF1YXRlcm5pb24oeGspLGE9dGhpcy5wYW5uZXIsYS5wb3NpdGlvblgpe3ZhciBjPXRoaXMuY29udGV4dC5jdXJyZW50VGltZSt0aGlzLmxpc3RlbmVyLnRpbWVEZWx0YTthLnBvc2l0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShsZS54LGMpO2EucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKGxlLnksYyk7YS5wb3NpdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobGUueixjKTthLm9yaWVudGF0aW9uWC5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZShtZS54LGMpO2Eub3JpZW50YXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKG1lLnksYyk7YS5vcmllbnRhdGlvbloubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUobWUueixjKX1lbHNlIGEuc2V0UG9zaXRpb24obGUueCwKbGUueSxsZS56KSxhLnNldE9yaWVudGF0aW9uKG1lLngsbWUueSxtZS56KX19KTtPYmplY3QuYXNzaWduKG9pLnByb3RvdHlwZSx7Z2V0RnJlcXVlbmN5RGF0YTpmdW5jdGlvbigpe3RoaXMuYW5hbHlzZXIuZ2V0Qnl0ZUZyZXF1ZW5jeURhdGEodGhpcy5kYXRhKTtyZXR1cm4gdGhpcy5kYXRhfSxnZXRBdmVyYWdlRnJlcXVlbmN5OmZ1bmN0aW9uKCl7Zm9yKHZhciBhPTAsYz10aGlzLmdldEZyZXF1ZW5jeURhdGEoKSxlPTA7ZTxjLmxlbmd0aDtlKyspYSs9Y1tlXTtyZXR1cm4gYS9jLmxlbmd0aH19KTtPYmplY3QuYXNzaWduKHBpLnByb3RvdHlwZSx7YWNjdW11bGF0ZTpmdW5jdGlvbihhLGMpe3ZhciBlPXRoaXMuYnVmZmVyLGc9dGhpcy52YWx1ZVNpemU7YT1hKmcrZzt2YXIgcj10aGlzLmN1bXVsYXRpdmVXZWlnaHQ7aWYoMD09PXIpe2ZvcihyPTA7ciE9PWc7KytyKWVbYStyXT1lW3JdO3I9Y31lbHNlIHIrPWMsdGhpcy5fbWl4QnVmZmVyUmVnaW9uKGUsYSwwLGMvcixnKTt0aGlzLmN1bXVsYXRpdmVXZWlnaHQ9CnJ9LGFwcGx5OmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudmFsdWVTaXplLGU9dGhpcy5idWZmZXI7YT1hKmMrYzt2YXIgZz10aGlzLmN1bXVsYXRpdmVXZWlnaHQscj10aGlzLmJpbmRpbmc7dGhpcy5jdW11bGF0aXZlV2VpZ2h0PTA7MT5nJiZ0aGlzLl9taXhCdWZmZXJSZWdpb24oZSxhLDMqYywxLWcsYyk7Zz1jO2Zvcih2YXIgdj1jK2M7ZyE9PXY7KytnKWlmKGVbZ10hPT1lW2crY10pe3Iuc2V0VmFsdWUoZSxhKTticmVha319LHNhdmVPcmlnaW5hbFN0YXRlOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5idWZmZXIsYz10aGlzLnZhbHVlU2l6ZSxlPTMqYzt0aGlzLmJpbmRpbmcuZ2V0VmFsdWUoYSxlKTtmb3IodmFyIGc9YztnIT09ZTsrK2cpYVtnXT1hW2UrZyVjXTt0aGlzLmN1bXVsYXRpdmVXZWlnaHQ9MH0scmVzdG9yZU9yaWdpbmFsU3RhdGU6ZnVuY3Rpb24oKXt0aGlzLmJpbmRpbmcuc2V0VmFsdWUodGhpcy5idWZmZXIsMyp0aGlzLnZhbHVlU2l6ZSl9LF9zZWxlY3Q6ZnVuY3Rpb24oYSwKYyxlLGcscil7aWYoLjU8PWcpZm9yKGc9MDtnIT09cjsrK2cpYVtjK2ddPWFbZStnXX0sX3NsZXJwOmZ1bmN0aW9uKGEsYyxlLGcpe2guc2xlcnBGbGF0KGEsYyxhLGMsYSxlLGcpfSxfbGVycDpmdW5jdGlvbihhLGMsZSxnLHIpe2Zvcih2YXIgdj0xLWcsej0wO3ohPT1yOysreil7dmFyIEU9Yyt6O2FbRV09YVtFXSp2K2FbZSt6XSpnfX19KTt2YXIgT209L1tcW1xdXC46XC9dL2csUG09IlteIisiXFxbXFxdXFwuOlxcLyIucmVwbGFjZSgiXFwuIiwiIikrIl0iLFFtPS8oKD86V0MrW1wvOl0pKikvLnNvdXJjZS5yZXBsYWNlKCJXQyIsIlteXFxbXFxdXFwuOlxcL10iKSxSbT0vKFdDT0QrKT8vLnNvdXJjZS5yZXBsYWNlKCJXQ09EIixQbSksU209Lyg/OlwuKFdDKykoPzpcWyguKylcXSk/KT8vLnNvdXJjZS5yZXBsYWNlKCJXQyIsIlteXFxbXFxdXFwuOlxcL10iKSxUbT0vXC4oV0MrKSg/OlxbKC4rKVxdKT8vLnNvdXJjZS5yZXBsYWNlKCJXQyIsIlteXFxbXFxdXFwuOlxcL10iKSxVbT0KbmV3IFJlZ0V4cCgiXiIrUW0rUm0rU20rVG0rIiQiKSxWbT1bIm1hdGVyaWFsIiwibWF0ZXJpYWxzIiwiYm9uZXMiXTtPYmplY3QuYXNzaWduKFJqLnByb3RvdHlwZSx7Z2V0VmFsdWU6ZnVuY3Rpb24oYSxjKXt0aGlzLmJpbmQoKTt2YXIgZT10aGlzLl9iaW5kaW5nc1t0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c19dO3ZvaWQgMCE9PWUmJmUuZ2V0VmFsdWUoYSxjKX0sc2V0VmFsdWU6ZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5fYmluZGluZ3MsZz10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18scj1lLmxlbmd0aDtnIT09cjsrK2cpZVtnXS5zZXRWYWx1ZShhLGMpfSxiaW5kOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuX2JpbmRpbmdzLGM9dGhpcy5fdGFyZ2V0R3JvdXAubkNhY2hlZE9iamVjdHNfLGU9YS5sZW5ndGg7YyE9PWU7KytjKWFbY10uYmluZCgpfSx1bmJpbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fYmluZGluZ3MsYz10aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sCmU9YS5sZW5ndGg7YyE9PWU7KytjKWFbY10udW5iaW5kKCl9fSk7T2JqZWN0LmFzc2lnbigkYix7Q29tcG9zaXRlOlJqLGNyZWF0ZTpmdW5jdGlvbihhLGMsZSl7cmV0dXJuIGEmJmEuaXNBbmltYXRpb25PYmplY3RHcm91cD9uZXcgJGIuQ29tcG9zaXRlKGEsYyxlKTpuZXcgJGIoYSxjLGUpfSxzYW5pdGl6ZU5vZGVOYW1lOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1xzL2csIl8iKS5yZXBsYWNlKE9tLCIiKX0scGFyc2VUcmFja05hbWU6ZnVuY3Rpb24oYSl7dmFyIGM9VW0uZXhlYyhhKTtpZighYyl0aHJvdyBFcnJvcigiUHJvcGVydHlCaW5kaW5nOiBDYW5ub3QgcGFyc2UgdHJhY2tOYW1lOiAiK2EpO2M9e25vZGVOYW1lOmNbMl0sb2JqZWN0TmFtZTpjWzNdLG9iamVjdEluZGV4OmNbNF0scHJvcGVydHlOYW1lOmNbNV0scHJvcGVydHlJbmRleDpjWzZdfTt2YXIgZT1jLm5vZGVOYW1lJiZjLm5vZGVOYW1lLmxhc3RJbmRleE9mKCIuIik7aWYodm9pZCAwIT09ZSYmLTEhPT0KZSl7dmFyIGc9Yy5ub2RlTmFtZS5zdWJzdHJpbmcoZSsxKTstMSE9PVZtLmluZGV4T2YoZykmJihjLm5vZGVOYW1lPWMubm9kZU5hbWUuc3Vic3RyaW5nKDAsZSksYy5vYmplY3ROYW1lPWcpfWlmKG51bGw9PT1jLnByb3BlcnR5TmFtZXx8MD09PWMucHJvcGVydHlOYW1lLmxlbmd0aCl0aHJvdyBFcnJvcigiUHJvcGVydHlCaW5kaW5nOiBjYW4gbm90IHBhcnNlIHByb3BlcnR5TmFtZSBmcm9tIHRyYWNrTmFtZTogIithKTtyZXR1cm4gY30sZmluZE5vZGU6ZnVuY3Rpb24oYSxjKXtpZighY3x8IiI9PT1jfHwicm9vdCI9PT1jfHwiLiI9PT1jfHwtMT09PWN8fGM9PT1hLm5hbWV8fGM9PT1hLnV1aWQpcmV0dXJuIGE7aWYoYS5za2VsZXRvbil7dmFyIGU9YS5za2VsZXRvbi5nZXRCb25lQnlOYW1lKGMpO2lmKHZvaWQgMCE9PWUpcmV0dXJuIGV9aWYoYS5jaGlsZHJlbil7dmFyIGc9ZnVuY3Rpb24ocil7Zm9yKHZhciB2PTA7djxyLmxlbmd0aDt2Kyspe3ZhciB6PXJbdl07aWYoei5uYW1lPT09CmN8fHoudXVpZD09PWMpcmV0dXJuIHo7aWYoej1nKHouY2hpbGRyZW4pKXJldHVybiB6fXJldHVybiBudWxsfTtpZihhPWcoYS5jaGlsZHJlbikpcmV0dXJuIGF9cmV0dXJuIG51bGx9fSk7T2JqZWN0LmFzc2lnbigkYi5wcm90b3R5cGUse19nZXRWYWx1ZV91bmF2YWlsYWJsZTpmdW5jdGlvbigpe30sX3NldFZhbHVlX3VuYXZhaWxhYmxlOmZ1bmN0aW9uKCl7fSxCaW5kaW5nVHlwZTp7RGlyZWN0OjAsRW50aXJlQXJyYXk6MSxBcnJheUVsZW1lbnQ6MixIYXNGcm9tVG9BcnJheTozfSxWZXJzaW9uaW5nOntOb25lOjAsTmVlZHNVcGRhdGU6MSxNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOjJ9LEdldHRlckJ5QmluZGluZ1R5cGU6W2Z1bmN0aW9uKGEsYyl7YVtjXT10aGlzLm5vZGVbdGhpcy5wcm9wZXJ0eU5hbWVdfSxmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT10aGlzLnJlc29sdmVkUHJvcGVydHksZz0wLHI9ZS5sZW5ndGg7ZyE9PXI7KytnKWFbYysrXT1lW2ddfSxmdW5jdGlvbihhLGMpe2FbY109CnRoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdfSxmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS50b0FycmF5KGEsYyl9XSxTZXR0ZXJCeUJpbmRpbmdUeXBlQW5kVmVyc2lvbmluZzpbW2Z1bmN0aW9uKGEsYyl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPWFbY119LGZ1bmN0aW9uKGEsYyl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPWFbY107dGhpcy50YXJnZXRPYmplY3QubmVlZHNVcGRhdGU9ITB9LGZ1bmN0aW9uKGEsYyl7dGhpcy50YXJnZXRPYmplY3RbdGhpcy5wcm9wZXJ0eU5hbWVdPWFbY107dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dLFtmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT10aGlzLnJlc29sdmVkUHJvcGVydHksZz0wLHI9ZS5sZW5ndGg7ZyE9PXI7KytnKWVbZ109YVtjKytdfSxmdW5jdGlvbihhLGMpe2Zvcih2YXIgZT10aGlzLnJlc29sdmVkUHJvcGVydHksCmc9MCxyPWUubGVuZ3RoO2chPT1yOysrZyllW2ddPWFbYysrXTt0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZT0hMH0sZnVuY3Rpb24oYSxjKXtmb3IodmFyIGU9dGhpcy5yZXNvbHZlZFByb3BlcnR5LGc9MCxyPWUubGVuZ3RoO2chPT1yOysrZyllW2ddPWFbYysrXTt0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV0sW2Z1bmN0aW9uKGEsYyl7dGhpcy5yZXNvbHZlZFByb3BlcnR5W3RoaXMucHJvcGVydHlJbmRleF09YVtjXX0sZnVuY3Rpb24oYSxjKXt0aGlzLnJlc29sdmVkUHJvcGVydHlbdGhpcy5wcm9wZXJ0eUluZGV4XT1hW2NdO3RoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfSxmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eVt0aGlzLnByb3BlcnR5SW5kZXhdPWFbY107dGhpcy50YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH1dLFtmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoYSwKYyl9LGZ1bmN0aW9uKGEsYyl7dGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheShhLGMpO3RoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlPSEwfSxmdW5jdGlvbihhLGMpe3RoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoYSxjKTt0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSEwfV1dLGdldFZhbHVlOmZ1bmN0aW9uKGEsYyl7dGhpcy5iaW5kKCk7dGhpcy5nZXRWYWx1ZShhLGMpfSxzZXRWYWx1ZTpmdW5jdGlvbihhLGMpe3RoaXMuYmluZCgpO3RoaXMuc2V0VmFsdWUoYSxjKX0sYmluZDpmdW5jdGlvbigpe3ZhciBhPXRoaXMubm9kZSxjPXRoaXMucGFyc2VkUGF0aCxlPWMub2JqZWN0TmFtZSxnPWMucHJvcGVydHlOYW1lLHI9Yy5wcm9wZXJ0eUluZGV4O2F8fCh0aGlzLm5vZGU9YT0kYi5maW5kTm9kZSh0aGlzLnJvb3ROb2RlLGMubm9kZU5hbWUpfHx0aGlzLnJvb3ROb2RlKTt0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYXZhaWxhYmxlOwp0aGlzLnNldFZhbHVlPXRoaXMuX3NldFZhbHVlX3VuYXZhaWxhYmxlO2lmKGEpe2lmKGUpe3ZhciB2PWMub2JqZWN0SW5kZXg7c3dpdGNoKGUpe2Nhc2UgIm1hdGVyaWFscyI6aWYoIWEubWF0ZXJpYWwpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsIGFzIG5vZGUgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFsLiIsdGhpcyk7cmV0dXJufWlmKCFhLm1hdGVyaWFsLm1hdGVyaWFscyl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwubWF0ZXJpYWxzIGFzIG5vZGUubWF0ZXJpYWwgZG9lcyBub3QgaGF2ZSBhIG1hdGVyaWFscyBhcnJheS4iLHRoaXMpO3JldHVybn1hPWEubWF0ZXJpYWwubWF0ZXJpYWxzO2JyZWFrO2Nhc2UgImJvbmVzIjppZighYS5za2VsZXRvbil7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gYm9uZXMgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgc2tlbGV0b24uIiwKdGhpcyk7cmV0dXJufWE9YS5za2VsZXRvbi5ib25lcztmb3IoZT0wO2U8YS5sZW5ndGg7ZSsrKWlmKGFbZV0ubmFtZT09PXYpe3Y9ZTticmVha31icmVhaztkZWZhdWx0OmlmKHZvaWQgMD09PWFbZV0pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG9iamVjdE5hbWUgb2Ygbm9kZSB1bmRlZmluZWQuIix0aGlzKTtyZXR1cm59YT1hW2VdfWlmKHZvaWQgMCE9PXYpe2lmKHZvaWQgMD09PWFbdl0pe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIGJpbmQgdG8gb2JqZWN0SW5kZXggb2Ygb2JqZWN0TmFtZSwgYnV0IGlzIHVuZGVmaW5lZC4iLHRoaXMsYSk7cmV0dXJufWE9YVt2XX19dj1hW2ddO2lmKHZvaWQgMD09PXYpY29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIHByb3BlcnR5IGZvciB0cmFjazogIitjLm5vZGVOYW1lKyIuIitnKyIgYnV0IGl0IHdhc24ndCBmb3VuZC4iLAphKTtlbHNle2M9dGhpcy5WZXJzaW9uaW5nLk5vbmU7dGhpcy50YXJnZXRPYmplY3Q9YTt2b2lkIDAhPT1hLm5lZWRzVXBkYXRlP2M9dGhpcy5WZXJzaW9uaW5nLk5lZWRzVXBkYXRlOnZvaWQgMCE9PWEubWF0cml4V29ybGROZWVkc1VwZGF0ZSYmKGM9dGhpcy5WZXJzaW9uaW5nLk1hdHJpeFdvcmxkTmVlZHNVcGRhdGUpO2U9dGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7aWYodm9pZCAwIT09cil7aWYoIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyI9PT1nKXtpZighYS5nZW9tZXRyeSl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkuIix0aGlzKTtyZXR1cm59aWYoYS5nZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5KXtpZighYS5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy4iLAp0aGlzKTtyZXR1cm59Zm9yKGU9MDtlPHRoaXMubm9kZS5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24ubGVuZ3RoO2UrKylpZihhLmdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbltlXS5uYW1lPT09cil7cj1lO2JyZWFrfX1lbHNle2lmKCFhLmdlb21ldHJ5Lm1vcnBoVGFyZ2V0cyl7Y29uc29sZS5lcnJvcigiVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGJlY2F1c2Ugbm9kZSBkb2VzIG5vdCBoYXZlIGEgZ2VvbWV0cnkubW9ycGhUYXJnZXRzLiIsdGhpcyk7cmV0dXJufWZvcihlPTA7ZTx0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhUYXJnZXRzLmxlbmd0aDtlKyspaWYoYS5nZW9tZXRyeS5tb3JwaFRhcmdldHNbZV0ubmFtZT09PXIpe3I9ZTticmVha319fWU9dGhpcy5CaW5kaW5nVHlwZS5BcnJheUVsZW1lbnQ7dGhpcy5yZXNvbHZlZFByb3BlcnR5PXY7dGhpcy5wcm9wZXJ0eUluZGV4PXJ9ZWxzZSB2b2lkIDAhPT0Kdi5mcm9tQXJyYXkmJnZvaWQgMCE9PXYudG9BcnJheT8oZT10aGlzLkJpbmRpbmdUeXBlLkhhc0Zyb21Ub0FycmF5LHRoaXMucmVzb2x2ZWRQcm9wZXJ0eT12KTpBcnJheS5pc0FycmF5KHYpPyhlPXRoaXMuQmluZGluZ1R5cGUuRW50aXJlQXJyYXksdGhpcy5yZXNvbHZlZFByb3BlcnR5PXYpOnRoaXMucHJvcGVydHlOYW1lPWc7dGhpcy5nZXRWYWx1ZT10aGlzLkdldHRlckJ5QmluZGluZ1R5cGVbZV07dGhpcy5zZXRWYWx1ZT10aGlzLlNldHRlckJ5QmluZGluZ1R5cGVBbmRWZXJzaW9uaW5nW2VdW2NdfX1lbHNlIGNvbnNvbGUuZXJyb3IoIlRIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBub2RlIGZvciB0cmFjazogIit0aGlzLnBhdGgrIiBidXQgaXQgd2Fzbid0IGZvdW5kLiIpfSx1bmJpbmQ6ZnVuY3Rpb24oKXt0aGlzLm5vZGU9bnVsbDt0aGlzLmdldFZhbHVlPXRoaXMuX2dldFZhbHVlX3VuYm91bmQ7dGhpcy5zZXRWYWx1ZT10aGlzLl9zZXRWYWx1ZV91bmJvdW5kfX0pOwpPYmplY3QuYXNzaWduKCRiLnByb3RvdHlwZSx7X2dldFZhbHVlX3VuYm91bmQ6JGIucHJvdG90eXBlLmdldFZhbHVlLF9zZXRWYWx1ZV91bmJvdW5kOiRiLnByb3RvdHlwZS5zZXRWYWx1ZX0pO09iamVjdC5hc3NpZ24oU2oucHJvdG90eXBlLHtpc0FuaW1hdGlvbk9iamVjdEdyb3VwOiEwLGFkZDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLl9vYmplY3RzLGM9YS5sZW5ndGgsZT10aGlzLm5DYWNoZWRPYmplY3RzXyxnPXRoaXMuX2luZGljZXNCeVVVSUQscj10aGlzLl9wYXRocyx2PXRoaXMuX3BhcnNlZFBhdGhzLHo9dGhpcy5fYmluZGluZ3MsRT16Lmxlbmd0aCxGPXZvaWQgMCxKPTAsUD1hcmd1bWVudHMubGVuZ3RoO0ohPT1QOysrSil7dmFyIFI9YXJndW1lbnRzW0pdLFM9Ui51dWlkLFY9Z1tTXTtpZih2b2lkIDA9PT1WKXtWPWMrKztnW1NdPVY7YS5wdXNoKFIpO1M9MDtmb3IodmFyIFc9RTtTIT09VzsrK1MpeltTXS5wdXNoKG5ldyAkYihSLHJbU10sdltTXSkpfWVsc2UgaWYoVjwKZSl7Rj1hW1ZdO3ZhciBoYT0tLWU7Vz1hW2hhXTtnW1cudXVpZF09VjthW1ZdPVc7Z1tTXT1oYTthW2hhXT1SO1M9MDtmb3IoVz1FO1MhPT1XOysrUyl7dmFyIGZhPXpbU10scmE9ZmFbVl07ZmFbVl09ZmFbaGFdO3ZvaWQgMD09PXJhJiYocmE9bmV3ICRiKFIscltTXSx2W1NdKSk7ZmFbaGFdPXJhfX1lbHNlIGFbVl0hPT1GJiZjb25zb2xlLmVycm9yKCJUSFJFRS5BbmltYXRpb25PYmplY3RHcm91cDogRGlmZmVyZW50IG9iamVjdHMgd2l0aCB0aGUgc2FtZSBVVUlEIGRldGVjdGVkLiBDbGVhbiB0aGUgY2FjaGVzIG9yIHJlY3JlYXRlIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgd2hlbiByZWxvYWRpbmcgc2NlbmVzLiIpfXRoaXMubkNhY2hlZE9iamVjdHNfPWV9LHJlbW92ZTpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzLl9vYmplY3RzLGM9dGhpcy5uQ2FjaGVkT2JqZWN0c18sZT10aGlzLl9pbmRpY2VzQnlVVUlELGc9dGhpcy5fYmluZGluZ3Mscj1nLmxlbmd0aCx2PTAsej1hcmd1bWVudHMubGVuZ3RoO3YhPT0KejsrK3Ype3ZhciBFPWFyZ3VtZW50c1t2XSxGPUUudXVpZCxKPWVbRl07aWYodm9pZCAwIT09SiYmSj49Yyl7dmFyIFA9YysrLFI9YVtQXTtlW1IudXVpZF09SjthW0pdPVI7ZVtGXT1QO2FbUF09RTtFPTA7Zm9yKEY9cjtFIT09RjsrK0Upe1I9Z1tFXTt2YXIgUz1SW0pdO1JbSl09UltQXTtSW1BdPVN9fX10aGlzLm5DYWNoZWRPYmplY3RzXz1jfSx1bmNhY2hlOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXMuX29iamVjdHMsYz1hLmxlbmd0aCxlPXRoaXMubkNhY2hlZE9iamVjdHNfLGc9dGhpcy5faW5kaWNlc0J5VVVJRCxyPXRoaXMuX2JpbmRpbmdzLHY9ci5sZW5ndGgsej0wLEU9YXJndW1lbnRzLmxlbmd0aDt6IT09RTsrK3ope3ZhciBGPWFyZ3VtZW50c1t6XS51dWlkLEo9Z1tGXTtpZih2b2lkIDAhPT1KKWlmKGRlbGV0ZSBnW0ZdLEo8ZSl7Rj0tLWU7dmFyIFA9YVtGXSxSPS0tYyxTPWFbUl07Z1tQLnV1aWRdPUo7YVtKXT1QO2dbUy51dWlkXT1GO2FbRl09UzthLnBvcCgpO1A9CjA7Zm9yKFM9djtQIT09UzsrK1Ape3ZhciBWPXJbUF0sVz1WW1JdO1ZbSl09VltGXTtWW0ZdPVc7Vi5wb3AoKX19ZWxzZSBmb3IoUj0tLWMsUz1hW1JdLGdbUy51dWlkXT1KLGFbSl09UyxhLnBvcCgpLFA9MCxTPXY7UCE9PVM7KytQKVY9cltQXSxWW0pdPVZbUl0sVi5wb3AoKX10aGlzLm5DYWNoZWRPYmplY3RzXz1lfSxzdWJzY3JpYmVfOmZ1bmN0aW9uKGEsYyl7dmFyIGU9dGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLGc9ZVthXSxyPXRoaXMuX2JpbmRpbmdzO2lmKHZvaWQgMCE9PWcpcmV0dXJuIHJbZ107dmFyIHY9dGhpcy5fcGF0aHMsej10aGlzLl9wYXJzZWRQYXRocyxFPXRoaXMuX29iamVjdHMsRj10aGlzLm5DYWNoZWRPYmplY3RzXyxKPUFycmF5KEUubGVuZ3RoKTtnPXIubGVuZ3RoO2VbYV09Zzt2LnB1c2goYSk7ei5wdXNoKGMpO3IucHVzaChKKTtlPUY7Zm9yKGc9RS5sZW5ndGg7ZSE9PWc7KytlKUpbZV09bmV3ICRiKEVbZV0sYSxjKTtyZXR1cm4gSn0sdW5zdWJzY3JpYmVfOmZ1bmN0aW9uKGEpe3ZhciBjPQp0aGlzLl9iaW5kaW5nc0luZGljZXNCeVBhdGgsZT1jW2FdO2lmKHZvaWQgMCE9PWUpe3ZhciBnPXRoaXMuX3BhdGhzLHI9dGhpcy5fcGFyc2VkUGF0aHMsdj10aGlzLl9iaW5kaW5ncyx6PXYubGVuZ3RoLTEsRT12W3pdO2NbYVt6XV09ZTt2W2VdPUU7di5wb3AoKTtyW2VdPXJbel07ci5wb3AoKTtnW2VdPWdbel07Zy5wb3AoKX19fSk7T2JqZWN0LmFzc2lnbihUai5wcm90b3R5cGUse3BsYXk6ZnVuY3Rpb24oKXt0aGlzLl9taXhlci5fYWN0aXZhdGVBY3Rpb24odGhpcyk7cmV0dXJuIHRoaXN9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9taXhlci5fZGVhY3RpdmF0ZUFjdGlvbih0aGlzKTtyZXR1cm4gdGhpcy5yZXNldCgpfSxyZXNldDpmdW5jdGlvbigpe3RoaXMucGF1c2VkPSExO3RoaXMuZW5hYmxlZD0hMDt0aGlzLnRpbWU9MDt0aGlzLl9sb29wQ291bnQ9LTE7dGhpcy5fc3RhcnRUaW1lPW51bGw7cmV0dXJuIHRoaXMuc3RvcEZhZGluZygpLnN0b3BXYXJwaW5nKCl9LGlzUnVubmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVuYWJsZWQmJgohdGhpcy5wYXVzZWQmJjAhPT10aGlzLnRpbWVTY2FsZSYmbnVsbD09PXRoaXMuX3N0YXJ0VGltZSYmdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKHRoaXMpfSxpc1NjaGVkdWxlZDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taXhlci5faXNBY3RpdmVBY3Rpb24odGhpcyl9LHN0YXJ0QXQ6ZnVuY3Rpb24oYSl7dGhpcy5fc3RhcnRUaW1lPWE7cmV0dXJuIHRoaXN9LHNldExvb3A6ZnVuY3Rpb24oYSxjKXt0aGlzLmxvb3A9YTt0aGlzLnJlcGV0aXRpb25zPWM7cmV0dXJuIHRoaXN9LHNldEVmZmVjdGl2ZVdlaWdodDpmdW5jdGlvbihhKXt0aGlzLndlaWdodD1hO3RoaXMuX2VmZmVjdGl2ZVdlaWdodD10aGlzLmVuYWJsZWQ/YTowO3JldHVybiB0aGlzLnN0b3BGYWRpbmcoKX0sZ2V0RWZmZWN0aXZlV2VpZ2h0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodH0sZmFkZUluOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLl9zY2hlZHVsZUZhZGluZyhhLDAsMSl9LGZhZGVPdXQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKGEsCjEsMCl9LGNyb3NzRmFkZUZyb206ZnVuY3Rpb24oYSxjLGUpe2EuZmFkZU91dChjKTt0aGlzLmZhZGVJbihjKTtpZihlKXtlPXRoaXMuX2NsaXAuZHVyYXRpb247dmFyIGc9YS5fY2xpcC5kdXJhdGlvbixyPWUvZzthLndhcnAoMSxnL2UsYyk7dGhpcy53YXJwKHIsMSxjKX1yZXR1cm4gdGhpc30sY3Jvc3NGYWRlVG86ZnVuY3Rpb24oYSxjLGUpe3JldHVybiBhLmNyb3NzRmFkZUZyb20odGhpcyxjLGUpfSxzdG9wRmFkaW5nOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7bnVsbCE9PWEmJih0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD1udWxsLHRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudChhKSk7cmV0dXJuIHRoaXN9LHNldEVmZmVjdGl2ZVRpbWVTY2FsZTpmdW5jdGlvbihhKXt0aGlzLnRpbWVTY2FsZT1hO3RoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZT10aGlzLnBhdXNlZD8wOmE7cmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKX0sZ2V0RWZmZWN0aXZlVGltZVNjYWxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZX0sCnNldER1cmF0aW9uOmZ1bmN0aW9uKGEpe3RoaXMudGltZVNjYWxlPXRoaXMuX2NsaXAuZHVyYXRpb24vYTtyZXR1cm4gdGhpcy5zdG9wV2FycGluZygpfSxzeW5jV2l0aDpmdW5jdGlvbihhKXt0aGlzLnRpbWU9YS50aW1lO3RoaXMudGltZVNjYWxlPWEudGltZVNjYWxlO3JldHVybiB0aGlzLnN0b3BXYXJwaW5nKCl9LGhhbHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMud2FycCh0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsMCxhKX0sd2FycDpmdW5jdGlvbihhLGMsZSl7dmFyIGc9dGhpcy5fbWl4ZXIscj1nLnRpbWUsdj10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudCx6PXRoaXMudGltZVNjYWxlO251bGw9PT12JiYodGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9dj1nLl9sZW5kQ29udHJvbEludGVycG9sYW50KCkpO2c9di5wYXJhbWV0ZXJQb3NpdGlvbnM7dj12LnNhbXBsZVZhbHVlcztnWzBdPXI7Z1sxXT1yK2U7dlswXT1hL3o7dlsxXT1jL3o7cmV0dXJuIHRoaXN9LHN0b3BXYXJwaW5nOmZ1bmN0aW9uKCl7dmFyIGE9CnRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50O251bGwhPT1hJiYodGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ9bnVsbCx0aGlzLl9taXhlci5fdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQoYSkpO3JldHVybiB0aGlzfSxnZXRNaXhlcjpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9taXhlcn0sZ2V0Q2xpcDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9jbGlwfSxnZXRSb290OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xvY2FsUm9vdHx8dGhpcy5fbWl4ZXIuX3Jvb3R9LF91cGRhdGU6ZnVuY3Rpb24oYSxjLGUsZyl7aWYodGhpcy5lbmFibGVkKXt2YXIgcj10aGlzLl9zdGFydFRpbWU7aWYobnVsbCE9PXIpe2M9KGEtcikqZTtpZigwPmN8fDA9PT1lKXJldHVybjt0aGlzLl9zdGFydFRpbWU9bnVsbDtjKj1lfWMqPXRoaXMuX3VwZGF0ZVRpbWVTY2FsZShhKTtlPXRoaXMuX3VwZGF0ZVRpbWUoYyk7YT10aGlzLl91cGRhdGVXZWlnaHQoYSk7aWYoMDxhKXtjPXRoaXMuX2ludGVycG9sYW50czsKcj10aGlzLl9wcm9wZXJ0eUJpbmRpbmdzO2Zvcih2YXIgdj0wLHo9Yy5sZW5ndGg7diE9PXo7Kyt2KWNbdl0uZXZhbHVhdGUoZSksclt2XS5hY2N1bXVsYXRlKGcsYSl9fWVsc2UgdGhpcy5fdXBkYXRlV2VpZ2h0KGEpfSxfdXBkYXRlV2VpZ2h0OmZ1bmN0aW9uKGEpe3ZhciBjPTA7aWYodGhpcy5lbmFibGVkKXtjPXRoaXMud2VpZ2h0O3ZhciBlPXRoaXMuX3dlaWdodEludGVycG9sYW50O2lmKG51bGwhPT1lKXt2YXIgZz1lLmV2YWx1YXRlKGEpWzBdO2MqPWc7YT5lLnBhcmFtZXRlclBvc2l0aW9uc1sxXSYmKHRoaXMuc3RvcEZhZGluZygpLDA9PT1nJiYodGhpcy5lbmFibGVkPSExKSl9fXJldHVybiB0aGlzLl9lZmZlY3RpdmVXZWlnaHQ9Y30sX3VwZGF0ZVRpbWVTY2FsZTpmdW5jdGlvbihhKXt2YXIgYz0wO2lmKCF0aGlzLnBhdXNlZCl7Yz10aGlzLnRpbWVTY2FsZTt2YXIgZT10aGlzLl90aW1lU2NhbGVJbnRlcnBvbGFudDtpZihudWxsIT09ZSl7dmFyIGc9ZS5ldmFsdWF0ZShhKVswXTsKYyo9ZzthPmUucGFyYW1ldGVyUG9zaXRpb25zWzFdJiYodGhpcy5zdG9wV2FycGluZygpLDA9PT1jP3RoaXMucGF1c2VkPSEwOnRoaXMudGltZVNjYWxlPWMpfX1yZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlPWN9LF91cGRhdGVUaW1lOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMudGltZSthLGU9dGhpcy5fY2xpcC5kdXJhdGlvbixnPXRoaXMubG9vcCxyPXRoaXMuX2xvb3BDb3VudCx2PTIyMDI9PT1nO2lmKDA9PT1hKXJldHVybi0xPT09cj9jOnYmJjE9PT0ociYxKT9lLWM6YztpZigyMjAwPT09ZylhOntpZigtMT09PXImJih0aGlzLl9sb29wQ291bnQ9MCx0aGlzLl9zZXRFbmRpbmdzKCEwLCEwLCExKSksYz49ZSljPWU7ZWxzZSBpZigwPmMpYz0wO2Vsc2V7dGhpcy50aW1lPWM7YnJlYWsgYX10aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMTt0aGlzLnRpbWU9Yzt0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KHt0eXBlOiJmaW5pc2hlZCIsCmFjdGlvbjp0aGlzLGRpcmVjdGlvbjowPmE/LTE6MX0pfWVsc2V7LTE9PT1yJiYoMDw9YT8ocj0wLHRoaXMuX3NldEVuZGluZ3MoITAsMD09PXRoaXMucmVwZXRpdGlvbnMsdikpOnRoaXMuX3NldEVuZGluZ3MoMD09PXRoaXMucmVwZXRpdGlvbnMsITAsdikpO2lmKGM+PWV8fDA+Yyl7Zz1NYXRoLmZsb29yKGMvZSk7Yy09ZSpnO3IrPU1hdGguYWJzKGcpO3ZhciB6PXRoaXMucmVwZXRpdGlvbnMtcjswPj16Pyh0aGlzLmNsYW1wV2hlbkZpbmlzaGVkP3RoaXMucGF1c2VkPSEwOnRoaXMuZW5hYmxlZD0hMSx0aGlzLnRpbWU9Yz0wPGE/ZTowLHRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImZpbmlzaGVkIixhY3Rpb246dGhpcyxkaXJlY3Rpb246MDxhPzE6LTF9KSk6KDE9PT16PyhhPTA+YSx0aGlzLl9zZXRFbmRpbmdzKGEsIWEsdikpOnRoaXMuX3NldEVuZGluZ3MoITEsITEsdiksdGhpcy5fbG9vcENvdW50PXIsdGhpcy50aW1lPWMsdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCh7dHlwZToibG9vcCIsCmFjdGlvbjp0aGlzLGxvb3BEZWx0YTpnfSkpfWVsc2UgdGhpcy50aW1lPWM7aWYodiYmMT09PShyJjEpKXJldHVybiBlLWN9cmV0dXJuIGN9LF9zZXRFbmRpbmdzOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzO2U/KGcuZW5kaW5nU3RhcnQ9MjQwMSxnLmVuZGluZ0VuZD0yNDAxKTooZy5lbmRpbmdTdGFydD1hP3RoaXMuemVyb1Nsb3BlQXRTdGFydD8yNDAxOjI0MDA6MjQwMixnLmVuZGluZ0VuZD1jP3RoaXMuemVyb1Nsb3BlQXRFbmQ/MjQwMToyNDAwOjI0MDIpfSxfc2NoZWR1bGVGYWRpbmc6ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuX21peGVyLHI9Zy50aW1lLHY9dGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7bnVsbD09PXYmJih0aGlzLl93ZWlnaHRJbnRlcnBvbGFudD12PWcuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKSk7Zz12LnBhcmFtZXRlclBvc2l0aW9uczt2PXYuc2FtcGxlVmFsdWVzO2dbMF09cjt2WzBdPWM7Z1sxXT1yK2E7dlsxXT0KZTtyZXR1cm4gdGhpc319KTtxaS5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKGQucHJvdG90eXBlKSx7Y29uc3RydWN0b3I6cWksX2JpbmRBY3Rpb246ZnVuY3Rpb24oYSxjKXt2YXIgZT1hLl9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QsZz1hLl9jbGlwLnRyYWNrcyxyPWcubGVuZ3RoLHY9YS5fcHJvcGVydHlCaW5kaW5nczthPWEuX2ludGVycG9sYW50czt2YXIgej1lLnV1aWQsRT10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsRj1FW3pdO3ZvaWQgMD09PUYmJihGPXt9LEVbel09Rik7Zm9yKEU9MDtFIT09cjsrK0Upe3ZhciBKPWdbRV0sUD1KLm5hbWUsUj1GW1BdO2lmKHZvaWQgMD09PVIpe1I9dltFXTtpZih2b2lkIDAhPT1SKXtudWxsPT09Ui5fY2FjaGVJbmRleCYmKCsrUi5yZWZlcmVuY2VDb3VudCx0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoUix6LFApKTtjb250aW51ZX1SPW5ldyBwaSgkYi5jcmVhdGUoZSxQLGMmJmMuX3Byb3BlcnR5QmluZGluZ3NbRV0uYmluZGluZy5wYXJzZWRQYXRoKSwKSi5WYWx1ZVR5cGVOYW1lLEouZ2V0VmFsdWVTaXplKCkpOysrUi5yZWZlcmVuY2VDb3VudDt0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoUix6LFApfXZbRV09UjthW0VdLnJlc3VsdEJ1ZmZlcj1SLmJ1ZmZlcn19LF9hY3RpdmF0ZUFjdGlvbjpmdW5jdGlvbihhKXtpZighdGhpcy5faXNBY3RpdmVBY3Rpb24oYSkpe2lmKG51bGw9PT1hLl9jYWNoZUluZGV4KXt2YXIgYz0oYS5fbG9jYWxSb290fHx0aGlzLl9yb290KS51dWlkLGU9YS5fY2xpcC51dWlkLGc9dGhpcy5fYWN0aW9uc0J5Q2xpcFtlXTt0aGlzLl9iaW5kQWN0aW9uKGEsZyYmZy5rbm93bkFjdGlvbnNbMF0pO3RoaXMuX2FkZEluYWN0aXZlQWN0aW9uKGEsZSxjKX1jPWEuX3Byb3BlcnR5QmluZGluZ3M7ZT0wO2ZvcihnPWMubGVuZ3RoO2UhPT1nOysrZSl7dmFyIHI9Y1tlXTswPT09ci51c2VDb3VudCsrJiYodGhpcy5fbGVuZEJpbmRpbmcociksci5zYXZlT3JpZ2luYWxTdGF0ZSgpKX10aGlzLl9sZW5kQWN0aW9uKGEpfX0sCl9kZWFjdGl2YXRlQWN0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuX2lzQWN0aXZlQWN0aW9uKGEpKXtmb3IodmFyIGM9YS5fcHJvcGVydHlCaW5kaW5ncyxlPTAsZz1jLmxlbmd0aDtlIT09ZzsrK2Upe3ZhciByPWNbZV07MD09PS0tci51c2VDb3VudCYmKHIucmVzdG9yZU9yaWdpbmFsU3RhdGUoKSx0aGlzLl90YWtlQmFja0JpbmRpbmcocikpfXRoaXMuX3Rha2VCYWNrQWN0aW9uKGEpfX0sX2luaXRNZW1vcnlNYW5hZ2VyOmZ1bmN0aW9uKCl7dGhpcy5fYWN0aW9ucz1bXTt0aGlzLl9uQWN0aXZlQWN0aW9ucz0wO3RoaXMuX2FjdGlvbnNCeUNsaXA9e307dGhpcy5fYmluZGluZ3M9W107dGhpcy5fbkFjdGl2ZUJpbmRpbmdzPTA7dGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lPXt9O3RoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHM9W107dGhpcy5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM9MDt2YXIgYT10aGlzO3RoaXMuc3RhdHM9e2FjdGlvbnM6e2dldCB0b3RhbCgpe3JldHVybiBhLl9hY3Rpb25zLmxlbmd0aH0sCmdldCBpblVzZSgpe3JldHVybiBhLl9uQWN0aXZlQWN0aW9uc319LGJpbmRpbmdzOntnZXQgdG90YWwoKXtyZXR1cm4gYS5fYmluZGluZ3MubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gYS5fbkFjdGl2ZUJpbmRpbmdzfX0sY29udHJvbEludGVycG9sYW50czp7Z2V0IHRvdGFsKCl7cmV0dXJuIGEuX2NvbnRyb2xJbnRlcnBvbGFudHMubGVuZ3RofSxnZXQgaW5Vc2UoKXtyZXR1cm4gYS5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHN9fX19LF9pc0FjdGl2ZUFjdGlvbjpmdW5jdGlvbihhKXthPWEuX2NhY2hlSW5kZXg7cmV0dXJuIG51bGwhPT1hJiZhPHRoaXMuX25BY3RpdmVBY3Rpb25zfSxfYWRkSW5hY3RpdmVBY3Rpb246ZnVuY3Rpb24oYSxjLGUpe3ZhciBnPXRoaXMuX2FjdGlvbnMscj10aGlzLl9hY3Rpb25zQnlDbGlwLHY9cltjXTt2b2lkIDA9PT12Pyh2PXtrbm93bkFjdGlvbnM6W2FdLGFjdGlvbkJ5Um9vdDp7fX0sYS5fYnlDbGlwQ2FjaGVJbmRleD0wLHJbY109dik6KGM9CnYua25vd25BY3Rpb25zLGEuX2J5Q2xpcENhY2hlSW5kZXg9Yy5sZW5ndGgsYy5wdXNoKGEpKTthLl9jYWNoZUluZGV4PWcubGVuZ3RoO2cucHVzaChhKTt2LmFjdGlvbkJ5Um9vdFtlXT1hfSxfcmVtb3ZlSW5hY3RpdmVBY3Rpb246ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fYWN0aW9ucyxlPWNbYy5sZW5ndGgtMV0sZz1hLl9jYWNoZUluZGV4O2UuX2NhY2hlSW5kZXg9ZztjW2ddPWU7Yy5wb3AoKTthLl9jYWNoZUluZGV4PW51bGw7Yz1hLl9jbGlwLnV1aWQ7ZT10aGlzLl9hY3Rpb25zQnlDbGlwO2c9ZVtjXTt2YXIgcj1nLmtub3duQWN0aW9ucyx2PXJbci5sZW5ndGgtMV0sej1hLl9ieUNsaXBDYWNoZUluZGV4O3YuX2J5Q2xpcENhY2hlSW5kZXg9ejtyW3pdPXY7ci5wb3AoKTthLl9ieUNsaXBDYWNoZUluZGV4PW51bGw7ZGVsZXRlIGcuYWN0aW9uQnlSb290WyhhLl9sb2NhbFJvb3R8fHRoaXMuX3Jvb3QpLnV1aWRdOzA9PT1yLmxlbmd0aCYmZGVsZXRlIGVbY107dGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbihhKX0sCl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uOmZ1bmN0aW9uKGEpe2E9YS5fcHJvcGVydHlCaW5kaW5ncztmb3IodmFyIGM9MCxlPWEubGVuZ3RoO2MhPT1lOysrYyl7dmFyIGc9YVtjXTswPT09LS1nLnJlZmVyZW5jZUNvdW50JiZ0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmcoZyl9fSxfbGVuZEFjdGlvbjpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9hY3Rpb25zLGU9YS5fY2FjaGVJbmRleCxnPXRoaXMuX25BY3RpdmVBY3Rpb25zKysscj1jW2ddO2EuX2NhY2hlSW5kZXg9ZztjW2ddPWE7ci5fY2FjaGVJbmRleD1lO2NbZV09cn0sX3Rha2VCYWNrQWN0aW9uOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2FjdGlvbnMsZT1hLl9jYWNoZUluZGV4LGc9LS10aGlzLl9uQWN0aXZlQWN0aW9ucyxyPWNbZ107YS5fY2FjaGVJbmRleD1nO2NbZ109YTtyLl9jYWNoZUluZGV4PWU7Y1tlXT1yfSxfYWRkSW5hY3RpdmVCaW5kaW5nOmZ1bmN0aW9uKGEsYyxlKXt2YXIgZz10aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsCnI9Z1tjXSx2PXRoaXMuX2JpbmRpbmdzO3ZvaWQgMD09PXImJihyPXt9LGdbY109cik7cltlXT1hO2EuX2NhY2hlSW5kZXg9di5sZW5ndGg7di5wdXNoKGEpfSxfcmVtb3ZlSW5hY3RpdmVCaW5kaW5nOmZ1bmN0aW9uKGEpe3ZhciBjPXRoaXMuX2JpbmRpbmdzLGU9YS5iaW5kaW5nLGc9ZS5yb290Tm9kZS51dWlkO2U9ZS5wYXRoO3ZhciByPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSx2PXJbZ10sej1jW2MubGVuZ3RoLTFdO2E9YS5fY2FjaGVJbmRleDt6Ll9jYWNoZUluZGV4PWE7Y1thXT16O2MucG9wKCk7ZGVsZXRlIHZbZV07MD09PU9iamVjdC5rZXlzKHYpLmxlbmd0aCYmZGVsZXRlIHJbZ119LF9sZW5kQmluZGluZzpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9iaW5kaW5ncyxlPWEuX2NhY2hlSW5kZXgsZz10aGlzLl9uQWN0aXZlQmluZGluZ3MrKyxyPWNbZ107YS5fY2FjaGVJbmRleD1nO2NbZ109YTtyLl9jYWNoZUluZGV4PWU7Y1tlXT1yfSxfdGFrZUJhY2tCaW5kaW5nOmZ1bmN0aW9uKGEpe3ZhciBjPQp0aGlzLl9iaW5kaW5ncyxlPWEuX2NhY2hlSW5kZXgsZz0tLXRoaXMuX25BY3RpdmVCaW5kaW5ncyxyPWNbZ107YS5fY2FjaGVJbmRleD1nO2NbZ109YTtyLl9jYWNoZUluZGV4PWU7Y1tlXT1yfSxfbGVuZENvbnRyb2xJbnRlcnBvbGFudDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsYz10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cysrLGU9YVtjXTt2b2lkIDA9PT1lJiYoZT1uZXcgWWYobmV3IEZsb2F0MzJBcnJheSgyKSxuZXcgRmxvYXQzMkFycmF5KDIpLDEsdGhpcy5fY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlciksZS5fX2NhY2hlSW5kZXg9YyxhW2NdPWUpO3JldHVybiBlfSxfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQ6ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5fY29udHJvbEludGVycG9sYW50cyxlPWEuX19jYWNoZUluZGV4LGc9LS10aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyxyPWNbZ107YS5fX2NhY2hlSW5kZXg9Cmc7Y1tnXT1hO3IuX19jYWNoZUluZGV4PWU7Y1tlXT1yfSxfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlcjpuZXcgRmxvYXQzMkFycmF5KDEpLGNsaXBBY3Rpb246ZnVuY3Rpb24oYSxjKXt2YXIgZT1jfHx0aGlzLl9yb290LGc9ZS51dWlkO2U9InN0cmluZyI9PT10eXBlb2YgYT90Yy5maW5kQnlOYW1lKGUsYSk6YTthPW51bGwhPT1lP2UudXVpZDphO3ZhciByPXRoaXMuX2FjdGlvbnNCeUNsaXBbYV0sdj1udWxsO2lmKHZvaWQgMCE9PXIpe3Y9ci5hY3Rpb25CeVJvb3RbZ107aWYodm9pZCAwIT09dilyZXR1cm4gdjt2PXIua25vd25BY3Rpb25zWzBdO251bGw9PT1lJiYoZT12Ll9jbGlwKX1pZihudWxsPT09ZSlyZXR1cm4gbnVsbDtjPW5ldyBUaih0aGlzLGUsYyk7dGhpcy5fYmluZEFjdGlvbihjLHYpO3RoaXMuX2FkZEluYWN0aXZlQWN0aW9uKGMsYSxnKTtyZXR1cm4gY30sZXhpc3RpbmdBY3Rpb246ZnVuY3Rpb24oYSxjKXt2YXIgZT1jfHx0aGlzLl9yb290O2M9ZS51dWlkOwplPSJzdHJpbmciPT09dHlwZW9mIGE/dGMuZmluZEJ5TmFtZShlLGEpOmE7YT10aGlzLl9hY3Rpb25zQnlDbGlwW2U/ZS51dWlkOmFdO3JldHVybiB2b2lkIDAhPT1hP2EuYWN0aW9uQnlSb290W2NdfHxudWxsOm51bGx9LHN0b3BBbGxBY3Rpb246ZnVuY3Rpb24oKXtmb3IodmFyIGE9dGhpcy5fYWN0aW9ucyxjPXRoaXMuX25BY3RpdmVBY3Rpb25zLGU9dGhpcy5fYmluZGluZ3MsZz10aGlzLl9uQWN0aXZlQmluZGluZ3Mscj10aGlzLl9uQWN0aXZlQmluZGluZ3M9dGhpcy5fbkFjdGl2ZUFjdGlvbnM9MDtyIT09YzsrK3IpYVtyXS5yZXNldCgpO2ZvcihyPTA7ciE9PWc7KytyKWVbcl0udXNlQ291bnQ9MDtyZXR1cm4gdGhpc30sdXBkYXRlOmZ1bmN0aW9uKGEpe2EqPXRoaXMudGltZVNjYWxlO2Zvcih2YXIgYz10aGlzLl9hY3Rpb25zLGU9dGhpcy5fbkFjdGl2ZUFjdGlvbnMsZz10aGlzLnRpbWUrPWEscj1NYXRoLnNpZ24oYSksdj10aGlzLl9hY2N1SW5kZXhePTEsej0wO3ohPT1lOysreiljW3pdLl91cGRhdGUoZywKYSxyLHYpO2E9dGhpcy5fYmluZGluZ3M7Yz10aGlzLl9uQWN0aXZlQmluZGluZ3M7Zm9yKHo9MDt6IT09YzsrK3opYVt6XS5hcHBseSh2KTtyZXR1cm4gdGhpc30sZ2V0Um9vdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fSx1bmNhY2hlQ2xpcDpmdW5jdGlvbihhKXt2YXIgYz10aGlzLl9hY3Rpb25zO2E9YS51dWlkO3ZhciBlPXRoaXMuX2FjdGlvbnNCeUNsaXAsZz1lW2FdO2lmKHZvaWQgMCE9PWcpe2c9Zy5rbm93bkFjdGlvbnM7Zm9yKHZhciByPTAsdj1nLmxlbmd0aDtyIT09djsrK3Ipe3ZhciB6PWdbcl07dGhpcy5fZGVhY3RpdmF0ZUFjdGlvbih6KTt2YXIgRT16Ll9jYWNoZUluZGV4LEY9Y1tjLmxlbmd0aC0xXTt6Ll9jYWNoZUluZGV4PW51bGw7ei5fYnlDbGlwQ2FjaGVJbmRleD1udWxsO0YuX2NhY2hlSW5kZXg9RTtjW0VdPUY7Yy5wb3AoKTt0aGlzLl9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uKHopfWRlbGV0ZSBlW2FdfX0sdW5jYWNoZVJvb3Q6ZnVuY3Rpb24oYSl7YT0KYS51dWlkO3ZhciBjPXRoaXMuX2FjdGlvbnNCeUNsaXA7Zm9yKGcgaW4gYyl7dmFyIGU9Y1tnXS5hY3Rpb25CeVJvb3RbYV07dm9pZCAwIT09ZSYmKHRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oZSksdGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oZSkpfXZhciBnPXRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZVthXTtpZih2b2lkIDAhPT1nKWZvcih2YXIgciBpbiBnKWE9Z1tyXSxhLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCksdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKGEpfSx1bmNhY2hlQWN0aW9uOmZ1bmN0aW9uKGEsYyl7YT10aGlzLmV4aXN0aW5nQWN0aW9uKGEsYyk7bnVsbCE9PWEmJih0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKGEpLHRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKGEpKX19KTtiaC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGJoKHZvaWQgMD09PXRoaXMudmFsdWUuY2xvbmU/dGhpcy52YWx1ZTp0aGlzLnZhbHVlLmNsb25lKCkpfTtyaS5wcm90b3R5cGU9Ck9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShRZC5wcm90b3R5cGUpLHtjb25zdHJ1Y3RvcjpyaSxpc0luc3RhbmNlZEludGVybGVhdmVkQnVmZmVyOiEwLGNvcHk6ZnVuY3Rpb24oYSl7UWQucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMubWVzaFBlckF0dHJpYnV0ZT1hLm1lc2hQZXJBdHRyaWJ1dGU7cmV0dXJuIHRoaXN9fSk7T2JqZWN0LmFzc2lnbihVai5wcm90b3R5cGUse2xpbmVQcmVjaXNpb246MSxzZXQ6ZnVuY3Rpb24oYSxjKXt0aGlzLnJheS5zZXQoYSxjKX0sc2V0RnJvbUNhbWVyYTpmdW5jdGlvbihhLGMpe2MmJmMuaXNQZXJzcGVjdGl2ZUNhbWVyYT8odGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbihjLm1hdHJpeFdvcmxkKSx0aGlzLnJheS5kaXJlY3Rpb24uc2V0KGEueCxhLnksLjUpLnVucHJvamVjdChjKS5zdWIodGhpcy5yYXkub3JpZ2luKS5ub3JtYWxpemUoKSx0aGlzLmNhbWVyYT1jKTpjJiZjLmlzT3J0aG9ncmFwaGljQ2FtZXJhPwoodGhpcy5yYXkub3JpZ2luLnNldChhLngsYS55LChjLm5lYXIrYy5mYXIpLyhjLm5lYXItYy5mYXIpKS51bnByb2plY3QoYyksdGhpcy5yYXkuZGlyZWN0aW9uLnNldCgwLDAsLTEpLnRyYW5zZm9ybURpcmVjdGlvbihjLm1hdHJpeFdvcmxkKSx0aGlzLmNhbWVyYT1jKTpjb25zb2xlLmVycm9yKCJUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlLiIpfSxpbnRlcnNlY3RPYmplY3Q6ZnVuY3Rpb24oYSxjLGUpe2U9ZXx8W107c2koYSx0aGlzLGUsYyk7ZS5zb3J0KFZqKTtyZXR1cm4gZX0saW50ZXJzZWN0T2JqZWN0czpmdW5jdGlvbihhLGMsZSl7ZT1lfHxbXTtpZighMT09PUFycmF5LmlzQXJyYXkoYSkpcmV0dXJuIGNvbnNvbGUud2FybigiVEhSRUUuUmF5Y2FzdGVyLmludGVyc2VjdE9iamVjdHM6IG9iamVjdHMgaXMgbm90IGFuIEFycmF5LiIpLGU7Zm9yKHZhciBnPTAscj1hLmxlbmd0aDtnPHI7ZysrKXNpKGFbZ10sdGhpcyxlLGMpO2Uuc29ydChWaik7cmV0dXJuIGV9fSk7Ck9iamVjdC5hc3NpZ24oV2oucHJvdG90eXBlLHtzZXQ6ZnVuY3Rpb24oYSxjLGUpe3RoaXMucmFkaXVzPWE7dGhpcy5waGk9Yzt0aGlzLnRoZXRhPWU7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMucmFkaXVzPWEucmFkaXVzO3RoaXMucGhpPWEucGhpO3RoaXMudGhldGE9YS50aGV0YTtyZXR1cm4gdGhpc30sbWFrZVNhZmU6ZnVuY3Rpb24oKXt0aGlzLnBoaT1NYXRoLm1heCgxRS02LE1hdGgubWluKE1hdGguUEktMUUtNix0aGlzLnBoaSkpO3JldHVybiB0aGlzfSxzZXRGcm9tVmVjdG9yMzpmdW5jdGlvbihhKXtyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKGEueCxhLnksYS56KX0sc2V0RnJvbUNhcnRlc2lhbkNvb3JkczpmdW5jdGlvbihhLGMsZSl7dGhpcy5yYWRpdXM9TWF0aC5zcXJ0KGEqYStjKmMrZSplKTswPT09dGhpcy5yYWRpdXM/dGhpcy5waGk9CnRoaXMudGhldGE9MDoodGhpcy50aGV0YT1NYXRoLmF0YW4yKGEsZSksdGhpcy5waGk9TWF0aC5hY29zKGhiLmNsYW1wKGMvdGhpcy5yYWRpdXMsLTEsMSkpKTtyZXR1cm4gdGhpc319KTtPYmplY3QuYXNzaWduKFhqLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnJhZGl1cz1hO3RoaXMudGhldGE9Yzt0aGlzLnk9ZTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9LGNvcHk6ZnVuY3Rpb24oYSl7dGhpcy5yYWRpdXM9YS5yYWRpdXM7dGhpcy50aGV0YT1hLnRoZXRhO3RoaXMueT1hLnk7cmV0dXJuIHRoaXN9LHNldEZyb21WZWN0b3IzOmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLnNldEZyb21DYXJ0ZXNpYW5Db29yZHMoYS54LGEueSxhLnopfSxzZXRGcm9tQ2FydGVzaWFuQ29vcmRzOmZ1bmN0aW9uKGEsYyxlKXt0aGlzLnJhZGl1cz1NYXRoLnNxcnQoYSphK2UqZSk7dGhpcy50aGV0YT1NYXRoLmF0YW4yKGEsCmUpO3RoaXMueT1jO3JldHVybiB0aGlzfX0pO3ZhciB5az1uZXcgZjtPYmplY3QuYXNzaWduKHRpLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5taW4uY29weShhKTt0aGlzLm1heC5jb3B5KGMpO3JldHVybiB0aGlzfSxzZXRGcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe3RoaXMubWFrZUVtcHR5KCk7Zm9yKHZhciBjPTAsZT1hLmxlbmd0aDtjPGU7YysrKXRoaXMuZXhwYW5kQnlQb2ludChhW2NdKTtyZXR1cm4gdGhpc30sc2V0RnJvbUNlbnRlckFuZFNpemU6ZnVuY3Rpb24oYSxjKXtjPXlrLmNvcHkoYykubXVsdGlwbHlTY2FsYXIoLjUpO3RoaXMubWluLmNvcHkoYSkuc3ViKGMpO3RoaXMubWF4LmNvcHkoYSkuYWRkKGMpO3JldHVybiB0aGlzfSxjbG9uZTpmdW5jdGlvbigpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX0sY29weTpmdW5jdGlvbihhKXt0aGlzLm1pbi5jb3B5KGEubWluKTt0aGlzLm1heC5jb3B5KGEubWF4KTtyZXR1cm4gdGhpc30sCm1ha2VFbXB0eTpmdW5jdGlvbigpe3RoaXMubWluLng9dGhpcy5taW4ueT1JbmZpbml0eTt0aGlzLm1heC54PXRoaXMubWF4Lnk9LUluZmluaXR5O3JldHVybiB0aGlzfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fSxnZXRDZW50ZXI6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBmKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/YS5zZXQoMCwwKTphLmFkZFZlY3RvcnModGhpcy5taW4sdGhpcy5tYXgpLm11bHRpcGx5U2NhbGFyKC41KX0sZ2V0U2l6ZTpmdW5jdGlvbihhKXt2b2lkIDA9PT1hJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBmKTtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/YS5zZXQoMCwwKTphLnN1YlZlY3RvcnModGhpcy5tYXgsCnRoaXMubWluKX0sZXhwYW5kQnlQb2ludDpmdW5jdGlvbihhKXt0aGlzLm1pbi5taW4oYSk7dGhpcy5tYXgubWF4KGEpO3JldHVybiB0aGlzfSxleHBhbmRCeVZlY3RvcjpmdW5jdGlvbihhKXt0aGlzLm1pbi5zdWIoYSk7dGhpcy5tYXguYWRkKGEpO3JldHVybiB0aGlzfSxleHBhbmRCeVNjYWxhcjpmdW5jdGlvbihhKXt0aGlzLm1pbi5hZGRTY2FsYXIoLWEpO3RoaXMubWF4LmFkZFNjYWxhcihhKTtyZXR1cm4gdGhpc30sY29udGFpbnNQb2ludDpmdW5jdGlvbihhKXtyZXR1cm4gYS54PHRoaXMubWluLnh8fGEueD50aGlzLm1heC54fHxhLnk8dGhpcy5taW4ueXx8YS55PnRoaXMubWF4Lnk/ITE6ITB9LGNvbnRhaW5zQm94OmZ1bmN0aW9uKGEpe3JldHVybiB0aGlzLm1pbi54PD1hLm1pbi54JiZhLm1heC54PD10aGlzLm1heC54JiZ0aGlzLm1pbi55PD1hLm1pbi55JiZhLm1heC55PD10aGlzLm1heC55fSxnZXRQYXJhbWV0ZXI6ZnVuY3Rpb24oYSxjKXt2b2lkIDA9PT1jJiYoY29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuZ2V0UGFyYW1ldGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLApjPW5ldyBmKTtyZXR1cm4gYy5zZXQoKGEueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwoYS55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpKX0saW50ZXJzZWN0c0JveDpmdW5jdGlvbihhKXtyZXR1cm4gYS5tYXgueDx0aGlzLm1pbi54fHxhLm1pbi54PnRoaXMubWF4Lnh8fGEubWF4Lnk8dGhpcy5taW4ueXx8YS5taW4ueT50aGlzLm1heC55PyExOiEwfSxjbGFtcFBvaW50OmZ1bmN0aW9uKGEsYyl7dm9pZCAwPT09YyYmKGNvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmNsYW1wUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz1uZXcgZik7cmV0dXJuIGMuY29weShhKS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCl9LGRpc3RhbmNlVG9Qb2ludDpmdW5jdGlvbihhKXtyZXR1cm4geWsuY29weShhKS5jbGFtcCh0aGlzLm1pbix0aGlzLm1heCkuc3ViKGEpLmxlbmd0aCgpfSxpbnRlcnNlY3Q6ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWF4KGEubWluKTsKdGhpcy5tYXgubWluKGEubWF4KTtyZXR1cm4gdGhpc30sdW5pb246ZnVuY3Rpb24oYSl7dGhpcy5taW4ubWluKGEubWluKTt0aGlzLm1heC5tYXgoYS5tYXgpO3JldHVybiB0aGlzfSx0cmFuc2xhdGU6ZnVuY3Rpb24oYSl7dGhpcy5taW4uYWRkKGEpO3RoaXMubWF4LmFkZChhKTtyZXR1cm4gdGhpc30sZXF1YWxzOmZ1bmN0aW9uKGEpe3JldHVybiBhLm1pbi5lcXVhbHModGhpcy5taW4pJiZhLm1heC5lcXVhbHModGhpcy5tYXgpfX0pO3ZhciB6az1uZXcgayx6aD1uZXcgaztPYmplY3QuYXNzaWduKHVpLnByb3RvdHlwZSx7c2V0OmZ1bmN0aW9uKGEsYyl7dGhpcy5zdGFydC5jb3B5KGEpO3RoaXMuZW5kLmNvcHkoYyk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfSxjb3B5OmZ1bmN0aW9uKGEpe3RoaXMuc3RhcnQuY29weShhLnN0YXJ0KTt0aGlzLmVuZC5jb3B5KGEuZW5kKTtyZXR1cm4gdGhpc30sZ2V0Q2VudGVyOmZ1bmN0aW9uKGEpe3ZvaWQgMD09PQphJiYoY29uc29sZS53YXJuKCJUSFJFRS5MaW5lMzogLmdldENlbnRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gYS5hZGRWZWN0b3JzKHRoaXMuc3RhcnQsdGhpcy5lbmQpLm11bHRpcGx5U2NhbGFyKC41KX0sZGVsdGE6ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5kZWx0YSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQiKSxhPW5ldyBrKTtyZXR1cm4gYS5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpfSxkaXN0YW5jZVNxOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQodGhpcy5lbmQpfSxkaXN0YW5jZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0YXJ0LmRpc3RhbmNlVG8odGhpcy5lbmQpfSxhdDpmdW5jdGlvbihhLGMpe3ZvaWQgMD09PWMmJihjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuYXQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkIiksYz0KbmV3IGspO3JldHVybiB0aGlzLmRlbHRhKGMpLm11bHRpcGx5U2NhbGFyKGEpLmFkZCh0aGlzLnN0YXJ0KX0sY2xvc2VzdFBvaW50VG9Qb2ludFBhcmFtZXRlcjpmdW5jdGlvbihhLGMpe3prLnN1YlZlY3RvcnMoYSx0aGlzLnN0YXJ0KTt6aC5zdWJWZWN0b3JzKHRoaXMuZW5kLHRoaXMuc3RhcnQpO2E9emguZG90KHprKS96aC5kb3QoemgpO2MmJihhPWhiLmNsYW1wKGEsMCwxKSk7cmV0dXJuIGF9LGNsb3Nlc3RQb2ludFRvUG9pbnQ6ZnVuY3Rpb24oYSxjLGUpe2E9dGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKGEsYyk7dm9pZCAwPT09ZSYmKGNvbnNvbGUud2FybigiVEhSRUUuTGluZTM6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCIpLGU9bmV3IGspO3JldHVybiB0aGlzLmRlbHRhKGUpLm11bHRpcGx5U2NhbGFyKGEpLmFkZCh0aGlzLnN0YXJ0KX0sYXBwbHlNYXRyaXg0OmZ1bmN0aW9uKGEpe3RoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KGEpOwp0aGlzLmVuZC5hcHBseU1hdHJpeDQoYSk7cmV0dXJuIHRoaXN9LGVxdWFsczpmdW5jdGlvbihhKXtyZXR1cm4gYS5zdGFydC5lcXVhbHModGhpcy5zdGFydCkmJmEuZW5kLmVxdWFscyh0aGlzLmVuZCl9fSk7Y2cucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpO2NnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1jZztjZy5wcm90b3R5cGUuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3Q9ITA7dmFyIFpjPW5ldyBrLG9kPW5ldyBrLFJpPW5ldyB0LFdtPVsiYSIsImIiLCJjIl07ZGcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtkZy5wcm90b3R5cGUuY29uc3RydWN0b3I9ZGc7ZGcucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCEwKTtSaS5nZXROb3JtYWxNYXRyaXgodGhpcy5vYmplY3QubWF0cml4V29ybGQpO3ZhciBhPXRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkLGM9dGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uLAplPXRoaXMub2JqZWN0Lmdlb21ldHJ5O2lmKGUmJmUuaXNHZW9tZXRyeSlmb3IodmFyIGc9ZS52ZXJ0aWNlcyxyPWUuZmFjZXMsdj1lPTAsej1yLmxlbmd0aDt2PHo7disrKWZvcih2YXIgRT1yW3ZdLEY9MCxKPUUudmVydGV4Tm9ybWFscy5sZW5ndGg7RjxKO0YrKyl7dmFyIFA9RS52ZXJ0ZXhOb3JtYWxzW0ZdO1pjLmNvcHkoZ1tFW1dtW0ZdXV0pLmFwcGx5TWF0cml4NChhKTtvZC5jb3B5KFApLmFwcGx5TWF0cml4MyhSaSkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodGhpcy5zaXplKS5hZGQoWmMpO2Muc2V0WFlaKGUsWmMueCxaYy55LFpjLnopO2UrPTE7Yy5zZXRYWVooZSxvZC54LG9kLnksb2Queik7ZSs9MX1lbHNlIGlmKGUmJmUuaXNCdWZmZXJHZW9tZXRyeSlmb3IoZz1lLmF0dHJpYnV0ZXMucG9zaXRpb24scj1lLmF0dHJpYnV0ZXMubm9ybWFsLEY9ZT0wLEo9Zy5jb3VudDtGPEo7RisrKVpjLnNldChnLmdldFgoRiksZy5nZXRZKEYpLGcuZ2V0WihGKSkuYXBwbHlNYXRyaXg0KGEpLApvZC5zZXQoci5nZXRYKEYpLHIuZ2V0WShGKSxyLmdldFooRikpLG9kLmFwcGx5TWF0cml4MyhSaSkubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodGhpcy5zaXplKS5hZGQoWmMpLGMuc2V0WFlaKGUsWmMueCxaYy55LFpjLnopLGUrPTEsYy5zZXRYWVooZSxvZC54LG9kLnksb2QueiksZSs9MTtjLm5lZWRzVXBkYXRlPSEwfTt2YXIgQWs9bmV3IGs7WGUucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoQS5wcm90b3R5cGUpO1hlLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1YZTtYZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe3RoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKX07WGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3RoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTt2YXIgYT10aGlzLmxpZ2h0LmRpc3RhbmNlP3RoaXMubGlnaHQuZGlzdGFuY2U6MUUzLGM9YSpNYXRoLnRhbih0aGlzLmxpZ2h0LmFuZ2xlKTsKdGhpcy5jb25lLnNjYWxlLnNldChjLGMsYSk7QWsuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkKTt0aGlzLmNvbmUubG9va0F0KEFrKTt2b2lkIDAhPT10aGlzLmNvbG9yP3RoaXMuY29uZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik6dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcil9O3ZhciBJZD1uZXcgayxBaD1uZXcgcSxTaT1uZXcgcTtZZS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO1llLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1ZZTtZZS5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQ9ZnVuY3Rpb24oYSl7dmFyIGM9dGhpcy5ib25lcyxlPXRoaXMuZ2VvbWV0cnksZz1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKTtTaS5nZXRJbnZlcnNlKHRoaXMucm9vdC5tYXRyaXhXb3JsZCk7Zm9yKHZhciByPTAsdj0wO3I8Yy5sZW5ndGg7cisrKXt2YXIgej1jW3JdO3oucGFyZW50JiYKei5wYXJlbnQuaXNCb25lJiYoQWgubXVsdGlwbHlNYXRyaWNlcyhTaSx6Lm1hdHJpeFdvcmxkKSxJZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oQWgpLGcuc2V0WFlaKHYsSWQueCxJZC55LElkLnopLEFoLm11bHRpcGx5TWF0cmljZXMoU2ksei5wYXJlbnQubWF0cml4V29ybGQpLElkLnNldEZyb21NYXRyaXhQb3NpdGlvbihBaCksZy5zZXRYWVoodisxLElkLngsSWQueSxJZC56KSx2Kz0yKX1lLmdldEF0dHJpYnV0ZSgicG9zaXRpb24iKS5uZWVkc1VwZGF0ZT0hMDtBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSl9O1plLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7WmUucHJvdG90eXBlLmNvbnN0cnVjdG9yPVplO1plLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9O1plLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2b2lkIDAhPT10aGlzLmNvbG9yPwp0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKTp0aGlzLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcil9OyRlLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFZiLnByb3RvdHlwZSk7JGUucHJvdG90eXBlLmNvbnN0cnVjdG9yPSRlOyRlLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLnNjYWxlLnNldCguNSp0aGlzLmxpZ2h0LndpZHRoLC41KnRoaXMubGlnaHQuaGVpZ2h0LDEpO2lmKHZvaWQgMCE9PXRoaXMuY29sb3IpdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvciksdGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik7ZWxzZXt0aGlzLm1hdGVyaWFsLmNvbG9yLmNvcHkodGhpcy5saWdodC5jb2xvcikubXVsdGlwbHlTY2FsYXIodGhpcy5saWdodC5pbnRlbnNpdHkpO3ZhciBhPXRoaXMubWF0ZXJpYWwuY29sb3IsYz1NYXRoLm1heChhLnIsYS5nLGEuYik7MTxjJiZhLm11bHRpcGx5U2NhbGFyKDEvCmMpO3RoaXMuY2hpbGRyZW5bMF0ubWF0ZXJpYWwuY29sb3IuY29weSh0aGlzLm1hdGVyaWFsLmNvbG9yKX19OyRlLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7dGhpcy5jaGlsZHJlblswXS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCl9O3ZhciBYbT1uZXcgayxCaz1uZXcgSSxDaz1uZXcgSTthZi5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShBLnByb3RvdHlwZSk7YWYucHJvdG90eXBlLmNvbnN0cnVjdG9yPWFmO2FmLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5jaGlsZHJlblswXS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5kaXNwb3NlKCl9O2FmLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmNoaWxkcmVuWzBdO2lmKHZvaWQgMCE9PXRoaXMuY29sb3IpdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvcik7CmVsc2V7dmFyIGM9YS5nZW9tZXRyeS5nZXRBdHRyaWJ1dGUoImNvbG9yIik7QmsuY29weSh0aGlzLmxpZ2h0LmNvbG9yKTtDay5jb3B5KHRoaXMubGlnaHQuZ3JvdW5kQ29sb3IpO2Zvcih2YXIgZT0wLGc9Yy5jb3VudDtlPGc7ZSsrKXt2YXIgcj1lPGcvMj9CazpDaztjLnNldFhZWihlLHIucixyLmcsci5iKX1jLm5lZWRzVXBkYXRlPSEwfWEubG9va0F0KFhtLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKS5uZWdhdGUoKSl9O2JmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHhhLnByb3RvdHlwZSk7YmYucHJvdG90eXBlLmNvbnN0cnVjdG9yPWJmO2JmLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbC5kaXNwb3NlKCl9O2JmLnByb3RvdHlwZS5vbkJlZm9yZVJlbmRlcj1mdW5jdGlvbigpe3RoaXMucG9zaXRpb24uY29weSh0aGlzLmxpZ2h0UHJvYmUucG9zaXRpb24pO3RoaXMuc2NhbGUuc2V0KDEsCjEsMSkubXVsdGlwbHlTY2FsYXIodGhpcy5zaXplKTt0aGlzLm1hdGVyaWFsLnVuaWZvcm1zLmludGVuc2l0eS52YWx1ZT10aGlzLmxpZ2h0UHJvYmUuaW50ZW5zaXR5fTtjaC5wcm90b3R5cGU9T2JqZWN0LmFzc2lnbihPYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSkse2NvbnN0cnVjdG9yOmNoLGNvcHk6ZnVuY3Rpb24oYSl7SWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMuZ2VvbWV0cnkuY29weShhLmdlb21ldHJ5KTt0aGlzLm1hdGVyaWFsLmNvcHkoYS5tYXRlcmlhbCk7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX0pO2RoLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSk7ZGgucHJvdG90eXBlLmNvbnN0cnVjdG9yPWRoO2NmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFZiLnByb3RvdHlwZSk7Y2YucHJvdG90eXBlLmNvbnN0cnVjdG9yPWNmO2NmLnByb3RvdHlwZS51cGRhdGU9CmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShXLGhhLGZhLHJhKXtmYT0oaGEtVykvZmE7Vi5zZXRYWVooRiwwLDAsMCk7SisrO2ZvcihQPVc7UDxoYTtQKz1mYSlSPUYrSixWLnNldFhZWihSLE1hdGguc2luKFApKmUsMCxNYXRoLmNvcyhQKSplKSxWLnNldFhZWihSKzEsTWF0aC5zaW4oTWF0aC5taW4oUCtmYSxoYSkpKmUsMCxNYXRoLmNvcyhNYXRoLm1pbihQK2ZhLGhhKSkqZSksVi5zZXRYWVooUisyLDAsMCwwKSxKKz0zO1MuYWRkR3JvdXAoRixKLHJhKTtGKz1KO0o9MH12YXIgYz10aGlzLmF1ZGlvLGU9dGhpcy5yYW5nZSxnPXRoaXMuZGl2aXNpb25zSW5uZXJBbmdsZSxyPXRoaXMuZGl2aXNpb25zT3V0ZXJBbmdsZSx2PWhiLmRlZ1RvUmFkKGMucGFubmVyLmNvbmVJbm5lckFuZ2xlKTtjPWhiLmRlZ1RvUmFkKGMucGFubmVyLmNvbmVPdXRlckFuZ2xlKTt2YXIgej12LzIsRT1jLzIsRj0wLEo9MCxQLFIsUz10aGlzLmdlb21ldHJ5LFY9Uy5hdHRyaWJ1dGVzLnBvc2l0aW9uO1MuY2xlYXJHcm91cHMoKTsKYSgtRSwteixyLDApO2EoLXoseixnLDEpO2EoeixFLHIsMCk7Vi5uZWVkc1VwZGF0ZT0hMDt2PT09YyYmKHRoaXMubWF0ZXJpYWxbMF0udmlzaWJsZT0hMSl9O2NmLnByb3RvdHlwZS5kaXNwb3NlPWZ1bmN0aW9uKCl7dGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbFswXS5kaXNwb3NlKCk7dGhpcy5tYXRlcmlhbFsxXS5kaXNwb3NlKCl9O3ZhciBxZz1uZXcgayxCaD1uZXcgayxEaz1uZXcgdDtlZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2VnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1lZztlZy5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5vYmplY3QudXBkYXRlTWF0cml4V29ybGQoITApO0RrLmdldE5vcm1hbE1hdHJpeCh0aGlzLm9iamVjdC5tYXRyaXhXb3JsZCk7dmFyIGE9dGhpcy5vYmplY3QubWF0cml4V29ybGQsYz10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm9iamVjdC5nZW9tZXRyeSxnPQplLnZlcnRpY2VzO2U9ZS5mYWNlcztmb3IodmFyIHI9MCx2PTAsej1lLmxlbmd0aDt2PHo7disrKXt2YXIgRT1lW3ZdLEY9RS5ub3JtYWw7cWcuY29weShnW0UuYV0pLmFkZChnW0UuYl0pLmFkZChnW0UuY10pLmRpdmlkZVNjYWxhcigzKS5hcHBseU1hdHJpeDQoYSk7QmguY29weShGKS5hcHBseU1hdHJpeDMoRGspLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKHRoaXMuc2l6ZSkuYWRkKHFnKTtjLnNldFhZWihyLHFnLngscWcueSxxZy56KTtyKz0xO2Muc2V0WFlaKHIsQmgueCxCaC55LEJoLnopO3IrPTF9Yy5uZWVkc1VwZGF0ZT0hMH07dmFyIEVrPW5ldyBrLENoPW5ldyBrLEZrPW5ldyBrO2RmLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKTtkZi5wcm90b3R5cGUuY29uc3RydWN0b3I9ZGY7ZGYucHJvdG90eXBlLmRpc3Bvc2U9ZnVuY3Rpb24oKXt0aGlzLmxpZ2h0UGxhbmUuZ2VvbWV0cnkuZGlzcG9zZSgpO3RoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5kaXNwb3NlKCk7CnRoaXMudGFyZ2V0TGluZS5nZW9tZXRyeS5kaXNwb3NlKCk7dGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmRpc3Bvc2UoKX07ZGYucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe0VrLnNldEZyb21NYXRyaXhQb3NpdGlvbih0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkKTtDaC5zZXRGcm9tTWF0cml4UG9zaXRpb24odGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQpO0ZrLnN1YlZlY3RvcnMoQ2gsRWspO3RoaXMubGlnaHRQbGFuZS5sb29rQXQoQ2gpO3ZvaWQgMCE9PXRoaXMuY29sb3I/KHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5zZXQodGhpcy5jb2xvciksdGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLnNldCh0aGlzLmNvbG9yKSk6KHRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpLHRoaXMudGFyZ2V0TGluZS5tYXRlcmlhbC5jb2xvci5jb3B5KHRoaXMubGlnaHQuY29sb3IpKTt0aGlzLnRhcmdldExpbmUubG9va0F0KENoKTsKdGhpcy50YXJnZXRMaW5lLnNjYWxlLno9RmsubGVuZ3RoKCl9O3ZhciBlaD1uZXcgayxPYj1uZXcgemI7ZmcucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSWIucHJvdG90eXBlKTtmZy5wcm90b3R5cGUuY29uc3RydWN0b3I9Zmc7ZmcucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2VvbWV0cnksYz10aGlzLnBvaW50TWFwO09iLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5jYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UpO1BiKCJjIixjLGEsT2IsMCwwLC0xKTtQYigidCIsYyxhLE9iLDAsMCwxKTtQYigibjEiLGMsYSxPYiwtMSwtMSwtMSk7UGIoIm4yIixjLGEsT2IsMSwtMSwtMSk7UGIoIm4zIixjLGEsT2IsLTEsMSwtMSk7UGIoIm40IixjLGEsT2IsMSwxLC0xKTtQYigiZjEiLGMsYSxPYiwtMSwtMSwxKTtQYigiZjIiLGMsYSxPYiwxLC0xLDEpO1BiKCJmMyIsYyxhLE9iLC0xLDEsMSk7UGIoImY0IixjLGEsT2IsMSwxLDEpO1BiKCJ1MSIsCmMsYSxPYiwuNywxLjEsLTEpO1BiKCJ1MiIsYyxhLE9iLC0uNywxLjEsLTEpO1BiKCJ1MyIsYyxhLE9iLDAsMiwtMSk7UGIoImNmMSIsYyxhLE9iLC0xLDAsMSk7UGIoImNmMiIsYyxhLE9iLDEsMCwxKTtQYigiY2YzIixjLGEsT2IsMCwtMSwxKTtQYigiY2Y0IixjLGEsT2IsMCwxLDEpO1BiKCJjbjEiLGMsYSxPYiwtMSwwLC0xKTtQYigiY24yIixjLGEsT2IsMSwwLC0xKTtQYigiY24zIixjLGEsT2IsMCwtMSwtMSk7UGIoImNuNCIsYyxhLE9iLDAsMSwtMSk7YS5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIikubmVlZHNVcGRhdGU9ITB9O3ZhciBEaD1uZXcgdztoZC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2hkLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1oZDtoZC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGEpe3ZvaWQgMCE9PWEmJmNvbnNvbGUud2FybigiVEhSRUUuQm94SGVscGVyOiAudXBkYXRlKCkgaGFzIG5vIGxvbmdlciBhcmd1bWVudHMuIik7dm9pZCAwIT09CnRoaXMub2JqZWN0JiZEaC5zZXRGcm9tT2JqZWN0KHRoaXMub2JqZWN0KTtpZighRGguaXNFbXB0eSgpKXthPURoLm1pbjt2YXIgYz1EaC5tYXgsZT10aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb24sZz1lLmFycmF5O2dbMF09Yy54O2dbMV09Yy55O2dbMl09Yy56O2dbM109YS54O2dbNF09Yy55O2dbNV09Yy56O2dbNl09YS54O2dbN109YS55O2dbOF09Yy56O2dbOV09Yy54O2dbMTBdPWEueTtnWzExXT1jLno7Z1sxMl09Yy54O2dbMTNdPWMueTtnWzE0XT1hLno7Z1sxNV09YS54O2dbMTZdPWMueTtnWzE3XT1hLno7Z1sxOF09YS54O2dbMTldPWEueTtnWzIwXT1hLno7Z1syMV09Yy54O2dbMjJdPWEueTtnWzIzXT1hLno7ZS5uZWVkc1VwZGF0ZT0hMDt0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpfX07aGQucHJvdG90eXBlLnNldEZyb21PYmplY3Q9ZnVuY3Rpb24oYSl7dGhpcy5vYmplY3Q9YTt0aGlzLnVwZGF0ZSgpO3JldHVybiB0aGlzfTtoZC5wcm90b3R5cGUuY29weT0KZnVuY3Rpb24oYSl7SWIucHJvdG90eXBlLmNvcHkuY2FsbCh0aGlzLGEpO3RoaXMub2JqZWN0PWEub2JqZWN0O3JldHVybiB0aGlzfTtoZC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9O2dnLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEliLnByb3RvdHlwZSk7Z2cucHJvdG90eXBlLmNvbnN0cnVjdG9yPWdnO2dnLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZD1mdW5jdGlvbihhKXt2YXIgYz10aGlzLmJveDtjLmlzRW1wdHkoKXx8KGMuZ2V0Q2VudGVyKHRoaXMucG9zaXRpb24pLGMuZ2V0U2l6ZSh0aGlzLnNjYWxlKSx0aGlzLnNjYWxlLm11bHRpcGx5U2NhbGFyKC41KSxBLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKHRoaXMsYSkpfTtoZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShWYi5wcm90b3R5cGUpO2hnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1oZztoZy5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQ9CmZ1bmN0aW9uKGEpe3ZhciBjPS10aGlzLnBsYW5lLmNvbnN0YW50OzFFLTg+TWF0aC5hYnMoYykmJihjPTFFLTgpO3RoaXMuc2NhbGUuc2V0KC41KnRoaXMuc2l6ZSwuNSp0aGlzLnNpemUsYyk7dGhpcy5jaGlsZHJlblswXS5tYXRlcmlhbC5zaWRlPTA+Yz8xOjA7dGhpcy5sb29rQXQodGhpcy5wbGFuZS5ub3JtYWwpO0EucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwodGhpcyxhKX07dmFyIEdrPW5ldyBrLGZoLHZpO2lkLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKEEucHJvdG90eXBlKTtpZC5wcm90b3R5cGUuY29uc3RydWN0b3I9aWQ7aWQucHJvdG90eXBlLnNldERpcmVjdGlvbj1mdW5jdGlvbihhKXsuOTk5OTk8YS55P3RoaXMucXVhdGVybmlvbi5zZXQoMCwwLDAsMSk6LS45OTk5OT5hLnk/dGhpcy5xdWF0ZXJuaW9uLnNldCgxLDAsMCwwKTooR2suc2V0KGEueiwwLC1hLngpLm5vcm1hbGl6ZSgpLHRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKEdrLE1hdGguYWNvcyhhLnkpKSl9OwppZC5wcm90b3R5cGUuc2V0TGVuZ3RoPWZ1bmN0aW9uKGEsYyxlKXt2b2lkIDA9PT1jJiYoYz0uMiphKTt2b2lkIDA9PT1lJiYoZT0uMipjKTt0aGlzLmxpbmUuc2NhbGUuc2V0KDEsTWF0aC5tYXgoMCxhLWMpLDEpO3RoaXMubGluZS51cGRhdGVNYXRyaXgoKTt0aGlzLmNvbmUuc2NhbGUuc2V0KGUsYyxlKTt0aGlzLmNvbmUucG9zaXRpb24ueT1hO3RoaXMuY29uZS51cGRhdGVNYXRyaXgoKX07aWQucHJvdG90eXBlLnNldENvbG9yPWZ1bmN0aW9uKGEpe3RoaXMubGluZS5tYXRlcmlhbC5jb2xvci5zZXQoYSk7dGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldChhKX07aWQucHJvdG90eXBlLmNvcHk9ZnVuY3Rpb24oYSl7QS5wcm90b3R5cGUuY29weS5jYWxsKHRoaXMsYSwhMSk7dGhpcy5saW5lLmNvcHkoYS5saW5lKTt0aGlzLmNvbmUuY29weShhLmNvbmUpO3JldHVybiB0aGlzfTtpZC5wcm90b3R5cGUuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9OwppZy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShJYi5wcm90b3R5cGUpO2lnLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1pZztaYS5jcmVhdGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLmxvZygiVEhSRUUuQ3VydmUuY3JlYXRlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCIpO2EucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmEucHJvdG90eXBlKTthLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1hO2EucHJvdG90eXBlLmdldFBvaW50PWM7cmV0dXJuIGF9O09iamVjdC5hc3NpZ24oZ2QucHJvdG90eXBlLHtjcmVhdGVQb2ludHNHZW9tZXRyeTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZVBvaW50c0dlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuIik7YT10aGlzLmdldFBvaW50cyhhKTtyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeShhKX0sY3JlYXRlU3BhY2VkUG9pbnRzR2VvbWV0cnk6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVTcGFjZWRQb2ludHNHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLiIpOwphPXRoaXMuZ2V0U3BhY2VkUG9pbnRzKGEpO3JldHVybiB0aGlzLmNyZWF0ZUdlb21ldHJ5KGEpfSxjcmVhdGVHZW9tZXRyeTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuIik7Zm9yKHZhciBjPW5ldyB5YSxlPTAsZz1hLmxlbmd0aDtlPGc7ZSsrKXt2YXIgcj1hW2VdO2MudmVydGljZXMucHVzaChuZXcgayhyLngsci55LHIuenx8MCkpfXJldHVybiBjfX0pO09iamVjdC5hc3NpZ24oR2MucHJvdG90eXBlLHtmcm9tUG9pbnRzOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUGF0aDogLmZyb21Qb2ludHMoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tUG9pbnRzKCkuIik7dGhpcy5zZXRGcm9tUG9pbnRzKGEpfX0pO1pqLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFpiLnByb3RvdHlwZSk7CmFrLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKFpiLnByb3RvdHlwZSk7d2kucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoWmIucHJvdG90eXBlKTtPYmplY3QuYXNzaWduKHdpLnByb3RvdHlwZSx7aW5pdEZyb21BcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNwbGluZTogLmluaXRGcm9tQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxnZXRDb250cm9sUG9pbnRzQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TcGxpbmU6IC5nZXRDb250cm9sUG9pbnRzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxyZXBhcmFtZXRyaXplQnlBcmNMZW5ndGg6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TcGxpbmU6IC5yZXBhcmFtZXRyaXplQnlBcmNMZW5ndGgoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO2NoLnByb3RvdHlwZS5zZXRDb2xvcnM9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5HcmlkSGVscGVyOiBzZXRDb2xvcnMoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCBwYXNzIHRoZW0gaW4gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQuIil9OwpZZS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2tlbGV0b25IZWxwZXI6IHVwZGF0ZSgpIG5vIGxvbmdlciBuZWVkcyB0byBiZSBjYWxsZWQuIil9O09iamVjdC5hc3NpZ24oRGIucHJvdG90eXBlLHtleHRyYWN0VXJsQmFzZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxvYWRlcjogLmV4dHJhY3RVcmxCYXNlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkxvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCkgaW5zdGVhZC4iKTtyZXR1cm4gUGkuZXh0cmFjdFVybEJhc2UoYSl9fSk7T2JqZWN0LmFzc2lnbihaZy5wcm90b3R5cGUse3NldFRleHR1cmVQYXRoOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0TG9hZGVyOiAuc2V0VGV4dHVyZVBhdGgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRSZXNvdXJjZVBhdGgoKS4iKTtyZXR1cm4gdGhpcy5zZXRSZXNvdXJjZVBhdGgoYSl9fSk7T2JqZWN0LmFzc2lnbih0aS5wcm90b3R5cGUsCntjZW50ZXI6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuIik7cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKGEpfSxlbXB0eTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQm94MjogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLiIpO3JldHVybiB0aGlzLmlzRW1wdHkoKX0saXNJbnRlcnNlY3Rpb25Cb3g6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gyOiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveChhKX0sc2l6ZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDI6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLiIpO3JldHVybiB0aGlzLmdldFNpemUoYSl9fSk7T2JqZWN0LmFzc2lnbih3LnByb3RvdHlwZSwKe2NlbnRlcjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4iKTtyZXR1cm4gdGhpcy5nZXRDZW50ZXIoYSl9LGVtcHR5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3gzOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuIik7cmV0dXJuIHRoaXMuaXNFbXB0eSgpfSxpc0ludGVyc2VjdGlvbkJveDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KGEpfSxpc0ludGVyc2VjdGlvblNwaGVyZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4iKTtyZXR1cm4gdGhpcy5pbnRlcnNlY3RzU3BoZXJlKGEpfSwKc2l6ZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJveDM6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLiIpO3JldHVybiB0aGlzLmdldFNpemUoYSl9fSk7dWkucHJvdG90eXBlLmNlbnRlcj1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpbmUzOiAuY2VudGVyKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0Q2VudGVyKCkuIik7cmV0dXJuIHRoaXMuZ2V0Q2VudGVyKGEpfTtPYmplY3QuYXNzaWduKGhiLHtyYW5kb20xNjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0aDogLnJhbmRvbTE2KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIE1hdGgucmFuZG9tKCkgaW5zdGVhZC4iKTtyZXR1cm4gTWF0aC5yYW5kb20oKX0sbmVhcmVzdFBvd2VyT2ZUd286ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRoOiAubmVhcmVzdFBvd2VyT2ZUd28oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mbG9vclBvd2VyT2ZUd28oKS4iKTsKcmV0dXJuIGhiLmZsb29yUG93ZXJPZlR3byhhKX0sbmV4dFBvd2VyT2ZUd286ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRoOiAubmV4dFBvd2VyT2ZUd28oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jZWlsUG93ZXJPZlR3bygpLiIpO3JldHVybiBoYi5jZWlsUG93ZXJPZlR3byhhKX19KTtPYmplY3QuYXNzaWduKHQucHJvdG90eXBlLHtmbGF0dGVuVG9BcnJheU9mZnNldDpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4MzogLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy50b0FycmF5KGEsYyl9LG11bHRpcGx5VmVjdG9yMzpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4MyggbWF0cml4ICkgaW5zdGVhZC4iKTtyZXR1cm4gYS5hcHBseU1hdHJpeDModGhpcyl9LAptdWx0aXBseVZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGFwcGx5VG9CdWZmZXI6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXgzOiAuYXBwbHlUb0J1ZmZlcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy5hcHBseVRvQnVmZmVyQXR0cmlidXRlKGEpfSxhcHBseVRvVmVjdG9yM0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO09iamVjdC5hc3NpZ24ocS5wcm90b3R5cGUse2V4dHJhY3RQb3NpdGlvbjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5leHRyYWN0UG9zaXRpb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jb3B5UG9zaXRpb24oKS4iKTsKcmV0dXJuIHRoaXMuY29weVBvc2l0aW9uKGEpfSxmbGF0dGVuVG9BcnJheU9mZnNldDpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy50b0FycmF5KGEsYyl9LGdldFBvc2l0aW9uOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuZ2V0UG9zaXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuKG5ldyBrKS5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMyl9LHNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb246ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAuc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKCkuIik7CnJldHVybiB0aGlzLm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKGEpfSxtdWx0aXBseVRvQXJyYXk6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVRvQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxtdWx0aXBseVZlY3RvcjM6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KHRoaXMpfSxtdWx0aXBseVZlY3RvcjQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubXVsdGlwbHlWZWN0b3I0KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KHRoaXMpfSxtdWx0aXBseVZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LApyb3RhdGVBeGlzOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLnJvdGF0ZUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy50cmFuc2Zvcm1EaXJlY3Rpb24oIG1hdHJpeCApIGluc3RlYWQuIik7YS50cmFuc2Zvcm1EaXJlY3Rpb24odGhpcyl9LGNyb3NzVmVjdG9yOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmNyb3NzVmVjdG9yKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHZlY3Rvci5hcHBseU1hdHJpeDQoIG1hdHJpeCApIGluc3RlYWQuIik7cmV0dXJuIGEuYXBwbHlNYXRyaXg0KHRoaXMpfSx0cmFuc2xhdGU6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0scm90YXRlWDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVYKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0scm90YXRlWTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVZKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sCnJvdGF0ZVo6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5NYXRyaXg0OiAucm90YXRlWigpIGhhcyBiZWVuIHJlbW92ZWQuIil9LHJvdGF0ZUJ5QXhpczpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5yb3RhdGVCeUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhcHBseVRvQnVmZmVyOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLmFwcGx5VG9CdWZmZXIoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZShhKX0sYXBwbHlUb1ZlY3RvcjNBcnJheTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sbWFrZUZydXN0dW06ZnVuY3Rpb24oYSxjLGUsZyxyLHYpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0cml4NDogLm1ha2VGcnVzdHVtKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkgaW5zdGVhZC4iKTsKcmV0dXJuIHRoaXMubWFrZVBlcnNwZWN0aXZlKGEsYyxnLGUscix2KX19KTtIYi5wcm90b3R5cGUuaXNJbnRlcnNlY3Rpb25MaW5lPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUGxhbmU6IC5pc0ludGVyc2VjdGlvbkxpbmUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzTGluZSgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNMaW5lKGEpfTtoLnByb3RvdHlwZS5tdWx0aXBseVZlY3RvcjM9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGlzIG5vdyB2ZWN0b3IuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICkgaW5zdGVhZC4iKTtyZXR1cm4gYS5hcHBseVF1YXRlcm5pb24odGhpcyl9O09iamVjdC5hc3NpZ24oRC5wcm90b3R5cGUse2lzSW50ZXJzZWN0aW9uQm94OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuIik7CnJldHVybiB0aGlzLmludGVyc2VjdHNCb3goYSl9LGlzSW50ZXJzZWN0aW9uUGxhbmU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5SYXk6IC5pc0ludGVyc2VjdGlvblBsYW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1BsYW5lKCkuIik7cmV0dXJuIHRoaXMuaW50ZXJzZWN0c1BsYW5lKGEpfSxpc0ludGVyc2VjdGlvblNwaGVyZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLiIpO3JldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoYSl9fSk7T2JqZWN0LmFzc2lnbihCLnByb3RvdHlwZSx7YXJlYTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5hcmVhKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QXJlYSgpLiIpO3JldHVybiB0aGlzLmdldEFyZWEoKX0sYmFyeWNvb3JkRnJvbVBvaW50OmZ1bmN0aW9uKGEsCmMpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5iYXJ5Y29vcmRGcm9tUG9pbnQoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRCYXJ5Y29vcmQoKS4iKTtyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQoYSxjKX0sbWlkcG9pbnQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLm1pZHBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0TWlkcG9pbnQoKS4iKTtyZXR1cm4gdGhpcy5nZXRNaWRwb2ludChhKX0sbm9ybWFsOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4iKTtyZXR1cm4gdGhpcy5nZXROb3JtYWwoYSl9LHBsYW5lOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVHJpYW5nbGU6IC5wbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFBsYW5lKCkuIik7cmV0dXJuIHRoaXMuZ2V0UGxhbmUoYSl9fSk7T2JqZWN0LmFzc2lnbihCLAp7YmFyeWNvb3JkRnJvbVBvaW50OmZ1bmN0aW9uKGEsYyxlLGcscil7Y29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLmJhcnljb29yZEZyb21Qb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEJhcnljb29yZCgpLiIpO3JldHVybiBCLmdldEJhcnljb29yZChhLGMsZSxnLHIpfSxub3JtYWw6ZnVuY3Rpb24oYSxjLGUsZyl7Y29uc29sZS53YXJuKCJUSFJFRS5UcmlhbmdsZTogLm5vcm1hbCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE5vcm1hbCgpLiIpO3JldHVybiBCLmdldE5vcm1hbChhLGMsZSxnKX19KTtPYmplY3QuYXNzaWduKENkLnByb3RvdHlwZSx7ZXh0cmFjdEFsbFBvaW50czpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAuZXh0cmFjdEFsbFBvaW50cygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuZXh0cmFjdFBvaW50cygpIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuZXh0cmFjdFBvaW50cyhhKX0sZXh0cnVkZTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAuZXh0cnVkZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFeHRydWRlR2VvbWV0cnkoKSBpbnN0ZWFkLiIpOwpyZXR1cm4gbmV3IFVkKHRoaXMsYSl9LG1ha2VHZW9tZXRyeTpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlNoYXBlOiAubWFrZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFNoYXBlR2VvbWV0cnkoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgVmQodGhpcyxhKX19KTtPYmplY3QuYXNzaWduKGYucHJvdG90eXBlLHtmcm9tQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjI6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpO3JldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxjLGUpfSxkaXN0YW5jZVRvTWFuaGF0dGFuOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmRpc3RhbmNlVG9NYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5EaXN0YW5jZVRvKCkuIik7cmV0dXJuIHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyhhKX0sCmxlbmd0aE1hbmhhdHRhbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpfX0pO09iamVjdC5hc3NpZ24oay5wcm90b3R5cGUse3NldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLnNldEV1bGVyRnJvbVJvdGF0aW9uTWF0cml4KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV1bGVyLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGluc3RlYWQuIil9LHNldEV1bGVyRnJvbVF1YXRlcm5pb246ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUXVhdGVybmlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFdWxlci5zZXRGcm9tUXVhdGVybmlvbigpIGluc3RlYWQuIil9LGdldFBvc2l0aW9uRnJvbU1hdHJpeDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5nZXRQb3NpdGlvbkZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4UG9zaXRpb24oKS4iKTsKcmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKGEpfSxnZXRTY2FsZUZyb21NYXRyaXg6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0U2NhbGVGcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFNjYWxlKCkuIik7cmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeFNjYWxlKGEpfSxnZXRDb2x1bW5Gcm9tTWF0cml4OmZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZ2V0Q29sdW1uRnJvbU1hdHJpeCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21NYXRyaXhDb2x1bW4oKS4iKTtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKGMsYSl9LGFwcGx5UHJvamVjdGlvbjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hcHBseVByb2plY3Rpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmFwcGx5TWF0cml4NCggbSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KGEpfSwKZnJvbUF0dHJpYnV0ZTpmdW5jdGlvbihhLGMsZSl7Y29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IzOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4iKTtyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKGEsYyxlKX0sZGlzdGFuY2VUb01hbmhhdHRhbjpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oYSl9LGxlbmd0aE1hbmhhdHRhbjpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLiIpO3JldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpfX0pO09iamVjdC5hc3NpZ24ocC5wcm90b3R5cGUsCntmcm9tQXR0cmlidXRlOmZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5mcm9tQXR0cmlidXRlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpO3JldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoYSxjLGUpfSxsZW5ndGhNYW5oYXR0YW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjQ6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4iKTtyZXR1cm4gdGhpcy5tYW5oYXR0YW5MZW5ndGgoKX19KTtPYmplY3QuYXNzaWduKHlhLnByb3RvdHlwZSx7Y29tcHV0ZVRhbmdlbnRzOmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxjb21wdXRlTGluZURpc3RhbmNlczpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTGluZS5jb21wdXRlTGluZURpc3RhbmNlcygpIGluc3RlYWQuIil9fSk7Ck9iamVjdC5hc3NpZ24oQS5wcm90b3R5cGUse2dldENoaWxkQnlOYW1lOmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5nZXRDaGlsZEJ5TmFtZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE9iamVjdEJ5TmFtZSgpLiIpO3JldHVybiB0aGlzLmdldE9iamVjdEJ5TmFtZShhKX0scmVuZGVyRGVwdGg6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk9iamVjdDNEOiAucmVuZGVyRGVwdGggaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5yZW5kZXJPcmRlciwgaW5zdGVhZC4iKX0sdHJhbnNsYXRlOmZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAudHJhbnNsYXRlT25BeGlzKCBheGlzLCBkaXN0YW5jZSApIGluc3RlYWQuIik7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKGMsYSl9LGdldFdvcmxkUm90YXRpb246ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUm90YXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuT2JqZWN0M0QuZ2V0V29ybGRRdWF0ZXJuaW9uKCB0YXJnZXQgKSBpbnN0ZWFkLiIpfX0pOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyhBLnByb3RvdHlwZSx7ZXVsZXJPcmRlcjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLmV1bGVyT3JkZXIgaXMgbm93IC5yb3RhdGlvbi5vcmRlci4iKTtyZXR1cm4gdGhpcy5yb3RhdGlvbi5vcmRlcn0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuT2JqZWN0M0Q6IC5ldWxlck9yZGVyIGlzIG5vdyAucm90YXRpb24ub3JkZXIuIik7dGhpcy5yb3RhdGlvbi5vcmRlcj1hfX0sdXNlUXVhdGVybmlvbjp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5PYmplY3QzRDogLnVzZVF1YXRlcm5pb24gaGFzIGJlZW4gcmVtb3ZlZC4gVGhlIGxpYnJhcnkgbm93IHVzZXMgcXVhdGVybmlvbnMgYnkgZGVmYXVsdC4iKX19fSk7Ck9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEFmLnByb3RvdHlwZSx7b2JqZWN0czp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MT0Q6IC5vYmplY3RzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmxldmVscy4iKTtyZXR1cm4gdGhpcy5sZXZlbHN9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShDZy5wcm90b3R5cGUsInVzZVZlcnRleFRleHR1cmUiLHtnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlNrZWxldG9uOiB1c2VWZXJ0ZXhUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuU2tlbGV0b246IHVzZVZlcnRleFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtCZi5wcm90b3R5cGUuaW5pdEJvbmVzPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuU2tpbm5lZE1lc2g6IGluaXRCb25lcygpIGhhcyBiZWVuIHJlbW92ZWQuIil9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShaYS5wcm90b3R5cGUsCiJfX2FyY0xlbmd0aERpdmlzaW9ucyIse2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQ3VydmU6IC5fX2FyY0xlbmd0aERpdmlzaW9ucyBpcyBub3cgLmFyY0xlbmd0aERpdmlzaW9ucy4iKTtyZXR1cm4gdGhpcy5hcmNMZW5ndGhEaXZpc2lvbnN9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuIik7dGhpcy5hcmNMZW5ndGhEaXZpc2lvbnM9YX19KTt2Yi5wcm90b3R5cGUuc2V0TGVucz1mdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuUGVyc3BlY3RpdmVDYW1lcmEuc2V0TGVucyBpcyBkZXByZWNhdGVkLiBVc2UgLnNldEZvY2FsTGVuZ3RoIGFuZCAuZmlsbUdhdWdlIGZvciBhIHBob3RvZ3JhcGhpYyBzZXR1cC4iKTt2b2lkIDAhPT1jJiYodGhpcy5maWxtR2F1Z2U9Yyk7dGhpcy5zZXRGb2NhbExlbmd0aChhKX07T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoSmIucHJvdG90eXBlLAp7b25seVNoYWRvdzp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLm9ubHlTaGFkb3cgaGFzIGJlZW4gcmVtb3ZlZC4iKX19LHNoYWRvd0NhbWVyYUZvdjp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGb3YgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZvdi4iKTt0aGlzLnNoYWRvdy5jYW1lcmEuZm92PWF9fSxzaGFkb3dDYW1lcmFMZWZ0OntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUxlZnQgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmxlZnQuIik7dGhpcy5zaGFkb3cuY2FtZXJhLmxlZnQ9YX19LHNoYWRvd0NhbWVyYVJpZ2h0OntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVJpZ2h0IGlzIG5vdyAuc2hhZG93LmNhbWVyYS5yaWdodC4iKTt0aGlzLnNoYWRvdy5jYW1lcmEucmlnaHQ9YX19LHNoYWRvd0NhbWVyYVRvcDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFUb3AgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnRvcC4iKTsKdGhpcy5zaGFkb3cuY2FtZXJhLnRvcD1hfX0sc2hhZG93Q2FtZXJhQm90dG9tOntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUJvdHRvbSBpcyBub3cgLnNoYWRvdy5jYW1lcmEuYm90dG9tLiIpO3RoaXMuc2hhZG93LmNhbWVyYS5ib3R0b209YX19LHNoYWRvd0NhbWVyYU5lYXI6e3NldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTmVhciBpcyBub3cgLnNoYWRvdy5jYW1lcmEubmVhci4iKTt0aGlzLnNoYWRvdy5jYW1lcmEubmVhcj1hfX0sc2hhZG93Q2FtZXJhRmFyOntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZhciBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZmFyLiIpO3RoaXMuc2hhZG93LmNhbWVyYS5mYXI9YX19LHNoYWRvd0NhbWVyYVZpc2libGU6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFWaXNpYmxlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuQ2FtZXJhSGVscGVyKCBsaWdodC5zaGFkb3cuY2FtZXJhICkgaW5zdGVhZC4iKX19LApzaGFkb3dCaWFzOntzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0JpYXMgaXMgbm93IC5zaGFkb3cuYmlhcy4iKTt0aGlzLnNoYWRvdy5iaWFzPWF9fSxzaGFkb3dEYXJrbmVzczp7c2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5MaWdodDogLnNoYWRvd0RhcmtuZXNzIGhhcyBiZWVuIHJlbW92ZWQuIil9fSxzaGFkb3dNYXBXaWR0aDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBXaWR0aCBpcyBub3cgLnNoYWRvdy5tYXBTaXplLndpZHRoLiIpO3RoaXMuc2hhZG93Lm1hcFNpemUud2lkdGg9YX19LHNoYWRvd01hcEhlaWdodDp7c2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTGlnaHQ6IC5zaGFkb3dNYXBIZWlnaHQgaXMgbm93IC5zaGFkb3cubWFwU2l6ZS5oZWlnaHQuIik7dGhpcy5zaGFkb3cubWFwU2l6ZS5oZWlnaHQ9YX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoUS5wcm90b3R5cGUsCntsZW5ndGg6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAubGVuZ3RoIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuY291bnQgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy5hcnJheS5sZW5ndGh9fSxjb3B5SW5kaWNlc0FycmF5OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyQXR0cmlidXRlOiAuY29weUluZGljZXNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9fSk7T2JqZWN0LmFzc2lnbih2YS5wcm90b3R5cGUse2FkZEluZGV4OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRJbmRleCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEluZGV4KCkuIik7dGhpcy5zZXRJbmRleChhKX0sYWRkRHJhd0NhbGw6ZnVuY3Rpb24oYSxjLGUpe3ZvaWQgMCE9PWUmJmNvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIG5vIGxvbmdlciBzdXBwb3J0cyBpbmRleE9mZnNldC4iKTsKY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmFkZERyYXdDYWxsKCkgaXMgbm93IC5hZGRHcm91cCgpLiIpO3RoaXMuYWRkR3JvdXAoYSxjKX0sY2xlYXJEcmF3Q2FsbHM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY2xlYXJEcmF3Q2FsbHMoKSBpcyBub3cgLmNsZWFyR3JvdXBzKCkuIik7dGhpcy5jbGVhckdyb3VwcygpfSxjb21wdXRlVGFuZ2VudHM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sY29tcHV0ZU9mZnNldHM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZU9mZnNldHMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHZhLnByb3RvdHlwZSx7ZHJhd2NhbGxzOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5CdWZmZXJHZW9tZXRyeTogLmRyYXdjYWxscyBoYXMgYmVlbiByZW5hbWVkIHRvIC5ncm91cHMuIik7CnJldHVybiB0aGlzLmdyb3Vwc319LG9mZnNldHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5vZmZzZXRzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdyb3Vwcy4iKTtyZXR1cm4gdGhpcy5ncm91cHN9fX0pO09iamVjdC5hc3NpZ24oUmMucHJvdG90eXBlLHtnZXRBcnJheXM6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5nZXRBcnJheXMoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhZGRTaGFwZUxpc3Q6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5FeHRydWRlQnVmZmVyR2VvbWV0cnk6IC5hZGRTaGFwZUxpc3QoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxhZGRTaGFwZTpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmFkZFNoYXBlKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhiaC5wcm90b3R5cGUsCntkeW5hbWljOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLlVuaWZvcm06IC5keW5hbWljIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBvYmplY3Qub25CZWZvcmVSZW5kZXIoKSBpbnN0ZWFkLiIpfX0sb25VcGRhdGU6e3ZhbHVlOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5Vbmlmb3JtOiAub25VcGRhdGUoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpc319fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTS5wcm90b3R5cGUse3dyYXBBcm91bmQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuIil9LHNldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuIil9fSxvdmVyZHJhdzp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NYXRlcmlhbDogLm92ZXJkcmF3IGhhcyBiZWVuIHJlbW92ZWQuIil9LApzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLk1hdGVyaWFsOiAub3ZlcmRyYXcgaGFzIGJlZW4gcmVtb3ZlZC4iKX19LHdyYXBSR0I6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6IC53cmFwUkdCIGhhcyBiZWVuIHJlbW92ZWQuIik7cmV0dXJuIG5ldyBJfX0sc2hhZGluZzp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuIit0aGlzLnR5cGUrIjogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLiIpfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS4iK3RoaXMudHlwZSsiOiAuc2hhZGluZyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdGhlIGJvb2xlYW4gLmZsYXRTaGFkaW5nIGluc3RlYWQuIik7dGhpcy5mbGF0U2hhZGluZz0xPT09YX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMoQmMucHJvdG90eXBlLHttZXRhbDp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkLiIpOwpyZXR1cm4hMX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkIil9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHFiLnByb3RvdHlwZSx7ZGVyaXZhdGl2ZXM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS4gU2hhZGVyTWF0ZXJpYWw6IC5kZXJpdmF0aXZlcyBoYXMgYmVlbiBtb3ZlZCB0byAuZXh0ZW5zaW9ucy5kZXJpdmF0aXZlcy4iKTt0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXM9YX19fSk7T2JqZWN0LmFzc2lnbihPaC5wcm90b3R5cGUsCntjbGVhclRhcmdldDpmdW5jdGlvbihhLGMsZSxnKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5jbGVhclRhcmdldCgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2V0UmVuZGVyVGFyZ2V0KCkgYW5kIC5jbGVhcigpIGluc3RlYWQuIik7dGhpcy5zZXRSZW5kZXJUYXJnZXQoYSk7dGhpcy5jbGVhcihjLGUsZyl9LGFuaW1hdGU6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYW5pbWF0ZSgpIGlzIG5vdyAuc2V0QW5pbWF0aW9uTG9vcCgpLiIpO3RoaXMuc2V0QW5pbWF0aW9uTG9vcChhKX0sZ2V0Q3VycmVudFJlbmRlclRhcmdldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRSZW5kZXJUYXJnZXQoKSBpcyBub3cgLmdldFJlbmRlclRhcmdldCgpLiIpO3JldHVybiB0aGlzLmdldFJlbmRlclRhcmdldCgpfSxnZXRNYXhBbmlzb3Ryb3B5OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0TWF4QW5pc290cm9weSgpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKS4iKTsKcmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLmdldE1heEFuaXNvdHJvcHkoKX0sZ2V0UHJlY2lzaW9uOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0UHJlY2lzaW9uKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMucHJlY2lzaW9uLiIpO3JldHVybiB0aGlzLmNhcGFiaWxpdGllcy5wcmVjaXNpb259LHJlc2V0R0xTdGF0ZTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnJlc2V0R0xTdGF0ZSgpIGlzIG5vdyAuc3RhdGUucmVzZXQoKS4iKTtyZXR1cm4gdGhpcy5zdGF0ZS5yZXNldCgpfSxzdXBwb3J0c0Zsb2F0VGV4dHVyZXM6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0Zsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU190ZXh0dXJlX2Zsb2F0Iil9LApzdXBwb3J0c0hhbGZGbG9hdFRleHR1cmVzOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyApLiIpO3JldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCJPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0Iil9LHN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlczpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoICdPRVNfc3RhbmRhcmRfZGVyaXZhdGl2ZXMnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIk9FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyIpfSxzdXBwb3J0c0NvbXByZXNzZWRUZXh0dXJlUzNUQzpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApLiIpOwpyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMiKX0sc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKS4iKTtyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCgiV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjIil9LHN1cHBvcnRzQmxlbmRNaW5NYXg6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0JsZW5kTWluTWF4KCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ0VYVF9ibGVuZF9taW5tYXgnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIkVYVF9ibGVuZF9taW5tYXgiKX0sc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlczpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzVmVydGV4VGV4dHVyZXMoKSBpcyBub3cgLmNhcGFiaWxpdGllcy52ZXJ0ZXhUZXh0dXJlcy4iKTsKcmV0dXJuIHRoaXMuY2FwYWJpbGl0aWVzLnZlcnRleFRleHR1cmVzfSxzdXBwb3J0c0luc3RhbmNlZEFycmF5czpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSW5zdGFuY2VkQXJyYXlzKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICkuIik7cmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoIkFOR0xFX2luc3RhbmNlZF9hcnJheXMiKX0sZW5hYmxlU2Npc3NvclRlc3Q6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZW5hYmxlU2Npc3NvclRlc3QoKSBpcyBub3cgLnNldFNjaXNzb3JUZXN0KCkuIik7dGhpcy5zZXRTY2lzc29yVGVzdChhKX0saW5pdE1hdGVyaWFsOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuaW5pdE1hdGVyaWFsKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sYWRkUHJlUGx1Z2luOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUHJlUGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sCmFkZFBvc3RQbHVnaW46ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQb3N0UGx1Z2luKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sdXBkYXRlU2hhZG93TWFwOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAudXBkYXRlU2hhZG93TWFwKCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sc2V0RmFjZUN1bGxpbmc6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRGYWNlQ3VsbGluZygpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGFsbG9jVGV4dHVyZVVuaXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5hbGxvY1RleHR1cmVVbml0KCkgaGFzIGJlZW4gcmVtb3ZlZC4iKX0sc2V0VGV4dHVyZTpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNldFRleHR1cmUoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSxzZXRUZXh0dXJlMkQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlMkQoKSBoYXMgYmVlbiByZW1vdmVkLiIpfSwKc2V0VGV4dHVyZUN1YmU6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlQ3ViZSgpIGhhcyBiZWVuIHJlbW92ZWQuIil9LGdldEFjdGl2ZU1pcE1hcExldmVsOmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0QWN0aXZlTWlwTWFwTGV2ZWwoKSBpcyBub3cgLmdldEFjdGl2ZU1pcG1hcExldmVsKCkuIik7cmV0dXJuIHRoaXMuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhPaC5wcm90b3R5cGUse3NoYWRvd01hcEVuYWJsZWQ6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC5lbmFibGVkfSxzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwRW5hYmxlZCBpcyBub3cgLnNoYWRvd01hcC5lbmFibGVkLiIpO3RoaXMuc2hhZG93TWFwLmVuYWJsZWQ9YX19LHNoYWRvd01hcFR5cGU6e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnNoYWRvd01hcC50eXBlfSwKc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcFR5cGUgaXMgbm93IC5zaGFkb3dNYXAudHlwZS4iKTt0aGlzLnNoYWRvd01hcC50eXBlPWF9fSxzaGFkb3dNYXBDdWxsRmFjZTp7Z2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwQ3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX19LGNvbnRleHQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLmNvbnRleHQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5nZXRDb250ZXh0KCkgaW5zdGVhZC4iKTtyZXR1cm4gdGhpcy5nZXRDb250ZXh0KCl9fX0pOwpPYmplY3QuZGVmaW5lUHJvcGVydGllcyh2ai5wcm90b3R5cGUse2N1bGxGYWNlOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAuY3VsbEZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLmN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fSxyZW5kZXJSZXZlcnNlU2lkZWQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJSZXZlcnNlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLiIpfX0sCnJlbmRlclNpbmdsZVNpZGVkOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyU2luZ2xlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4iKX0sc2V0OmZ1bmN0aW9uKCl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclNpbmdsZVNpZGVkIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuIil9fX0pO09iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKE5iLnByb3RvdHlwZSx7YWN0aXZlQ3ViZUZhY2U6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXRDdWJlOiAuYWN0aXZlQ3ViZUZhY2UgaGFzIGJlZW4gcmVtb3ZlZC4gSXQgaXMgbm93IHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIFdlYkdMUmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCkuIil9fSwKYWN0aXZlTWlwTWFwTGV2ZWw6e3NldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXRDdWJlOiAuYWN0aXZlTWlwTWFwTGV2ZWwgaGFzIGJlZW4gcmVtb3ZlZC4gSXQgaXMgbm93IHRoZSB0aGlyZCBwYXJhbWV0ZXIgb2YgV2ViR0xSZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoKS4iKX19fSk7T2JqZWN0LmRlZmluZVByb3BlcnRpZXMobS5wcm90b3R5cGUse3dyYXBTOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLiIpO3JldHVybiB0aGlzLnRleHR1cmUud3JhcFN9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLiIpO3RoaXMudGV4dHVyZS53cmFwUz1hfX0sd3JhcFQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuIik7CnJldHVybiB0aGlzLnRleHR1cmUud3JhcFR9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFQgaXMgbm93IC50ZXh0dXJlLndyYXBULiIpO3RoaXMudGV4dHVyZS53cmFwVD1hfX0sbWFnRmlsdGVyOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5tYWdGaWx0ZXJ9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuIik7dGhpcy50ZXh0dXJlLm1hZ0ZpbHRlcj1hfX0sbWluRmlsdGVyOntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWluRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5taW5GaWx0ZXIuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5taW5GaWx0ZXJ9LApzZXQ6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1pbkZpbHRlciBpcyBub3cgLnRleHR1cmUubWluRmlsdGVyLiIpO3RoaXMudGV4dHVyZS5taW5GaWx0ZXI9YX19LGFuaXNvdHJvcHk6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LiIpO3JldHVybiB0aGlzLnRleHR1cmUuYW5pc290cm9weX0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LiIpO3RoaXMudGV4dHVyZS5hbmlzb3Ryb3B5PWF9fSxvZmZzZXQ6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLm9mZnNldH0sCnNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAub2Zmc2V0IGlzIG5vdyAudGV4dHVyZS5vZmZzZXQuIik7dGhpcy50ZXh0dXJlLm9mZnNldD1hfX0scmVwZWF0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5yZXBlYXR9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuIik7dGhpcy50ZXh0dXJlLnJlcGVhdD1hfX0sZm9ybWF0OntnZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuIik7cmV0dXJuIHRoaXMudGV4dHVyZS5mb3JtYXR9LHNldDpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuIik7CnRoaXMudGV4dHVyZS5mb3JtYXQ9YX19LHR5cGU6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLiIpO3JldHVybiB0aGlzLnRleHR1cmUudHlwZX0sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLiIpO3RoaXMudGV4dHVyZS50eXBlPWF9fSxnZW5lcmF0ZU1pcG1hcHM6e2dldDpmdW5jdGlvbigpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4iKTtyZXR1cm4gdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwc30sc2V0OmZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4iKTsKdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz1hfX19KTtPYmplY3QuZGVmaW5lUHJvcGVydGllcyhOaC5wcm90b3R5cGUse3N0YW5kaW5nOntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYlZSTWFuYWdlcjogLnN0YW5kaW5nIGhhcyBiZWVuIHJlbW92ZWQuIil9fSx1c2VySGVpZ2h0OntzZXQ6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLldlYlZSTWFuYWdlcjogLnVzZXJIZWlnaHQgaGFzIGJlZW4gcmVtb3ZlZC4iKX19fSk7V2UucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5BdWRpbzogLmxvYWQgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkF1ZGlvTG9hZGVyIGluc3RlYWQuIik7dmFyIGM9dGhpczsobmV3ICRnKS5sb2FkKGEsZnVuY3Rpb24oZSl7Yy5zZXRCdWZmZXIoZSl9KTtyZXR1cm4gdGhpc307b2kucHJvdG90eXBlLmdldERhdGE9ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4oIlRIUkVFLkF1ZGlvQW5hbHlzZXI6IC5nZXREYXRhKCkgaXMgbm93IC5nZXRGcmVxdWVuY3lEYXRhKCkuIik7CnJldHVybiB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKX07R2IucHJvdG90eXBlLnVwZGF0ZUN1YmVNYXA9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkN1YmVDYW1lcmE6IC51cGRhdGVDdWJlTWFwKCkgaXMgbm93IC51cGRhdGUoKS4iKTtyZXR1cm4gdGhpcy51cGRhdGUoYSxjKX07RGQuY3Jvc3NPcmlnaW49dm9pZCAwO0RkLmxvYWRUZXh0dXJlPWZ1bmN0aW9uKGEsYyxlLGcpe2NvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5sb2FkVGV4dHVyZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuVGV4dHVyZUxvYWRlcigpIGluc3RlYWQuIik7dmFyIHI9bmV3IE1nO3Iuc2V0Q3Jvc3NPcmlnaW4odGhpcy5jcm9zc09yaWdpbik7YT1yLmxvYWQoYSxlLHZvaWQgMCxnKTtjJiYoYS5tYXBwaW5nPWMpO3JldHVybiBhfTtEZC5sb2FkVGV4dHVyZUN1YmU9ZnVuY3Rpb24oYSxjLGUsZyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ3ViZVRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLiIpOwp2YXIgcj1uZXcgTGc7ci5zZXRDcm9zc09yaWdpbih0aGlzLmNyb3NzT3JpZ2luKTthPXIubG9hZChhLGUsdm9pZCAwLGcpO2MmJihhLm1hcHBpbmc9Yyk7cmV0dXJuIGF9O0RkLmxvYWRDb21wcmVzc2VkVGV4dHVyZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5ERFNMb2FkZXIgaW5zdGVhZC4iKX07RGQubG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZT1mdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuIil9O2IuQUNFU0ZpbG1pY1RvbmVNYXBwaW5nPTU7Yi5BZGRFcXVhdGlvbj0xMDA7Yi5BZGRPcGVyYXRpb249MjtiLkFkZGl0aXZlQmxlbmRpbmc9MjtiLkFscGhhRm9ybWF0PTEwMjE7Yi5BbHdheXNEZXB0aD0KMTtiLkFsd2F5c1N0ZW5jaWxGdW5jPTUxOTtiLkFtYmllbnRMaWdodD1UZztiLkFtYmllbnRMaWdodFByb2JlPWppO2IuQW5pbWF0aW9uQ2xpcD10YztiLkFuaW1hdGlvbkxvYWRlcj1haTtiLkFuaW1hdGlvbk1peGVyPXFpO2IuQW5pbWF0aW9uT2JqZWN0R3JvdXA9U2o7Yi5BbmltYXRpb25VdGlscz1UYjtiLkFyY0N1cnZlPVZlO2IuQXJyYXlDYW1lcmE9dmY7Yi5BcnJvd0hlbHBlcj1pZDtiLkF1ZGlvPVdlO2IuQXVkaW9BbmFseXNlcj1vaTtiLkF1ZGlvQ29udGV4dD1taTtiLkF1ZGlvTGlzdGVuZXI9bGk7Yi5BdWRpb0xvYWRlcj0kZztiLkF4ZXNIZWxwZXI9aWc7Yi5BeGlzSGVscGVyPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuQXhpc0hlbHBlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkF4ZXNIZWxwZXIuIik7cmV0dXJuIG5ldyBpZyhhKX07Yi5CYWNrU2lkZT0xO2IuQmFzaWNEZXB0aFBhY2tpbmc9MzIwMDtiLkJhc2ljU2hhZG93TWFwPTA7Yi5CaW5hcnlUZXh0dXJlTG9hZGVyPQpmdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLkJpbmFyeVRleHR1cmVMb2FkZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5EYXRhVGV4dHVyZUxvYWRlci4iKTtyZXR1cm4gbmV3IEtnKGEpfTtiLkJvbmU9VWg7Yi5Cb29sZWFuS2V5ZnJhbWVUcmFjaz1HZztiLkJvdW5kaW5nQm94SGVscGVyPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5Cb3VuZGluZ0JveEhlbHBlciBoYXMgYmVlbiBkZXByZWNhdGVkLiBDcmVhdGluZyBhIFRIUkVFLkJveEhlbHBlciBpbnN0ZWFkLiIpO3JldHVybiBuZXcgaGQoYSxjKX07Yi5Cb3gyPXRpO2IuQm94Mz13O2IuQm94M0hlbHBlcj1nZztiLkJveEJ1ZmZlckdlb21ldHJ5PVhhO2IuQm94R2VvbWV0cnk9U2E7Yi5Cb3hIZWxwZXI9aGQ7Yi5CdWZmZXJBdHRyaWJ1dGU9UTtiLkJ1ZmZlckdlb21ldHJ5PXZhO2IuQnVmZmVyR2VvbWV0cnlMb2FkZXI9WWc7Yi5CeXRlVHlwZT0xMDEwO2IuQ2FjaGU9aWU7Yi5DYW1lcmE9emI7Yi5DYW1lcmFIZWxwZXI9CmZnO2IuQ2FudmFzUmVuZGVyZXI9ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5DYW52YXNSZW5kZXJlciBoYXMgYmVlbiByZW1vdmVkIil9O2IuQ2FudmFzVGV4dHVyZT1DZjtiLkNhdG11bGxSb21DdXJ2ZTM9WmI7Yi5DaW5lb25Ub25lTWFwcGluZz00O2IuQ2lyY2xlQnVmZmVyR2VvbWV0cnk9UWU7Yi5DaXJjbGVHZW9tZXRyeT1YZjtiLkNsYW1wVG9FZGdlV3JhcHBpbmc9MTAwMTtiLkNsb2NrPWtpO2IuQ2xvc2VkU3BsaW5lQ3VydmUzPVpqO2IuQ29sb3I9STtiLkNvbG9yS2V5ZnJhbWVUcmFjaz1IZztiLkNvbXByZXNzZWRUZXh0dXJlPURlO2IuQ29tcHJlc3NlZFRleHR1cmVMb2FkZXI9Ymk7Yi5Db25lQnVmZmVyR2VvbWV0cnk9V2Y7Yi5Db25lR2VvbWV0cnk9VmY7Yi5DdWJlQ2FtZXJhPUdiO2IuQ3ViZUdlb21ldHJ5PVNhO2IuQ3ViZVJlZmxlY3Rpb25NYXBwaW5nPTMwMTtiLkN1YmVSZWZyYWN0aW9uTWFwcGluZz0zMDI7Yi5DdWJlVGV4dHVyZT1jZDtiLkN1YmVUZXh0dXJlTG9hZGVyPQpMZztiLkN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nPTMwNjtiLkN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nPTMwNztiLkN1YmljQmV6aWVyQ3VydmU9Q2M7Yi5DdWJpY0JlemllckN1cnZlMz1UYztiLkN1YmljSW50ZXJwb2xhbnQ9RWc7Yi5DdWxsRmFjZUJhY2s9MTtiLkN1bGxGYWNlRnJvbnQ9MjtiLkN1bGxGYWNlRnJvbnRCYWNrPTM7Yi5DdWxsRmFjZU5vbmU9MDtiLkN1cnZlPVphO2IuQ3VydmVQYXRoPWdkO2IuQ3VzdG9tQmxlbmRpbmc9NTtiLkN5bGluZGVyQnVmZmVyR2VvbWV0cnk9ZmQ7Yi5DeWxpbmRlckdlb21ldHJ5PVhkO2IuQ3lsaW5kcmljYWw9WGo7Yi5EYXRhVGV4dHVyZT1BYjtiLkRhdGFUZXh0dXJlMkRBcnJheT1yZTtiLkRhdGFUZXh0dXJlM0Q9c2U7Yi5EYXRhVGV4dHVyZUxvYWRlcj1LZztiLkRlY3JlbWVudFN0ZW5jaWxPcD03NjgzO2IuRGVjcmVtZW50V3JhcFN0ZW5jaWxPcD0zNDA1NjtiLkRlZmF1bHRMb2FkaW5nTWFuYWdlcj1PajtiLkRlcHRoRm9ybWF0PTEwMjY7CmIuRGVwdGhTdGVuY2lsRm9ybWF0PTEwMjc7Yi5EZXB0aFRleHR1cmU9RGY7Yi5EaXJlY3Rpb25hbExpZ2h0PVNnO2IuRGlyZWN0aW9uYWxMaWdodEhlbHBlcj1kZjtiLkRpcmVjdGlvbmFsTGlnaHRTaGFkb3c9Umc7Yi5EaXNjcmV0ZUludGVycG9sYW50PUZnO2IuRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnk9SWU7Yi5Eb2RlY2FoZWRyb25HZW9tZXRyeT1KZjtiLkRvdWJsZVNpZGU9MjtiLkRzdEFscGhhRmFjdG9yPTIwNjtiLkRzdENvbG9yRmFjdG9yPTIwODtiLkR5bmFtaWNCdWZmZXJBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkR5bmFtaWNCdWZmZXJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoKS5zZXREeW5hbWljKCB0cnVlICkgaW5zdGVhZC4iKTtyZXR1cm4obmV3IFEoYSxjKSkuc2V0RHluYW1pYyghMCl9O2IuRWRnZXNHZW9tZXRyeT1QZTtiLkVkZ2VzSGVscGVyPWZ1bmN0aW9uKGEsCmMpe2NvbnNvbGUud2FybigiVEhSRUUuRWRnZXNIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkVkZ2VzR2VvbWV0cnkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IEliKG5ldyBQZShhLmdlb21ldHJ5KSxuZXcgRmIoe2NvbG9yOnZvaWQgMCE9PWM/YzoxNjc3NzIxNX0pKX07Yi5FbGxpcHNlQ3VydmU9cGM7Yi5FcXVhbERlcHRoPTQ7Yi5FcXVhbFN0ZW5jaWxGdW5jPTUxNDtiLkVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nPTMwMztiLkVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nPTMwNDtiLkV1bGVyPXU7Yi5FdmVudERpc3BhdGNoZXI9ZDtiLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeT1SYztiLkV4dHJ1ZGVHZW9tZXRyeT1VZDtiLkZhY2UzPUs7Yi5GYWNlND1mdW5jdGlvbihhLGMsZSxnLHIsdix6KXtjb25zb2xlLndhcm4oIlRIUkVFLkZhY2U0IGhhcyBiZWVuIHJlbW92ZWQuIEEgVEhSRUUuRmFjZTMgd2lsbCBiZSBjcmVhdGVkIGluc3RlYWQuIik7cmV0dXJuIG5ldyBLKGEsCmMsZSxyLHYseil9O2IuRmFjZUNvbG9ycz0xO2IuRmFjZU5vcm1hbHNIZWxwZXI9ZWc7Yi5GaWxlTG9hZGVyPXVjO2IuRmxhdFNoYWRpbmc9MTtiLkZsb2F0MzJBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkZsb2F0MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5GbG9hdDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGNhKGEsYyl9O2IuRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZT1jYTtiLkZsb2F0NjRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkZsb2F0NjRBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5GbG9hdDY0QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGthKGEsYyl9O2IuRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZT1rYTtiLkZsb2F0VHlwZT0xMDE1O2IuRm9nPUFnO2IuRm9nRXhwMj16ZztiLkZvbnQ9Z2k7CmIuRm9udExvYWRlcj1oaTtiLkZyb250RmFjZURpcmVjdGlvbkNDVz0xO2IuRnJvbnRGYWNlRGlyZWN0aW9uQ1c9MDtiLkZyb250U2lkZT0wO2IuRnJ1c3R1bT1pYztiLkdhbW1hRW5jb2Rpbmc9MzAwNztiLkdlb21ldHJ5PXlhO2IuR2VvbWV0cnlVdGlscz17bWVyZ2U6ZnVuY3Rpb24oYSxjLGUpe2NvbnNvbGUud2FybigiVEhSRUUuR2VvbWV0cnlVdGlsczogLm1lcmdlKCkgaGFzIGJlZW4gbW92ZWQgdG8gR2VvbWV0cnkuIFVzZSBnZW9tZXRyeS5tZXJnZSggZ2VvbWV0cnkyLCBtYXRyaXgsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKSBpbnN0ZWFkLiIpO2lmKGMuaXNNZXNoKXtjLm1hdHJpeEF1dG9VcGRhdGUmJmMudXBkYXRlTWF0cml4KCk7dmFyIGc9Yy5tYXRyaXg7Yz1jLmdlb21ldHJ5fWEubWVyZ2UoYyxnLGUpfSxjZW50ZXI6ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5HZW9tZXRyeVV0aWxzOiAuY2VudGVyKCkgaGFzIGJlZW4gbW92ZWQgdG8gR2VvbWV0cnkuIFVzZSBnZW9tZXRyeS5jZW50ZXIoKSBpbnN0ZWFkLiIpOwpyZXR1cm4gYS5jZW50ZXIoKX19O2IuR3JlYXRlckRlcHRoPTY7Yi5HcmVhdGVyRXF1YWxEZXB0aD01O2IuR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmM9NTE4O2IuR3JlYXRlclN0ZW5jaWxGdW5jPTUxNjtiLkdyaWRIZWxwZXI9Y2g7Yi5Hcm91cD11ZTtiLkhhbGZGbG9hdFR5cGU9MTAxNjtiLkhlbWlzcGhlcmVMaWdodD1OZztiLkhlbWlzcGhlcmVMaWdodEhlbHBlcj1hZjtiLkhlbWlzcGhlcmVMaWdodFByb2JlPWlpO2IuSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeT1IZTtiLkljb3NhaGVkcm9uR2VvbWV0cnk9SWY7Yi5JbWFnZUJpdG1hcExvYWRlcj1laTtiLkltYWdlTG9hZGVyPVVlO2IuSW1hZ2VVdGlscz1EZDtiLkltbWVkaWF0ZVJlbmRlck9iamVjdD1jZztiLkluY3JlbWVudFN0ZW5jaWxPcD03NjgyO2IuSW5jcmVtZW50V3JhcFN0ZW5jaWxPcD0zNDA1NTtiLkluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZT1YZztiLkluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5PVdnO2IuSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI9CnJpO2IuSW50MTZBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLkludDE2QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgbGEoYSxjKX07Yi5JbnQxNkJ1ZmZlckF0dHJpYnV0ZT1sYTtiLkludDMyQXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbnQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGJhKGEsYyl9O2IuSW50MzJCdWZmZXJBdHRyaWJ1dGU9YmE7Yi5JbnQ4QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5JbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBUKGEsCmMpfTtiLkludDhCdWZmZXJBdHRyaWJ1dGU9VDtiLkludFR5cGU9MTAxMztiLkludGVybGVhdmVkQnVmZmVyPVFkO2IuSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU9eGY7Yi5JbnRlcnBvbGFudD1vYztiLkludGVycG9sYXRlRGlzY3JldGU9MjMwMDtiLkludGVycG9sYXRlTGluZWFyPTIzMDE7Yi5JbnRlcnBvbGF0ZVNtb290aD0yMzAyO2IuSW52ZXJ0U3RlbmNpbE9wPTUzODY7Yi5KU09OTG9hZGVyPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuSlNPTkxvYWRlciBoYXMgYmVlbiByZW1vdmVkLiIpfTtiLktlZXBTdGVuY2lsT3A9NzY4MDtiLktleWZyYW1lVHJhY2s9WGI7Yi5MT0Q9QWY7Yi5MYXRoZUJ1ZmZlckdlb21ldHJ5PU9lO2IuTGF0aGVHZW9tZXRyeT1VZjtiLkxheWVycz14O2IuTGVuc0ZsYXJlPWZ1bmN0aW9uKCl7Y29uc29sZS5lcnJvcigiVEhSRUUuTGVuc0ZsYXJlIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy9vYmplY3RzL0xlbnNmbGFyZS5qcyIpfTsKYi5MZXNzRGVwdGg9MjtiLkxlc3NFcXVhbERlcHRoPTM7Yi5MZXNzRXF1YWxTdGVuY2lsRnVuYz01MTU7Yi5MZXNzU3RlbmNpbEZ1bmM9NTEzO2IuTGlnaHQ9SmI7Yi5MaWdodFByb2JlPUhjO2IuTGlnaHRQcm9iZUhlbHBlcj1iZjtiLkxpZ2h0U2hhZG93PVZjO2IuTGluZT1WYjtiLkxpbmUzPXVpO2IuTGluZUJhc2ljTWF0ZXJpYWw9RmI7Yi5MaW5lQ3VydmU9a2M7Yi5MaW5lQ3VydmUzPURjO2IuTGluZURhc2hlZE1hdGVyaWFsPWRlO2IuTGluZUxvb3A9RGc7Yi5MaW5lUGllY2VzPTE7Yi5MaW5lU2VnbWVudHM9SWI7Yi5MaW5lU3RyaXA9MDtiLkxpbmVhckVuY29kaW5nPTNFMztiLkxpbmVhckZpbHRlcj0xMDA2O2IuTGluZWFySW50ZXJwb2xhbnQ9WWY7Yi5MaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI9MTAwODtiLkxpbmVhck1pcE1hcE5lYXJlc3RGaWx0ZXI9MTAwNztiLkxpbmVhck1pcG1hcExpbmVhckZpbHRlcj0xMDA4O2IuTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlcj0xMDA3OwpiLkxpbmVhclRvbmVNYXBwaW5nPTE7Yi5Mb2FkZXI9RGI7Yi5Mb2FkZXJVdGlscz1QaTtiLkxvYWRpbmdNYW5hZ2VyPSRoO2IuTG9nTHV2RW5jb2Rpbmc9MzAwMztiLkxvb3BPbmNlPTIyMDA7Yi5Mb29wUGluZ1Bvbmc9MjIwMjtiLkxvb3BSZXBlYXQ9MjIwMTtiLkx1bWluYW5jZUFscGhhRm9ybWF0PTEwMjU7Yi5MdW1pbmFuY2VGb3JtYXQ9MTAyNDtiLk1PVVNFPXtMRUZUOjAsTUlERExFOjEsUklHSFQ6MixST1RBVEU6MCxET0xMWToxLFBBTjoyfTtiLk1hdGVyaWFsPU07Yi5NYXRlcmlhbExvYWRlcj1WZztiLk1hdGg9aGI7Yi5NYXRyaXgzPXQ7Yi5NYXRyaXg0PXE7Yi5NYXhFcXVhdGlvbj0xMDQ7Yi5NZXNoPXhhO2IuTWVzaEJhc2ljTWF0ZXJpYWw9TDtiLk1lc2hEZXB0aE1hdGVyaWFsPXZkO2IuTWVzaERpc3RhbmNlTWF0ZXJpYWw9d2Q7Yi5NZXNoRmFjZU1hdGVyaWFsPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuTWVzaEZhY2VNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4iKTsKcmV0dXJuIGF9O2IuTWVzaExhbWJlcnRNYXRlcmlhbD1iZTtiLk1lc2hNYXRjYXBNYXRlcmlhbD1jZTtiLk1lc2hOb3JtYWxNYXRlcmlhbD1hZTtiLk1lc2hQaG9uZ01hdGVyaWFsPUJjO2IuTWVzaFBoeXNpY2FsTWF0ZXJpYWw9WmQ7Yi5NZXNoU3RhbmRhcmRNYXRlcmlhbD1TYztiLk1lc2hUb29uTWF0ZXJpYWw9JGQ7Yi5NaW5FcXVhdGlvbj0xMDM7Yi5NaXJyb3JlZFJlcGVhdFdyYXBwaW5nPTEwMDI7Yi5NaXhPcGVyYXRpb249MTtiLk11bHRpTWF0ZXJpYWw9ZnVuY3Rpb24oYSl7dm9pZCAwPT09YSYmKGE9W10pO2NvbnNvbGUud2FybigiVEhSRUUuTXVsdGlNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4iKTthLmlzTXVsdGlNYXRlcmlhbD0hMDthLm1hdGVyaWFscz1hO2EuY2xvbmU9ZnVuY3Rpb24oKXtyZXR1cm4gYS5zbGljZSgpfTtyZXR1cm4gYX07Yi5NdWx0aXBseUJsZW5kaW5nPTQ7Yi5NdWx0aXBseU9wZXJhdGlvbj0wO2IuTmVhcmVzdEZpbHRlcj0KMTAwMztiLk5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI9MTAwNTtiLk5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyPTEwMDQ7Yi5OZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyPTEwMDU7Yi5OZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlcj0xMDA0O2IuTmV2ZXJEZXB0aD0wO2IuTmV2ZXJTdGVuY2lsRnVuYz01MTI7Yi5Ob0JsZW5kaW5nPTA7Yi5Ob0NvbG9ycz0wO2IuTm9Ub25lTWFwcGluZz0wO2IuTm9ybWFsQmxlbmRpbmc9MTtiLk5vdEVxdWFsRGVwdGg9NztiLk5vdEVxdWFsU3RlbmNpbEZ1bmM9NTE3O2IuTnVtYmVyS2V5ZnJhbWVUcmFjaz1TZTtiLk9iamVjdDNEPUE7Yi5PYmplY3RMb2FkZXI9Wmc7Yi5PYmplY3RTcGFjZU5vcm1hbE1hcD0xO2IuT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5PVJkO2IuT2N0YWhlZHJvbkdlb21ldHJ5PUhmO2IuT25lRmFjdG9yPTIwMTtiLk9uZU1pbnVzRHN0QWxwaGFGYWN0b3I9MjA3O2IuT25lTWludXNEc3RDb2xvckZhY3Rvcj0yMDk7Yi5PbmVNaW51c1NyY0FscGhhRmFjdG9yPQoyMDU7Yi5PbmVNaW51c1NyY0NvbG9yRmFjdG9yPTIwMztiLk9ydGhvZ3JhcGhpY0NhbWVyYT1iZztiLlBDRlNoYWRvd01hcD0xO2IuUENGU29mdFNoYWRvd01hcD0yO2IuUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5PUZlO2IuUGFyYW1ldHJpY0dlb21ldHJ5PUVmO2IuUGFydGljbGU9ZnVuY3Rpb24oYSl7Y29uc29sZS53YXJuKCJUSFJFRS5QYXJ0aWNsZSBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlNwcml0ZS4iKTtyZXR1cm4gbmV3IHlmKGEpfTtiLlBhcnRpY2xlQmFzaWNNYXRlcmlhbD1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlQmFzaWNNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLiIpO3JldHVybiBuZXcgQWMoYSl9O2IuUGFydGljbGVTeXN0ZW09ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlU3lzdGVtIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuUG9pbnRzLiIpO3JldHVybiBuZXcgQ2UoYSwKYyl9O2IuUGFydGljbGVTeXN0ZW1NYXRlcmlhbD1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4iKTtyZXR1cm4gbmV3IEFjKGEpfTtiLlBhdGg9R2M7Yi5QZXJzcGVjdGl2ZUNhbWVyYT12YjtiLlBsYW5lPUhiO2IuUGxhbmVCdWZmZXJHZW9tZXRyeT1MYztiLlBsYW5lR2VvbWV0cnk9cmQ7Yi5QbGFuZUhlbHBlcj1oZztiLlBvaW50Q2xvdWQ9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlBvaW50Q2xvdWQgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHMuIik7cmV0dXJuIG5ldyBDZShhLGMpfTtiLlBvaW50Q2xvdWRNYXRlcmlhbD1mdW5jdGlvbihhKXtjb25zb2xlLndhcm4oIlRIUkVFLlBvaW50Q2xvdWRNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLiIpO3JldHVybiBuZXcgQWMoYSl9O2IuUG9pbnRMaWdodD0KUWc7Yi5Qb2ludExpZ2h0SGVscGVyPVplO2IuUG9pbnRzPUNlO2IuUG9pbnRzTWF0ZXJpYWw9QWM7Yi5Qb2xhckdyaWRIZWxwZXI9ZGg7Yi5Qb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnk9amM7Yi5Qb2x5aGVkcm9uR2VvbWV0cnk9RmY7Yi5Qb3NpdGlvbmFsQXVkaW89bmk7Yi5Qb3NpdGlvbmFsQXVkaW9IZWxwZXI9Y2Y7Yi5Qcm9wZXJ0eUJpbmRpbmc9JGI7Yi5Qcm9wZXJ0eU1peGVyPXBpO2IuUXVhZHJhdGljQmV6aWVyQ3VydmU9RWM7Yi5RdWFkcmF0aWNCZXppZXJDdXJ2ZTM9VWM7Yi5RdWF0ZXJuaW9uPWg7Yi5RdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjaz1aZjtiLlF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudD1JZztiLlJFVklTSU9OPSIxMDgiO2IuUkdCQURlcHRoUGFja2luZz0zMjAxO2IuUkdCQUZvcm1hdD0xMDIzO2IuUkdCQV9BU1RDXzEweDEwX0Zvcm1hdD0zNzgxOTtiLlJHQkFfQVNUQ18xMHg1X0Zvcm1hdD0zNzgxNjtiLlJHQkFfQVNUQ18xMHg2X0Zvcm1hdD0zNzgxNztiLlJHQkFfQVNUQ18xMHg4X0Zvcm1hdD0KMzc4MTg7Yi5SR0JBX0FTVENfMTJ4MTBfRm9ybWF0PTM3ODIwO2IuUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdD0zNzgyMTtiLlJHQkFfQVNUQ180eDRfRm9ybWF0PTM3ODA4O2IuUkdCQV9BU1RDXzV4NF9Gb3JtYXQ9Mzc4MDk7Yi5SR0JBX0FTVENfNXg1X0Zvcm1hdD0zNzgxMDtiLlJHQkFfQVNUQ182eDVfRm9ybWF0PTM3ODExO2IuUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQ9Mzc4MTI7Yi5SR0JBX0FTVENfOHg1X0Zvcm1hdD0zNzgxMztiLlJHQkFfQVNUQ184eDZfRm9ybWF0PTM3ODE0O2IuUkdCQV9BU1RDXzh4OF9Gb3JtYXQ9Mzc4MTU7Yi5SR0JBX1BWUlRDXzJCUFBWMV9Gb3JtYXQ9MzU4NDM7Yi5SR0JBX1BWUlRDXzRCUFBWMV9Gb3JtYXQ9MzU4NDI7Yi5SR0JBX1MzVENfRFhUMV9Gb3JtYXQ9MzM3Nzc7Yi5SR0JBX1MzVENfRFhUM19Gb3JtYXQ9MzM3Nzg7Yi5SR0JBX1MzVENfRFhUNV9Gb3JtYXQ9MzM3Nzk7Yi5SR0JERW5jb2Rpbmc9MzAwNjtiLlJHQkVFbmNvZGluZz0zMDAyO2IuUkdCRUZvcm1hdD0KMTAyMztiLlJHQkZvcm1hdD0xMDIyO2IuUkdCTTE2RW5jb2Rpbmc9MzAwNTtiLlJHQk03RW5jb2Rpbmc9MzAwNDtiLlJHQl9FVEMxX0Zvcm1hdD0zNjE5NjtiLlJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0PTM1ODQxO2IuUkdCX1BWUlRDXzRCUFBWMV9Gb3JtYXQ9MzU4NDA7Yi5SR0JfUzNUQ19EWFQxX0Zvcm1hdD0zMzc3NjtiLlJhd1NoYWRlck1hdGVyaWFsPVJlO2IuUmF5PUQ7Yi5SYXljYXN0ZXI9VWo7Yi5SZWN0QXJlYUxpZ2h0PVVnO2IuUmVjdEFyZWFMaWdodEhlbHBlcj0kZTtiLlJlZEZvcm1hdD0xMDI4O2IuUmVpbmhhcmRUb25lTWFwcGluZz0yO2IuUmVwZWF0V3JhcHBpbmc9MUUzO2IuUmVwbGFjZVN0ZW5jaWxPcD03NjgxO2IuUmV2ZXJzZVN1YnRyYWN0RXF1YXRpb249MTAyO2IuUmluZ0J1ZmZlckdlb21ldHJ5PU5lO2IuUmluZ0dlb21ldHJ5PVRmO2IuU2NlbmU9eTtiLlNjZW5lVXRpbHM9e2NyZWF0ZU11bHRpTWF0ZXJpYWxPYmplY3Q6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzIil9LApkZXRhY2g6ZnVuY3Rpb24oKXtjb25zb2xlLmVycm9yKCJUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzIil9LGF0dGFjaDpmdW5jdGlvbigpe2NvbnNvbGUuZXJyb3IoIlRIUkVFLlNjZW5lVXRpbHMgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzL3V0aWxzL1NjZW5lVXRpbHMuanMiKX19O2IuU2hhZGVyQ2h1bms9cmI7Yi5TaGFkZXJMaWI9TWM7Yi5TaGFkZXJNYXRlcmlhbD1xYjtiLlNoYWRvd01hdGVyaWFsPVlkO2IuU2hhcGU9Q2Q7Yi5TaGFwZUJ1ZmZlckdlb21ldHJ5PVdkO2IuU2hhcGVHZW9tZXRyeT1WZDtiLlNoYXBlUGF0aD1maTtiLlNoYXBlVXRpbHM9ZWQ7Yi5TaG9ydFR5cGU9MTAxMTtiLlNrZWxldG9uPUNnO2IuU2tlbGV0b25IZWxwZXI9WWU7Yi5Ta2lubmVkTWVzaD1CZjtiLlNtb290aFNoYWRpbmc9MjtiLlNwaGVyZT1HO2IuU3BoZXJlQnVmZmVyR2VvbWV0cnk9QmQ7Yi5TcGhlcmVHZW9tZXRyeT0KU2Y7Yi5TcGhlcmljYWw9V2o7Yi5TcGhlcmljYWxIYXJtb25pY3MzPWFoO2IuU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc9MzA1O2IuU3BsaW5lPXdpO2IuU3BsaW5lQ3VydmU9RmM7Yi5TcGxpbmVDdXJ2ZTM9YWs7Yi5TcG90TGlnaHQ9UGc7Yi5TcG90TGlnaHRIZWxwZXI9WGU7Yi5TcG90TGlnaHRTaGFkb3c9T2c7Yi5TcHJpdGU9eWY7Yi5TcHJpdGVNYXRlcmlhbD1BZDtiLlNyY0FscGhhRmFjdG9yPTIwNDtiLlNyY0FscGhhU2F0dXJhdGVGYWN0b3I9MjEwO2IuU3JjQ29sb3JGYWN0b3I9MjAyO2IuU3RlcmVvQ2FtZXJhPVFqO2IuU3RyaW5nS2V5ZnJhbWVUcmFjaz1KZztiLlN1YnRyYWN0RXF1YXRpb249MTAxO2IuU3VidHJhY3RpdmVCbGVuZGluZz0zO2IuVE9VQ0g9e1JPVEFURTowLFBBTjoxLERPTExZX1BBTjoyLERPTExZX1JPVEFURTozfTtiLlRhbmdlbnRTcGFjZU5vcm1hbE1hcD0wO2IuVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeT1HZTtiLlRldHJhaGVkcm9uR2VvbWV0cnk9CkdmO2IuVGV4dEJ1ZmZlckdlb21ldHJ5PU1lO2IuVGV4dEdlb21ldHJ5PVJmO2IuVGV4dHVyZT1sO2IuVGV4dHVyZUxvYWRlcj1NZztiLlRvcnVzQnVmZmVyR2VvbWV0cnk9S2U7Yi5Ub3J1c0dlb21ldHJ5PU1mO2IuVG9ydXNLbm90QnVmZmVyR2VvbWV0cnk9SmU7Yi5Ub3J1c0tub3RHZW9tZXRyeT1MZjtiLlRyaWFuZ2xlPUI7Yi5UcmlhbmdsZUZhbkRyYXdNb2RlPTI7Yi5UcmlhbmdsZVN0cmlwRHJhd01vZGU9MTtiLlRyaWFuZ2xlc0RyYXdNb2RlPTA7Yi5UdWJlQnVmZmVyR2VvbWV0cnk9U2Q7Yi5UdWJlR2VvbWV0cnk9S2Y7Yi5VVk1hcHBpbmc9MzAwO2IuVWludDE2QXR0cmlidXRlPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5VaW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MTZCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgWihhLGMpfTtiLlVpbnQxNkJ1ZmZlckF0dHJpYnV0ZT1aO2IuVWludDMyQXR0cmlidXRlPQpmdW5jdGlvbihhLGMpe2NvbnNvbGUud2FybigiVEhSRUUuVWludDMyQXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4iKTtyZXR1cm4gbmV3IGVhKGEsYyl9O2IuVWludDMyQnVmZmVyQXR0cmlidXRlPWVhO2IuVWludDhBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLiIpO3JldHVybiBuZXcgWChhLGMpfTtiLlVpbnQ4QnVmZmVyQXR0cmlidXRlPVg7Yi5VaW50OENsYW1wZWRBdHRyaWJ1dGU9ZnVuY3Rpb24oYSxjKXtjb25zb2xlLndhcm4oIlRIUkVFLlVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuIik7cmV0dXJuIG5ldyBhYShhLApjKX07Yi5VaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU9YWE7Yi5VbmNoYXJ0ZWQyVG9uZU1hcHBpbmc9MztiLlVuaWZvcm09Ymg7Yi5Vbmlmb3Jtc0xpYj1XYTtiLlVuaWZvcm1zVXRpbHM9Rm07Yi5VbnNpZ25lZEJ5dGVUeXBlPTEwMDk7Yi5VbnNpZ25lZEludDI0OFR5cGU9MTAyMDtiLlVuc2lnbmVkSW50VHlwZT0xMDE0O2IuVW5zaWduZWRTaG9ydDQ0NDRUeXBlPTEwMTc7Yi5VbnNpZ25lZFNob3J0NTU1MVR5cGU9MTAxODtiLlVuc2lnbmVkU2hvcnQ1NjVUeXBlPTEwMTk7Yi5VbnNpZ25lZFNob3J0VHlwZT0xMDEyO2IuVlNNU2hhZG93TWFwPTM7Yi5WZWN0b3IyPWY7Yi5WZWN0b3IzPWs7Yi5WZWN0b3I0PXA7Yi5WZWN0b3JLZXlmcmFtZVRyYWNrPVRlO2IuVmVydGV4PWZ1bmN0aW9uKGEsYyxlKXtjb25zb2xlLndhcm4oIlRIUkVFLlZlcnRleCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuVmVjdG9yMyBpbnN0ZWFkLiIpO3JldHVybiBuZXcgayhhLGMsZSl9O2IuVmVydGV4Q29sb3JzPQoyO2IuVmVydGV4Tm9ybWFsc0hlbHBlcj1kZztiLlZpZGVvVGV4dHVyZT1YaDtiLldlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQ9bjtiLldlYkdMUmVuZGVyVGFyZ2V0PW07Yi5XZWJHTFJlbmRlclRhcmdldEN1YmU9TmI7Yi5XZWJHTFJlbmRlcmVyPU9oO2IuV2ViR0xVdGlscz13ajtiLldpcmVmcmFtZUdlb21ldHJ5PUVlO2IuV2lyZWZyYW1lSGVscGVyPWZ1bmN0aW9uKGEsYyl7Y29uc29sZS53YXJuKCJUSFJFRS5XaXJlZnJhbWVIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLldpcmVmcmFtZUdlb21ldHJ5IGluc3RlYWQuIik7cmV0dXJuIG5ldyBJYihuZXcgRWUoYS5nZW9tZXRyeSksbmV3IEZiKHtjb2xvcjp2b2lkIDAhPT1jP2M6MTY3NzcyMTV9KSl9O2IuV3JhcEFyb3VuZEVuZGluZz0yNDAyO2IuWEhSTG9hZGVyPWZ1bmN0aW9uKGEpe2NvbnNvbGUud2FybigiVEhSRUUuWEhSTG9hZGVyIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuRmlsZUxvYWRlci4iKTsKcmV0dXJuIG5ldyB1YyhhKX07Yi5aZXJvQ3VydmF0dXJlRW5kaW5nPTI0MDA7Yi5aZXJvRmFjdG9yPTIwMDtiLlplcm9TbG9wZUVuZGluZz0yNDAxO2IuWmVyb1N0ZW5jaWxPcD0wO2Iuc1JHQkVuY29kaW5nPTMwMDE7T2JqZWN0LmRlZmluZVByb3BlcnR5KGIsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pfSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9PcmJpdENvbnRyb2xzLmpzClRIUkVFLk9yYml0Q29udHJvbHM9ZnVuY3Rpb24oYixkKXtmdW5jdGlvbiBmKCl7cmV0dXJuIDIqTWF0aC5QSS82MC82MCpZLmF1dG9Sb3RhdGVTcGVlZH1mdW5jdGlvbiBoKCl7cmV0dXJuIE1hdGgucG93KC45NSxZLnpvb21TcGVlZCl9ZnVuY3Rpb24gayhzYSl7WGEudGhldGEtPXNhfWZ1bmN0aW9uIHQoc2Epe1hhLnBoaS09c2F9ZnVuY3Rpb24gbChzYSl7WS5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT91Yi89c2E6WS5vYmplY3QuaXNPcnRob2dyYXBoaWNDYW1lcmE/KFkub2JqZWN0Lnpvb209TWF0aC5tYXgoWS5taW5ab29tLE1hdGgubWluKFkubWF4Wm9vbSxZLm9iamVjdC56b29tKnNhKSksWS5vYmplY3QudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpLHFiPSEwKTooY29uc29sZS53YXJuKCJXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBkb2xseS96b29tIGRpc2FibGVkLiIpLFkuZW5hYmxlWm9vbT0hMSl9ZnVuY3Rpb24gcChzYSl7WS5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYT8KdWIqPXNhOlkub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhPyhZLm9iamVjdC56b29tPU1hdGgubWF4KFkubWluWm9vbSxNYXRoLm1pbihZLm1heFpvb20sWS5vYmplY3Quem9vbS9zYSkpLFkub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKSxxYj0hMCk6KGNvbnNvbGUud2FybigiV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gZG9sbHkvem9vbSBkaXNhYmxlZC4iKSxZLmVuYWJsZVpvb209ITEpfWZ1bmN0aW9uIG0oc2Epe3piLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIG4oc2Epe2ljLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIHEoc2Epe05iLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpfWZ1bmN0aW9uIHUoc2Epe3ZiLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpO0diLnN1YlZlY3RvcnModmIsemIpLm11bHRpcGx5U2NhbGFyKFkucm90YXRlU3BlZWQpO3NhPQpZLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9ZLmRvbUVsZW1lbnQuYm9keTpZLmRvbUVsZW1lbnQ7aygyKk1hdGguUEkqR2IueC9zYS5jbGllbnRIZWlnaHQpO3QoMipNYXRoLlBJKkdiLnkvc2EuY2xpZW50SGVpZ2h0KTt6Yi5jb3B5KHZiKTtZLnVwZGF0ZSgpfWZ1bmN0aW9uIHgoc2Epe2JjLnNldChzYS5jbGllbnRYLHNhLmNsaWVudFkpO09kLnN1YlZlY3RvcnMoYmMsaWMpOzA8T2QueT9sKGgoKSk6MD5PZC55JiZwKGgoKSk7aWMuY29weShiYyk7WS51cGRhdGUoKX1mdW5jdGlvbiBBKHNhKXtBYi5zZXQoc2EuY2xpZW50WCxzYS5jbGllbnRZKTtIYi5zdWJWZWN0b3JzKEFiLE5iKS5tdWx0aXBseVNjYWxhcihZLnBhblNwZWVkKTtzZChIYi54LEhiLnkpO05iLmNvcHkoQWIpO1kudXBkYXRlKCl9ZnVuY3Rpb24geSgpe31mdW5jdGlvbiB3KHNhKXswPnNhLmRlbHRhWT9wKGgoKSk6MDxzYS5kZWx0YVkmJmwoaCgpKTtZLnVwZGF0ZSgpfWZ1bmN0aW9uIEMoc2Epe3ZhciBNYj0hMTtzd2l0Y2goc2Eua2V5Q29kZSl7Y2FzZSBZLmtleXMuVVA6c2QoMCwKWS5rZXlQYW5TcGVlZCk7TWI9ITA7YnJlYWs7Y2FzZSBZLmtleXMuQk9UVE9NOnNkKDAsLVkua2V5UGFuU3BlZWQpO01iPSEwO2JyZWFrO2Nhc2UgWS5rZXlzLkxFRlQ6c2QoWS5rZXlQYW5TcGVlZCwwKTtNYj0hMDticmVhaztjYXNlIFkua2V5cy5SSUdIVDpzZCgtWS5rZXlQYW5TcGVlZCwwKSxNYj0hMH1NYiYmKHNhLnByZXZlbnREZWZhdWx0KCksWS51cGRhdGUoKSl9ZnVuY3Rpb24gRyhzYSl7MT09c2EudG91Y2hlcy5sZW5ndGg/emIuc2V0KHNhLnRvdWNoZXNbMF0ucGFnZVgsc2EudG91Y2hlc1swXS5wYWdlWSk6emIuc2V0KC41KihzYS50b3VjaGVzWzBdLnBhZ2VYK3NhLnRvdWNoZXNbMV0ucGFnZVgpLC41KihzYS50b3VjaGVzWzBdLnBhZ2VZK3NhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBEKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD9OYi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTpOYi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrCnNhLnRvdWNoZXNbMV0ucGFnZVgpLC41KihzYS50b3VjaGVzWzBdLnBhZ2VZK3NhLnRvdWNoZXNbMV0ucGFnZVkpKX1mdW5jdGlvbiBCKHNhKXt2YXIgTWI9c2EudG91Y2hlc1swXS5wYWdlWC1zYS50b3VjaGVzWzFdLnBhZ2VYO3NhPXNhLnRvdWNoZXNbMF0ucGFnZVktc2EudG91Y2hlc1sxXS5wYWdlWTtpYy5zZXQoMCxNYXRoLnNxcnQoTWIqTWIrc2Eqc2EpKX1mdW5jdGlvbiBJKHNhKXtZLmVuYWJsZVpvb20mJkIoc2EpO1kuZW5hYmxlUGFuJiZEKHNhKX1mdW5jdGlvbiBOKHNhKXtZLmVuYWJsZVpvb20mJkIoc2EpO1kuZW5hYmxlUm90YXRlJiZHKHNhKX1mdW5jdGlvbiBPKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD92Yi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTp2Yi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrc2EudG91Y2hlc1sxXS5wYWdlWCksLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVkrc2EudG91Y2hlc1sxXS5wYWdlWSkpO0diLnN1YlZlY3RvcnModmIsCnpiKS5tdWx0aXBseVNjYWxhcihZLnJvdGF0ZVNwZWVkKTtzYT1ZLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9ZLmRvbUVsZW1lbnQuYm9keTpZLmRvbUVsZW1lbnQ7aygyKk1hdGguUEkqR2IueC9zYS5jbGllbnRIZWlnaHQpO3QoMipNYXRoLlBJKkdiLnkvc2EuY2xpZW50SGVpZ2h0KTt6Yi5jb3B5KHZiKX1mdW5jdGlvbiBIKHNhKXsxPT1zYS50b3VjaGVzLmxlbmd0aD9BYi5zZXQoc2EudG91Y2hlc1swXS5wYWdlWCxzYS50b3VjaGVzWzBdLnBhZ2VZKTpBYi5zZXQoLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVgrc2EudG91Y2hlc1sxXS5wYWdlWCksLjUqKHNhLnRvdWNoZXNbMF0ucGFnZVkrc2EudG91Y2hlc1sxXS5wYWdlWSkpO0hiLnN1YlZlY3RvcnMoQWIsTmIpLm11bHRpcGx5U2NhbGFyKFkucGFuU3BlZWQpO3NkKEhiLngsSGIueSk7TmIuY29weShBYil9ZnVuY3Rpb24gSyhzYSl7dmFyIE1iPXNhLnRvdWNoZXNbMF0ucGFnZVgtc2EudG91Y2hlc1sxXS5wYWdlWDtzYT1zYS50b3VjaGVzWzBdLnBhZ2VZLQpzYS50b3VjaGVzWzFdLnBhZ2VZO2JjLnNldCgwLE1hdGguc3FydChNYipNYitzYSpzYSkpO09kLnNldCgwLE1hdGgucG93KGJjLnkvaWMueSxZLnpvb21TcGVlZCkpO2woT2QueSk7aWMuY29weShiYyl9ZnVuY3Rpb24gTShzYSl7WS5lbmFibGVab29tJiZLKHNhKTtZLmVuYWJsZVBhbiYmSChzYSl9ZnVuY3Rpb24gTChzYSl7WS5lbmFibGVab29tJiZLKHNhKTtZLmVuYWJsZVJvdGF0ZSYmTyhzYSl9ZnVuY3Rpb24gUSgpe31mdW5jdGlvbiBUKHNhKXtpZighMSE9PVkuZW5hYmxlZCl7c2EucHJldmVudERlZmF1bHQoKTtZLmRvbUVsZW1lbnQuZm9jdXM/WS5kb21FbGVtZW50LmZvY3VzKCk6d2luZG93LmZvY3VzKCk7c3dpdGNoKHNhLmJ1dHRvbil7Y2FzZSAwOnN3aXRjaChZLm1vdXNlQnV0dG9ucy5MRUZUKXtjYXNlIFRIUkVFLk1PVVNFLlJPVEFURTppZihzYS5jdHJsS2V5fHxzYS5tZXRhS2V5fHxzYS5zaGlmdEtleSl7aWYoITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9CkFhLlBBTn1lbHNle2lmKCExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO20oc2EpO0ZhPUFhLlJPVEFURX1icmVhaztjYXNlIFRIUkVFLk1PVVNFLlBBTjppZihzYS5jdHJsS2V5fHxzYS5tZXRhS2V5fHxzYS5zaGlmdEtleSl7aWYoITE9PT1ZLmVuYWJsZVJvdGF0ZSlyZXR1cm47bShzYSk7RmE9QWEuUk9UQVRFfWVsc2V7aWYoITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9QWEuUEFOfWJyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX1icmVhaztjYXNlIDE6c3dpdGNoKFkubW91c2VCdXR0b25zLk1JRERMRSl7Y2FzZSBUSFJFRS5NT1VTRS5ET0xMWTppZighMT09PVkuZW5hYmxlWm9vbSlyZXR1cm47bihzYSk7RmE9QWEuRE9MTFk7YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfWJyZWFrO2Nhc2UgMjpzd2l0Y2goWS5tb3VzZUJ1dHRvbnMuUklHSFQpe2Nhc2UgVEhSRUUuTU9VU0UuUk9UQVRFOmlmKCExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO20oc2EpO0ZhPUFhLlJPVEFURTsKYnJlYWs7Y2FzZSBUSFJFRS5NT1VTRS5QQU46aWYoITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47cShzYSk7RmE9QWEuUEFOO2JyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX19RmEhPT1BYS5OT05FJiYoZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixYLCExKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIixhYSwhMSksWS5kaXNwYXRjaEV2ZW50KHZhKSl9fWZ1bmN0aW9uIFgoc2Epe2lmKCExIT09WS5lbmFibGVkKXN3aXRjaChzYS5wcmV2ZW50RGVmYXVsdCgpLEZhKXtjYXNlIEFhLlJPVEFURTppZighMT09PVkuZW5hYmxlUm90YXRlKWJyZWFrO3Uoc2EpO2JyZWFrO2Nhc2UgQWEuRE9MTFk6aWYoITE9PT1ZLmVuYWJsZVpvb20pYnJlYWs7eChzYSk7YnJlYWs7Y2FzZSBBYS5QQU46ITEhPT1ZLmVuYWJsZVBhbiYmQShzYSl9fWZ1bmN0aW9uIGFhKHNhKXshMSE9PVkuZW5hYmxlZCYmKHkoc2EpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsClgsITEpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNldXAiLGFhLCExKSxZLmRpc3BhdGNoRXZlbnQoeGEpLEZhPUFhLk5PTkUpfWZ1bmN0aW9uIGxhKHNhKXshMT09PVkuZW5hYmxlZHx8ITE9PT1ZLmVuYWJsZVpvb218fEZhIT09QWEuTk9ORSYmRmEhPT1BYS5ST1RBVEV8fChzYS5wcmV2ZW50RGVmYXVsdCgpLHNhLnN0b3BQcm9wYWdhdGlvbigpLFkuZGlzcGF0Y2hFdmVudCh2YSksdyhzYSksWS5kaXNwYXRjaEV2ZW50KHhhKSl9ZnVuY3Rpb24gWihzYSl7ITEhPT1ZLmVuYWJsZWQmJiExIT09WS5lbmFibGVLZXlzJiYhMSE9PVkuZW5hYmxlUGFuJiZDKHNhKX1mdW5jdGlvbiBiYShzYSl7aWYoITEhPT1ZLmVuYWJsZWQpe3NhLnByZXZlbnREZWZhdWx0KCk7c3dpdGNoKHNhLnRvdWNoZXMubGVuZ3RoKXtjYXNlIDE6c3dpdGNoKFkudG91Y2hlcy5PTkUpe2Nhc2UgVEhSRUUuVE9VQ0guUk9UQVRFOmlmKCExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO0coc2EpO0ZhPQpBYS5UT1VDSF9ST1RBVEU7YnJlYWs7Y2FzZSBUSFJFRS5UT1VDSC5QQU46aWYoITE9PT1ZLmVuYWJsZVBhbilyZXR1cm47RChzYSk7RmE9QWEuVE9VQ0hfUEFOO2JyZWFrO2RlZmF1bHQ6RmE9QWEuTk9ORX1icmVhaztjYXNlIDI6c3dpdGNoKFkudG91Y2hlcy5UV08pe2Nhc2UgVEhSRUUuVE9VQ0guRE9MTFlfUEFOOmlmKCExPT09WS5lbmFibGVab29tJiYhMT09PVkuZW5hYmxlUGFuKXJldHVybjtJKHNhKTtGYT1BYS5UT1VDSF9ET0xMWV9QQU47YnJlYWs7Y2FzZSBUSFJFRS5UT1VDSC5ET0xMWV9ST1RBVEU6aWYoITE9PT1ZLmVuYWJsZVpvb20mJiExPT09WS5lbmFibGVSb3RhdGUpcmV0dXJuO04oc2EpO0ZhPUFhLlRPVUNIX0RPTExZX1JPVEFURTticmVhaztkZWZhdWx0OkZhPUFhLk5PTkV9YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfUZhIT09QWEuTk9ORSYmWS5kaXNwYXRjaEV2ZW50KHZhKX19ZnVuY3Rpb24gZWEoc2Epe2lmKCExIT09WS5lbmFibGVkKXN3aXRjaChzYS5wcmV2ZW50RGVmYXVsdCgpLApzYS5zdG9wUHJvcGFnYXRpb24oKSxGYSl7Y2FzZSBBYS5UT1VDSF9ST1RBVEU6aWYoITE9PT1ZLmVuYWJsZVJvdGF0ZSlicmVhaztPKHNhKTtZLnVwZGF0ZSgpO2JyZWFrO2Nhc2UgQWEuVE9VQ0hfUEFOOmlmKCExPT09WS5lbmFibGVQYW4pYnJlYWs7SChzYSk7WS51cGRhdGUoKTticmVhaztjYXNlIEFhLlRPVUNIX0RPTExZX1BBTjppZighMT09PVkuZW5hYmxlWm9vbSYmITE9PT1ZLmVuYWJsZVBhbilicmVhaztNKHNhKTtZLnVwZGF0ZSgpO2JyZWFrO2Nhc2UgQWEuVE9VQ0hfRE9MTFlfUk9UQVRFOmlmKCExPT09WS5lbmFibGVab29tJiYhMT09PVkuZW5hYmxlUm90YXRlKWJyZWFrO0woc2EpO1kudXBkYXRlKCk7YnJlYWs7ZGVmYXVsdDpGYT1BYS5OT05FfX1mdW5jdGlvbiBjYShzYSl7ITEhPT1ZLmVuYWJsZWQmJihRKHNhKSxZLmRpc3BhdGNoRXZlbnQoeGEpLEZhPUFhLk5PTkUpfWZ1bmN0aW9uIGthKHNhKXshMSE9PVkuZW5hYmxlZCYmc2EucHJldmVudERlZmF1bHQoKX10aGlzLm9iamVjdD0KYjt0aGlzLmRvbUVsZW1lbnQ9dm9pZCAwIT09ZD9kOmRvY3VtZW50O3RoaXMuZW5hYmxlZD0hMDt0aGlzLnRhcmdldD1uZXcgVEhSRUUuVmVjdG9yMzt0aGlzLm1pbkRpc3RhbmNlPTA7dGhpcy5tYXhEaXN0YW5jZT1JbmZpbml0eTt0aGlzLm1pblpvb209MDt0aGlzLm1heFpvb209SW5maW5pdHk7dGhpcy5taW5Qb2xhckFuZ2xlPTA7dGhpcy5tYXhQb2xhckFuZ2xlPU1hdGguUEk7dGhpcy5taW5BemltdXRoQW5nbGU9LUluZmluaXR5O3RoaXMubWF4QXppbXV0aEFuZ2xlPUluZmluaXR5O3RoaXMuZW5hYmxlRGFtcGluZz0hMTt0aGlzLmRhbXBpbmdGYWN0b3I9LjA1O3RoaXMuZW5hYmxlWm9vbT0hMDt0aGlzLnpvb21TcGVlZD0xO3RoaXMuZW5hYmxlUm90YXRlPSEwO3RoaXMucm90YXRlU3BlZWQ9MTt0aGlzLmVuYWJsZVBhbj0hMDt0aGlzLnBhblNwZWVkPTE7dGhpcy5zY3JlZW5TcGFjZVBhbm5pbmc9ITE7dGhpcy5rZXlQYW5TcGVlZD03O3RoaXMuYXV0b1JvdGF0ZT0hMTt0aGlzLmF1dG9Sb3RhdGVTcGVlZD0KMjt0aGlzLmVuYWJsZUtleXM9ITA7dGhpcy5rZXlzPXtMRUZUOjM3LFVQOjM4LFJJR0hUOjM5LEJPVFRPTTo0MH07dGhpcy5tb3VzZUJ1dHRvbnM9e0xFRlQ6VEhSRUUuTU9VU0UuUk9UQVRFLE1JRERMRTpUSFJFRS5NT1VTRS5ET0xMWSxSSUdIVDpUSFJFRS5NT1VTRS5QQU59O3RoaXMudG91Y2hlcz17T05FOlRIUkVFLlRPVUNILlJPVEFURSxUV086VEhSRUUuVE9VQ0guRE9MTFlfUEFOfTt0aGlzLnRhcmdldDA9dGhpcy50YXJnZXQuY2xvbmUoKTt0aGlzLnBvc2l0aW9uMD10aGlzLm9iamVjdC5wb3NpdGlvbi5jbG9uZSgpO3RoaXMuem9vbTA9dGhpcy5vYmplY3Quem9vbTt0aGlzLmdldFBvbGFyQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gU2EucGhpfTt0aGlzLmdldEF6aW11dGhhbEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIFNhLnRoZXRhfTt0aGlzLnNhdmVTdGF0ZT1mdW5jdGlvbigpe1kudGFyZ2V0MC5jb3B5KFkudGFyZ2V0KTtZLnBvc2l0aW9uMC5jb3B5KFkub2JqZWN0LnBvc2l0aW9uKTsKWS56b29tMD1ZLm9iamVjdC56b29tfTt0aGlzLnJlc2V0PWZ1bmN0aW9uKCl7WS50YXJnZXQuY29weShZLnRhcmdldDApO1kub2JqZWN0LnBvc2l0aW9uLmNvcHkoWS5wb3NpdGlvbjApO1kub2JqZWN0Lnpvb209WS56b29tMDtZLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7WS5kaXNwYXRjaEV2ZW50KEVhKTtZLnVwZGF0ZSgpO0ZhPUFhLk5PTkV9O3RoaXMudXBkYXRlPWZ1bmN0aW9uKCl7dmFyIHNhPW5ldyBUSFJFRS5WZWN0b3IzLE1iPShuZXcgVEhSRUUuUXVhdGVybmlvbikuc2V0RnJvbVVuaXRWZWN0b3JzKGIudXAsbmV3IFRIUkVFLlZlY3RvcjMoMCwxLDApKSx3Yz1NYi5jbG9uZSgpLmludmVyc2UoKSxiZD1uZXcgVEhSRUUuVmVjdG9yMyx0ZD1uZXcgVEhSRUUuUXVhdGVybmlvbjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdGc9WS5vYmplY3QucG9zaXRpb247c2EuY29weSh0Zykuc3ViKFkudGFyZ2V0KTtzYS5hcHBseVF1YXRlcm5pb24oTWIpO1NhLnNldEZyb21WZWN0b3IzKHNhKTsKWS5hdXRvUm90YXRlJiZGYT09PUFhLk5PTkUmJmsoZigpKTtZLmVuYWJsZURhbXBpbmc/KFNhLnRoZXRhKz1YYS50aGV0YSpZLmRhbXBpbmdGYWN0b3IsU2EucGhpKz1YYS5waGkqWS5kYW1waW5nRmFjdG9yKTooU2EudGhldGErPVhhLnRoZXRhLFNhLnBoaSs9WGEucGhpKTtTYS50aGV0YT1NYXRoLm1heChZLm1pbkF6aW11dGhBbmdsZSxNYXRoLm1pbihZLm1heEF6aW11dGhBbmdsZSxTYS50aGV0YSkpO1NhLnBoaT1NYXRoLm1heChZLm1pblBvbGFyQW5nbGUsTWF0aC5taW4oWS5tYXhQb2xhckFuZ2xlLFNhLnBoaSkpO1NhLm1ha2VTYWZlKCk7U2EucmFkaXVzKj11YjtTYS5yYWRpdXM9TWF0aC5tYXgoWS5taW5EaXN0YW5jZSxNYXRoLm1pbihZLm1heERpc3RhbmNlLFNhLnJhZGl1cykpOyEwPT09WS5lbmFibGVEYW1waW5nP1kudGFyZ2V0LmFkZFNjYWxlZFZlY3RvcihCYixZLmRhbXBpbmdGYWN0b3IpOlkudGFyZ2V0LmFkZChCYik7c2Euc2V0RnJvbVNwaGVyaWNhbChTYSk7c2EuYXBwbHlRdWF0ZXJuaW9uKHdjKTsKdGcuY29weShZLnRhcmdldCkuYWRkKHNhKTtZLm9iamVjdC5sb29rQXQoWS50YXJnZXQpOyEwPT09WS5lbmFibGVEYW1waW5nPyhYYS50aGV0YSo9MS1ZLmRhbXBpbmdGYWN0b3IsWGEucGhpKj0xLVkuZGFtcGluZ0ZhY3RvcixCYi5tdWx0aXBseVNjYWxhcigxLVkuZGFtcGluZ0ZhY3RvcikpOihYYS5zZXQoMCwwLDApLEJiLnNldCgwLDAsMCkpO3ViPTE7cmV0dXJuIHFifHxiZC5kaXN0YW5jZVRvU3F1YXJlZChZLm9iamVjdC5wb3NpdGlvbik+eWF8fDgqKDEtdGQuZG90KFkub2JqZWN0LnF1YXRlcm5pb24pKT55YT8oWS5kaXNwYXRjaEV2ZW50KEVhKSxiZC5jb3B5KFkub2JqZWN0LnBvc2l0aW9uKSx0ZC5jb3B5KFkub2JqZWN0LnF1YXRlcm5pb24pLHFiPSExLCEwKTohMX19KCk7dGhpcy5kaXNwb3NlPWZ1bmN0aW9uKCl7WS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51IixrYSwhMSk7WS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsClQsITEpO1kuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ3aGVlbCIsbGEsITEpO1kuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixiYSwhMSk7WS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIixjYSwhMSk7WS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsZWEsITEpO2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoIm1vdXNlbW92ZSIsWCwhMSk7ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsYWEsITEpO3dpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJrZXlkb3duIixaLCExKX07dmFyIFk9dGhpcyxFYT17dHlwZToiY2hhbmdlIn0sdmE9e3R5cGU6InN0YXJ0In0seGE9e3R5cGU6ImVuZCJ9LEFhPXtOT05FOi0xLFJPVEFURTowLERPTExZOjEsUEFOOjIsVE9VQ0hfUk9UQVRFOjMsVE9VQ0hfUEFOOjQsVE9VQ0hfRE9MTFlfUEFOOjUsVE9VQ0hfRE9MTFlfUk9UQVRFOjZ9LApGYT1BYS5OT05FLHlhPTFFLTYsU2E9bmV3IFRIUkVFLlNwaGVyaWNhbCxYYT1uZXcgVEhSRUUuU3BoZXJpY2FsLHViPTEsQmI9bmV3IFRIUkVFLlZlY3RvcjMscWI9ITEsemI9bmV3IFRIUkVFLlZlY3RvcjIsdmI9bmV3IFRIUkVFLlZlY3RvcjIsR2I9bmV3IFRIUkVFLlZlY3RvcjIsTmI9bmV3IFRIUkVFLlZlY3RvcjIsQWI9bmV3IFRIUkVFLlZlY3RvcjIsSGI9bmV3IFRIUkVFLlZlY3RvcjIsaWM9bmV3IFRIUkVFLlZlY3RvcjIsYmM9bmV3IFRIUkVFLlZlY3RvcjIsT2Q9bmV3IFRIUkVFLlZlY3RvcjIscmQ9ZnVuY3Rpb24oKXt2YXIgc2E9bmV3IFRIUkVFLlZlY3RvcjM7cmV0dXJuIGZ1bmN0aW9uKE1iLHdjKXtzYS5zZXRGcm9tTWF0cml4Q29sdW1uKHdjLDApO3NhLm11bHRpcGx5U2NhbGFyKC1NYik7QmIuYWRkKHNhKX19KCksTGM9ZnVuY3Rpb24oKXt2YXIgc2E9bmV3IFRIUkVFLlZlY3RvcjM7cmV0dXJuIGZ1bmN0aW9uKE1iLHdjKXshMD09PVkuc2NyZWVuU3BhY2VQYW5uaW5nPwpzYS5zZXRGcm9tTWF0cml4Q29sdW1uKHdjLDEpOihzYS5zZXRGcm9tTWF0cml4Q29sdW1uKHdjLDApLHNhLmNyb3NzVmVjdG9ycyhZLm9iamVjdC51cCxzYSkpO3NhLm11bHRpcGx5U2NhbGFyKE1iKTtCYi5hZGQoc2EpfX0oKSxzZD1mdW5jdGlvbigpe3ZhciBzYT1uZXcgVEhSRUUuVmVjdG9yMztyZXR1cm4gZnVuY3Rpb24oTWIsd2Mpe3ZhciBiZD1ZLmRvbUVsZW1lbnQ9PT1kb2N1bWVudD9ZLmRvbUVsZW1lbnQuYm9keTpZLmRvbUVsZW1lbnQ7aWYoWS5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYSl7c2EuY29weShZLm9iamVjdC5wb3NpdGlvbikuc3ViKFkudGFyZ2V0KTt2YXIgdGQ9c2EubGVuZ3RoKCk7dGQqPU1hdGgudGFuKFkub2JqZWN0LmZvdi8yKk1hdGguUEkvMTgwKTtyZCgyKk1iKnRkL2JkLmNsaWVudEhlaWdodCxZLm9iamVjdC5tYXRyaXgpO0xjKDIqd2MqdGQvYmQuY2xpZW50SGVpZ2h0LFkub2JqZWN0Lm1hdHJpeCl9ZWxzZSBZLm9iamVjdC5pc09ydGhvZ3JhcGhpY0NhbWVyYT8KKHJkKE1iKihZLm9iamVjdC5yaWdodC1ZLm9iamVjdC5sZWZ0KS9ZLm9iamVjdC56b29tL2JkLmNsaWVudFdpZHRoLFkub2JqZWN0Lm1hdHJpeCksTGMod2MqKFkub2JqZWN0LnRvcC1ZLm9iamVjdC5ib3R0b20pL1kub2JqZWN0Lnpvb20vYmQuY2xpZW50SGVpZ2h0LFkub2JqZWN0Lm1hdHJpeCkpOihjb25zb2xlLndhcm4oIldBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIHBhbiBkaXNhYmxlZC4iKSxZLmVuYWJsZVBhbj0hMSl9fSgpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJjb250ZXh0bWVudSIsa2EsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLFQsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsbGEsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaHN0YXJ0IixiYSwhMSk7WS5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoZW5kIiwKY2EsITEpO1kuZG9tRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLGVhLCExKTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsWiwhMSk7dGhpcy51cGRhdGUoKX07VEhSRUUuT3JiaXRDb250cm9scy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShUSFJFRS5FdmVudERpc3BhdGNoZXIucHJvdG90eXBlKTtUSFJFRS5PcmJpdENvbnRyb2xzLnByb3RvdHlwZS5jb25zdHJ1Y3Rvcj1USFJFRS5PcmJpdENvbnRyb2xzO1RIUkVFLk1hcENvbnRyb2xzPWZ1bmN0aW9uKGIsZCl7VEhSRUUuT3JiaXRDb250cm9scy5jYWxsKHRoaXMsYixkKTt0aGlzLm1vdXNlQnV0dG9ucy5MRUZUPVRIUkVFLk1PVVNFLlBBTjt0aGlzLm1vdXNlQnV0dG9ucy5SSUdIVD1USFJFRS5NT1VTRS5ST1RBVEU7dGhpcy50b3VjaGVzLk9ORT1USFJFRS5UT1VDSC5QQU47dGhpcy50b3VjaGVzLlRXTz1USFJFRS5UT1VDSC5ET0xMWV9ST1RBVEV9OwpUSFJFRS5NYXBDb250cm9scy5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShUSFJFRS5FdmVudERpc3BhdGNoZXIucHJvdG90eXBlKTtUSFJFRS5NYXBDb250cm9scy5wcm90b3R5cGUuY29uc3RydWN0b3I9VEhSRUUuTWFwQ29udHJvbHM7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9hcnJheS1idWZmZXItZGF0YS1wcm92aWRlci5qcwp2YXIgTGs7CihmdW5jdGlvbihiKXtiLkVycm9yQ29kZXM9e0NBTkNFTExFRDoxfTtjb25zdCBkPXtWRVJURVg6MSxGQUNFOjIsQ09MT1I6M30sZj17VkVSVEVYOiJmbG9hdDMyIixGQUNFOiJpbnQzMiIsQ09MT1I6InVpbnQ4In07Y2xhc3MgaHtjb25zdHJ1Y3RvcihrKXt0aGlzLl9yZXF1ZXN0TWFuYWdlcj1rO3RoaXMuX2NhbmNlbGxlcj1uZXcgdmMuQ2FuY2VsbGVyfXJlbG9hZChrLHQsbCl7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO3JldHVybiB0aGlzLl9mZXRjaE1ldGFkYXRhKGssdCxsKX1fZmV0Y2hEYXRhQnlTdGVwKGssdCxsLHAsbSxuKXtmdW5jdGlvbiBxKHUpe2xldCB4PVtdO2ZvcihsZXQgQT0wO0E8dS5sZW5ndGgvMztBKyspe2xldCB5PVtdO2ZvcihsZXQgdz0wOzM+dzt3KyspeS5wdXNoKHVbMypBK3ddKTt4LnB1c2goeSl9cmV0dXJuIHh9az12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgibWVzaCIsIi9kYXRhIixuZXcgVVJMU2VhcmNoUGFyYW1zKHt0YWc6dCxydW46aywKY29udGVudF90eXBlOmwsc2FtcGxlOnAsc3RlcDptfSkpO3Q9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKHU9PntpZih1LmNhbmNlbGxlZClyZXR1cm4gUHJvbWlzZS5yZWplY3Qoe2NvZGU6Yi5FcnJvckNvZGVzLkNBTkNFTExFRCxtZXNzYWdlOiJSZXNwb25zZSB3YXMgaW52YWxpZGF0ZWQuIn0pO3U9dS52YWx1ZTtzd2l0Y2gobCl7Y2FzZSAiVkVSVEVYIjpuLnZlcnRpY2VzPXEobmV3IEZsb2F0MzJBcnJheSh1KSk7YnJlYWs7Y2FzZSAiRkFDRSI6bi5mYWNlcz1xKG5ldyBJbnQzMkFycmF5KHUpKTticmVhaztjYXNlICJDT0xPUiI6bi5jb2xvcnM9cShuZXcgVWludDhBcnJheSh1KSl9cmV0dXJuIG59KTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIuZmV0Y2goayxudWxsLCJhcnJheWJ1ZmZlciIsZltsXSkudGhlbih1PT51LmFycmF5QnVmZmVyKCkpLnRoZW4odCl9ZmV0Y2hEYXRhKGssdCxsLHApe2xldCBtPVtdLG49bmV3IE1hcDtPYmplY3Qua2V5cyhkKS5mb3JFYWNoKHE9Pgp7ay5jb21wb25lbnRzJjE8PGRbcV0mJm0ucHVzaCh0aGlzLl9mZXRjaERhdGFCeVN0ZXAodCxsLHEscCxrLnN0ZXAsbikpfSk7cmV0dXJuIFByb21pc2UuYWxsKG0pfV9mZXRjaE1ldGFkYXRhKGssdCxsKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7az12Yy5nZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgibWVzaCIsIi9tZXNoZXMiLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3RhZzp0LHJ1bjprLHNhbXBsZTpsfSkpO3Q9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKHA9PnAuY2FuY2VsbGVkP1Byb21pc2UucmVqZWN0KHtjb2RlOmIuRXJyb3JDb2Rlcy5DQU5DRUxMRUQsbWVzc2FnZToiUmVzcG9uc2Ugd2FzIGludmFsaWRhdGVkLiJ9KTpwLnZhbHVlKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIuZmV0Y2goaykudGhlbihwPT5wLmpzb24oKSkudGhlbih0KS50aGVuKHRoaXMuX3Byb2Nlc3NNZXRhZGF0YS5iaW5kKHRoaXMpKX1fcHJvY2Vzc01ldGFkYXRhKGspe2lmKGspe3ZhciB0PQpuZXcgTWFwO2ZvcihsZXQgcD0wO3A8ay5sZW5ndGg7cCsrKXtsZXQgbT1rW3BdO3QuaGFzKG0uc3RlcCl8fHQuc2V0KG0uc3RlcCxbXSk7dC5nZXQobS5zdGVwKS5wdXNoKG0pfXZhciBsPVtdO3QuZm9yRWFjaChwPT57cD10aGlzLl9jcmVhdGVTdGVwRGF0dW0ocFswXSk7bC5wdXNoKHApfSk7cmV0dXJuIGx9fV9jcmVhdGVTdGVwRGF0dW0oayl7cmV0dXJue3dhbGxfdGltZTpuZXcgRGF0ZSgxRTMqay53YWxsX3RpbWUpLHN0ZXA6ay5zdGVwLGNvbmZpZzprLmNvbmZpZyxjb250ZW50X3R5cGU6ay5jb250ZW50X3R5cGUsY29tcG9uZW50czprLmNvbXBvbmVudHN9fX1iLkFycmF5QnVmZmVyRGF0YVByb3ZpZGVyPWh9KShMa3x8KExrPXt9KSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtaW1wb3J0cy9tZXNoLXZpZXdlci5qcwooZnVuY3Rpb24oYil7Y2xhc3MgZCBleHRlbmRzIFRIUkVFLkV2ZW50RGlzcGF0Y2hlcntjb25zdHJ1Y3RvcihmKXtzdXBlcigpO3RoaXMuX2xhc3RNZXNoPW51bGw7dGhpcy5fY2xvY2s9bmV3IFRIUkVFLkNsb2NrO3RoaXMuX2NhbnZhc1NpemU9bnVsbDt0aGlzLl9ydW5Db2xvcj1mfV9pc09iamVjdChmKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGYmJm51bGwhPWYmJiFBcnJheS5pc0FycmF5KGYpfV9hcHBseURlZmF1bHRzKGYsaCl7bGV0IGs9e307Zj1bZixoXTtmb3IoaD0wO2g8Zi5sZW5ndGg7aCsrKXtjb25zdCB0PWZbaF07Zm9yKGxldCBsIGluIHQpe2NvbnN0IHA9bCBpbiBrO3RoaXMuX2lzT2JqZWN0KHRbbF0pP2tbbF09dGhpcy5fYXBwbHlEZWZhdWx0cyhrW2xdfHx7fSx0W2xdKTpwfHwoa1tsXT10W2xdKX19cmV0dXJuIGt9X2NyZWF0ZVdvcmxkKGYsaCl7dGhpcy5pc1JlYWR5KCl8fCh0aGlzLl9zY2VuZT1uZXcgVEhSRUUuU2NlbmUsdGhpcy5fY2FtZXJhPWY9bmV3IFRIUkVFW2YuY2FtZXJhLmNsc10oZi5jYW1lcmEuZm92LAp0aGlzLl9jYW52YXNTaXplLndpZHRoL3RoaXMuX2NhbnZhc1NpemUuaGVpZ2h0LGYuY2FtZXJhLm5lYXIsZi5jYW1lcmEuZmFyKSxoPW5ldyBUSFJFRS5PcmJpdENvbnRyb2xzKGYsaCksaC5sb29rU3BlZWQ9LjQsaC5tb3ZlbWVudFNwZWVkPTIwLGgubm9GbHk9ITAsaC5sb29rVmVydGljYWw9ITAsaC5jb25zdHJhaW5WZXJ0aWNhbD0hMCxoLnZlcnRpY2FsTWluPTEsaC52ZXJ0aWNhbE1heD0yLGguYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIix0aGlzLl9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlLmJpbmQodGhpcykpLHRoaXMuX2NhbWVyYUNvbnRyb2xzPWgsdGhpcy5fcmVuZGVyZXI9bmV3IFRIUkVFLldlYkdMUmVuZGVyZXIoe2FudGlhbGlhczohMH0pLHRoaXMuX3JlbmRlcmVyLnNldFBpeGVsUmF0aW8oKSx0aGlzLl9yZW5kZXJlci5zZXRTaXplKHRoaXMuX2NhbnZhc1NpemUud2lkdGgsdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQpLHRoaXMuX3JlbmRlcmVyLnNldENsZWFyQ29sb3IoMTY3NzcyMTUsCjEpKX1fY2xlYXJTY2VuZSgpe2Zvcig7MDx0aGlzLl9zY2VuZS5jaGlsZHJlbi5sZW5ndGg7KXRoaXMuX3NjZW5lLnJlbW92ZSh0aGlzLl9zY2VuZS5jaGlsZHJlblswXSl9Z2V0UmVuZGVyZXIoKXtyZXR1cm4gdGhpcy5fcmVuZGVyZXJ9Z2V0Q2FtZXJhQ29udHJvbHMoKXtyZXR1cm4gdGhpcy5fY2FtZXJhQ29udHJvbHN9aXNSZWFkeSgpe3JldHVybiEhdGhpcy5fY2FtZXJhJiYhIXRoaXMuX2NhbWVyYUNvbnRyb2xzfWdldENhbWVyYVBvc2l0aW9uKCl7cmV0dXJue2Zhcjp0aGlzLl9jYW1lcmEuZmFyLHBvc2l0aW9uOnRoaXMuX2NhbWVyYS5wb3NpdGlvbi5jbG9uZSgpLHRhcmdldDp0aGlzLl9jYW1lcmFDb250cm9scy50YXJnZXQuY2xvbmUoKX19c2V0Q2FudmFzU2l6ZShmKXt0aGlzLl9jYW52YXNTaXplPWZ9ZHJhdygpe3RoaXMuX2FuaW1hdGlvbkZyYW1lSW5kZXgmJmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2FuaW1hdGlvbkZyYW1lSW5kZXgpO3RoaXMuX2NhbWVyYS5hc3BlY3Q9CnRoaXMuX2NhbnZhc1NpemUud2lkdGgvdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQ7dGhpcy5fY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTt0aGlzLl9yZW5kZXJlci5zZXRTaXplKHRoaXMuX2NhbnZhc1NpemUud2lkdGgsdGhpcy5fY2FudmFzU2l6ZS5oZWlnaHQpO2NvbnN0IGY9ZnVuY3Rpb24oKXt2YXIgaD10aGlzLl9jbG9jay5nZXREZWx0YSgpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZShoKTt0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4PXJlcXVlc3RBbmltYXRpb25GcmFtZShmKTt0aGlzLl9yZW5kZXJlci5yZW5kZXIodGhpcy5fc2NlbmUsdGhpcy5fY2FtZXJhKX0uYmluZCh0aGlzKTtmKCl9dXBkYXRlU2NlbmUoZixoKXtsZXQgaz17fTsiY29uZmlnImluIGYmJmYuY29uZmlnJiYoaz1KU09OLnBhcnNlKGYuY29uZmlnKSk7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJiZWZvcmVVcGRhdGVTY2VuZSJ9KTtrPXRoaXMuX2FwcGx5RGVmYXVsdHMoayx7Y2FtZXJhOntjbHM6IlBlcnNwZWN0aXZlQ2FtZXJhIiwKZm92Ojc1LG5lYXI6LjEsZmFyOjFFM30sbGlnaHRzOlt7Y2xzOiJBbWJpZW50TGlnaHQiLGNvbG9yOiIjZmZmZmZmIixpbnRlbnNpdHk6Ljc1fSx7Y2xzOiJEaXJlY3Rpb25hbExpZ2h0Iixjb2xvcjoiI2ZmZmZmZiIsaW50ZW5zaXR5Oi43NSxwb3NpdGlvbjpbMCwtMSwyXX1dfSk7dGhpcy5fY3JlYXRlV29ybGQoayxoKTt0aGlzLl9jbGVhclNjZW5lKCk7dGhpcy5fY3JlYXRlTGlnaHRzKHRoaXMuX3NjZW5lLGspO3RoaXMuX2NyZWF0ZUdlb21ldHJ5KGYsayk7dGhpcy5kcmF3KCl9cmVzZXRWaWV3KCl7aWYodGhpcy5pc1JlYWR5KCkpe3RoaXMuX2NhbWVyYUNvbnRyb2xzLnJlc2V0KCk7aWYoIWYmJnRoaXMuX2xhc3RNZXNoKXZhciBmPXRoaXMuX2xhc3RNZXNoO2YmJih0aGlzLl9maXRPYmplY3RUb1ZpZXdwb3J0KGYpLHRoaXMuX2xhc3RNZXNoPWYpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnVwZGF0ZSgpfX1fY3JlYXRlR2VvbWV0cnkoZixoKXtmPWYubWVzaDtmLnZlcnRpY2VzJiZmLmZhY2VzJiYKZi5mYWNlcy5sZW5ndGg/dGhpcy5fY3JlYXRlTWVzaChmLGgpOnRoaXMuX2NyZWF0ZVBvaW50Q2xvdWQoZixoKX1fY3JlYXRlUG9pbnRDbG91ZChmLGgpe3ZhciBrPWYudmVydGljZXM7Zj1mLmNvbG9ycztsZXQgdD17bWF0ZXJpYWw6e2NsczoiUG9pbnRzTWF0ZXJpYWwiLHNpemU6LjAwNX19O2YmJmYubGVuZ3RoPT1rLmxlbmd0aD90Lm1hdGVyaWFsLnZlcnRleENvbG9ycz1USFJFRS5WZXJ0ZXhDb2xvcnM6dC5tYXRlcmlhbC5jb2xvcj10aGlzLl9ydW5Db2xvcjtoPXRoaXMuX2FwcGx5RGVmYXVsdHMoaCx0KTt2YXIgbD1uZXcgVEhSRUUuR2VvbWV0cnk7ay5mb3JFYWNoKGZ1bmN0aW9uKHApe3ZhciBtPW5ldyBUSFJFRS5WZWN0b3IzKHBbMF0scFsxXSxwWzJdKTttLng9MSpwWzBdO20ueT0xKnBbMV07bS56PTEqcFsyXTtsLnZlcnRpY2VzLnB1c2gobSl9KTtmJiZmLmxlbmd0aD09ay5sZW5ndGgmJmYuZm9yRWFjaChmdW5jdGlvbihwKXtwPW5ldyBUSFJFRS5Db2xvcihwWzBdLzI1NSwKcFsxXS8yNTUscFsyXS8yNTUpO2wuY29sb3JzLnB1c2gocCl9KTtrPW5ldyBUSFJFRVtoLm1hdGVyaWFsLmNsc10oaC5tYXRlcmlhbCk7az1uZXcgVEhSRUUuUG9pbnRzKGwsayk7dGhpcy5fc2NlbmUuYWRkKGspO3RoaXMuX2xhc3RNZXNoPWt9c2V0Q2FtZXJhVmlld3BvaW50KGYsaCxrKXt0aGlzLl9zaWxlbnQ9ITA7dGhpcy5fY2FtZXJhLmZhcj1oO3RoaXMuX2NhbWVyYS5wb3NpdGlvbi5zZXQoZi54LGYueSxmLnopO3RoaXMuX2NhbWVyYS5sb29rQXQoay5jbG9uZSgpKTt0aGlzLl9jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpO3RoaXMuX2NhbWVyYUNvbnRyb2xzLnRhcmdldD1rLmNsb25lKCk7dGhpcy5fY2FtZXJhQ29udHJvbHMudXBkYXRlKCk7dGhpcy5fc2lsZW50PSExfV9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlKGYpe3RoaXMuX3NpbGVudHx8dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJjYW1lcmFQb3NpdGlvbkNoYW5nZSIsZXZlbnQ6Zn0pfV9maXRPYmplY3RUb1ZpZXdwb3J0KGYpe3ZhciBoPQpuZXcgVEhSRUUuQm94MztoLnNldEZyb21PYmplY3QoZik7Zj1oLmNlbnRlcigpO3ZhciBrPWguc2l6ZSgpO2s9MS4yNSpNYXRoLmFicyhNYXRoLm1heChrLngsay55LGsueikvKDIqTWF0aC50YW4oTWF0aC5QSS8xODAqdGhpcy5fY2FtZXJhLmZvdi8yKSkpO2g9aC5taW4uejt0aGlzLnNldENhbWVyYVZpZXdwb2ludCh7eDpmLngseTpmLnksejprfSwzKigwPmg/LWgrazprLWgpLGYpfV9jcmVhdGVNZXNoKGYsaCl7dmFyIGs9Zi52ZXJ0aWNlcztjb25zdCB0PWYuZmFjZXMsbD1mLmNvbG9ycztmPXRoaXMuX2FwcGx5RGVmYXVsdHMoaCx7bWF0ZXJpYWw6e2NsczoiTWVzaFN0YW5kYXJkTWF0ZXJpYWwiLGNvbG9yOiIjYTBhMGEwIixyb3VnaG5lc3M6MSxtZXRhbG5lc3M6MH19KTtsZXQgcD1uZXcgVEhSRUUuR2VvbWV0cnk7ay5mb3JFYWNoKGZ1bmN0aW9uKG0pe2xldCBuPW5ldyBUSFJFRS5WZWN0b3IzKG1bMF0sbVsxXSxtWzJdKTtuLng9MSptWzBdO24ueT0xKm1bMV07bi56PTEqbVsyXTsKcC52ZXJ0aWNlcy5wdXNoKG4pfSk7dC5mb3JFYWNoKGZ1bmN0aW9uKG0pe2xldCBuPW5ldyBUSFJFRS5GYWNlMyhtWzBdLG1bMV0sbVsyXSk7aWYobCYmbC5sZW5ndGgpe209W2xbbVswXV0sbFttWzFdXSxsW21bMl1dXTtmb3IobGV0IHU9MDt1PG0ubGVuZ3RoO3UrKyl7dmFyIHE9bVt1XTtxPW5ldyBUSFJFRS5Db2xvcihxWzBdLzI1NSxxWzFdLzI1NSxxWzJdLzI1NSk7bi52ZXJ0ZXhDb2xvcnMucHVzaChxKX19cC5mYWNlcy5wdXNoKG4pfSk7bCYmbC5sZW5ndGgmJihmLm1hdGVyaWFsPWYubWF0ZXJpYWx8fHt9LGYubWF0ZXJpYWwudmVydGV4Q29sb3JzPVRIUkVFLlZlcnRleENvbG9ycyk7cC5jZW50ZXIoKTtwLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpO3AuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTtrPW5ldyBUSFJFRVtmLm1hdGVyaWFsLmNsc10oZi5tYXRlcmlhbCk7az1uZXcgVEhSRUUuTWVzaChwLGspO2suY2FzdFNoYWRvdz0hMDtrLnJlY2VpdmVTaGFkb3c9ITA7dGhpcy5fc2NlbmUuYWRkKGspOwp0aGlzLl9sYXN0TWVzaD1rfV9jcmVhdGVMaWdodHMoZixoKXtmb3IobGV0IGs9MDtrPGgubGlnaHRzLmxlbmd0aDtrKyspe2NvbnN0IHQ9aC5saWdodHNba107bGV0IGw9bmV3IFRIUkVFW3QuY2xzXSh0LmNvbG9yLHQuaW50ZW5zaXR5KTt0LnBvc2l0aW9uJiZsLnBvc2l0aW9uLnNldCh0LnBvc2l0aW9uWzBdLHQucG9zaXRpb25bMV0sdC5wb3NpdGlvblsyXSk7Zi5hZGQobCl9fX1iLk1lc2hWaWV3ZXI9ZH0pKExrfHwoTGs9e30pKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1tZXNoLWRhc2hib2FyZC9tZXNoLWxvYWRlci5qcwooZnVuY3Rpb24oYil7UG9seW1lcih7aXM6InRmLW1lc2gtbG9hZGVyIixwcm9wZXJ0aWVzOntydW46U3RyaW5nLHRhZzpTdHJpbmcsc2FtcGxlOk51bWJlcixvZlNhbXBsZXM6TnVtYmVyLHNlbGVjdGVkVmlldzp7dHlwZTpTdHJpbmcsdmFsdWU6ImFsbCJ9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxyZXF1ZXN0TWFuYWdlcjpPYmplY3QsX21lc2hWaWV3ZXI6e3R5cGU6T2JqZWN0fSxfZGF0YVByb3ZpZGVyOnt0eXBlOk9iamVjdH0sX2NvbG9yU2NhbGVGdW5jdGlvbjp7dHlwZTpPYmplY3QsdmFsdWU6KCk9PnBmLnJ1bnNDb2xvclNjYWxlfSxfcnVuQ29sb3I6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkNvbG9yKHJ1bikifSxfc3RlcHM6e3R5cGU6QXJyYXksdmFsdWU6KCk9PltdLG5vdGlmeTohMH0sX3N0ZXBJbmRleDp7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSxfY3VycmVudFN0ZXA6e3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRTdGVwKF9zdGVwcywgX3N0ZXBJbmRleCkifSwKX21lc2hWaWV3ZXJBdHRhY2hlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfY2FtZXJhUG9zaXRpb25Jbml0aWFsaXplZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfc3RlcFZhbHVlOnt0eXBlOk51bWJlcixjb21wdXRlZDoiX2NvbXB1dGVTdGVwVmFsdWUoX2N1cnJlbnRTdGVwKSJ9LF9jdXJyZW50V2FsbFRpbWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZUN1cnJlbnRXYWxsVGltZShfY3VycmVudFN0ZXApIn0sX2lzTWVzaExvYWRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LG9ic2VydmVyczpbInJlbG9hZChydW4sIHRhZywgYWN0aXZlLCBfZGF0YVByb3ZpZGVyLCBfbWVzaFZpZXdlcikiLCJfdXBkYXRlU2NlbmUoX2N1cnJlbnRTdGVwLiosIF9tZXNoVmlld2VyKSIsIl9kZWJvdW5jZWRGZXRjaE1lc2goX2N1cnJlbnRTdGVwKSIsIl91cGRhdGVWaWV3KHNlbGVjdGVkVmlldykiXSxfY29tcHV0ZVJ1bkNvbG9yOmZ1bmN0aW9uKGQpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlRnVuY3Rpb24oZCl9LAphdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2RhdGFQcm92aWRlcj1uZXcgYi5BcnJheUJ1ZmZlckRhdGFQcm92aWRlcih0aGlzLnJlcXVlc3RNYW5hZ2VyKTtjb25zdCBkPW5ldyBiLk1lc2hWaWV3ZXIodGhpcy5fcnVuQ29sb3IpO2QuYWRkRXZlbnRMaXN0ZW5lcigiYmVmb3JlVXBkYXRlU2NlbmUiLHRoaXMuX3VwZGF0ZUNhbnZhc1NpemUuYmluZCh0aGlzKSk7ZC5hZGRFdmVudExpc3RlbmVyKCJjYW1lcmFQb3NpdGlvbkNoYW5nZSIsdGhpcy5fb25DYW1lcmFQb3NpdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTt0aGlzLl9tZXNoVmlld2VyPWR9LHJlbG9hZDpmdW5jdGlvbigpe3RoaXMuYWN0aXZlJiZ0aGlzLl9kYXRhUHJvdmlkZXImJih0aGlzLnNldCgiX2lzTWVzaExvYWRpbmciLCEwKSx0aGlzLl9kYXRhUHJvdmlkZXIucmVsb2FkKHRoaXMucnVuLHRoaXMudGFnLHRoaXMuc2FtcGxlKS50aGVuKGQ9PntkJiYodGhpcy5zZXQoIl9zdGVwcyIsZCksdGhpcy5zZXQoIl9zdGVwSW5kZXgiLApkLmxlbmd0aC0xKSl9KS5jYXRjaChkPT57aWYoIWR8fCFkLmNvZGV8fGQuY29kZSE9Yi5FcnJvckNvZGVzLkNBTkNFTExFRCl0aHJvdyBFcnJvcihkfHwiUmVzcG9uc2UgcHJvY2Vzc2luZyBmYWlsZWQuIik7fSkpfSxfdXBkYXRlU2NlbmU6ZnVuY3Rpb24oKXtjb25zdCBkPXRoaXMuX2N1cnJlbnRTdGVwO2QmJmQubWVzaCYmKHRoaXMuX21lc2hWaWV3ZXIudXBkYXRlU2NlbmUoZCx0aGlzKSx0aGlzLl9jYW1lcmFQb3NpdGlvbkluaXRpYWxpemVkfHwodGhpcy5fbWVzaFZpZXdlci5yZXNldFZpZXcoKSx0aGlzLl9jYW1lcmFQb3NpdGlvbkluaXRpYWxpemVkPSEwKSx0aGlzLl9tZXNoVmlld2VyQXR0YWNoZWR8fCh0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5fbWVzaFZpZXdlci5nZXRSZW5kZXJlcigpLmRvbUVsZW1lbnQpLHRoaXMuX21lc2hWaWV3ZXJBdHRhY2hlZD0hMCkpfSxfZGVib3VuY2VkRmV0Y2hNZXNoKCl7dGhpcy5kZWJvdW5jZSgiZmV0Y2hNZXNoIiwoKT0+dGhpcy5fbWF5YmVGZXRjaE1lc2goKSwKMTAwKX0sX21heWJlRmV0Y2hNZXNoKCl7Y29uc3QgZD10aGlzO3JldHVybiBoYyhmdW5jdGlvbiooKXtjb25zdCBmPWQuX2N1cnJlbnRTdGVwO2lmKGYmJiFmLm1lc2gmJiFmLm1lc2hGZXRjaGluZyl7Zi5tZXNoRmV0Y2hpbmc9ITA7ZC5faXNNZXNoTG9hZGluZz0hMDt0cnl7Y29uc3QgaD15aWVsZCBkLl9kYXRhUHJvdmlkZXIuZmV0Y2hEYXRhKGYsZC5ydW4sZC50YWcsZC5zYW1wbGUpO2YubWVzaD1oWzBdO2Qubm90aWZ5UGF0aCgiX2N1cnJlbnRTdGVwLm1lc2giKX1jYXRjaChoKXtpZighaHx8IWguY29kZXx8aC5jb2RlIT1iLkVycm9yQ29kZXMuQ0FOQ0VMTEVEKXRocm93IGg9aHx8IlJlc3BvbnNlIHByb2Nlc3NpbmcgZmFpbGVkLiIsRXJyb3IoaCk7fWZpbmFsbHl7ZC5faXNNZXNoTG9hZGluZz0hMSxmLm1lc2hGZXRjaGluZz0hMX19fSl9LF9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7aWYodGhpcy5fbWVzaFZpZXdlci5pc1JlYWR5KCkpe3ZhciBkPW5ldyBDdXN0b21FdmVudCgiY2FtZXJhLXBvc2l0aW9uLWNoYW5nZSIsCntkZXRhaWw6dGhpcy5fbWVzaFZpZXdlci5nZXRDYW1lcmFQb3NpdGlvbigpfSk7dGhpcy5kaXNwYXRjaEV2ZW50KGQpfX0sc2V0Q2FtZXJhVmlld3BvaW50OmZ1bmN0aW9uKGQsZixoKXt0aGlzLl9tZXNoVmlld2VyLnNldENhbWVyYVZpZXdwb2ludChkLGYsaCl9LF91cGRhdGVDYW52YXNTaXplOmZ1bmN0aW9uKCl7Y29uc3QgZD10aGlzLm9mZnNldFdpZHRoLGY9dGhpcy4kJCgiLnRmLW1lc2gtbG9hZGVyLWhlYWRlciIpLm9mZnNldEhlaWdodDt0aGlzLl9tZXNoVmlld2VyLnNldENhbnZhc1NpemUoe3dpZHRoOmQsaGVpZ2h0OmQtZn0pfSxyZWRyYXc6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVDYW52YXNTaXplKCk7dGhpcy5pc0Nvbm5lY3RlZCYmdGhpcy5fbWVzaFZpZXdlci5kcmF3KCl9LF9oYXNBdExlYXN0T25lU3RlcDpmdW5jdGlvbihkKXtyZXR1cm4hIWQmJjA8ZC5sZW5ndGh9LF9oYXNNdWx0aXBsZVN0ZXBzOmZ1bmN0aW9uKGQpe3JldHVybiEhZCYmMTxkLmxlbmd0aH0sX2NvbXB1dGVDdXJyZW50U3RlcDpmdW5jdGlvbihkLApmKXtyZXR1cm4gZFtmXXx8bnVsbH0sX2NvbXB1dGVTdGVwVmFsdWU6ZnVuY3Rpb24oZCl7cmV0dXJuIGQ/ZC5zdGVwOjB9LF9jb21wdXRlQ3VycmVudFdhbGxUaW1lOmZ1bmN0aW9uKGQpe3JldHVybiBkP0hoLmZvcm1hdERhdGUoZC53YWxsX3RpbWUpOiIifSxfZ2V0TWF4U3RlcEluZGV4OmZ1bmN0aW9uKGQpe3JldHVybiBkLmxlbmd0aC0xfSxfZ2V0U2FtcGxlVGV4dDpmdW5jdGlvbihkKXtyZXR1cm4gU3RyaW5nKGQrMSl9LF9oYXNNdWx0aXBsZVNhbXBsZXM6ZnVuY3Rpb24oZCl7cmV0dXJuIDE8ZH0sX3VwZGF0ZVZpZXc6ZnVuY3Rpb24oZCl7dGhpcy5fbWVzaFZpZXdlciYmImFsbCI9PWQmJnRoaXMuX21lc2hWaWV3ZXIucmVzZXRWaWV3KCl9LHRvTG9jYWxlU3RyaW5nXzpmdW5jdGlvbihkKXtyZXR1cm4gZC50b0xvY2FsZVN0cmluZygpfX0pfSkoTGt8fChMaz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLW1lc2gtZGFzaGJvYXJkL3RmLW1lc2gtZGFzaGJvYXJkLmh0bWwuanMKKGZ1bmN0aW9uKCl7UG9seW1lcih7aXM6Im1lc2gtZGFzaGJvYXJkIixwcm9wZXJ0aWVzOntfc2VsZWN0ZWRSdW5zOkFycmF5LF9ydW5Ub1RhZ0luZm86T2JqZWN0LF9kYXRhTm90Rm91bmQ6Qm9vbGVhbixfdGFnRmlsdGVyOnt0eXBlOlN0cmluZyx2YWx1ZToiLioifSxfc2VsZWN0ZWRWaWV3Ont0eXBlOlN0cmluZyxub3RpZnk6ITAsdmFsdWU6ImFsbCJ9LF9jYXRlZ29yaWVzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfbWFrZUNhdGVnb3JpZXMoX3J1blRvVGFnSW5mbywgX3NlbGVjdGVkUnVucywgX3RhZ0ZpbHRlcikifSxfcmVxdWVzdE1hbmFnZXI6e3R5cGU6T2JqZWN0LHZhbHVlOigpPT5uZXcgdmMuUmVxdWVzdE1hbmFnZXJ9fSxyZWFkeSgpe3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJyZXNpemUiLCgpPT57dGhpcy5faGFuZGxlV2luZG93UmVzaXplKCl9LCExKTt0aGlzLnJlbG9hZCgpfSxfZ2V0QWxsQ2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLW1lc2gtbG9hZGVyIil9LApfb25DYW1lcmFQb3NpdGlvbkNoYW5nZWQoYil7InNoYXJlIj09dGhpcy5fc2VsZWN0ZWRWaWV3JiZ0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goZD0+e2IudGFyZ2V0IT1kJiZkLnNldENhbWVyYVZpZXdwb2ludChiLmRldGFpbC5wb3NpdGlvbixiLmRldGFpbC5mYXIsYi5kZXRhaWwudGFyZ2V0KX0pfSxfc2hvdWxkT3BlbihiKXtyZXR1cm4gMj49Yn0scmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbih0aGlzLl9yZWxvYWRNZXNoZXMuYmluZCh0aGlzKSl9LF9oYW5kbGVXaW5kb3dSZXNpemUoKXt0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goYj0+e2IucmVkcmF3KCl9KX0sX2ZldGNoVGFncygpe2NvbnN0IGI9dmMuZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoIm1lc2giLCIvdGFncyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGIpLnRoZW4oZD0+e2lmKCFfLmlzRXF1YWwoZCx0aGlzLl9ydW5Ub1RhZ0luZm8pKXt2YXIgZj1fLm1hcFZhbHVlcyhkLApoPT5PYmplY3Qua2V5cyhoKSk7Zj12Yy5nZXRUYWdzKGYpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09Zi5sZW5ndGgpO3RoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIixkKX19KX0sX3JlbG9hZE1lc2hlcygpe3RoaXMuX2dldEFsbENoaWxkcmVuKCkuZm9yRWFjaChiPT57Yi5yZWxvYWQoKX0pfSxfbWFrZUNhdGVnb3JpZXMoYixkLGYpe2Z1bmN0aW9uIGgodCl7Y29uc3QgbD1iW3QucnVuXVt0LnRhZ10uc2FtcGxlcztyZXR1cm4gXy5yYW5nZShsKS5tYXAocD0+T2JqZWN0LmFzc2lnbih7fSx0LHtzYW1wbGU6cCxvZlNhbXBsZXM6bH0pKX1jb25zdCBrPV8ubWFwVmFsdWVzKGIsdD0+T2JqZWN0LmtleXModCkpO3JldHVybiAkYy5jYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKGssZCxmKS5tYXAodD0+T2JqZWN0LmFzc2lnbih7fSx0LHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sdC5pdGVtcy5tYXAoaCkpfSkpfX0pfSkoKTsKCi8vIyBzb3VyY2VVUkw9YnVpbGQ6Ly90Zi1wbHVnaW4tdXRpbC9tZXNzYWdlLmpzClVpPXRoaXMmJnRoaXMuX19hd2FpdGVyfHxmdW5jdGlvbihiLGQsZixoKXtyZXR1cm4gbmV3IChmfHwoZj1Qcm9taXNlKSkoZnVuY3Rpb24oayx0KXtmdW5jdGlvbiBsKG4pe3RyeXttKGgubmV4dChuKSl9Y2F0Y2gocSl7dChxKX19ZnVuY3Rpb24gcChuKXt0cnl7bShoWyJ0aHJvdyJdKG4pKX1jYXRjaChxKXt0KHEpfX1mdW5jdGlvbiBtKG4pe24uZG9uZT9rKG4udmFsdWUpOihuZXcgZihmdW5jdGlvbihxKXtxKG4udmFsdWUpfSkpLnRoZW4obCxwKX1tKChoPWguYXBwbHkoYixkfHxbXSkpLm5leHQoKSl9KX07dmFyIE1rOwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpeyhmdW5jdGlvbihmKXtjbGFzcyBoe2NvbnN0cnVjdG9yKGspe3RoaXMucG9ydD1rO3RoaXMuaWQ9MDt0aGlzLnJlc3BvbnNlV2FpdHM9bmV3IE1hcDt0aGlzLmxpc3RlbmVycz1uZXcgTWFwO3RoaXMucG9ydC5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIix0PT50aGlzLm9uTWVzc2FnZSh0KSl9bGlzdGVuKGssdCl7dGhpcy5saXN0ZW5lcnMuc2V0KGssdCl9dW5saXN0ZW4oayl7dGhpcy5saXN0ZW5lcnMuZGVsZXRlKGspfW9uTWVzc2FnZShrKXtyZXR1cm4gVWkodGhpcyx2b2lkIDAsdm9pZCAwLGZ1bmN0aW9uKigpe3ZhciB0PUpTT04ucGFyc2Uoay5kYXRhKTtjb25zdCBsPXQudHlwZSxwPXQuaWQsbT10LnBheWxvYWQ7dmFyIG49dC5lcnJvcjtpZih0LmlzUmVwbHkpe2lmKHRoaXMucmVzcG9uc2VXYWl0cy5oYXMocCkpe3ZhciB7cmVzb2x2ZTpxLHJlamVjdDp1fT10aGlzLnJlc3BvbnNlV2FpdHMuZ2V0KHApO3RoaXMucmVzcG9uc2VXYWl0cy5kZWxldGUocCk7Cm4/dShFcnJvcihuKSk6cShtKX19ZWxzZXtuPXQ9bnVsbDtpZih0aGlzLmxpc3RlbmVycy5oYXMobCkpe2NvbnN0IHg9dGhpcy5saXN0ZW5lcnMuZ2V0KGwpO3RyeXt0PXlpZWxkIHgobSl9Y2F0Y2goQSl7bj1BfX10aGlzLnBvc3RNZXNzYWdlKHtbInR5cGUiXTpsLFsiaWQiXTpwLFsicGF5bG9hZCJdOnQsWyJlcnJvciJdOm4sWyJpc1JlcGx5Il06ITB9KX19KX1wb3N0TWVzc2FnZShrKXt0aGlzLnBvcnQucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkoaykpfXNlbmRNZXNzYWdlKGspe2NvbnN0IHQ9dGhpcy5pZCsrO3RoaXMucG9zdE1lc3NhZ2Uoe3R5cGU6ImV4cGVyaW1lbnRhbC5SdW5zQ2hhbmdlZCIsaWQ6dCxwYXlsb2FkOmssZXJyb3I6bnVsbCxpc1JlcGx5OiExfSk7cmV0dXJuIG5ldyBQcm9taXNlKChsLHApPT57dGhpcy5yZXNwb25zZVdhaXRzLnNldCh0LHtyZXNvbHZlOmwscmVqZWN0OnB9KX0pfX1mLklQQz1ofSkoZC5ET19OT1RfVVNFX0lOVEVSTkFMfHwoZC5ET19OT1RfVVNFX0lOVEVSTkFMPQp7fSkpfSkoYi5saWJ8fChiLmxpYj17fSkpfSkoTWt8fChNaz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBsdWdpbi11dGlsL3BsdWdpbi1ob3N0LWlwYy5qcwooZnVuY3Rpb24oYil7KGZ1bmN0aW9uKGQpe2Z1bmN0aW9uIGYobSxuKXtjb25zdCBxPW5ldyBiLmxpYi5ET19OT1RfVVNFX0lOVEVSTkFMLklQQyhtKTt0LmFkZChxKTtwLnNldChxLG4pO20uc3RhcnQoKTtmb3IoY29uc3QgW3UseF1vZiBsKW09aCh4LHEpLHEubGlzdGVuKHUsbSl9ZnVuY3Rpb24gaChtLG4pe3JldHVybiBxPT57dmFyIHU9cC5nZXQobik7dT1rLmdldCh1KXx8bnVsbDtyZXR1cm4gbSh1LHEpfX1kLnJlZ2lzdGVyUGx1Z2luSWZyYW1lPWZ1bmN0aW9uKG0sbil7ay5zZXQobSx7cGx1Z2luTmFtZTpufSl9O2NvbnN0IGs9bmV3IFdlYWtNYXAsdD1uZXcgU2V0LGw9bmV3IE1hcCxwPW5ldyBNYXA7d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG09PntpZigiZXhwZXJpbWVudGFsLmJvb3RzdHJhcCI9PT1tLmRhdGEpe3ZhciBuPW0ucG9ydHNbMF07biYmKG09bS5zb3VyY2U/bS5zb3VyY2UuZnJhbWVFbGVtZW50Om51bGwpJiZmKG4sbSl9fSk7ZC5icm9hZGNhc3Q9CmZ1bmN0aW9uKCl7dmFyIG09dmMucnVuc1N0b3JlLmdldFJ1bnMoKTtmb3IodmFyIG4gb2YgdClwLmdldChuKS5pc0Nvbm5lY3RlZHx8KHQuZGVsZXRlKG4pLHAuZGVsZXRlKG4pKTtuPVsuLi50XS5tYXAocT0+cS5zZW5kTWVzc2FnZShtKSk7cmV0dXJuIFByb21pc2UuYWxsKG4pfTtkLmxpc3Rlbj1mdW5jdGlvbihtLG4pe2wuc2V0KG0sbik7Zm9yKGNvbnN0IHEgb2YgdCl7Y29uc3QgdT1oKG4scSk7cS5saXN0ZW4obSx1KX19O2QudW5saXN0ZW49ZnVuY3Rpb24obSl7bC5kZWxldGUobSk7Zm9yKGNvbnN0IG4gb2YgdCluLnVubGlzdGVuKG0pfX0pKGIuaG9zdHx8KGIuaG9zdD17fSkpfSkoTWt8fChNaz17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBsdWdpbi11dGlsL2NvcmUtaG9zdC1pbXBsLmpzCk1rLmhvc3QubGlzdGVuKCJleHBlcmltZW50YWwuR2V0VVJMUGx1Z2luRGF0YSIsYj0+e2lmKGIpe2I9YHAuJHtiLnBsdWdpbk5hbWV9LmA7dmFyIGQ9e307Zm9yKGxldCBmIGluIHBkLnVybERpY3QpZi5zdGFydHNXaXRoKGIpJiYoZFtmLnN1YnN0cmluZyhiLmxlbmd0aCldPXBkLnVybERpY3RbZl0pO3JldHVybiBkfX0pOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXBsdWdpbi11dGlsL3J1bnMtaG9zdC1pbXBsLmpzCk1rLmhvc3QubGlzdGVuKCJleHBlcmltZW50YWwuR2V0UnVucyIsKCk9PnZjLnJ1bnNTdG9yZS5nZXRSdW5zKCkpO3ZjLnJ1bnNTdG9yZS5hZGRMaXN0ZW5lcigoKT0+TWsuaG9zdC5icm9hZGNhc3QoKSk7CgovLyMgc291cmNlVVJMPWJ1aWxkOi8vdGYtdGVuc29yYm9hcmQvYXV0b1JlbG9hZEJlaGF2aW9yLmpzCihmdW5jdGlvbihiKXtmdW5jdGlvbiBkKCl7cmV0dXJuKG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkpLmhhcygiX0Rpc2FibGVBdXRvUmVsb2FkIil9Yi5BVVRPUkVMT0FEX0xPQ0FMU1RPUkFHRV9LRVk9IlRGLlRlbnNvckJvYXJkLmF1dG9SZWxvYWRFbmFibGVkIjtiLkF1dG9SZWxvYWRCZWhhdmlvcj17cHJvcGVydGllczp7YXV0b1JlbG9hZEVuYWJsZWQ6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2F1dG9SZWxvYWRPYnNlcnZlciIsdmFsdWU6KCk9Pnt2YXIgZj13aW5kb3cubG9jYWxTdG9yYWdlLmdldEl0ZW0oYi5BVVRPUkVMT0FEX0xPQ0FMU1RPUkFHRV9LRVkpO3JldHVybiJ0cnVlIj09PWZ8fG51bGw9PWZ9fSxfYXV0b1JlbG9hZElkOnt0eXBlOk51bWJlcn0sX21pc3NlZEF1dG9SZWxvYWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2JvdW5kSGFuZGxlVmlzaWJpbGl0eUNoYW5nZTp7dHlwZTpPYmplY3R9LGF1dG9SZWxvYWRJbnRlcnZhbFNlY3M6e3R5cGU6TnVtYmVyLAp2YWx1ZTozMH19LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYm91bmRIYW5kbGVWaXNpYmlsaXR5Q2hhbmdlPXRoaXMuX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2UuYmluZCh0aGlzKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9ib3VuZEhhbmRsZVZpc2liaWxpdHlDaGFuZ2UpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3dpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXV0b1JlbG9hZElkKTtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9ib3VuZEhhbmRsZVZpc2liaWxpdHlDaGFuZ2UpfSxfYXV0b1JlbG9hZE9ic2VydmVyOmZ1bmN0aW9uKGYpe3dpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShiLkFVVE9SRUxPQURfTE9DQUxTVE9SQUdFX0tFWSxmKTtmJiYhZCgpP3RoaXMuX2F1dG9SZWxvYWRJZD13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5fZG9BdXRvUmVsb2FkKCksMUUzKnRoaXMuYXV0b1JlbG9hZEludGVydmFsU2Vjcyk6CndpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5fYXV0b1JlbG9hZElkKX0sX2RvQXV0b1JlbG9hZDpmdW5jdGlvbigpe3RoaXMuX2lzRG9jdW1lbnRWaXNpYmxlKCk/dGhpcy5fZG9SZWxvYWQoKTp0aGlzLl9taXNzZWRBdXRvUmVsb2FkPSEwO3RoaXMuX2F1dG9SZWxvYWRJZD13aW5kb3cuc2V0VGltZW91dCgoKT0+dGhpcy5fZG9BdXRvUmVsb2FkKCksMUUzKnRoaXMuYXV0b1JlbG9hZEludGVydmFsU2Vjcyl9LF9kb1JlbG9hZDpmdW5jdGlvbigpe2lmKG51bGw9PXRoaXMucmVsb2FkKXRocm93IEVycm9yKCJBdXRvUmVsb2FkQmVoYXZpb3IgcmVxdWlyZXMgYSByZWxvYWQgbWV0aG9kIik7dGhpcy5yZWxvYWQoKX0sX2hhbmRsZVZpc2liaWxpdHlDaGFuZ2U6ZnVuY3Rpb24oKXt0aGlzLl9pc0RvY3VtZW50VmlzaWJsZSgpJiZ0aGlzLl9taXNzZWRBdXRvUmVsb2FkJiYodGhpcy5fbWlzc2VkQXV0b1JlbG9hZD0hMSx0aGlzLl9kb1JlbG9hZCgpKX0sX2lzRG9jdW1lbnRWaXNpYmxlOmZ1bmN0aW9uKCl7cmV0dXJuInZpc2libGUiPT09CmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZX19fSkocWZ8fChxZj17fSkpOwoKLy8jIHNvdXJjZVVSTD1idWlsZDovL3RmLXRlbnNvcmJvYXJkL3RmLXRlbnNvcmJvYXJkLmh0bWwuanMKY29uc3QgWW09e2dldExvY2F0aW9uKCl7cmV0dXJuIHdpbmRvdy5sb2NhdGlvbn19OwpQb2x5bWVyKHtpczoidGYtdGVuc29yYm9hcmQiLGJlaGF2aW9yczpbcWYuQXV0b1JlbG9hZEJlaGF2aW9yXSxwcm9wZXJ0aWVzOnticmFuZDp7dHlwZTpTdHJpbmcsdmFsdWU6IlRlbnNvckJvYXJkLVgifSxob21lUGF0aDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LF9ob21lUGF0aDp7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9zYW5pdGl6ZUhvbWVQYXRoKGhvbWVQYXRoKSJ9LHRpdGxlOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX3VwZGF0ZVRpdGxlIn0scm91dGVyOnt0eXBlOk9iamVjdCxvYnNlcnZlcjoiX3VwZGF0ZVJvdXRlciJ9LGRlbW9EaXI6e3R5cGU6U3RyaW5nLHZhbHVlOm51bGx9LHVzZUhhc2g6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZGlzYWJsZWREYXNoYm9hcmRzOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2Rhc2hib2FyZERhdGE6e3R5cGU6QXJyYXksY29tcHV0ZWQ6Il9jb21wdXRlRGFzaGJvYXJkRGF0YShfZGFzaGJvYXJkUmVnaXN0cnkpIn0sX2Rhc2hib2FyZFJlZ2lzdHJ5Ont0eXBlOk9iamVjdCwKY29tcHV0ZWQ6Il9jb21wdXRlRGFzaGJvYXJkUmVnaXN0cnkoX3BsdWdpbnNMaXN0aW5nKSJ9LF9wbHVnaW5zTGlzdGluZzp7dHlwZTpPYmplY3QsdmFsdWU6KCk9Pih7fSl9LF9hY3RpdmVEYXNoYm9hcmRzOnt0eXBlOkFycmF5LGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZChfZGFzaGJvYXJkRGF0YSwgX3BsdWdpbnNMaXN0aW5nKSJ9LF9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlOnt0eXBlOlN0cmluZyx2YWx1ZTpxZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUR9LF9hY3RpdmVEYXNoYm9hcmRzTm90TG9hZGVkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc05vdExvYWRlZChfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZSkifSxfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZDp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNMb2FkZWQoX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUpIn0sCl9hY3RpdmVEYXNoYm9hcmRzRmFpbGVkVG9Mb2FkOnt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0ZhaWxlZFRvTG9hZChfYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZSkifSxfc2hvd05vRGFzaGJvYXJkc01lc3NhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTaG93Tm9EYXNoYm9hcmRzTWVzc2FnZShfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZCwgX2FjdGl2ZURhc2hib2FyZHMsIF9zZWxlY3RlZERhc2hib2FyZCkifSxfc2hvd05vU3VjaERhc2hib2FyZE1lc3NhZ2U6e3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVTaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZShfYWN0aXZlRGFzaGJvYXJkc0xvYWRlZCwgX2Rhc2hib2FyZFJlZ2lzdHJ5LCBfc2VsZWN0ZWREYXNoYm9hcmQpIn0sX3NlbGVjdGVkRGFzaGJvYXJkOnt0eXBlOlN0cmluZyx2YWx1ZTpwZC5nZXRTdHJpbmcocGQuVEFCKXx8bnVsbCxvYnNlcnZlcjoiX3NlbGVjdGVkRGFzaGJvYXJkQ2hhbmdlZCJ9LApfZGFzaGJvYXJkVG9NYXliZVJlbW92ZTpTdHJpbmcsX2Rhc2hib2FyZENvbnRhaW5lcnNTdGFtcGVkOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+KHt9KX0sX2lzUmVsb2FkRGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2xhc3RSZWxvYWRUaW1lOnt0eXBlOlN0cmluZyx2YWx1ZToibm90IHlldCBsb2FkZWQifSxfbGFzdFJlbG9hZFRpbWVTaG9ydDp7dHlwZTpTdHJpbmcsdmFsdWU6Ik5vdCB5ZXQgbG9hZGVkIn0sX2RhdGFMb2NhdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sX3JlcXVlc3RNYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLlJlcXVlc3RNYW5hZ2VyfSxfY2FuY2VsbGVyOnt0eXBlOk9iamVjdCx2YWx1ZTooKT0+bmV3IHZjLkNhbmNlbGxlcn0sX3JlZnJlc2hpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LG9ic2VydmVyczpbIl91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21BY3RpdmUoX3NlbGVjdGVkRGFzaGJvYXJkLCBfYWN0aXZlRGFzaGJvYXJkcykiLAoiX2Vuc3VyZVNlbGVjdGVkRGFzaGJvYXJkU3RhbXBlZChfZGFzaGJvYXJkUmVnaXN0cnksIF9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZCwgX2FjdGl2ZURhc2hib2FyZHMsIF9zZWxlY3RlZERhc2hib2FyZCkiXSxfc2FuaXRpemVIb21lUGF0aChiKXtpZighYilyZXR1cm4iIjtjb25zdCBkPVltLmdldExvY2F0aW9uKCksZj1uZXcgVVJMKGIsZC5ocmVmKSxoPSJodHRwOiI9PT1mLnByb3RvY29sfHwiaHR0cHM6Ij09PWYucHJvdG9jb2wsaz1mLm9yaWdpbj09PWQub3JpZ2luO2lmKCFoKXRocm93IG5ldyBSYW5nZUVycm9yKGBFeHBlY3QgJ2hvbWVQYXRoJyB0byBiZSBvZiBodHRwOiBvciBodHRwczouICR7Yn1gKTtpZighayl0aHJvdyBuZXcgUmFuZ2VFcnJvcihgRXhwZWN0ICdob21lUGF0aCcgYmUgYSBwYXRoIG9yIGhhdmUgdGhlIHNhbWUgb3JpZ2luLiAke2J9IHZzLiAke2Qub3JpZ2lufWApO3JldHVybiBoJiZrP2YudG9TdHJpbmcoKToiIn0sX2FjdGl2ZURhc2hib2FyZHNVcGRhdGVkKCl7fSwKX2lzRGFzaGJvYXJkQWN0aXZlKGIsZCxmKXtyZXR1cm4gMDw9KGJ8fCIiKS5zcGxpdCgiLCIpLmluZGV4T2YoZi5wbHVnaW4pfHwhKGR8fFtdKS5pbmNsdWRlcyhmLnBsdWdpbik/ITE6ITB9LF9pc0Rhc2hib2FyZEluYWN0aXZlKGIsZCxmKXtyZXR1cm4gMDw9KGJ8fCIiKS5zcGxpdCgiLCIpLmluZGV4T2YoZi5wbHVnaW4pPyExOihkfHxbXSkuaW5jbHVkZXMoZi5wbHVnaW4pPyExOiEwfSxfaW5hY3RpdmVEYXNoYm9hcmRzRXhpc3QoYixkLGYpe2lmKCFmKXJldHVybiExO2NvbnN0IGg9bmV3IFNldDtiLmZvckVhY2goaz0+e2guYWRkKGsucGx1Z2luKX0pOyhkfHwiIikuc3BsaXQoIiwiKS5mb3JFYWNoKGs9PntoLmRlbGV0ZShrLnBsdWdpbil9KTtmLmZvckVhY2goaz0+e2guZGVsZXRlKGspfSk7cmV0dXJuIDA8aC5zaXplfSxfZ2V0RGFzaGJvYXJkRnJvbUluZGV4KGIsZCl7cmV0dXJuIGJbZF19LF9zZWxlY3RlZFN0YXR1cyhiLGQpe3JldHVybiBiPT09ZH0sX3NlbGVjdGVkRGFzaGJvYXJkQ2hhbmdlZChiKXtiPQpifHwiIjtwZC5zZXRTdHJpbmcocGQuVEFCLGIpO2xldCBkPXdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTtkKz1kLmVuZHNXaXRoKCIvIik/YjoiLyIrYjtnYSgic2V0IiwicGFnZSIsZCk7Z2EoInNlbmQiLCJwYWdldmlldyIpfSxfdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tQWN0aXZlKGIsZCl7ZCYmbnVsbD09YiYmKGI9ZFswXXx8bnVsbCxudWxsIT1iJiYocGQuc2V0U3RyaW5nKHBkLlRBQixiLHt1c2VMb2NhdGlvblJlcGxhY2U6ITB9KSx0aGlzLl9zZWxlY3RlZERhc2hib2FyZD1iKSl9LF91cGRhdGVTZWxlY3RlZERhc2hib2FyZEZyb21IYXNoKCl7Y29uc3QgYj1wZC5nZXRTdHJpbmcocGQuVEFCKTt0aGlzLnNldCgiX3NlbGVjdGVkRGFzaGJvYXJkIixifHxudWxsKX0sX2Vuc3VyZVNlbGVjdGVkRGFzaGJvYXJkU3RhbXBlZChiLGQsZixoKXtpZihmJiZoJiZkW2hdJiYoZD10aGlzLl9kYXNoYm9hcmRUb01heWJlUmVtb3ZlLHRoaXMuX2Rhc2hib2FyZFRvTWF5YmVSZW1vdmU9CmgsZCYmZCE9aCYmYltkXS5yZW1vdmVEb20mJihkPXRoaXMuJCQoYC5kYXNoYm9hcmQtY29udGFpbmVyW2RhdGEtZGFzaGJvYXJkPSR7ZH1dYCksZC5maXJzdENoaWxkJiZkLmZpcnN0Q2hpbGQucmVtb3ZlKCkpLGQ9dGhpcy4kJChgLmRhc2hib2FyZC1jb250YWluZXJbZGF0YS1kYXNoYm9hcmQ9JHtofV1gKSkpe2I9YltoXTtpZigwPT09ZC5jaGlsZHJlbi5sZW5ndGgpc3dpdGNoKGY9Yi5sb2FkaW5nTWVjaGFuaXNtLGYudHlwZSl7Y2FzZSAiQ1VTVE9NX0VMRU1FTlQiOmg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChmLmVsZW1lbnROYW1lKTtoLmlkPSJkYXNoYm9hcmQiO2QuYXBwZW5kQ2hpbGQoaCk7YnJlYWs7Y2FzZSAiSUZSQU1FIjp0aGlzLl9yZW5kZXJQbHVnaW5JZnJhbWUoZCxoLGYpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJJbnZhcmlhbnQgdmlvbGF0aW9uOiIsZil9dGhpcy5zZXQoIl9pc1JlbG9hZERpc2FibGVkIixiLmRpc2FibGVSZWxvYWQpfX0sX3JlbmRlclBsdWdpbklmcmFtZShiLApkKXtjb25zdCBmPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlmcmFtZSIpO2YuaWQ9ImRhc2hib2FyZCI7TWsuaG9zdC5yZWdpc3RlclBsdWdpbklmcmFtZShmLGQpO2NvbnN0IGg9bmV3IFVSTCgiZGF0YS9wbHVnaW5fZW50cnkuaHRtbCIsd2luZG93LmxvY2F0aW9uLmhyZWYpO2guc2VhcmNoUGFyYW1zLnNldCgibmFtZSIsZCk7Zi5zZXRBdHRyaWJ1dGUoInNyYyIsaC50b1N0cmluZygpKTtiLmFwcGVuZENoaWxkKGYpfSxfc2VsZWN0ZWREYXNoYm9hcmRDb21wb25lbnQoKXtyZXR1cm4gdGhpcy4kJChgLmRhc2hib2FyZC1jb250YWluZXJbZGF0YS1kYXNoYm9hcmQ9JHt0aGlzLl9zZWxlY3RlZERhc2hib2FyZH1dICNkYXNoYm9hcmRgKX0scmVhZHkoKXthZC5zZXRVc2VIYXNoKHRoaXMudXNlSGFzaCk7dGhpcy5fdXBkYXRlU2VsZWN0ZWREYXNoYm9hcmRGcm9tSGFzaCgpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJoYXNoY2hhbmdlIiwoKT0+e3RoaXMuX3VwZGF0ZVNlbGVjdGVkRGFzaGJvYXJkRnJvbUhhc2goKX0sCiExKTt2Yy5lbnZpcm9ubWVudFN0b3JlLmFkZExpc3RlbmVyKCgpPT57dGhpcy5fZGF0YUxvY2F0aW9uPXZjLmVudmlyb25tZW50U3RvcmUuZ2V0RGF0YUxvY2F0aW9uKCk7Y29uc3QgYj12Yy5lbnZpcm9ubWVudFN0b3JlLmdldFdpbmRvd1RpdGxlKCk7YiYmKHdpbmRvdy5kb2N1bWVudC50aXRsZT1iKX0pO3BkLm1pZ3JhdGVMZWdhY3lVUkxTY2hlbWUoKTt0aGlzLl9yZWxvYWREYXRhKCk7dGhpcy5fbGFzdFJlbG9hZFRpbWU9KG5ldyBEYXRlKS50b1N0cmluZygpfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZCgpe3JldHVybiB0aGlzLl9kYXNoYm9hcmREYXRhP3RoaXMuX2Rhc2hib2FyZERhdGEubWFwKGI9PmIucGx1Z2luKS5maWx0ZXIoYj0+e2I9dGhpcy5fcGx1Z2luc0xpc3RpbmdbYl07cmV0dXJuImJvb2xlYW4iPT09dHlwZW9mIGI/YjpiJiZiLmVuYWJsZWR9KTpbXX0sX29uVGVtcGxhdGVDaGFuZ2VkKCl7Y29uc3QgYj17fTtmb3IoY29uc3QgZCBvZiB0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmRhc2hib2FyZC1jb250YWluZXIiKSliW2QuZGF0YXNldC5kYXNoYm9hcmRdPQohMDt0aGlzLl9kYXNoYm9hcmRDb250YWluZXJzU3RhbXBlZD1ifSxfY29tcHV0ZURhc2hib2FyZFJlZ2lzdHJ5KGIpe2NvbnN0IGQ9e307Zm9yKGNvbnN0IFtoLGtdb2YgT2JqZWN0LmVudHJpZXMocWYuZGFzaGJvYXJkUmVnaXN0cnkpKWRbaF09e3BsdWdpbjprLnBsdWdpbixsb2FkaW5nTWVjaGFuaXNtOnt0eXBlOiJDVVNUT01fRUxFTUVOVCIsZWxlbWVudE5hbWU6ay5lbGVtZW50TmFtZX0sdGFiTmFtZTprLnRhYk5hbWUudG9VcHBlckNhc2UoKSxkaXNhYmxlUmVsb2FkOmsuaXNSZWxvYWREaXNhYmxlZHx8ITEscmVtb3ZlRG9tOmsucmVtb3ZlRG9tfHwhMX07aWYobnVsbCE9Yilmb3IoY29uc3QgW2gsa11vZiBPYmplY3QuZW50cmllcyhiKSlpZigiYm9vbGVhbiIhPT10eXBlb2Ygayl7c3dpdGNoKGsubG9hZGluZ19tZWNoYW5pc20udHlwZSl7Y2FzZSAiTk9ORSI6bnVsbD09ZFtoXSYmY29uc29sZS53YXJuKCJQbHVnaW4gaGFzIG5vIGxvYWRpbmcgbWVjaGFuaXNtIGFuZCBubyBiYWtlZC1pbiByZWdpc3RyeSBlbnRyeTogJXMiLApoKTtjb250aW51ZTtjYXNlICJDVVNUT01fRUxFTUVOVCI6dmFyIGY9e3R5cGU6IkNVU1RPTV9FTEVNRU5UIixlbGVtZW50TmFtZTprLmxvYWRpbmdfbWVjaGFuaXNtLmVsZW1lbnRfbmFtZX07YnJlYWs7Y2FzZSAiSUZSQU1FIjpmPXt0eXBlOiJJRlJBTUUiLG1vZHVsZVBhdGg6ay5sb2FkaW5nX21lY2hhbmlzbS5tb2R1bGVfcGF0aH07YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlVua25vd24gbG9hZGluZyBtZWNoYW5pc20gZm9yIHBsdWdpbiAlczogJXMiLGgsay5sb2FkaW5nX21lY2hhbmlzbSk7Y29udGludWV9bnVsbD09ZiYmY29uc29sZS5lcnJvcigiSW52YXJpYW50IHZpb2xhdGlvbjogbG9hZGluZ01lY2hhbmlzbSBpcyAlcyBmb3IgJXMiLGYsaCk7ZFtoXT17cGx1Z2luOmgsbG9hZGluZ01lY2hhbmlzbTpmLHRhYk5hbWU6ay50YWJfbmFtZS50b1VwcGVyQ2FzZSgpLGRpc2FibGVSZWxvYWQ6ay5kaXNhYmxlX3JlbG9hZCxyZW1vdmVEb206ay5yZW1vdmVfZG9tfX1mPXt9Owpmb3IoY29uc3QgaCBvZiBPYmplY3Qua2V5cyhiKSlkW2hdJiYoZltoXT1kW2hdKTtPYmplY3QuYXNzaWduKGYsZCk7cmV0dXJuIGZ9LF9jb21wdXRlRGFzaGJvYXJkRGF0YShiKXtyZXR1cm4gT2JqZWN0LnZhbHVlcyhiKX0sX2ZldGNoUGx1Z2luc0xpc3RpbmcoKXt0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7Y29uc3QgYj10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoZD0+e2QuY2FuY2VsbGVkfHwodGhpcy5fcGx1Z2luc0xpc3Rpbmc9ZC52YWx1ZSx0aGlzLl9hY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlPXFmLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuTE9BREVEKX0pO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHZjLmdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCkpLnRoZW4oYiwoKT0+e3RoaXMuX2FjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGU9PT1xZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUQ/dGhpcy5fYWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZT0KcWYuQWN0aXZlRGFzaGJvYXJkc0xvYWRTdGF0ZS5GQUlMRUQ6Y29uc29sZS53YXJuKCJGYWlsZWQgdG8gcmVsb2FkIHRoZSBzZXQgb2YgYWN0aXZlIHBsdWdpbnM7IHVzaW5nIG9sZCB2YWx1ZS4iKX0pfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNOb3RMb2FkZWQoYil7cmV0dXJuIGI9PT1xZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLk5PVF9MT0FERUR9LF9jb21wdXRlQWN0aXZlRGFzaGJvYXJkc0xvYWRlZChiKXtyZXR1cm4gYj09PXFmLkFjdGl2ZURhc2hib2FyZHNMb2FkU3RhdGUuTE9BREVEfSxfY29tcHV0ZUFjdGl2ZURhc2hib2FyZHNGYWlsZWRUb0xvYWQoYil7cmV0dXJuIGI9PT1xZi5BY3RpdmVEYXNoYm9hcmRzTG9hZFN0YXRlLkZBSUxFRH0sX2NvbXB1dGVTaG93Tm9EYXNoYm9hcmRzTWVzc2FnZShiLGQsZil7cmV0dXJuIGImJjA9PT1kLmxlbmd0aCYmbnVsbD09Zn0sX2NvbXB1dGVTaG93Tm9TdWNoRGFzaGJvYXJkTWVzc2FnZShiLGQsZil7cmV0dXJuIGImJiEhZiYmCm51bGw9PWRbZl19LF91cGRhdGVSb3V0ZXIoYil7dmMuc2V0Um91dGVyKGIpfSxfdXBkYXRlVGl0bGUoYil7YiYmdGhpcy5zZXQoImJyYW5kIixiKX0scmVsb2FkKCl7dGhpcy5faXNSZWxvYWREaXNhYmxlZHx8KHRoaXMuX3JlbG9hZERhdGEoKS50aGVuKCgpPT57Y29uc3QgYj10aGlzLl9zZWxlY3RlZERhc2hib2FyZENvbXBvbmVudCgpO2ImJmIucmVsb2FkJiZiLnJlbG9hZCgpfSksdGhpcy5fbGFzdFJlbG9hZFRpbWU9KG5ldyBEYXRlKS50b1N0cmluZygpKX0sX3JlbG9hZERhdGEoKXt0aGlzLl9yZWZyZXNoaW5nPSEwO3JldHVybiBQcm9taXNlLmFsbChbdGhpcy5fZmV0Y2hQbHVnaW5zTGlzdGluZygpLHZjLmVudmlyb25tZW50U3RvcmUucmVmcmVzaCgpLHZjLnJ1bnNTdG9yZS5yZWZyZXNoKCksdmMuZXhwZXJpbWVudHNTdG9yZS5yZWZyZXNoKCldKS50aGVuKCgpPT57dGhpcy5fbGFzdFJlbG9hZFRpbWVTaG9ydD0obmV3IERhdGUpLnRvTG9jYWxlRGF0ZVN0cmluZyh2b2lkIDAsCnttb250aDoibG9uZyIsZGF5OiJudW1lcmljIixob3VyOiJudW1lcmljIixtaW51dGU6Im51bWVyaWMiLHNlY29uZDoibnVtZXJpYyJ9KX0pLmZpbmFsbHkoKCk9Pnt0aGlzLl9yZWZyZXNoaW5nPSExfSl9LF9nZXREYXRhUmVmcmVzaGluZ0NsYXNzKCl7cmV0dXJuIHRoaXMuX3JlZnJlc2hpbmc/InJlZnJlc2hpbmciOiIifSxvcGVuU2V0dGluZ3MoKXt0aGlzLiQuc2V0dGluZ3Mub3BlbigpO3RoaXMuJC5wYWdpbmF0aW9uTGltaXRJbnB1dC52YWx1ZT1uZS5nZXRMaW1pdCgpfSxfcGFnaW5hdGlvbkxpbWl0VmFsaWRhdGUoYil7Yi50YXJnZXQudmFsaWRhdGUoKX0sX3BhZ2luYXRpb25MaW1pdENoYW5nZWQoYil7Yj1OdW1iZXIucGFyc2VJbnQoYi50YXJnZXQudmFsdWUsMTApO2I9PT0rYiYmMDxiJiZuZS5zZXRMaW1pdChiKX19KTsK", "ok": true, "headers": [ [ "content-type", "application/javascript; charset=utf-8" ] ], "status": 200, "status_text": "" }, "https://localhost:46855/data/experiments": { "data": "W10=", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:46855/data/runs": { "data": "WyJ0cmFpbmluZyJd", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:46855/data/environment": { "data": "eyJkYXRhX2xvY2F0aW9uIjogIi90bXAvbG9ncy9zY2FsYXJzLyIsICJ3aW5kb3dfdGl0bGUiOiAiIn0=", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:46855/data/plugins_listing": { "data": "eyJzY2FsYXJzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJzY2FsYXJzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1zY2FsYXItZGFzaGJvYXJkIn19LCAiY3VzdG9tX3NjYWxhcnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJDdXN0b20gU2NhbGFycyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQifX0sICJpbWFnZXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJpbWFnZXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWltYWdlLWRhc2hib2FyZCJ9fSwgImF1ZGlvIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiYXVkaW8iLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWF1ZGlvLWRhc2hib2FyZCJ9fSwgImRlYnVnZ2VyIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiZGVidWdnZXIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWRlYnVnZ2VyLWRhc2hib2FyZCJ9fSwgImdyYXBocyI6IHsiZGlzYWJsZV9yZWxvYWQiOiB0cnVlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiZ3JhcGhzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1ncmFwaC1kYXNoYm9hcmQifX0sICJkaXN0cmlidXRpb25zIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiZGlzdHJpYnV0aW9ucyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZCJ9fSwgImhpc3RvZ3JhbXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJoaXN0b2dyYW1zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIn19LCAidGV4dCI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogInRleHQiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLXRleHQtZGFzaGJvYXJkIn19LCAicHJfY3VydmVzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiUFIgQ3VydmVzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQifX0sICJwcm9maWxlX3JlZGlyZWN0IjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiUHJvZmlsZSIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtcHJvZmlsZS1yZWRpcmVjdC1kYXNoYm9hcmQifX0sICJiZWhvbGRlciI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiB0cnVlLCAidGFiX25hbWUiOiAiYmVob2xkZXIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWJlaG9sZGVyLWRhc2hib2FyZCJ9fSwgImhwYXJhbXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJocGFyYW1zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1ocGFyYW1zLWRhc2hib2FyZCJ9fSwgIm1lc2giOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJtZXNoIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJtZXNoLWRhc2hib2FyZCJ9fSwgInByb2plY3RvciI6IHsiZGlzYWJsZV9yZWxvYWQiOiB0cnVlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAicHJvamVjdG9yIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIklGUkFNRSIsICJtb2R1bGVfcGF0aCI6ICIvZGF0YS9wbHVnaW4vcHJvamVjdG9yL2luZGV4LmpzIn19LCAid2hhdGlmIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiV2hhdC1JZiBUb29sIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIklGUkFNRSIsICJtb2R1bGVfcGF0aCI6ICIvZGF0YS9wbHVnaW4vd2hhdGlmL2luZGV4LmpzIn19fQ==", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:46855/font-roboto/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2": { "data": "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", "ok": true, "headers": [ [ "content-type", "font/woff2" ] ], "status": 200, "status_text": "" }, "https://localhost:46855/data/plugin/scalars/tags": { "data": "eyJ0cmFpbmluZyI6IHsibG9zcyI6IHsiZGlzcGxheU5hbWUiOiAiIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAiYWNjdXJhY3kiOiB7ImRpc3BsYXlOYW1lIjogIiIsICJkZXNjcmlwdGlvbiI6ICIifX19", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:46855/data/plugin/scalars/scalars?tag=accuracy&run=training": { "data": "W1sxNTkxMDE5OTAwLjMyMDAwNSwgMCwgMC42ODEyMDAwMjc0NjU4MjAzXSwgWzE1OTEwMTk5NDcuOTc3MDg2LCAxLCAwLjczMzMwMDAzMDIzMTQ3NThdLCBbMTU5MTAxOTk5NC45NTE3NjEsIDIsIDAuNzU5NTAwMDI2NzAyODgwOV0sIFsxNTkxMDIwMDQyLjQxMTI1OSwgMywgMC43NzMyMDAwOTQ2OTk4NTk2XSwgWzE1OTEwMjAwOTAuMTg5MTAxLCA0LCAwLjc4MjQwMDAxMjAxNjI5NjRdLCBbMTU5MTAyMDEzNy43MzEyMTYsIDUsIDAuNzkwMzAwMDcxMjM5NDcxNF0sIFsxNTkxMDIwMTg1LjIxMjYyMywgNiwgMC43OTY2MDAwNDM3NzM2NTExXSwgWzE1OTEwMjAyMzMuNTA1NzY2LCA3LCAwLjgwMjc5OTk5OTcxMzg5NzddLCBbMTU5MTAyMDI4Mi4wODY1NDEsIDgsIDAuODA4MzAwMDE4MzEwNTQ2OV0sIFsxNTkxMDIwMzI5LjE3NTU1MiwgOSwgMC44MTE1OTk5MTAyNTkyNDY4XSwgWzE1OTEwMjAzNzcuMTA5ODI0LCAxMCwgMC44MTUyOTk5ODc3OTI5Njg4XSwgWzE1OTEwMjA0MjUuNzI3Njg4LCAxMSwgMC44MTg3MDAwMTU1NDQ4OTE0XSwgWzE1OTEwMjA0NzMuODczMjIsIDEyLCAwLjgyMjg5OTk5NzIzNDM0NDVdLCBbMTU5MTAyMDUyMS41MDM5NjQsIDEzLCAwLjgyNTM5OTk5NDg1MDE1ODddLCBbMTU5MTAyMDU2OS4yOTMxMjEsIDE0LCAwLjgyODcwMDA2NTYxMjc5M10sIFsxNTkxMDIwNjE3LjI5MDI1NiwgMTUsIDAuODMyMzk5OTY0MzMyNTgwNl0sIFsxNTkxMDIwNjY0LjQzNzYsIDE2LCAwLjgzNTcwMDAzNTA5NTIxNDhdLCBbMTU5MTAyMDcxMS45NzAwNjUsIDE3LCAwLjgzODY5OTkzNjg2Njc2MDNdLCBbMTU5MTAyMDc1OS44MTQ1ODgsIDE4LCAwLjg0MTQ5OTk4NDI2NDM3MzhdLCBbMTU5MTAyMDgwNy40MjIxNzMsIDE5LCAwLjg0MjYwMDA0NzU4ODM0ODRdLCBbMTU5MTAyMDg1NC4yMjcyNjQsIDIwLCAwLjg0NDYwMDA4MTQ0Mzc4NjZdLCBbMTU5MTAyMDkwMS42Mjg5MDMsIDIxLCAwLjg0NjA5OTk3MjcyNDkxNDZdLCBbMTU5MTAyMDk0OS42MzI1OTIsIDIyLCAwLjg0ODM5OTkzNzE1Mjg2MjVdLCBbMTU5MTAyMDk5Ny4xOTgwMTMsIDIzLCAwLjg1MDIwMDA1NzAyOTcyNDFdLCBbMTU5MTAyMTA0NC42NjQyOTMsIDI0LCAwLjg1MTQwMDA3NzM0Mjk4NzFdLCBbMTU5MTAyMTA5Mi4zODA5NzYsIDI1LCAwLjg1MjQ5OTk2MTg1MzAyNzNdLCBbMTU5MTAyMTEzOS45MzQ1NzQsIDI2LCAwLjg1Mzk5OTkxMjczODhdLCBbMTU5MTAyMTE4Ni42OTYzNDksIDI3LCAwLjg1NTAwMDAxOTA3MzQ4NjNdLCBbMTU5MTAyMTIzNC4yMTk3NTcsIDI4LCAwLjg1NjM5OTg5Mzc2MDY4MTJdLCBbMTU5MTAyMTI4Mi4wNjkyNTcsIDI5LCAwLjg1NzY5OTk5MDI3MjUyMl0sIFsxNTkxMDIxMzI4LjcyNjUxOSwgMzAsIDAuODU4NTk5OTYwODAzOTg1Nl0sIFsxNTkxMDIxMzc2LjE2ODczOCwgMzEsIDAuODU5MjAwMTE5OTcyMjI5XSwgWzE1OTEwMjE0MjQuMDIzOTEyLCAzMiwgMC44NjAyOTk5NDQ4Nzc2MjQ1XSwgWzE1OTEwMjE0NzEuNDkyNDgyLCAzMywgMC44NjA0MDAwMjEwNzYyMDI0XSwgWzE1OTEwMjE1MTguMDk0NjM5LCAzNCwgMC44NjEyMDAwMzQ2MTgzNzc3XSwgWzE1OTEwMjE1NjUuNTE5MTY0LCAzNSwgMC44NjE2OTk5Mzg3NzQxMDg5XSwgWzE1OTEwMjE2MTMuMjM3NzMyLCAzNiwgMC44NjIxMDAwMDUxNDk4NDEzXSwgWzE1OTEwMjE2NTkuNzY0NjQ1LCAzNywgMC44NjI2MDAwMjg1MTQ4NjIxXSwgWzE1OTEwMjE3MDYuOTQ1MTMyLCAzOCwgMC44NjI4OTk5NTkwODczNzE4XSwgWzE1OTEwMjE3NTQuNDM5MjkxLCAzOSwgMC44NjI3OTk5NDI0OTM0Mzg3XSwgWzE1OTEwMjE4MDIuMDE0MTA5LCA0MCwgMC44NjI4MDAwMDIwOTgwODM1XSwgWzE1OTEwMjE4NDguNjAzMDExLCA0MSwgMC44NjI1OTk5Njg5MTAyMTczXSwgWzE1OTEwMjE4OTYuMTY2MDU3LCA0MiwgMC44NjMwOTk5MzI2NzA1OTMzXSwgWzE1OTEwMjE5NDMuNzczMDE2LCA0MywgMC44NjMxMDAwNTE4Nzk4ODI4XSwgWzE1OTEwMjE5OTAuNDQxMTIxLCA0NCwgMC44NjMyMDAwNjg0NzM4MTU5XSwgWzE1OTEwMjIwMzcuOTA1OTEzLCA0NSwgMC44NjM0MDAxMDE2NjE2ODIxXSwgWzE1OTEwMjIwODUuNTM0NTc0LCA0NiwgMC44NjMyMDAwNjg0NzM4MTU5XSwgWzE1OTEwMjIxMzIuOTI5ODI4LCA0NywgMC44NjM1OTk5NTYwMzU2MTRdLCBbMTU5MTAyMjE3OS42Mjg4MDQsIDQ4LCAwLjg2Mzc5OTkyOTYxODgzNTRdLCBbMTU5MTAyMjIyNy4xMTkyNjksIDQ5LCAwLjg2Mzc5OTkyOTYxODgzNTRdXQ==", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:46855/data/plugin/scalars/scalars?tag=loss&run=training": { "data": "W1sxNTkxMDE5OTAwLjMxOTQ5NSwgMCwgMTAuNjQzODc1MTIyMDcwMzEyXSwgWzE1OTEwMTk5NDcuOTc2NTg0LCAxLCA5Ljg4NjIyMDkzMjAwNjgzNl0sIFsxNTkxMDE5OTk0Ljk1MTIzMiwgMiwgOS4yMjM3NDYyOTk3NDM2NTJdLCBbMTU5MTAyMDA0Mi40MTA3NjQsIDMsIDguNjQ1MDUxOTU2MTc2NzU4XSwgWzE1OTEwMjAwOTAuMTg4NTU1LCA0LCA4LjEzOTUwODI0NzM3NTQ4OF0sIFsxNTkxMDIwMTM3LjczMDU5NywgNSwgNy42OTcyMDc0NTA4NjY2OTldLCBbMTU5MTAyMDE4NS4yMTIxNjEsIDYsIDcuMzA5MjM0NjE5MTQwNjI1XSwgWzE1OTEwMjAyMzMuNTA1MTUzLCA3LCA2Ljk2Nzc3NTgyMTY4NTc5MV0sIFsxNTkxMDIwMjgyLjA4NjAxNCwgOCwgNi42NjYxMTI0MjI5NDMxMTVdLCBbMTU5MTAyMDMyOS4xNzQ3ODYsIDksIDYuMzk4NTM0Mjk3OTQzMTE1XSwgWzE1OTEwMjAzNzcuMTA5Mzc3LCAxMCwgNi4xNjAyMjAxNDYxNzkxOTldLCBbMTU5MTAyMDQyNS43MjcxNSwgMTEsIDUuOTQ3MTE0OTQ0NDU4MDA4XSwgWzE1OTEwMjA0NzMuODcyNzEsIDEyLCA1Ljc1NTgwNzg3NjU4NjkxNF0sIFsxNTkxMDIwNTIxLjUwMzQ1NywgMTMsIDUuNTgzNDMyMTk3NTcwODAxXSwgWzE1OTEwMjA1NjkuMjkyNTE0LCAxNCwgNS40Mjc1NjkzODkzNDMyNjJdLCBbMTU5MTAyMDYxNy4yODk3NDcsIDE1LCA1LjI4NjE3NzYzNTE5Mjg3MV0sIFsxNTkxMDIwNjY0LjQzNzE1NywgMTYsIDUuMTU3NTI2OTY5OTA5NjY4XSwgWzE1OTEwMjA3MTEuOTY5NDQ1LCAxNywgNS4wNDAxNDUzOTcxODYyNzldLCBbMTU5MTAyMDc1OS44MTQxMzIsIDE4LCA0LjkzMjc3NjQ1MTExMDg0XSwgWzE1OTEwMjA4MDcuNDIxNjY1LCAxOSwgNC44MzQzNDU4MTc1NjU5MThdLCBbMTU5MTAyMDg1NC4yMjY2NDQsIDIwLCA0Ljc0MzkyNzAwMTk1MzEyNV0sIFsxNTkxMDIwOTAxLjYyODQyMywgMjEsIDQuNjYwNzIyNzMyNTQzOTQ1XSwgWzE1OTEwMjA5NDkuNjMyMTI3LCAyMiwgNC41ODQwNDExMTg2MjE4MjZdLCBbMTU5MTAyMDk5Ny4xOTczODgsIDIzLCA0LjUxMzI3OTQzODAxODc5OV0sIFsxNTkxMDIxMDQ0LjY2Mzc4LCAyNCwgNC40NDc5MTI2OTMwMjM2ODJdLCBbMTU5MTAyMTA5Mi4zODA0NjgsIDI1LCA0LjM4NzQ3NzM5NzkxODcwMV0sIFsxNTkxMDIxMTM5LjkzNDAyNCwgMjYsIDQuMzMxNTY4NzE3OTU2NTQzXSwgWzE1OTEwMjExODYuNjk1ODM5LCAyNywgNC4yNzk4MjU2ODc0MDg0NDddLCBbMTU5MTAyMTIzNC4yMTkzMDQsIDI4LCA0LjIzMTkyNjkxODAyOTc4NV0sIFsxNTkxMDIxMjgyLjA2ODYzNCwgMjksIDQuMTg3NTg3MjYxMTk5OTUxXSwgWzE1OTEwMjEzMjguNzI2MDY0LCAzMCwgNC4xNDY1NDgyNzExNzkxOTldLCBbMTU5MTAyMTM3Ni4xNjgyOTQsIDMxLCA0LjEwODU3Njc3NDU5NzE2OF0sIFsxNTkxMDIxNDI0LjAyMzMxOSwgMzIsIDQuMDczNDYwMTAyMDgxMjk5XSwgWzE1OTEwMjE0NzEuNDkyMDQ2LCAzMywgNC4wNDEwMDQ2NTc3NDUzNjFdLCBbMTU5MTAyMTUxOC4wOTQxODgsIDM0LCA0LjAxMTAzMTE1MDgxNzg3MV0sIFsxNTkxMDIxNTY1LjUxODQ2NywgMzUsIDMuOTgzMzc0MzU3MjIzNTEwN10sIFsxNTkxMDIxNjEzLjIzNzMwNiwgMzYsIDMuOTU3ODgwMDIwMTQxNjAxNl0sIFsxNTkxMDIxNjU5Ljc2NDIwNCwgMzcsIDMuOTM0NDAzODk2MzMxNzg3XSwgWzE1OTEwMjE3MDYuOTQ0NTUyLCAzOCwgMy45MTI4MTAwODcyMDM5Nzk1XSwgWzE1OTEwMjE3NTQuNDM4Nzc1LCAzOSwgMy44OTI5NzEwMzg4MTgzNTk0XSwgWzE1OTEwMjE4MDIuMDEzNTk5LCA0MCwgMy44NzQ3NjU4NzI5NTUzMjIzXSwgWzE1OTEwMjE4NDguNjAyNDEyLCA0MSwgMy44NTgwNzk0MzM0NDExNjJdLCBbMTU5MTAyMTg5Ni4xNjU1NjYsIDQyLCAzLjg0MjgwNTE0NzE3MTAyMDVdLCBbMTU5MTAyMTk0My43NzI0ODQsIDQzLCAzLjgyODgzODM0ODM4ODY3Ml0sIFsxNTkxMDIxOTkwLjQzOTc0OCwgNDQsIDMuODE2MDgyNzE1OTg4MTU5XSwgWzE1OTEwMjIwMzcuOTA1NDMxLCA0NSwgMy44MDQ0NDY2OTcyMzUxMDc0XSwgWzE1OTEwMjIwODUuNTM0MTE3LCA0NiwgMy43OTM4NDIzMTU2NzM4MjhdLCBbMTU5MTAyMjEzMi45MjkyODQsIDQ3LCAzLjc4NDE4ODc0NzQwNjAwNl0sIFsxNTkxMDIyMTc5LjYyODM2MiwgNDgsIDMuNzc1NDA5MjIxNjQ5MTddLCBbMTU5MTAyMjIyNy4xMTg3NzEsIDQ5LCAzLjc2NzQzMTczNTk5MjQzMTZdXQ==", "ok": true, "headers": [ [ "content-type", "application/json" ] ], "status": 200, "status_text": "" }, "https://localhost:46855/font-roboto/d-6IYplOFocCacKzxwXSOJBw1xU1rKptJj_0jans920.woff2": { "data": "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", "ok": true, "headers": [ [ "content-type", "font/woff2" ] ], "status": 200, "status_text": "" } }, "base_uri": "https://localhost:8080/", "height": 820 } }, "source": [ "\n", "%tensorboard --logdir /tmp/logs/scalars/ --port=0\n" ], "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "application/javascript": [ "\n", " (async () => {\n", " const url = await google.colab.kernel.proxyPort(46855, {\"cache\": true});\n", " const iframe = document.createElement('iframe');\n", " iframe.src = url;\n", " iframe.setAttribute('width', '100%');\n", " iframe.setAttribute('height', '800');\n", " iframe.setAttribute('frameborder', 0);\n", " document.body.appendChild(iframe);\n", " })();\n", " " ], "text/plain": [ "" ] }, "metadata": { "tags": [] } } ] }, { "cell_type": "code", "metadata": { "id": "e0Pn-uSzIR76" }, "source": [ "\n", "# Run this this cell to clean your directory of old output for future graphs from this directory.\n", "!rm -R /tmp/logs/scalars/*" ], "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "metadata": { "id": "S4TKaHlIHxqc" }, "source": [ "使用测试集评估" ] }, { "cell_type": "code", "metadata": { "id": "ZOrda5HaHz-o", "outputId": "e7b296a7-046a-49a7-cb2e-a84bdb294444", "colab": { "base_uri": "https://localhost:8080/", "height": 52 } }, "source": [ "'''\n", "print('initial_model test loss =',\n", " federated_eval(initial_model, federated_test_data))\n", "print('trained_model test loss =', federated_eval(model, federated_test_data))\n", "'''\n", "initial_model_loss,initial_model_accuracy=federated_eval(initial_model, federated_test_data)\n", "local_model_loss,local_model_accuracy=federated_eval(model, federated_test_data)\n", "\n", "print('initial_model test loss ={} ,accuracy={}'.format(\n", " initial_model_loss,initial_model_accuracy/BATCHES))\n", "print('locally_trained_model test loss ={},accuracy={}'.format(\n", " local_model_loss,local_model_accuracy/BATCHES))" ], "execution_count": null, "outputs": [ { "output_type": "stream", "text": [ "initial_model test loss = <11.512926,0.5>\n", "trained_model test loss = <5.610701,4.1564684>\n" ], "name": "stdout" } ] }, { "cell_type": "markdown", "metadata": { "id": "ts0RRq68YIJT" }, "source": [ "## 总结\n", "本次实验是模拟实验,在一个机器上模拟了联邦学习,实现了Federated averaging算法。\n", "需要继续改进的地方:\n", "1. 模型:本次实验使用2层的DNN网络实现图像分类,下一个实验需要使用LSTM进行文本生成,考虑模型对联邦学习的影响。\n", "2. C=1,即选择了全部可用设备参与训练,未考虑设备选择问题。\n", "3. 假设每个设备的数据量相同,未考虑数据量不均衡的问题\n", "3. 准确率不高。100轮的准确率只达到了85.56%。但论文《Communication-Efficient Learning of Deep Networks from Decentralized Data》的实验数据表明BATCHSIZE=10、其他条件基本相同情况下需要380轮达到97%的准确率。如何调整模型及其参数来提高准确率、减少轮次是一个重要的问题\n", "4. 需要在实际情况下部署这个分布式系统,考虑到通信时间,进行一次在移动设备上的真实的实验" ] } ] }